summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.mk1
-rw-r--r--api/current.txt28
-rw-r--r--api/system-current.txt28
-rw-r--r--core/java/android/accounts/AccountManager.java66
-rw-r--r--core/java/android/accounts/ChooseTypeAndAccountActivity.java16
-rw-r--r--core/java/android/app/ActivityThread.java14
-rw-r--r--core/java/android/app/AlarmManager.java26
-rw-r--r--core/java/android/app/ApplicationPackageManager.java9
-rw-r--r--core/java/android/app/assist/AssistStructure.java341
-rw-r--r--core/java/android/bluetooth/IBluetoothGatt.aidl2
-rw-r--r--core/java/android/bluetooth/le/BluetoothLeScanner.java3
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl2
-rw-r--r--core/java/android/content/pm/PackageManager.java17
-rw-r--r--core/java/android/content/pm/PackageParser.java1
-rw-r--r--core/java/android/hardware/camera2/CameraCaptureSession.java11
-rw-r--r--core/java/android/hardware/camera2/CameraCharacteristics.java2
-rw-r--r--core/java/android/hardware/camera2/CameraConstrainedHighSpeedCaptureSession.java131
-rw-r--r--core/java/android/hardware/camera2/CameraDevice.java65
-rw-r--r--core/java/android/hardware/camera2/CameraMetadata.java23
-rw-r--r--core/java/android/hardware/camera2/CaptureRequest.java25
-rw-r--r--core/java/android/hardware/camera2/impl/CameraCaptureSessionCore.java64
-rw-r--r--core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java58
-rw-r--r--core/java/android/hardware/camera2/impl/CameraConstrainedHighSpeedCaptureSessionImpl.java283
-rw-r--r--core/java/android/hardware/camera2/impl/CameraDeviceImpl.java213
-rw-r--r--core/java/android/hardware/camera2/params/StreamConfigurationMap.java15
-rw-r--r--core/java/android/hardware/camera2/utils/SurfaceUtils.java96
-rw-r--r--core/java/android/net/CaptivePortal.java108
-rw-r--r--core/java/android/net/ConnectivityManager.java122
-rw-r--r--core/java/android/net/ICaptivePortal.aidl26
-rw-r--r--core/java/android/net/IConnectivityManager.aidl4
-rw-r--r--core/java/android/net/NetworkCapabilities.java3
-rw-r--r--core/java/android/os/PooledStringReader.java4
-rw-r--r--core/java/android/os/PooledStringWriter.java4
-rw-r--r--core/java/android/provider/Settings.java17
-rw-r--r--core/java/android/service/voice/VoiceInteractionSession.java72
-rw-r--r--core/java/android/text/Html.java7
-rw-r--r--core/java/android/text/Layout.java2
-rw-r--r--core/java/android/text/SpannableStringInternal.java9
-rw-r--r--core/java/android/text/StaticLayout.java3
-rw-r--r--core/java/android/view/WindowManagerPolicy.java8
-rw-r--r--core/java/android/widget/AppSecurityPermissions.java39
-rw-r--r--core/java/android/widget/Editor.java66
-rw-r--r--core/java/android/widget/ImageView.java29
-rw-r--r--core/java/com/android/internal/logging/MetricsConstants.java24
-rw-r--r--core/java/com/android/internal/logging/MetricsLogger.java19
-rw-r--r--core/java/com/android/internal/os/storage/ExternalStorageFormatter.java146
-rw-r--r--core/jni/android/graphics/MinikinUtils.cpp2
-rw-r--r--core/jni/android/graphics/Paint.cpp31
-rw-r--r--core/jni/android/graphics/Paint.h2
-rw-r--r--core/res/AndroidManifest.xml6
-rw-r--r--core/res/res/layout/app_permission_item.xml3
-rw-r--r--core/res/res/values-af/strings.xml1
-rw-r--r--core/res/res/values-am/strings.xml1
-rw-r--r--core/res/res/values-ar/strings.xml1
-rw-r--r--core/res/res/values-az-rAZ/strings.xml1
-rw-r--r--core/res/res/values-bg/strings.xml1
-rw-r--r--core/res/res/values-bn-rBD/strings.xml1
-rw-r--r--core/res/res/values-ca/strings.xml1
-rw-r--r--core/res/res/values-cs/strings.xml1
-rw-r--r--core/res/res/values-da/strings.xml1
-rw-r--r--core/res/res/values-de/strings.xml3
-rw-r--r--core/res/res/values-el/strings.xml1
-rw-r--r--core/res/res/values-en-rAU/strings.xml7
-rw-r--r--core/res/res/values-en-rGB/strings.xml7
-rw-r--r--core/res/res/values-en-rIN/strings.xml7
-rw-r--r--core/res/res/values-es-rUS/strings.xml1
-rw-r--r--core/res/res/values-es/strings.xml1
-rw-r--r--core/res/res/values-et-rEE/strings.xml1
-rw-r--r--core/res/res/values-eu-rES/strings.xml1
-rw-r--r--core/res/res/values-fa/strings.xml1
-rw-r--r--core/res/res/values-fi/strings.xml1
-rw-r--r--core/res/res/values-fr-rCA/strings.xml1
-rw-r--r--core/res/res/values-fr/strings.xml1
-rw-r--r--core/res/res/values-gl-rES/strings.xml1
-rw-r--r--core/res/res/values-gu-rIN/strings.xml1
-rw-r--r--core/res/res/values-hi/strings.xml1
-rw-r--r--core/res/res/values-hr/strings.xml1
-rw-r--r--core/res/res/values-hu/strings.xml1
-rw-r--r--core/res/res/values-hy-rAM/strings.xml1
-rw-r--r--core/res/res/values-in/strings.xml1
-rw-r--r--core/res/res/values-is-rIS/strings.xml1
-rw-r--r--core/res/res/values-it/strings.xml1
-rw-r--r--core/res/res/values-iw/strings.xml1
-rw-r--r--core/res/res/values-ja/strings.xml1
-rw-r--r--core/res/res/values-ka-rGE/strings.xml1
-rw-r--r--core/res/res/values-kk-rKZ/strings.xml1
-rw-r--r--core/res/res/values-km-rKH/strings.xml1
-rw-r--r--core/res/res/values-kn-rIN/strings.xml1
-rw-r--r--core/res/res/values-ko/strings.xml1
-rw-r--r--core/res/res/values-ky-rKG/strings.xml2
-rw-r--r--core/res/res/values-lo-rLA/strings.xml1
-rw-r--r--core/res/res/values-lt/strings.xml1
-rw-r--r--core/res/res/values-lv/strings.xml1
-rw-r--r--core/res/res/values-mk-rMK/strings.xml1
-rw-r--r--core/res/res/values-ml-rIN/strings.xml105
-rw-r--r--core/res/res/values-mn-rMN/strings.xml1
-rw-r--r--core/res/res/values-mr-rIN/strings.xml3
-rw-r--r--core/res/res/values-ms-rMY/strings.xml1
-rw-r--r--core/res/res/values-my-rMM/strings.xml1
-rw-r--r--core/res/res/values-nb/strings.xml7
-rw-r--r--core/res/res/values-ne-rNP/strings.xml1
-rw-r--r--core/res/res/values-nl/strings.xml1
-rw-r--r--core/res/res/values-pa-rIN/strings.xml1
-rw-r--r--core/res/res/values-pl/strings.xml1
-rw-r--r--core/res/res/values-pt-rPT/strings.xml1
-rw-r--r--core/res/res/values-pt/strings.xml1
-rw-r--r--core/res/res/values-ro/strings.xml1
-rw-r--r--core/res/res/values-ru/strings.xml1
-rw-r--r--core/res/res/values-si-rLK/strings.xml7
-rw-r--r--core/res/res/values-sk/strings.xml1
-rw-r--r--core/res/res/values-sl/strings.xml1
-rw-r--r--core/res/res/values-sq-rAL/strings.xml1
-rw-r--r--core/res/res/values-sr/strings.xml1
-rw-r--r--core/res/res/values-sv/strings.xml1
-rw-r--r--core/res/res/values-sw/strings.xml1
-rw-r--r--core/res/res/values-ta-rIN/strings.xml1
-rw-r--r--core/res/res/values-te-rIN/strings.xml1
-rw-r--r--core/res/res/values-th/strings.xml1
-rw-r--r--core/res/res/values-tl/strings.xml1
-rw-r--r--core/res/res/values-tr/strings.xml1
-rw-r--r--core/res/res/values-uk/strings.xml1
-rw-r--r--core/res/res/values-ur-rPK/strings.xml1
-rw-r--r--core/res/res/values-uz-rUZ/strings.xml1
-rw-r--r--core/res/res/values-vi/strings.xml1
-rw-r--r--core/res/res/values-zh-rCN/strings.xml1
-rw-r--r--core/res/res/values-zh-rHK/strings.xml1
-rw-r--r--core/res/res/values-zh-rTW/strings.xml1
-rw-r--r--core/res/res/values-zu/strings.xml7
-rw-r--r--core/res/res/values/strings.xml24
-rwxr-xr-xcore/res/res/values/symbols.xml7
-rw-r--r--docs/html-intl/intl/es/index.jd7
-rw-r--r--docs/html-intl/intl/es/preview/index.jd9
-rw-r--r--docs/html-intl/intl/es/preview/overview.jd27
-rw-r--r--docs/html-intl/intl/ja/index.jd8
-rw-r--r--docs/html-intl/intl/ja/preview/index.jd8
-rw-r--r--docs/html-intl/intl/ja/preview/overview.jd29
-rw-r--r--docs/html-intl/intl/ko/index.jd9
-rw-r--r--docs/html-intl/intl/ko/preview/index.jd7
-rw-r--r--docs/html-intl/intl/ko/preview/overview.jd27
-rw-r--r--docs/html-intl/intl/pt-br/index.jd8
-rw-r--r--docs/html-intl/intl/pt-br/preview/index.jd7
-rw-r--r--docs/html-intl/intl/pt-br/preview/overview.jd27
-rw-r--r--docs/html-intl/intl/ru/index.jd7
-rw-r--r--docs/html-intl/intl/ru/preview/index.jd7
-rw-r--r--docs/html-intl/intl/ru/preview/overview.jd29
-rw-r--r--docs/html-intl/intl/zh-cn/index.jd7
-rw-r--r--docs/html-intl/intl/zh-cn/preview/index.jd7
-rw-r--r--docs/html-intl/intl/zh-cn/preview/overview.jd29
-rw-r--r--docs/html-intl/intl/zh-tw/index.jd9
-rw-r--r--docs/html-intl/intl/zh-tw/preview/index.jd7
-rw-r--r--docs/html-intl/intl/zh-tw/preview/overview.jd27
-rw-r--r--docs/html/index.jd8
-rw-r--r--docs/html/preview/overview.jd33
-rw-r--r--docs/html/preview/preview_toc.cs2
-rw-r--r--docs/html/preview/support.jd21
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes.html45
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_additions.html346
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_all.html439
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_changes.html128
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_removals.html61
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.Builder.html143
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.CustomAction.html129
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.html158
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewCompat.html136
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewPager.html154
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewParentCompat.html122
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewPropertyAnimatorCompat.html143
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html165
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatActivity.html122
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatCallback.html122
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatDelegate.html129
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatDialog.html122
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.util.SortedList.html122
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/changes-summary.html247
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_additions.html61
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_all.html102
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_changes.html102
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_removals.html61
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_additions.html61
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_all.html61
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_changes.html61
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_removals.html61
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_additions.html83
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_all.html83
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_changes.html61
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_removals.html61
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_help.html134
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_statistics.html278
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_topleftframe.html63
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_additions.html278
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_all.html280
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_changes.html67
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_removals.html61
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_additions.html75
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_all.html80
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_changes.html69
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_removals.html63
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.media.session.html133
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.view.accessibility.html119
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.view.html140
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v7.app.html140
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v7.util.html119
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/stylesheet-jdiff.css44
-rw-r--r--graphics/java/android/graphics/drawable/BitmapDrawable.java3
-rw-r--r--libs/hwui/Canvas.h4
-rw-r--r--libs/hwui/DisplayListCanvas.cpp5
-rw-r--r--libs/hwui/DisplayListCanvas.h1
-rw-r--r--libs/hwui/DisplayListOp.h19
-rw-r--r--libs/hwui/OpenGLRenderer.cpp6
-rwxr-xr-xlibs/hwui/OpenGLRenderer.h13
-rw-r--r--libs/hwui/RenderNode.cpp1
-rw-r--r--libs/hwui/SkiaCanvas.cpp1
-rw-r--r--libs/hwui/SkiaCanvasProxy.cpp6
-rw-r--r--packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java11
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java3
-rw-r--r--packages/SystemUI/res/values-ml-rIN/strings.xml28
-rw-r--r--packages/SystemUI/src/com/android/systemui/SysUIToast.java31
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java7
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java286
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java20
-rw-r--r--services/core/java/com/android/server/am/ActivityStack.java1
-rw-r--r--services/core/java/com/android/server/connectivity/NetworkAgentInfo.java85
-rw-r--r--services/core/java/com/android/server/connectivity/NetworkMonitor.java50
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java8
-rw-r--r--services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java1
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java117
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java13
-rw-r--r--services/core/java/com/android/server/policy/BarController.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowAnimator.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java14
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java1
-rw-r--r--services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java319
-rw-r--r--telecomm/java/android/telecom/ConnectionServiceAdapter.java15
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java61
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephony.aidl12
-rw-r--r--telephony/java/com/android/internal/telephony/PhoneConstants.java3
-rw-r--r--test-runner/src/android/test/mock/MockPackageManager.java5
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java6
243 files changed, 8757 insertions, 1399 deletions
diff --git a/Android.mk b/Android.mk
index e96a93239f01..1de362573d29 100644
--- a/Android.mk
+++ b/Android.mk
@@ -181,6 +181,7 @@ LOCAL_SRC_FILES += \
core/java/android/hardware/location/IGeofenceHardwareMonitorCallback.aidl \
core/java/android/hardware/soundtrigger/IRecognitionStatusCallback.aidl \
core/java/android/hardware/usb/IUsbManager.aidl \
+ core/java/android/net/ICaptivePortal.aidl \
core/java/android/net/IConnectivityManager.aidl \
core/java/android/net/IEthernetManager.aidl \
core/java/android/net/IEthernetServiceListener.aidl \
diff --git a/api/current.txt b/api/current.txt
index e5b190c7fd64..df9ea355bbc0 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -2716,7 +2716,8 @@ package android.accounts {
method public java.lang.String getUserData(android.accounts.Account, java.lang.String);
method public android.accounts.AccountManagerFuture<java.lang.Boolean> hasFeatures(android.accounts.Account, java.lang.String[], android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler);
method public void invalidateAuthToken(java.lang.String, java.lang.String);
- method public static android.content.Intent newChooseAccountIntent(android.accounts.Account, java.util.ArrayList<android.accounts.Account>, java.lang.String[], boolean, java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle);
+ method public static deprecated android.content.Intent newChooseAccountIntent(android.accounts.Account, java.util.ArrayList<android.accounts.Account>, java.lang.String[], boolean, java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle);
+ method public static android.content.Intent newChooseAccountIntent(android.accounts.Account, java.util.List<android.accounts.Account>, java.lang.String[], java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle);
method public boolean notifyAccountAuthenticated(android.accounts.Account);
method public java.lang.String peekAuthToken(android.accounts.Account, java.lang.String);
method public deprecated android.accounts.AccountManagerFuture<java.lang.Boolean> removeAccount(android.accounts.Account, android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler);
@@ -9256,6 +9257,7 @@ package android.content.pm {
method public abstract java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle);
method public abstract android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
method public abstract boolean hasSystemFeature(java.lang.String);
+ method public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
method public abstract boolean isSafeMode();
method public abstract java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
method public abstract java.util.List<android.content.pm.ProviderInfo> queryContentProviders(java.lang.String, int, int);
@@ -13176,7 +13178,6 @@ package android.hardware.camera2 {
method public abstract void close();
method public abstract android.hardware.camera2.CameraDevice getDevice();
method public abstract android.view.Surface getInputSurface();
- method public abstract boolean isConstrainedHighSpeed();
method public abstract boolean isReprocessable();
method public abstract void prepare(android.view.Surface) throws android.hardware.camera2.CameraAccessException;
method public abstract int setRepeatingBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
@@ -13294,12 +13295,16 @@ package android.hardware.camera2 {
method public final int hashCode();
}
+ public abstract class CameraConstrainedHighSpeedCaptureSession extends android.hardware.camera2.CameraCaptureSession {
+ ctor public CameraConstrainedHighSpeedCaptureSession();
+ method public abstract java.util.List<android.hardware.camera2.CaptureRequest> createHighSpeedRequestList(android.hardware.camera2.CaptureRequest) throws android.hardware.camera2.CameraAccessException;
+ }
+
public abstract class CameraDevice implements java.lang.AutoCloseable {
method public abstract void close();
method public abstract android.hardware.camera2.CaptureRequest.Builder createCaptureRequest(int) throws android.hardware.camera2.CameraAccessException;
method public abstract void createCaptureSession(java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
method public abstract void createConstrainedHighSpeedCaptureSession(java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
- method public abstract java.util.List<android.hardware.camera2.CaptureRequest> createConstrainedHighSpeedRequestList(android.hardware.camera2.CaptureRequest) throws android.hardware.camera2.CameraAccessException;
method public abstract android.hardware.camera2.CaptureRequest.Builder createReprocessCaptureRequest(android.hardware.camera2.TotalCaptureResult) throws android.hardware.camera2.CameraAccessException;
method public abstract void createReprocessableCaptureSession(android.hardware.camera2.params.InputConfiguration, java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
method public abstract java.lang.String getId();
@@ -18097,6 +18102,14 @@ package android.mtp {
package android.net {
+ public class CaptivePortal implements android.os.Parcelable {
+ method public int describeContents();
+ method public void ignoreNetwork();
+ method public void reportCaptivePortalDismissed();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.net.CaptivePortal> CREATOR;
+ }
+
public class ConnectivityManager {
method public void addDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
method public boolean bindProcessToNetwork(android.net.Network);
@@ -18113,7 +18126,6 @@ package android.net {
method public android.net.NetworkInfo getNetworkInfo(android.net.Network);
method public deprecated int getNetworkPreference();
method public static deprecated android.net.Network getProcessDefaultNetwork();
- method public void ignoreNetworkWithCaptivePortal(android.net.Network, java.lang.String);
method public boolean isActiveNetworkMetered();
method public boolean isDefaultNetworkActive();
method public static deprecated boolean isNetworkTypeValid(int);
@@ -18122,7 +18134,6 @@ package android.net {
method public void releaseNetworkRequest(android.app.PendingIntent);
method public void removeDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
method public deprecated void reportBadNetwork(android.net.Network);
- method public void reportCaptivePortalDismissed(android.net.Network, java.lang.String);
method public void reportNetworkConnectivity(android.net.Network, boolean);
method public boolean requestBandwidthUpdate(android.net.Network);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
@@ -18135,7 +18146,7 @@ package android.net {
field public static final java.lang.String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL";
field public static final java.lang.String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
field public static final deprecated int DEFAULT_NETWORK_PREFERENCE = 1; // 0x1
- field public static final java.lang.String EXTRA_CAPTIVE_PORTAL_TOKEN = "captivePortalToken";
+ field public static final java.lang.String EXTRA_CAPTIVE_PORTAL = "android.net.extra.CAPTIVE_PORTAL";
field public static final java.lang.String EXTRA_EXTRA_INFO = "extraInfo";
field public static final java.lang.String EXTRA_IS_FAILOVER = "isFailover";
field public static final java.lang.String EXTRA_NETWORK = "android.net.extra.NETWORK";
@@ -26405,7 +26416,8 @@ package android.provider {
field public static final java.lang.String ACTION_LOCATION_SOURCE_SETTINGS = "android.settings.LOCATION_SOURCE_SETTINGS";
field public static final java.lang.String ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS = "android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS";
field public static final java.lang.String ACTION_MANAGE_APPLICATIONS_SETTINGS = "android.settings.MANAGE_APPLICATIONS_SETTINGS";
- field public static final java.lang.String ACTION_MANAGE_OVERLAY_PERMISSION = "android.settings.MANAGE_OVERLAY_PERMISSION";
+ field public static final java.lang.String ACTION_MANAGE_OVERLAY_PERMISSION = "android.settings.action.MANAGE_OVERLAY_PERMISSION";
+ field public static final java.lang.String ACTION_MANAGE_WRITE_SETTINGS = "android.settings.action.MANAGE_WRITE_SETTINGS";
field public static final java.lang.String ACTION_MEMORY_CARD_SETTINGS = "android.settings.MEMORY_CARD_SETTINGS";
field public static final java.lang.String ACTION_NETWORK_OPERATOR_SETTINGS = "android.settings.NETWORK_OPERATOR_SETTINGS";
field public static final java.lang.String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS";
@@ -28792,6 +28804,7 @@ package android.service.voice {
method public android.view.LayoutInflater getLayoutInflater();
method public android.app.Dialog getWindow();
method public void hide();
+ method public void onAssistStructureFailure(java.lang.Throwable);
method public void onBackPressed();
method public void onCancelRequest(android.service.voice.VoiceInteractionSession.Request);
method public void onCloseSystemDialogs();
@@ -31805,6 +31818,7 @@ package android.test.mock {
method public java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle);
method public android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
method public boolean hasSystemFeature(java.lang.String);
+ method public boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
method public boolean isSafeMode();
method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
method public java.util.List<android.content.pm.ProviderInfo> queryContentProviders(java.lang.String, int, int);
diff --git a/api/system-current.txt b/api/system-current.txt
index 18cde0880644..eb1c4313ce9a 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -2813,7 +2813,8 @@ package android.accounts {
method public java.lang.String getUserData(android.accounts.Account, java.lang.String);
method public android.accounts.AccountManagerFuture<java.lang.Boolean> hasFeatures(android.accounts.Account, java.lang.String[], android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler);
method public void invalidateAuthToken(java.lang.String, java.lang.String);
- method public static android.content.Intent newChooseAccountIntent(android.accounts.Account, java.util.ArrayList<android.accounts.Account>, java.lang.String[], boolean, java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle);
+ method public static deprecated android.content.Intent newChooseAccountIntent(android.accounts.Account, java.util.ArrayList<android.accounts.Account>, java.lang.String[], boolean, java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle);
+ method public static android.content.Intent newChooseAccountIntent(android.accounts.Account, java.util.List<android.accounts.Account>, java.lang.String[], java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle);
method public boolean notifyAccountAuthenticated(android.accounts.Account);
method public java.lang.String peekAuthToken(android.accounts.Account, java.lang.String);
method public deprecated android.accounts.AccountManagerFuture<java.lang.Boolean> removeAccount(android.accounts.Account, android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler);
@@ -9540,6 +9541,7 @@ package android.content.pm {
method public abstract android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
method public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
method public abstract boolean hasSystemFeature(java.lang.String);
+ method public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
method public abstract boolean isSafeMode();
method public abstract java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
method public abstract java.util.List<android.content.pm.ProviderInfo> queryContentProviders(java.lang.String, int, int);
@@ -13516,7 +13518,6 @@ package android.hardware.camera2 {
method public abstract void close();
method public abstract android.hardware.camera2.CameraDevice getDevice();
method public abstract android.view.Surface getInputSurface();
- method public abstract boolean isConstrainedHighSpeed();
method public abstract boolean isReprocessable();
method public abstract void prepare(android.view.Surface) throws android.hardware.camera2.CameraAccessException;
method public abstract int setRepeatingBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
@@ -13634,12 +13635,16 @@ package android.hardware.camera2 {
method public final int hashCode();
}
+ public abstract class CameraConstrainedHighSpeedCaptureSession extends android.hardware.camera2.CameraCaptureSession {
+ ctor public CameraConstrainedHighSpeedCaptureSession();
+ method public abstract java.util.List<android.hardware.camera2.CaptureRequest> createHighSpeedRequestList(android.hardware.camera2.CaptureRequest) throws android.hardware.camera2.CameraAccessException;
+ }
+
public abstract class CameraDevice implements java.lang.AutoCloseable {
method public abstract void close();
method public abstract android.hardware.camera2.CaptureRequest.Builder createCaptureRequest(int) throws android.hardware.camera2.CameraAccessException;
method public abstract void createCaptureSession(java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
method public abstract void createConstrainedHighSpeedCaptureSession(java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
- method public abstract java.util.List<android.hardware.camera2.CaptureRequest> createConstrainedHighSpeedRequestList(android.hardware.camera2.CaptureRequest) throws android.hardware.camera2.CameraAccessException;
method public abstract android.hardware.camera2.CaptureRequest.Builder createReprocessCaptureRequest(android.hardware.camera2.TotalCaptureResult) throws android.hardware.camera2.CameraAccessException;
method public abstract void createReprocessableCaptureSession(android.hardware.camera2.params.InputConfiguration, java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
method public abstract java.lang.String getId();
@@ -19607,6 +19612,14 @@ package android.mtp {
package android.net {
+ public class CaptivePortal implements android.os.Parcelable {
+ method public int describeContents();
+ method public void ignoreNetwork();
+ method public void reportCaptivePortalDismissed();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.net.CaptivePortal> CREATOR;
+ }
+
public class ConnectivityManager {
method public void addDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
method public boolean bindProcessToNetwork(android.net.Network);
@@ -19623,7 +19636,6 @@ package android.net {
method public android.net.NetworkInfo getNetworkInfo(android.net.Network);
method public deprecated int getNetworkPreference();
method public static deprecated android.net.Network getProcessDefaultNetwork();
- method public void ignoreNetworkWithCaptivePortal(android.net.Network, java.lang.String);
method public boolean isActiveNetworkMetered();
method public boolean isDefaultNetworkActive();
method public static deprecated boolean isNetworkTypeValid(int);
@@ -19632,7 +19644,6 @@ package android.net {
method public void releaseNetworkRequest(android.app.PendingIntent);
method public void removeDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
method public deprecated void reportBadNetwork(android.net.Network);
- method public void reportCaptivePortalDismissed(android.net.Network, java.lang.String);
method public void reportNetworkConnectivity(android.net.Network, boolean);
method public boolean requestBandwidthUpdate(android.net.Network);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
@@ -19645,7 +19656,7 @@ package android.net {
field public static final java.lang.String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL";
field public static final java.lang.String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
field public static final deprecated int DEFAULT_NETWORK_PREFERENCE = 1; // 0x1
- field public static final java.lang.String EXTRA_CAPTIVE_PORTAL_TOKEN = "captivePortalToken";
+ field public static final java.lang.String EXTRA_CAPTIVE_PORTAL = "android.net.extra.CAPTIVE_PORTAL";
field public static final java.lang.String EXTRA_EXTRA_INFO = "extraInfo";
field public static final java.lang.String EXTRA_IS_FAILOVER = "isFailover";
field public static final java.lang.String EXTRA_NETWORK = "android.net.extra.NETWORK";
@@ -28461,7 +28472,8 @@ package android.provider {
field public static final java.lang.String ACTION_LOCATION_SOURCE_SETTINGS = "android.settings.LOCATION_SOURCE_SETTINGS";
field public static final java.lang.String ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS = "android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS";
field public static final java.lang.String ACTION_MANAGE_APPLICATIONS_SETTINGS = "android.settings.MANAGE_APPLICATIONS_SETTINGS";
- field public static final java.lang.String ACTION_MANAGE_OVERLAY_PERMISSION = "android.settings.MANAGE_OVERLAY_PERMISSION";
+ field public static final java.lang.String ACTION_MANAGE_OVERLAY_PERMISSION = "android.settings.action.MANAGE_OVERLAY_PERMISSION";
+ field public static final java.lang.String ACTION_MANAGE_WRITE_SETTINGS = "android.settings.action.MANAGE_WRITE_SETTINGS";
field public static final java.lang.String ACTION_MEMORY_CARD_SETTINGS = "android.settings.MEMORY_CARD_SETTINGS";
field public static final java.lang.String ACTION_NETWORK_OPERATOR_SETTINGS = "android.settings.NETWORK_OPERATOR_SETTINGS";
field public static final java.lang.String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS";
@@ -30941,6 +30953,7 @@ package android.service.voice {
method public android.view.LayoutInflater getLayoutInflater();
method public android.app.Dialog getWindow();
method public void hide();
+ method public void onAssistStructureFailure(java.lang.Throwable);
method public void onBackPressed();
method public void onCancelRequest(android.service.voice.VoiceInteractionSession.Request);
method public void onCloseSystemDialogs();
@@ -34091,6 +34104,7 @@ package android.test.mock {
method public android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
method public void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
method public boolean hasSystemFeature(java.lang.String);
+ method public boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
method public boolean isSafeMode();
method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
method public java.util.List<android.content.pm.ProviderInfo> queryContentProviders(java.lang.String, int, int);
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index aa7692b1097f..7a209296a08c 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -43,6 +43,7 @@ import com.google.android.collect.Maps;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
@@ -2259,6 +2260,9 @@ public class AccountManager {
}
/**
+ * Deprecated in favor of {@link #newChooseAccountIntent(Account, List, String[], String,
+ * String, String[], Bundle)}.
+ *
* Returns an intent to an {@link Activity} that prompts the user to choose from a list of
* accounts.
* The caller will then typically start the activity by calling
@@ -2273,14 +2277,13 @@ public class AccountManager {
* null, null, null);</pre>
* @param selectedAccount if specified, indicates that the {@link Account} is the currently
* selected one, according to the caller's definition of selected.
- * @param allowableAccounts an optional {@link ArrayList} of accounts that are allowed to be
+ * @param allowableAccounts an optional {@link List} of accounts that are allowed to be
* shown. If not specified then this field will not limit the displayed accounts.
* @param allowableAccountTypes an optional string array of account types. These are used
* both to filter the shown accounts and to filter the list of account types that are shown
* when adding an account. If not specified then this field will not limit the displayed
* account types when adding an account.
- * @param alwaysPromptForAccount if set the account chooser screen is always shown, otherwise
- * it is only shown when there is more than one account from which to choose
+ * @param alwaysPromptForAccount boolean that is ignored.
* @param descriptionOverrideText if non-null this string is used as the description in the
* accounts chooser screen rather than the default
* @param addAccountAuthTokenType this string is passed as the {@link #addAccount}
@@ -2291,7 +2294,9 @@ public class AccountManager {
* parameter
* @return an {@link Intent} that can be used to launch the ChooseAccount activity flow.
*/
- static public Intent newChooseAccountIntent(Account selectedAccount,
+ @Deprecated
+ static public Intent newChooseAccountIntent(
+ Account selectedAccount,
ArrayList<Account> allowableAccounts,
String[] allowableAccountTypes,
boolean alwaysPromptForAccount,
@@ -2299,20 +2304,67 @@ public class AccountManager {
String addAccountAuthTokenType,
String[] addAccountRequiredFeatures,
Bundle addAccountOptions) {
+ return newChooseAccountIntent(
+ selectedAccount,
+ allowableAccounts,
+ allowableAccountTypes,
+ descriptionOverrideText,
+ addAccountAuthTokenType,
+ addAccountRequiredFeatures,
+ addAccountOptions);
+ }
+
+ /**
+ * Returns an intent to an {@link Activity} that prompts the user to choose from a list of
+ * accounts.
+ * The caller will then typically start the activity by calling
+ * <code>startActivityForResult(intent, ...);</code>.
+ * <p>
+ * On success the activity returns a Bundle with the account name and type specified using
+ * keys {@link #KEY_ACCOUNT_NAME} and {@link #KEY_ACCOUNT_TYPE}.
+ * <p>
+ * The most common case is to call this with one account type, e.g.:
+ * <p>
+ * <pre> newChooseAccountIntent(null, null, new String[]{"com.google"}, null, null, null,
+ * null);</pre>
+ * @param selectedAccount if specified, indicates that the {@link Account} is the currently
+ * selected one, according to the caller's definition of selected.
+ * @param allowableAccounts an optional {@link List} of accounts that are allowed to be
+ * shown. If not specified then this field will not limit the displayed accounts.
+ * @param allowableAccountTypes an optional string array of account types. These are used
+ * both to filter the shown accounts and to filter the list of account types that are shown
+ * when adding an account. If not specified then this field will not limit the displayed
+ * account types when adding an account.
+ * @param descriptionOverrideText if non-null this string is used as the description in the
+ * accounts chooser screen rather than the default
+ * @param addAccountAuthTokenType this string is passed as the {@link #addAccount}
+ * authTokenType parameter
+ * @param addAccountRequiredFeatures this string array is passed as the {@link #addAccount}
+ * requiredFeatures parameter
+ * @param addAccountOptions This {@link Bundle} is passed as the {@link #addAccount} options
+ * parameter
+ * @return an {@link Intent} that can be used to launch the ChooseAccount activity flow.
+ */
+ static public Intent newChooseAccountIntent(
+ Account selectedAccount,
+ List<Account> allowableAccounts,
+ String[] allowableAccountTypes,
+ String descriptionOverrideText,
+ String addAccountAuthTokenType,
+ String[] addAccountRequiredFeatures,
+ Bundle addAccountOptions) {
Intent intent = new Intent();
ComponentName componentName = ComponentName.unflattenFromString(
Resources.getSystem().getString(R.string.config_chooseTypeAndAccountActivity));
intent.setClassName(componentName.getPackageName(),
componentName.getClassName());
intent.putExtra(ChooseTypeAndAccountActivity.EXTRA_ALLOWABLE_ACCOUNTS_ARRAYLIST,
- allowableAccounts);
+ new ArrayList<Account>(allowableAccounts));
intent.putExtra(ChooseTypeAndAccountActivity.EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY,
allowableAccountTypes);
intent.putExtra(ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE,
addAccountOptions);
intent.putExtra(ChooseTypeAndAccountActivity.EXTRA_SELECTED_ACCOUNT, selectedAccount);
- intent.putExtra(ChooseTypeAndAccountActivity.EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT,
- alwaysPromptForAccount);
intent.putExtra(ChooseTypeAndAccountActivity.EXTRA_DESCRIPTION_TEXT_OVERRIDE,
descriptionOverrideText);
intent.putExtra(ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING,
diff --git a/core/java/android/accounts/ChooseTypeAndAccountActivity.java b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
index c06b4622c571..133df2bfa16a 100644
--- a/core/java/android/accounts/ChooseTypeAndAccountActivity.java
+++ b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
@@ -88,9 +88,10 @@ public class ChooseTypeAndAccountActivity extends Activity
public static final String EXTRA_SELECTED_ACCOUNT = "selectedAccount";
/**
- * If true then display the account selection list even if there is just
- * one account to choose from. boolean.
+ * Deprecated. Providing this extra to {@link ChooseTypeAndAccountActivity}
+ * will have no effect.
*/
+ @Deprecated
public static final String EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT =
"alwaysPromptForAccount";
@@ -117,7 +118,6 @@ public class ChooseTypeAndAccountActivity extends Activity
private Set<String> mSetOfRelevantAccountTypes;
private String mSelectedAccountName = null;
private boolean mSelectedAddNewAccount = false;
- private boolean mAlwaysPromptForAccount = false;
private String mDescriptionOverride;
private ArrayList<Account> mAccounts;
@@ -188,7 +188,6 @@ public class ChooseTypeAndAccountActivity extends Activity
mSetOfAllowableAccounts = getAllowableAccountSet(intent);
mSetOfRelevantAccountTypes = getReleventAccountTypes(intent);
- mAlwaysPromptForAccount = intent.getBooleanExtra(EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT, false);
mDescriptionOverride = intent.getStringExtra(EXTRA_DESCRIPTION_TEXT_OVERRIDE);
mAccounts = getAcceptableAccountChoices(AccountManager.get(this));
@@ -218,15 +217,6 @@ public class ChooseTypeAndAccountActivity extends Activity
} else {
startChooseAccountTypeActivity();
}
- return;
- }
-
- // if there is only one allowable account return it
- if (!mAlwaysPromptForAccount && mAccounts.size() == 1) {
- Account account = mAccounts.get(0);
- super.onCreate(savedInstanceState);
- setResultAndFinish(account.name, account.type);
- return;
}
}
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 828dc0af2026..2b4d03b41fb9 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -180,15 +180,14 @@ public final class ActivityThread {
final ApplicationThread mAppThread = new ApplicationThread();
final Looper mLooper = Looper.myLooper();
final H mH = new H();
- final ArrayMap<IBinder, ActivityClientRecord> mActivities
- = new ArrayMap<IBinder, ActivityClientRecord>();
+ final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>();
// List of new activities (via ActivityRecord.nextIdle) that should
// be reported when next we idle.
ActivityClientRecord mNewActivities = null;
// Number of activities that are currently visible on-screen.
int mNumVisibleActivities = 0;
- final ArrayMap<IBinder, Service> mServices
- = new ArrayMap<IBinder, Service>();
+ WeakReference<AssistStructure> mLastAssistStructure;
+ final ArrayMap<IBinder, Service> mServices = new ArrayMap<>();
AppBindData mBoundApplication;
Profiler mProfiler;
int mCurDefaultDisplayDpi;
@@ -2568,6 +2567,12 @@ public final class ActivityThread {
}
public void handleRequestAssistContextExtras(RequestAssistContextExtras cmd) {
+ if (mLastAssistStructure != null) {
+ AssistStructure structure = mLastAssistStructure.get();
+ if (structure != null) {
+ structure.clearSendChannel();
+ }
+ }
Bundle data = new Bundle();
AssistStructure structure = null;
AssistContent content = new AssistContent();
@@ -2597,6 +2602,7 @@ public final class ActivityThread {
if (structure == null) {
structure = new AssistStructure();
}
+ mLastAssistStructure = new WeakReference<>(structure);
IActivityManager mgr = ActivityManagerNative.getDefault();
try {
mgr.reportAssistContextExtras(cmd.requestToken, data, structure, content, referrer);
diff --git a/core/java/android/app/AlarmManager.java b/core/java/android/app/AlarmManager.java
index 9ea160680683..dc83a011e596 100644
--- a/core/java/android/app/AlarmManager.java
+++ b/core/java/android/app/AlarmManager.java
@@ -570,12 +570,15 @@ public class AlarmManager {
* even when the system is in low-power idle modes. This type of alarm must <b>only</b>
* be used for situations where it is actually required that the alarm go off while in
* idle -- a reasonable example would be for a calendar notification that should make a
- * sound so the user is aware of it. These alarms can significantly impact the power use
- * of the device when idle (and thus cause significant battery blame to the app scheduling
- * them), so they should be used with care.
+ * sound so the user is aware of it. When the alarm is dispatched, the app will also be
+ * added to the system's temporary whitelist for approximately 10 seconds to allow that
+ * application to acquire further wake locks in which to complete its work.</p>
*
- * <p>To reduce abuse, there are restrictions on how frequently these alarms will go off
- * for a particular application. Under normal system operation, it will not dispatch these
+ * <p>These alarms can significantly impact the power use
+ * of the device when idle (and thus cause significant battery blame to the app scheduling
+ * them), so they should be used with care. To reduce abuse, there are restrictions on how
+ * frequently these alarms will go off for a particular application.
+ * Under normal system operation, it will not dispatch these
* alarms more than about every minute (at which point every such pending alarm is
* dispatched); when in low-power idle modes this duration may be significantly longer,
* such as 15 minutes.</p>
@@ -619,12 +622,15 @@ public class AlarmManager {
* {@link #setAndAllowWhileIdle}. This type of alarm must <b>only</b>
* be used for situations where it is actually required that the alarm go off while in
* idle -- a reasonable example would be for a calendar notification that should make a
- * sound so the user is aware of it. These alarms can significantly impact the power use
- * of the device when idle (and thus cause significant battery blame to the app scheduling
- * them), so they should be used with care.
+ * sound so the user is aware of it. When the alarm is dispatched, the app will also be
+ * added to the system's temporary whitelist for approximately 10 seconds to allow that
+ * application to acquire further wake locks in which to complete its work.</p>
*
- * <p>To reduce abuse, there are restrictions on how frequently these alarms will go off
- * for a particular application. Under normal system operation, it will not dispatch these
+ * <p>These alarms can significantly impact the power use
+ * of the device when idle (and thus cause significant battery blame to the app scheduling
+ * them), so they should be used with care. To reduce abuse, there are restrictions on how
+ * frequently these alarms will go off for a particular application.
+ * Under normal system operation, it will not dispatch these
* alarms more than about every minute (at which point every such pending alarm is
* dispatched); when in low-power idle modes this duration may be significantly longer,
* such as 15 minutes.</p>
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index cb1e7aac0e19..1fb0b2af3366 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -421,6 +421,15 @@ final class ApplicationPackageManager extends PackageManager {
}
@Override
+ public boolean isPermissionRevokedByPolicy(String permName, String pkgName) {
+ try {
+ return mPM.isPermissionRevokedByPolicy(permName, pkgName, mContext.getUserId());
+ } catch (RemoteException e) {
+ throw new RuntimeException("Package manager has died", e);
+ }
+ }
+
+ @Override
public boolean addPermission(PermissionInfo info) {
try {
return mPM.addPermission(info);
diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java
index 73c551f5af40..9673c98b253b 100644
--- a/core/java/android/app/assist/AssistStructure.java
+++ b/core/java/android/app/assist/AssistStructure.java
@@ -30,6 +30,9 @@ import java.util.ArrayList;
public class AssistStructure implements Parcelable {
static final String TAG = "AssistStructure";
+ static final boolean DEBUG_PARCEL = false;
+ static final boolean DEBUG_PARCEL_TREE = false;
+
boolean mHaveData;
ComponentName mActivityComponent;
@@ -46,12 +49,40 @@ public class AssistStructure implements Parcelable {
static final int TRANSACTION_XFER = Binder.FIRST_CALL_TRANSACTION+1;
static final String DESCRIPTOR = "android.app.AssistStructure";
- final class SendChannel extends Binder {
+ final static class SendChannel extends Binder {
+ volatile AssistStructure mAssistStructure;
+
+ SendChannel(AssistStructure as) {
+ mAssistStructure = as;
+ }
+
@Override protected boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
if (code == TRANSACTION_XFER) {
+ AssistStructure as = mAssistStructure;
+ if (as == null) {
+ return true;
+ }
+
data.enforceInterface(DESCRIPTOR);
- writeContentToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ IBinder token = data.readStrongBinder();
+ if (DEBUG_PARCEL) Log.d(TAG, "Request for data on " + as
+ + " using token " + token);
+ if (token != null) {
+ if (DEBUG_PARCEL) Log.d(TAG, "Resuming partial write of " + token);
+ if (token instanceof ParcelTransferWriter) {
+ ParcelTransferWriter xfer = (ParcelTransferWriter)token;
+ xfer.writeToParcel(as, reply);
+ return true;
+ }
+ Log.w(TAG, "Caller supplied bad token type: " + token);
+ // Don't write anything; this is the end of the data.
+ return true;
+ }
+ //long start = SystemClock.uptimeMillis();
+ ParcelTransferWriter xfer = new ParcelTransferWriter(as, reply);
+ xfer.writeToParcel(as, reply);
+ //Log.i(TAG, "Time to parcel: " + (SystemClock.uptimeMillis()-start) + "ms");
return true;
} else {
return super.onTransact(code, data, reply, flags);
@@ -59,6 +90,235 @@ public class AssistStructure implements Parcelable {
}
}
+ final static class ViewStackEntry {
+ ViewNode node;
+ int curChild;
+ int numChildren;
+ }
+
+ final static class ParcelTransferWriter extends Binder {
+ final boolean mWriteStructure;
+ int mCurWindow;
+ int mNumWindows;
+ final ArrayList<ViewStackEntry> mViewStack = new ArrayList<>();
+ ViewStackEntry mCurViewStackEntry;
+ int mCurViewStackPos;
+ int mNumWrittenWindows;
+ int mNumWrittenViews;
+ final float[] mTmpMatrix = new float[9];
+
+ ParcelTransferWriter(AssistStructure as, Parcel out) {
+ mWriteStructure = as.waitForReady();
+ ComponentName.writeToParcel(as.mActivityComponent, out);
+ mNumWindows = as.mWindowNodes.size();
+ if (mWriteStructure && mNumWindows > 0) {
+ out.writeInt(mNumWindows);
+ } else {
+ out.writeInt(0);
+ }
+ }
+
+ void writeToParcel(AssistStructure as, Parcel out) {
+ int start = out.dataPosition();
+ mNumWrittenWindows = 0;
+ mNumWrittenViews = 0;
+ boolean more = writeToParcelInner(as, out);
+ Log.i(TAG, "Flattened " + (more ? "partial" : "final") + " assist data: "
+ + (out.dataPosition() - start)
+ + " bytes, containing " + mNumWrittenWindows + " windows, "
+ + mNumWrittenViews + " views");
+ }
+
+ boolean writeToParcelInner(AssistStructure as, Parcel out) {
+ if (mNumWindows == 0) {
+ return false;
+ }
+ if (DEBUG_PARCEL) Log.d(TAG, "Creating PooledStringWriter @ " + out.dataPosition());
+ PooledStringWriter pwriter = new PooledStringWriter(out);
+ while (writeNextEntryToParcel(as, out, pwriter)) {
+ // If the parcel contains more than 100K of data, then we are getting too
+ // large for a single IPC so stop here and let the caller come back when it
+ // is ready for more.
+ if (out.dataSize() > 1024*1024) {
+ if (DEBUG_PARCEL) Log.d(TAG, "Assist data size is " + out.dataSize()
+ + " @ pos " + out.dataPosition() + "; returning partial result");
+ out.writeInt(0);
+ out.writeStrongBinder(this);
+ if (DEBUG_PARCEL) Log.d(TAG, "Finishing PooledStringWriter @ "
+ + out.dataPosition() + ", size " + pwriter.getStringCount());
+ pwriter.finish();
+ return true;
+ }
+ }
+ if (DEBUG_PARCEL) Log.d(TAG, "Finishing PooledStringWriter @ "
+ + out.dataPosition() + ", size " + pwriter.getStringCount());
+ pwriter.finish();
+ mViewStack.clear();
+ return false;
+ }
+
+ void pushViewStackEntry(ViewNode node, int pos) {
+ ViewStackEntry entry;
+ if (pos >= mViewStack.size()) {
+ entry = new ViewStackEntry();
+ mViewStack.add(entry);
+ if (DEBUG_PARCEL_TREE) Log.d(TAG, "New stack entry at " + pos + ": " + entry);
+ } else {
+ entry = mViewStack.get(pos);
+ if (DEBUG_PARCEL_TREE) Log.d(TAG, "Existing stack entry at " + pos + ": " + entry);
+ }
+ entry.node = node;
+ entry.numChildren = node.getChildCount();
+ entry.curChild = 0;
+ mCurViewStackEntry = entry;
+ }
+
+ boolean writeNextEntryToParcel(AssistStructure as, Parcel out, PooledStringWriter pwriter) {
+ // Write next view node if appropriate.
+ if (mCurViewStackEntry != null) {
+ if (mCurViewStackEntry.curChild < mCurViewStackEntry.numChildren) {
+ // Write the next child in the current view.
+ if (DEBUG_PARCEL_TREE) Log.d(TAG, "Writing child #"
+ + mCurViewStackEntry.curChild + " in " + mCurViewStackEntry.node);
+ ViewNode child = mCurViewStackEntry.node.mChildren[mCurViewStackEntry.curChild];
+ mCurViewStackEntry.curChild++;
+ if (DEBUG_PARCEL) Log.d(TAG, "write view: at " + out.dataPosition()
+ + ", windows=" + mNumWrittenWindows
+ + ", views=" + mNumWrittenViews);
+ out.writeInt(1);
+ int flags = child.writeSelfToParcel(out, pwriter, mTmpMatrix);
+ mNumWrittenViews++;
+ // If the child has children, push it on the stack to write them next.
+ if ((flags&ViewNode.FLAGS_HAS_CHILDREN) != 0) {
+ if (DEBUG_PARCEL_TREE) Log.d(TAG, "Preparing to write "
+ + child.mChildren.length + " children under " + child);
+ out.writeInt(child.mChildren.length);
+ int pos = ++mCurViewStackPos;
+ pushViewStackEntry(child, pos);
+ }
+ return true;
+ }
+
+ // We are done writing children of the current view; pop off the stack.
+ do {
+ int pos = --mCurViewStackPos;
+ if (DEBUG_PARCEL_TREE) Log.d(TAG, "Done with " + mCurViewStackEntry.node
+ + "; popping up to " + pos);
+ if (pos < 0) {
+ // Reached the last view; step to next window.
+ if (DEBUG_PARCEL_TREE) Log.d(TAG, "Done with view hierarchy!");
+ mCurViewStackEntry = null;
+ break;
+ }
+ mCurViewStackEntry = mViewStack.get(pos);
+ } while (mCurViewStackEntry.curChild >= mCurViewStackEntry.numChildren);
+ return true;
+ }
+
+ // Write the next window if appropriate.
+ int pos = mCurWindow;
+ if (pos < mNumWindows) {
+ WindowNode win = as.mWindowNodes.get(pos);
+ mCurWindow++;
+ if (DEBUG_PARCEL) Log.d(TAG, "write window #" + pos + ": at " + out.dataPosition()
+ + ", windows=" + mNumWrittenWindows
+ + ", views=" + mNumWrittenViews);
+ out.writeInt(1);
+ win.writeSelfToParcel(out, pwriter, mTmpMatrix);
+ mNumWrittenWindows++;
+ ViewNode root = win.mRoot;
+ mCurViewStackPos = 0;
+ if (DEBUG_PARCEL_TREE) Log.d(TAG, "Pushing initial root view " + root);
+ pushViewStackEntry(root, 0);
+ return true;
+ }
+
+ return false;
+ }
+ }
+
+ final class ParcelTransferReader {
+ final float[] mTmpMatrix = new float[9];
+ PooledStringReader mStringReader;
+
+ int mNumReadWindows;
+ int mNumReadViews;
+
+ private final IBinder mChannel;
+ private IBinder mTransferToken;
+ private Parcel mCurParcel;
+
+ ParcelTransferReader(IBinder channel) {
+ mChannel = channel;
+ }
+
+ void go() {
+ fetchData();
+ mActivityComponent = ComponentName.readFromParcel(mCurParcel);
+ final int N = mCurParcel.readInt();
+ if (N > 0) {
+ if (DEBUG_PARCEL) Log.d(TAG, "Creating PooledStringReader @ "
+ + mCurParcel.dataPosition());
+ mStringReader = new PooledStringReader(mCurParcel);
+ if (DEBUG_PARCEL) Log.d(TAG, "PooledStringReader size = "
+ + mStringReader.getStringCount());
+ for (int i=0; i<N; i++) {
+ mWindowNodes.add(new WindowNode(this));
+ }
+ }
+ if (DEBUG_PARCEL) Log.d(TAG, "Finished reading: at " + mCurParcel.dataPosition()
+ + ", avail=" + mCurParcel.dataAvail() + ", windows=" + mNumReadWindows
+ + ", views=" + mNumReadViews);
+ }
+
+ Parcel readParcel() {
+ if (DEBUG_PARCEL) Log.d(TAG, "readParcel: at " + mCurParcel.dataPosition()
+ + ", avail=" + mCurParcel.dataAvail() + ", windows=" + mNumReadWindows
+ + ", views=" + mNumReadViews);
+ if (mCurParcel.readInt() != 0) {
+ return mCurParcel;
+ }
+ // We have run out of partial data, need to read another batch.
+ mTransferToken = mCurParcel.readStrongBinder();
+ if (mTransferToken == null) {
+ throw new IllegalStateException(
+ "Reached end of partial data without transfer token");
+ }
+ if (DEBUG_PARCEL) Log.d(TAG, "Ran out of partial data at "
+ + mCurParcel.dataPosition() + ", token " + mTransferToken);
+ fetchData();
+ if (DEBUG_PARCEL) Log.d(TAG, "Creating PooledStringReader @ "
+ + mCurParcel.dataPosition());
+ mStringReader = new PooledStringReader(mCurParcel);
+ if (DEBUG_PARCEL) Log.d(TAG, "PooledStringReader size = "
+ + mStringReader.getStringCount());
+ if (DEBUG_PARCEL) Log.d(TAG, "readParcel: at " + mCurParcel.dataPosition()
+ + ", avail=" + mCurParcel.dataAvail() + ", windows=" + mNumReadWindows
+ + ", views=" + mNumReadViews);
+ mCurParcel.readInt();
+ return mCurParcel;
+ }
+
+ private void fetchData() {
+ Parcel data = Parcel.obtain();
+ data.writeInterfaceToken(DESCRIPTOR);
+ data.writeStrongBinder(mTransferToken);
+ if (DEBUG_PARCEL) Log.d(TAG, "Requesting data with token " + mTransferToken);
+ if (mCurParcel != null) {
+ mCurParcel.recycle();
+ }
+ mCurParcel = Parcel.obtain();
+ try {
+ mChannel.transact(TRANSACTION_XFER, data, mCurParcel, 0);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failure reading AssistStructure data", e);
+ throw new IllegalStateException("Failure reading AssistStructure data: " + e);
+ }
+ data.recycle();
+ mNumReadWindows = mNumReadViews = 0;
+ }
+ }
+
final static class ViewNodeText {
CharSequence mText;
float mTextSize;
@@ -145,24 +405,25 @@ public class AssistStructure implements Parcelable {
view.dispatchProvideStructure(builder);
}
- WindowNode(Parcel in, PooledStringReader preader, float[] tmpMatrix) {
+ WindowNode(ParcelTransferReader reader) {
+ Parcel in = reader.readParcel();
+ reader.mNumReadWindows++;
mX = in.readInt();
mY = in.readInt();
mWidth = in.readInt();
mHeight = in.readInt();
mTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
mDisplayId = in.readInt();
- mRoot = new ViewNode(in, preader, tmpMatrix);
+ mRoot = new ViewNode(reader);
}
- int writeToParcel(Parcel out, PooledStringWriter pwriter, float[] tmpMatrix) {
+ void writeSelfToParcel(Parcel out, PooledStringWriter pwriter, float[] tmpMatrix) {
out.writeInt(mX);
out.writeInt(mY);
out.writeInt(mWidth);
out.writeInt(mHeight);
TextUtils.writeToParcel(mTitle, out, 0);
out.writeInt(mDisplayId);
- return mRoot.writeToParcel(out, pwriter, tmpMatrix);
}
/**
@@ -287,7 +548,10 @@ public class AssistStructure implements Parcelable {
ViewNode() {
}
- ViewNode(Parcel in, PooledStringReader preader, float[] tmpMatrix) {
+ ViewNode(ParcelTransferReader reader) {
+ final Parcel in = reader.readParcel();
+ reader.mNumReadViews++;
+ final PooledStringReader preader = reader.mStringReader;
mClassName = preader.readString();
mFlags = in.readInt();
final int flags = mFlags;
@@ -320,8 +584,8 @@ public class AssistStructure implements Parcelable {
}
if ((flags&FLAGS_HAS_MATRIX) != 0) {
mMatrix = new Matrix();
- in.readFloatArray(tmpMatrix);
- mMatrix.setValues(tmpMatrix);
+ in.readFloatArray(reader.mTmpMatrix);
+ mMatrix.setValues(reader.mTmpMatrix);
}
if ((flags&FLAGS_HAS_ELEVATION) != 0) {
mElevation = in.readFloat();
@@ -342,12 +606,12 @@ public class AssistStructure implements Parcelable {
final int NCHILDREN = in.readInt();
mChildren = new ViewNode[NCHILDREN];
for (int i=0; i<NCHILDREN; i++) {
- mChildren[i] = new ViewNode(in, preader, tmpMatrix);
+ mChildren[i] = new ViewNode(reader);
}
}
}
- int writeToParcel(Parcel out, PooledStringWriter pwriter, float[] tmpMatrix) {
+ int writeSelfToParcel(Parcel out, PooledStringWriter pwriter, float[] tmpMatrix) {
int flags = mFlags & ~FLAGS_ALL_CONTROL;
if (mId != View.NO_ID) {
flags |= FLAGS_HAS_ID;
@@ -428,15 +692,7 @@ public class AssistStructure implements Parcelable {
if ((flags&FLAGS_HAS_EXTRAS) != 0) {
out.writeBundle(mExtras);
}
- int N = 1;
- if ((flags&FLAGS_HAS_CHILDREN) != 0) {
- final int NCHILDREN = mChildren.length;
- out.writeInt(NCHILDREN);
- for (int i=0; i<NCHILDREN; i++) {
- N += mChildren[i].writeToParcel(out, pwriter, tmpMatrix);
- }
- }
- return N;
+ return flags;
}
/**
@@ -1177,22 +1433,11 @@ public class AssistStructure implements Parcelable {
return;
}
mHaveData = true;
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
- data.writeInterfaceToken(DESCRIPTOR);
- try {
- mReceiveChannel.transact(TRANSACTION_XFER, data, reply, 0);
- } catch (RemoteException e) {
- Log.w(TAG, "Failure reading AssistStructure data", e);
- return;
- }
- readContentFromParcel(reply);
- data.recycle();
- reply.recycle();
+ ParcelTransferReader reader = new ParcelTransferReader(mReceiveChannel);
+ reader.go();
}
- void writeContentToParcel(Parcel out, int flags) {
- // First make sure all content has been created.
+ boolean waitForReady() {
boolean skipStructure = false;
synchronized (this) {
long endTime = SystemClock.uptimeMillis() + 5000;
@@ -1210,30 +1455,14 @@ public class AssistStructure implements Parcelable {
skipStructure = true;
}
}
- int start = out.dataPosition();
- PooledStringWriter pwriter = new PooledStringWriter(out);
- float[] tmpMatrix = new float[9];
- ComponentName.writeToParcel(mActivityComponent, out);
- final int N = skipStructure ? 0 : mWindowNodes.size();
- out.writeInt(N);
- int NV = 0;
- for (int i=0; i<N; i++) {
- NV += mWindowNodes.get(i).writeToParcel(out, pwriter, tmpMatrix);
- }
- pwriter.finish();
- Log.i(TAG, "Flattened assist data: " + (out.dataPosition() - start) + " bytes, containing "
- + N + " windows, " + NV + " views");
+ return !skipStructure;
}
- void readContentFromParcel(Parcel in) {
- PooledStringReader preader = new PooledStringReader(in);
- float[] tmpMatrix = new float[9];
- mActivityComponent = ComponentName.readFromParcel(in);
- final int N = in.readInt();
- for (int i=0; i<N; i++) {
- mWindowNodes.add(new WindowNode(in, preader, tmpMatrix));
+ /** @hide */
+ public void clearSendChannel() {
+ if (mSendChannel != null) {
+ mSendChannel.mAssistStructure = null;
}
- //dump();
}
public int describeContents() {
@@ -1245,7 +1474,7 @@ public class AssistStructure implements Parcelable {
// This object holds its data. We want to write a send channel that the
// other side can use to retrieve that data.
if (mSendChannel == null) {
- mSendChannel = new SendChannel();
+ mSendChannel = new SendChannel(this);
}
out.writeStrongBinder(mSendChannel);
} else {
diff --git a/core/java/android/bluetooth/IBluetoothGatt.aidl b/core/java/android/bluetooth/IBluetoothGatt.aidl
index 72abeaf699c1..3660be7c8eb5 100644
--- a/core/java/android/bluetooth/IBluetoothGatt.aidl
+++ b/core/java/android/bluetooth/IBluetoothGatt.aidl
@@ -36,7 +36,7 @@ interface IBluetoothGatt {
void startScan(in int appIf, in boolean isServer, in ScanSettings settings,
in List<ScanFilter> filters,
- in List scanStorages);
+ in List scanStorages, in String callingPackage);
void stopScan(in int appIf, in boolean isServer);
void flushPendingBatchResults(in int appIf, in boolean isServer);
void startMultiAdvertising(in int appIf,
diff --git a/core/java/android/bluetooth/le/BluetoothLeScanner.java b/core/java/android/bluetooth/le/BluetoothLeScanner.java
index 2e6c4f03d8b2..e09ab5676de7 100644
--- a/core/java/android/bluetooth/le/BluetoothLeScanner.java
+++ b/core/java/android/bluetooth/le/BluetoothLeScanner.java
@@ -19,6 +19,7 @@ package android.bluetooth.le;
import android.Manifest;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
+import android.app.ActivityThread;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallbackWrapper;
@@ -313,7 +314,7 @@ public final class BluetoothLeScanner {
mClientIf = clientIf;
try {
mBluetoothGatt.startScan(mClientIf, false, mSettings, mFilters,
- mResultStorages);
+ mResultStorages, ActivityThread.currentOpPackageName());
} catch (RemoteException e) {
Log.e(TAG, "fail to start le scan: " + e);
mClientIf = -1;
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 2b83d86ce9f8..103ee2910245 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -506,4 +506,6 @@ interface IPackageManager {
int getMountExternalMode(int uid);
void grantDefaultPermissionsToEnabledCarrierApps(in String[] packageNames, int userId);
+
+ boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId);
}
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 62c2e8cd33aa..6533bbcc6299 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -2398,7 +2398,7 @@ public abstract class PackageManager {
* Check whether a particular package has been granted a particular
* permission.
*
- * @param permName The name of the permission you are checking for,
+ * @param permName The name of the permission you are checking for.
* @param pkgName The name of the package you are checking against.
*
* @return If the package has the permission, PERMISSION_GRANTED is
@@ -2412,6 +2412,21 @@ public abstract class PackageManager {
public abstract int checkPermission(String permName, String pkgName);
/**
+ * Checks whether a particular permissions has been revoked for a
+ * package by policy. Typically the device owner or the profile owner
+ * may apply such a policy. The user cannot grant policy revoked
+ * permissions, hence the only way for an app to get such a permission
+ * is by a policy change.
+ *
+ * @param permName The name of the permission you are checking for.
+ * @param pkgName The name of the package you are checking against.
+ *
+ * @return Whether the permission is restricted by policy.
+ */
+ @CheckResult
+ public abstract boolean isPermissionRevokedByPolicy(String permName, String pkgName);
+
+ /**
* Add a new dynamic permission to the system. For this to work, your
* package must have defined a permission tree through the
* {@link android.R.styleable#AndroidManifestPermissionTree
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 48ffb9866232..ed7a2a3ea30d 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -2835,7 +2835,6 @@ public class PackageParser {
if (!aii.hasAction(Intent.ACTION_DEFAULT)) continue;
if (aii.hasDataScheme(IntentFilter.SCHEME_HTTP) ||
aii.hasDataScheme(IntentFilter.SCHEME_HTTPS)) {
- Slog.d(TAG, "hasDomainURLs:true for package:" + pkg.packageName);
return true;
}
}
diff --git a/core/java/android/hardware/camera2/CameraCaptureSession.java b/core/java/android/hardware/camera2/CameraCaptureSession.java
index 62ebfb36f3a6..46cafadd2bdd 100644
--- a/core/java/android/hardware/camera2/CameraCaptureSession.java
+++ b/core/java/android/hardware/camera2/CameraCaptureSession.java
@@ -482,17 +482,6 @@ public abstract class CameraCaptureSession implements AutoCloseable {
public abstract boolean isReprocessable();
/**
- * Return if this capture session is constrained high speed session that is created by
- * {@link CameraDevice#createConstrainedHighSpeedCaptureSession}.
- *
- * @return {@code true} if this session is constrained high speed capture session,
- * {@code false} otherwise.
- *
- * @see CameraDevice#createConstrainedHighSpeedCaptureSession
- */
- public abstract boolean isConstrainedHighSpeed();
-
- /**
* Get the input Surface associated with a reprocessable capture session.
*
* <p>Each reprocessable capture session has an input {@link Surface} where the reprocess
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index 547cce4b7e32..30aa2d5e9a9f 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -664,7 +664,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* the max possible number of frames the camera device will group together for this high
* speed stream configuration. This max batch size will be used to generate a high speed
* recording request list by
- * {@link android.hardware.camera2.CameraDevice#createConstrainedHighSpeedRequestList }.
+ * {@link android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList }.
* The max batch size for each configuration will satisfy below conditions:</p>
* <ul>
* <li>Each max batch size will be a divisor of its corresponding fps_max / 30. For example,
diff --git a/core/java/android/hardware/camera2/CameraConstrainedHighSpeedCaptureSession.java b/core/java/android/hardware/camera2/CameraConstrainedHighSpeedCaptureSession.java
new file mode 100644
index 000000000000..07d2443ffacb
--- /dev/null
+++ b/core/java/android/hardware/camera2/CameraConstrainedHighSpeedCaptureSession.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.camera2;
+
+import android.annotation.NonNull;
+import android.hardware.camera2.params.StreamConfigurationMap;
+
+import java.util.List;
+
+/**
+ * A constrained high speed capture session for a {@link CameraDevice}, used for capturing high
+ * speed images from the {@link CameraDevice} for high speed video recording use case.
+ * <p>
+ * A CameraHighSpeedCaptureSession is created by providing a set of target output surfaces to
+ * {@link CameraDevice#createConstrainedHighSpeedCaptureSession}, Once created, the session is
+ * active until a new session is created by the camera device, or the camera device is closed.
+ * </p>
+ * <p>
+ * An active high speed capture session is a specialized capture session that is only targeted at
+ * high speed video recording (>=120fps) use case if the camera device supports high speed video
+ * capability (i.e., {@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES} contains
+ * {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO}). It only
+ * accepts request lists created via {@link #createHighSpeedRequestList}, and the request list can
+ * only be submitted to this session via {@link CameraCaptureSession#captureBurst captureBurst}, or
+ * {@link CameraCaptureSession#setRepeatingBurst setRepeatingBurst}. See
+ * {@link CameraDevice#createConstrainedHighSpeedCaptureSession} for more details of the
+ * limitations.
+ * </p>
+ * <p>
+ * Creating a session is an expensive operation and can take several hundred milliseconds, since it
+ * requires configuring the camera device's internal pipelines and allocating memory buffers for
+ * sending images to the desired targets. Therefore the setup is done asynchronously, and
+ * {@link CameraDevice#createConstrainedHighSpeedCaptureSession} will send the ready-to-use
+ * CameraCaptureSession to the provided listener's
+ * {@link CameraCaptureSession.StateCallback#onConfigured} callback. If configuration cannot be
+ * completed, then the {@link CameraCaptureSession.StateCallback#onConfigureFailed} is called, and
+ * the session will not become active.
+ * </p>
+ * <!--
+ * <p>
+ * Any capture requests (repeating or non-repeating) submitted before the session is ready will be
+ * queued up and will begin capture once the session becomes ready. In case the session cannot be
+ * configured and {@link CameraCaptureSession.StateCallback#onConfigureFailed onConfigureFailed} is
+ * called, all queued capture requests are discarded. </p>
+ * -->
+ * <p>
+ * If a new session is created by the camera device, then the previous session is closed, and its
+ * associated {@link CameraCaptureSession.StateCallback#onClosed onClosed} callback will be
+ * invoked. All of the session methods will throw an IllegalStateException if called once the
+ * session is closed.
+ * </p>
+ * <p>
+ * A closed session clears any repeating requests (as if {@link #stopRepeating} had been called),
+ * but will still complete all of its in-progress capture requests as normal, before a newly created
+ * session takes over and reconfigures the camera device.
+ * </p>
+ */
+public abstract class CameraConstrainedHighSpeedCaptureSession extends CameraCaptureSession {
+
+ /**
+ * <p>Create a unmodifiable list of requests that is suitable for constrained high speed capture
+ * session streaming.</p>
+ *
+ * <p>High speed video streaming creates significant performance pressure on the camera device,
+ * so to achieve efficient high speed streaming, the camera device may have to aggregate
+ * multiple frames together. This means requests must be sent in batched groups, with all
+ * requests sharing the same settings. This method takes the list of output target
+ * Surfaces (subject to the output Surface requirements specified by the constrained high speed
+ * session) and a {@link CaptureRequest request}, and generates a request list that has the same
+ * controls for each request. The input {@link CaptureRequest request} must contain the target
+ * output Surfaces and target high speed FPS range that is one of the
+ * {@link StreamConfigurationMap#getHighSpeedVideoFpsRangesFor} for the Surface size.</p>
+ *
+ * <p>If both preview and recording Surfaces are specified in the {@code request}, the
+ * {@link CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE target FPS range} in the input
+ * {@link CaptureRequest request} must be a fixed frame rate FPS range, where the
+ * {@link android.util.Range#getLower minimal FPS} ==
+ * {@link android.util.Range#getUpper() maximum FPS}. The created request list will contain
+ * a interleaved request pattern such that the preview output FPS is at least 30fps, the
+ * recording output FPS is {@link android.util.Range#getUpper() maximum FPS} of the requested
+ * FPS range. The application can submit this request list directly to an active high speed
+ * capture session to achieve high speed video recording. When only preview or recording
+ * Surface is specified, this method will return a list of request that have the same controls
+ * and output targets for all requests.</p>
+ *
+ * <p>Submitting a request list created by this method to a normal capture session will result
+ * in an {@link IllegalArgumentException} if the high speed
+ * {@link CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE FPS range} is not supported by
+ * {@link CameraCharacteristics#CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES}.</p>
+ *
+ * @param request The high speed capture request that will be used to generate the high speed
+ * request list.
+ * @return A unmodifiable CaptureRequest list that is suitable for constrained high speed
+ * capture.
+ *
+ * @throws IllegalArgumentException if the set of output Surfaces in the request do not meet the
+ * high speed video capability requirements, or the camera
+ * device doesn't support high speed video capability, or the
+ * request doesn't meet the high speed video capability
+ * requirements, or the request doesn't contain the required
+ * controls for high speed capture.
+ * @throws CameraAccessException if the camera device is no longer connected or has
+ * encountered a fatal error
+ * @throws IllegalStateException if the camera device has been closed
+ *
+ * @see CameraDevice#createConstrainedHighSpeedCaptureSession
+ * @see CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE
+ * @see android.hardware.camera2.params.StreamConfigurationMap#getHighSpeedVideoSizes
+ * @see android.hardware.camera2.params.StreamConfigurationMap#getHighSpeedVideoFpsRangesFor
+ * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
+ * @see CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO
+ */
+ @NonNull
+ public abstract List<CaptureRequest> createHighSpeedRequestList(
+ @NonNull CaptureRequest request) throws CameraAccessException;
+
+}
diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java
index 639c8b10a78a..4a71aa067639 100644
--- a/core/java/android/hardware/camera2/CameraDevice.java
+++ b/core/java/android/hardware/camera2/CameraDevice.java
@@ -613,8 +613,9 @@ public abstract class CameraDevice implements AutoCloseable {
* When multiple Surfaces are configured, their size must be same.</li>
*
* <li>An active high speed capture session only accepts request lists created via
- * {@link #createConstrainedHighSpeedRequestList}, and the request list can only be submitted
- * to this session via {@link CameraCaptureSession#captureBurst captureBurst}, or
+ * {@link CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList}, and the
+ * request list can only be submitted to this session via
+ * {@link CameraCaptureSession#captureBurst captureBurst}, or
* {@link CameraCaptureSession#setRepeatingBurst setRepeatingBurst}.</li>
*
* <li>The FPS ranges being requested to this session must be selected from
@@ -661,71 +662,13 @@ public abstract class CameraDevice implements AutoCloseable {
* @see CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO
* @see CameraCaptureSession#captureBurst
* @see CameraCaptureSession#setRepeatingBurst
- * @see #createConstrainedHighSpeedRequestList
+ * @see CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList
*/
public abstract void createConstrainedHighSpeedCaptureSession(@NonNull List<Surface> outputs,
@NonNull CameraCaptureSession.StateCallback callback,
@Nullable Handler handler)
throws CameraAccessException;
-
- /**
- * <p>Create a unmodifiable list of requests that is suitable for constrained high speed capture
- * session streaming.</p>
- *
- * <p>High speed video streaming creates significant performance pressue on the camera device,
- * so to achieve efficient high speed streaming, the camera device may have to aggregate
- * multiple frames together. This means requests must be sent in batched groups, with all
- * requests sharing the same settings. This method takes the list of output target
- * Surfaces (subject to the output Surface requirements specified by the contrained high speed
- * session) and a {@link CaptureRequest request}, and generates a request list that has the same
- * controls for each request. The input {@link CaptureRequest request} must contain the target
- * output Surfaces and target high speed FPS range that is one of the
- * {@link StreamConfigurationMap#getHighSpeedVideoFpsRangesFor} for the Surface size.</p>
- *
- * <p>If both preview and recording Surfaces are specified in the {@code request}, the
- * {@link CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE target FPS range} in the input
- * {@link CaptureRequest request} must be a fixed framerate FPS range, where the
- * {@link android.util.Range#getLower minimal FPS} ==
- * {@link android.util.Range#getUpper() maximum FPS}. The created request list will contain
- * a interleaved request pattern such that the preview output FPS is at least 30fps, the
- * recording output FPS is {@link android.util.Range#getUpper() maximum FPS} of the requested
- * FPS range. The application can submit this request list directly to an active high speed
- * capture session to achieve high speed video recording. When only preview or recording
- * Surface is specified, this method will return a list of request that have the same controls
- * and output targets for all requests.</p>
- *
- * <p>Submitting a request list created by this method to a normal capture session will result
- * in an {@link IllegalArgumentException} if the high speed
- * {@link CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE FPS range} is not supported by
- * {@link CameraCharacteristics#CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES}.</p>
- *
- * @param request The high speed capture request that will be used to generate the high speed
- * request list.
- * @return A unmodifiable CaptureRequest list that is suitable for constrained high speed
- * capture.
- *
- * @throws IllegalArgumentException if the set of output Surfaces in the request do not meet the
- * high speed video capability requirements, or the camera
- * device doesn't support high speed video capability, or the
- * request doesn't meet the high speed video capability
- * requirements, or the request doesn't contain the required
- * controls for high speed capture.
- * @throws CameraAccessException if the camera device is no longer connected or has
- * encountered a fatal error
- * @throws IllegalStateException if the camera device has been closed
- *
- * @see #createConstrainedHighSpeedCaptureSession
- * @see CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE
- * @see StreamConfigurationMap#getHighSpeedVideoSizes
- * @see StreamConfigurationMap#getHighSpeedVideoFpsRangesFor
- * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
- * @see CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO
- */
- @NonNull
- public abstract List<CaptureRequest> createConstrainedHighSpeedRequestList(
- @NonNull CaptureRequest request)throws CameraAccessException;
-
/**
* <p>Create a {@link CaptureRequest.Builder} for new capture requests,
* initialized with template for a target use case. The settings are chosen
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java
index 0aa6447e7470..c36683bfb9c1 100644
--- a/core/java/android/hardware/camera2/CameraMetadata.java
+++ b/core/java/android/hardware/camera2/CameraMetadata.java
@@ -655,8 +655,8 @@ public abstract class CameraMetadata<TKey> {
* <p>The device supports constrained high speed video recording (frame rate &gt;=120fps)
* use case. The camera device will support high speed capture session created by
* {@link android.hardware.camera2.CameraDevice#createConstrainedHighSpeedCaptureSession }, which
- * only accepts high speed request list created by
- * {@link android.hardware.camera2.CameraDevice#createConstrainedHighSpeedRequestList }.</p>
+ * only accepts high speed request lists created by
+ * {@link android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList }.</p>
* <p>A camera device can still support high speed video streaming by advertising the high speed
* FPS ranges in {@link CameraCharacteristics#CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES android.control.aeAvailableTargetFpsRanges}. For this case, all normal
* capture request per frame control and synchronization requirements will apply to
@@ -717,9 +717,9 @@ public abstract class CameraMetadata<TKey> {
* <li>The FPS ranges are selected from
* {@link android.hardware.camera2.params.StreamConfigurationMap#getHighSpeedVideoFpsRanges }.</li>
* </ul>
- * <p>When above conditions are NOT satistied, the
+ * <p>When above conditions are NOT satistied,
* {@link android.hardware.camera2.CameraDevice#createConstrainedHighSpeedCaptureSession }
- * and {@link android.hardware.camera2.CameraDevice#createConstrainedHighSpeedRequestList } will fail.</p>
+ * will fail.</p>
* <p>Switching to a FPS range that has different maximum FPS may trigger some camera device
* reconfigurations, which may introduce extra latency. It is recommended that
* the application avoids unnecessary maximum target FPS changes as much as possible
@@ -1813,9 +1813,8 @@ public abstract class CameraMetadata<TKey> {
public static final int CONTROL_SCENE_MODE_BARCODE = 16;
/**
- * <p>This is deprecated, please use
- * {@link android.hardware.camera2.CameraDevice#createConstrainedHighSpeedCaptureSession }
- * and {@link android.hardware.camera2.CameraDevice#createConstrainedHighSpeedRequestList }
+ * <p>This is deprecated, please use {@link android.hardware.camera2.CameraDevice#createConstrainedHighSpeedCaptureSession }
+ * and {@link android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList }
* for high speed video recording.</p>
* <p>Optimized for high speed video recording (frame rate &gt;=60fps) use case.</p>
* <p>The supported high speed video sizes and fps ranges are specified in
@@ -1936,21 +1935,21 @@ public abstract class CameraMetadata<TKey> {
/**
* <p>Same as FACE_PRIORITY scene mode, except that the camera
- * device will choose higher sensivity values ({@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity})
+ * device will choose higher sensitivity values ({@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity})
* under low light conditions.</p>
* <p>The camera device may be tuned to expose the images in a reduced
* sensitivity range to produce the best quality images. For example,
* if the {@link CameraCharacteristics#SENSOR_INFO_SENSITIVITY_RANGE android.sensor.info.sensitivityRange} gives range of [100, 1600],
* the camera device auto-exposure routine tuning process may limit the actual
- * exposure sensivity range to [100, 1200] to ensure that the noise level isn't
- * exessive to compromise the image quality. Under this situation, the image under
+ * exposure sensitivity range to [100, 1200] to ensure that the noise level isn't
+ * exessive in order to preserve the image quality. Under this situation, the image under
* low light may be under-exposed when the sensor max exposure time (bounded by the
* {@link CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE android.control.aeTargetFpsRange} when {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} is one of the
- * ON_* modes) and effecitve max sensitivity are reached. This scene mode allows the
+ * ON_* modes) and effective max sensitivity are reached. This scene mode allows the
* camera device auto-exposure routine to increase the sensitivity up to the max
* sensitivity specified by {@link CameraCharacteristics#SENSOR_INFO_SENSITIVITY_RANGE android.sensor.info.sensitivityRange} when the scene is too
* dark and the max exposure time is reached. The captured images may be noisier
- * compared with the images captured in normal FACE_PRIORITY mode, therefore, it is
+ * compared with the images captured in normal FACE_PRIORITY mode; therefore, it is
* recommended that the application only use this scene mode when it is capable of
* reducing the noise level of the captured images.</p>
* <p>Unlike the other scene modes, {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode},
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index 6d8cc54a1adf..a136d0ff4903 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -184,7 +184,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
private final CameraMetadataNative mSettings;
private boolean mIsReprocess;
// If this request is part of constrained high speed request list that was created by
- // {@link CameraDevice#createConstrainedHighSpeedRequestList}.
+ // {@link android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList}
private boolean mIsPartOfCHSRequestList = false;
// Each reprocess request must be tied to a reprocessable session ID.
// Valid only for reprocess requests (mIsReprocess == true).
@@ -340,14 +340,14 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
/**
* <p>Determine if this request is part of a constrained high speed request list that was
- * created by {@link CameraDevice#createConstrainedHighSpeedRequestList}. A constrained high
- * speed request list contains some constrained high speed capture requests with certain
- * interleaved pattern that is suitable for high speed preview/video streaming. An active
- * constrained high speed capture session only accepts constrained high speed request lists.
- * This method can be used to do the sanity check when a constrained high speed capture session
- * receives a request list via {@link CameraCaptureSession#setRepeatingBurst} or
- * {@link CameraCaptureSession#captureBurst}.
- * </p>
+ * created by
+ * {@link android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList}.
+ * A constrained high speed request list contains some constrained high speed capture requests
+ * with certain interleaved pattern that is suitable for high speed preview/video streaming. An
+ * active constrained high speed capture session only accepts constrained high speed request
+ * lists. This method can be used to do the sanity check when a constrained high speed capture
+ * session receives a request list via {@link CameraCaptureSession#setRepeatingBurst} or
+ * {@link CameraCaptureSession#captureBurst}. </p>
*
*
* @return {@code true} if this request is part of a constrained high speed request list,
@@ -595,9 +595,10 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
/**
* <p>Mark this request as part of a constrained high speed request list created by
- * {@link CameraDevice#createConstrainedHighSpeedRequestList}. A constrained high speed
- * request list contains some constrained high speed capture requests with certain
- * interleaved pattern that is suitable for high speed preview/video streaming.</p>
+ * {@link android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList}.
+ * A constrained high speed request list contains some constrained high speed capture
+ * requests with certain interleaved pattern that is suitable for high speed preview/video
+ * streaming.</p>
*
* @hide
*/
diff --git a/core/java/android/hardware/camera2/impl/CameraCaptureSessionCore.java b/core/java/android/hardware/camera2/impl/CameraCaptureSessionCore.java
new file mode 100644
index 000000000000..116f0f1724b5
--- /dev/null
+++ b/core/java/android/hardware/camera2/impl/CameraCaptureSessionCore.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.camera2.impl;
+
+/**
+ * Internal interface for CameraDeviceImpl to CameraCaptureSessionImpl(s) communication
+ */
+public interface CameraCaptureSessionCore {
+
+ /**
+ * Replace this session with another session.
+ *
+ * <p>This is an optimization to avoid unconfiguring and then immediately having to
+ * reconfigure again.</p>
+ *
+ * <p>The semantics are identical to {@link #close}, except that unconfiguring will be skipped.
+ * </p>
+ *
+ * <p>After this call completes, the session will not call any further methods on the camera
+ * device.</p>
+ *
+ * @see CameraCaptureSession#close
+ */
+ void replaceSessionClose();
+
+ /**
+ *
+ * Create an internal state callback, to be invoked on the mDeviceHandler
+ *
+ * <p>It has a few behaviors:
+ * <ul>
+ * <li>Convert device state changes into session state changes.
+ * <li>Keep track of async tasks that the session began (idle, abort).
+ * </ul>
+ * </p>
+ * */
+ CameraDeviceImpl.StateCallbackKK getDeviceStateCallback();
+
+ /**
+ * Whether currently in mid-abort.
+ *
+ * <p>This is used by the implementation to set the capture failure
+ * reason, in lieu of more accurate error codes from the camera service.
+ * Unsynchronized to avoid deadlocks between simultaneous session->device,
+ * device->session calls.</p>
+ *
+ */
+ boolean isAborting();
+
+}
diff --git a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
index 3d261dd91d9d..3c19cd202fe2 100644
--- a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
@@ -36,7 +36,8 @@ import java.util.List;
import static android.hardware.camera2.impl.CameraDeviceImpl.checkHandler;
import static com.android.internal.util.Preconditions.*;
-public class CameraCaptureSessionImpl extends CameraCaptureSession {
+public class CameraCaptureSessionImpl extends CameraCaptureSession
+ implements CameraCaptureSessionCore {
private static final String TAG = "CameraCaptureSession";
private static final boolean DEBUG = false;
@@ -60,7 +61,6 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession {
private final android.hardware.camera2.impl.CameraDeviceImpl mDeviceImpl;
/** Internal handler; used for all incoming events to preserve total order */
private final Handler mDeviceHandler;
- private final boolean mIsConstrainedHighSpeedSession;
/** Drain Sequence IDs which have been queued but not yet finished with aborted/completed */
private final TaskDrainer<Integer> mSequenceDrainer;
@@ -89,14 +89,13 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession {
CameraCaptureSessionImpl(int id, Surface input, List<Surface> outputs,
CameraCaptureSession.StateCallback callback, Handler stateHandler,
android.hardware.camera2.impl.CameraDeviceImpl deviceImpl,
- Handler deviceStateHandler, boolean configureSuccess, boolean isConstrainedHighSpeed) {
+ Handler deviceStateHandler, boolean configureSuccess) {
if (outputs == null || outputs.isEmpty()) {
throw new IllegalArgumentException("outputs must be a non-null, non-empty list");
} else if (callback == null) {
throw new IllegalArgumentException("callback must not be null");
}
- mIsConstrainedHighSpeedSession = isConstrainedHighSpeed;
mId = id;
mIdString = String.format("Session %d: ", mId);
@@ -136,30 +135,6 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession {
}
}
-
- private boolean isConstrainedHighSpeedRequestList(List<CaptureRequest> requestList) {
- checkCollectionNotEmpty(requestList, "High speed request list");
- for (CaptureRequest request : requestList) {
- if (!request.isPartOfCRequestList()) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * If the session is constrained high speed session, it only accept constrained high speed
- * request list.
- */
- private void checkConstrainedHighSpeedRequestSanity(List<CaptureRequest> requestList) {
- if (mIsConstrainedHighSpeedSession) {
- if (!isConstrainedHighSpeedRequestList(requestList)) {
- throw new IllegalArgumentException("It is only allowed to submit a constrained "
- + "high speed request list to a constrained high speed session!!!");
- }
- }
- }
-
@Override
public CameraDevice getDevice() {
return mDeviceImpl;
@@ -181,10 +156,6 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession {
} else if (request.isReprocess() && request.getReprocessableSessionId() != mId) {
throw new IllegalArgumentException("capture request was created for another session");
}
- if (mIsConstrainedHighSpeedSession) {
- throw new UnsupportedOperationException("Constrained high speed session doesn't support"
- + " this method");
- }
checkNotClosed();
@@ -208,8 +179,6 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession {
throw new IllegalArgumentException("Requests must have at least one element");
}
- checkConstrainedHighSpeedRequestSanity(requests);
-
for (CaptureRequest request : requests) {
if (request.isReprocess()) {
if (!isReprocessable()) {
@@ -244,10 +213,6 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession {
} else if (request.isReprocess()) {
throw new IllegalArgumentException("repeating reprocess requests are not supported");
}
- if (mIsConstrainedHighSpeedSession) {
- throw new UnsupportedOperationException("Constrained high speed session doesn't support"
- + " this method");
- }
checkNotClosed();
@@ -271,8 +236,6 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession {
throw new IllegalArgumentException("requests must have at least one element");
}
- checkConstrainedHighSpeedRequestSanity(requests);
-
for (CaptureRequest r : requests) {
if (r.isReprocess()) {
throw new IllegalArgumentException("repeating reprocess burst requests are not " +
@@ -349,7 +312,8 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession {
*
* @see CameraCaptureSession#close
*/
- synchronized void replaceSessionClose() {
+ @Override
+ public synchronized void replaceSessionClose() {
/*
* In order for creating new sessions to be fast, the new session should be created
* before the old session is closed.
@@ -431,9 +395,9 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession {
* Unsynchronized to avoid deadlocks between simultaneous session->device,
* device->session calls.</p>
*
- * <p>Package-private.</p>
*/
- boolean isAborting() {
+ @Override
+ public boolean isAborting() {
return mAborting;
}
@@ -521,7 +485,8 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession {
* </ul>
* </p>
* */
- CameraDeviceImpl.StateCallbackKK getDeviceStateCallback() {
+ @Override
+ public CameraDeviceImpl.StateCallbackKK getDeviceStateCallback() {
final CameraCaptureSession session = this;
return new CameraDeviceImpl.StateCallbackKK() {
@@ -759,9 +724,4 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession {
}
}
- @Override
- public boolean isConstrainedHighSpeed() {
- return mIsConstrainedHighSpeedSession;
- }
-
}
diff --git a/core/java/android/hardware/camera2/impl/CameraConstrainedHighSpeedCaptureSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraConstrainedHighSpeedCaptureSessionImpl.java
new file mode 100644
index 000000000000..d732535af7d9
--- /dev/null
+++ b/core/java/android/hardware/camera2/impl/CameraConstrainedHighSpeedCaptureSessionImpl.java
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.hardware.camera2.impl;
+
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraCaptureSession;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.params.StreamConfigurationMap;
+import android.hardware.camera2.utils.SurfaceUtils;
+import android.os.Handler;
+import android.util.Range;
+import android.view.Surface;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import static com.android.internal.util.Preconditions.*;
+
+/**
+ * Standard implementation of CameraConstrainedHighSpeedCaptureSession.
+ *
+ * <p>
+ * Mostly just forwards calls to an instance of CameraCaptureSessionImpl,
+ * but implements the few necessary behavior changes and additional methods required
+ * for the constrained high speed speed mode.
+ * </p>
+ */
+
+public class CameraConstrainedHighSpeedCaptureSessionImpl
+ extends CameraConstrainedHighSpeedCaptureSession implements CameraCaptureSessionCore {
+ private final CameraCharacteristics mCharacteristics;
+ private final CameraCaptureSessionImpl mSessionImpl;
+
+ /**
+ * Create a new CameraCaptureSession.
+ *
+ * <p>The camera device must already be in the {@code IDLE} state when this is invoked.
+ * There must be no pending actions
+ * (e.g. no pending captures, no repeating requests, no flush).</p>
+ */
+ CameraConstrainedHighSpeedCaptureSessionImpl(int id, List<Surface> outputs,
+ CameraCaptureSession.StateCallback callback, Handler stateHandler,
+ android.hardware.camera2.impl.CameraDeviceImpl deviceImpl,
+ Handler deviceStateHandler, boolean configureSuccess,
+ CameraCharacteristics characteristics) {
+ mCharacteristics = characteristics;
+ CameraCaptureSession.StateCallback wrapperCallback = new WrapperCallback(callback);
+ mSessionImpl = new CameraCaptureSessionImpl(id, /*input*/null, outputs, wrapperCallback,
+ stateHandler, deviceImpl, deviceStateHandler, configureSuccess);
+ }
+
+ @Override
+ public List<CaptureRequest> createHighSpeedRequestList(CaptureRequest request)
+ throws CameraAccessException {
+ if (request == null) {
+ throw new IllegalArgumentException("Input capture request must not be null");
+ }
+ Collection<Surface> outputSurfaces = request.getTargets();
+ Range<Integer> fpsRange = request.get(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE);
+
+ StreamConfigurationMap config =
+ mCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+ SurfaceUtils.checkConstrainedHighSpeedSurfaces(outputSurfaces, fpsRange, config);
+
+ // Request list size: to limit the preview to 30fps, need use maxFps/30; to maximize
+ // the preview frame rate, should use maxBatch size for that high speed stream
+ // configuration. We choose the former for now.
+ int requestListSize = fpsRange.getUpper() / 30;
+ List<CaptureRequest> requestList = new ArrayList<CaptureRequest>();
+
+ // Prepare the Request builders: need carry over the request controls.
+ // First, create a request builder that will only include preview or recording target.
+ CameraMetadataNative requestMetadata = new CameraMetadataNative(request.getNativeCopy());
+ // Note that after this step, the requestMetadata is mutated (swapped) and can not be used
+ // for next request builder creation.
+ CaptureRequest.Builder singleTargetRequestBuilder = new CaptureRequest.Builder(
+ requestMetadata, /*reprocess*/false, CameraCaptureSession.SESSION_ID_NONE);
+
+ // Overwrite the capture intent to make sure a good value is set.
+ Iterator<Surface> iterator = outputSurfaces.iterator();
+ Surface firstSurface = iterator.next();
+ Surface secondSurface = null;
+ if (outputSurfaces.size() == 1 && SurfaceUtils.isSurfaceForHwVideoEncoder(firstSurface)) {
+ singleTargetRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT,
+ CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW);
+ } else {
+ // Video only, or preview + video
+ singleTargetRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT,
+ CaptureRequest.CONTROL_CAPTURE_INTENT_VIDEO_RECORD);
+ }
+ singleTargetRequestBuilder.setPartOfCHSRequestList(/*partOfCHSList*/true);
+
+ // Second, Create a request builder that will include both preview and recording targets.
+ CaptureRequest.Builder doubleTargetRequestBuilder = null;
+ if (outputSurfaces.size() == 2) {
+ // Have to create a new copy, the original one was mutated after a new
+ // CaptureRequest.Builder creation.
+ requestMetadata = new CameraMetadataNative(request.getNativeCopy());
+ doubleTargetRequestBuilder = new CaptureRequest.Builder(
+ requestMetadata, /*reprocess*/false, CameraCaptureSession.SESSION_ID_NONE);
+ doubleTargetRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT,
+ CaptureRequest.CONTROL_CAPTURE_INTENT_VIDEO_RECORD);
+ doubleTargetRequestBuilder.addTarget(firstSurface);
+ secondSurface = iterator.next();
+ doubleTargetRequestBuilder.addTarget(secondSurface);
+ doubleTargetRequestBuilder.setPartOfCHSRequestList(/*partOfCHSList*/true);
+ // Make sure singleTargetRequestBuilder contains only recording surface for
+ // preview + recording case.
+ Surface recordingSurface = firstSurface;
+ if (!SurfaceUtils.isSurfaceForHwVideoEncoder(recordingSurface)) {
+ recordingSurface = secondSurface;
+ }
+ singleTargetRequestBuilder.addTarget(recordingSurface);
+ } else {
+ // Single output case: either recording or preview.
+ singleTargetRequestBuilder.addTarget(firstSurface);
+ }
+
+ // Generate the final request list.
+ for (int i = 0; i < requestListSize; i++) {
+ if (i == 0 && doubleTargetRequestBuilder != null) {
+ // First request should be recording + preview request
+ requestList.add(doubleTargetRequestBuilder.build());
+ } else {
+ requestList.add(singleTargetRequestBuilder.build());
+ }
+ }
+
+ return Collections.unmodifiableList(requestList);
+ }
+
+ private boolean isConstrainedHighSpeedRequestList(List<CaptureRequest> requestList) {
+ checkCollectionNotEmpty(requestList, "High speed request list");
+ for (CaptureRequest request : requestList) {
+ if (!request.isPartOfCRequestList()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public CameraDevice getDevice() {
+ return mSessionImpl.getDevice();
+ }
+
+ @Override
+ public void prepare(Surface surface) throws CameraAccessException {
+ mSessionImpl.prepare(surface);
+ }
+
+ @Override
+ public int capture(CaptureRequest request, CaptureCallback listener, Handler handler)
+ throws CameraAccessException {
+ throw new UnsupportedOperationException("Constrained high speed session doesn't support"
+ + " this method");
+ }
+
+ @Override
+ public int captureBurst(List<CaptureRequest> requests, CaptureCallback listener,
+ Handler handler) throws CameraAccessException {
+ if (!isConstrainedHighSpeedRequestList(requests)) {
+ throw new IllegalArgumentException(
+ "Only request lists created by createHighSpeedRequestList() can be submitted to " +
+ "a constrained high speed capture session");
+ }
+ return mSessionImpl.captureBurst(requests, listener, handler);
+ }
+
+ @Override
+ public int setRepeatingRequest(CaptureRequest request, CaptureCallback listener,
+ Handler handler) throws CameraAccessException {
+ throw new UnsupportedOperationException("Constrained high speed session doesn't support"
+ + " this method");
+ }
+
+ @Override
+ public int setRepeatingBurst(List<CaptureRequest> requests, CaptureCallback listener,
+ Handler handler) throws CameraAccessException {
+ if (!isConstrainedHighSpeedRequestList(requests)) {
+ throw new IllegalArgumentException(
+ "Only request lists created by createHighSpeedRequestList() can be submitted to " +
+ "a constrained high speed capture session");
+ }
+ return mSessionImpl.setRepeatingBurst(requests, listener, handler);
+ }
+
+ @Override
+ public void stopRepeating() throws CameraAccessException {
+ mSessionImpl.stopRepeating();
+ }
+
+ @Override
+ public void abortCaptures() throws CameraAccessException {
+ mSessionImpl.abortCaptures();
+ }
+
+ @Override
+ public Surface getInputSurface() {
+ return null;
+ }
+
+ @Override
+ public void close() {
+ mSessionImpl.close();
+ }
+
+ @Override
+ public boolean isReprocessable() {
+ return false;
+ }
+
+ // Implementation of CameraCaptureSessionCore methods
+
+ @Override
+ public void replaceSessionClose() {
+ mSessionImpl.replaceSessionClose();
+ }
+
+ @Override
+ public CameraDeviceImpl.StateCallbackKK getDeviceStateCallback() {
+ return mSessionImpl.getDeviceStateCallback();
+ }
+
+ @Override
+ public boolean isAborting() {
+ return mSessionImpl.isAborting();
+ }
+
+ private class WrapperCallback extends StateCallback {
+ private final StateCallback mCallback;
+
+ public WrapperCallback(StateCallback callback) {
+ mCallback = callback;
+ }
+
+ public void onConfigured(CameraCaptureSession session) {
+ mCallback.onConfigured(CameraConstrainedHighSpeedCaptureSessionImpl.this);
+ }
+
+ public void onConfigureFailed(CameraCaptureSession session) {
+ mCallback.onConfigureFailed(CameraConstrainedHighSpeedCaptureSessionImpl.this);
+ }
+
+ public void onReady(CameraCaptureSession session) {
+ mCallback.onReady(CameraConstrainedHighSpeedCaptureSessionImpl.this);
+ }
+
+ public void onActive(CameraCaptureSession session) {
+ mCallback.onActive(CameraConstrainedHighSpeedCaptureSessionImpl.this);
+ }
+
+ public void onClosed(CameraCaptureSession session) {
+ mCallback.onClosed(CameraConstrainedHighSpeedCaptureSessionImpl.this);
+ }
+
+ public void onSurfacePrepared(CameraCaptureSession session, Surface surface) {
+ mCallback.onSurfacePrepared(CameraConstrainedHighSpeedCaptureSessionImpl.this,
+ surface);
+ }
+
+
+ }
+}
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index 83128c3cc96f..c594228509e6 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -113,7 +113,7 @@ public class CameraDeviceImpl extends CameraDevice {
*/
private final FrameNumberTracker mFrameNumberTracker = new FrameNumberTracker();
- private CameraCaptureSessionImpl mCurrentSession;
+ private CameraCaptureSessionCore mCurrentSession;
private int mNextSessionId = 0;
// Runnables for all state transitions, except error, which needs the
@@ -510,6 +510,26 @@ public class CameraDeviceImpl extends CameraDevice {
/*isConstrainedHighSpeed*/false);
}
+ @Override
+ public void createConstrainedHighSpeedCaptureSession(List<Surface> outputs,
+ android.hardware.camera2.CameraCaptureSession.StateCallback callback, Handler handler)
+ throws CameraAccessException {
+ if (outputs == null || outputs.size() == 0 || outputs.size() > 2) {
+ throw new IllegalArgumentException(
+ "Output surface list must not be null and the size must be no more than 2");
+ }
+ StreamConfigurationMap config =
+ getCharacteristics().get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+ SurfaceUtils.checkConstrainedHighSpeedSurfaces(outputs, /*fpsRange*/null, config);
+
+ List<OutputConfiguration> outConfigurations = new ArrayList<>(outputs.size());
+ for (Surface surface : outputs) {
+ outConfigurations.add(new OutputConfiguration(surface));
+ }
+ createCaptureSessionInternal(null, outConfigurations, callback, handler,
+ /*isConstrainedHighSpeed*/true);
+ }
+
private void createCaptureSessionInternal(InputConfiguration inputConfig,
List<OutputConfiguration> outputConfigurations,
CameraCaptureSession.StateCallback callback, Handler handler,
@@ -565,10 +585,16 @@ public class CameraDeviceImpl extends CameraDevice {
outSurfaces.add(config.getSurface());
}
// Fire onConfigured if configureOutputs succeeded, fire onConfigureFailed otherwise.
- CameraCaptureSessionImpl newSession =
- new CameraCaptureSessionImpl(mNextSessionId++, input,
- outSurfaces, callback, handler, this, mDeviceHandler,
- configureSuccess, isConstrainedHighSpeed);
+ CameraCaptureSessionCore newSession = null;
+ if (isConstrainedHighSpeed) {
+ newSession = new CameraConstrainedHighSpeedCaptureSessionImpl(mNextSessionId++,
+ outSurfaces, callback, handler, this, mDeviceHandler, configureSuccess,
+ mCharacteristics);
+ } else {
+ newSession = new CameraCaptureSessionImpl(mNextSessionId++, input,
+ outSurfaces, callback, handler, this, mDeviceHandler,
+ configureSuccess);
+ }
// TODO: wait until current session closes, then create the new session
mCurrentSession = newSession;
@@ -1933,181 +1959,4 @@ public class CameraDeviceImpl extends CameraDevice {
return mCharacteristics;
}
- /**
- * A high speed output surface can only be preview or hardware encoder surface.
- *
- * @param surface The high speed output surface to be checked.
- */
- private void checkHighSpeedSurfaceFormat(Surface surface) {
- // TODO: remove this override since the default format should be
- // ImageFormat.PRIVATE. b/9487482
- final int HAL_FORMAT_RGB_START = 1; // HAL_PIXEL_FORMAT_RGBA_8888 from graphics.h
- final int HAL_FORMAT_RGB_END = 5; // HAL_PIXEL_FORMAT_BGRA_8888 from graphics.h
- int surfaceFormat = SurfaceUtils.getSurfaceFormat(surface);
- if (surfaceFormat >= HAL_FORMAT_RGB_START &&
- surfaceFormat <= HAL_FORMAT_RGB_END) {
- surfaceFormat = ImageFormat.PRIVATE;
- }
-
- if (surfaceFormat != ImageFormat.PRIVATE) {
- throw new IllegalArgumentException("Surface format(" + surfaceFormat + ") is not"
- + " for preview or hardware video encoding!");
- }
- }
-
- private void checkConstrainedHighSpeedSurfaces(Collection<Surface> surfaces,
- Range<Integer> fpsRange) {
- if (surfaces == null || surfaces.size() == 0 || surfaces.size() > 2) {
- throw new IllegalArgumentException("Output target surface list must not be null and"
- + " the size must be 1 or 2");
- }
-
- StreamConfigurationMap config =
- getCharacteristics().get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
- List<Size> highSpeedSizes = null;
- if (fpsRange == null) {
- highSpeedSizes = Arrays.asList(config.getHighSpeedVideoSizes());
- } else {
- // Check the FPS range first if provided
- Range<Integer>[] highSpeedFpsRanges = config.getHighSpeedVideoFpsRanges();
- if(!Arrays.asList(highSpeedFpsRanges).contains(fpsRange)) {
- throw new IllegalArgumentException("Fps range " + fpsRange.toString() + " in the"
- + " request is not a supported high speed fps range " +
- Arrays.toString(highSpeedFpsRanges));
- }
- highSpeedSizes = Arrays.asList(config.getHighSpeedVideoSizesFor(fpsRange));
- }
-
- for (Surface surface : surfaces) {
- checkHighSpeedSurfaceFormat(surface);
-
- // Surface size must be supported high speed sizes.
- Size surfaceSize = SurfaceUtils.getSurfaceSize(surface);
- if (!highSpeedSizes.contains(surfaceSize)) {
- throw new IllegalArgumentException("Surface size " + surfaceSize.toString() + " is"
- + " not part of the high speed supported size list " +
- Arrays.toString(highSpeedSizes.toArray()));
- }
- // Each output surface must be either preview surface or recording surface.
- if (!SurfaceUtils.isSurfaceForPreview(surface) &&
- !SurfaceUtils.isSurfaceForHwVideoEncoder(surface)) {
- throw new IllegalArgumentException("This output surface is neither preview nor "
- + "hardware video encoding surface");
- }
- if (SurfaceUtils.isSurfaceForPreview(surface) &&
- SurfaceUtils.isSurfaceForHwVideoEncoder(surface)) {
- throw new IllegalArgumentException("This output surface can not be both preview"
- + " and hardware video encoding surface");
- }
- }
-
- // For 2 output surface case, they shouldn't be same type.
- if (surfaces.size() == 2) {
- // Up to here, each surface can only be either preview or recording.
- Iterator<Surface> iterator = surfaces.iterator();
- boolean isFirstSurfacePreview =
- SurfaceUtils.isSurfaceForPreview(iterator.next());
- boolean isSecondSurfacePreview =
- SurfaceUtils.isSurfaceForPreview(iterator.next());
- if (isFirstSurfacePreview == isSecondSurfacePreview) {
- throw new IllegalArgumentException("The 2 output surfaces must have different"
- + " type");
- }
- }
- }
-
- @Override
- public void createConstrainedHighSpeedCaptureSession(List<Surface> outputs,
- android.hardware.camera2.CameraCaptureSession.StateCallback callback, Handler handler)
- throws CameraAccessException {
- if (outputs == null || outputs.size() == 0 || outputs.size() > 2) {
- throw new IllegalArgumentException(
- "Output surface list must not be null and the size must be no more than 2");
- }
- checkConstrainedHighSpeedSurfaces(outputs, /*fpsRange*/null);
-
- List<OutputConfiguration> outConfigurations = new ArrayList<>(outputs.size());
- for (Surface surface : outputs) {
- outConfigurations.add(new OutputConfiguration(surface));
- }
- createCaptureSessionInternal(null, outConfigurations, callback, handler,
- /*isConstrainedHighSpeed*/true);
- }
-
- @Override
- public List<CaptureRequest> createConstrainedHighSpeedRequestList(CaptureRequest request)
- throws CameraAccessException {
- if (request == null) {
- throw new IllegalArgumentException("Input capture request must not be null");
- }
- Collection<Surface> outputSurfaces = request.getTargets();
- Range<Integer> fpsRange = request.get(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE);
- checkConstrainedHighSpeedSurfaces(outputSurfaces, fpsRange);
-
- // Request list size: to limit the preview to 30fps, need use maxFps/30; to maximize
- // the preview frame rate, should use maxBatch size for that high speed stream
- // configuration. We choose the former for now.
- int requestListSize = fpsRange.getUpper() / 30;
- List<CaptureRequest> requestList = new ArrayList<CaptureRequest>();
-
- // Prepare the Request builders: need carry over the request controls.
- // First, create a request builder that will only include preview or recording target.
- CameraMetadataNative requestMetadata = new CameraMetadataNative(request.getNativeCopy());
- // Note that after this step, the requestMetadata is mutated (swapped) and can not be used
- // for next request builder creation.
- CaptureRequest.Builder singleTargetRequestBuilder = new CaptureRequest.Builder(
- requestMetadata, /*reprocess*/false, CameraCaptureSession.SESSION_ID_NONE);
-
- // Overwrite the capture intent to make sure a good value is set.
- Iterator<Surface> iterator = outputSurfaces.iterator();
- Surface firstSurface = iterator.next();
- Surface secondSurface = null;
- if (outputSurfaces.size() == 1 && SurfaceUtils.isSurfaceForHwVideoEncoder(firstSurface)) {
- singleTargetRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT,
- CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW);
- } else {
- // Video only, or preview + video
- singleTargetRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT,
- CaptureRequest.CONTROL_CAPTURE_INTENT_VIDEO_RECORD);
- }
- singleTargetRequestBuilder.setPartOfCHSRequestList(/*partOfCHSList*/true);
-
- // Second, Create a request builder that will include both preview and recording targets.
- CaptureRequest.Builder doubleTargetRequestBuilder = null;
- if (outputSurfaces.size() == 2) {
- // Have to create a new copy, the original one was mutated after a new
- // CaptureRequest.Builder creation.
- requestMetadata = new CameraMetadataNative(request.getNativeCopy());
- doubleTargetRequestBuilder = new CaptureRequest.Builder(
- requestMetadata, /*reprocess*/false, CameraCaptureSession.SESSION_ID_NONE);
- doubleTargetRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT,
- CaptureRequest.CONTROL_CAPTURE_INTENT_VIDEO_RECORD);
- doubleTargetRequestBuilder.addTarget(firstSurface);
- secondSurface = iterator.next();
- doubleTargetRequestBuilder.addTarget(secondSurface);
- doubleTargetRequestBuilder.setPartOfCHSRequestList(/*partOfCHSList*/true);
- // Make sure singleTargetRequestBuilder contains only recording surface for
- // preview + recording case.
- Surface recordingSurface = firstSurface;
- if (!SurfaceUtils.isSurfaceForHwVideoEncoder(recordingSurface)) {
- recordingSurface = secondSurface;
- }
- singleTargetRequestBuilder.addTarget(recordingSurface);
- } else {
- // Single output case: either recording or preview.
- singleTargetRequestBuilder.addTarget(firstSurface);
- }
-
- // Generate the final request list.
- for (int i = 0; i < requestListSize; i++) {
- if (i == 0 && doubleTargetRequestBuilder != null) {
- // First request should be recording + preview request
- requestList.add(doubleTargetRequestBuilder.build());
- } else {
- requestList.add(singleTargetRequestBuilder.build());
- }
- }
-
- return Collections.unmodifiableList(requestList);
- }
}
diff --git a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
index 639ad6054a32..8e0eab2f829b 100644
--- a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
+++ b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
@@ -495,7 +495,8 @@ public final class StreamConfigurationMap {
* <p>
* To enable high speed video recording, application must create a constrained create high speed
* capture session via {@link CameraDevice#createConstrainedHighSpeedCaptureSession}, and submit
- * a CaptureRequest list created by {@link CameraDevice#createConstrainedHighSpeedRequestList}
+ * a CaptureRequest list created by
+ * {@link android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList}
* to this session. The application must select the video size from this method and
* {@link CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE FPS range} from
* {@link #getHighSpeedVideoFpsRangesFor} to configure the constrained high speed session and
@@ -506,14 +507,15 @@ public final class StreamConfigurationMap {
* the same size). Otherwise, the high speed session creation will fail. Once the size is
* selected, application can get the supported FPS ranges by
* {@link #getHighSpeedVideoFpsRangesFor}, and use these FPS ranges to setup the recording
- * request lists via {@link CameraDevice#createConstrainedHighSpeedRequestList}.
+ * request lists via
+ * {@link android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList}.
* </p>
*
* @return an array of supported high speed video recording sizes
* @see #getHighSpeedVideoFpsRangesFor(Size)
* @see CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO
* @see CameraDevice#createConstrainedHighSpeedCaptureSession
- * @see CameraDevice#createConstrainedHighSpeedRequestList
+ * @see android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList
*/
public Size[] getHighSpeedVideoSizes() {
Set<Size> keySet = mHighSpeedVideoSizeMap.keySet();
@@ -571,7 +573,8 @@ public final class StreamConfigurationMap {
* <p>
* To enable high speed video recording, application must create a constrained create high speed
* capture session via {@link CameraDevice#createConstrainedHighSpeedCaptureSession}, and submit
- * a CaptureRequest list created by {@link CameraDevice#createConstrainedHighSpeedRequestList}
+ * a CaptureRequest list created by
+ * {@link android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList}
* to this session. The application must select the video size from this method and
* {@link CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE FPS range} from
* {@link #getHighSpeedVideoFpsRangesFor} to configure the constrained high speed session and
@@ -583,7 +586,7 @@ public final class StreamConfigurationMap {
* recording streams must have the same size). Otherwise, the high speed session creation will
* fail. Once the high speed capture session is created, the application can set the FPS range
* in the recording request lists via
- * {@link CameraDevice#createConstrainedHighSpeedRequestList}.
+ * {@link android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList}.
* </p>
* <p>
* The FPS ranges reported by this method will have below characteristics:
@@ -601,7 +604,7 @@ public final class StreamConfigurationMap {
* @see #getHighSpeedVideoSizesFor
* @see CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO
* @see CameraDevice#createConstrainedHighSpeedCaptureSession
- * @see CameraDevice#createConstrainedHighSpeedRequestList
+ * @see CameraDevice#createHighSpeedRequestList
*/
@SuppressWarnings("unchecked")
public Range<Integer>[] getHighSpeedVideoFpsRanges() {
diff --git a/core/java/android/hardware/camera2/utils/SurfaceUtils.java b/core/java/android/hardware/camera2/utils/SurfaceUtils.java
index 064b21a4254c..4b958dfeec2f 100644
--- a/core/java/android/hardware/camera2/utils/SurfaceUtils.java
+++ b/core/java/android/hardware/camera2/utils/SurfaceUtils.java
@@ -19,9 +19,16 @@ package android.hardware.camera2.utils;
import android.graphics.ImageFormat;
import android.hardware.camera2.legacy.LegacyCameraDevice;
import android.hardware.camera2.legacy.LegacyExceptionUtils.BufferQueueAbandonedException;
+import android.hardware.camera2.params.StreamConfigurationMap;
+import android.util.Range;
import android.util.Size;
import android.view.Surface;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
/**
* Various Surface utilities.
*/
@@ -105,4 +112,93 @@ public class SurfaceUtils {
return LegacyCameraDevice.isFlexibleConsumer(output);
}
+ /**
+ * A high speed output surface can only be preview or hardware encoder surface.
+ *
+ * @param surface The high speed output surface to be checked.
+ */
+ private static void checkHighSpeedSurfaceFormat(Surface surface) {
+ // TODO: remove this override since the default format should be
+ // ImageFormat.PRIVATE. b/9487482
+ final int HAL_FORMAT_RGB_START = 1; // HAL_PIXEL_FORMAT_RGBA_8888 from graphics.h
+ final int HAL_FORMAT_RGB_END = 5; // HAL_PIXEL_FORMAT_BGRA_8888 from graphics.h
+ int surfaceFormat = SurfaceUtils.getSurfaceFormat(surface);
+ if (surfaceFormat >= HAL_FORMAT_RGB_START &&
+ surfaceFormat <= HAL_FORMAT_RGB_END) {
+ surfaceFormat = ImageFormat.PRIVATE;
+ }
+
+ if (surfaceFormat != ImageFormat.PRIVATE) {
+ throw new IllegalArgumentException("Surface format(" + surfaceFormat + ") is not"
+ + " for preview or hardware video encoding!");
+ }
+ }
+
+ /**
+ * Verify that that the surfaces are valid for high-speed recording mode,
+ * and that the FPS range is supported
+ *
+ * @param surfaces the surfaces to verify as valid in terms of size and format
+ * @param fpsRange the target high-speed FPS range to validate
+ * @param config The stream configuration map for the device in question
+ */
+ public static void checkConstrainedHighSpeedSurfaces(Collection<Surface> surfaces,
+ Range<Integer> fpsRange, StreamConfigurationMap config) {
+ if (surfaces == null || surfaces.size() == 0 || surfaces.size() > 2) {
+ throw new IllegalArgumentException("Output target surface list must not be null and"
+ + " the size must be 1 or 2");
+ }
+
+ List<Size> highSpeedSizes = null;
+ if (fpsRange == null) {
+ highSpeedSizes = Arrays.asList(config.getHighSpeedVideoSizes());
+ } else {
+ // Check the FPS range first if provided
+ Range<Integer>[] highSpeedFpsRanges = config.getHighSpeedVideoFpsRanges();
+ if(!Arrays.asList(highSpeedFpsRanges).contains(fpsRange)) {
+ throw new IllegalArgumentException("Fps range " + fpsRange.toString() + " in the"
+ + " request is not a supported high speed fps range " +
+ Arrays.toString(highSpeedFpsRanges));
+ }
+ highSpeedSizes = Arrays.asList(config.getHighSpeedVideoSizesFor(fpsRange));
+ }
+
+ for (Surface surface : surfaces) {
+ checkHighSpeedSurfaceFormat(surface);
+
+ // Surface size must be supported high speed sizes.
+ Size surfaceSize = SurfaceUtils.getSurfaceSize(surface);
+ if (!highSpeedSizes.contains(surfaceSize)) {
+ throw new IllegalArgumentException("Surface size " + surfaceSize.toString() + " is"
+ + " not part of the high speed supported size list " +
+ Arrays.toString(highSpeedSizes.toArray()));
+ }
+ // Each output surface must be either preview surface or recording surface.
+ if (!SurfaceUtils.isSurfaceForPreview(surface) &&
+ !SurfaceUtils.isSurfaceForHwVideoEncoder(surface)) {
+ throw new IllegalArgumentException("This output surface is neither preview nor "
+ + "hardware video encoding surface");
+ }
+ if (SurfaceUtils.isSurfaceForPreview(surface) &&
+ SurfaceUtils.isSurfaceForHwVideoEncoder(surface)) {
+ throw new IllegalArgumentException("This output surface can not be both preview"
+ + " and hardware video encoding surface");
+ }
+ }
+
+ // For 2 output surface case, they shouldn't be same type.
+ if (surfaces.size() == 2) {
+ // Up to here, each surface can only be either preview or recording.
+ Iterator<Surface> iterator = surfaces.iterator();
+ boolean isFirstSurfacePreview =
+ SurfaceUtils.isSurfaceForPreview(iterator.next());
+ boolean isSecondSurfacePreview =
+ SurfaceUtils.isSurfaceForPreview(iterator.next());
+ if (isFirstSurfacePreview == isSecondSurfacePreview) {
+ throw new IllegalArgumentException("The 2 output surfaces must have different"
+ + " type");
+ }
+ }
+ }
+
}
diff --git a/core/java/android/net/CaptivePortal.java b/core/java/android/net/CaptivePortal.java
new file mode 100644
index 000000000000..ee05f2832a9a
--- /dev/null
+++ b/core/java/android/net/CaptivePortal.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed urnder 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;
+
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.RemoteException;
+
+/**
+ * A class allowing apps handling the {@link ConnectivityManager#ACTION_CAPTIVE_PORTAL_SIGN_IN}
+ * activity to indicate to the system different outcomes of captive portal sign in. This class is
+ * passed as an extra named {@link ConnectivityManager#EXTRA_CAPTIVE_PORTAL} with the
+ * {@code ACTION_CAPTIVE_PORTAL_SIGN_IN} activity.
+ */
+public class CaptivePortal implements Parcelable {
+ /** @hide */
+ public static final int APP_RETURN_DISMISSED = 0;
+ /** @hide */
+ public static final int APP_RETURN_UNWANTED = 1;
+ /** @hide */
+ public static final int APP_RETURN_WANTED_AS_IS = 2;
+
+ private final IBinder mBinder;
+
+ /** @hide */
+ public CaptivePortal(IBinder binder) {
+ mBinder = binder;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeStrongBinder(mBinder);
+ }
+
+ public static final Parcelable.Creator<CaptivePortal> CREATOR
+ = new Parcelable.Creator<CaptivePortal>() {
+ @Override
+ public CaptivePortal createFromParcel(Parcel in) {
+ return new CaptivePortal(in.readStrongBinder());
+ }
+
+ @Override
+ public CaptivePortal[] newArray(int size) {
+ return new CaptivePortal[size];
+ }
+ };
+
+ /**
+ * Indicate to the system that the captive portal has been
+ * dismissed. In response the framework will re-evaluate the network's
+ * connectivity and might take further action thereafter.
+ */
+ public void reportCaptivePortalDismissed() {
+ try {
+ ICaptivePortal.Stub.asInterface(mBinder).appResponse(APP_RETURN_DISMISSED);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Indicate to the system that the user does not want to pursue signing in to the
+ * captive portal and the system should continue to prefer other networks
+ * without captive portals for use as the default active data network. The
+ * system will not retest the network for a captive portal so as to avoid
+ * disturbing the user with further sign in to network notifications.
+ */
+ public void ignoreNetwork() {
+ try {
+ ICaptivePortal.Stub.asInterface(mBinder).appResponse(APP_RETURN_UNWANTED);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Indicate to the system the user wants to use this network as is, even though
+ * the captive portal is still in place. The system will treat the network
+ * as if it did not have a captive portal when selecting the network to use
+ * as the default active data network. This may result in this network
+ * becoming the default active data network, which could disrupt network
+ * connectivity for apps because the captive portal is still in place.
+ * @hide
+ */
+ public void useNetwork() {
+ try {
+ ICaptivePortal.Stub.asInterface(mBinder).appResponse(APP_RETURN_WANTED_AS_IS);
+ } catch (RemoteException e) {
+ }
+ }
+}
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 01334c3a87bf..dc8ff8fb1f88 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -102,26 +102,26 @@ public class ConnectivityManager {
* portal, which is blocking Internet connectivity. The user was presented
* with a notification that network sign in is required,
* and the user invoked the notification's action indicating they
- * desire to sign in to the network. Apps handling this action should
+ * desire to sign in to the network. Apps handling this activity should
* facilitate signing in to the network. This action includes a
* {@link Network} typed extra called {@link #EXTRA_NETWORK} that represents
* the network presenting the captive portal; all communication with the
* captive portal must be done using this {@code Network} object.
* <p/>
- * When the app handling this action believes the user has signed in to
- * the network and the captive portal has been dismissed, the app should call
- * {@link #reportCaptivePortalDismissed} so the system can reevaluate the network.
- * If reevaluation finds the network no longer subject to a captive portal,
- * the network may become the default active data network.
- * <p/>
- * When the app handling this action believes the user explicitly wants
+ * This activity includes a {@link CaptivePortal} extra named
+ * {@link #EXTRA_CAPTIVE_PORTAL} that can be used to indicate different
+ * outcomes of the captive portal sign in to the system:
+ * <ul>
+ * <li> When the app handling this action believes the user has signed in to
+ * the network and the captive portal has been dismissed, the app should
+ * call {@link CaptivePortal#reportCaptivePortalDismissed} so the system can
+ * reevaluate the network. If reevaluation finds the network no longer
+ * subject to a captive portal, the network may become the default active
+ * data network. </li>
+ * <li> When the app handling this action believes the user explicitly wants
* to ignore the captive portal and the network, the app should call
- * {@link #ignoreNetworkWithCaptivePortal}.
- * <p/>
- * Note that this action includes a {@code String} extra named
- * {@link #EXTRA_CAPTIVE_PORTAL_TOKEN} that must
- * be passed in to {@link #reportCaptivePortalDismissed} and
- * {@link #ignoreNetworkWithCaptivePortal}.
+ * {@link CaptivePortal#ignoreNetwork}. </li>
+ * </ul>
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL";
@@ -187,16 +187,15 @@ public class ConnectivityManager {
* {@hide}
*/
public static final String EXTRA_INET_CONDITION = "inetCondition";
-
/**
- * The lookup key for a string that is sent out with
- * {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN}. This string must be
- * passed in to {@link #reportCaptivePortalDismissed} and
- * {@link #ignoreNetworkWithCaptivePortal}. Retrieve it with
- * {@link android.content.Intent#getStringExtra(String)}.
+ * The lookup key for a {@link CaptivePortal} object included with the
+ * {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN} intent. The {@code CaptivePortal}
+ * object can be used to either indicate to the system that the captive
+ * portal has been dismissed or that the user does not want to pursue
+ * signing in to captive portal. Retrieve it with
+ * {@link android.content.Intent#getParcelableExtra(String)}.
*/
- public static final String EXTRA_CAPTIVE_PORTAL_TOKEN = "captivePortalToken";
-
+ public static final String EXTRA_CAPTIVE_PORTAL = "android.net.extra.CAPTIVE_PORTAL";
/**
* Broadcast action to indicate the change of data activity status
* (idle or active) on a network in a recent period.
@@ -432,7 +431,8 @@ public class ConnectivityManager {
public static final int TYPE_MOBILE_IA = 14;
/**
- * Emergency PDN connection for emergency calls
+ * Emergency PDN connection for emergency services. This
+ * may include IMS and MMS in emergency situations.
* {@hide}
*/
public static final int TYPE_MOBILE_EMERGENCY = 15;
@@ -1779,82 +1779,6 @@ public class ConnectivityManager {
}
}
- /** {@hide} */
- public static final int CAPTIVE_PORTAL_APP_RETURN_DISMISSED = 0;
- /** {@hide} */
- public static final int CAPTIVE_PORTAL_APP_RETURN_UNWANTED = 1;
- /** {@hide} */
- public static final int CAPTIVE_PORTAL_APP_RETURN_WANTED_AS_IS = 2;
-
- /**
- * Called by an app handling the {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN}
- * action to indicate to the system that the captive portal has been
- * dismissed. In response the framework will re-evaluate the network's
- * connectivity and might take further action thereafter.
- *
- * @param network The {@link Network} object passed via
- * {@link #EXTRA_NETWORK} with the
- * {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN} action.
- * @param actionToken The {@code String} passed via
- * {@link #EXTRA_CAPTIVE_PORTAL_TOKEN} with the
- * {@code ACTION_CAPTIVE_PORTAL_SIGN_IN} action.
- */
- public void reportCaptivePortalDismissed(Network network, String actionToken) {
- try {
- mService.captivePortalAppResponse(network, CAPTIVE_PORTAL_APP_RETURN_DISMISSED,
- actionToken);
- } catch (RemoteException e) {
- }
- }
-
- /**
- * Called by an app handling the {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN}
- * action to indicate that the user does not want to pursue signing in to
- * captive portal and the system should continue to prefer other networks
- * without captive portals for use as the default active data network. The
- * system will not retest the network for a captive portal so as to avoid
- * disturbing the user with further sign in to network notifications.
- *
- * @param network The {@link Network} object passed via
- * {@link #EXTRA_NETWORK} with the
- * {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN} action.
- * @param actionToken The {@code String} passed via
- * {@link #EXTRA_CAPTIVE_PORTAL_TOKEN} with the
- * {@code ACTION_CAPTIVE_PORTAL_SIGN_IN} action.
- */
- public void ignoreNetworkWithCaptivePortal(Network network, String actionToken) {
- try {
- mService.captivePortalAppResponse(network, CAPTIVE_PORTAL_APP_RETURN_UNWANTED,
- actionToken);
- } catch (RemoteException e) {
- }
- }
-
- /**
- * Called by an app handling the {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN}
- * action to indicate the user wants to use this network as is, even though
- * the captive portal is still in place. The system will treat the network
- * as if it did not have a captive portal when selecting the network to use
- * as the default active data network. This may result in this network
- * becoming the default active data network, which could disrupt network
- * connectivity for apps because the captive portal is still in place.
- *
- * @param network The {@link Network} object passed via
- * {@link #EXTRA_NETWORK} with the
- * {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN} action.
- * @param actionToken The {@code String} passed via
- * {@link #EXTRA_CAPTIVE_PORTAL_TOKEN} with the
- * {@code ACTION_CAPTIVE_PORTAL_SIGN_IN} action.
- * @hide
- */
- public void useNetworkWithCaptivePortal(Network network, String actionToken) {
- try {
- mService.captivePortalAppResponse(network, CAPTIVE_PORTAL_APP_RETURN_WANTED_AS_IS,
- actionToken);
- } catch (RemoteException e) {
- }
- }
-
/**
* Set a network-independent global http proxy. This is not normally what you want
* for typical HTTP proxies - they are general network dependent. However if you're
diff --git a/core/java/android/net/ICaptivePortal.aidl b/core/java/android/net/ICaptivePortal.aidl
new file mode 100644
index 000000000000..a013e79106e7
--- /dev/null
+++ b/core/java/android/net/ICaptivePortal.aidl
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2015, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+/**
+ * Interface to inform NetworkMonitor of decisions of app handling captive portal.
+ * @hide
+ */
+interface ICaptivePortal
+{
+ oneway void appResponse(int response);
+}
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index 29557bb661b8..46c28a69ab6f 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -96,8 +96,6 @@ interface IConnectivityManager
void reportNetworkConnectivity(in Network network, boolean hasConnectivity);
- void captivePortalAppResponse(in Network network, int response, String actionToken);
-
ProxyInfo getGlobalProxy();
void setGlobalProxy(in ProxyInfo p);
@@ -114,7 +112,7 @@ interface IConnectivityManager
void startLegacyVpn(in VpnProfile profile);
- LegacyVpnInfo getLegacyVpnInfo();
+ LegacyVpnInfo getLegacyVpnInfo(int userId);
VpnInfo[] getAllVpnInfo();
diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java
index 658051c9ebf1..514d24abc52f 100644
--- a/core/java/android/net/NetworkCapabilities.java
+++ b/core/java/android/net/NetworkCapabilities.java
@@ -133,7 +133,8 @@ public final class NetworkCapabilities implements Parcelable {
/**
* Indicates this is a network that has the ability to reach a carrier's
- * Emergency IMS servers, used for network signaling during emergency calls.
+ * Emergency IMS servers or other services, used for network signaling
+ * during emergency calls.
*/
public static final int NET_CAPABILITY_EIMS = 10;
diff --git a/core/java/android/os/PooledStringReader.java b/core/java/android/os/PooledStringReader.java
index 7795957999cb..6fc71c7c65e8 100644
--- a/core/java/android/os/PooledStringReader.java
+++ b/core/java/android/os/PooledStringReader.java
@@ -36,6 +36,10 @@ public class PooledStringReader {
mPool = new String[size];
}
+ public int getStringCount() {
+ return mPool.length;
+ }
+
public String readString() {
int idx = mIn.readInt();
if (idx >= 0) {
diff --git a/core/java/android/os/PooledStringWriter.java b/core/java/android/os/PooledStringWriter.java
index eac297dac8c7..ee592d90d750 100644
--- a/core/java/android/os/PooledStringWriter.java
+++ b/core/java/android/os/PooledStringWriter.java
@@ -67,6 +67,10 @@ public class PooledStringWriter {
}
}
+ public int getStringCount() {
+ return mPool.size();
+ }
+
public void finish() {
final int pos = mOut.dataPosition();
mOut.setDataPosition(mStart);
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 4e1375891337..fff355b452ce 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -574,7 +574,22 @@ public final class Settings {
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_MANAGE_OVERLAY_PERMISSION =
- "android.settings.MANAGE_OVERLAY_PERMISSION";
+ "android.settings.action.MANAGE_OVERLAY_PERMISSION";
+
+ /**
+ * Activity Action: Show settings to toggle apps' capablity to
+ * to read/write system settings.
+ * <p>
+ * In some cases, a matching Activity may not exist, so ensure you
+ * safeguard against this.
+ * <p>
+ * Input: Nothing.
+ * <p>
+ * Output: Nothing.
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_MANAGE_WRITE_SETTINGS =
+ "android.settings.action.MANAGE_WRITE_SETTINGS";
/**
* Activity Action: Show screen of details about a particular application.
diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java
index a7e0e087d80d..e408b36ea523 100644
--- a/core/java/android/service/voice/VoiceInteractionSession.java
+++ b/core/java/android/service/voice/VoiceInteractionSession.java
@@ -209,16 +209,30 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall
}
@Override
- public void handleAssist(Bundle data, AssistStructure structure,
- AssistContent content) {
+ public void handleAssist(final Bundle data, final AssistStructure structure,
+ final AssistContent content) {
// We want to pre-warm the AssistStructure before handing it off to the main
- // thread. There is a strong argument to be made that it should be handed
- // through as a separate param rather than part of the assistBundle.
- if (structure != null) {
- structure.ensureData();
- }
- mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOO(MSG_HANDLE_ASSIST,
- data, structure, content));
+ // thread. We also want to do this on a separate thread, so that if the app
+ // is for some reason slow (due to slow filling in of async children in the
+ // structure), we don't block other incoming IPCs (such as the screenshot) to
+ // us (since we are a oneway interface, they get serialized). (Okay?)
+ Thread retriever = new Thread("AssistStructure retriever") {
+ @Override
+ public void run() {
+ Throwable failure = null;
+ if (structure != null) {
+ try {
+ structure.ensureData();
+ } catch (Throwable e) {
+ Log.w(TAG, "Failure retrieving AssistStructure", e);
+ failure = e;
+ }
+ }
+ mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageOOOO(MSG_HANDLE_ASSIST,
+ data, failure == null ? structure : null, failure, content));
+ }
+ };
+ retriever.start();
}
@Override
@@ -689,8 +703,8 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall
args = (SomeArgs)msg.obj;
if (DEBUG) Log.d(TAG, "onHandleAssist: data=" + args.arg1
+ " structure=" + args.arg2 + " content=" + args.arg3);
- onHandleAssist((Bundle) args.arg1, (AssistStructure) args.arg2,
- (AssistContent) args.arg3);
+ doOnHandleAssist((Bundle) args.arg1, (AssistStructure) args.arg2,
+ (Throwable) args.arg3, (AssistContent) args.arg4);
break;
case MSG_HANDLE_SCREENSHOT:
if (DEBUG) Log.d(TAG, "onHandleScreenshot: " + msg.obj);
@@ -1111,9 +1125,45 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall
mContentFrame.requestApplyInsets();
}
+ void doOnHandleAssist(Bundle data, AssistStructure structure, Throwable failure,
+ AssistContent content) {
+ if (failure != null) {
+ onAssistStructureFailure(failure);
+ }
+ onHandleAssist(data, structure, content);
+ }
+
+ /**
+ * Called when there has been a failure transferring the {@link AssistStructure} to
+ * the assistant. This may happen, for example, if the data is too large and results
+ * in an out of memory exception, or the client has provided corrupt data. This will
+ * be called immediately before {@link #onHandleAssist} and the AssistStructure supplied
+ * there afterwards will be null.
+ *
+ * @param failure The failure exception that was thrown when building the
+ * {@link AssistStructure}.
+ */
+ public void onAssistStructureFailure(Throwable failure) {
+ }
+
+ /**
+ * Called to receive data from the application that the user was currently viewing when
+ * an assist session is started.
+ *
+ * @param data Arbitrary data supplied by the app through
+ * {@link android.app.Activity#onProvideAssistData Activity.onProvideAssistData}.
+ * @param structure If available, the structure definition of all windows currently
+ * displayed by the app; if structure has been turned off by the user, will be null.
+ * @param content Additional content data supplied by the app through
+ * {@link android.app.Activity#onProvideAssistContent Activity.onProvideAssistContent}.
+ */
public void onHandleAssist(Bundle data, AssistStructure structure, AssistContent content) {
}
+ /**
+ * Called to receive a screenshot of what the user was currently viewing when an assist
+ * session is started. Will be null if screenshots are disabled by the user.
+ */
public void onHandleScreenshot(Bitmap screenshot) {
}
diff --git a/core/java/android/text/Html.java b/core/java/android/text/Html.java
index a55a08cc73e2..dc1d6f6229c1 100644
--- a/core/java/android/text/Html.java
+++ b/core/java/android/text/Html.java
@@ -137,7 +137,12 @@ public class Html {
}
/**
- * Returns an HTML representation of the provided Spanned text.
+ * Returns an HTML representation of the provided Spanned text. A best effort is
+ * made to add HTML tags corresponding to spans. Also note that HTML metacharacters
+ * (such as "&lt;" and "&amp;") within the input text are escaped.
+ *
+ * @param text input text to convert
+ * @return string containing input converted to HTML
*/
public static String toHtml(Spanned text) {
StringBuilder out = new StringBuilder();
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index d82213857ac0..fa347b9dece8 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -206,7 +206,6 @@ public abstract class Layout {
mText = text;
mPaint = paint;
- mWorkPaint = new TextPaint();
mWidth = width;
mAlignment = align;
mSpacingMult = spacingMult;
@@ -1993,7 +1992,6 @@ public abstract class Layout {
private CharSequence mText;
private TextPaint mPaint;
- /* package */ TextPaint mWorkPaint;
private int mWidth;
private Alignment mAlignment = Alignment.ALIGN_NORMAL;
private float mSpacingMult;
diff --git a/core/java/android/text/SpannableStringInternal.java b/core/java/android/text/SpannableStringInternal.java
index d114d3241b4d..5c5deb45c391 100644
--- a/core/java/android/text/SpannableStringInternal.java
+++ b/core/java/android/text/SpannableStringInternal.java
@@ -214,10 +214,6 @@ import java.lang.reflect.Array;
Object ret1 = null;
for (int i = 0; i < spanCount; i++) {
- if (kind != null && !kind.isInstance(spans[i])) {
- continue;
- }
-
int spanStart = data[i * COLUMNS + START];
int spanEnd = data[i * COLUMNS + END];
@@ -237,6 +233,11 @@ import java.lang.reflect.Array;
}
}
+ // verify span class as late as possible, since it is expensive
+ if (kind != null && !kind.isInstance(spans[i])) {
+ continue;
+ }
+
if (count == 0) {
ret1 = spans[i];
count++;
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index cdff395a3fa9..efc9e1ae4aa6 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -744,7 +744,8 @@ public class StaticLayout extends Layout {
&& (ellipsize == TextUtils.TruncateAt.END
|| (mMaximumVisibleLineCount == 1
&& ellipsize != TextUtils.TruncateAt.MARQUEE));
- if (remainingLineCount < breakCount && ellipsisMayBeApplied) {
+ if (remainingLineCount > 0 && remainingLineCount < breakCount &&
+ ellipsisMayBeApplied) {
// Treat the last line and overflowed lines as a single line.
breaks[remainingLineCount - 1] = breaks[breakCount - 1];
// Calculate width and flag.
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 64210ea00256..be564f84d221 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -342,6 +342,14 @@ public interface WindowManagerPolicy {
boolean isGoneForLayoutLw();
/**
+ * Returns true if the window has a surface that it has drawn a
+ * complete UI in to. Note that this is different from {@link #hasDrawnLw()}
+ * in that it also returns true if the window is READY_TO_SHOW, but was not yet
+ * promoted to HAS_DRAWN.
+ */
+ boolean isDrawnLw();
+
+ /**
* Returns true if this window has been shown on screen at some time in
* the past. Must be called with the window manager lock held.
*/
diff --git a/core/java/android/widget/AppSecurityPermissions.java b/core/java/android/widget/AppSecurityPermissions.java
index d1af9dc8a255..e3ce6f2e7469 100644
--- a/core/java/android/widget/AppSecurityPermissions.java
+++ b/core/java/android/widget/AppSecurityPermissions.java
@@ -61,8 +61,6 @@ import java.util.Set;
*/
public class AppSecurityPermissions {
- public static final int WHICH_PERSONAL = 1<<0;
- public static final int WHICH_DEVICE = 1<<1;
public static final int WHICH_NEW = 1<<2;
public static final int WHICH_ALL = 0xffff;
@@ -75,7 +73,8 @@ public class AppSecurityPermissions {
= new HashMap<String, MyPermissionGroupInfo>();
private final List<MyPermissionGroupInfo> mPermGroupsList
= new ArrayList<MyPermissionGroupInfo>();
- private final PermissionGroupInfoComparator mPermGroupComparator = new PermissionGroupInfoComparator();
+ private final PermissionGroupInfoComparator mPermGroupComparator =
+ new PermissionGroupInfoComparator();
private final PermissionInfoComparator mPermComparator = new PermissionInfoComparator();
private final List<MyPermissionInfo> mPermsList = new ArrayList<MyPermissionInfo>();
private final CharSequence mNewPermPrefix;
@@ -85,8 +84,6 @@ public class AppSecurityPermissions {
CharSequence mLabel;
final ArrayList<MyPermissionInfo> mNewPermissions = new ArrayList<MyPermissionInfo>();
- final ArrayList<MyPermissionInfo> mPersonalPermissions = new ArrayList<MyPermissionInfo>();
- final ArrayList<MyPermissionInfo> mDevicePermissions = new ArrayList<MyPermissionInfo>();
final ArrayList<MyPermissionInfo> mAllPermissions = new ArrayList<MyPermissionInfo>();
MyPermissionGroupInfo(PermissionInfo perm) {
@@ -352,13 +349,6 @@ public class AppSecurityPermissions {
}
for (int i=0; i<strList.length; i++) {
String permName = strList[i];
- // If we are only looking at an existing app, then we only
- // care about permissions that have actually been granted to it.
- if (installedPkgInfo != null && info != installedPkgInfo) {
- if ((flagsList[i]&PackageInfo.REQUESTED_PERMISSION_GRANTED) == 0) {
- continue;
- }
- }
try {
PermissionInfo tmpPermInfo = mPm.getPermissionInfo(permName, 0);
if (tmpPermInfo == null) {
@@ -431,10 +421,6 @@ public class AppSecurityPermissions {
private List<MyPermissionInfo> getPermissionList(MyPermissionGroupInfo grp, int which) {
if (which == WHICH_NEW) {
return grp.mNewPermissions;
- } else if (which == WHICH_PERSONAL) {
- return grp.mPersonalPermissions;
- } else if (which == WHICH_DEVICE) {
- return grp.mDevicePermissions;
} else {
return grp.mAllPermissions;
}
@@ -577,15 +563,8 @@ public class AppSecurityPermissions {
private static class PermissionGroupInfoComparator implements Comparator<MyPermissionGroupInfo> {
private final Collator sCollator = Collator.getInstance();
- PermissionGroupInfoComparator() {
- }
+ @Override
public final int compare(MyPermissionGroupInfo a, MyPermissionGroupInfo b) {
- if (((a.flags^b.flags)&PermissionGroupInfo.FLAG_PERSONAL_INFO) != 0) {
- return ((a.flags&PermissionGroupInfo.FLAG_PERSONAL_INFO) != 0) ? -1 : 1;
- }
- if (a.priority != b.priority) {
- return a.priority > b.priority ? -1 : 1;
- }
return sCollator.compare(a.mLabel, b.mLabel);
}
}
@@ -628,11 +607,6 @@ public class AppSecurityPermissions {
if (pInfo.mNew) {
addPermToList(group.mNewPermissions, pInfo);
}
- if ((group.flags&PermissionGroupInfo.FLAG_PERSONAL_INFO) != 0) {
- addPermToList(group.mPersonalPermissions, pInfo);
- } else {
- addPermToList(group.mDevicePermissions, pInfo);
- }
}
}
}
@@ -652,12 +626,5 @@ public class AppSecurityPermissions {
mPermGroupsList.add(pgrp);
}
Collections.sort(mPermGroupsList, mPermGroupComparator);
- if (localLOGV) {
- for (MyPermissionGroupInfo grp : mPermGroupsList) {
- Log.i(TAG, "Group " + grp.name + " personal="
- + ((grp.flags&PermissionGroupInfo.FLAG_PERSONAL_INFO) != 0)
- + " priority=" + grp.priority);
- }
- }
}
}
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 96e033a3231b..d897f49dbffd 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -16,6 +16,12 @@
package android.widget;
+import java.text.BreakIterator;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+
import android.R;
import android.annotation.Nullable;
import android.app.PendingIntent;
@@ -106,12 +112,6 @@ import com.android.internal.util.GrowingArrayUtils;
import com.android.internal.util.Preconditions;
import com.android.internal.widget.EditableInputConnection;
-import java.text.BreakIterator;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-
/**
* Helper class used by TextView to handle editable text views.
@@ -127,6 +127,7 @@ public class Editor {
private static int DRAG_SHADOW_MAX_TEXT_LENGTH = 20;
private static final float LINE_SLOP_MULTIPLIER_FOR_HANDLEVIEWS = 0.5f;
private static final int UNSET_X_VALUE = -1;
+ private static final int UNSET_LINE = -1;
// Tag used when the Editor maintains its own separate UndoManager.
private static final String UNDO_OWNER_TAG = "Editor";
@@ -3510,7 +3511,11 @@ public class Editor {
// Minimum touch target size for handles
private int mMinSize;
// Indicates the line of text that the handle is on.
- protected int mPrevLine = -1;
+ protected int mPrevLine = UNSET_LINE;
+ // Indicates the line of text that the user was touching. This can differ from mPrevLine
+ // when selecting text when the handles jump to the end / start of words which may be on
+ // a different line.
+ protected int mPreviousLineTouched = UNSET_LINE;
public HandleView(Drawable drawableLtr, Drawable drawableRtl) {
super(mTextView.getContext());
@@ -3801,6 +3806,7 @@ public class Editor {
mLastParentX = positionListener.getPositionX();
mLastParentY = positionListener.getPositionY();
mIsDragging = true;
+ mPreviousLineTouched = UNSET_LINE;
break;
}
@@ -4015,8 +4021,12 @@ public class Editor {
Layout layout = mTextView.getLayout();
int offset;
if (layout != null) {
- int currLine = getCurrentLineAdjustedForSlop(layout, mPrevLine, y);
+ if (mPreviousLineTouched == UNSET_LINE) {
+ mPreviousLineTouched = mTextView.getLineAtCoordinate(y);
+ }
+ int currLine = getCurrentLineAdjustedForSlop(layout, mPreviousLineTouched, y);
offset = mTextView.getOffsetAtCoordinate(currLine, x);
+ mPreviousLineTouched = currLine;
} else {
offset = mTextView.getOffsetForPosition(x, y);
}
@@ -4092,9 +4102,13 @@ public class Editor {
return;
}
+ if (mPreviousLineTouched == UNSET_LINE) {
+ mPreviousLineTouched = mTextView.getLineAtCoordinate(y);
+ }
+
boolean positionCursor = false;
final int selectionEnd = mTextView.getSelectionEnd();
- int currLine = getCurrentLineAdjustedForSlop(layout, mPrevLine, y);
+ int currLine = getCurrentLineAdjustedForSlop(layout, mPreviousLineTouched, y);
int initialOffset = mTextView.getOffsetAtCoordinate(currLine, x);
if (initialOffset >= selectionEnd) {
@@ -4138,9 +4152,9 @@ public class Editor {
} else {
final float xDiff = x - mPrevX;
if (atRtl) {
- isExpanding = xDiff > 0 || currLine > mPrevLine;
+ isExpanding = xDiff > 0 || currLine > mPreviousLineTouched;
} else {
- isExpanding = xDiff < 0 || currLine < mPrevLine;
+ isExpanding = xDiff < 0 || currLine < mPreviousLineTouched;
}
}
@@ -4204,6 +4218,7 @@ public class Editor {
offset = getNextCursorOffset(selectionEnd, false);
mTouchWordDelta = 0.0f;
}
+ mPreviousLineTouched = currLine;
positionAtCursorOffset(offset, false);
}
mPrevX = x;
@@ -4218,8 +4233,9 @@ public class Editor {
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean superResult = super.onTouchEvent(event);
- if (event.getActionMasked() == MotionEvent.ACTION_UP) {
- // Reset the touch word offset when the user has lifted their finger.
+ if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
+ // Reset the touch word offset and x value when the user
+ // re-engages the handle.
mTouchWordDelta = 0.0f;
mPrevX = UNSET_X_VALUE;
}
@@ -4280,9 +4296,13 @@ public class Editor {
return;
}
+ if (mPreviousLineTouched == UNSET_LINE) {
+ mPreviousLineTouched = mTextView.getLineAtCoordinate(y);
+ }
+
boolean positionCursor = false;
final int selectionStart = mTextView.getSelectionStart();
- int currLine = getCurrentLineAdjustedForSlop(layout, mPrevLine, y);
+ int currLine = getCurrentLineAdjustedForSlop(layout, mPreviousLineTouched, y);
int initialOffset = mTextView.getOffsetAtCoordinate(currLine, x);
if (initialOffset <= selectionStart) {
@@ -4326,9 +4346,9 @@ public class Editor {
} else {
final float xDiff = x - mPrevX;
if (atRtl) {
- isExpanding = xDiff < 0 || currLine < mPrevLine;
+ isExpanding = xDiff < 0 || currLine < mPreviousLineTouched;
} else {
- isExpanding = xDiff > 0 || currLine > mPrevLine;
+ isExpanding = xDiff > 0 || currLine > mPreviousLineTouched;
}
}
@@ -4392,6 +4412,7 @@ public class Editor {
offset = getNextCursorOffset(selectionStart, true);
mTouchWordDelta = 0.0f;
}
+ mPreviousLineTouched = currLine;
positionAtCursorOffset(offset, false);
}
mPrevX = x;
@@ -4406,8 +4427,9 @@ public class Editor {
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean superResult = super.onTouchEvent(event);
- if (event.getActionMasked() == MotionEvent.ACTION_UP) {
- // Reset the touch word offset when the user has lifted their finger.
+ if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
+ // Reset the touch word offset and x value when the user
+ // re-engages the handle.
mTouchWordDelta = 0.0f;
mPrevX = UNSET_X_VALUE;
}
@@ -4416,10 +4438,16 @@ public class Editor {
}
private int getCurrentLineAdjustedForSlop(Layout layout, int prevLine, float y) {
+ final int trueLine = mTextView.getLineAtCoordinate(y);
if (layout == null || prevLine > layout.getLineCount()
|| layout.getLineCount() <= 0 || prevLine < 0) {
// Invalid parameters, just return whatever line is at y.
- return mTextView.getLineAtCoordinate(y);
+ return trueLine;
+ }
+
+ if (Math.abs(trueLine - prevLine) >= 2) {
+ // Only stick to lines if we're within a line of the previous selection.
+ return trueLine;
}
final float verticalOffset = mTextView.viewportToContentVerticalOffset();
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index a1582f2549b7..e13b96fb5ba1 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -91,6 +91,7 @@ public class ImageView extends View {
private boolean mColorMod = false;
private Drawable mDrawable = null;
+ private ImageViewBitmapDrawable mRecycleableBitmapDrawable = null;
private ColorStateList mDrawableTintList = null;
private PorterDuff.Mode mDrawableTintMode = null;
private boolean mHasDrawableTint = false;
@@ -570,6 +571,17 @@ public class ImageView extends View {
}
}
+ private static class ImageViewBitmapDrawable extends BitmapDrawable {
+ public ImageViewBitmapDrawable(Resources res, Bitmap bitmap) {
+ super(res, bitmap);
+ }
+
+ @Override
+ public void setBitmap(Bitmap bitmap) {
+ super.setBitmap(bitmap);
+ }
+ };
+
/**
* Sets a Bitmap as the content of this ImageView.
*
@@ -577,9 +589,16 @@ public class ImageView extends View {
*/
@android.view.RemotableViewMethod
public void setImageBitmap(Bitmap bm) {
- // if this is used frequently, may handle bitmaps explicitly
- // to reduce the intermediate drawable object
- setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
+ // Hacky fix to force setImageDrawable to do a full setImageDrawable
+ // instead of doing an object reference comparison
+ mDrawable = null;
+ if (mRecycleableBitmapDrawable == null) {
+ mRecycleableBitmapDrawable = new ImageViewBitmapDrawable(
+ mContext.getResources(), bm);
+ } else {
+ mRecycleableBitmapDrawable.setBitmap(bm);
+ }
+ setImageDrawable(mRecycleableBitmapDrawable);
}
public void setImageState(int[] state, boolean merge) {
@@ -848,6 +867,10 @@ public class ImageView extends View {
}
private void updateDrawable(Drawable d) {
+ if (d != mRecycleableBitmapDrawable && mRecycleableBitmapDrawable != null) {
+ mRecycleableBitmapDrawable.setBitmap(null);
+ }
+
if (mDrawable != null) {
mDrawable.setCallback(null);
unscheduleDrawable(mDrawable);
diff --git a/core/java/com/android/internal/logging/MetricsConstants.java b/core/java/com/android/internal/logging/MetricsConstants.java
index 8c6b79ba7c1d..7278d5c07f00 100644
--- a/core/java/com/android/internal/logging/MetricsConstants.java
+++ b/core/java/com/android/internal/logging/MetricsConstants.java
@@ -22,6 +22,7 @@ package com.android.internal.logging;
*/
public interface MetricsConstants {
// These constants must match those in the analytic pipeline, do not edit.
+ // Add temporary values to the top of MetricsLogger instead.
public static final int VIEW_UNKNOWN = 0;
public static final int MAIN_SETTINGS = 1;
public static final int ACCESSIBILITY = 2;
@@ -229,6 +230,29 @@ public interface MetricsConstants {
public static final int ACTION_NOTE_CONTROLS = 204;
public static final int ACTION_NOTE_INFO = 205;
public static final int ACTION_APP_NOTE_SETTINGS = 206;
+ public static final int VOLUME_DIALOG = 207;
+ public static final int VOLUME_DIALOG_DETAILS = 208;
+ public static final int ACTION_VOLUME_SLIDER = 209;
+ public static final int ACTION_VOLUME_STREAM = 210;
+ public static final int ACTION_VOLUME_KEY = 211;
+ public static final int ACTION_VOLUME_ICON = 212;
+ public static final int ACTION_RINGER_MODE = 213;
+ public static final int ACTION_ACTIVITY_CHOOSER_SHOWN = 214;
+ public static final int ACTION_ACTIVITY_CHOOSER_PICKED_APP_TARGET = 215;
+ public static final int ACTION_ACTIVITY_CHOOSER_PICKED_SERVICE_TARGET = 216;
+ public static final int ACTION_ACTIVITY_CHOOSER_PICKED_STANDARD_TARGET = 217;
+ public static final int ACTION_BRIGHTNESS = 218;
+ public static final int ACTION_BRIGHTNESS_AUTO = 219;
+ public static final int BRIGHTNESS_DIALOG = 220;
+ public static final int SYSTEM_ALERT_WINDOW_APPS = 221;
+ public static final int DREAMING = 222;
+ public static final int DOZING = 223;
+ public static final int OVERVIEW_ACTIVITY = 224;
+ public static final int ABOUT_LEGAL_SETTINGS = 225;
+ public static final int ACTION_SEARCH_RESULTS = 226;
+
+ // These constants must match those in the analytic pipeline, do not edit.
+ // Add temporary values to the top of MetricsLogger instead.
//aliases
public static final int DEVICEINFO_STORAGE = DEVICEINFO_MEMORY;
diff --git a/core/java/com/android/internal/logging/MetricsLogger.java b/core/java/com/android/internal/logging/MetricsLogger.java
index 66fa8fc285f2..cbe535fb74fd 100644
--- a/core/java/com/android/internal/logging/MetricsLogger.java
+++ b/core/java/com/android/internal/logging/MetricsLogger.java
@@ -26,25 +26,8 @@ import android.view.View;
* @hide
*/
public class MetricsLogger implements MetricsConstants {
- public static final int VOLUME_DIALOG = 207;
- public static final int VOLUME_DIALOG_DETAILS = 208;
- public static final int ACTION_VOLUME_SLIDER = 209;
- public static final int ACTION_VOLUME_STREAM = 210;
- public static final int ACTION_VOLUME_KEY = 211;
- public static final int ACTION_VOLUME_ICON = 212;
- public static final int ACTION_RINGER_MODE = 213;
- public static final int ACTION_ACTIVITY_CHOOSER_SHOWN = 214;
- public static final int ACTION_ACTIVITY_CHOOSER_PICKED_APP_TARGET = 215;
- public static final int ACTION_ACTIVITY_CHOOSER_PICKED_SERVICE_TARGET = 216;
- public static final int ACTION_ACTIVITY_CHOOSER_PICKED_STANDARD_TARGET = 217;
- public static final int ACTION_BRIGHTNESS = 218;
- public static final int ACTION_BRIGHTNESS_AUTO = 219;
- public static final int BRIGHTNESS_DIALOG = 220;
- public static final int SYSTEM_ALERT_WINDOW_APPS = 221;
- public static final int DREAMING = 222;
- public static final int DOZING = 223;
- public static final int OVERVIEW_ACTIVITY = 224;
// Temporary constants go here, to await migration to MetricsConstants.
+ // next value is 227;
public static void visible(Context context, int category) throws IllegalArgumentException {
if (Build.IS_DEBUGGABLE && category == VIEW_UNKNOWN) {
diff --git a/core/java/com/android/internal/os/storage/ExternalStorageFormatter.java b/core/java/com/android/internal/os/storage/ExternalStorageFormatter.java
deleted file mode 100644
index 0a01ae9234f3..000000000000
--- a/core/java/com/android/internal/os/storage/ExternalStorageFormatter.java
+++ /dev/null
@@ -1,146 +0,0 @@
-package com.android.internal.os.storage;
-
-import android.app.ProgressDialog;
-import android.app.Service;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.os.IBinder;
-import android.os.PowerManager;
-import android.os.storage.StorageManager;
-import android.os.storage.StorageVolume;
-import android.util.Slog;
-import android.view.WindowManager;
-import android.widget.Toast;
-
-import com.android.internal.R;
-
-/**
- * Takes care of unmounting and formatting external storage.
- *
- * @deprecated Please use {@link Intent#ACTION_MASTER_CLEAR} broadcast with extra
- * {@link Intent#EXTRA_WIPE_EXTERNAL_STORAGE} to wipe and factory reset, or call
- * {@link StorageManager#wipeAdoptableDisks} directly to format external storages.
- */
-public class ExternalStorageFormatter extends Service {
- static final String TAG = "ExternalStorageFormatter";
-
- public static final String FORMAT_ONLY = "com.android.internal.os.storage.FORMAT_ONLY";
- public static final String FORMAT_AND_FACTORY_RESET = "com.android.internal.os.storage.FORMAT_AND_FACTORY_RESET";
-
- public static final String EXTRA_ALWAYS_RESET = "always_reset";
-
- public static final ComponentName COMPONENT_NAME
- = new ComponentName("android", ExternalStorageFormatter.class.getName());
-
- private StorageManager mStorageManager;
-
- private PowerManager.WakeLock mWakeLock;
-
- private ProgressDialog mProgressDialog = null;
-
- private boolean mFactoryReset = false;
- private boolean mAlwaysReset = false;
- private String mReason = null;
-
- @Override
- public void onCreate() {
- super.onCreate();
-
- mStorageManager = getSystemService(StorageManager.class);
-
- mWakeLock = ((PowerManager)getSystemService(Context.POWER_SERVICE))
- .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ExternalStorageFormatter");
- mWakeLock.acquire();
- }
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- if (FORMAT_AND_FACTORY_RESET.equals(intent.getAction())) {
- mFactoryReset = true;
- }
- if (intent.getBooleanExtra(EXTRA_ALWAYS_RESET, false)) {
- mAlwaysReset = true;
- }
-
- mReason = intent.getStringExtra(Intent.EXTRA_REASON);
- StorageVolume userVol = intent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME);
- if (userVol == null) {
- Slog.w(TAG, "Missing explicit storage volume; assuming default");
- userVol = mStorageManager.getPrimaryVolume();
- }
-
- final String volumeId = userVol.getId();
-
- mProgressDialog = new ProgressDialog(this);
- mProgressDialog.setIndeterminate(true);
- mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
- mProgressDialog.setMessage(getText(R.string.progress_unmounting));
- mProgressDialog.show();
-
- new FormatTask(volumeId).start();
-
- return Service.START_REDELIVER_INTENT;
- }
-
- private class FormatTask extends Thread {
- private final String mVolumeId;
-
- public FormatTask(String volumeId) {
- mVolumeId = volumeId;
- }
-
- @Override
- public void run() {
- boolean success = false;
- try {
- mStorageManager.format(mVolumeId);
- success = true;
- } catch (Exception e) {
- Slog.w(TAG, "Failed to format", e);
- Toast.makeText(ExternalStorageFormatter.this,
- R.string.format_error, Toast.LENGTH_LONG).show();
- }
- if (success) {
- if (mFactoryReset) {
- Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
- intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- intent.putExtra(Intent.EXTRA_REASON, mReason);
- sendBroadcast(intent);
- // Intent handling is asynchronous -- assume it will happen soon.
- stopSelf();
- return;
- }
- }
- // If we didn't succeed, or aren't doing a full factory
- // reset, then it is time to remount the storage.
- if (!success && mAlwaysReset) {
- Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
- intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- intent.putExtra(Intent.EXTRA_REASON, mReason);
- sendBroadcast(intent);
- } else {
- try {
- mStorageManager.mount(mVolumeId);
- } catch (Exception e) {
- Slog.w(TAG, "Failed to mount", e);
- }
- }
- stopSelf();
- }
- }
-
- @Override
- public void onDestroy() {
- if (mProgressDialog != null) {
- mProgressDialog.dismiss();
- }
- mWakeLock.release();
- super.onDestroy();
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
-}
diff --git a/core/jni/android/graphics/MinikinUtils.cpp b/core/jni/android/graphics/MinikinUtils.cpp
index 8bdbff43d379..d1780d6526f5 100644
--- a/core/jni/android/graphics/MinikinUtils.cpp
+++ b/core/jni/android/graphics/MinikinUtils.cpp
@@ -33,7 +33,7 @@ FontStyle MinikinUtils::prepareMinikinPaint(MinikinPaint* minikinPaint, FontColl
FontStyle resolved = resolvedFace->fStyle;
/* Prepare minikin FontStyle */
- std::string lang = paint->getTextLocale();
+ const std::string& lang = paint->getTextLocale();
FontLanguage minikinLang(lang.c_str(), lang.size());
FontVariant minikinVariant = (paint->getFontVariant() == VARIANT_ELEGANT) ? VARIANT_ELEGANT
: VARIANT_COMPACT;
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index b9fd65f0116c..c66cdfec7d1c 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -74,6 +74,13 @@ static void defaultSettingsForAndroid(Paint* paint) {
paint->setTextEncoding(Paint::kGlyphID_TextEncoding);
}
+struct LocaleCacheEntry {
+ std::string javaLocale;
+ std::string languageTag;
+};
+
+static thread_local LocaleCacheEntry sSingleEntryLocaleCache;
+
class PaintGlue {
public:
enum MoveOpt {
@@ -399,10 +406,14 @@ public:
static void setTextLocale(JNIEnv* env, jobject clazz, jlong objHandle, jstring locale) {
Paint* obj = reinterpret_cast<Paint*>(objHandle);
ScopedUtfChars localeChars(env, locale);
- char langTag[ULOC_FULLNAME_CAPACITY];
- toLanguageTag(langTag, ULOC_FULLNAME_CAPACITY, localeChars.c_str());
+ if (sSingleEntryLocaleCache.javaLocale != localeChars.c_str()) {
+ sSingleEntryLocaleCache.javaLocale = localeChars.c_str();
+ char langTag[ULOC_FULLNAME_CAPACITY];
+ toLanguageTag(langTag, ULOC_FULLNAME_CAPACITY, localeChars.c_str());
+ sSingleEntryLocaleCache.languageTag = langTag;
+ }
- obj->setTextLocale(langTag);
+ obj->setTextLocale(sSingleEntryLocaleCache.languageTag);
}
static jboolean isElegantTextHeight(JNIEnv* env, jobject paint) {
@@ -1054,12 +1065,11 @@ public:
jint contextEnd, jboolean isRtl, jint offset) {
const Paint* paint = reinterpret_cast<Paint*>(paintHandle);
TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefaceHandle);
- // TODO performance: optimize JNI array access
- jchar* textArray = env->GetCharArrayElements(text, NULL);
+ jchar* textArray = (jchar*) env->GetPrimitiveArrayCritical(text, NULL);
jfloat result = doRunAdvance(paint, typeface, textArray + contextStart,
start - contextStart, end - start, contextEnd - contextStart, isRtl,
offset - contextStart);
- env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
+ env->ReleasePrimitiveArrayCritical(text, textArray, JNI_ABORT);
return result;
}
@@ -1075,12 +1085,11 @@ public:
jint contextEnd, jboolean isRtl, jfloat advance) {
const Paint* paint = reinterpret_cast<Paint*>(paintHandle);
TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefaceHandle);
- // TODO performance: optimize JNI array access
- jchar* textArray = env->GetCharArrayElements(text, NULL);
+ jchar* textArray = (jchar*) env->GetPrimitiveArrayCritical(text, NULL);
jint result = doOffsetForAdvance(paint, typeface, textArray + contextStart,
start - contextStart, end - start, contextEnd - contextStart, isRtl, advance);
result += contextStart;
- env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
+ env->ReleasePrimitiveArrayCritical(text, textArray, JNI_ABORT);
return result;
}
@@ -1147,9 +1156,9 @@ static JNINativeMethod methods[] = {
{"ascent","!()F", (void*) PaintGlue::ascent},
{"descent","!()F", (void*) PaintGlue::descent},
- {"getFontMetrics", "(Landroid/graphics/Paint$FontMetrics;)F",
+ {"getFontMetrics", "!(Landroid/graphics/Paint$FontMetrics;)F",
(void*)PaintGlue::getFontMetrics},
- {"getFontMetricsInt", "(Landroid/graphics/Paint$FontMetricsInt;)I",
+ {"getFontMetricsInt", "!(Landroid/graphics/Paint$FontMetricsInt;)I",
(void*)PaintGlue::getFontMetricsInt},
{"native_measureText","([CIII)F", (void*) PaintGlue::measureText_CIII},
{"native_measureText","(Ljava/lang/String;I)F", (void*) PaintGlue::measureText_StringI},
diff --git a/core/jni/android/graphics/Paint.h b/core/jni/android/graphics/Paint.h
index 1f82836d72bb..6df22ff0964e 100644
--- a/core/jni/android/graphics/Paint.h
+++ b/core/jni/android/graphics/Paint.h
@@ -57,7 +57,7 @@ public:
mTextLocale = textLocale;
}
- std::string getTextLocale() const {
+ const std::string& getTextLocale() const {
return mTextLocale;
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 0617b4fe71f3..ba51b23c6649 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1538,7 +1538,7 @@
<permission android:name="android.permission.WRITE_SETTINGS"
android:label="@string/permlab_writeSettings"
android:description="@string/permdesc_writeSettings"
- android:protectionLevel="dangerous" />
+ android:protectionLevel="signature|preinstalled|appop|pre23" />
<!-- @SystemApi Allows an application to modify the Google service map.
<p>Not for use by third-party applications. -->
@@ -2784,10 +2784,6 @@
</intent-filter>
</receiver>
- <service android:name="com.android.internal.os.storage.ExternalStorageFormatter"
- android:permission="android.permission.MASTER_CLEAR"
- android:exported="true" />
-
<service android:name="android.hardware.location.GeofenceHardwareService"
android:permission="android.permission.LOCATION_HARDWARE"
android:exported="false" />
diff --git a/core/res/res/layout/app_permission_item.xml b/core/res/res/layout/app_permission_item.xml
index 1eff3dce4568..383d771074e0 100644
--- a/core/res/res/layout/app_permission_item.xml
+++ b/core/res/res/layout/app_permission_item.xml
@@ -31,7 +31,8 @@
android:layout_height="24dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="8dp"
- android:scaleType="fitCenter" />
+ android:scaleType="fitCenter"
+ android:tint="@android:color/black"/>
<ImageView
android:layout_width="wrap_content"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 525ca3413450..f7b61ed5d10b 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB vir lêeroordrag"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB vir foto-oordrag"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB vir MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Gekoppel as \'n installeerder"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Gekoppel aan \'n USB-toebehoorsel"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Raak vir meer opsies."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-ontfouter gekoppel"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 533ef91ee367..e57bcac925cb 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"ዩኤስቢ ለá‹á‹­áˆ ሽáŒáŒáˆ­"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"ዩኤስቢ ለáŽá‰¶ ሽáŒáŒáˆ­"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"ዩኤስቢ ለMIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"እንደ ጫአተያይዟáˆ"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"ለUSB ተቀጥላ ተያይዟáˆ"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"ለተጨማሪ አማራጮች áŠáŠ« ያድርጉá¢"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB አድስ ተያይዟáˆ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index c7cbc713df83..ca1431e1f0f2 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1069,7 +1069,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"â€USB لنقل Ø§Ù„Ù…Ù„ÙØ§Øª"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"â€USB لنقل الصور"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"â€USB لـ MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"التوصيل كأداة تثبيت"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"â€Ø§Ù„اتصال بجهاز USB ملحق"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"المس للحصول على مزيد من الخيارات."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"â€ØªÙ… توصيل تصحيح أخطاء USB"</string>
diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml
index c21a4d838931..06cbf76bca52 100644
--- a/core/res/res/values-az-rAZ/strings.xml
+++ b/core/res/res/values-az-rAZ/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"Fayl transferi üçün USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"Foto transfer üçün USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI üçün USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Quraşdırıcı kimi qoşulub"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB aksesuara qoÅŸuldu"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"ÆlavÉ™ seçimlÉ™r üçün toxunun."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB sazlama qoÅŸuludur"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 46316ad49b84..cefc70f55245 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB за прехвърлÑне на файлове"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB за прехвърлÑне на Ñнимки"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB за MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Свързан като инÑталационна програма"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"УÑтановена е връзка Ñ Ð°ÐºÑеÑоар за USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"ДокоÑнете за още опции."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"ОтÑтранÑване на грешки през USB"</string>
diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml
index 5113414fdff9..8e9ad5f71e4a 100644
--- a/core/res/res/values-bn-rBD/strings.xml
+++ b/core/res/res/values-bn-rBD/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"ফাইল সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à§‡à¦° জনà§à¦¯ USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"ফটো সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à§‡à¦° জনà§à¦¯ USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI à¦à¦° জনà§à¦¯ USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"à¦à¦•টি ইনসà§à¦Ÿà¦²à¦¾à¦° হিসাবে সংযà§à¦•à§à¦¤ হয়েছে"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"à¦à¦•টি USB যনà§à¦¤à§à¦°à¦¾à¦‚শতে সংযà§à¦•à§à¦¤ হয়েছে"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"আরো বিকলà§à¦ªà§‡à¦° জনà§à¦¯ সà§à¦ªà¦°à§à¦¶ করà§à¦¨à§·"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ডিবাগিং সংযà§à¦•à§à¦¤ হয়েছে"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index c75459ae3677..8127699b6e31 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB per transferir fitxers"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB per transferir fotos"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB per a MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Connectat com a instal·lador"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connectat a un accessori USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Toca per veure més opcions."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuració USB activada"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index ba4de898e44c..f0cefe368c72 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1055,7 +1055,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB na přenos souborů"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB na přenos fotek"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB v režimu MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Připojeno jako instalátor"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Připojeno k perifernímu zařízení USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Klepnutím zobrazíte další možnosti."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Ladění přes USB připojeno"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 3aa9db41057e..10d8c80e776a 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB til filoverførsel"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB til billedoverførsel"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB til MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Tilsluttet som et installationsprogram"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Tilsluttet et USB-ekstraudstyr"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Tryk for at se flere muligheder."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-fejlretning er tilsluttet"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index cc4eb0970d7f..e62e08b64f97 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -227,7 +227,7 @@
<string name="user_owner_label" msgid="2804351898001038951">"Privat"</string>
<string name="managed_profile_label" msgid="6260850669674791528">"Geschäftlich"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakte"</string>
- <string name="permgroupdesc_contacts" msgid="6951499528303668046">"Auf Kontakte zuzugreifen"</string>
+ <string name="permgroupdesc_contacts" msgid="6951499528303668046">"auf Kontakte zuzugreifen"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Standort"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"Auf den Standort Ihres Geräts zugreifen"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB für die Dateiübertragung"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB für die Fotoübertragung"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB für MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Als Installationsprogramm angeschlossen"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Mit USB-Zubehör verbunden"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Für weitere Optionen tippen"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-Debugging"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 7f5d2c394c4f..4b1929074f9f 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB για μεταφοÏά αÏχείων"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB για μεταφοÏά φωτογÏαφιών"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB για MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Συνδεδεμένο ως Ï€ÏόγÏαμμα εγκατάστασης"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"ΣÏνδεση σε Î±Î¾ÎµÏƒÎ¿Ï…Î¬Ï USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Αγγίξτε για πεÏισσότεÏες επιλογές."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Συνδέθηκε ο εντοπισμός σφαλμάτων USB"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 55270f7d30ba..ee1eaff9dea4 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -354,10 +354,8 @@
<string name="permdesc_flashlight" msgid="6522284794568368310">"Allows the app to control the flashlight."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"directly call phone numbers"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"Allows the app to call phone numbers without your intervention. This may result in unexpected charges or calls. Note that this doesn\'t allow the app to call emergency numbers. Malicious apps may cost you money by making calls without your confirmation."</string>
- <!-- no translation found for permlab_accessImsCallService (3574943847181793918) -->
- <skip />
- <!-- no translation found for permdesc_accessImsCallService (8992884015198298775) -->
- <skip />
+ <string name="permlab_accessImsCallService" msgid="3574943847181793918">"access IMS call service"</string>
+ <string name="permdesc_accessImsCallService" msgid="8992884015198298775">"Allows the app to use the IMS service to make calls without your intervention."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"read phone status and identity"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Allows the app to access the phone features of the device. This permission allows the app to determine the phone number and device IDs, whether a call is active and the remote number connected by a call."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"prevent tablet from sleeping"</string>
@@ -1041,7 +1039,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB for file transfer"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB for photo transfer"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB for MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Connected as an installer"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connected to a USB accessory"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Touch for more options."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 55270f7d30ba..ee1eaff9dea4 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -354,10 +354,8 @@
<string name="permdesc_flashlight" msgid="6522284794568368310">"Allows the app to control the flashlight."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"directly call phone numbers"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"Allows the app to call phone numbers without your intervention. This may result in unexpected charges or calls. Note that this doesn\'t allow the app to call emergency numbers. Malicious apps may cost you money by making calls without your confirmation."</string>
- <!-- no translation found for permlab_accessImsCallService (3574943847181793918) -->
- <skip />
- <!-- no translation found for permdesc_accessImsCallService (8992884015198298775) -->
- <skip />
+ <string name="permlab_accessImsCallService" msgid="3574943847181793918">"access IMS call service"</string>
+ <string name="permdesc_accessImsCallService" msgid="8992884015198298775">"Allows the app to use the IMS service to make calls without your intervention."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"read phone status and identity"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Allows the app to access the phone features of the device. This permission allows the app to determine the phone number and device IDs, whether a call is active and the remote number connected by a call."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"prevent tablet from sleeping"</string>
@@ -1041,7 +1039,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB for file transfer"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB for photo transfer"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB for MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Connected as an installer"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connected to a USB accessory"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Touch for more options."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 55270f7d30ba..ee1eaff9dea4 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -354,10 +354,8 @@
<string name="permdesc_flashlight" msgid="6522284794568368310">"Allows the app to control the flashlight."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"directly call phone numbers"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"Allows the app to call phone numbers without your intervention. This may result in unexpected charges or calls. Note that this doesn\'t allow the app to call emergency numbers. Malicious apps may cost you money by making calls without your confirmation."</string>
- <!-- no translation found for permlab_accessImsCallService (3574943847181793918) -->
- <skip />
- <!-- no translation found for permdesc_accessImsCallService (8992884015198298775) -->
- <skip />
+ <string name="permlab_accessImsCallService" msgid="3574943847181793918">"access IMS call service"</string>
+ <string name="permdesc_accessImsCallService" msgid="8992884015198298775">"Allows the app to use the IMS service to make calls without your intervention."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"read phone status and identity"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Allows the app to access the phone features of the device. This permission allows the app to determine the phone number and device IDs, whether a call is active and the remote number connected by a call."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"prevent tablet from sleeping"</string>
@@ -1041,7 +1039,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB for file transfer"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB for photo transfer"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB for MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Connected as an installer"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connected to a USB accessory"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Touch for more options."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index a8f3fbb16b46..dea510222c68 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB para transferir archivos"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB para transferir fotos"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB para MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Conectado como un instalador"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectado a un accesorio USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Toca para ver más opciones."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración por USB conectada"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index f1e74903545e..fb4997ad2d26 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB para transferir archivos"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB para transferir fotos"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB para MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Conectado como instalador"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectado a un accesorio USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Toca para obtener más opciones"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración USB habilitada"</string>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index 132379be27c8..39aacefdd083 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB failide edastamiseks"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB fotode edastamiseks"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB MIDI jaoks"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Ühendatud installijana"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Ühendatud USB-lisaseadmega"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Puudutage rohkemate valikute kuvamiseks."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-silumine ühendatud"</string>
diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml
index e482f57991fb..ddbfaeef93a9 100644
--- a/core/res/res/values-eu-rES/strings.xml
+++ b/core/res/res/values-eu-rES/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"Fitxategiak transferitzeko USBa"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"Argazkiak transferitzeko USBa"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI modurako USBa"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Instalatzaile gisa konektatua"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB osagarri batera konektatuta"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Ukitu aukera gehiago ikusteko."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB arazketa konektatuta"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index a01a5bacd855..0ab425e531fe 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"â€USB برای انتقال ÙØ§ÛŒÙ„"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"â€USB برای انتقال عکس"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"â€USB برای MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"متصل شده به‌عنوان نصب کننده"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"â€Ø¨Ù‡ یک وسیله جانبی USB وصل شده است"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"برای گزینه‌های بیشتر لمس کنید."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"â€Ø§Ø´Ú©Ø§Ù„‌زدایی USB متصل شد"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 5379e9f19d37..cd908bb6172e 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB on tiedonsiirtotilassa"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB on kuvansiirtotilassa"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB on MIDI-tilassa"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Kytketty asennusohjelmana"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Liitetty USB-laitteeseen"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Lisää vaihtoehtoja koskettamalla"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-vianetsintä yhdistetty"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 4cce5409033f..24241eb0e953 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB pour le transfert de fichiers"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB pour le transfert de photos"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB pour MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Connecté en tant que programme d\'installation"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connecté à un accessoire USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Touchez pour afficher plus d\'options."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Débogage USB connecté"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 097939380b77..760ae23e104c 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB pour le transfert de fichiers"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB pour le transfert de photos"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB en mode MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Connecté en tant que programme d\'installation"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connecté à un accessoire USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Appuyez pour afficher plus d\'options"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Débogage USB activé"</string>
diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml
index f6340ef2ca44..0267808ded44 100644
--- a/core/res/res/values-gl-rES/strings.xml
+++ b/core/res/res/values-gl-rES/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB para transferencia de ficheiros"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB para transferencia de fotos"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB para MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Conectado como instalador"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectado a un accesorio USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Toca para ver máis opcións."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración USB conectada"</string>
diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml
index c5f1f3ce6dfb..99b3e779515e 100644
--- a/core/res/res/values-gu-rIN/strings.xml
+++ b/core/res/res/values-gu-rIN/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"ફાઇલ ટà«àª°àª¾àª¨à«àª¸àª«àª° માટે USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"ફોટા ટà«àª°àª¾àª¨à«àª¸àª«àª° માટે USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI માટે USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"ઇનà«àª¸à«àªŸà«‹àª²àª° તરીકે કનેકà«àªŸ કરà«àª¯à«àª‚"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB àªàª•à«àª¸à«‡àª¸àª°à«€àª¥à«€ કનેકà«àªŸ થયાં"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"વધૠવિકલà«àªªà«‹ માટે ટચ કરો."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ડીબગિંગ કનેકà«àªŸ થયà«àª‚."</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 97ba0327f103..678085cd7951 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"फ़ाइल सà¥â€à¤¥à¤¾à¤¨à¤¾à¤‚तरण के लिठUSB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"फ़ोटो सà¥â€à¤¥à¤¾à¤¨à¤¾à¤‚तरण के लिठUSB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI के लिठUSB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"किसी इंसà¥â€à¤Ÿà¥‰à¤²à¤° के रूप में कनेकà¥â€à¤Ÿ किया गया"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB सहायक सामगà¥à¤°à¥€ से कनेकà¥â€à¤Ÿ किâ€à¤¯à¤¾ गया"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"और विकलà¥à¤ªà¥‹à¤‚ के लिठसà¥à¤ªà¤°à¥à¤¶ करें."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB डीबग कनेकà¥à¤Ÿ किया गया"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index d91170a59c19..b58aba0ff17a 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1048,7 +1048,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB za prijenos datoteka"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB za prijenos fotografija"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB za MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Spojen kao instalacijski program"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Spojen na USB pribor"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Dodirnite za više opcija."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"PrikljuÄen je alat za uklanjanje pogreÅ¡aka USB-om"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 0005a756f053..2a230ff224da 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB fájlátvitelhez"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB fotóátvitelhez"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB MIDI-hez"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Csatlakoztatva telepítőként"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Csatlakoztatva egy USB-kiegészítőhöz"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Érintse meg a további lehetőségekhez."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB hibakereső csatlakoztatva"</string>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index 6402e3190c4e..9ad94727e6f4 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"Õ–Õ¡ÕµÕ¬Õ¥Ö€Õ« ÖƒÕ¸Õ­Õ¡Õ¶ÖÕ´Õ¡Õ¶ USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"Ô¼Õ¸Ö‚Õ½Õ¡Õ¶Õ¯Õ¡Ö€Õ¶Õ¥Ö€Õ« ÖƒÕ¸Õ­Õ¡Õ¶ÖÕ´Õ¡Õ¶ USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI-Õ« USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Õ„Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§ Õ¸Ö€ÕºÕ¥Õ½ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ«Õ¹"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Ô¿Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§ USB Õ¬Ö€Õ¡Õ½Õ¡Ö€Ö„Õ«"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Õ€ÕºÕ¥Ö„Õ Õ¬Ö€Õ¡ÖÕ¸Ö‚ÖÕ«Õ¹ Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€:"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB Õ¾Ö€Õ«ÕºÕ¡Õ¦Õ¥Ö€Õ®Õ¸Ö‚Õ´Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 0c8b3ff46503..7406508688de 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB untuk transfer file"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB untuk transfer foto"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB untuk MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Tersambung sebagai pemasang"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Tersambung ke aksesori USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Sentuh untuk opsi lainnya."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Debugging USB terhubung"</string>
diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml
index d90ad2b8cdf1..c84c19e0bcf2 100644
--- a/core/res/res/values-is-rIS/strings.xml
+++ b/core/res/res/values-is-rIS/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB fyrir skráaflutning"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB fyrir myndaflutning"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB fyrir MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Tengt sem uppsetningarforrit"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Tengt við USB-aukabúnað"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Snertu til að fá fleiri valkosti."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-villuleit tengd"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 230541411890..75928a552dda 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB per il trasferimento di file"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB per il trasferimento di foto"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB per la modalità MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Collegato come installer"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Collegato a un accessorio USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Tocca per visualizzare più opzioni."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Debug USB collegato"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 734f7e7f22c5..f40ae4067594 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1055,7 +1055,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"â€USB להעברת קבצי×"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"â€USB להעברת תמונות"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"â€USB ל-MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"מחובר כמתקין"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"â€×ž×—ובר ל×ביזר USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"×’×¢ להצגת עוד ×פשרויות."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"â€× ×™×§×•×™ ב××’×™× ×©×œ USB מחובר"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index c305d3134a04..5b247d6324d3 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USBをファイル転é€ã«ä½¿ç”¨"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USBを写真転é€ã«ä½¿ç”¨"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USBã‚’MIDIã«ä½¿ç”¨"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"インストーラã¨ã—ã¦æŽ¥ç¶š"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USBアクセサリを接続ã—ã¾ã—ãŸ"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"タップã™ã‚‹ã¨ãã®ä»–ã®ã‚ªãƒ—ションãŒè¡¨ç¤ºã•れã¾ã™ã€‚"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USBデãƒãƒƒã‚°ãŒæŽ¥ç¶šã•れã¾ã—ãŸ"</string>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index 5cf85668ee28..c754738705b2 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒ“áƒáƒªáƒ”მისთვის"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB ფáƒáƒ¢áƒáƒ”ბის გáƒáƒ“áƒáƒªáƒ”მისთვის"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB MIDI-სთვის"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"დáƒáƒ™áƒáƒ•შირებულირრáƒáƒ’áƒáƒ áƒª დáƒáƒ›áƒ§áƒ”ნებელი"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"დáƒáƒ™áƒáƒ•შირებულირUSB áƒáƒ¥áƒ¡áƒ”სუáƒáƒ áƒ—áƒáƒœ"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"შეეხეთ დáƒáƒ›áƒáƒ¢áƒ”ბითი პáƒáƒ áƒáƒ›áƒ”ტრებისთვის."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB გáƒáƒ›áƒáƒ áƒ—ვრშეერთებულიáƒ"</string>
diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml
index 0fc111b64399..4bce4f347dd1 100644
--- a/core/res/res/values-kk-rKZ/strings.xml
+++ b/core/res/res/values-kk-rKZ/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"Файлды таÑымалдауға арналған USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"ФотоÑуретті таÑымалдауға арналған USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI режиміне арналған USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Орнату құрылғыÑына жалғанған"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB жабдығына қоÑылған"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"ҚоÑымша параметрлер үшін түртіңіз."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB жөндеу қоÑылған"</string>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index 0d95bee1ad2b..178bf6f99d48 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -1043,7 +1043,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB សម្រាប់ការផ្ទáŸážšáž¯áž€ážŸáž¶ážš"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB សម្រាប់ការផ្ទáŸážšážšáž¼áž”ážáž"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB សម្រាប់ MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"បាន​ភ្ជាប់​ជា​កម្មវិធី​ដំឡើង"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"បាន​ភ្ជាប់​ឧបករណáŸâ€‹áž™áž¼áž¢áŸážŸáž”៊ី"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"ប៉ះដើម្បីបានជម្រើសážáŸ‚មទៀážáŸ”"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"បាន​ភ្ជាប់​ការ​កែ​កំហុស​យូអáŸážŸáž”៊ី"</string>
diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml
index 57dd3cc763f9..2ea1e5e80ce9 100644
--- a/core/res/res/values-kn-rIN/strings.xml
+++ b/core/res/res/values-kn-rIN/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"ಫೈಲà³â€Œ ವರà³à²—ಾವಣೆಗೆ USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"ಫೋಟೋ ವರà³à²—ಾವಣೆಗೆ USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI ಗೆ USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"ಸà³à²¥à²¾à²ªà²•ದಂತೆ ಸಂಪರà³à²•ಗೊಂಡಿದೆ"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB ಪರಿಕರಕà³à²•ೆ ಸಂಪರà³à²•ಗೊಂಡಿದೆ"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"ಹೆಚà³à²šà²¿à²¨Â à²†à²¯à³à²•ೆಗಳಿಗೆ ಸà³à²ªà²°à³à²¶à²¿à²¸à²¿."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ಡೀಬಗಿಂಗà³â€Œâ€Œ ಸಂಪರà³à²•"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 31113fb917f2..c09490c84b23 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"íŒŒì¼ ì „ì†¡ìš© USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"사진 전송용 USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDIìš© USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"설치 프로그램으로 ì—°ê²°ë¨"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB ì•¡ì„¸ì„œë¦¬ì— ì—°ê²°ë¨"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"ë” ë§Žì€ ì˜µì…˜ì„ í™•ì¸í•˜ë ¤ë©´ 터치하세요."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB 디버깅 ì—°ê²°ë¨"</string>
diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml
index 4637db241124..c264f59e4734 100644
--- a/core/res/res/values-ky-rKG/strings.xml
+++ b/core/res/res/values-ky-rKG/strings.xml
@@ -1384,8 +1384,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"Файл өткөрүү үчүн USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"Сүрөт өткөрүү үчүн USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI үчүн USB"</string>
- <!-- no translation found for usb_cd_installer_notification_title (6774712827892090754) -->
- <skip />
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB акÑеÑÑуарга байланышты"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Көбүрөөк параметр үчүн тийип коюңуз."</string>
<!-- no translation found for adb_active_notification_title (6729044778949189918) -->
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index 2bc290863e48..b38f9155246f 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB ສຳ​ລັບ​àºàº²àº™â€‹à»‚ອ​ນ​ໄຟ​ລ໌"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB ສຳ​ລັບ​àºàº²àº™â€‹à»‚ອນ​ໄຟ​ລ໌"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB ສຳ​ລັບ MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"ເຊື່ອມຕà»à»ˆà»ƒàº™àº™àº²àº¡àº•ົວຕິດຕັ້ງ"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"ເຊື່ອມຕà»à»ˆàºàº±àºšàº­àº¸àº›àº°àºàº­àº™à»€àºªàºµàº¡ USB à»àº¥à»‰àº§"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"ສຳ​ພັດ​ສຳ​ລັບ​ທາງ​ເລືອàºâ€‹à»€àºžàºµà»ˆàº¡â€‹à»€àº•ີມ."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"ເຊື່ອມຕà»à»ˆàºàº²àº™àº”ີບັ໊àºàºœà»ˆàº²àº™ USB à»àº¥à»‰àº§"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index a9b405040cf6..e4663a7a6082 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1055,7 +1055,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB (failų perkėlimas)"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB (nuotraukų perkėlimas)"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB (MIDI)"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Prij. kaip diegimo programa"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Prijungta prie USB priedo"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Palieskite, kad bÅ«tų rodoma daugiau parinkÄių."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB derinimas prijungtas"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 3c1b78abea6b..22c4b07e01e1 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1048,7 +1048,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB savienojums failu pÄrsÅ«tīšanai"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB savienojums fotoattÄ“lu pÄrsÅ«tīšanai"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB savienojums MIDI režīmÄ"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Pievienots kÄ instalēšanas programma"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Ir izveidots savienojums ar USB piederumu."</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Citas opcijas"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB atkļūdošana ir pievienota."</string>
diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml
index 2582ea319399..ed2e58bb21d0 100644
--- a/core/res/res/values-mk-rMK/strings.xml
+++ b/core/res/res/values-mk-rMK/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"УСБ за Ð¿Ñ€ÐµÐ½Ð¾Ñ Ð½Ð° датотеки"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"УСБ за Ð¿Ñ€ÐµÐ½Ð¾Ñ Ð½Ð° фотографии"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"УСБ за МИДИ"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Поврзан како инÑталатор"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Поврзан Ñо УСБ додаток"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Допри за повеќе опции."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Поврзано е отÑтранување грешки преку УСБ"</string>
diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml
index 7a21d87dd13d..7cdabc53c9c7 100644
--- a/core/res/res/values-ml-rIN/strings.xml
+++ b/core/res/res/values-ml-rIN/strings.xml
@@ -123,7 +123,7 @@
<string name="roamingText11" msgid="4154476854426920970">"റോമിംഗൠബാനർ ഓണാകàµà´•àµà´•"</string>
<string name="roamingText12" msgid="1189071119992726320">"റോമിംഗൠബാനർ ഓഫാകàµà´•àµà´•"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"സേവനതàµà´¤à´¿à´¨à´¾à´¯à´¿ തിരയàµà´¨àµà´¨àµ"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi കോളിംഗàµ"</string>
+ <string name="wfcRegErrorTitle" msgid="2301376280632110664">"വൈഫൈ കോളിംഗàµ"</string>
<string-array name="wfcOperatorErrorAlertMessages">
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
@@ -131,9 +131,9 @@
<string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string>
<string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"à´“à´«àµ"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ"</string>
+ <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"വൈഫൈ തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"സെലàµà´²àµà´²à´¾àµ¼ തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ"</string>
- <string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi മാതàµà´°à´‚"</string>
+ <string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"വൈഫൈ മാതàµà´°à´‚"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: കൈമാറിയിലàµà´²"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
<string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="TIME_DELAY">{2}</xliff:g> നിമിഷതàµà´¤à´¿à´¨àµà´¶àµ‡à´·à´‚ <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -161,10 +161,10 @@
<string name="contentServiceSync" msgid="8353523060269335667">"സമനàµà´µà´¯à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•"</string>
<string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"സമനàµà´µà´¯à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•"</string>
<string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"വളരെയധികം <xliff:g id="CONTENT_TYPE">%s</xliff:g> ഇലàµà´²à´¾à´¤à´¾à´•àµà´•à´²àµà´•ൾ."</string>
- <string name="low_memory" product="tablet" msgid="6494019234102154896">"ടാബàµâ€Œà´²àµ†à´±àµà´±àµ സംഭരണം à´•à´´à´¿à´žàµà´žàµ. ഇടം ശൂനàµà´¯à´®à´¾à´•àµà´•ാൻ à´šà´¿à´² ഫയലàµà´•ൾ ഇലàµà´²à´¾à´¤à´¾à´•àµà´•àµà´•."</string>
- <string name="low_memory" product="watch" msgid="4415914910770005166">"വാചàµà´šà´¿à´²àµ† സംഭരണം നിറഞàµà´žàµ. ഇടം ശൂനàµà´¯à´®à´¾à´•àµà´•ാൻ à´•àµà´±à´šàµà´šàµ ഫയലàµà´•ൾ ഇലàµà´²à´¾à´¤à´¾à´•àµà´•àµà´•."</string>
- <string name="low_memory" product="tv" msgid="516619861191025923">"ടിവി സംഭരണം നിറഞàµà´žàµ. ഇടം ശൂനàµà´¯à´®à´¾à´•àµà´•ാൻ à´•àµà´±à´šàµà´šàµ ഫയലàµà´•ൾ ഇലàµà´²à´¾à´¤à´¾à´•àµà´•àµà´•."</string>
- <string name="low_memory" product="default" msgid="3475999286680000541">"ഫോൺ സംഭരണം à´•à´´à´¿à´žàµà´žàµ. ഇടം ശൂനàµà´¯à´®à´¾à´•àµà´•ാൻ à´šà´¿à´² ഫയലàµà´•ൾ ഇലàµà´²à´¾à´¤à´¾à´•àµà´•àµà´•."</string>
+ <string name="low_memory" product="tablet" msgid="6494019234102154896">"ടാബàµâ€Œà´²àµ†à´±àµà´±àµ à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ à´•à´´à´¿à´žàµà´žàµ. ഇടം ശൂനàµà´¯à´®à´¾à´•àµà´•ാൻ à´šà´¿à´² ഫയലàµà´•ൾ ഇലàµà´²à´¾à´¤à´¾à´•àµà´•àµà´•."</string>
+ <string name="low_memory" product="watch" msgid="4415914910770005166">"വാചàµà´šà´¿à´²àµ† à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ നിറഞàµà´žàµ. ഇടം ശൂനàµà´¯à´®à´¾à´•àµà´•ാൻ à´•àµà´±à´šàµà´šàµ ഫയലàµà´•ൾ ഇലàµà´²à´¾à´¤à´¾à´•àµà´•àµà´•."</string>
+ <string name="low_memory" product="tv" msgid="516619861191025923">"ടിവി à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ നിറഞàµà´žàµ. ഇടം ശൂനàµà´¯à´®à´¾à´•àµà´•ാൻ à´•àµà´±à´šàµà´šàµ ഫയലàµà´•ൾ ഇലàµà´²à´¾à´¤à´¾à´•àµà´•àµà´•."</string>
+ <string name="low_memory" product="default" msgid="3475999286680000541">"ഫോൺ à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ à´•à´´à´¿à´žàµà´žàµ. ഇടം ശൂനàµà´¯à´®à´¾à´•àµà´•ാൻ à´šà´¿à´² ഫയലàµà´•ൾ ഇലàµà´²à´¾à´¤à´¾à´•àµà´•àµà´•."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ൠനിരീകàµà´·à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿà´¾à´‚"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"à´…à´œàµà´žà´¾à´¤ മൂനàµà´¨à´¾à´‚ à´•à´•àµà´·à´¿ നിരീകàµà´·à´¿à´•àµà´•ാം"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"നിങàµà´™à´³àµà´Ÿàµ† ഔദàµà´¯àµ‹à´—à´¿à´• à´ªàµà´°àµŠà´«àµˆàµ½ à´…à´¡àµâ€Œà´®à´¿à´¨à´¿à´¸àµâ€Œà´Ÿàµà´°àµ‡à´±àµà´±àµ¼"</string>
@@ -234,7 +234,7 @@
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"നിങàµà´™à´³àµà´Ÿàµ† കലണàµà´Ÿàµ¼ ആകàµâ€Œà´¸à´¸àµà´¸àµ ചെയàµà´¯àµà´•"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS സനàµà´¦àµ‡à´¶à´™àµà´™àµ¾ അയയàµâ€Œà´•àµà´•àµà´•à´¯àµà´‚ കാണàµà´•à´¯àµà´‚ ചെയàµà´¯àµà´•"</string>
- <string name="permgrouplab_storage" msgid="1971118770546336966">"സംഭരണം"</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"നിങàµà´™à´³àµà´Ÿàµ† ഉപകരണതàµà´¤à´¿à´²àµ† ഫോടàµà´Ÿàµ‹à´•à´³àµà´‚ മീഡിയയàµà´‚ ഫയലàµà´•à´³àµà´‚ ആകàµà´¸à´¸àµ ചെയàµà´¯àµà´•"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"മൈകàµà´°àµ‹à´«àµ‹à´£àµâ€"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ഓഡിയോ റെകàµà´•ോർഡൠചെയàµà´¯àµà´•"</string>
@@ -350,14 +350,12 @@
<string name="permdesc_camera" msgid="8497216524735535009">"à´•àµà´¯à´¾à´®à´± ഉപയോഗിചàµà´šàµ à´šà´¿à´¤àµà´°à´™àµà´™à´³àµà´‚ വീഡിയോകളàµà´‚ à´Žà´Ÿàµà´•àµà´•ാൻ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ. നിങàµà´™à´³àµà´Ÿàµ† à´¸àµà´¥à´¿à´°àµ€à´•രണമിലàµà´²à´¾à´¤àµ† à´à´¤àµà´¸à´®à´¯à´¤àµà´¤àµà´‚ à´•àµà´¯à´¾à´®à´± ഉപയോഗികàµà´•ാൻ à´ˆ à´…à´¨àµà´®à´¤à´¿ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ."</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"വൈബàµà´°àµ‡à´±àµà´±àµà´šàµ†à´¯àµà´¯àµ½ നിയനàµà´¤àµà´°à´¿à´•àµà´•àµà´•"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"വൈബàµà´°àµ‡à´±àµà´±àµ¼ നിയനàµà´¤àµà´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ."</string>
- <string name="permlab_flashlight" msgid="2155920810121984215">"à´«àµà´²à´¾à´·àµà´²àµˆà´±àµà´±àµ നിയനàµà´¤àµà´°à´¿à´•àµà´•àµà´•"</string>
+ <string name="permlab_flashlight" msgid="2155920810121984215">"ടോർചàµà´šàµ നിയനàµà´¤àµà´°à´¿à´•àµà´•àµà´•"</string>
<string name="permdesc_flashlight" msgid="6522284794568368310">"à´«àµà´²à´¾à´·àµà´²àµˆà´±àµà´±à´¿à´¨àµ† നിയനàµà´¤àµà´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"ഫോൺ നമàµà´ªà´±àµà´•ളിലേകàµà´•ൠനേരിടàµà´Ÿàµ വിളികàµà´•àµà´•"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"നിങàµà´™à´³àµà´Ÿàµ† ഇടപെടൽ ഇലàµà´²à´¾à´¤àµ† ഫോൺ നമàµà´ªà´±àµà´•ളിലേകàµà´•ൠകോൾ ചെയàµà´¯à´¾àµ» à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ. ഇതൠഅപàµà´°à´¤àµ€à´•àµà´·à´¿à´¤ നിരകàµà´•àµà´•ൾകàµà´•ോ കോളàµà´•ൾകàµà´•ോ ഇടയാകàµà´•ാം. ഇതൠഅടിയനàµà´¤à´° നമàµà´ªà´±àµà´•ളിലേകàµà´•ൠവിളികàµà´•ാൻ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•à´¿à´²àµà´²àµ†à´¨àµà´¨ കാരàµà´¯à´‚ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´•. à´•àµà´·àµà´¦àµà´°à´•രമായ à´…à´ªàµà´²à´¿à´•àµà´•േഷനàµà´•ൾ നിങàµà´™à´³àµà´Ÿàµ† à´¸àµà´¥à´¿à´°àµ€à´•രണമിലàµà´²à´¾à´¤àµ† കോളàµà´•ൾ ചെയàµà´¯àµà´¨àµà´¨à´¤àµ പണചàµà´šàµ†à´²à´µà´¿à´¨à´¿à´Ÿà´¯à´¾à´•àµà´•ാം."</string>
- <!-- no translation found for permlab_accessImsCallService (3574943847181793918) -->
- <skip />
- <!-- no translation found for permdesc_accessImsCallService (8992884015198298775) -->
- <skip />
+ <string name="permlab_accessImsCallService" msgid="3574943847181793918">"IMS കോൾ സേവനം ആകàµà´¸à´¸àµ ചെയàµà´¯àµà´•"</string>
+ <string name="permdesc_accessImsCallService" msgid="8992884015198298775">"നിങàµà´™à´³àµà´Ÿàµ† ഇടപെടൽ ഇലàµà´²à´¾à´¤àµ† കോളàµà´•ൾ ചെയàµà´¯à´¾àµ» IMS സേവനം ഉപയോഗികàµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ ആപàµà´ªà´¿à´¨àµ† à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"ഫോൺ നിലയàµà´‚ à´à´¡à´¨àµà´±à´¿à´±àµà´±à´¿à´¯àµà´‚ റീഡàµà´šàµ†à´¯àµà´¯àµà´•"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"ഉപകരണതàµà´¤à´¿à´¨àµà´±àµ† ഫോൺ സവിശേഷതകൾ ആകàµâ€Œà´¸à´¸àµà´¸àµà´šàµ†à´¯àµà´¯à´¾àµ» à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ. à´ˆ à´…à´¨àµà´®à´¤à´¿ ഫോൺ നമàµà´ªàµ¼, ഉപകരണ à´à´¡à´¿à´•ൾ, ഒരൠകോൾ സജീവമാണോയെനàµà´¨à´¤àµ, ഒരൠകോൾ കണകàµà´±àµà´±àµà´šàµ†à´¯àµâ€Œà´¤ വിദൂര നമàµà´ªàµ¼ à´Žà´¨àµà´¨à´¿à´µ നിർണàµà´£à´¯à´¿à´•àµà´•ാൻ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"à´¸àµà´·àµà´ªàµâ€Œà´¤à´¿à´¯à´¿à´²à´¾à´•àµà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµ ടാബàµâ€Œà´²àµ†à´±àµà´±à´¿à´¨àµ† തടയàµà´•"</string>
@@ -390,14 +388,14 @@
<string name="permdesc_changeNetworkState" msgid="6789123912476416214">"നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ൠകണകàµâ€Œà´±àµà´±à´¿â€Œà´µà´¿à´±àµà´±à´¿à´¯àµà´Ÿàµ† നില മാറàµà´±àµà´¨àµà´¨à´¤à´¿à´¨àµ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"ടെതർ ചെയàµâ€Œà´¤ കണകàµâ€Œà´±àµà´±à´¿à´µà´¿à´±àµà´±à´¿ മാറàµà´±àµà´•"</string>
<string name="permdesc_changeTetherState" msgid="1524441344412319780">"ടെതർചെയàµâ€Œà´¤ നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ൠകണകàµâ€Œà´±àµà´±à´¿à´µà´¿à´±àµà´±à´¿à´¯àµà´Ÿàµ† നിലമാറàµà´±àµà´¨àµà´¨à´¤à´¿à´¨àµ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ."</string>
- <string name="permlab_accessWifiState" msgid="5202012949247040011">"Wi-Fi കണകàµà´·à´¨àµà´•ൾ കാണàµà´•"</string>
- <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Wi-Fi à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´•àµà´·à´®à´®à´¾à´£àµ‹ à´Žà´¨àµà´¨à´¤àµà´‚ കണകàµà´±àµà´±àµà´šàµ†à´¯àµâ€Œà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ Wi-Fi ഉപകരണങàµà´™à´³àµà´Ÿàµ† പേരàµà´‚ പോലàµà´³àµà´³, Wi-Fi നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ിംഗിനെകàµà´•àµà´±à´¿à´šàµà´šàµà´³àµà´³ വിവരം കാണാൻ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ."</string>
- <string name="permlab_changeWifiState" msgid="6550641188749128035">"Wi-Fi കണകàµà´±àµà´±àµà´šàµ†à´¯àµà´¯àµà´•, അതിൽ നിനàµà´¨àµà´‚ വിചàµà´›àµ‡à´¦à´¿à´•àµà´•àµà´•"</string>
- <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Wi-Fi ആകàµâ€Œà´¸à´¸àµà´¸àµ പോയിനàµà´±àµà´•ളിലേകàµà´•ൠകണകàµà´±àµà´±àµà´šàµ†à´¯àµà´¯à´¾à´¨àµà´‚ അതിൽ നിനàµà´¨àµ വിചàµà´›àµ‡à´¦à´¿à´•àµà´•ാനàµà´‚ Wi-Fi നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•àµà´•ൾകàµà´•ായി ഉപകരണ കോൺഫിഗറേഷൻ മാറàµà´±à´¾à´¨àµà´‚ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ."</string>
- <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi മൾടàµà´Ÿà´¿à´•ാസàµâ€Œà´±àµà´±àµ റിസപàµâ€Œà´·àµ» à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´•"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"മൾടàµà´Ÿà´¿à´•ാസàµâ€Œà´±àµà´±àµ വിലാസങàµà´™àµ¾ ഉപയോഗിചàµà´šàµ നിങàµà´™à´³àµà´Ÿàµ† à´Ÿà´¬àµâ€Œà´²àµ†à´±àµà´±à´¿à´²àµ‡à´•àµà´•ൠമാതàµà´°à´®à´²àµà´²à´¾à´¤àµ†, ഒരൠWi-Fi നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ിലെ à´Žà´²àµà´²à´¾ ഉപകരണങàµà´™à´³à´¿à´²àµ‡à´•àµà´•àµà´‚ അയചàµà´š പായàµâ€Œà´•àµà´•à´±àµà´±àµà´•ൾ നേടാൻ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ. ഇതൠമൾടàµà´Ÿà´¿à´•ാസàµà´±àµà´±àµ ഇതര മോഡിനേകàµà´•ാൾ à´…à´§à´¿à´•à´‚ പവർ ഉപയോഗികàµà´•àµà´¨àµà´¨àµ."</string>
- <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"നിങàµà´™à´³àµà´Ÿàµ† ടിവി‌യàµâ€Œà´•àµà´•ൠമാതàµà´°à´®à´¾à´¯à´¿à´Ÿàµà´Ÿà´²àµà´²à´¾à´¤àµ†, മൾടàµà´Ÿà´¿à´•ാസàµâ€Œà´±àµà´±àµ വിലാസങàµà´™àµ¾ ഉപയോഗിചàµà´šàµ, ഒരൠWi-Fi നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•à´¿à´²àµà´³àµà´³ à´Žà´²àµà´²à´¾ ഉപകരണങàµà´™àµ¾à´•àµà´•àµà´‚ അയചàµà´š പാകàµà´•à´±àµà´±àµà´•ൾ à´¸àµà´µàµ€à´•à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ. ഇതൠമൾടàµà´Ÿà´¿à´•ാസàµâ€Œà´±àµà´±àµ à´…à´²àµà´²à´¾à´¤àµà´¤ മോഡിനെകàµà´•ാൾ കൂടàµà´¤àµ½ പവർ ഉപയോഗികàµà´•àµà´¨àµà´¨àµ."</string>
- <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"മൾടàµà´Ÿà´¿à´•ാസàµâ€Œà´±àµà´±àµ വിലാസങàµà´™àµ¾ ഉപയോഗിചàµà´šàµ നിങàµà´™à´³àµà´Ÿàµ† ഫോണിലേകàµà´•ൠമാതàµà´°à´®à´²àµà´²à´¾à´¤àµ†, ഒരൠWi-Fi നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ിലെ à´Žà´²àµà´²à´¾ ഉപകരണങàµà´™à´³à´¿à´²àµ‡à´•àµà´•àµà´‚ അയചàµà´š പായàµâ€Œà´•àµà´•à´±àµà´±àµà´•ൾ നേടാൻ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ. ഇതൠമൾടàµà´Ÿà´¿à´•ാസàµà´±àµà´±àµ ഇതര മോഡിനേകàµà´•ാൾ à´…à´§à´¿à´•à´‚ പവർ ഉപയോഗികàµà´•àµà´¨àµà´¨àµ."</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"വൈഫൈ കണകàµà´·à´¨àµà´•ൾ കാണàµà´•"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"വൈഫൈ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´•àµà´·à´®à´®à´¾à´£àµ‹ à´Žà´¨àµà´¨à´¤àµà´‚ കണകàµà´±àµà´±àµà´šàµ†à´¯àµâ€Œà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ വൈഫൈ ഉപകരണങàµà´™à´³àµà´Ÿàµ† പേരàµà´‚ പോലàµà´³àµà´³, വൈഫൈ നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ിംഗിനെകàµà´•àµà´±à´¿à´šàµà´šàµà´³àµà´³ വിവരം കാണാൻ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ."</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"വൈഫൈ കണകàµà´±àµà´±àµà´šàµ†à´¯àµà´¯àµà´•, അതിൽ നിനàµà´¨àµà´‚ വിചàµà´›àµ‡à´¦à´¿à´•àµà´•àµà´•"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"വൈഫൈ ആകàµâ€Œà´¸à´¸àµà´¸àµ പോയിനàµà´±àµà´•ളിലേകàµà´•ൠകണകàµà´±àµà´±àµà´šàµ†à´¯àµà´¯à´¾à´¨àµà´‚ അതിൽ നിനàµà´¨àµ വിചàµà´›àµ‡à´¦à´¿à´•àµà´•ാനàµà´‚ വൈഫൈ നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•àµà´•ൾകàµà´•ായി ഉപകരണ കോൺഫിഗറേഷൻ മാറàµà´±à´¾à´¨àµà´‚ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ."</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"വൈഫൈ മൾടàµà´Ÿà´¿à´•ാസàµâ€Œà´±àµà´±àµ റിസപàµâ€Œà´·àµ» à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´•"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"മൾടàµà´Ÿà´¿à´•ാസàµâ€Œà´±àµà´±àµ വിലാസങàµà´™àµ¾ ഉപയോഗിചàµà´šàµ നിങàµà´™à´³àµà´Ÿàµ† à´Ÿà´¬àµâ€Œà´²àµ†à´±àµà´±à´¿à´²àµ‡à´•àµà´•ൠമാതàµà´°à´®à´²àµà´²à´¾à´¤àµ†, ഒരൠവൈഫൈ നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ിലെ à´Žà´²àµà´²à´¾ ഉപകരണങàµà´™à´³à´¿à´²àµ‡à´•àµà´•àµà´‚ അയചàµà´š പായàµâ€Œà´•àµà´•à´±àµà´±àµà´•ൾ നേടാൻ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ. ഇതൠമൾടàµà´Ÿà´¿à´•ാസàµà´±àµà´±àµ ഇതര മോഡിനേകàµà´•ാൾ à´…à´§à´¿à´•à´‚ പവർ ഉപയോഗികàµà´•àµà´¨àµà´¨àµ."</string>
+ <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"നിങàµà´™à´³àµà´Ÿàµ† ടിവി‌യàµâ€Œà´•àµà´•ൠമാതàµà´°à´®à´¾à´¯à´¿à´Ÿàµà´Ÿà´²àµà´²à´¾à´¤àµ†, മൾടàµà´Ÿà´¿à´•ാസàµâ€Œà´±àµà´±àµ വിലാസങàµà´™àµ¾ ഉപയോഗിചàµà´šàµ, ഒരൠവൈഫൈ നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•à´¿à´²àµà´³àµà´³ à´Žà´²àµà´²à´¾ ഉപകരണങàµà´™àµ¾à´•àµà´•àµà´‚ അയചàµà´š പാകàµà´•à´±àµà´±àµà´•ൾ à´¸àµà´µàµ€à´•à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ. ഇതൠമൾടàµà´Ÿà´¿à´•ാസàµâ€Œà´±àµà´±àµ à´…à´²àµà´²à´¾à´¤àµà´¤ മോഡിനെകàµà´•ാൾ കൂടàµà´¤àµ½ പവർ ഉപയോഗികàµà´•àµà´¨àµà´¨àµ."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"മൾടàµà´Ÿà´¿à´•ാസàµâ€Œà´±àµà´±àµ വിലാസങàµà´™àµ¾ ഉപയോഗിചàµà´šàµ നിങàµà´™à´³àµà´Ÿàµ† ഫോണിലേകàµà´•ൠമാതàµà´°à´®à´²àµà´²à´¾à´¤àµ†, ഒരൠവൈഫൈ നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ിലെ à´Žà´²àµà´²à´¾ ഉപകരണങàµà´™à´³à´¿à´²àµ‡à´•àµà´•àµà´‚ അയചàµà´š പായàµâ€Œà´•àµà´•à´±àµà´±àµà´•ൾ നേടാൻ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ. ഇതൠമൾടàµà´Ÿà´¿à´•ാസàµà´±àµà´±àµ ഇതര മോഡിനേകàµà´•ാൾ à´…à´§à´¿à´•à´‚ പവർ ഉപയോഗികàµà´•àµà´¨àµà´¨àµ."</string>
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"à´¬àµà´²àµ‚ടൂതàµà´¤àµ à´•àµà´°à´®àµ€à´•രണങàµà´™àµ¾ ആകàµà´¸à´¸àµà´¸àµà´šàµ†à´¯àµà´¯àµà´•"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ഒരൠപàµà´°à´¾à´¦àµ‡à´¶à´¿à´• à´¬àµà´²àµ‚ടൂതàµà´¤àµ ടാബàµâ€Œà´²àµ†à´±àµà´±àµ കോൺഫിഗർചെയàµà´¯àµà´¨àµà´¨à´¤à´¿à´¨àµà´‚ വിദൂര ഉപകരണങàµà´™à´³àµ† à´•à´£àµà´Ÿàµ†à´¤àµà´¤à´¿ ജോടിയാകàµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµà´‚ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ."</string>
<string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´• Bluetooth ടിവി കോൺഫിഗർചെയàµà´¯àµà´¨àµà´¨à´¤à´¿à´¨àµà´‚ വിദൂര ഉപകരണങàµà´™àµ¾ à´•à´£àµà´Ÿàµ†à´¤àµà´¤à´¿ ജോടിയാകàµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµà´‚ à´…à´ªàµà´²à´¿à´•àµà´•േഷനെ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ."</string>
@@ -651,7 +649,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"പിൻ കോഡൠതെറàµà´±à´¾à´£àµ."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"അൺലോകàµà´•ൠചെയàµà´¯àµà´¨àµà´¨à´¤à´¿à´¨àµ മെനàµ, 0 à´Žà´¨àµà´¨à´¿à´µ അമർതàµà´¤àµà´•."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"അടിയനàµà´¤à´° നമàµà´ªàµ¼"</string>
- <string name="lockscreen_carrier_default" msgid="8963839242565653192">"സേവനമിലàµà´²."</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"സേവനമിലàµà´²"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"à´¸àµâ€Œà´•àµà´°àµ€àµ» ലോകàµà´•àµà´šàµ†à´¯àµâ€Œà´¤àµ."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"അൺലോകàµà´•ൠചെയàµà´¯àµà´¨àµà´¨à´¤à´¿à´¨à´¾à´¯à´¿ മെനൠഅമർതàµà´¤àµà´• à´…à´²àµà´²àµ†à´™àµà´•ിൽ അടിയനàµà´¤à´° കോൾ വിളികàµà´•àµà´•."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"അൺലോകàµà´•àµà´šàµ†à´¯àµà´¯à´¾àµ» മെനൠഅമർതàµà´¤àµà´•."</string>
@@ -917,7 +915,7 @@
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> à´Žà´¨àµà´¨ à´ªàµà´°àµ‹à´¸à´¸àµà´¸àµ അതിനàµà´±àµ† à´¸àµà´µà´¯à´‚ നടപàµà´ªà´¿à´²à´¾à´•àµà´•à´¿à´¯ StrictMode നയം ലംഘിചàµà´šàµ."</string>
<string name="android_upgrading_title" msgid="1584192285441405746">"Android à´…à´ªàµà´—àµà´°àµ‡à´¡àµà´šàµ†à´¯àµà´¯àµà´¨àµà´¨àµâ€¦"</string>
<string name="android_start_title" msgid="8418054686415318207">"Android ആരംഭികàµà´•àµà´¨àµà´¨àµâ€¦"</string>
- <string name="android_upgrading_fstrim" msgid="8036718871534640010">"സംഭരണം à´’à´ªàµâ€Œà´±àµà´±à´¿à´®àµˆà´¸àµ ചെയàµà´¯àµà´¨àµà´¨àµ."</string>
+ <string name="android_upgrading_fstrim" msgid="8036718871534640010">"à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ à´’à´ªàµâ€Œà´±àµà´±à´¿à´®àµˆà´¸àµ ചെയàµà´¯àµà´¨àµà´¨àµ."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g> à´…à´ªàµà´²à´¿à´•àµà´•േഷൻ à´“à´ªàµà´±àµà´±à´¿à´®àµˆà´¸àµ ചെയàµà´¯àµà´¨àµà´¨àµ."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> തയàµà´¯à´¾à´±à´¾à´•àµà´•àµà´¨àµà´¨àµ."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"à´…à´ªàµà´²à´¿à´•àµà´•േഷനàµà´•ൾ ആരംഭികàµà´•àµà´¨àµà´¨àµ."</string>
@@ -955,14 +953,14 @@
<string name="ringtone_picker_title" msgid="3515143939175119094">"റിംഗàµà´Ÿàµ‹à´£àµà´•ൾ"</string>
<string name="ringtone_unknown" msgid="5477919988701784788">"à´…à´œàµà´žà´¾à´¤ റിംഗàµâ€Œà´Ÿàµ‹àµº"</string>
<plurals name="wifi_available" formatted="false" msgid="7900333017752027322">
- <item quantity="other">Wi-Fi നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•àµà´•ൾ ലഭàµà´¯à´®à´¾à´£àµ</item>
- <item quantity="one">Wi-Fi നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ൠലഭàµà´¯à´®à´¾à´£àµ</item>
+ <item quantity="other">വൈഫൈ നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•àµà´•ൾ ലഭàµà´¯à´®à´¾à´£àµ</item>
+ <item quantity="one">വൈഫൈ നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ൠലഭàµà´¯à´®à´¾à´£àµ</item>
</plurals>
<plurals name="wifi_available_detailed" formatted="false" msgid="1140699367193975606">
- <item quantity="other">ലഭàµà´¯à´®à´¾à´¯ Wi-Fi നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•àµà´•ൾ à´¤àµà´±à´•àµà´•àµà´•</item>
- <item quantity="one">ലഭàµà´¯à´®à´¾à´¯ Wi-Fi നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ൠതàµà´±à´•àµà´•àµà´•</item>
+ <item quantity="other">ലഭàµà´¯à´®à´¾à´¯ വൈഫൈ നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•àµà´•ൾ à´¤àµà´±à´•àµà´•àµà´•</item>
+ <item quantity="one">ലഭàµà´¯à´®à´¾à´¯ വൈഫൈ നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ൠതàµà´±à´•àµà´•àµà´•</item>
</plurals>
- <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ിലേകàµà´•ൠസൈൻ ഇൻ ചെയàµà´¯àµà´•"</string>
+ <string name="wifi_available_sign_in" msgid="9157196203958866662">"വൈഫൈ നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ിലേകàµà´•ൠസൈൻ ഇൻ ചെയàµà´¯àµà´•"</string>
<string name="network_available_sign_in" msgid="1848877297365446605">"നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ിലേകàµà´•ൠസൈൻ ഇൻ ചെയàµà´¯àµà´•"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
@@ -973,10 +971,10 @@
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"കണകàµà´·àµ» à´…à´¨àµà´µà´¦à´¿à´•àµà´•ണോ?"</string>
<string name="wifi_connect_alert_message" msgid="6451273376815958922">"à´…à´ªàµà´²à´¿à´•àµà´•േഷൻ %1$s Wifi നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ിലേകàµà´•ൠകണകàµâ€Œà´±àµà´±àµà´šàµ†à´¯àµà´¯à´¾àµ» താൽപàµà´ªà´°àµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµ %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"ഒരൠഅപàµà´²à´¿à´•àµà´•േഷൻ"</string>
- <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi ഡയറകàµâ€Œà´Ÿàµ"</string>
- <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi ഡയറകàµà´±àµà´±àµ ആരംഭികàµà´•àµà´•. ഇതൠWi-Fi à´•àµà´²à´¯à´¨àµà´±àµ/ഹോടàµà´Ÿàµâ€Œà´¸àµâ€Œà´ªàµ‹à´Ÿàµà´Ÿàµ ഓഫാകàµà´•àµà´‚."</string>
- <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Wi-Fi ഡയറകàµà´±àµà´±àµ ആരംഭികàµà´•ാനായിലàµà´²."</string>
- <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi ഡയറകàµâ€Œà´Ÿàµ ഓണാണàµ"</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"വൈഫൈ ഡയറകàµâ€Œà´Ÿàµ"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"വൈഫൈ ഡയറകàµà´±àµà´±àµ ആരംഭികàµà´•àµà´•. ഇതൠവൈഫൈ à´•àµà´²à´¯à´¨àµà´±àµ/ഹോടàµà´Ÿàµâ€Œà´¸àµâ€Œà´ªàµ‹à´Ÿàµà´Ÿàµ ഓഫാകàµà´•àµà´‚."</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"വൈഫൈ ഡയറകàµà´±àµà´±àµ ആരംഭികàµà´•ാനായിലàµà´²."</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"വൈഫൈ ഡയറകàµâ€Œà´Ÿàµ ഓണാണàµ"</string>
<string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"à´•àµà´°à´®àµ€à´•രണങàµà´™àµ¾à´•àµà´•ായി à´¸àµâ€Œà´ªàµ¼à´¶à´¿à´•àµà´•àµà´•"</string>
<string name="accept" msgid="1645267259272829559">"അംഗീകരികàµà´•àµà´•"</string>
<string name="decline" msgid="2112225451706137894">"നിരസികàµà´•àµà´•"</string>
@@ -999,10 +997,10 @@
<string name="sms_premium_short_code_details" msgid="7869234868023975"><b>"ഇതൠനിങàµà´™à´³àµà´Ÿàµ† മൊബൈൽ à´…à´•àµà´•ൗണàµà´Ÿà´¿àµ½ നിനàµà´¨àµ നിരകàµà´•àµà´•ൾ ഈടാകàµà´•ാൻ കാരണമാകàµà´‚."</b></string>
<string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"അയയàµâ€Œà´•àµà´•àµà´•"</string>
<string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"റദàµà´¦à´¾à´•àµà´•àµà´•"</string>
- <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"à´Žà´¨àµà´±àµ† ചോയàµâ€Œà´¸àµ ഓർമàµà´®à´¿à´•àµà´•àµà´•"</string>
+ <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"à´Žà´¨àµà´±àµ† ഇഷàµà´Ÿà´‚ ഓർമàµà´®à´¿à´šàµà´šàµà´µà´¯àµà´•àµà´•àµà´•"</string>
<string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"നിങàµà´™àµ¾à´•àµà´•ൠഇതൠപിനàµà´¨àµ€à´Ÿàµ à´•àµà´°à´®àµ€à´•രണങàµà´™àµ¾Â &gt; അപàµà´²à´¿à´•àµà´•േഷനàµà´•ൾ à´Žà´¨àµà´¨à´¤à´¿àµ½ മാറàµà´±à´¾à´¨à´¾à´•àµà´‚"</string>
<string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"à´Žà´²àµà´²à´¾à´¯àµâ€Œà´ªàµà´ªàµ‹à´´àµà´‚ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´•"</string>
- <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"à´’à´°à´¿à´•àµà´•à´²àµà´‚ à´…à´¨àµà´µà´¦à´¿à´•àµà´•à´°àµà´¤àµ"</string>
+ <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"à´’à´°à´¿à´•àµà´•à´²àµà´®à´¨àµà´µà´¦à´¿à´•àµà´•à´°àµà´¤àµ"</string>
<string name="sim_removed_title" msgid="6227712319223226185">"സിം കാർഡൠനീകàµà´•ംചെയàµâ€Œà´¤àµ"</string>
<string name="sim_removed_message" msgid="5450336489923274918">"സാധàµà´¤à´¯àµà´³àµà´³ ഒരൠസിം കാർഡൠചേർതàµà´¤àµ à´ªàµà´¨à´°à´¾à´°à´‚à´­à´¿à´•àµà´•àµà´¨àµà´¨à´¤àµà´µà´°àµ† സെലàµà´²àµà´²à´¾àµ¼ നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ൠലഭàµà´¯à´®à´¾à´•à´¿à´²àµà´²."</string>
<string name="sim_done_button" msgid="827949989369963775">"പൂർതàµà´¤à´¿à´¯à´¾à´¯à´¿"</string>
@@ -1017,31 +1015,30 @@
<string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g> നൽകàµà´¨àµà´¨à´¤àµ."</string>
<string name="no_permissions" msgid="7283357728219338112">"à´…à´¨àµà´®à´¤à´¿à´•ളൊനàµà´¨àµà´‚ ആവശàµà´¯à´®à´¿à´²àµà´²"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ഇതൠനിങàµà´™àµ¾à´•àµà´•ൠപണചàµà´šàµ†à´²à´µà´¿à´¨à´¿à´Ÿà´¯à´¾à´•àµà´•ാം"</string>
- <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB മാസàµà´¸àµ സംഭരണം"</string>
+ <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB മാസàµà´¸àµ à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB കണകàµà´±àµà´±àµà´šàµ†à´¯àµâ€Œà´¤àµ"</string>
<string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"നിങàµà´™àµ¾ USB à´®àµà´–േന നിങàµà´™à´³àµà´Ÿàµ† à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ കണകàµà´±àµà´±àµà´šàµ†à´¯àµâ€Œà´¤àµ. നിങàµà´™à´³àµà´Ÿàµ† à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿à´¨àµà´‚ Android-à´¨àµà´±àµ† USB സംഭർണതàµà´¤à´¿à´¨àµà´®à´¿à´Ÿà´¯à´¿àµ½ ഫയലàµà´•ൾ പകർതàµà´¤à´£à´®àµ†à´™àµà´•ിൽ à´šàµà´µà´Ÿàµ†à´¯àµà´³àµà´³ ബടàµà´Ÿàµº à´¸àµâ€Œà´ªàµ¼à´¶à´¿à´•àµà´•àµà´•."</string>
<string name="usb_storage_message" product="default" msgid="805351000446037811">"നിങàµà´™àµ¾ USB à´®àµà´–േന നിങàµà´™à´³àµà´Ÿàµ† à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ കണകàµà´±àµà´±àµà´šàµ†à´¯àµâ€Œà´¤àµ. നിങàµà´™à´³àµà´Ÿàµ† à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿à´¨àµà´‚ Android-à´¨àµà´±àµ† SD കാർഡിനàµà´®à´¿à´Ÿà´¯à´¿àµ½ ഫയലàµà´•ൾ പകർതàµà´¤à´£à´®àµ†à´™àµà´•ിൽ à´šàµà´µà´Ÿàµ†à´¯àµà´³àµà´³ ബടàµà´Ÿàµº à´¸àµâ€Œà´ªàµ¼à´¶à´¿à´•àµà´•àµà´•."</string>
- <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB സംഭരണം ഓണാകàµà´•àµà´•"</string>
- <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"USB മാസàµà´¸àµ സംഭരണതàµà´¤à´¿à´¨à´¾à´¯à´¿ നിങàµà´™à´³àµà´Ÿàµ† USB സംഭരണം ഉപയോഗികàµà´•àµà´¨àµà´¨à´¤à´¿àµ½ ഒരൠപàµà´°à´¶àµâ€Œà´¨à´®àµà´£àµà´Ÿàµ."</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ ഓണാകàµà´•àµà´•"</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"USB മാസàµà´¸àµ സംഭരണതàµà´¤à´¿à´¨à´¾à´¯à´¿ നിങàµà´™à´³àµà´Ÿàµ† USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ ഉപയോഗികàµà´•àµà´¨àµà´¨à´¤à´¿àµ½ ഒരൠപàµà´°à´¶àµâ€Œà´¨à´®àµà´£àµà´Ÿàµ."</string>
<string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"USB മാസàµà´¸àµ സംഭരണതàµà´¤à´¿à´¨à´¾à´¯à´¿ നിങàµà´™à´³àµà´Ÿàµ† SD കാർഡൠഉപയോഗികàµà´•àµà´¨àµà´¨à´¤à´¿àµ½ ഒരൠപàµà´°à´¶àµâ€Œà´¨à´®àµà´£àµà´Ÿàµ."</string>
<string name="usb_storage_notification_title" msgid="8175892554757216525">"USB കണകàµà´±àµà´±àµà´šàµ†à´¯àµâ€Œà´¤àµ"</string>
<string name="usb_storage_notification_message" msgid="939822783828183763">"നിങàµà´™à´³àµà´Ÿàµ† à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿à´²àµ‡à´•àµà´•àµ/à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ നിനàµà´¨àµà´‚ ഫയലàµà´•ൾ പകർതàµà´¤à´¾àµ» à´¸àµâ€Œà´ªàµ¼à´¶à´¿à´•àµà´•àµà´•."</string>
- <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB സംഭരണം ഓഫാകàµà´•àµà´•"</string>
- <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"USB സംഭരണം à´“à´«àµà´šàµ†à´¯àµà´¯à´¾àµ» à´¸àµâ€Œà´ªàµ¼à´¶à´¿à´•àµà´•àµà´•."</string>
- <string name="usb_storage_stop_title" msgid="660129851708775853">"USB സംഭരണം ഉപയോഗതàµà´¤à´¿à´²à´¾à´£àµ"</string>
- <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"USB സംഭരണം à´“à´«àµà´šàµ†à´¯àµà´¯àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµà´®àµà´ªàµ, നിങàµà´™à´³àµà´Ÿàµ† à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ നിനàµà´¨àµà´‚ Android-à´¨àµà´±àµ† USB സംഭരണം അൺമൗണàµà´Ÿàµà´šàµ†à´¯àµà´¯àµà´• (\"ഒഴിവാകàµà´•àµà´•\")."</string>
- <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"USB സംഭരണം à´“à´«àµà´šàµ†à´¯àµà´¯àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµà´®àµà´ªàµ, നിങàµà´™à´³àµà´Ÿàµ† à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ നിനàµà´¨àµà´‚ Android-à´¨àµà´±àµ† SD കാർഡൠഅൺമൗണàµà´Ÿàµà´šàµ†à´¯àµà´¯àµà´• (\"ഒഴിവാകàµà´•àµà´•\")."</string>
- <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB സംഭരണം ഓഫാകàµà´•àµà´•"</string>
- <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"USB സംഭരണം à´“à´«àµà´šàµ†à´¯àµà´¯àµà´¨àµà´¨à´¤à´¿àµ½ ഒരൠപàµà´°à´¶àµâ€Œà´¨à´®àµà´£àµà´Ÿà´¾à´¯à´¿à´°àµà´¨àµà´¨àµ. നിങàµà´™àµ¾ USB ഹോസàµâ€Œà´±àµà´±àµ മൗണàµà´Ÿàµà´šàµ†à´¯àµâ€Œà´¤à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ†à´¨àµà´¨àµ ഉറപàµà´ªàµà´µà´°àµà´¤àµà´¤à´¿à´¯à´¤à´¿à´¨àµà´¶àµ‡à´·à´‚ വീണàµà´Ÿàµà´‚ à´¶àµà´°à´®à´¿à´•àµà´•àµà´•."</string>
- <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB സംഭരണം ഓണാകàµà´•àµà´•"</string>
- <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"നിങàµà´™àµ¾ USB സംഭരണം ഓൺ ചെയàµà´¯àµà´•യാണെങàµà´•ിൽ, നിങàµà´™àµ¾ ഉപയോഗികàµà´•àµà´¨àµà´¨ à´šà´¿à´² à´…à´ªàµà´²à´¿à´•àµà´•േഷനàµà´•ൾ USB സംഭരണം à´“à´«àµà´šàµ†à´¯àµà´¯àµà´¨àµà´¨à´¤àµà´µà´°àµ† à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´‚ നിർതàµà´¤à´¾à´¨àµà´‚ ലഭàµà´¯à´®à´¾à´•ാതിരികàµà´•ാനàµà´‚ ഇടയàµà´£àµà´Ÿàµ."</string>
+ <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ ഓഫാകàµà´•àµà´•"</string>
+ <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ à´“à´«àµà´šàµ†à´¯àµà´¯à´¾àµ» à´¸àµâ€Œà´ªàµ¼à´¶à´¿à´•àµà´•àµà´•."</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ ഉപയോഗതàµà´¤à´¿à´²à´¾à´£àµ"</string>
+ <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ à´“à´«àµà´šàµ†à´¯àµà´¯àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµà´®àµà´ªàµ, നിങàµà´™à´³àµà´Ÿàµ† à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ നിനàµà´¨àµà´‚ Android-à´¨àµà´±àµ† USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ അൺമൗണàµà´Ÿàµà´šàµ†à´¯àµà´¯àµà´• (\"ഒഴിവാകàµà´•àµà´•\")."</string>
+ <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ à´“à´«àµà´šàµ†à´¯àµà´¯àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµà´®àµà´ªàµ, നിങàµà´™à´³àµà´Ÿàµ† à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ നിനàµà´¨àµà´‚ Android-à´¨àµà´±àµ† SD കാർഡൠഅൺമൗണàµà´Ÿàµà´šàµ†à´¯àµà´¯àµà´• (\"ഒഴിവാകàµà´•àµà´•\")."</string>
+ <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ ഓഫാകàµà´•àµà´•"</string>
+ <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ à´“à´«àµà´šàµ†à´¯àµà´¯àµà´¨àµà´¨à´¤à´¿àµ½ ഒരൠപàµà´°à´¶àµâ€Œà´¨à´®àµà´£àµà´Ÿà´¾à´¯à´¿à´°àµà´¨àµà´¨àµ. നിങàµà´™àµ¾ USB ഹോസàµâ€Œà´±àµà´±àµ മൗണàµà´Ÿàµà´šàµ†à´¯àµâ€Œà´¤à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ†à´¨àµà´¨àµ ഉറപàµà´ªàµà´µà´°àµà´¤àµà´¤à´¿à´¯à´¤à´¿à´¨àµà´¶àµ‡à´·à´‚ വീണàµà´Ÿàµà´‚ à´¶àµà´°à´®à´¿à´•àµà´•àµà´•."</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ ഓണാകàµà´•àµà´•"</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"നിങàµà´™àµ¾ USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ ഓൺ ചെയàµà´¯àµà´•യാണെങàµà´•ിൽ, നിങàµà´™àµ¾ ഉപയോഗികàµà´•àµà´¨àµà´¨ à´šà´¿à´² à´…à´ªàµà´²à´¿à´•àµà´•േഷനàµà´•ൾ USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ à´“à´«àµà´šàµ†à´¯àµà´¯àµà´¨àµà´¨à´¤àµà´µà´°àµ† à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´‚ നിർതàµà´¤à´¾à´¨àµà´‚ ലഭàµà´¯à´®à´¾à´•ാതിരികàµà´•ാനàµà´‚ ഇടയàµà´£àµà´Ÿàµ."</string>
<string name="dlg_error_title" msgid="7323658469626514207">"USB à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´‚ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ"</string>
<string name="dlg_ok" msgid="7376953167039865701">"à´¶à´°à´¿"</string>
<string name="usb_charging_notification_title" msgid="4004114449249406402">"ചാർജàµà´œà´¿à´‚ഗിനായàµà´³àµà´³ USB"</string>
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"ഫയൽ കൈമാറàµà´±à´¤àµà´¤à´¿à´¨àµà´³àµà´³ USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"ഫോടàµà´Ÿàµ‹ കൈമാറàµà´±à´¤àµà´¤à´¿à´¨à´¾à´¯àµà´³àµà´³ USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI-à´¯àµâ€Œà´•àµà´•ായàµà´³àµà´³ USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"ഇൻസàµâ€Œà´±àµà´±à´¾à´³à´±à´¾à´¯à´¿ കണകàµâ€Œà´±àµà´±àµà´šàµ†à´¯àµà´¤àµ"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"ഒരൠUSB ആകàµâ€Œà´¸à´¸àµà´¸à´±à´¿ കണകàµà´±àµà´±àµà´šàµ†à´¯àµâ€Œà´¤àµ"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"കൂടàµà´¤àµ½ à´“à´ªàµâ€Œà´·à´¨àµà´•ൾകàµà´•ൠസàµâ€Œà´ªàµ¼à´¶à´¿à´•àµà´•ൂ."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ഡീബഗàµà´—ിംഗൠകണകàµâ€Œà´±àµà´±àµà´šàµ†à´¯àµâ€Œà´¤àµ"</string>
@@ -1155,13 +1152,13 @@
<string name="progress_unmounting" product="default" msgid="1327894998409537190">"SD കാർഡൠഅൺമൗണàµà´Ÿàµà´šàµ†à´¯àµà´¯àµà´¨àµà´¨àµâ€¦"</string>
<string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"USB കാർഡൠമായàµâ€Œà´•àµà´•àµà´¨àµà´¨àµâ€¦"</string>
<string name="progress_erasing" product="default" msgid="6596988875507043042">"SD കാർഡൠമായàµâ€Œà´•àµà´•àµà´¨àµà´¨àµâ€¦"</string>
- <string name="format_error" product="nosdcard" msgid="6299769563624776948">"USB സംഭരണം മായàµâ€Œà´•àµà´•ാനായിലàµà´²."</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ മായàµâ€Œà´•àµà´•ാനായിലàµà´²."</string>
<string name="format_error" product="default" msgid="7315248696644510935">"SD കാർഡൠമായàµâ€Œà´•àµà´•ാനായിലàµà´²."</string>
<string name="media_bad_removal" msgid="7960864061016603281">"അൺമൗണàµà´Ÿàµ ചെയàµà´¯àµà´¨àµà´¨à´¤à´¿à´¨àµà´®àµà´®àµà´ªàµ SD കാർഡൠനീകàµà´•ംചെയàµâ€Œà´¤àµ."</string>
- <string name="media_checking" product="nosdcard" msgid="418188720009569693">"നിലവിൽ USB സംഭരണം പരിശോധികàµà´•àµà´¨àµà´¨àµ."</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"നിലവിൽ USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ പരിശോധികàµà´•àµà´¨àµà´¨àµ."</string>
<string name="media_checking" product="default" msgid="7334762503904827481">"നിലവിൽ SD കാർഡൠപരിശോധികàµà´•àµà´¨àµà´¨àµ."</string>
<string name="media_removed" msgid="7001526905057952097">"SD കാർഡൠനീകàµà´•ംചെയàµâ€Œà´¤àµ."</string>
- <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"ഒരൠകമàµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ USB സംഭരണം നിലവിൽ ഉപയോഗതàµà´¤à´¿à´²à´¾à´£àµ."</string>
+ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"ഒരൠകമàµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ നിലവിൽ ഉപയോഗതàµà´¤à´¿à´²à´¾à´£àµ."</string>
<string name="media_shared" product="default" msgid="5706130568133540435">"ഒരൠകമàµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ SD കാർഡൠനിലവിൽ ഉപയോഗതàµà´¤à´¿à´²à´¾à´£àµ."</string>
<string name="media_unknown_state" msgid="729192782197290385">"à´…à´œàµà´žà´¾à´¤ നിലയിലàµà´³àµà´³ ബാഹàµà´¯ മീഡിയ."</string>
<string name="share" msgid="1778686618230011964">"പങàµà´•à´¿à´Ÿàµà´•"</string>
@@ -1220,23 +1217,23 @@
<string name="action_menu_overflow_description" msgid="2295659037509008453">"കൂടàµà´¤à´²àµâ€ à´“à´ªàµâ€Œà´·à´¨àµà´•à´³àµâ€"</string>
<string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
- <string name="storage_internal" msgid="4891916833657929263">"ആനàµà´¤à´°à´¿à´• സംഭരണം"</string>
+ <string name="storage_internal" msgid="4891916833657929263">"ആനàµà´¤à´°à´¿à´• à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD കാർഡàµ"</string>
<string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD കാർഡàµ"</string>
<string name="storage_usb_drive" msgid="6261899683292244209">"USB à´¡àµà´°àµˆà´µàµ"</string>
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB à´¡àµà´°àµˆà´µàµ"</string>
- <string name="storage_usb" msgid="3017954059538517278">"USB സംഭരണം"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"USB à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"ഡാറàµà´± ഉപയോഗ à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ"</string>
<string name="data_usage_warning_body" msgid="2814673551471969954">"ഉപയോഗവàµà´‚ à´•àµà´°à´®àµ€à´•രണങàµà´™à´³àµà´‚ കാണാൻ à´¸àµâ€Œà´ªàµ¼à´¶à´¿à´•àµà´•àµà´•."</string>
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G ഡാറàµà´± പരിധിയിലെതàµà´¤à´¿"</string>
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G ഡാറàµà´± പരിധിയിലെതàµà´¤à´¿"</string>
<string name="data_usage_mobile_limit_title" msgid="557158376602636112">"സെലàµà´²àµà´²à´¾àµ¼ ഡാറàµà´± പരിധിയിലെതàµà´¤à´¿"</string>
- <string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi ഡാറàµà´± പരിധിയിലെതàµà´¤à´¿"</string>
+ <string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"വൈഫൈ ഡാറàµà´± പരിധിയിലെതàµà´¤à´¿"</string>
<string name="data_usage_limit_body" msgid="291731708279614081">"ശേഷികàµà´•àµà´¨àµà´¨ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´™àµà´™àµ¾à´•àµà´•ായി ഡാറàµà´± താൽകàµà´•ാലികമായി നിർതàµà´¤à´¿"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G ഡാറàµà´± പരിധി കവിഞàµà´žàµ"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G ഡാറàµà´± പരിധി കവിഞàµà´žàµ"</string>
<string name="data_usage_mobile_limit_snoozed_title" msgid="4941346653729943789">"സെലàµà´²àµà´²à´¾àµ¼ ഡാറàµà´± പരിധി കവിഞàµà´žàµ"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi ഡാറàµà´± പരിധി കവിഞàµà´žàµ"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"വൈഫൈ ഡാറàµà´± പരിധി കവിഞàµà´žàµ"</string>
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"നിശàµà´šà´¿à´¤ പരിധിയിലàµà´‚ <xliff:g id="SIZE">%s</xliff:g> കൂടàµà´¤à´²à´¾à´£àµ."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"പശàµà´šà´¾à´¤àµà´¤à´² ഡാറàµà´± പരിമിതപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿"</string>
<string name="data_usage_restricted_body" msgid="6741521330997452990">"നിയനàµà´¤àµà´°à´£à´‚ നീകàµà´•ംചെയàµà´¯à´¾àµ» à´¸àµâ€Œà´ªàµ¼à´¶à´¿à´•àµà´•àµà´•."</string>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index 09673d1df7d7..35f06aea6b2b 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"Файл шилжүүлÑÑ… USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"Фото зураг шилжүүлÑÑ… USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI-ийн USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Суулгагч болгон холбогдÑон"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB төхөөрөмжид холбогдов"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"ÐÑмÑлт Ñонголтыг харахын тулд дарна."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB дебаг холбогдÑон"</string>
diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml
index aa5562a1d1f8..08fc712919ed 100644
--- a/core/res/res/values-mr-rIN/strings.xml
+++ b/core/res/res/values-mr-rIN/strings.xml
@@ -210,7 +210,7 @@
<string name="global_action_power_off" msgid="4471879440839879722">"बंद"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"दोष अहवाल"</string>
<string name="bugreport_title" msgid="2667494803742548533">"दोष अहवाल घà¥à¤¯à¤¾"</string>
- <string name="bugreport_message" msgid="398447048750350456">"ई-मेल संदेश मà¥à¤¹à¤£à¥‚न पाठविणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€, हे आपलà¥à¤¯à¤¾ वरà¥à¤¤à¤®à¤¾à¤¨ डिवà¥à¤¹à¤¾à¤‡à¤¸ सà¥à¤¥à¤¿à¤¤à¥€à¤µà¤¿à¤·à¤¯à¥€ माहिती संकलित करेल. यास दोष अहवाल पà¥à¤°à¤¾à¤°à¤‚भ करणà¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न तो पाठविला जाणà¥à¤¯à¤¾à¤ªà¤°à¥à¤¯à¤‚त थोडा वेळ लागेल; कृपया धीर धरा."</string>
+ <string name="bugreport_message" msgid="398447048750350456">"ई-मेल संदेश मà¥à¤¹à¤£à¥‚न पाठविणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€, हे आपलà¥à¤¯à¤¾ वरà¥à¤¤à¤®à¤¾à¤¨ डिवà¥à¤¹à¤¾à¤‡à¤¸ सà¥à¤¥à¤¿à¤¤à¥€à¤µà¤¿à¤·à¤¯à¥€ माहिती संकलित करेल. दोष अहवाल पà¥à¤°à¤¾à¤°à¤‚भ करणà¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न तो पाठविणà¥à¤¯à¤¾à¤ªà¤°à¥à¤¯à¤‚त थोडा वेळ लागेल; कृपया धीर धरा."</string>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"मूक मोड"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"धà¥à¤µà¤¨à¥€ बंद आहे"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"धà¥à¤µà¤¨à¥€ चालू आहे"</string>
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरणासाठी USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"फोटो सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरणासाठी USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI साठी USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"सà¥à¤¥à¤¾à¤ªà¤¨à¤•रà¥à¤¤à¤¾ मà¥à¤¹à¤£à¥‚न कनेकà¥à¤Ÿ केले"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB उपसाधनावर कनेकà¥à¤Ÿ केले"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"अधिक परà¥à¤¯à¤¾à¤¯à¤¾à¤‚साठी सà¥à¤ªà¤°à¥à¤¶ करा."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB डीबग करणे कनेकà¥â€à¤Ÿ केले"</string>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index 9a6bd739e866..e82eff5bb3fb 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB untuk pemindahan fail"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB untuk pemindahan foto"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB untuk MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Disambungkan sebagai pemasang"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Disambungkan kepada aksesori USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Sentuh untuk mendapatkan lagi pilihan."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Penyahpepijatan USB disambungkan"</string>
diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml
index a8761cea0f13..1cdb9fbe9662 100644
--- a/core/res/res/values-my-rMM/strings.xml
+++ b/core/res/res/values-my-rMM/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"ဖိုင်လွှဲပြောင်းရန်အá€á€½á€€á€º USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"ဓာá€á€ºá€•ုံလွှဲပြောင်းရန်အá€á€½á€€á€º USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI အá€á€½á€€á€º USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"installerအနေဖြင့် á€á€»á€­á€á€ºá€†á€€á€ºá€žá€Šá€º"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USBá€á€½á€²á€–က်ပစ္စည်းအား á€á€»á€­á€á€ºá€†á€€á€ºá€‘ားသည်"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"ထပ်မံရွေးá€á€»á€šá€ºá€…ရာများအá€á€½á€€á€º ထိပါ"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB အမှားစစ်á€á€¼á€„်းအား á€á€»á€­á€á€ºá€†á€€á€ºá€‘ားသည်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 9faf81144ea8..81d1ad75a852 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -227,15 +227,15 @@
<string name="user_owner_label" msgid="2804351898001038951">"Personlig"</string>
<string name="managed_profile_label" msgid="6260850669674791528">"Jobb"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakter"</string>
- <string name="permgroupdesc_contacts" msgid="6951499528303668046">"få tilgang til kontaktene dine"</string>
+ <string name="permgroupdesc_contacts" msgid="6951499528303668046">"se kontaktene dine"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Posisjon"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"tilgang til enhetens plassering"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
- <string name="permgroupdesc_calendar" msgid="3889615280211184106">"få tilgang til kalenderen din"</string>
+ <string name="permgroupdesc_calendar" msgid="3889615280211184106">"Ã¥pne kalenderen din"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"sende og lese SMS-meldinger"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Lagring"</string>
- <string name="permgroupdesc_storage" msgid="637758554581589203">"få tilgang til bilder, media og filer på enheten din"</string>
+ <string name="permgroupdesc_storage" msgid="637758554581589203">"åpne bilder, media og filer på enheten din"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"spill inn lyd"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB for filoverføring"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB for bildeoverføring"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB for MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Tilkoblet som installasjonsprogram"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Koblet til et USB-tilbehør"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Trykk for å se flere alternativer."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-feilsøking tilkoblet"</string>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
index 04b9b3e0fb68..9d9279692c8b 100644
--- a/core/res/res/values-ne-rNP/strings.xml
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -1047,7 +1047,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"फाइल सà¥à¤¥à¤¾à¤¨à¤¾à¤¨à¥à¤¤à¤°à¤£à¤•ो लागि USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"तसà¥à¤¬à¤¿à¤° सà¥à¤¥à¤¾à¤¨à¤¾à¤¨à¥à¤¤à¤°à¤£à¤•ो लागि USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI को लागि USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"à¤à¤‰à¤Ÿà¤¾ सà¥à¤¥à¤¾à¤ªà¤¨à¤•रà¥à¤¤à¤¾à¤•ो रूपमा जोडिà¤à¤•ो छ"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB सहायकमा जोडिà¤à¤•ो छ"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"थप विकलà¥à¤ªà¤¹à¤°à¥‚का लागि छà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB डिबग गरà¥à¤¨à¥‡ जडित छ"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 2c1d9942446b..024551ac27fe 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB voor bestandsoverdacht"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB voor foto-overdracht"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB voor MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Gekoppeld als installatieprogramma"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Aangesloten op een USB-accessoire"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Tik voor meer opties."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-foutopsporing verbonden"</string>
diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml
index 8a2c552c3037..ebdd3c823c60 100644
--- a/core/res/res/values-pa-rIN/strings.xml
+++ b/core/res/res/values-pa-rIN/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"ਫ਼ਾਈਲ ਟà©à¨°à¨¾à¨‚ਸਫ਼ਰ ਲਈ USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"ਫੋਟੋ ਟà©à¨°à¨¾à¨‚ਸਫ਼ਰ ਲਈ USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI ਲਈ USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"ਇੱਕ ਇੰਸਟੌਲਰ ਦੇ ਤੌਰ ਤੇ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"ਇੱਕ USB à¨à¨•ਸੈਸਰੀ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਸਪਰਸ਼ ਕਰੋ।"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ਡੀਬਗਿੰਗ ਕਨੈਕਟ ਕੀਤੀ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index fde814222fad..599999d813ed 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1055,7 +1055,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB w trybie przesyłania plików"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB w trybie przesyłania zdjęć"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB w trybie MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Podłączono jako nośnik instalacyjny."</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Podłączono akcesorium USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Kliknij, by zobaczyć więcej opcji."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Podłączono moduł debugowania USB"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 9eabfc545833..a343550dc256 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB para transferência de ficheiros"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB para transferência de fotos"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB para MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Ligado como um instalador"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Ligado a um acessório USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Toque para ver mais opções."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB ligada"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 9fada1c78169..62931c74fe1f 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB para transferência de arquivos"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB para transferência de fotos"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB para MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Conectados como um instalador"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectado a um acessório USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Toque para ver mais opções."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB conectada"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 7a6a14febea9..02d2c03e6f13 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1048,7 +1048,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"Conexiune USB pentru transferul fișierelor"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"Conexiune USB pentru transferul fotografiilor"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"Conexiune USB pentru MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Conectat ca program de instalare"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectat la un accesoriu USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Atingeți pentru mai multe opțiuni."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depanarea USB este conectată"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index bdf11e1185e7..edf7b2a0e1ed 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1055,7 +1055,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"Передача файлов через USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"Передача фото через USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI через USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Подключен как уÑтановщик"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB-уÑтройÑтво подключено"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Ещё варианты"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отладка по USB разрешена"</string>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
index c26bc5a7e0f6..705d493e28b5 100644
--- a/core/res/res/values-si-rLK/strings.xml
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -354,10 +354,8 @@
<string name="permdesc_flashlight" msgid="6522284794568368310">"à·ƒà·à¶«à·™à·…ිය à¶´à·à¶½à¶±à¶ºà¶§ යෙදුමට අවසර දෙන්න."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"දුරකථන à¶…à¶‚à¶š වෙත à¶à¶¢à·”වම අමතන්න"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"ඔබගේ මà·à¶¯à·’à·„à¶­à·Š වීමක් නොමà·à¶­à·’à·€ දුරකථන à¶…à¶‚à¶š ඇමතීමට යෙදුමට අවසර දෙන්න. මෙහි à¶´à·Šâ€à¶»à¶­à·’එලය වන්නේ අනපේක්ෂිත අයකිරීම් හ෠ඇමතුම් ඇතිවීමයි. මෙයන් හදිසි à¶…à¶‚à¶š වලට ඇමතුම් à¶œà·à¶±à·“මට යෙදුමට අවසර නොදෙන බවට සටහන් කරගන්න. ඔබගේ අනුදà·à¶±à·”මක් නොමà·à¶­à·’à·€ ඇමතුම් à¶œà·à¶±à·“මෙන් අනිෂ්ට යෙදුම් ඔබගේ මුදල් නිකරුණේ à·€à·à¶º කරයි."</string>
- <!-- no translation found for permlab_accessImsCallService (3574943847181793918) -->
- <skip />
- <!-- no translation found for permdesc_accessImsCallService (8992884015198298775) -->
- <skip />
+ <string name="permlab_accessImsCallService" msgid="3574943847181793918">"IMS ඇමතුම් සේවà·à·€à¶§ පිවිසෙන්න"</string>
+ <string name="permdesc_accessImsCallService" msgid="8992884015198298775">"ඔබේ මà·à¶¯à·’හත්වීමකින් තොරව ඇමතුම් සිදු කිරීමට IMS සේවà·à·€ à¶·à·à·€à·’තයට යෙදුමට ඉඩ දෙන්න."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"දුරකථනයේ තත්වය සහ අනන්â€à¶ºà¶­à·à·€à¶º කියවීම"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"à¶‹à¶´à·à¶‚ගයේ දුරකථන විà·à·šà·‚à·à¶‚à¶œ වෙත පිවිසීමට යෙදුමට අවසර දෙන්න. ඇමතුම සක්â€à¶»à·’ය වුවත් සහ ඇමතුමකින් දුරස්ථ අංකය සම්බන්ධ වුවත් දුරකථන අංකය සහ à¶‹à¶´à·à¶‚à¶œ ID හඳුන෠ගà·à¶±à·“මට මෙම අවසරය යෙදුමට අවසර දෙයි."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"à¶§à·à¶¶à·Šà¶½à¶§à¶º නින්දෙන් à·€à·à·…ක්වීම"</string>
@@ -1043,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"ගොනු හුවමà·à¶»à·”à·€ සඳහ෠USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"à¶¡à·à¶ºà·à¶»à·–à¶´ හුවමà·à¶»à·”à·€ සඳහ෠USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI සඳහ෠USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"ස්ථà·à¶´à·’තයක් ලෙස සම්බන්ධයි"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB මෙවලමකට සම්බන්ධිතයි"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"වඩ෠වà·à¶©à·’ විකල්ප සඳහ෠ස්පර්෠කරන්න."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB නිදොස්කරණය සම්බන්ධිතයි"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 9bca6668ec35..7275f9c223e9 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1055,7 +1055,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB na prenos súborov"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB na prenos fotiek"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB na pripojenie zariadenia MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Pripojené ako inštalátor"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Pripojené k periférnemu zariadeniu USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Ďalšie možnosti zobrazíte klepnutím."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Ladenie cez USB pripojené"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 184595bf16b9..061d7c6e77dd 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1055,7 +1055,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB za prenos datotek"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB za prenos fotografij"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB za MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Povezan kot namestitveni program"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"PrikljuÄen na dodatek USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Za veÄ možnosti se dotaknite."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Iskanje in odpravljanje napak USB je povezano"</string>
diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml
index e1508cbc8b29..3be2df0e64d7 100644
--- a/core/res/res/values-sq-rAL/strings.xml
+++ b/core/res/res/values-sq-rAL/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB për transferimin e skedarëve"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB për transferimin e fotografive"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB për MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"I lidhur si instalues"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"U lidh me një ndihmës USB-je"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Prek për më shumë opsione."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Korrigjuesi i USB-së i lidhur"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index e5c0b3d0ef17..7d1f2b2f3bbb 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1048,7 +1048,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB за Ð¿Ñ€ÐµÐ½Ð¾Ñ Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐ°"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB за Ð¿Ñ€ÐµÐ½Ð¾Ñ Ñлика"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB за MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Повезан као инÑталациони програм"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Повезано Ñа USB додатком"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Додирните за још опција."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отклањање грешака Ñа USB-а је уÑпоÑтављено"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index cae88f44374a..7310934e9ca3 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB för överföring av filer"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB för överföring av foton"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB för MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Ansluten som installationsprogram"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Ansluten till ett USB-tillbehör"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Visa fler alternativ genom att trycka."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-felsökning ansluten"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 0f8f19343963..c379fcd8b4de 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1043,7 +1043,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB kwa ajili ya kuhamisha faili"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB kwa ajili ya kuhamisha picha"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB kwa ajili ya MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Imeunganishwa kama kisakinishi"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Imeunganishwa kwa kifuasi cha USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Gusa kwa chaguo zaidi."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Utatuaji wa USB umeunganishwa"</string>
diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml
index cf3238f85ecf..9d25d6cea72b 100644
--- a/core/res/res/values-ta-rIN/strings.xml
+++ b/core/res/res/values-ta-rIN/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB, கோபà¯à®ªà¯à®ªà¯ பரிமாறà¯à®±à®¤à¯à®¤à¯à®•à¯à®•௠மடà¯à®Ÿà¯à®®à¯"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB, படப௠பரிமாறà¯à®±à®¤à¯à®¤à¯à®•à¯à®•௠மடà¯à®Ÿà¯à®®à¯"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB, MIDIகà¯à®•௠மடà¯à®Ÿà¯à®®à¯"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"நிறà¯à®µà®¿à®¯à®¾à®• இணைகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¤à¯"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB தà¯à®£à¯ˆà®•à¯à®•à®°à¯à®µà®¿à®¯à¯à®Ÿà®©à¯ இணைகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"கூடà¯à®¤à®²à¯ விரà¯à®ªà¯à®ªà®™à¯à®•ளà¯à®•à¯à®•ாகத௠தொடவà¯à®®à¯."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB பிழைதிரà¯à®¤à¯à®¤à®®à¯ இணைகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¤à¯"</string>
diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml
index b1feaac86c0c..3d753fb0b0f4 100644
--- a/core/res/res/values-te-rIN/strings.xml
+++ b/core/res/res/values-te-rIN/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"ఫైలౠబదిలీ కోసం USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"ఫోటో బదిలీ కోసం USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI కోసం USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"ఇనà±â€Œà°¸à±à°Ÿà°¾à°²à°°à±â€Œà°—à°¾ కనెకà±à°Ÿà± చేయబడింది"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB ఉపకరణానికి కనెకà±à°Ÿà± చేయబడింది"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"మరినà±à°¨à°¿ ఎంపికల కోసం తాకండి."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB డీబగà±à°—ింగౠకనెకà±à°Ÿà± చేయబడింది"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 5474fff84acb..dff9ed4fdb82 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB สำหรับà¸à¸²à¸£à¹‚อนไฟล์"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB สำหรับà¸à¸²à¸£à¹‚อนรูปภาพ"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB สำหรับ MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"เชื่อมต่อเป็นตัวติดตั้ง"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"เชื่อมต่อà¸à¸±à¸šà¸­à¸¸à¸›à¸à¸£à¸“์เสริม USB à¹à¸¥à¹‰à¸§"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"à¹à¸•ะเพื่อดูตัวเลือà¸à¹€à¸žà¸´à¹ˆà¸¡à¹€à¸•ิม"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"เชื่อมต่อà¸à¸²à¸£à¹à¸à¹‰à¹„ขข้อบà¸à¸žà¸£à¹ˆà¸­à¸‡ USB à¹à¸¥à¹‰à¸§"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 1fcc94269c90..2d8bb0b8679b 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB para sa paglipat ng file"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB para sa paglipat ng larawan"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB para sa MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Nakakonekta bilang isang installer"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Nakakonekta sa isang accessory ng USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Pindutin para sa higit pang mga opsyon."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Konektado ang debugging ng USB"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index b956a603c60d..2eebf8878925 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"Dosya aktarımı için USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"Fotoğraf aktarımı için USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI için USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Yükleyici olarak bağlandı"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB aksesuarına bağlandı"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Daha fazla seçenek için dokunun."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB hata ayıklaması bağlandı"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index cfd3bab04412..7ef95371938b 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1055,7 +1055,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½ÐµÑÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½ÐµÑÐµÐ½Ð½Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ñ–Ð¹"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Під’єднано Ñк програму вÑтановленнÑ"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Під’єднано до акÑеÑуара USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"ТоркнітьÑÑ, щоб побачити більше опцій."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"ÐÐ°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ USB завершено"</string>
diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml
index 6cb0934fe066..169c426acfbb 100644
--- a/core/res/res/values-ur-rPK/strings.xml
+++ b/core/res/res/values-ur-rPK/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"â€Ùائل Ú©ÛŒ منتقلی کیلئے USB"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"â€ØªØµÙˆÛŒØ± Ú©ÛŒ منتقلی کیلئے USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"â€MIDI کیلئے USB"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"ایک انسٹالر Ú©Û’ بطور مربوط ÛÛ’"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"â€Ø§ÛŒÚ© USB لوازم سے مربوط ÛÛ’"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"مزید اختیارات کیلئے ٹچ کریں۔"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"â€USB ڈیبگ کرنا مربوط ÛÙˆ گیا"</string>
diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml
index 72a0ca2931d7..8e8bb8c8a73e 100644
--- a/core/res/res/values-uz-rUZ/strings.xml
+++ b/core/res/res/values-uz-rUZ/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB orqali fayl o‘tkazish"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB orqali rasm o‘tkazish"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB orqali MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"O‘rnatgich sifatida ulandi"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB jihozga ulangan"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Boshqa variantlar"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB orqali nosozlikni tuzatish"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 5afd180ec6a7..936a1bb95602 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB để truyá»n tệp"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB để truyá»n ảnh"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB cho MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"ÄÆ°á»£c kết nối như trình cài đặt"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Äã kết nối vá»›i phụ kiện USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Chạm để có các tùy chá»n khác."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Gỡ lỗi USB đã được kết nối"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index c55fa2df8c48..61f78ee13bed 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"正在通过 USB 传输文件"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"正在通过 USB 传输照片"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"正在通过 USB 连接到 MIDI 接å£"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"作为安装程åºè¿žæŽ¥"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"已连接到USBé…ä»¶"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"触摸以查看更多选项。"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"已连接到USB调试"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 45581d986660..a1c63d79778f 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB 檔案傳輸"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB 相片傳輸"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"已作為安è£ç¨‹å¼é€£ç·š"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"已連接到一個 USB é…ä»¶"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"輕觸以ç€è¦½æ›´å¤šé¸é …。"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB åµéŒ¯å·¥å…·"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 2d141dbe62cf..6dafd98689f3 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1041,7 +1041,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB 檔案傳輸"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB 相片傳輸"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"已視為安è£ç¨‹å¼é€£ç·š"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"已連接 USB é…ä»¶"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"輕觸å³å¯é¡¯ç¤ºæ›´å¤šé¸é …。"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB åµéŒ¯å·¥å…·"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 19a9653d9d84..1bc1cab6ccb8 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -354,10 +354,8 @@
<string name="permdesc_flashlight" msgid="6522284794568368310">"Ivumela uhlelo lokusebenza ukulawula ukukhanya kwefuleshi."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"ngokuqondile shayela izinombolo zocingo"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"Ivumela uhlelo lokusebenza ukushayela izinombolo zefoni ngaphandle kokuhlanganyela kwakho. Lokhu kungaholela emashajini noma amakholi angalindelekile. Qaphela ukuthi lokhu akuvumeli uhlelo lokusebenza ukushayela izinombolo zesimo esiphuthumayo. Izinhlelo zokusebenza ezingalungile zingabiza imali ngokwenze amakholi ngaphandle kokuqinisekisa kwakho."</string>
- <!-- no translation found for permlab_accessImsCallService (3574943847181793918) -->
- <skip />
- <!-- no translation found for permdesc_accessImsCallService (8992884015198298775) -->
- <skip />
+ <string name="permlab_accessImsCallService" msgid="3574943847181793918">"finyelela kusevisi yekholi ye-IMS"</string>
+ <string name="permdesc_accessImsCallService" msgid="8992884015198298775">"Ivumela uhlelo lokusebenza ukuthi lusebenzise isevisi ye-IMS ukuze yenze amakholi ngaphandle kokungenelela kwakho."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"funda isimo sefoni kanye nesazisi"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Ivumela uhlelo lokusebenza ukufinyelela izici zefoni zedivayisi. Le mvume ivumela uhlelo lokusebenza ukucacisa inombolo yefoni nobunikazi bedivayisi, ukuthi noma ikholi iyasebenza, futhi nenombolo yesilawuli kude zixhunywe ngekholi."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"gwema ithebhulethi ukuba ingalali"</string>
@@ -1041,7 +1039,6 @@
<string name="usb_mtp_notification_title" msgid="8396264943589760855">"I-USB yokudluliswa kwefayela"</string>
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"I-USB yokudluliswa kwesithombe"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"I-USB ye-MIDI"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Ixhunywe njengesifaki"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Ixhunywe ku-accessory ye-USB"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"Thinta ukuze uthole ezinye izinketho."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Ukulungisa iphutha le-USB kuxhunyiwe"</string>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index a6c4fcc331d6..35c1f0e5066f 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3168,33 +3168,11 @@
<!-- Label for the "Done" button on the far left of action mode toolbars. -->
<string name="action_mode_done">Done</string>
- <!-- Strings for ExternalStorageFormatter service. -->
- <!-- Text for progress dialog while unmounting USB storage volume [CHAR LIMIT=NONE] -->
- <string name="progress_unmounting" product="nosdcard">Unmounting USB storage\u2026</string>
- <!-- Text for progress dialog while unmounting SD card [CHAR LIMIT=NONE] -->
- <string name="progress_unmounting" product="default">Unmounting SD card\u2026</string>
+ <!-- Strings for MasterClearReceiver. -->
<!-- Text for progress dialog while erasing USB storage volume [CHAR LIMIT=NONE] -->
<string name="progress_erasing" product="nosdcard">Erasing USB storage\u2026</string>
<!-- Text for progress dialog while erasing SD card [CHAR LIMIT=NONE] -->
<string name="progress_erasing" product="default">Erasing SD card\u2026</string>
- <!-- Text for message to user that an error happened when formatting USB storage [CHAR LIMIT=NONE] -->
- <string name="format_error" product="nosdcard">Couldn\'t erase USB storage.</string>
- <!-- Text for message to user that an error happened when formatting SD card [CHAR LIMIT=NONE] -->
- <string name="format_error" product="default">Couldn\'t erase SD card.</string>
- <!-- Text for message to user that SD card has been removed while in use [CHAR LIMIT=NONE] -->
- <string name="media_bad_removal">SD card was removed before being unmounted.</string>
- <!-- Text for message to user USB storage is currently being checked [CHAR LIMIT=NONE] -->
- <string name="media_checking" product="nosdcard">USB storage is currently being checked.</string>
- <!-- Text for message to user SD card is currently being checked [CHAR LIMIT=NONE] -->
- <string name="media_checking" product="default">SD card is currently being checked.</string>
- <!-- Text for message to user SD card has been removed [CHAR LIMIT=NONE] -->
- <string name="media_removed">SD card has been removed.</string>
- <!-- Text for message to user USB storage is currently mounted on a computer [CHAR LIMIT=NONE] -->
- <string name="media_shared" product="nosdcard">USB storage is currently in use by a computer.</string>
- <!-- Text for message to user SD card is currently mounted on a computer [CHAR LIMIT=NONE] -->
- <string name="media_shared" product="default">SD card is currently in use by a computer.</string>
- <!-- Text for message for an unknown external media state [CHAR LIMIT=NONE] -->
- <string name="media_unknown_state">External media in unknown state.</string>
<!-- Text for WebView's text selection Action Mode -->
<!-- ActionBar action to share the current selection [CHAR LIMIT=10] -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index fcdaba29c02f..d41031cba01b 100755
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -627,7 +627,6 @@
<java-symbol type="string" name="eventTypeOther" />
<java-symbol type="string" name="fileSizeSuffix" />
<java-symbol type="string" name="force_close" />
- <java-symbol type="string" name="format_error" />
<java-symbol type="string" name="gadget_host_error_inflating" />
<java-symbol type="string" name="gigabyteShort" />
<java-symbol type="string" name="gpsNotifMessage" />
@@ -711,11 +710,6 @@
<java-symbol type="string" name="lockscreen_emergency_call" />
<java-symbol type="string" name="lockscreen_return_to_call" />
<java-symbol type="string" name="low_memory" />
- <java-symbol type="string" name="media_bad_removal" />
- <java-symbol type="string" name="media_checking" />
- <java-symbol type="string" name="media_removed" />
- <java-symbol type="string" name="media_shared" />
- <java-symbol type="string" name="media_unknown_state" />
<java-symbol type="string" name="megabyteShort" />
<java-symbol type="string" name="midnight" />
<java-symbol type="string" name="mismatchPin" />
@@ -814,7 +808,6 @@
<java-symbol type="string" name="print_service_installed_title" />
<java-symbol type="string" name="print_service_installed_message" />
<java-symbol type="string" name="progress_erasing" />
- <java-symbol type="string" name="progress_unmounting" />
<java-symbol type="string" name="mobile_provisioning_apn" />
<java-symbol type="string" name="mobile_provisioning_url" />
<java-symbol type="string" name="quick_contacts_not_available" />
diff --git a/docs/html-intl/intl/es/index.jd b/docs/html-intl/intl/es/index.jd
index f69c442d24b5..e23c99f88748 100644
--- a/docs/html-intl/intl/es/index.jd
+++ b/docs/html-intl/intl/es/index.jd
@@ -26,9 +26,12 @@ page.customHeadTag=<meta name="google-site-verification" content="sa-bIAI6GKvct3
<p class="dac-hero-description">Prepárese para la próxima versión de
Android. Pruebe sus aplicaciones en Nexus 5, 6, 9 y Player. </p>
- <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+ <a class="dac-hero-cta" href="{@docRoot}preview/index.html">
<span class="dac-sprite dac-auto-chevron"></span>
- ¡Empiece hoy mismo!
+ ¡Empiece hoy mismo!</a><br>
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Developer Preview 2</a>
</a>
</div>
</div>
diff --git a/docs/html-intl/intl/es/preview/index.jd b/docs/html-intl/intl/es/preview/index.jd
index 35b578de157c..aae8e4c5277a 100644
--- a/docs/html-intl/intl/es/preview/index.jd
+++ b/docs/html-intl/intl/es/preview/index.jd
@@ -27,6 +27,11 @@ footer.hide=1
<span class="dac-sprite dac-auto-chevron"></span>
¡Empiece hoy mismo!</a>
<br>
+
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Developer Preview 2</a>
+
</div>
</div>
<div class="dac-section dac-small">
@@ -43,7 +48,7 @@ footer.hide=1
<div class="dac-section-subtitle">
Información esencial para ayudarlo a preparar sus aplicaciones para Android M.
</div>
-
+
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/more"
data-cardSizes="6x6"
@@ -55,7 +60,7 @@ footer.hide=1
<span class="dac-sprite dac-auto-chevron"></span>
Informe los problemas
</a>
- </li>
+ </li>
<li class="dac-section-link"><a href="http://g.co/dev/AndroidMDevPreview">
<span class="dac-sprite dac-auto-chevron"></span>
Únase a la comunidad en G+ </a>
diff --git a/docs/html-intl/intl/es/preview/overview.jd b/docs/html-intl/intl/es/preview/overview.jd
index 49cc3d3ea952..2cd21305e1e9 100644
--- a/docs/html-intl/intl/es/preview/overview.jd
+++ b/docs/html-intl/intl/es/preview/overview.jd
@@ -5,6 +5,33 @@ page.tags="preview", "developer", "android"
@jd:body
+<div class="cols" style=
+"background-color:#ffebc3; padding: 5px 0;margin-bottom:1em; text-align:center;">
+<h3>
+ Developer Preview 2 is now available
+ </h3>
+
+ <ul class="dac-section-links">
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-notes">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Read the Notes</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-get">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Get the Update</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="https://code.google.com/p/android-developer-preview/">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Report Issues</a>
+ </li>
+ </ul>
+</div>
+
<p>
Bienvenido a <strong>Android M Developer Preview</strong>, el programa que le brinda todo lo que necesita para probar y optimizar sus aplicaciones para la próxima versión de Android.
diff --git a/docs/html-intl/intl/ja/index.jd b/docs/html-intl/intl/ja/index.jd
index 4b1fa0eca1af..3084b24fe866 100644
--- a/docs/html-intl/intl/ja/index.jd
+++ b/docs/html-intl/intl/ja/index.jd
@@ -26,10 +26,14 @@ page.customHeadTag=<meta name="google-site-verification" content="sa-bIAI6GKvct3
<p class="dac-hero-description">次期ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® Android ã«å‘ã‘ã¦æº–å‚™ã—ã¾ã—ょã†ã€‚
Nexus 5ã€6ã€9ã€Nexus Player ã§ã‚¢ãƒ—リをテストã—ã¾ã™ã€‚ </p>
- <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+ <a class="dac-hero-cta" href="{@docRoot}preview/index.html">
<span class="dac-sprite dac-auto-chevron"></span>
スタートガイド
- </a>
+ </a><br>
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Developer Preview 2</a>
+
</div>
</div>
</div>
diff --git a/docs/html-intl/intl/ja/preview/index.jd b/docs/html-intl/intl/ja/preview/index.jd
index 180f5ea1c3ec..e44a42a9d1c2 100644
--- a/docs/html-intl/intl/ja/preview/index.jd
+++ b/docs/html-intl/intl/ja/preview/index.jd
@@ -27,6 +27,10 @@ footer.hide=1
<span class="dac-sprite dac-auto-chevron"></span>
スタートガイド
</a><br>
+
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Developer Preview 2</a>
</div>
</div>
<div class="dac-section dac-small">
@@ -43,7 +47,7 @@ footer.hide=1
<div class="dac-section-subtitle">
Android M å‘ã‘ã«ã‚¢ãƒ—リを用æ„ã™ã‚‹éš›ã«å½¹ç«‹ã¤å¿…é ˆæƒ…å ±ã‚’ã”æä¾›ã—ã¾ã™ã€‚
</div>
-
+
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/more"
data-cardSizes="6x6"
@@ -55,7 +59,7 @@ footer.hide=1
<span class="dac-sprite dac-auto-chevron"></span>
å•題ã®å ±å‘Š
</a>
- </li>
+ </li>
<li class="dac-section-link"><a href="http://g.co/dev/AndroidMDevPreview">
<span class="dac-sprite dac-auto-chevron"></span>
Join G+ コミュニティ
diff --git a/docs/html-intl/intl/ja/preview/overview.jd b/docs/html-intl/intl/ja/preview/overview.jd
index 4cefdd1aadb4..c5390ef0ba70 100644
--- a/docs/html-intl/intl/ja/preview/overview.jd
+++ b/docs/html-intl/intl/ja/preview/overview.jd
@@ -5,6 +5,33 @@ page.tags="preview", "developer", "android"
@jd:body
+<div class="cols" style=
+"background-color:#ffebc3; padding: 5px 0;margin-bottom:1em; text-align:center;">
+<h3>
+ Developer Preview 2 is now available
+ </h3>
+
+ <ul class="dac-section-links">
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-notes">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Read the Notes</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-get">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Get the Update</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="https://code.google.com/p/android-developer-preview/">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Report Issues</a>
+ </li>
+ </ul>
+</div>
+
<p>
<strong>Android M Developer Preview</strong> ã§ã¯ã€Android ã®æ¬¡ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã‚¢ãƒ—リをテストã—ã¦æœ€é©åŒ–ã™ã‚‹ãŸã‚ã®ã™ã¹ã¦ã‚’å‚™ãˆã¦ã„ã¾ã™ã€‚
@@ -323,7 +350,7 @@ Android M 最終 SDK ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚Œã°æ­£å¼ãª Android M API レベãƒ
</h2>
<p>
- アプリã®ãƒ†ã‚¹ãƒˆã‚’ã¯ã˜ã‚ã‚‹ã«ã¯:
+ アプリã®ãƒ†ã‚¹ãƒˆã‚’ã¯ã˜ã‚ã‚‹ã«ã¯:
</p>
<ol>
diff --git a/docs/html-intl/intl/ko/index.jd b/docs/html-intl/intl/ko/index.jd
index dd756a4b9453..34c14ec3780a 100644
--- a/docs/html-intl/intl/ko/index.jd
+++ b/docs/html-intl/intl/ko/index.jd
@@ -23,13 +23,16 @@ page.customHeadTag=<meta name="google-site-verification" content="sa-bIAI6GKvct3
<div class="dac-hero-tag"></div>
<h1 class="dac-hero-title">Android M Developer Preview</h1>
- <p class="dac-hero-description">Androidì˜ ë‹¤ìŒ ë²„ì „ì„ ë§Œë‚˜ë³¼ 준비가
+ <p class="dac-hero-description">Androidì˜ ë‹¤ìŒ ë²„ì „ì„ ë§Œë‚˜ë³¼ 준비가
ë˜ì…¨ìŠµë‹ˆê¹Œ? ì—¬ëŸ¬ë¶„ì˜ ì•±ì„ Nexus 5, 6, 9 ë° Playerì—서 테스트해보십시오. </p>
- <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+ <a class="dac-hero-cta" href="{@docRoot}preview/index.html">
<span class="dac-sprite dac-auto-chevron"></span>
지금 시작하세요!
- </a>
+ </a><br>
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Developer Preview 2</a>
</div>
</div>
</div>
diff --git a/docs/html-intl/intl/ko/preview/index.jd b/docs/html-intl/intl/ko/preview/index.jd
index 15b14f960974..9d0e040e379c 100644
--- a/docs/html-intl/intl/ko/preview/index.jd
+++ b/docs/html-intl/intl/ko/preview/index.jd
@@ -27,6 +27,9 @@ footer.hide=1
<span class="dac-sprite dac-auto-chevron"></span>
지금 시작하세요!
</a><br>
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Developer Preview 2</a>
</div>
</div>
<div class="dac-section dac-small">
@@ -43,7 +46,7 @@ footer.hide=1
<div class="dac-section-subtitle">
ì•±ì„ Android Mì— ëŒ€ë¹„ì‹œí‚¤ëŠ” ë° ìœ ìš©í•œ 중요 정보입니다.
</div>
-
+
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/more"
data-cardSizes="6x6"
@@ -55,7 +58,7 @@ footer.hide=1
<span class="dac-sprite dac-auto-chevron"></span>
문제 보고
</a>
- </li>
+ </li>
<li class="dac-section-link"><a href="http://g.co/dev/AndroidMDevPreview">
<span class="dac-sprite dac-auto-chevron"></span>
G+ 커뮤니티 가입
diff --git a/docs/html-intl/intl/ko/preview/overview.jd b/docs/html-intl/intl/ko/preview/overview.jd
index d32572590f9c..04febc716544 100644
--- a/docs/html-intl/intl/ko/preview/overview.jd
+++ b/docs/html-intl/intl/ko/preview/overview.jd
@@ -5,6 +5,33 @@ page.tags="preview", "developer", "android"
@jd:body
+<div class="cols" style=
+"background-color:#ffebc3; padding: 5px 0;margin-bottom:1em; text-align:center;">
+<h3>
+ Developer Preview 2 is now available
+ </h3>
+
+ <ul class="dac-section-links">
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-notes">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Read the Notes</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-get">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Get the Update</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="https://code.google.com/p/android-developer-preview/">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Report Issues</a>
+ </li>
+ </ul>
+</div>
+
<p>
<strong>Android M ê°œë°œìž ë¯¸ë¦¬ 보기</strong>를 시작하신 여러분, 환ì˜í•©ë‹ˆë‹¤. ì´ í”„ë¡œê·¸ëž¨ì€ Androidì˜ ë‹¤ìŒ ë²„ì „ì— ëŒ€í•´ ì•±ì„ í…ŒìŠ¤íŠ¸í•˜ê³  최ì í™”하는 ë° í•„ìš”í•œ 모든 ê²ƒì„ ì œê³µí•´ 드립니다.
diff --git a/docs/html-intl/intl/pt-br/index.jd b/docs/html-intl/intl/pt-br/index.jd
index dd48fe2ee219..24dd2fefa369 100644
--- a/docs/html-intl/intl/pt-br/index.jd
+++ b/docs/html-intl/intl/pt-br/index.jd
@@ -26,10 +26,12 @@ page.customHeadTag=<meta name="google-site-verification" content="sa-bIAI6GKvct3
<p class="dac-hero-description">Prepare-se para a próxima versão do
Android. Teste os aplicativos no Nexus 5, 6, 9 e Player. </p>
- <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+ <a class="dac-hero-cta" href="{@docRoot}preview/index.html">
<span class="dac-sprite dac-auto-chevron"></span>
- Comece!
- </a>
+ Comece!</a><br>
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Developer Preview 2</a>
</div>
</div>
</div>
diff --git a/docs/html-intl/intl/pt-br/preview/index.jd b/docs/html-intl/intl/pt-br/preview/index.jd
index 1e0252ffcf89..172b21103be7 100644
--- a/docs/html-intl/intl/pt-br/preview/index.jd
+++ b/docs/html-intl/intl/pt-br/preview/index.jd
@@ -27,6 +27,9 @@ footer.hide=1
<span class="dac-sprite dac-auto-chevron"></span>
Comece!
</a><br>
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Developer Preview 2</a>
</div>
</div>
<div class="dac-section dac-small">
@@ -43,7 +46,7 @@ footer.hide=1
<div class="dac-section-subtitle">
Informações essenciais para ajudar você a preparar os aplicativos para Android M.
</div>
-
+
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/more"
data-cardSizes="6x6"
@@ -55,7 +58,7 @@ footer.hide=1
<span class="dac-sprite dac-auto-chevron"></span>
Relate problemas
</a>
- </li>
+ </li>
<li class="dac-section-link"><a href="http://g.co/dev/AndroidMDevPreview">
<span class="dac-sprite dac-auto-chevron"></span>
Junte-se à comunidade do G+
diff --git a/docs/html-intl/intl/pt-br/preview/overview.jd b/docs/html-intl/intl/pt-br/preview/overview.jd
index ce5a596ca84f..e81ccd7916e9 100644
--- a/docs/html-intl/intl/pt-br/preview/overview.jd
+++ b/docs/html-intl/intl/pt-br/preview/overview.jd
@@ -5,6 +5,33 @@ page.tags="preview", "developer", "android"
@jd:body
+<div class="cols" style=
+"background-color:#ffebc3; padding: 5px 0;margin-bottom:1em; text-align:center;">
+<h3>
+ Developer Preview 2 is now available
+ </h3>
+
+ <ul class="dac-section-links">
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-notes">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Read the Notes</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-get">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Get the Update</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="https://code.google.com/p/android-developer-preview/">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Report Issues</a>
+ </li>
+ </ul>
+</div>
+
<p>
Boas-vindas ao <strong>Android M Developer Preview</strong>, um programa que fornece
tudo que é necessário para testar e otimizar os aplicativos para a próxima versão
diff --git a/docs/html-intl/intl/ru/index.jd b/docs/html-intl/intl/ru/index.jd
index f59a1369558c..3fe65eaf4efc 100644
--- a/docs/html-intl/intl/ru/index.jd
+++ b/docs/html-intl/intl/ru/index.jd
@@ -27,10 +27,13 @@ page.customHeadTag=<meta name="google-site-verification" content="sa-bIAI6GKvct3
платформы Android. ПротеÑтируйте ваши Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° уÑтройÑтвах Nexus
5, 6, 9 и Player. </p>
- <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+ <a class="dac-hero-cta" href="{@docRoot}preview/index.html">
<span class="dac-sprite dac-auto-chevron"></span>
Итак, приÑтупим!
- </a>
+ </a><br>
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Developer Preview 2</a>
</div>
</div>
</div>
diff --git a/docs/html-intl/intl/ru/preview/index.jd b/docs/html-intl/intl/ru/preview/index.jd
index 27adbf98b00b..138a5a6efd04 100644
--- a/docs/html-intl/intl/ru/preview/index.jd
+++ b/docs/html-intl/intl/ru/preview/index.jd
@@ -27,6 +27,9 @@ Player. Узнайте о новых возможноÑÑ‚ÑÑ…:&mdash; <strong>Ñ€
<span class="dac-sprite dac-auto-chevron"></span>
Итак, приÑтупим!
</a><br>
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Developer Preview 2</a>
</div>
</div>
<div class="dac-section dac-small">
@@ -43,7 +46,7 @@ Player. Узнайте о новых возможноÑÑ‚ÑÑ…:&mdash; <strong>Ñ€
<div class="dac-section-subtitle">
Ð’Ð°Ð¶Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾Ð¼Ð¾Ð¶ÐµÑ‚ вам подготовить ваши Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ в Android M.
</div>
-
+
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/more"
data-cardSizes="6x6"
@@ -55,7 +58,7 @@ Player. Узнайте о новых возможноÑÑ‚ÑÑ…:&mdash; <strong>Ñ€
<span class="dac-sprite dac-auto-chevron"></span>
Сообщить о проблеме
</a>
- </li>
+ </li>
<li class="dac-section-link"><a href="http://g.co/dev/AndroidMDevPreview">
<span class="dac-sprite dac-auto-chevron"></span>
ПриÑоединитьÑÑ Ðº ÑообщеÑтву в G+
diff --git a/docs/html-intl/intl/ru/preview/overview.jd b/docs/html-intl/intl/ru/preview/overview.jd
index 6ed1d208b8e1..d1345a256400 100644
--- a/docs/html-intl/intl/ru/preview/overview.jd
+++ b/docs/html-intl/intl/ru/preview/overview.jd
@@ -5,6 +5,33 @@ page.tags="preview", "developer", "android"
@jd:body
+<div class="cols" style=
+"background-color:#ffebc3; padding: 5px 0;margin-bottom:1em; text-align:center;">
+<h3>
+ Developer Preview 2 is now available
+ </h3>
+
+ <ul class="dac-section-links">
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-notes">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Read the Notes</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-get">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Get the Update</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="https://code.google.com/p/android-developer-preview/">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Report Issues</a>
+ </li>
+ </ul>
+</div>
+
<p>
Добро пожаловать в программу <strong>Android M Developer Preview</strong>, учаÑтники которой получают вÑÑ‘ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð¾ÐµÐ´Ð»Ñ Ñ‚ÐµÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ оптимизации Ñвоих приложений Ð´Ð»Ñ Ñледующей верÑии платформы Android.
@@ -114,7 +141,7 @@ page.tags="preview", "developer", "android"
<img src="{@docRoot}preview/images/m-preview-timeline-crop.png" alt="Preview program timeline" id="timeline">
<p>
ТеÑтирование верÑии M Developer Preview запланировано на период Ñ 28Â Ð¼Ð°Ñ Ð´Ð¾ выпуÑка окончательной верÑии пакета SDK Android M, который
-ÑоÑтоитÑÑ Ð½ÐµÐ·Ð°Ð´Ð¾Ð»Ð³Ð¾ до публикации новой платформы в открытом доÑтупе в
+ÑоÑтоитÑÑ Ð½ÐµÐ·Ð°Ð´Ð¾Ð»Ð³Ð¾ до публикации новой платформы в открытом доÑтупе в
третьем квартале 2015 г.
</p>
diff --git a/docs/html-intl/intl/zh-cn/index.jd b/docs/html-intl/intl/zh-cn/index.jd
index 67035eac0639..bbd7fbe7fb37 100644
--- a/docs/html-intl/intl/zh-cn/index.jd
+++ b/docs/html-intl/intl/zh-cn/index.jd
@@ -26,9 +26,12 @@ page.customHeadTag=<meta name="google-site-verification" content="sa-bIAI6GKvct3
<p class="dac-hero-description">准备迎接 Android 的下一版本。在 Nexus 5ã€
6ã€9 å’Œ Player 中测试应用。 </p>
- <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+ <a class="dac-hero-cta" href="{@docRoot}preview/index.html">
<span class="dac-sprite dac-auto-chevron"></span>
- 开始ï¼
+ 开始ï¼</a><br>
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Developer Preview 2</a>
</a>
</div>
</div>
diff --git a/docs/html-intl/intl/zh-cn/preview/index.jd b/docs/html-intl/intl/zh-cn/preview/index.jd
index 19b4b78af1b0..36ad71863a0d 100644
--- a/docs/html-intl/intl/zh-cn/preview/index.jd
+++ b/docs/html-intl/intl/zh-cn/preview/index.jd
@@ -27,6 +27,9 @@ footer.hide=1
<span class="dac-sprite dac-auto-chevron"></span>
开始ï¼
</a><br>
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Developer Preview 2</a>
</div>
</div>
<div class="dac-section dac-small">
@@ -43,7 +46,7 @@ footer.hide=1
<div class="dac-section-subtitle">
帮助您的应用准备使用 Android M 的必备信æ¯ã€‚
</div>
-
+
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/more"
data-cardSizes="6x6"
@@ -55,7 +58,7 @@ footer.hide=1
<span class="dac-sprite dac-auto-chevron"></span>
报告问题
</a>
- </li>
+ </li>
<li class="dac-section-link"><a href="http://g.co/dev/AndroidMDevPreview">
<span class="dac-sprite dac-auto-chevron"></span>
加入 G+ 社区
diff --git a/docs/html-intl/intl/zh-cn/preview/overview.jd b/docs/html-intl/intl/zh-cn/preview/overview.jd
index cebbf06a9d3d..d931db0a678a 100644
--- a/docs/html-intl/intl/zh-cn/preview/overview.jd
+++ b/docs/html-intl/intl/zh-cn/preview/overview.jd
@@ -5,6 +5,33 @@ page.tags="preview", "developer", "android"
@jd:body
+<div class="cols" style=
+"background-color:#ffebc3; padding: 5px 0;margin-bottom:1em; text-align:center;">
+<h3>
+ Developer Preview 2 is now available
+ </h3>
+
+ <ul class="dac-section-links">
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-notes">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Read the Notes</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-get">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Get the Update</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="https://code.google.com/p/android-developer-preview/">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Report Issues</a>
+ </li>
+ </ul>
+</div>
+
<p>
欢迎使用 <strong>Android M å¼€å‘者预览版</strong>计划。此计划将为您æä¾›é’ˆå¯¹ Android 的下一版本测试和优化应用所需的所有功能。
@@ -295,7 +322,7 @@ page.tags="preview", "developer", "android"
</p>
<p>
- Android M å¼€å‘者预览版æä¾›<strong>预览 API</strong> 功能
+ Android M å¼€å‘者预览版æä¾›<strong>预览 API</strong> 功能
&mdash; 在最终的 SDK å‘布之å‰ï¼Œè¿™äº› API éƒ½ä¸æ˜¯æ­£å¼çš„ API。目å‰ï¼Œæœ€ç»ˆçš„ SDK 计划于 2015 年第三季度å‘布。
è¿™æ„味ç€ä¸€æ®µæ—¶æœŸå†…,特别是该计划的最åˆå‡ å‘¨å†…,
<strong>API å¯èƒ½ä¼šå‡ºçŽ°ç»†å¾®å˜åŒ–</strong>。
diff --git a/docs/html-intl/intl/zh-tw/index.jd b/docs/html-intl/intl/zh-tw/index.jd
index e788062067b0..53bbd8da1006 100644
--- a/docs/html-intl/intl/zh-tw/index.jd
+++ b/docs/html-intl/intl/zh-tw/index.jd
@@ -23,13 +23,16 @@ page.customHeadTag=<meta name="google-site-verification" content="sa-bIAI6GKvct3
<div class="dac-hero-tag"></div>
<h1 class="dac-hero-title">Android M Developer Preview</h1>
- <p class="dac-hero-description">準備使用新版 Android。在 Nexus 5ã€6ã€9 å’Œ
+ <p class="dac-hero-description">準備使用新版 Android。在 Nexus 5ã€6ã€9 å’Œ
Player 上測試您的應用程å¼ã€‚ </p>
- <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+ <a class="dac-hero-cta" href="{@docRoot}preview/index.html">
<span class="dac-sprite dac-auto-chevron"></span>
開始使用ï¼
- </a>
+ </a><br>
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Developer Preview 2</a>
</div>
</div>
</div>
diff --git a/docs/html-intl/intl/zh-tw/preview/index.jd b/docs/html-intl/intl/zh-tw/preview/index.jd
index f57728c2bfe7..a9cf1aebcf71 100644
--- a/docs/html-intl/intl/zh-tw/preview/index.jd
+++ b/docs/html-intl/intl/zh-tw/preview/index.jd
@@ -27,6 +27,9 @@ footer.hide=1
<span class="dac-sprite dac-auto-chevron"></span>
開始使用ï¼
</a><br>
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Developer Preview 2</a>
</div>
</div>
<div class="dac-section dac-small">
@@ -43,7 +46,7 @@ footer.hide=1
<div class="dac-section-subtitle">
以下é‡è¦è³‡è¨Šå¯å¹«åŠ©æ‚¨çš„æ‡‰ç”¨ç¨‹å¼æº–備好使用 Android M。
</div>
-
+
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/more"
data-cardSizes="6x6"
@@ -55,7 +58,7 @@ footer.hide=1
<span class="dac-sprite dac-auto-chevron"></span>
回報å•題
</a>
- </li>
+ </li>
<li class="dac-section-link"><a href="http://g.co/dev/AndroidMDevPreview">
<span class="dac-sprite dac-auto-chevron"></span>
åƒåŠ  G+ 社群
diff --git a/docs/html-intl/intl/zh-tw/preview/overview.jd b/docs/html-intl/intl/zh-tw/preview/overview.jd
index 63cde328a70f..9693eec670f1 100644
--- a/docs/html-intl/intl/zh-tw/preview/overview.jd
+++ b/docs/html-intl/intl/zh-tw/preview/overview.jd
@@ -5,6 +5,33 @@ page.tags="preview", "developer", "android"
@jd:body
+<div class="cols" style=
+"background-color:#ffebc3; padding: 5px 0;margin-bottom:1em; text-align:center;">
+<h3>
+ Developer Preview 2 is now available
+ </h3>
+
+ <ul class="dac-section-links">
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-notes">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Read the Notes</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-get">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Get the Update</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="https://code.google.com/p/android-developer-preview/">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Report Issues</a>
+ </li>
+ </ul>
+</div>
+
<p>
歡迎使用「Android M 開發人員é è¦½ç‰ˆã€<strong></strong>ï¼Œæœ¬ç¨‹å¼æä¾›ç‚ºæ–°ç‰ˆ Android æ¸¬è©¦å’Œæœ€ä½³åŒ–æ‚¨æ‡‰ç”¨ç¨‹å¼æ‰€éœ€çš„一切。
diff --git a/docs/html/index.jd b/docs/html/index.jd
index 794494e279c2..c6dbbd5278d6 100644
--- a/docs/html/index.jd
+++ b/docs/html/index.jd
@@ -26,10 +26,16 @@ page.customHeadTag=<meta name="google-site-verification" content="sa-bIAI6GKvct3
<p class="dac-hero-description">Get your apps ready for the next version
of Android. Test on Nexus 5, 6, 9, and Player. </p>
- <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+ <a class="dac-hero-cta" href="{@docRoot}preview/index.html">
<span class="dac-sprite dac-auto-chevron"></span>
Get started
+ </a><br>
+
+ <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Update to Developer Preview 2
</a>
+
</div>
</div>
</div>
diff --git a/docs/html/preview/overview.jd b/docs/html/preview/overview.jd
index 36b177d4a07a..009e268a754c 100644
--- a/docs/html/preview/overview.jd
+++ b/docs/html/preview/overview.jd
@@ -5,6 +5,33 @@ page.tags="preview", "developer", "android"
@jd:body
+<div class="cols" style=
+"background-color:#ffebc3; padding: 5px 0;margin-bottom:1em; text-align:center;">
+<h3>
+ Developer Preview 2 is now available
+ </h3>
+
+ <ul class="dac-section-links">
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-notes">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Read the Notes</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="{@docRoot}preview/support.html#preview2-get">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Get the Update</a>
+ </li>
+
+ <li class="dac-section-link">
+ <a href="https://code.google.com/p/android-developer-preview/">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ Report Issues</a>
+ </li>
+ </ul>
+</div>
+
<p>
Welcome to the <strong>Android M Developer Preview</strong>, a program that gives you
everything you need to test and optimize your apps for the next version of
@@ -128,15 +155,15 @@ page.tags="preview", "developer", "android"
<ul>
<li>
- <strong>Preview&nbsp;1</strong> (initial Preview release, late May),
+ <strong><a href="{@docRoot}preview/download_mp1.html">Preview&nbsp;1</a></strong> (available).
</li>
<li>
- <strong>Preview&nbsp;2</strong> (late June/early July), and
+ <strong><a href="{@docRoot}preview/download.html">Preview&nbsp;2</a></strong> (available).
</li>
<li>
- <strong>Preview&nbsp;3</strong> (near final, late July)
+ <strong>Preview&nbsp;3</strong> (near final, late July).
</li>
</ul>
diff --git a/docs/html/preview/preview_toc.cs b/docs/html/preview/preview_toc.cs
index 5cc215968ee1..83f69a4d1df9 100644
--- a/docs/html/preview/preview_toc.cs
+++ b/docs/html/preview/preview_toc.cs
@@ -126,7 +126,7 @@
<li class="nav-section">
<div class="nav-section-header empty"><a href="<?cs var:toroot ?>preview/support.html">
- Support</a></div>
+ Support & Release Notes</a></div>
</li>
<li class="nav-section">
diff --git a/docs/html/preview/support.jd b/docs/html/preview/support.jd
index 9922eda37888..d908f779ebcb 100644
--- a/docs/html/preview/support.jd
+++ b/docs/html/preview/support.jd
@@ -1,4 +1,4 @@
-page.title=Support
+page.title=Support and Release Notes
page.tags="preview", "developer preview"
page.image=images/cards/card-support_16-9_2x.png
@@ -14,7 +14,7 @@ page.image=images/cards/card-support_16-9_2x.png
<li class="dac-section-link">
<a href="#preview2-notes">
<span class="dac-sprite dac-auto-chevron"></span>
- Release notes</a>
+ Read the Notes</a>
</li>
<li class="dac-section-link">
@@ -158,14 +158,14 @@ page.image=images/cards/card-support_16-9_2x.png
<li>The <code>android.permission.WRITE_EXTERNAL_STORAGE</code> permission
has protection level "dangerous", meaning that apps wanting to write to
external storage will need to request permission from the user at
- runtime. Both <code>WRITE_EXTERNAL_STORAGE</code> and
+ runtime. Both <code>READ_EXTERNAL_STORAGE</code> and
<code>WRITE_EXTERNAL_STORAGE</code> are members of the
<code>STORAGE</code> permission group.
</li>
<li>Remote Bluetooth/Wi-Fi MAC's now require either the
<code>android.permission.LOCATION_FINE</code> or
- <code>android.permission.LOCATION_COURSE</code> permission.
+ <code>android.permission.LOCATION_COARSE</code> permission.
</li>
<li>Some accounts and identity permissions are moved to
@@ -246,9 +246,11 @@ page.image=images/cards/card-support_16-9_2x.png
<strong>Clear data</strong>.</li>
<li>In YouTube app, it's not possible to share a video. The share window is
blank.</li>
- <li>Android For Work Profile setup is not working properly, so you won't be
- able to create a new Work Profile after you update. As a workaround, make
- sure to create the Work Profiles you need in Developer Preview 1 before
+ <li>The bundled Google Apps Device Policy app included in Developer Preview 2 is unable to
+ properly set up an Android for Work Profile, so you cannot create a new Work Profile with this
+ app after you update. This issue is specific to the Google Apps Device Policy app, and not the
+ Android for Work platform (or our partner EMM providers). As a workaround for users of the
+ Google Apps Device Policy app, be sure to create a Work Profile in Developer Preview 1 before
updating to Developer Preview 2.
</li>
</ul>
@@ -256,10 +258,9 @@ page.image=images/cards/card-support_16-9_2x.png
<li>Issues specific to MPZ79N on Nexus Player:
<ul>
<li>Bluetooth share crashes after clearing data. Please <strong>do not
- clear Bluetooth share data</strong>, otherwise you will need to Factory
+ clear app data for system services</strong>, otherwise you will need to Factory
Reset your device</li>
- <li>There are issues with remote control connectivity. Remote can drop
- from Bluetooth pairing when left idle. </li>
+ <li>Remote control can experience intermittent connectivity issues. </li>
<li>Movies show black screen with some ANRs on exiting the video.</li>
<li>In YouTube app, lower-resolution videos have a green bar at the top
and some color-ghosting</li>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes.html b/docs/html/sdk/support_api_diff/22.2.0/changes.html
new file mode 100644
index 000000000000..c837f78f78b1
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<!-- on Mon Jul 06 15:20:42 BST 2015 -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Support&nbsp;Library&nbsp;API&nbsp;Differences&nbsp;Report
+</TITLE>
+<link href="../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</head>
+<frameset cols="242,**" framespacing="1" frameborder="yes" border="1" bordercolor="#e9e9e9">
+<frameset rows="174,**" framespacing="1" frameborder="yes" border="1" bordercolor="#e9e9e9">
+ <frame src="changes/jdiff_topleftframe.html" scrolling="no" name="topleftframe" frameborder="1">
+ <frame src="changes/alldiffs_index_all.html" scrolling="auto" name="bottomleftframe" frameborder="1">
+ </frameset>
+ <frame src="changes/changes-summary.html" scrolling="auto" name="rightframe" frameborder="1">
+</frameset>
+<noframes>
+<h2>
+Frame Alert
+</h2>
+
+<p>
+This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+<br>
+Link to <a href="changes/changes-summary.html" target="_top">Non-frame version.</A>
+</noframes>
+</html>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_additions.html b/docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_additions.html
new file mode 100644
index 000000000000..9786c9209afc
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_additions.html
@@ -0,0 +1,346 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+All Additions Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for All Differences" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="alldiffs_index_all.html" xclass="hiddenlink">All Differences</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<b>Additions</b>
+ <br>
+<A HREF="alldiffs_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<!-- Method addCustomAction -->
+<A NAME="A"></A>
+<br><font size="+2">A</font>&nbsp;
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<i>addCustomAction</i><br>
+&nbsp;&nbsp;<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.addCustomAction_added(android.support.v4.media.session.PlaybackStateCompat.CustomAction)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>CustomAction</code>)</b>&nbsp;in&nbsp;android.support.v4.media.session.PlaybackStateCompat.Builder
+</A></nobr><br>
+<!-- Method addCustomAction -->
+&nbsp;&nbsp;<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.addCustomAction_added(java.lang.String, java.lang.String, int)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>String, String, int</code>)</b>&nbsp;in&nbsp;android.support.v4.media.session.PlaybackStateCompat.Builder
+</A></nobr><br>
+<!-- Method addOnPageChangeListener -->
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.addOnPageChangeListener_added(android.support.v4.view.ViewPager.OnPageChangeListener)" class="hiddenlink" target="rightframe"><b>addOnPageChangeListener</b>
+(<code>OnPageChangeListener</code>)</A></nobr><br>
+<!-- Package android.support.design.widget -->
+<A HREF="changes-summary.html#android.support.design.widget" class="hiddenlink" target="rightframe"><b>android.support.design.widget</b></A><br>
+<!-- Package android.support.v17.leanback.app -->
+<A HREF="changes-summary.html#android.support.v17.leanback.app" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.app</b></A><br>
+<!-- Package android.support.v17.leanback.database -->
+<A HREF="changes-summary.html#android.support.v17.leanback.database" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.database</b></A><br>
+<!-- Package android.support.v17.leanback.graphics -->
+<A HREF="changes-summary.html#android.support.v17.leanback.graphics" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.graphics</b></A><br>
+<!-- Package android.support.v17.leanback.widget -->
+<A HREF="changes-summary.html#android.support.v17.leanback.widget" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.widget</b></A><br>
+<!-- Package android.support.v4.animation -->
+<A HREF="changes-summary.html#android.support.v4.animation" class="hiddenlink" target="rightframe"><b>android.support.v4.animation</b></A><br>
+<!-- Package android.support.v4.content.pm -->
+<A HREF="changes-summary.html#android.support.v4.content.pm" class="hiddenlink" target="rightframe"><b>android.support.v4.content.pm</b></A><br>
+<!-- Package android.support.v4.content.res -->
+<A HREF="changes-summary.html#android.support.v4.content.res" class="hiddenlink" target="rightframe"><b>android.support.v4.content.res</b></A><br>
+<!-- Package android.support.v7.appcompat -->
+<A HREF="changes-summary.html#android.support.v7.appcompat" class="hiddenlink" target="rightframe"><b>android.support.v7.appcompat</b></A><br>
+<!-- Package android.support.v7.recyclerview -->
+<A HREF="changes-summary.html#android.support.v7.recyclerview" class="hiddenlink" target="rightframe"><b>android.support.v7.recyclerview</b></A><br>
+<!-- Package android.support.v7.widget.helper -->
+<A HREF="changes-summary.html#android.support.v7.widget.helper" class="hiddenlink" target="rightframe"><b>android.support.v7.widget.helper</b></A><br>
+<!-- Method clear -->
+<A NAME="C"></A>
+<br><font size="+2">C</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v7.util.SortedList.html#android.support.v7.util.SortedList.clear_added()" class="hiddenlink" target="rightframe"><b>clear</b>
+()</A></nobr><br>
+<!-- Method clearOnPageChangeListeners -->
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.clearOnPageChangeListeners_added()" class="hiddenlink" target="rightframe"><b>clearOnPageChangeListeners</b>
+()</A></nobr><br>
+<!-- Field CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION -->
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION</A>
+</nobr><br>
+<!-- Field CONTENT_CHANGE_TYPE_SUBTREE -->
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_SUBTREE</A>
+</nobr><br>
+<!-- Field CONTENT_CHANGE_TYPE_TEXT -->
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_TEXT" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_TEXT</A>
+</nobr><br>
+<!-- Field CONTENT_CHANGE_TYPE_UNDEFINED -->
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_UNDEFINED</A>
+</nobr><br>
+<!-- Method fromCustomAction -->
+<A NAME="F"></A>
+<br><font size="+2">F</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.CustomAction.html#android.support.v4.media.session.PlaybackStateCompat.CustomAction.fromCustomAction_added(java.lang.Object)" class="hiddenlink" target="rightframe"><b>fromCustomAction</b>
+(<code>Object</code>)</A></nobr><br>
+<!-- Method getActiveQueueItemId -->
+<A NAME="G"></A>
+<br><font size="+2">G</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.getActiveQueueItemId_added()" class="hiddenlink" target="rightframe"><b>getActiveQueueItemId</b>
+()</A></nobr><br>
+<!-- Method getContentChangeTypes -->
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.getContentChangeTypes_added(android.view.accessibility.AccessibilityEvent)" class="hiddenlink" target="rightframe"><b>getContentChangeTypes</b>
+(<code>AccessibilityEvent</code>)</A></nobr><br>
+<!-- Method getCustomAction -->
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.CustomAction.html#android.support.v4.media.session.PlaybackStateCompat.CustomAction.getCustomAction_added()" class="hiddenlink" target="rightframe"><b>getCustomAction</b>
+()</A></nobr><br>
+<!-- Method getCustomActions -->
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.getCustomActions_added()" class="hiddenlink" target="rightframe"><b>getCustomActions</b>
+()</A></nobr><br>
+<!-- Method getExtras -->
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.getExtras_added()" class="hiddenlink" target="rightframe"><b>getExtras</b>
+()</A></nobr><br>
+<!-- Method isAttachedToWindow -->
+<A NAME="I"></A>
+<br><font size="+2">I</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewCompat.html#android.support.v4.view.ViewCompat.isAttachedToWindow_added(android.view.View)" class="hiddenlink" target="rightframe"><b>isAttachedToWindow</b>
+(<code>View</code>)</A></nobr><br>
+<!-- Method isHandleNativeActionModesEnabled -->
+<nobr><A HREF="android.support.v7.app.AppCompatDelegate.html#android.support.v7.app.AppCompatDelegate.isHandleNativeActionModesEnabled_added()" class="hiddenlink" target="rightframe"><b>isHandleNativeActionModesEnabled</b>
+()</A></nobr><br>
+<!-- Method notifySubtreeAccessibilityStateChanged -->
+<A NAME="N"></A>
+<br><font size="+2">N</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewParentCompat.html#android.support.v4.view.ViewParentCompat.notifySubtreeAccessibilityStateChanged_added(android.view.ViewParent, android.view.View, android.view.View, int)" class="hiddenlink" target="rightframe"><b>notifySubtreeAccessibilityStateChanged</b>
+(<code>ViewParent, View, View, int</code>)</A></nobr><br>
+<!-- Method offsetLeftAndRight -->
+<A NAME="O"></A>
+<br><font size="+2">O</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewCompat.html#android.support.v4.view.ViewCompat.offsetLeftAndRight_added(android.view.View, int)" class="hiddenlink" target="rightframe"><b>offsetLeftAndRight</b>
+(<code>View, int</code>)</A></nobr><br>
+<!-- Method offsetTopAndBottom -->
+<nobr><A HREF="android.support.v4.view.ViewCompat.html#android.support.v4.view.ViewCompat.offsetTopAndBottom_added(android.view.View, int)" class="hiddenlink" target="rightframe"><b>offsetTopAndBottom</b>
+(<code>View, int</code>)</A></nobr><br>
+<!-- Method onWindowStartingSupportActionMode -->
+<i>onWindowStartingSupportActionMode</i><br>
+&nbsp;&nbsp;<nobr><A HREF="android.support.v7.app.AppCompatActivity.html#android.support.v7.app.AppCompatActivity.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>Callback</code>)</b>&nbsp;in&nbsp;android.support.v7.app.AppCompatActivity
+</A></nobr><br>
+<!-- Method onWindowStartingSupportActionMode -->
+&nbsp;&nbsp;<nobr><A HREF="android.support.v7.app.AppCompatCallback.html#android.support.v7.app.AppCompatCallback.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>Callback</code>)</b>&nbsp;in&nbsp;android.support.v7.app.AppCompatCallback
+</A></nobr><br>
+<!-- Method onWindowStartingSupportActionMode -->
+&nbsp;&nbsp;<nobr><A HREF="android.support.v7.app.AppCompatDialog.html#android.support.v7.app.AppCompatDialog.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>Callback</code>)</b>&nbsp;in&nbsp;android.support.v7.app.AppCompatDialog
+</A></nobr><br>
+<!-- Method removeOnPageChangeListener -->
+<A NAME="R"></A>
+<br><font size="+2">R</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.removeOnPageChangeListener_added(android.support.v4.view.ViewPager.OnPageChangeListener)" class="hiddenlink" target="rightframe"><b>removeOnPageChangeListener</b>
+(<code>OnPageChangeListener</code>)</A></nobr><br>
+<!-- Method setActiveQueueItemId -->
+<A NAME="S"></A>
+<br><font size="+2">S</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.setActiveQueueItemId_added(long)" class="hiddenlink" target="rightframe"><b>setActiveQueueItemId</b>
+(<code>long</code>)</A></nobr><br>
+<!-- Method setContentChangeTypes -->
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.setContentChangeTypes_added(android.view.accessibility.AccessibilityEvent, int)" class="hiddenlink" target="rightframe"><b>setContentChangeTypes</b>
+(<code>AccessibilityEvent, int</code>)</A></nobr><br>
+<!-- Method setExtras -->
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.setExtras_added(android.os.Bundle)" class="hiddenlink" target="rightframe"><b>setExtras</b>
+(<code>Bundle</code>)</A></nobr><br>
+<!-- Method setHandleNativeActionModesEnabled -->
+<nobr><A HREF="android.support.v7.app.AppCompatDelegate.html#android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setHandleNativeActionModesEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<!-- Field STATE_CONNECTING -->
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.STATE_CONNECTING" class="hiddenlink" target="rightframe">STATE_CONNECTING</A>
+</nobr><br>
+<!-- Field STATE_SKIPPING_TO_QUEUE_ITEM -->
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.STATE_SKIPPING_TO_QUEUE_ITEM" class="hiddenlink" target="rightframe">STATE_SKIPPING_TO_QUEUE_ITEM</A>
+</nobr><br>
+<!-- Method translationZ -->
+<A NAME="T"></A>
+<br><font size="+2">T</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.translationZ_added(float)" class="hiddenlink" target="rightframe"><b>translationZ</b>
+(<code>float</code>)</A></nobr><br>
+<!-- Method translationZBy -->
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.translationZBy_added(float)" class="hiddenlink" target="rightframe"><b>translationZBy</b>
+(<code>float</code>)</A></nobr><br>
+<!-- Method z -->
+<A NAME="Z"></A>
+<br><font size="+2">Z</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.z_added(float)" class="hiddenlink" target="rightframe"><b>z</b>
+(<code>float</code>)</A></nobr><br>
+<!-- Method zBy -->
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.zBy_added(float)" class="hiddenlink" target="rightframe"><b>zBy</b>
+(<code>float</code>)</A></nobr><br>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_all.html b/docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_all.html
new file mode 100644
index 000000000000..7055d159d487
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_all.html
@@ -0,0 +1,439 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+All Differences Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for All Differences" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<b>All Differences</b>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="alldiffs_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="alldiffs_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<!-- Class AccessibilityEventCompat -->
+<A NAME="A"></A>
+<br><font size="+2">A</font>&nbsp;
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html" class="hiddenlink" target="rightframe">AccessibilityEventCompat</A><br>
+<!-- Method addCustomAction -->
+<i>addCustomAction</i><br>
+&nbsp;&nbsp;<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.addCustomAction_added(android.support.v4.media.session.PlaybackStateCompat.CustomAction)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>CustomAction</code>)</b>&nbsp;in&nbsp;android.support.v4.media.session.PlaybackStateCompat.Builder
+</A></nobr><br>
+<!-- Method addCustomAction -->
+&nbsp;&nbsp;<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.addCustomAction_added(java.lang.String, java.lang.String, int)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>String, String, int</code>)</b>&nbsp;in&nbsp;android.support.v4.media.session.PlaybackStateCompat.Builder
+</A></nobr><br>
+<!-- Method addOnPageChangeListener -->
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.addOnPageChangeListener_added(android.support.v4.view.ViewPager.OnPageChangeListener)" class="hiddenlink" target="rightframe"><b>addOnPageChangeListener</b>
+(<code>OnPageChangeListener</code>)</A></nobr><br>
+<!-- Package android.support.design.widget -->
+<A HREF="changes-summary.html#android.support.design.widget" class="hiddenlink" target="rightframe"><b>android.support.design.widget</b></A><br>
+<!-- Package android.support.v17.leanback.app -->
+<A HREF="changes-summary.html#android.support.v17.leanback.app" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.app</b></A><br>
+<!-- Package android.support.v17.leanback.database -->
+<A HREF="changes-summary.html#android.support.v17.leanback.database" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.database</b></A><br>
+<!-- Package android.support.v17.leanback.graphics -->
+<A HREF="changes-summary.html#android.support.v17.leanback.graphics" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.graphics</b></A><br>
+<!-- Package android.support.v17.leanback.widget -->
+<A HREF="changes-summary.html#android.support.v17.leanback.widget" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.widget</b></A><br>
+<!-- Package android.support.v4.animation -->
+<A HREF="changes-summary.html#android.support.v4.animation" class="hiddenlink" target="rightframe"><b>android.support.v4.animation</b></A><br>
+<!-- Package android.support.v4.content.pm -->
+<A HREF="changes-summary.html#android.support.v4.content.pm" class="hiddenlink" target="rightframe"><b>android.support.v4.content.pm</b></A><br>
+<!-- Package android.support.v4.content.res -->
+<A HREF="changes-summary.html#android.support.v4.content.res" class="hiddenlink" target="rightframe"><b>android.support.v4.content.res</b></A><br>
+<!-- Package android.support.v4.media.session -->
+<A HREF="pkg_android.support.v4.media.session.html" class="hiddenlink" target="rightframe">android.support.v4.media.session</A><br>
+<!-- Package android.support.v4.view -->
+<A HREF="pkg_android.support.v4.view.html" class="hiddenlink" target="rightframe">android.support.v4.view</A><br>
+<!-- Package android.support.v4.view.accessibility -->
+<A HREF="pkg_android.support.v4.view.accessibility.html" class="hiddenlink" target="rightframe">android.support.v4.view.accessibility</A><br>
+<!-- Package android.support.v7.app -->
+<A HREF="pkg_android.support.v7.app.html" class="hiddenlink" target="rightframe">android.support.v7.app</A><br>
+<!-- Package android.support.v7.appcompat -->
+<A HREF="changes-summary.html#android.support.v7.appcompat" class="hiddenlink" target="rightframe"><b>android.support.v7.appcompat</b></A><br>
+<!-- Package android.support.v7.recyclerview -->
+<A HREF="changes-summary.html#android.support.v7.recyclerview" class="hiddenlink" target="rightframe"><b>android.support.v7.recyclerview</b></A><br>
+<!-- Package android.support.v7.util -->
+<A HREF="pkg_android.support.v7.util.html" class="hiddenlink" target="rightframe">android.support.v7.util</A><br>
+<!-- Package android.support.v7.widget.helper -->
+<A HREF="changes-summary.html#android.support.v7.widget.helper" class="hiddenlink" target="rightframe"><b>android.support.v7.widget.helper</b></A><br>
+<!-- Class AppCompatActivity -->
+<A HREF="android.support.v7.app.AppCompatActivity.html" class="hiddenlink" target="rightframe">AppCompatActivity</A><br>
+<!-- Class AppCompatCallback -->
+<A HREF="android.support.v7.app.AppCompatCallback.html" class="hiddenlink" target="rightframe"><i>AppCompatCallback</i></A><br>
+<!-- Class AppCompatDelegate -->
+<A HREF="android.support.v7.app.AppCompatDelegate.html" class="hiddenlink" target="rightframe">AppCompatDelegate</A><br>
+<!-- Class AppCompatDialog -->
+<A HREF="android.support.v7.app.AppCompatDialog.html" class="hiddenlink" target="rightframe">AppCompatDialog</A><br>
+<!-- Method clear -->
+<A NAME="C"></A>
+<br><font size="+2">C</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v7.util.SortedList.html#android.support.v7.util.SortedList.clear_added()" class="hiddenlink" target="rightframe"><b>clear</b>
+()</A></nobr><br>
+<!-- Method clearOnPageChangeListeners -->
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.clearOnPageChangeListeners_added()" class="hiddenlink" target="rightframe"><b>clearOnPageChangeListeners</b>
+()</A></nobr><br>
+<!-- Field CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION -->
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION</A>
+</nobr><br>
+<!-- Field CONTENT_CHANGE_TYPE_SUBTREE -->
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_SUBTREE</A>
+</nobr><br>
+<!-- Field CONTENT_CHANGE_TYPE_TEXT -->
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_TEXT" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_TEXT</A>
+</nobr><br>
+<!-- Field CONTENT_CHANGE_TYPE_UNDEFINED -->
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_UNDEFINED</A>
+</nobr><br>
+<!-- Method fromCustomAction -->
+<A NAME="F"></A>
+<br><font size="+2">F</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.CustomAction.html#android.support.v4.media.session.PlaybackStateCompat.CustomAction.fromCustomAction_added(java.lang.Object)" class="hiddenlink" target="rightframe"><b>fromCustomAction</b>
+(<code>Object</code>)</A></nobr><br>
+<!-- Method getActiveQueueItemId -->
+<A NAME="G"></A>
+<br><font size="+2">G</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.getActiveQueueItemId_added()" class="hiddenlink" target="rightframe"><b>getActiveQueueItemId</b>
+()</A></nobr><br>
+<!-- Method getContentChangeTypes -->
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.getContentChangeTypes_added(android.view.accessibility.AccessibilityEvent)" class="hiddenlink" target="rightframe"><b>getContentChangeTypes</b>
+(<code>AccessibilityEvent</code>)</A></nobr><br>
+<!-- Method getCustomAction -->
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.CustomAction.html#android.support.v4.media.session.PlaybackStateCompat.CustomAction.getCustomAction_added()" class="hiddenlink" target="rightframe"><b>getCustomAction</b>
+()</A></nobr><br>
+<!-- Method getCustomActions -->
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.getCustomActions_added()" class="hiddenlink" target="rightframe"><b>getCustomActions</b>
+()</A></nobr><br>
+<!-- Method getExtras -->
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.getExtras_added()" class="hiddenlink" target="rightframe"><b>getExtras</b>
+()</A></nobr><br>
+<!-- Method isAttachedToWindow -->
+<A NAME="I"></A>
+<br><font size="+2">I</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewCompat.html#android.support.v4.view.ViewCompat.isAttachedToWindow_added(android.view.View)" class="hiddenlink" target="rightframe"><b>isAttachedToWindow</b>
+(<code>View</code>)</A></nobr><br>
+<!-- Method isHandleNativeActionModesEnabled -->
+<nobr><A HREF="android.support.v7.app.AppCompatDelegate.html#android.support.v7.app.AppCompatDelegate.isHandleNativeActionModesEnabled_added()" class="hiddenlink" target="rightframe"><b>isHandleNativeActionModesEnabled</b>
+()</A></nobr><br>
+<!-- Method notifySubtreeAccessibilityStateChanged -->
+<A NAME="N"></A>
+<br><font size="+2">N</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewParentCompat.html#android.support.v4.view.ViewParentCompat.notifySubtreeAccessibilityStateChanged_added(android.view.ViewParent, android.view.View, android.view.View, int)" class="hiddenlink" target="rightframe"><b>notifySubtreeAccessibilityStateChanged</b>
+(<code>ViewParent, View, View, int</code>)</A></nobr><br>
+<!-- Method offsetLeftAndRight -->
+<A NAME="O"></A>
+<br><font size="+2">O</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewCompat.html#android.support.v4.view.ViewCompat.offsetLeftAndRight_added(android.view.View, int)" class="hiddenlink" target="rightframe"><b>offsetLeftAndRight</b>
+(<code>View, int</code>)</A></nobr><br>
+<!-- Method offsetTopAndBottom -->
+<nobr><A HREF="android.support.v4.view.ViewCompat.html#android.support.v4.view.ViewCompat.offsetTopAndBottom_added(android.view.View, int)" class="hiddenlink" target="rightframe"><b>offsetTopAndBottom</b>
+(<code>View, int</code>)</A></nobr><br>
+<!-- Method onWindowStartingSupportActionMode -->
+<i>onWindowStartingSupportActionMode</i><br>
+&nbsp;&nbsp;<nobr><A HREF="android.support.v7.app.AppCompatActivity.html#android.support.v7.app.AppCompatActivity.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>Callback</code>)</b>&nbsp;in&nbsp;android.support.v7.app.AppCompatActivity
+</A></nobr><br>
+<!-- Method onWindowStartingSupportActionMode -->
+&nbsp;&nbsp;<nobr><A HREF="android.support.v7.app.AppCompatCallback.html#android.support.v7.app.AppCompatCallback.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>Callback</code>)</b>&nbsp;in&nbsp;android.support.v7.app.AppCompatCallback
+</A></nobr><br>
+<!-- Method onWindowStartingSupportActionMode -->
+&nbsp;&nbsp;<nobr><A HREF="android.support.v7.app.AppCompatDialog.html#android.support.v7.app.AppCompatDialog.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>Callback</code>)</b>&nbsp;in&nbsp;android.support.v7.app.AppCompatDialog
+</A></nobr><br>
+<!-- Class PlaybackStateCompat -->
+<A NAME="P"></A>
+<br><font size="+2">P</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.support.v4.media.session.PlaybackStateCompat.html" class="hiddenlink" target="rightframe">PlaybackStateCompat</A><br>
+<!-- Class PlaybackStateCompat.Builder -->
+<A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html" class="hiddenlink" target="rightframe">PlaybackStateCompat.Builder</A><br>
+<!-- Class PlaybackStateCompat.CustomAction -->
+<A HREF="android.support.v4.media.session.PlaybackStateCompat.CustomAction.html" class="hiddenlink" target="rightframe">PlaybackStateCompat.CustomAction</A><br>
+<!-- Method removeOnPageChangeListener -->
+<A NAME="R"></A>
+<br><font size="+2">R</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.removeOnPageChangeListener_added(android.support.v4.view.ViewPager.OnPageChangeListener)" class="hiddenlink" target="rightframe"><b>removeOnPageChangeListener</b>
+(<code>OnPageChangeListener</code>)</A></nobr><br>
+<!-- Method setActiveQueueItemId -->
+<A NAME="S"></A>
+<br><font size="+2">S</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.setActiveQueueItemId_added(long)" class="hiddenlink" target="rightframe"><b>setActiveQueueItemId</b>
+(<code>long</code>)</A></nobr><br>
+<!-- Method setContentChangeTypes -->
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.setContentChangeTypes_added(android.view.accessibility.AccessibilityEvent, int)" class="hiddenlink" target="rightframe"><b>setContentChangeTypes</b>
+(<code>AccessibilityEvent, int</code>)</A></nobr><br>
+<!-- Method setExtras -->
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.setExtras_added(android.os.Bundle)" class="hiddenlink" target="rightframe"><b>setExtras</b>
+(<code>Bundle</code>)</A></nobr><br>
+<!-- Method setHandleNativeActionModesEnabled -->
+<nobr><A HREF="android.support.v7.app.AppCompatDelegate.html#android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setHandleNativeActionModesEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<!-- Method setOnPageChangeListener -->
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.setOnPageChangeListener_changed(android.support.v4.view.ViewPager.OnPageChangeListener)" class="hiddenlink" target="rightframe">setOnPageChangeListener
+(<code>OnPageChangeListener</code>)</A></nobr><br>
+<!-- Class SortedList -->
+<A HREF="android.support.v7.util.SortedList.html" class="hiddenlink" target="rightframe">SortedList</A><br>
+<!-- Field STATE_CONNECTING -->
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.STATE_CONNECTING" class="hiddenlink" target="rightframe">STATE_CONNECTING</A>
+</nobr><br>
+<!-- Field STATE_SKIPPING_TO_QUEUE_ITEM -->
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.STATE_SKIPPING_TO_QUEUE_ITEM" class="hiddenlink" target="rightframe">STATE_SKIPPING_TO_QUEUE_ITEM</A>
+</nobr><br>
+<!-- Method translationZ -->
+<A NAME="T"></A>
+<br><font size="+2">T</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#V"><font size="-2">V</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.translationZ_added(float)" class="hiddenlink" target="rightframe"><b>translationZ</b>
+(<code>float</code>)</A></nobr><br>
+<!-- Method translationZBy -->
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.translationZBy_added(float)" class="hiddenlink" target="rightframe"><b>translationZBy</b>
+(<code>float</code>)</A></nobr><br>
+<!-- Class ViewCompat -->
+<A NAME="V"></A>
+<br><font size="+2">V</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.support.v4.view.ViewCompat.html" class="hiddenlink" target="rightframe">ViewCompat</A><br>
+<!-- Class ViewPager -->
+<A HREF="android.support.v4.view.ViewPager.html" class="hiddenlink" target="rightframe">ViewPager</A><br>
+<!-- Class ViewParentCompat -->
+<A HREF="android.support.v4.view.ViewParentCompat.html" class="hiddenlink" target="rightframe">ViewParentCompat</A><br>
+<!-- Class ViewPropertyAnimatorCompat -->
+<A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html" class="hiddenlink" target="rightframe">ViewPropertyAnimatorCompat</A><br>
+<!-- Method z -->
+<A NAME="Z"></A>
+<br><font size="+2">Z</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.z_added(float)" class="hiddenlink" target="rightframe"><b>z</b>
+(<code>float</code>)</A></nobr><br>
+<!-- Method zBy -->
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.zBy_added(float)" class="hiddenlink" target="rightframe"><b>zBy</b>
+(<code>float</code>)</A></nobr><br>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_changes.html b/docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_changes.html
new file mode 100644
index 000000000000..c40c9f5df723
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_changes.html
@@ -0,0 +1,128 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+All Changes Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for All Differences" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="alldiffs_index_all.html" xclass="hiddenlink">All Differences</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="alldiffs_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<b>Changes</b>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<!-- Class AccessibilityEventCompat -->
+<A NAME="A"></A>
+<br><font size="+2">A</font>&nbsp;
+<a href="#P"><font size="-2">P</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html" class="hiddenlink" target="rightframe">AccessibilityEventCompat</A><br>
+<!-- Package android.support.v4.media.session -->
+<A HREF="pkg_android.support.v4.media.session.html" class="hiddenlink" target="rightframe">android.support.v4.media.session</A><br>
+<!-- Package android.support.v4.view -->
+<A HREF="pkg_android.support.v4.view.html" class="hiddenlink" target="rightframe">android.support.v4.view</A><br>
+<!-- Package android.support.v4.view.accessibility -->
+<A HREF="pkg_android.support.v4.view.accessibility.html" class="hiddenlink" target="rightframe">android.support.v4.view.accessibility</A><br>
+<!-- Package android.support.v7.app -->
+<A HREF="pkg_android.support.v7.app.html" class="hiddenlink" target="rightframe">android.support.v7.app</A><br>
+<!-- Package android.support.v7.util -->
+<A HREF="pkg_android.support.v7.util.html" class="hiddenlink" target="rightframe">android.support.v7.util</A><br>
+<!-- Class AppCompatActivity -->
+<A HREF="android.support.v7.app.AppCompatActivity.html" class="hiddenlink" target="rightframe">AppCompatActivity</A><br>
+<!-- Class AppCompatCallback -->
+<A HREF="android.support.v7.app.AppCompatCallback.html" class="hiddenlink" target="rightframe"><i>AppCompatCallback</i></A><br>
+<!-- Class AppCompatDelegate -->
+<A HREF="android.support.v7.app.AppCompatDelegate.html" class="hiddenlink" target="rightframe">AppCompatDelegate</A><br>
+<!-- Class AppCompatDialog -->
+<A HREF="android.support.v7.app.AppCompatDialog.html" class="hiddenlink" target="rightframe">AppCompatDialog</A><br>
+<!-- Class PlaybackStateCompat -->
+<A NAME="P"></A>
+<br><font size="+2">P</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.support.v4.media.session.PlaybackStateCompat.html" class="hiddenlink" target="rightframe">PlaybackStateCompat</A><br>
+<!-- Class PlaybackStateCompat.Builder -->
+<A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html" class="hiddenlink" target="rightframe">PlaybackStateCompat.Builder</A><br>
+<!-- Class PlaybackStateCompat.CustomAction -->
+<A HREF="android.support.v4.media.session.PlaybackStateCompat.CustomAction.html" class="hiddenlink" target="rightframe">PlaybackStateCompat.CustomAction</A><br>
+<!-- Method setOnPageChangeListener -->
+<A NAME="S"></A>
+<br><font size="+2">S</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.setOnPageChangeListener_changed(android.support.v4.view.ViewPager.OnPageChangeListener)" class="hiddenlink" target="rightframe">setOnPageChangeListener
+(<code>OnPageChangeListener</code>)</A></nobr><br>
+<!-- Class SortedList -->
+<A HREF="android.support.v7.util.SortedList.html" class="hiddenlink" target="rightframe">SortedList</A><br>
+<!-- Class ViewCompat -->
+<A NAME="V"></A>
+<br><font size="+2">V</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#S"><font size="-2">S</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.support.v4.view.ViewCompat.html" class="hiddenlink" target="rightframe">ViewCompat</A><br>
+<!-- Class ViewPager -->
+<A HREF="android.support.v4.view.ViewPager.html" class="hiddenlink" target="rightframe">ViewPager</A><br>
+<!-- Class ViewParentCompat -->
+<A HREF="android.support.v4.view.ViewParentCompat.html" class="hiddenlink" target="rightframe">ViewParentCompat</A><br>
+<!-- Class ViewPropertyAnimatorCompat -->
+<A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html" class="hiddenlink" target="rightframe">ViewPropertyAnimatorCompat</A><br>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_removals.html b/docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_removals.html
new file mode 100644
index 000000000000..68d2c20bf961
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_removals.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+All Removals Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for All Differences" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="alldiffs_index_all.html" xclass="hiddenlink">All Differences</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="alldiffs_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="alldiffs_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.Builder.html b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.Builder.html
new file mode 100644
index 000000000000..ae6415e1172a
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.Builder.html
@@ -0,0 +1,143 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v4.media.session.PlaybackStateCompat.Builder
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Class android.support.v4.media.session.<A HREF="../../../../reference/android/support/v4/media/session/PlaybackStateCompat.Builder.html" target="_top"><font size="+2"><code>PlaybackStateCompat.Builder</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.media.session.PlaybackStateCompat.Builder.addCustomAction_added(android.support.v4.media.session.PlaybackStateCompat.CustomAction)"></A>
+ <nobr><code>Builder</code>&nbsp;<A HREF="../../../../reference/android/support/v4/media/session/PlaybackStateCompat.Builder.html#addCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction)" target="_top"><code>addCustomAction</code></A>(<code>CustomAction</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.media.session.PlaybackStateCompat.Builder.addCustomAction_added(java.lang.String, java.lang.String, int)"></A>
+ <nobr><code>Builder</code>&nbsp;<A HREF="../../../../reference/android/support/v4/media/session/PlaybackStateCompat.Builder.html#addCustomAction(java.lang.String, java.lang.String, int)" target="_top"><code>addCustomAction</code></A>(<code>String,</nobr> String<nobr>,</nobr> int<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.media.session.PlaybackStateCompat.Builder.setActiveQueueItemId_added(long)"></A>
+ <nobr><code>Builder</code>&nbsp;<A HREF="../../../../reference/android/support/v4/media/session/PlaybackStateCompat.Builder.html#setActiveQueueItemId(long)" target="_top"><code>setActiveQueueItemId</code></A>(<code>long</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.media.session.PlaybackStateCompat.Builder.setExtras_added(android.os.Bundle)"></A>
+ <nobr><code>Builder</code>&nbsp;<A HREF="../../../../reference/android/support/v4/media/session/PlaybackStateCompat.Builder.html#setExtras(android.os.Bundle)" target="_top"><code>setExtras</code></A>(<code>Bundle</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<a NAME="fields"></a>
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.CustomAction.html b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.CustomAction.html
new file mode 100644
index 000000000000..4e476b32ae72
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.CustomAction.html
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v4.media.session.PlaybackStateCompat.CustomAction
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Class android.support.v4.media.session.<A HREF="../../../../reference/android/support/v4/media/session/PlaybackStateCompat.CustomAction.html" target="_top"><font size="+2"><code>PlaybackStateCompat.CustomAction</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.media.session.PlaybackStateCompat.CustomAction.fromCustomAction_added(java.lang.Object)"></A>
+ <nobr><code>CustomAction</code>&nbsp;<A HREF="../../../../reference/android/support/v4/media/session/PlaybackStateCompat.CustomAction.html#fromCustomAction(java.lang.Object)" target="_top"><code>fromCustomAction</code></A>(<code>Object</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.media.session.PlaybackStateCompat.CustomAction.getCustomAction_added()"></A>
+ <nobr><code>Object</code>&nbsp;<A HREF="../../../../reference/android/support/v4/media/session/PlaybackStateCompat.CustomAction.html#getCustomAction()" target="_top"><code>getCustomAction</code></A>()</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<a NAME="fields"></a>
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.html b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.html
new file mode 100644
index 000000000000..bd3e5dd2d8e3
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.html
@@ -0,0 +1,158 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v4.media.session.PlaybackStateCompat
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Class android.support.v4.media.session.<A HREF="../../../../reference/android/support/v4/media/session/PlaybackStateCompat.html" target="_top"><font size="+2"><code>PlaybackStateCompat</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.media.session.PlaybackStateCompat.getActiveQueueItemId_added()"></A>
+ <nobr><code>long</code>&nbsp;<A HREF="../../../../reference/android/support/v4/media/session/PlaybackStateCompat.html#getActiveQueueItemId()" target="_top"><code>getActiveQueueItemId</code></A>()</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.media.session.PlaybackStateCompat.getCustomActions_added()"></A>
+ <nobr><code>List&lt;CustomAction&gt;</code>&nbsp;<A HREF="../../../../reference/android/support/v4/media/session/PlaybackStateCompat.html#getCustomActions()" target="_top"><code>getCustomActions</code></A>()</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.media.session.PlaybackStateCompat.getExtras_added()"></A>
+ <nobr><code>Bundle</code>&nbsp;<A HREF="../../../../reference/android/support/v4/media/session/PlaybackStateCompat.html#getExtras()" target="_top"><code>getExtras</code></A>()</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<a NAME="fields"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Fields" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.media.session.PlaybackStateCompat.STATE_CONNECTING"></A>
+ <nobr><code>int</code>&nbsp;<A HREF="../../../../reference/android/support/v4/media/session/PlaybackStateCompat.html#STATE_CONNECTING" target="_top"><code>STATE_CONNECTING</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.media.session.PlaybackStateCompat.STATE_SKIPPING_TO_QUEUE_ITEM"></A>
+ <nobr><code>int</code>&nbsp;<A HREF="../../../../reference/android/support/v4/media/session/PlaybackStateCompat.html#STATE_SKIPPING_TO_QUEUE_ITEM" target="_top"><code>STATE_SKIPPING_TO_QUEUE_ITEM</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewCompat.html b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewCompat.html
new file mode 100644
index 000000000000..157405095648
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewCompat.html
@@ -0,0 +1,136 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v4.view.ViewCompat
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/view/ViewCompat.html" target="_top"><font size="+2"><code>ViewCompat</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.ViewCompat.isAttachedToWindow_added(android.view.View)"></A>
+ <nobr><code>boolean</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/ViewCompat.html#isAttachedToWindow(android.view.View)" target="_top"><code>isAttachedToWindow</code></A>(<code>View</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.ViewCompat.offsetLeftAndRight_added(android.view.View, int)"></A>
+ <nobr><code>void</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/ViewCompat.html#offsetLeftAndRight(android.view.View, int)" target="_top"><code>offsetLeftAndRight</code></A>(<code>View,</nobr> int<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.ViewCompat.offsetTopAndBottom_added(android.view.View, int)"></A>
+ <nobr><code>void</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/ViewCompat.html#offsetTopAndBottom(android.view.View, int)" target="_top"><code>offsetTopAndBottom</code></A>(<code>View,</nobr> int<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<a NAME="fields"></a>
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewPager.html b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewPager.html
new file mode 100644
index 000000000000..f03c4036f33b
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewPager.html
@@ -0,0 +1,154 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v4.view.ViewPager
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/view/ViewPager.html" target="_top"><font size="+2"><code>ViewPager</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.ViewPager.addOnPageChangeListener_added(android.support.v4.view.ViewPager.OnPageChangeListener)"></A>
+ <nobr><code>void</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/ViewPager.html#addOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener)" target="_top"><code>addOnPageChangeListener</code></A>(<code>OnPageChangeListener</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.ViewPager.clearOnPageChangeListeners_added()"></A>
+ <nobr><code>void</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/ViewPager.html#clearOnPageChangeListeners()" target="_top"><code>clearOnPageChangeListeners</code></A>()</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.ViewPager.removeOnPageChangeListener_added(android.support.v4.view.ViewPager.OnPageChangeListener)"></A>
+ <nobr><code>void</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/ViewPager.html#removeOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener)" target="_top"><code>removeOnPageChangeListener</code></A>(<code>OnPageChangeListener</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=3>Changed Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.ViewPager.setOnPageChangeListener_changed(android.support.v4.view.ViewPager.OnPageChangeListener)"></A>
+ <nobr><code>void</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/ViewPager.html#setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener)" target="_top"><code>setOnPageChangeListener</code></A>(<code>OnPageChangeListener</code>) </nobr>
+ </TD>
+ <TD VALIGN="TOP" WIDTH="30%">
+<b>Now deprecated</b>.<br>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<a NAME="fields"></a>
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewParentCompat.html b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewParentCompat.html
new file mode 100644
index 000000000000..6cdd2998750e
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewParentCompat.html
@@ -0,0 +1,122 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v4.view.ViewParentCompat
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/view/ViewParentCompat.html" target="_top"><font size="+2"><code>ViewParentCompat</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.ViewParentCompat.notifySubtreeAccessibilityStateChanged_added(android.view.ViewParent, android.view.View, android.view.View, int)"></A>
+ <nobr><code>void</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/ViewParentCompat.html#notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int)" target="_top"><code>notifySubtreeAccessibilityStateChanged</code></A>(<code>ViewParent,</nobr> View<nobr>,</nobr> View<nobr>,</nobr> int<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<a NAME="fields"></a>
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewPropertyAnimatorCompat.html b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewPropertyAnimatorCompat.html
new file mode 100644
index 000000000000..5706997ddb3a
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewPropertyAnimatorCompat.html
@@ -0,0 +1,143 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v4.view.ViewPropertyAnimatorCompat
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/view/ViewPropertyAnimatorCompat.html" target="_top"><font size="+2"><code>ViewPropertyAnimatorCompat</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.ViewPropertyAnimatorCompat.translationZ_added(float)"></A>
+ <nobr><code>ViewPropertyAnimatorCompat</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/ViewPropertyAnimatorCompat.html#translationZ(float)" target="_top"><code>translationZ</code></A>(<code>float</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.ViewPropertyAnimatorCompat.translationZBy_added(float)"></A>
+ <nobr><code>ViewPropertyAnimatorCompat</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/ViewPropertyAnimatorCompat.html#translationZBy(float)" target="_top"><code>translationZBy</code></A>(<code>float</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.ViewPropertyAnimatorCompat.z_added(float)"></A>
+ <nobr><code>ViewPropertyAnimatorCompat</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/ViewPropertyAnimatorCompat.html#z(float)" target="_top"><code>z</code></A>(<code>float</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.ViewPropertyAnimatorCompat.zBy_added(float)"></A>
+ <nobr><code>ViewPropertyAnimatorCompat</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/ViewPropertyAnimatorCompat.html#zBy(float)" target="_top"><code>zBy</code></A>(<code>float</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<a NAME="fields"></a>
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html
new file mode 100644
index 000000000000..e746f089bdc6
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html
@@ -0,0 +1,165 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v4.view.accessibility.AccessibilityEventCompat
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Class android.support.v4.view.accessibility.<A HREF="../../../../reference/android/support/v4/view/accessibility/AccessibilityEventCompat.html" target="_top"><font size="+2"><code>AccessibilityEventCompat</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.accessibility.AccessibilityEventCompat.getContentChangeTypes_added(android.view.accessibility.AccessibilityEvent)"></A>
+ <nobr><code>int</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/accessibility/AccessibilityEventCompat.html#getContentChangeTypes(android.view.accessibility.AccessibilityEvent)" target="_top"><code>getContentChangeTypes</code></A>(<code>AccessibilityEvent</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.accessibility.AccessibilityEventCompat.setContentChangeTypes_added(android.view.accessibility.AccessibilityEvent, int)"></A>
+ <nobr><code>void</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/accessibility/AccessibilityEventCompat.html#setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int)" target="_top"><code>setContentChangeTypes</code></A>(<code>AccessibilityEvent,</nobr> int<nobr><nobr></code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<a NAME="fields"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Fields" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION"></A>
+ <nobr><code>int</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/accessibility/AccessibilityEventCompat.html#CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION" target="_top"><code>CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE"></A>
+ <nobr><code>int</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/accessibility/AccessibilityEventCompat.html#CONTENT_CHANGE_TYPE_SUBTREE" target="_top"><code>CONTENT_CHANGE_TYPE_SUBTREE</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_TEXT"></A>
+ <nobr><code>int</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/accessibility/AccessibilityEventCompat.html#CONTENT_CHANGE_TYPE_TEXT" target="_top"><code>CONTENT_CHANGE_TYPE_TEXT</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED"></A>
+ <nobr><code>int</code>&nbsp;<A HREF="../../../../reference/android/support/v4/view/accessibility/AccessibilityEventCompat.html#CONTENT_CHANGE_TYPE_UNDEFINED" target="_top"><code>CONTENT_CHANGE_TYPE_UNDEFINED</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatActivity.html b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatActivity.html
new file mode 100644
index 000000000000..ccce9c52467a
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatActivity.html
@@ -0,0 +1,122 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v7.app.AppCompatActivity
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Class android.support.v7.app.<A HREF="../../../../reference/android/support/v7/app/AppCompatActivity.html" target="_top"><font size="+2"><code>AppCompatActivity</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v7.app.AppCompatActivity.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)"></A>
+ <nobr><code>ActionMode</code>&nbsp;<A HREF="../../../../reference/android/support/v7/app/AppCompatActivity.html#onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback)" target="_top"><code>onWindowStartingSupportActionMode</code></A>(<code>Callback</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<a NAME="fields"></a>
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatCallback.html b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatCallback.html
new file mode 100644
index 000000000000..f53a5196d485
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatCallback.html
@@ -0,0 +1,122 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v7.app.AppCompatCallback
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Interface android.support.v7.app.<A HREF="../../../../reference/android/support/v7/app/AppCompatCallback.html" target="_top"><font size="+2"><code>AppCompatCallback</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v7.app.AppCompatCallback.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)"></A>
+ <nobr><code>ActionMode</code>&nbsp;<A HREF="../../../../reference/android/support/v7/app/AppCompatCallback.html#onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback)" target="_top"><code>onWindowStartingSupportActionMode</code></A>(<code>Callback</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<a NAME="fields"></a>
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatDelegate.html b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatDelegate.html
new file mode 100644
index 000000000000..88490d45adb1
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatDelegate.html
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v7.app.AppCompatDelegate
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Class android.support.v7.app.<A HREF="../../../../reference/android/support/v7/app/AppCompatDelegate.html" target="_top"><font size="+2"><code>AppCompatDelegate</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v7.app.AppCompatDelegate.isHandleNativeActionModesEnabled_added()"></A>
+ <nobr><code>boolean</code>&nbsp;<A HREF="../../../../reference/android/support/v7/app/AppCompatDelegate.html#isHandleNativeActionModesEnabled()" target="_top"><code>isHandleNativeActionModesEnabled</code></A>()</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled_added(boolean)"></A>
+ <nobr><code>void</code>&nbsp;<A HREF="../../../../reference/android/support/v7/app/AppCompatDelegate.html#setHandleNativeActionModesEnabled(boolean)" target="_top"><code>setHandleNativeActionModesEnabled</code></A>(<code>boolean</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<a NAME="fields"></a>
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatDialog.html b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatDialog.html
new file mode 100644
index 000000000000..42d29a85ab60
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatDialog.html
@@ -0,0 +1,122 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v7.app.AppCompatDialog
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Class android.support.v7.app.<A HREF="../../../../reference/android/support/v7/app/AppCompatDialog.html" target="_top"><font size="+2"><code>AppCompatDialog</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v7.app.AppCompatDialog.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)"></A>
+ <nobr><code>ActionMode</code>&nbsp;<A HREF="../../../../reference/android/support/v7/app/AppCompatDialog.html#onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback)" target="_top"><code>onWindowStartingSupportActionMode</code></A>(<code>Callback</code>)</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<a NAME="fields"></a>
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.util.SortedList.html b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.util.SortedList.html
new file mode 100644
index 000000000000..0364519efffa
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.util.SortedList.html
@@ -0,0 +1,122 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v7.util.SortedList
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Class android.support.v7.util.<A HREF="../../../../reference/android/support/v7/util/SortedList.html" target="_top"><font size="+2"><code>SortedList</code></font></A>
+</H2>
+<a NAME="constructors"></a>
+<a NAME="methods"></a>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Methods" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v7.util.SortedList.clear_added()"></A>
+ <nobr><code>void</code>&nbsp;<A HREF="../../../../reference/android/support/v7/util/SortedList.html#clear()" target="_top"><code>clear</code></A>()</nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<a NAME="fields"></a>
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/changes-summary.html b/docs/html/sdk/support_api_diff/22.2.0/changes/changes-summary.html
new file mode 100644
index 000000000000..c6736cd33b87
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/changes-summary.html
@@ -0,0 +1,247 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Support&nbsp;Library&nbsp;API&nbsp;Differences&nbsp;Report
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<body class="gc-documentation">
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+ <div id="docTitleContainer">
+ <h1>Support&nbsp;Library&nbsp;API&nbsp;Differences&nbsp;Report</h1>
+<p>This report details the changes in the Android Support Library API between two versions.
+It shows additions, modifications, and removals for packages, classes, methods, and fields.
+The report also includes general statistics that characterize the extent and type of the differences.</p>
+<p>This report is based a comparison of the Support Library API specifications
+whose version level identifiers are given in the upper-right corner of this page. It compares a
+newer "to" version's API to an older "from" version's API, noting all changes relative to the
+older API. So, for example, API elements marked as removed are no longer present in the "to"
+API specification.</p>
+<p>To navigate the report, use the "Select a Diffs Index" and "Filter the Index"
+controls on the left. The report uses text formatting to indicate <em>interface names</em>,
+<a href= ><code>links to reference documentation</code></a>, and <a href= >links to change
+description</a>. The statistics are accessible from the "Statistics" link in the upper-right corner.</p>
+<p>For more information about the Android API and SDK,
+see the <a href="http://developer.android.com/index.html" target="_top">Android Developers site</a>.</p>
+<p>
+<a NAME="Added"></a>
+<TABLE summary="Added Packages" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Added Packages</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.design.widget"></A>
+ <nobr><A HREF="../../../../reference/android/support/design/widget/package-summary.html" target="_top"><code>android.support.design.widget</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v17.leanback.app"></A>
+ <nobr><A HREF="../../../../reference/android/support/v17/leanback/app/package-summary.html" target="_top"><code>android.support.v17.leanback.app</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v17.leanback.database"></A>
+ <nobr><A HREF="../../../../reference/android/support/v17/leanback/database/package-summary.html" target="_top"><code>android.support.v17.leanback.database</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v17.leanback.graphics"></A>
+ <nobr><A HREF="../../../../reference/android/support/v17/leanback/graphics/package-summary.html" target="_top"><code>android.support.v17.leanback.graphics</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v17.leanback.widget"></A>
+ <nobr><A HREF="../../../../reference/android/support/v17/leanback/widget/package-summary.html" target="_top"><code>android.support.v17.leanback.widget</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.animation"></A>
+ <nobr><A HREF="../../../../reference/android/support/v4/animation/package-summary.html" target="_top"><code>android.support.v4.animation</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.content.pm"></A>
+ <nobr><A HREF="../../../../reference/android/support/v4/content/pm/package-summary.html" target="_top"><code>android.support.v4.content.pm</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.content.res"></A>
+ <nobr><A HREF="../../../../reference/android/support/v4/content/res/package-summary.html" target="_top"><code>android.support.v4.content.res</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v7.appcompat"></A>
+ <nobr><A HREF="../../../../reference/android/support/v7/appcompat/package-summary.html" target="_top"><code>android.support.v7.appcompat</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v7.recyclerview"></A>
+ <nobr><A HREF="../../../../reference/android/support/v7/recyclerview/package-summary.html" target="_top"><code>android.support.v7.recyclerview</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v7.widget.helper"></A>
+ <nobr><A HREF="../../../../reference/android/support/v7/widget/helper/package-summary.html" target="_top"><code>android.support.v7.widget.helper</code></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Packages" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=3>Changed Packages</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.media.session"></A>
+ <nobr><A HREF="pkg_android.support.v4.media.session.html">android.support.v4.media.session</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view"></A>
+ <nobr><A HREF="pkg_android.support.v4.view.html">android.support.v4.view</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v4.view.accessibility"></A>
+ <nobr><A HREF="pkg_android.support.v4.view.accessibility.html">android.support.v4.view.accessibility</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v7.app"></A>
+ <nobr><A HREF="pkg_android.support.v7.app.html">android.support.v7.app</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="android.support.v7.util"></A>
+ <nobr><A HREF="pkg_android.support.v7.util.html">android.support.v7.util</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<!-- End of API section -->
+<!-- Start of packages section -->
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_additions.html b/docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_additions.html
new file mode 100644
index 000000000000..ccd5b665f73c
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_additions.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Class Additions Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Classes" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="classes_index_all.html" class="staysblack">All Classes</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<font color="#999999">Additions</font>
+ <br>
+<A HREF="classes_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_all.html b/docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_all.html
new file mode 100644
index 000000000000..728e37df454b
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_all.html
@@ -0,0 +1,102 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Class Differences Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Classes" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<b>Classes</b>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<font color="#999999">Additions</font>
+ <br>
+<A HREF="classes_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="A"></A>
+<br><font size="+2">A</font>&nbsp;
+<a href="#P"><font size="-2">P</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html" class="hiddenlink" target="rightframe">AccessibilityEventCompat</A><br>
+<A HREF="android.support.v7.app.AppCompatActivity.html" class="hiddenlink" target="rightframe">AppCompatActivity</A><br>
+<A HREF="android.support.v7.app.AppCompatCallback.html" class="hiddenlink" target="rightframe"><i>AppCompatCallback</i></A><br>
+<A HREF="android.support.v7.app.AppCompatDelegate.html" class="hiddenlink" target="rightframe">AppCompatDelegate</A><br>
+<A HREF="android.support.v7.app.AppCompatDialog.html" class="hiddenlink" target="rightframe">AppCompatDialog</A><br>
+<A NAME="P"></A>
+<br><font size="+2">P</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.support.v4.media.session.PlaybackStateCompat.html" class="hiddenlink" target="rightframe">PlaybackStateCompat</A><br>
+<A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html" class="hiddenlink" target="rightframe">PlaybackStateCompat.Builder</A><br>
+<A HREF="android.support.v4.media.session.PlaybackStateCompat.CustomAction.html" class="hiddenlink" target="rightframe">PlaybackStateCompat.CustomAction</A><br>
+<A NAME="S"></A>
+<br><font size="+2">S</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.support.v7.util.SortedList.html" class="hiddenlink" target="rightframe">SortedList</A><br>
+<A NAME="V"></A>
+<br><font size="+2">V</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#S"><font size="-2">S</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.support.v4.view.ViewCompat.html" class="hiddenlink" target="rightframe">ViewCompat</A><br>
+<A HREF="android.support.v4.view.ViewPager.html" class="hiddenlink" target="rightframe">ViewPager</A><br>
+<A HREF="android.support.v4.view.ViewParentCompat.html" class="hiddenlink" target="rightframe">ViewParentCompat</A><br>
+<A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html" class="hiddenlink" target="rightframe">ViewPropertyAnimatorCompat</A><br>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_changes.html b/docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_changes.html
new file mode 100644
index 000000000000..64e7f44ef165
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_changes.html
@@ -0,0 +1,102 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Class Changes Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Classes" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="classes_index_all.html" class="staysblack">All Classes</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<font color="#999999">Additions</font>
+ <br>
+<b>Changes</b>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="A"></A>
+<br><font size="+2">A</font>&nbsp;
+<a href="#P"><font size="-2">P</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html" class="hiddenlink" target="rightframe">AccessibilityEventCompat</A><br>
+<A HREF="android.support.v7.app.AppCompatActivity.html" class="hiddenlink" target="rightframe">AppCompatActivity</A><br>
+<A HREF="android.support.v7.app.AppCompatCallback.html" class="hiddenlink" target="rightframe"><i>AppCompatCallback</i></A><br>
+<A HREF="android.support.v7.app.AppCompatDelegate.html" class="hiddenlink" target="rightframe">AppCompatDelegate</A><br>
+<A HREF="android.support.v7.app.AppCompatDialog.html" class="hiddenlink" target="rightframe">AppCompatDialog</A><br>
+<A NAME="P"></A>
+<br><font size="+2">P</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.support.v4.media.session.PlaybackStateCompat.html" class="hiddenlink" target="rightframe">PlaybackStateCompat</A><br>
+<A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html" class="hiddenlink" target="rightframe">PlaybackStateCompat.Builder</A><br>
+<A HREF="android.support.v4.media.session.PlaybackStateCompat.CustomAction.html" class="hiddenlink" target="rightframe">PlaybackStateCompat.CustomAction</A><br>
+<A NAME="S"></A>
+<br><font size="+2">S</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#V"><font size="-2">V</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.support.v7.util.SortedList.html" class="hiddenlink" target="rightframe">SortedList</A><br>
+<A NAME="V"></A>
+<br><font size="+2">V</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#P"><font size="-2">P</font></a>
+<a href="#S"><font size="-2">S</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<A HREF="android.support.v4.view.ViewCompat.html" class="hiddenlink" target="rightframe">ViewCompat</A><br>
+<A HREF="android.support.v4.view.ViewPager.html" class="hiddenlink" target="rightframe">ViewPager</A><br>
+<A HREF="android.support.v4.view.ViewParentCompat.html" class="hiddenlink" target="rightframe">ViewParentCompat</A><br>
+<A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html" class="hiddenlink" target="rightframe">ViewPropertyAnimatorCompat</A><br>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_removals.html b/docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_removals.html
new file mode 100644
index 000000000000..792fc4e35470
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_removals.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Class Removals Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Classes" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="classes_index_all.html" class="staysblack">All Classes</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<font color="#999999">Additions</font>
+ <br>
+<A HREF="classes_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_additions.html b/docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_additions.html
new file mode 100644
index 000000000000..3237ba33faee
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_additions.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Constructor Additions Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Constructors" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="constructors_index_all.html" class="staysblack">All Constructors</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<font color="#999999">Additions</font>
+ <br>
+<font color="#999999">Changes</font>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_all.html b/docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_all.html
new file mode 100644
index 000000000000..637582e518a9
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_all.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Constructor Differences Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Constructors" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<b>Constructors</b>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<font color="#999999">Additions</font>
+ <br>
+<font color="#999999">Changes</font>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_changes.html b/docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_changes.html
new file mode 100644
index 000000000000..728fa2d6b45e
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_changes.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Constructor Changes Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Constructors" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="constructors_index_all.html" class="staysblack">All Constructors</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<font color="#999999">Additions</font>
+ <br>
+<font color="#999999">Changes</font>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_removals.html b/docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_removals.html
new file mode 100644
index 000000000000..1b95544e7f51
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_removals.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Constructor Removals Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Constructors" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="constructors_index_all.html" class="staysblack">All Constructors</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<font color="#999999">Additions</font>
+ <br>
+<font color="#999999">Changes</font>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_additions.html b/docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_additions.html
new file mode 100644
index 000000000000..48de992fd22a
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_additions.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Field Additions Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Fields" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="fields_index_all.html" class="staysblack">All Fields</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<b>Additions</b>
+ <br>
+<font color="#999999">Changes</font>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="C"></A>
+<br><font size="+2">C</font>&nbsp;
+<a href="#S"><font size="-2">S</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION</A>
+</nobr><br>
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_SUBTREE</A>
+</nobr><br>
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_TEXT" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_TEXT</A>
+</nobr><br>
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_UNDEFINED</A>
+</nobr><br>
+<A NAME="S"></A>
+<br><font size="+2">S</font>&nbsp;
+<a href="#C"><font size="-2">C</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.STATE_CONNECTING" class="hiddenlink" target="rightframe">STATE_CONNECTING</A>
+</nobr><br>
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.STATE_SKIPPING_TO_QUEUE_ITEM" class="hiddenlink" target="rightframe">STATE_SKIPPING_TO_QUEUE_ITEM</A>
+</nobr><br>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_all.html b/docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_all.html
new file mode 100644
index 000000000000..02f6dc04424c
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_all.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Field Differences Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Fields" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<b>Fields</b>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="fields_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<font color="#999999">Changes</font>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="C"></A>
+<br><font size="+2">C</font>&nbsp;
+<a href="#S"><font size="-2">S</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION</A>
+</nobr><br>
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_SUBTREE</A>
+</nobr><br>
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_TEXT" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_TEXT</A>
+</nobr><br>
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED" class="hiddenlink" target="rightframe">CONTENT_CHANGE_TYPE_UNDEFINED</A>
+</nobr><br>
+<A NAME="S"></A>
+<br><font size="+2">S</font>&nbsp;
+<a href="#C"><font size="-2">C</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.STATE_CONNECTING" class="hiddenlink" target="rightframe">STATE_CONNECTING</A>
+</nobr><br>
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.STATE_SKIPPING_TO_QUEUE_ITEM" class="hiddenlink" target="rightframe">STATE_SKIPPING_TO_QUEUE_ITEM</A>
+</nobr><br>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_changes.html b/docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_changes.html
new file mode 100644
index 000000000000..4ebfa31c2de0
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_changes.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Field Changes Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Fields" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="fields_index_all.html" class="staysblack">All Fields</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="fields_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<font color="#999999">Changes</font>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_removals.html b/docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_removals.html
new file mode 100644
index 000000000000..09b07264a18f
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_removals.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Field Removals Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Fields" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="fields_index_all.html" class="staysblack">All Fields</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="fields_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<font color="#999999">Changes</font>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_help.html b/docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_help.html
new file mode 100644
index 000000000000..8bfbd1dea012
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_help.html
@@ -0,0 +1,134 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+JDiff Help
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<TABLE summary="Navigation bar" BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+ <TABLE summary="Navigation bar" BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../reference/index.html" target="_top"><FONT CLASS="NavBarFont1"><B><code>22.2.0</code></B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="changes-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> &nbsp;<FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"> &nbsp;<FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="jdiff_statistics.html"><FONT CLASS="NavBarFont1"><B>Statistics</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT>&nbsp;</TD>
+ </TR>
+ </TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM><b>Generated by<br><a href="http://www.jdiff.org" class="staysblack" target="_top">JDiff</a></b></EM></TD>
+</TR>
+<TR>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell2"><FONT SIZE="-2"></FONT>
+</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../changes.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+ &nbsp;<A HREF="jdiff_help.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<HR>
+<!-- End of nav bar -->
+<center>
+<H1>JDiff Documentation</H1>
+</center>
+<BLOCKQUOTE>
+JDiff is a <a href="http://java.sun.com/j2se/javadoc/" target="_top">Javadoc</a> doclet which generates a report of the API differences between two versions of a product. It does not report changes in Javadoc comments, or changes in what a class or method does.
+This help page describes the different parts of the output from JDiff.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+ See the reference page in the <a href="http://www.jdiff.org">source for JDiff</a> for information about how to generate a report like this one.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+The indexes shown in the top-left frame help show each type of change in more detail. The index "All Differences" contains all the differences between the APIs, in alphabetical order.
+These indexes all use the same format:
+<ul>
+<li>Removed packages, classes, constructors, methods and fields are <strike>struck through</strike>.</li>
+<li>Added packages, classes, constructors, methods and fields appear in <b>bold</b>.</li>
+<li>Changed packages, classes, constructors, methods and fields appear in normal text.</li>
+</ul>
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+You can always tell when you are reading a JDiff page, rather than a Javadoc page, by the color of the index bar and the color of the background.
+Links which take you to a Javadoc page are always in a <code>typewriter</code> font.
+Just like Javadoc, all interface names are in <i>italic</i>, and class names are not italicized. Where there are multiple entries in an index with the same name, the heading for them is also in italics, but is not a link.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3><b><code>Javadoc</code></b></H3>
+This is a link to the <a href="../../../../reference/index.html" target="_top">top-level</a> Javadoc page for the new version of the product.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Overview</H3>
+The <a href="changes-summary.html">overview</a> is the top-level summary of what was removed, added and changed between versions.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Package</H3>
+This is a link to the package containing the current changed class or interface.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Class</H3>
+This is highlighted when you are looking at the changed class or interface.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Text Changes</H3>
+This is a link to the top-level index of all documentation changes for the current package or class.
+If it is not present, then there are no documentation changes for the current package or class.
+This link can be removed entirely by not using the <code>-docchanges</code> option.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Statistics</H3>
+This is a link to a page which shows statistics about the changes between the two APIs.
+This link can be removed entirely by not using the <code>-stats</code> option.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Help</H3>
+A link to this Help page for JDiff.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Prev/Next</H3>
+These links take you to the previous and next changed package or class.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H3>Frames/No Frames</H3>
+These links show and hide the HTML frames. All pages are available with or without frames.
+</BLOCKQUOTE>
+<BLOCKQUOTE>
+<H2>Complex Changes</H2>
+There are some complex changes which can occur between versions, for example, when two or more methods with the same name change simultaneously, or when a method or field is moved into or from a superclass.
+In these cases, the change will be seen as a removal and an addition, rather than as a change. Unexpected removals or additions are often part of one of these type of changes.
+</BLOCKQUOTE>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_statistics.html b/docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_statistics.html
new file mode 100644
index 000000000000..229819b53496
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_statistics.html
@@ -0,0 +1,278 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+API Change Statistics
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<body class="gc-documentation">
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;xborder-bottom:none;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="../changes.html" target="_top">Top of Report</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<h1>API&nbsp;Change&nbsp;Statistics</h1>
+<p>The overall difference between API Levels 22.1.0 and 22.2.0 is approximately <span style="color:222;font-weight:bold;">17.16%</span>.
+</p>
+<br>
+<a name="numbers"></a>
+<h2>Total of Differences, by Number and Type</h2>
+<p>
+The table below lists the numbers of program elements (packages, classes, constructors, methods, and fields) that were added, changed, or removed. The table includes only the highest-level program elements &mdash; that is, if a class with two methods was added, the number of methods added does not include those two methods, but the number of classes added does include that class.
+</p>
+<TABLE summary="Number of differences" WIDTH="100%">
+<TR>
+ <th>Type</th>
+ <TH ALIGN="center"><b>Additions</b></TH>
+ <TH ALIGN="center"><b>Changes</b></TH>
+ <TH ALIGN="center">Removals</TH>
+ <TH ALIGN="center"><b>Total</b></TH>
+</TR>
+<TR>
+ <TD>Packages</TD>
+ <TD ALIGN="right">11</TD>
+ <TD ALIGN="right">5</TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">16</TD>
+</TR>
+<TR>
+ <TD>Classes and <i>Interfaces</i></TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">13</TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">13</TD>
+</TR>
+<TR>
+ <TD>Constructors</TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">0</TD>
+</TR>
+<TR>
+ <TD>Methods</TD>
+ <TD ALIGN="right">28</TD>
+ <TD ALIGN="right">1</TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">29</TD>
+</TR>
+<TR>
+ <TD>Fields</TD>
+ <TD ALIGN="right">6</TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">0</TD>
+ <TD ALIGN="right">6</TD>
+</TR>
+<TR>
+ <TD style="background-color:#FAFAFA"><b>Total</b></TD>
+ <TD style="background-color:#FAFAFA" ALIGN="right"><strong>45</strong></TD>
+ <TD style="background-color:#FAFAFA" ALIGN="right"><strong>19</strong></TD>
+ <TD style="background-color:#FAFAFA" ALIGN="right"><strong>0</strong></TD>
+ <TD style="background-color:#FAFAFA" ALIGN="right"><strong>64</strong></TD>
+</TR>
+</TABLE>
+<br>
+<a name="packages"></a>
+<h2>Changed Packages, Sorted by Percentage Difference</h2>
+<TABLE summary="Packages sorted by percentage difference" WIDTH="100%">
+<TR>
+ <TH WIDTH="10%">Percentage Difference*</TH>
+ <TH>Package</TH>
+</TR>
+<TR>
+ <TD ALIGN="center">2</TD>
+ <TD><A HREF="pkg_android.support.v4.media.session.html">android.support.v4.media.session</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">2</TD>
+ <TD><A HREF="pkg_android.support.v7.app.html">android.support.v7.app</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">1</TD>
+ <TD><A HREF="pkg_android.support.v4.view.accessibility.html">android.support.v4.view.accessibility</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">1</TD>
+ <TD><A HREF="pkg_android.support.v7.util.html">android.support.v7.util</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">&lt;1</TD>
+ <TD><A HREF="pkg_android.support.v4.view.html">android.support.v4.view</A></TD>
+</TR>
+</TABLE>
+<p style="font-size:10px">* See <a href="#calculation">Calculation of Change Percentages</a>, below.</p>
+<br>
+<a name="classes"></a>
+<h2>Changed Classes and <i>Interfaces</i>, Sorted by Percentage Difference</h2>
+<TABLE summary="Classes sorted by percentage difference" WIDTH="100%">
+<TR WIDTH="20%">
+ <TH WIDTH="10%">Percentage<br>Difference*</TH>
+ <TH><b>Class or <i>Interface</i></b></TH>
+</TR>
+<TR>
+ <TD ALIGN="center">20</TD>
+ <TD><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html">
+android.support.v4.media.session.PlaybackStateCompat.Builder</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">20</TD>
+ <TD><A HREF="android.support.v7.app.AppCompatCallback.html">
+<i>android.support.v7.app.AppCompatCallback</i></A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">13</TD>
+ <TD><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html">
+android.support.v4.view.accessibility.AccessibilityEventCompat</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">12</TD>
+ <TD><A HREF="android.support.v4.media.session.PlaybackStateCompat.CustomAction.html">
+android.support.v4.media.session.PlaybackStateCompat.CustomAction</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">6</TD>
+ <TD><A HREF="android.support.v4.view.ViewPager.html">
+android.support.v4.view.ViewPager</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">6</TD>
+ <TD><A HREF="android.support.v4.media.session.PlaybackStateCompat.html">
+android.support.v4.media.session.PlaybackStateCompat</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">5</TD>
+ <TD><A HREF="android.support.v4.view.ViewParentCompat.html">
+android.support.v4.view.ViewParentCompat</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">5</TD>
+ <TD><A HREF="android.support.v7.app.AppCompatDialog.html">
+android.support.v7.app.AppCompatDialog</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">5</TD>
+ <TD><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html">
+android.support.v4.view.ViewPropertyAnimatorCompat</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">4</TD>
+ <TD><A HREF="android.support.v7.app.AppCompatDelegate.html">
+android.support.v7.app.AppCompatDelegate</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">3</TD>
+ <TD><A HREF="android.support.v7.util.SortedList.html">
+android.support.v7.util.SortedList</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">2</TD>
+ <TD><A HREF="android.support.v7.app.AppCompatActivity.html">
+android.support.v7.app.AppCompatActivity</A></TD>
+</TR>
+<TR>
+ <TD ALIGN="center">1</TD>
+ <TD><A HREF="android.support.v4.view.ViewCompat.html">
+android.support.v4.view.ViewCompat</A></TD>
+</TR>
+</TABLE>
+<p style="font-size:10px">* See <a href="#calculation">Calculation of Change Percentages</a>, below.</p>
+<br>
+<h2 id="calculation">Calculation of Change Percentages</h2>
+<p>
+The percent change statistic reported for all elements in the &quot;to&quot; API Level specification is defined recursively as follows:</p>
+<pre>
+Percentage difference = 100 * (added + removed + 2*changed)
+ -----------------------------------
+ sum of public elements in BOTH APIs
+</pre>
+<p>where <code>added</code> is the number of packages added, <code>removed</code> is the number of packages removed, and <code>changed</code> is the number of packages changed.
+This definition is applied recursively for the classes and their program elements, so the value for a changed package will be less than 1, unless every class in that package has changed.
+The definition ensures that if all packages are removed and all new packages are
+added, the change will be 100%.</p>
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY></HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_topleftframe.html b/docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_topleftframe.html
new file mode 100644
index 000000000000..36f9836e4478
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_topleftframe.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Android API Version Differences
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<table class="jdiffIndex" summary="Links to diff index files" BORDER="0" WIDTH="100%" cellspacing="0" cellpadding="0" style="margin:0">
+<TR>
+ <th class="indexHeader" nowrap>
+ Select a Diffs Index:</th>
+</TR>
+<TR>
+ <TD><FONT CLASS="indexText" size="-2"><A HREF="alldiffs_index_all.html" TARGET="bottomleftframe">All Differences</A></FONT><br></TD>
+</TR>
+<TR>
+ <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="packages_index_all.html" TARGET="bottomleftframe">By Package</A></FONT><br></TD>
+</TR>
+<TR>
+ <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="classes_index_all.html" TARGET="bottomleftframe">By Class</A></FONT><br></TD>
+</TR>
+<TR>
+ <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="constructors_index_all.html" TARGET="bottomleftframe">By Constructor</A></FONT><br></TD>
+</TR>
+<TR>
+ <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="methods_index_all.html" TARGET="bottomleftframe">By Method</A></FONT><br></TD>
+</TR>
+<TR>
+ <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="fields_index_all.html" TARGET="bottomleftframe">By Field</A></FONT><br></TD>
+</TR>
+</TABLE>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_additions.html b/docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_additions.html
new file mode 100644
index 000000000000..f7c84885444e
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_additions.html
@@ -0,0 +1,278 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Method Additions Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Methods" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="methods_index_all.html" class="staysblack">All Methods</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<b>Additions</b>
+ <br>
+<A HREF="methods_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="A"></A>
+<br><font size="+2">A</font>&nbsp;
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<i>addCustomAction</i><br>
+&nbsp;&nbsp;<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.addCustomAction_added(android.support.v4.media.session.PlaybackStateCompat.CustomAction)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>CustomAction</code>)</b>&nbsp;in&nbsp;android.support.v4.media.session.PlaybackStateCompat.Builder
+</A></nobr><br>
+&nbsp;&nbsp;<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.addCustomAction_added(java.lang.String, java.lang.String, int)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>String, String, int</code>)</b>&nbsp;in&nbsp;android.support.v4.media.session.PlaybackStateCompat.Builder
+</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.addOnPageChangeListener_added(android.support.v4.view.ViewPager.OnPageChangeListener)" class="hiddenlink" target="rightframe"><b>addOnPageChangeListener</b>
+(<code>OnPageChangeListener</code>)</A></nobr><br>
+<A NAME="C"></A>
+<br><font size="+2">C</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v7.util.SortedList.html#android.support.v7.util.SortedList.clear_added()" class="hiddenlink" target="rightframe"><b>clear</b>
+()</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.clearOnPageChangeListeners_added()" class="hiddenlink" target="rightframe"><b>clearOnPageChangeListeners</b>
+()</A></nobr><br>
+<A NAME="F"></A>
+<br><font size="+2">F</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.CustomAction.html#android.support.v4.media.session.PlaybackStateCompat.CustomAction.fromCustomAction_added(java.lang.Object)" class="hiddenlink" target="rightframe"><b>fromCustomAction</b>
+(<code>Object</code>)</A></nobr><br>
+<A NAME="G"></A>
+<br><font size="+2">G</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.getActiveQueueItemId_added()" class="hiddenlink" target="rightframe"><b>getActiveQueueItemId</b>
+()</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.getContentChangeTypes_added(android.view.accessibility.AccessibilityEvent)" class="hiddenlink" target="rightframe"><b>getContentChangeTypes</b>
+(<code>AccessibilityEvent</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.CustomAction.html#android.support.v4.media.session.PlaybackStateCompat.CustomAction.getCustomAction_added()" class="hiddenlink" target="rightframe"><b>getCustomAction</b>
+()</A></nobr><br>
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.getCustomActions_added()" class="hiddenlink" target="rightframe"><b>getCustomActions</b>
+()</A></nobr><br>
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.getExtras_added()" class="hiddenlink" target="rightframe"><b>getExtras</b>
+()</A></nobr><br>
+<A NAME="I"></A>
+<br><font size="+2">I</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewCompat.html#android.support.v4.view.ViewCompat.isAttachedToWindow_added(android.view.View)" class="hiddenlink" target="rightframe"><b>isAttachedToWindow</b>
+(<code>View</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v7.app.AppCompatDelegate.html#android.support.v7.app.AppCompatDelegate.isHandleNativeActionModesEnabled_added()" class="hiddenlink" target="rightframe"><b>isHandleNativeActionModesEnabled</b>
+()</A></nobr><br>
+<A NAME="N"></A>
+<br><font size="+2">N</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewParentCompat.html#android.support.v4.view.ViewParentCompat.notifySubtreeAccessibilityStateChanged_added(android.view.ViewParent, android.view.View, android.view.View, int)" class="hiddenlink" target="rightframe"><b>notifySubtreeAccessibilityStateChanged</b>
+(<code>ViewParent, View, View, int</code>)</A></nobr><br>
+<A NAME="O"></A>
+<br><font size="+2">O</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewCompat.html#android.support.v4.view.ViewCompat.offsetLeftAndRight_added(android.view.View, int)" class="hiddenlink" target="rightframe"><b>offsetLeftAndRight</b>
+(<code>View, int</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.ViewCompat.html#android.support.v4.view.ViewCompat.offsetTopAndBottom_added(android.view.View, int)" class="hiddenlink" target="rightframe"><b>offsetTopAndBottom</b>
+(<code>View, int</code>)</A></nobr><br>
+<i>onWindowStartingSupportActionMode</i><br>
+&nbsp;&nbsp;<nobr><A HREF="android.support.v7.app.AppCompatActivity.html#android.support.v7.app.AppCompatActivity.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>Callback</code>)</b>&nbsp;in&nbsp;android.support.v7.app.AppCompatActivity
+</A></nobr><br>
+&nbsp;&nbsp;<nobr><A HREF="android.support.v7.app.AppCompatCallback.html#android.support.v7.app.AppCompatCallback.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>Callback</code>)</b>&nbsp;in&nbsp;android.support.v7.app.AppCompatCallback
+</A></nobr><br>
+&nbsp;&nbsp;<nobr><A HREF="android.support.v7.app.AppCompatDialog.html#android.support.v7.app.AppCompatDialog.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>Callback</code>)</b>&nbsp;in&nbsp;android.support.v7.app.AppCompatDialog
+</A></nobr><br>
+<A NAME="R"></A>
+<br><font size="+2">R</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.removeOnPageChangeListener_added(android.support.v4.view.ViewPager.OnPageChangeListener)" class="hiddenlink" target="rightframe"><b>removeOnPageChangeListener</b>
+(<code>OnPageChangeListener</code>)</A></nobr><br>
+<A NAME="S"></A>
+<br><font size="+2">S</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.setActiveQueueItemId_added(long)" class="hiddenlink" target="rightframe"><b>setActiveQueueItemId</b>
+(<code>long</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.setContentChangeTypes_added(android.view.accessibility.AccessibilityEvent, int)" class="hiddenlink" target="rightframe"><b>setContentChangeTypes</b>
+(<code>AccessibilityEvent, int</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.setExtras_added(android.os.Bundle)" class="hiddenlink" target="rightframe"><b>setExtras</b>
+(<code>Bundle</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v7.app.AppCompatDelegate.html#android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setHandleNativeActionModesEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<A NAME="T"></A>
+<br><font size="+2">T</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.translationZ_added(float)" class="hiddenlink" target="rightframe"><b>translationZ</b>
+(<code>float</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.translationZBy_added(float)" class="hiddenlink" target="rightframe"><b>translationZBy</b>
+(<code>float</code>)</A></nobr><br>
+<A NAME="Z"></A>
+<br><font size="+2">Z</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.z_added(float)" class="hiddenlink" target="rightframe"><b>z</b>
+(<code>float</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.zBy_added(float)" class="hiddenlink" target="rightframe"><b>zBy</b>
+(<code>float</code>)</A></nobr><br>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_all.html b/docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_all.html
new file mode 100644
index 000000000000..63a2848486ab
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_all.html
@@ -0,0 +1,280 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Method Differences Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Methods" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<b>Methods</b>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="methods_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="methods_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="A"></A>
+<br><font size="+2">A</font>&nbsp;
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<i>addCustomAction</i><br>
+&nbsp;&nbsp;<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.addCustomAction_added(android.support.v4.media.session.PlaybackStateCompat.CustomAction)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>CustomAction</code>)</b>&nbsp;in&nbsp;android.support.v4.media.session.PlaybackStateCompat.Builder
+</A></nobr><br>
+&nbsp;&nbsp;<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.addCustomAction_added(java.lang.String, java.lang.String, int)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>String, String, int</code>)</b>&nbsp;in&nbsp;android.support.v4.media.session.PlaybackStateCompat.Builder
+</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.addOnPageChangeListener_added(android.support.v4.view.ViewPager.OnPageChangeListener)" class="hiddenlink" target="rightframe"><b>addOnPageChangeListener</b>
+(<code>OnPageChangeListener</code>)</A></nobr><br>
+<A NAME="C"></A>
+<br><font size="+2">C</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v7.util.SortedList.html#android.support.v7.util.SortedList.clear_added()" class="hiddenlink" target="rightframe"><b>clear</b>
+()</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.clearOnPageChangeListeners_added()" class="hiddenlink" target="rightframe"><b>clearOnPageChangeListeners</b>
+()</A></nobr><br>
+<A NAME="F"></A>
+<br><font size="+2">F</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.CustomAction.html#android.support.v4.media.session.PlaybackStateCompat.CustomAction.fromCustomAction_added(java.lang.Object)" class="hiddenlink" target="rightframe"><b>fromCustomAction</b>
+(<code>Object</code>)</A></nobr><br>
+<A NAME="G"></A>
+<br><font size="+2">G</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.getActiveQueueItemId_added()" class="hiddenlink" target="rightframe"><b>getActiveQueueItemId</b>
+()</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.getContentChangeTypes_added(android.view.accessibility.AccessibilityEvent)" class="hiddenlink" target="rightframe"><b>getContentChangeTypes</b>
+(<code>AccessibilityEvent</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.CustomAction.html#android.support.v4.media.session.PlaybackStateCompat.CustomAction.getCustomAction_added()" class="hiddenlink" target="rightframe"><b>getCustomAction</b>
+()</A></nobr><br>
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.getCustomActions_added()" class="hiddenlink" target="rightframe"><b>getCustomActions</b>
+()</A></nobr><br>
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html#android.support.v4.media.session.PlaybackStateCompat.getExtras_added()" class="hiddenlink" target="rightframe"><b>getExtras</b>
+()</A></nobr><br>
+<A NAME="I"></A>
+<br><font size="+2">I</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewCompat.html#android.support.v4.view.ViewCompat.isAttachedToWindow_added(android.view.View)" class="hiddenlink" target="rightframe"><b>isAttachedToWindow</b>
+(<code>View</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v7.app.AppCompatDelegate.html#android.support.v7.app.AppCompatDelegate.isHandleNativeActionModesEnabled_added()" class="hiddenlink" target="rightframe"><b>isHandleNativeActionModesEnabled</b>
+()</A></nobr><br>
+<A NAME="N"></A>
+<br><font size="+2">N</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewParentCompat.html#android.support.v4.view.ViewParentCompat.notifySubtreeAccessibilityStateChanged_added(android.view.ViewParent, android.view.View, android.view.View, int)" class="hiddenlink" target="rightframe"><b>notifySubtreeAccessibilityStateChanged</b>
+(<code>ViewParent, View, View, int</code>)</A></nobr><br>
+<A NAME="O"></A>
+<br><font size="+2">O</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewCompat.html#android.support.v4.view.ViewCompat.offsetLeftAndRight_added(android.view.View, int)" class="hiddenlink" target="rightframe"><b>offsetLeftAndRight</b>
+(<code>View, int</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.ViewCompat.html#android.support.v4.view.ViewCompat.offsetTopAndBottom_added(android.view.View, int)" class="hiddenlink" target="rightframe"><b>offsetTopAndBottom</b>
+(<code>View, int</code>)</A></nobr><br>
+<i>onWindowStartingSupportActionMode</i><br>
+&nbsp;&nbsp;<nobr><A HREF="android.support.v7.app.AppCompatActivity.html#android.support.v7.app.AppCompatActivity.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>Callback</code>)</b>&nbsp;in&nbsp;android.support.v7.app.AppCompatActivity
+</A></nobr><br>
+&nbsp;&nbsp;<nobr><A HREF="android.support.v7.app.AppCompatCallback.html#android.support.v7.app.AppCompatCallback.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>Callback</code>)</b>&nbsp;in&nbsp;android.support.v7.app.AppCompatCallback
+</A></nobr><br>
+&nbsp;&nbsp;<nobr><A HREF="android.support.v7.app.AppCompatDialog.html#android.support.v7.app.AppCompatDialog.onWindowStartingSupportActionMode_added(android.support.v7.view.ActionMode.Callback)" class="hiddenlink" target="rightframe">type&nbsp;<b>
+(<code>Callback</code>)</b>&nbsp;in&nbsp;android.support.v7.app.AppCompatDialog
+</A></nobr><br>
+<A NAME="R"></A>
+<br><font size="+2">R</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.removeOnPageChangeListener_added(android.support.v4.view.ViewPager.OnPageChangeListener)" class="hiddenlink" target="rightframe"><b>removeOnPageChangeListener</b>
+(<code>OnPageChangeListener</code>)</A></nobr><br>
+<A NAME="S"></A>
+<br><font size="+2">S</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#T"><font size="-2">T</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.setActiveQueueItemId_added(long)" class="hiddenlink" target="rightframe"><b>setActiveQueueItemId</b>
+(<code>long</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.setContentChangeTypes_added(android.view.accessibility.AccessibilityEvent, int)" class="hiddenlink" target="rightframe"><b>setContentChangeTypes</b>
+(<code>AccessibilityEvent, int</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html#android.support.v4.media.session.PlaybackStateCompat.Builder.setExtras_added(android.os.Bundle)" class="hiddenlink" target="rightframe"><b>setExtras</b>
+(<code>Bundle</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v7.app.AppCompatDelegate.html#android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setHandleNativeActionModesEnabled</b>
+(<code>boolean</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.setOnPageChangeListener_changed(android.support.v4.view.ViewPager.OnPageChangeListener)" class="hiddenlink" target="rightframe">setOnPageChangeListener
+(<code>OnPageChangeListener</code>)</A></nobr><br>
+<A NAME="T"></A>
+<br><font size="+2">T</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#Z"><font size="-2">Z</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.translationZ_added(float)" class="hiddenlink" target="rightframe"><b>translationZ</b>
+(<code>float</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.translationZBy_added(float)" class="hiddenlink" target="rightframe"><b>translationZBy</b>
+(<code>float</code>)</A></nobr><br>
+<A NAME="Z"></A>
+<br><font size="+2">Z</font>&nbsp;
+<a href="#A"><font size="-2">A</font></a>
+<a href="#C"><font size="-2">C</font></a>
+<a href="#F"><font size="-2">F</font></a>
+<a href="#G"><font size="-2">G</font></a>
+<a href="#I"><font size="-2">I</font></a>
+<a href="#N"><font size="-2">N</font></a>
+<a href="#O"><font size="-2">O</font></a>
+<a href="#R"><font size="-2">R</font></a>
+<a href="#S"><font size="-2">S</font></a>
+<a href="#T"><font size="-2">T</font></a>
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.z_added(float)" class="hiddenlink" target="rightframe"><b>z</b>
+(<code>float</code>)</A></nobr><br>
+<nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html#android.support.v4.view.ViewPropertyAnimatorCompat.zBy_added(float)" class="hiddenlink" target="rightframe"><b>zBy</b>
+(<code>float</code>)</A></nobr><br>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_changes.html b/docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_changes.html
new file mode 100644
index 000000000000..3e43f87922e8
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_changes.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Method Changes Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Methods" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="methods_index_all.html" class="staysblack">All Methods</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="methods_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<b>Changes</b>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<A NAME="S"></A>
+<br><font size="+2">S</font>&nbsp;
+ <a href="#topheader"><font size="-2">TOP</font></a>
+<p><div style="line-height:1.5em;color:black">
+<nobr><A HREF="android.support.v4.view.ViewPager.html#android.support.v4.view.ViewPager.setOnPageChangeListener_changed(android.support.v4.view.ViewPager.OnPageChangeListener)" class="hiddenlink" target="rightframe">setOnPageChangeListener
+(<code>OnPageChangeListener</code>)</A></nobr><br>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_removals.html b/docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_removals.html
new file mode 100644
index 000000000000..b5aea4f9d673
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_removals.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Method Removals Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Methods" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="methods_index_all.html" class="staysblack">All Methods</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="methods_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="methods_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_additions.html b/docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_additions.html
new file mode 100644
index 000000000000..7d92a82f538c
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_additions.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Package Additions Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Packages" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="packages_index_all.html" class="staysblack">All Packages</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<b>Additions</b>
+ <br>
+<A HREF="packages_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<br>
+<div id="indexTableEntries">
+<A NAME="A"></A>
+<A HREF="changes-summary.html#android.support.design.widget" class="hiddenlink" target="rightframe"><b>android.support.design.widget</b></A><br>
+<A HREF="changes-summary.html#android.support.v17.leanback.app" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.app</b></A><br>
+<A HREF="changes-summary.html#android.support.v17.leanback.database" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.database</b></A><br>
+<A HREF="changes-summary.html#android.support.v17.leanback.graphics" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.graphics</b></A><br>
+<A HREF="changes-summary.html#android.support.v17.leanback.widget" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.widget</b></A><br>
+<A HREF="changes-summary.html#android.support.v4.animation" class="hiddenlink" target="rightframe"><b>android.support.v4.animation</b></A><br>
+<A HREF="changes-summary.html#android.support.v4.content.pm" class="hiddenlink" target="rightframe"><b>android.support.v4.content.pm</b></A><br>
+<A HREF="changes-summary.html#android.support.v4.content.res" class="hiddenlink" target="rightframe"><b>android.support.v4.content.res</b></A><br>
+<A HREF="changes-summary.html#android.support.v7.appcompat" class="hiddenlink" target="rightframe"><b>android.support.v7.appcompat</b></A><br>
+<A HREF="changes-summary.html#android.support.v7.recyclerview" class="hiddenlink" target="rightframe"><b>android.support.v7.recyclerview</b></A><br>
+<A HREF="changes-summary.html#android.support.v7.widget.helper" class="hiddenlink" target="rightframe"><b>android.support.v7.widget.helper</b></A><br>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_all.html b/docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_all.html
new file mode 100644
index 000000000000..2735fe9fe2f4
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_all.html
@@ -0,0 +1,80 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Package Differences Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Packages" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<b>Packages</b>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="packages_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="packages_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<br>
+<div id="indexTableEntries">
+<A NAME="A"></A>
+<A HREF="changes-summary.html#android.support.design.widget" class="hiddenlink" target="rightframe"><b>android.support.design.widget</b></A><br>
+<A HREF="changes-summary.html#android.support.v17.leanback.app" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.app</b></A><br>
+<A HREF="changes-summary.html#android.support.v17.leanback.database" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.database</b></A><br>
+<A HREF="changes-summary.html#android.support.v17.leanback.graphics" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.graphics</b></A><br>
+<A HREF="changes-summary.html#android.support.v17.leanback.widget" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.widget</b></A><br>
+<A HREF="changes-summary.html#android.support.v4.animation" class="hiddenlink" target="rightframe"><b>android.support.v4.animation</b></A><br>
+<A HREF="changes-summary.html#android.support.v4.content.pm" class="hiddenlink" target="rightframe"><b>android.support.v4.content.pm</b></A><br>
+<A HREF="changes-summary.html#android.support.v4.content.res" class="hiddenlink" target="rightframe"><b>android.support.v4.content.res</b></A><br>
+<A HREF="pkg_android.support.v4.media.session.html" class="hiddenlink" target="rightframe">android.support.v4.media.session</A><br>
+<A HREF="pkg_android.support.v4.view.html" class="hiddenlink" target="rightframe">android.support.v4.view</A><br>
+<A HREF="pkg_android.support.v4.view.accessibility.html" class="hiddenlink" target="rightframe">android.support.v4.view.accessibility</A><br>
+<A HREF="pkg_android.support.v7.app.html" class="hiddenlink" target="rightframe">android.support.v7.app</A><br>
+<A HREF="changes-summary.html#android.support.v7.appcompat" class="hiddenlink" target="rightframe"><b>android.support.v7.appcompat</b></A><br>
+<A HREF="changes-summary.html#android.support.v7.recyclerview" class="hiddenlink" target="rightframe"><b>android.support.v7.recyclerview</b></A><br>
+<A HREF="pkg_android.support.v7.util.html" class="hiddenlink" target="rightframe">android.support.v7.util</A><br>
+<A HREF="changes-summary.html#android.support.v7.widget.helper" class="hiddenlink" target="rightframe"><b>android.support.v7.widget.helper</b></A><br>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_changes.html b/docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_changes.html
new file mode 100644
index 000000000000..3e408789137d
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_changes.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Package Changes Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Packages" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="packages_index_all.html" class="staysblack">All Packages</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="packages_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<b>Changes</b>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<br>
+<div id="indexTableEntries">
+<A NAME="A"></A>
+<A HREF="pkg_android.support.v4.media.session.html" class="hiddenlink" target="rightframe">android.support.v4.media.session</A><br>
+<A HREF="pkg_android.support.v4.view.html" class="hiddenlink" target="rightframe">android.support.v4.view</A><br>
+<A HREF="pkg_android.support.v4.view.accessibility.html" class="hiddenlink" target="rightframe">android.support.v4.view.accessibility</A><br>
+<A HREF="pkg_android.support.v7.app.html" class="hiddenlink" target="rightframe">android.support.v7.app</A><br>
+<A HREF="pkg_android.support.v7.util.html" class="hiddenlink" target="rightframe">android.support.v7.util</A><br>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_removals.html b/docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_removals.html
new file mode 100644
index 000000000000..d0ffabcf3c5b
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_removals.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+Package Removals Index
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY class="gc-documentation" style="padding:12px;">
+<a NAME="topheader"></a>
+<table summary="Index for Packages" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;">
+ <tr>
+ <th class="indexHeader">
+ Filter the Index:
+ </th>
+ </tr>
+ <tr>
+ <td class="indexText" style="line-height:1.3em;padding-left:2em;">
+<a href="packages_index_all.html" class="staysblack">All Packages</a>
+ <br>
+<font color="#999999">Removals</font>
+ <br>
+<A HREF="packages_index_additions.html"xclass="hiddenlink">Additions</A>
+ <br>
+<A HREF="packages_index_changes.html"xclass="hiddenlink">Changes</A>
+ </td>
+ </tr>
+</table>
+<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;">
+Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font>
+</div>
+<br>
+<div id="indexTableEntries">
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.media.session.html b/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.media.session.html
new file mode 100644
index 000000000000..4dfd7de9dbe7
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.media.session.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v4.media.session
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Package <A HREF="../../../../reference/android/support/v4/media/session/package-summary.html" target="_top"><font size="+1"><code>android.support.v4.media.session</code></font></A>
+</H2>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="PlaybackStateCompat"></A>
+ <nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.html">PlaybackStateCompat</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="PlaybackStateCompat.Builder"></A>
+ <nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.Builder.html">PlaybackStateCompat.Builder</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="PlaybackStateCompat.CustomAction"></A>
+ <nobr><A HREF="android.support.v4.media.session.PlaybackStateCompat.CustomAction.html">PlaybackStateCompat.CustomAction</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.view.accessibility.html b/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.view.accessibility.html
new file mode 100644
index 000000000000..f52efcb39e1c
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.view.accessibility.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v4.view.accessibility
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Package <A HREF="../../../../reference/android/support/v4/view/accessibility/package-summary.html" target="_top"><font size="+1"><code>android.support.v4.view.accessibility</code></font></A>
+</H2>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="AccessibilityEventCompat"></A>
+ <nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html">AccessibilityEventCompat</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.view.html b/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.view.html
new file mode 100644
index 000000000000..f05d81276873
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.view.html
@@ -0,0 +1,140 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v4.view
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Package <A HREF="../../../../reference/android/support/v4/view/package-summary.html" target="_top"><font size="+1"><code>android.support.v4.view</code></font></A>
+</H2>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="ViewCompat"></A>
+ <nobr><A HREF="android.support.v4.view.ViewCompat.html">ViewCompat</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="ViewPager"></A>
+ <nobr><A HREF="android.support.v4.view.ViewPager.html">ViewPager</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="ViewParentCompat"></A>
+ <nobr><A HREF="android.support.v4.view.ViewParentCompat.html">ViewParentCompat</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="ViewPropertyAnimatorCompat"></A>
+ <nobr><A HREF="android.support.v4.view.ViewPropertyAnimatorCompat.html">ViewPropertyAnimatorCompat</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v7.app.html b/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v7.app.html
new file mode 100644
index 000000000000..44bf61d1fa06
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v7.app.html
@@ -0,0 +1,140 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v7.app
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Package <A HREF="../../../../reference/android/support/v7/app/package-summary.html" target="_top"><font size="+1"><code>android.support.v7.app</code></font></A>
+</H2>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes and Interfaces" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes and Interfaces</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="AppCompatActivity"></A>
+ <nobr><A HREF="android.support.v7.app.AppCompatActivity.html">AppCompatActivity</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="AppCompatCallback"></A>
+ <nobr><A HREF="android.support.v7.app.AppCompatCallback.html"><I>AppCompatCallback</I></A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="AppCompatDelegate"></A>
+ <nobr><A HREF="android.support.v7.app.AppCompatDelegate.html">AppCompatDelegate</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="AppCompatDialog"></A>
+ <nobr><A HREF="android.support.v7.app.AppCompatDialog.html">AppCompatDialog</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v7.util.html b/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v7.util.html
new file mode 100644
index 000000000000..d08d9af6748e
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v7.util.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<HTML style="overflow:auto;">
+<HEAD>
+<meta name="generator" content="JDiff v1.1.0">
+<!-- Generated by the JDiff Javadoc doclet -->
+<!-- (http://www.jdiff.org) -->
+<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared.">
+<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet">
+<TITLE>
+android.support.v7.util
+</TITLE>
+<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" />
+<noscript>
+<style type="text/css">
+body{overflow:auto;}
+#body-content{position:relative; top:0;}
+#doc-content{overflow:visible;border-left:3px solid #666;}
+#side-nav{padding:0;}
+#side-nav .toggle-list ul {display:block;}
+#resize-packages-nav{border-bottom:3px solid #666;}
+</style>
+</noscript>
+<style type="text/css">
+</style>
+</HEAD>
+<BODY>
+<!-- Start of nav bar -->
+<a name="top"></a>
+<div id="header" style="margin-bottom:0;padding-bottom:0;">
+<div id="headerLeft">
+<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
+</div>
+ <div id="headerRight">
+ <div id="headerLinks">
+<!-- <img src="/assets/images/icon_world.jpg" alt="" /> -->
+<span class="text">
+<!-- &nbsp;<a href="#">English</a> | -->
+<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr>
+</span>
+</div>
+ <div class="and-diff-id" style="margin-top:6px;margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td colspan="2" class="diffspechead">API Diff Specification</td>
+ </tr>
+ <tr>
+ <td class="diffspec" style="padding-top:.25em">To Level:</td>
+ <td class="diffvaluenew" style="padding-top:.25em">22.2.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">From Level:</td>
+ <td class="diffvalueold">22.1.0</td>
+ </tr>
+ <tr>
+ <td class="diffspec">Generated</td>
+ <td class="diffvalue">2015.07.06 15:20</td>
+ </tr>
+ </table>
+ </div><!-- End and-diff-id -->
+ <div class="and-diff-id" style="margin-right:8px;">
+ <table class="diffspectable">
+ <tr>
+ <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a>
+ </tr>
+ </table>
+ </div> <!-- End and-diff-id -->
+ </div> <!-- End headerRight -->
+ </div> <!-- End header -->
+<div id="body-content" xstyle="padding:12px;padding-right:18px;">
+<div id="doc-content" style="position:relative;">
+<div id="mainBodyFluid">
+<H2>
+Package <A HREF="../../../../reference/android/support/v7/util/package-summary.html" target="_top"><font size="+1"><code>android.support.v7.util</code></font></A>
+</H2>
+<p>
+<a NAME="Changed"></a>
+<TABLE summary="Changed Classes" WIDTH="100%">
+<TR>
+ <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD>
+</TH>
+<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor">
+ <TD VALIGN="TOP" WIDTH="25%">
+ <A NAME="SortedList"></A>
+ <nobr><A HREF="android.support.v7.util.SortedList.html">SortedList</A></nobr>
+ </TD>
+ <TD>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+ </div>
+ <div id="footer">
+ <div id="copyright">
+ Except as noted, this content is licensed under
+ <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>.
+ For details and restrictions, see the <a href="/license.html">Content License</a>.
+ </div>
+ <div id="footerlinks">
+ <p>
+ <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
+ <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
+ <a href="http://www.android.com/branding.html">Brand Guidelines</a>
+ </p>
+ </div>
+ </div> <!-- end footer -->
+ </div><!-- end doc-content -->
+ </div> <!-- end body-content -->
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+ try {
+ var pageTracker = _gat._getTracker("UA-5831155-1");
+ pageTracker._setAllowAnchor(true);
+ pageTracker._initData();
+ pageTracker._trackPageview();
+ } catch(e) {}
+</script>
+</BODY>
+</HTML>
diff --git a/docs/html/sdk/support_api_diff/22.2.0/stylesheet-jdiff.css b/docs/html/sdk/support_api_diff/22.2.0/stylesheet-jdiff.css
new file mode 100644
index 000000000000..edafaa3da3e5
--- /dev/null
+++ b/docs/html/sdk/support_api_diff/22.2.0/stylesheet-jdiff.css
@@ -0,0 +1,44 @@
+
+/* (http://www.jdiff.org) */
+
+div.and-diff-id {border: 1px solid #eee;position:relative;float:right;clear:both;padding:0px;}
+table.diffspectable {border:1px;padding:0px;margin:0px;}
+.diffspechead {background-color:#eee;}
+.diffspectable tr {border:0px;padding:0px;}
+.diffspectable td {background-color:eee;border:0px;font-size:90%;font-weight:normal;padding:0px;padding-left:1px;padding-right:1px;text-align:center;color:777;}
+td.diffvalueold {color:orange;background-color:white;border:0px;font-size:80%;font-style:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;}
+td.diffvaluenew {color:green;background-color:white;border:0px;font-size:80%;font-weight:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;}
+td.diffvalue {color:444;background-color:white;border:0px;font-size:80%;font-weight:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;}
+td.diffspec {background-color:white;border:0px;font-size:80%;font-weight:normal;padding:1px;color:444;text-align:right;padding-right:.5em;line-height:.95em;}
+tt {font-size:11pt;font-family:monospace;}
+.indexHeader {
+ font-size:96%;
+ line-height:.8em;}
+.jdiffIndex td {
+ font-size:96%;
+ xline-height:.8em;
+ padding:2px;
+ padding-left:1em;}
+.indexText {
+ font-size:100%;
+ padding-left:1em;}
+#indexTableCaption {
+ font-size:96%;
+ margin-top:.25em;
+ margin-bottom:0;
+ }
+.hiddenlink {
+ font-size:96%;
+ line-height:.8em;
+ text-decoration:none;}
+a {
+ text-decoration:none;}
+a:hover {
+ text-decoration:underline;}
+.indexBox {
+ border: 1px solid red;
+ margin:1em 0 0 0;}
+.letterIndexHead {
+ font-size: 1.5em;font-weight:9;
+ margin:0 0 0em 0;
+ border: 1px solid red;}
diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java
index fcd7f63afaaf..cf91be1ea364 100644
--- a/graphics/java/android/graphics/drawable/BitmapDrawable.java
+++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java
@@ -219,7 +219,8 @@ public class BitmapDrawable extends Drawable {
}
}
- private void setBitmap(Bitmap bitmap) {
+ /** @hide */
+ protected void setBitmap(Bitmap bitmap) {
if (mBitmapState.mBitmap != bitmap) {
mBitmapState.mBitmap = bitmap;
computeBitmapSize();
diff --git a/libs/hwui/Canvas.h b/libs/hwui/Canvas.h
index 562bb8041b95..160d9a8a87dd 100644
--- a/libs/hwui/Canvas.h
+++ b/libs/hwui/Canvas.h
@@ -80,6 +80,10 @@ public:
virtual void getMatrix(SkMatrix* outMatrix) const = 0;
virtual void setMatrix(const SkMatrix& matrix) = 0;
+ /// Like setMatrix(), but to be translated into local / view-relative coordinates
+ /// rather than executed in global / device coordinates at rendering time.
+ virtual void setLocalMatrix(const SkMatrix& matrix) = 0;
+
virtual void concat(const SkMatrix& matrix) = 0;
virtual void rotate(float degrees) = 0;
virtual void scale(float sx, float sy) = 0;
diff --git a/libs/hwui/DisplayListCanvas.cpp b/libs/hwui/DisplayListCanvas.cpp
index b08187be1f82..aeb1a3d0ae68 100644
--- a/libs/hwui/DisplayListCanvas.cpp
+++ b/libs/hwui/DisplayListCanvas.cpp
@@ -176,6 +176,11 @@ void DisplayListCanvas::setMatrix(const SkMatrix& matrix) {
mState.setMatrix(matrix);
}
+void DisplayListCanvas::setLocalMatrix(const SkMatrix& matrix) {
+ addStateOp(new (alloc()) SetLocalMatrixOp(matrix));
+ mState.setMatrix(matrix);
+}
+
void DisplayListCanvas::concat(const SkMatrix& matrix) {
addStateOp(new (alloc()) ConcatMatrixOp(matrix));
mState.concatMatrix(matrix);
diff --git a/libs/hwui/DisplayListCanvas.h b/libs/hwui/DisplayListCanvas.h
index edfda620ffae..4982cc919b5e 100644
--- a/libs/hwui/DisplayListCanvas.h
+++ b/libs/hwui/DisplayListCanvas.h
@@ -165,6 +165,7 @@ public:
// Matrix
virtual void getMatrix(SkMatrix* outMatrix) const override { mState.getMatrix(outMatrix); }
virtual void setMatrix(const SkMatrix& matrix) override;
+ virtual void setLocalMatrix(const SkMatrix& matrix) override;
virtual void concat(const SkMatrix& matrix) override;
virtual void rotate(float degrees) override;
diff --git a/libs/hwui/DisplayListOp.h b/libs/hwui/DisplayListOp.h
index d2bf138832da..8b4b4ba2b79e 100644
--- a/libs/hwui/DisplayListOp.h
+++ b/libs/hwui/DisplayListOp.h
@@ -489,6 +489,25 @@ private:
const SkMatrix mMatrix;
};
+class SetLocalMatrixOp : public StateOp {
+public:
+ SetLocalMatrixOp(const SkMatrix& matrix)
+ : mMatrix(matrix) {}
+
+ virtual void applyState(OpenGLRenderer& renderer, int saveCount) const override {
+ renderer.setLocalMatrix(mMatrix);
+ }
+
+ virtual void output(int level, uint32_t logFlags) const override {
+ OP_LOG("SetLocalMatrix " SK_MATRIX_STRING, SK_MATRIX_ARGS(&mMatrix));
+ }
+
+ virtual const char* name() override { return "SetLocalMatrix"; }
+
+private:
+ const SkMatrix mMatrix;
+};
+
class ConcatMatrixOp : public StateOp {
public:
ConcatMatrixOp(const SkMatrix& matrix)
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index ed2a4db9ea05..2292ef415cfc 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -2148,6 +2148,7 @@ void OpenGLRenderer::restoreToCount(int saveCount) {
mState.restoreToCount(saveCount);
}
+
void OpenGLRenderer::translate(float dx, float dy, float dz) {
mState.translate(dx, dy, dz);
}
@@ -2168,6 +2169,11 @@ void OpenGLRenderer::setMatrix(const Matrix4& matrix) {
mState.setMatrix(matrix);
}
+void OpenGLRenderer::setLocalMatrix(const SkMatrix& matrix) {
+ mState.setMatrix(mBaseTransform);
+ mState.concatMatrix(matrix);
+}
+
void OpenGLRenderer::concatMatrix(const Matrix4& matrix) {
mState.concatMatrix(matrix);
}
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index 800a9f9cf18f..402f6edd475d 100755
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -368,6 +368,7 @@ public:
void getMatrix(SkMatrix* outMatrix) const { mState.getMatrix(outMatrix); }
void setMatrix(const SkMatrix& matrix) { mState.setMatrix(matrix); }
+ void setLocalMatrix(const SkMatrix& matrix);
void concatMatrix(const SkMatrix& matrix) { mState.concatMatrix(matrix); }
void translate(float dx, float dy, float dz = 0.0f);
@@ -418,6 +419,8 @@ public:
return returnPath;
}
+ void setBaseTransform(const Matrix4& matrix) { mBaseTransform = matrix; }
+
protected:
/**
* Perform the setup specific to a frame. This method does not
@@ -877,6 +880,16 @@ private:
// Paths kept alive for the duration of the frame
std::vector<std::unique_ptr<SkPath>> mTempPaths;
+ /**
+ * Initial transform for a rendering pass; transform from global device
+ * coordinates to the current RenderNode's drawing content coordinates,
+ * with the RenderNode's RenderProperty transforms already applied.
+ * Calling setMatrix(mBaseTransform) will result in drawing at the origin
+ * of the DisplayList's recorded surface prior to any Canvas
+ * transformation.
+ */
+ Matrix4 mBaseTransform;
+
friend class Layer;
friend class TextDrawFunctor;
friend class DrawBitmapOp;
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index fc184913e1c1..80f349aa19a2 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -887,6 +887,7 @@ void RenderNode::issueOperations(OpenGLRenderer& renderer, T& handler) {
&& renderer.quickRejectConservative(0, 0, properties().getWidth(), properties().getHeight());
if (!quickRejected) {
Matrix4 initialTransform(*(renderer.currentTransform()));
+ renderer.setBaseTransform(initialTransform);
if (drawLayer) {
handler(new (alloc) DrawLayerOp(mLayer, 0, 0),
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index 6cf66cd1484d..644a4f305a2e 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -67,6 +67,7 @@ public:
virtual void getMatrix(SkMatrix* outMatrix) const override;
virtual void setMatrix(const SkMatrix& matrix) override;
+ virtual void setLocalMatrix(const SkMatrix& matrix) override { this->setMatrix(matrix); }
virtual void concat(const SkMatrix& matrix) override;
virtual void rotate(float degrees) override;
virtual void scale(float sx, float sy) override;
diff --git a/libs/hwui/SkiaCanvasProxy.cpp b/libs/hwui/SkiaCanvasProxy.cpp
index 8a6c8c50d30d..d96ca2afed00 100644
--- a/libs/hwui/SkiaCanvasProxy.cpp
+++ b/libs/hwui/SkiaCanvasProxy.cpp
@@ -115,7 +115,7 @@ void SkiaCanvasProxy::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& ce
void SkiaCanvasProxy::onDrawSprite(const SkBitmap& bitmap, int left, int top,
const SkPaint* paint) {
mCanvas->save(SkCanvas::kMatrixClip_SaveFlag);
- mCanvas->setMatrix(SkMatrix::I());
+ mCanvas->setLocalMatrix(SkMatrix::I());
mCanvas->drawBitmap(bitmap, left, top, paint);
mCanvas->restore();
}
@@ -165,7 +165,9 @@ void SkiaCanvasProxy::didConcat(const SkMatrix& matrix) {
}
void SkiaCanvasProxy::didSetMatrix(const SkMatrix& matrix) {
- mCanvas->setMatrix(matrix);
+ // SkCanvas setMatrix() is relative to the Canvas origin, but OpenGLRenderer's
+ // setMatrix() is relative to device origin; call setLocalMatrix() instead.
+ mCanvas->setLocalMatrix(matrix);
}
void SkiaCanvasProxy::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
index ddbcd78cc96d..a489f94ea698 100644
--- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
+++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
@@ -21,6 +21,7 @@ import android.app.LoadedApk;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
+import android.net.CaptivePortal;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.Network;
@@ -62,7 +63,7 @@ public class CaptivePortalLoginActivity extends Activity {
private URL mURL;
private Network mNetwork;
- private String mResponseToken;
+ private CaptivePortal mCaptivePortal;
private NetworkCallback mNetworkCallback;
private ConnectivityManager mCm;
private boolean mLaunchBrowser = false;
@@ -83,7 +84,7 @@ public class CaptivePortalLoginActivity extends Activity {
done(Result.WANTED_AS_IS);
}
mNetwork = getIntent().getParcelableExtra(ConnectivityManager.EXTRA_NETWORK);
- mResponseToken = getIntent().getStringExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_TOKEN);
+ mCaptivePortal = getIntent().getParcelableExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL);
// Also initializes proxy system properties.
mCm.bindProcessToNetwork(mNetwork);
@@ -155,13 +156,13 @@ public class CaptivePortalLoginActivity extends Activity {
}
switch (result) {
case DISMISSED:
- mCm.reportCaptivePortalDismissed(mNetwork, mResponseToken);
+ mCaptivePortal.reportCaptivePortalDismissed();
break;
case UNWANTED:
- mCm.ignoreNetworkWithCaptivePortal(mNetwork, mResponseToken);
+ mCaptivePortal.ignoreNetwork();
break;
case WANTED_AS_IS:
- mCm.useNetworkWithCaptivePortal(mNetwork, mResponseToken);
+ mCaptivePortal.useNetwork();
break;
}
finish();
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 932524683b3a..048fb9ad1e56 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -293,7 +293,8 @@ public class AccessPoint implements Comparable<AccessPoint> {
public String getSecurityString(boolean concise) {
Context context = mContext;
if (mConfig != null && mConfig.isPasspoint()) {
- return context.getString(R.string.wifi_security_passpoint);
+ return concise ? context.getString(R.string.wifi_security_short_eap) :
+ context.getString(R.string.wifi_security_eap);
}
switch(security) {
case SECURITY_EAP:
diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml
index 68b8603a9056..edd8ff3ebb73 100644
--- a/packages/SystemUI/res/values-ml-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ml-rIN/strings.xml
@@ -22,7 +22,7 @@
<string name="app_label" msgid="7164937344850004466">"സിസàµà´±àµà´±à´‚ UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"മായàµâ€Œà´•àµà´•àµà´•"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ലിസàµâ€Œà´±àµà´±à´¿àµ½ നിനàµà´¨àµà´‚ നീകàµà´•ംചെയàµà´¯àµà´•"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"à´…à´ªàµà´²à´¿à´•àµà´•േഷൻ വിവരം"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ആപàµà´ªàµ വിവരം"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"നിങàµà´™à´³àµà´Ÿàµ† à´ªàµà´¤à´¿à´¯ à´¸àµà´•àµà´°àµ€à´¨àµà´•ൾ ഇവിടെ ദൃശàµà´¯à´®à´¾à´•àµà´¨àµà´¨àµ"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"സമീപകാല à´…à´ªàµà´²à´¿à´•àµà´•േഷനàµà´•ൾ നിരസികàµà´•àµà´•"</string>
<plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
@@ -43,7 +43,7 @@
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"ഓൺ ചെയàµà´¯àµà´•"</string>
<string name="battery_saver_start_action" msgid="5576697451677486320">"ബാറàµà´±à´±à´¿ സേവർ ഓണാകàµà´•àµà´•"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"à´•àµà´°à´®àµ€à´•രണങàµà´™àµ¾"</string>
- <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"വൈഫൈ"</string>
<string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"à´¸àµâ€Œà´•àµà´°àµ€àµ» à´¸àµà´µà´¯à´®àµ‡à´¤à´¿à´°à´¿à´•àµà´•àµà´•"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"à´®àµà´¯àµ‚à´Ÿàµà´Ÿàµà´šàµ†à´¯àµà´¯àµà´•"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"യാനàµà´¤àµà´°à´¿à´•à´‚"</string>
@@ -150,7 +150,7 @@
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"റോമിംഗàµ"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
- <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"വൈഫൈ"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"സിം ഇലàµà´²."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"à´¬àµà´²àµ‚ടൂതàµà´¤àµ ടെതറിംഗàµ."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"à´«àµà´²àµˆà´±àµà´±àµ മോഡàµ."</string>
@@ -209,10 +209,10 @@
<string name="accessibility_quick_settings_close" msgid="3115847794692516306">"പാനൽ à´…à´Ÿà´¯àµâ€Œà´•àµà´•àµà´•."</string>
<string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"കൂടàµà´¤àµ½ സമയം."</string>
<string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"സമയം à´•àµà´±à´¯àµâ€Œà´•àµà´•àµà´•."</string>
- <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"à´«àµà´²à´¾à´·àµâ€Œà´²àµˆà´±àµà´±àµ ഓഫാണàµ."</string>
- <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"à´«àµà´²à´¾à´·àµâ€Œà´²àµˆà´±àµà´±àµ ഓണാണàµ."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"à´«àµà´²à´¾à´·àµâ€Œà´²àµˆà´±àµà´±àµ ഓഫാകàµà´•à´¿."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"à´«àµà´²à´¾à´·àµâ€Œà´²àµˆà´±àµà´±àµ ഓണാകàµà´•à´¿."</string>
+ <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"ടോർചàµà´šàµ ഓഫാണàµ."</string>
+ <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"ടോർചàµà´šàµ ഓണാണàµ."</string>
+ <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"ടോർചàµà´šàµ ഓഫാകàµà´•à´¿."</string>
+ <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"ടോർചàµà´šàµ ഓണാകàµà´•à´¿."</string>
<string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"വർണàµà´£ വൈപരീതàµà´¯à´‚ ഓഫാകàµà´•à´¿."</string>
<string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"വർണàµà´£ വൈപരീതàµà´¯à´‚ ഓണാകàµà´•à´¿."</string>
<string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"മൊബൈൽ ഹോടàµà´Ÿàµâ€Œà´¸àµâ€Œà´ªàµ‹à´Ÿàµà´Ÿàµ ഓഫാകàµà´•à´¿."</string>
@@ -226,7 +226,7 @@
<string name="data_usage_disabled_dialog" msgid="8453242888903772524">"നിങàµà´™àµ¾ നേരതàµà´¤àµ† à´•àµà´°à´®àµ€à´•à´°à´¿à´šàµà´š ഡാറàµà´± പരിധിയിലെതàµà´¤à´¿à´¯à´¤à´¿à´¨à´¾àµ½, à´ˆ സൈകàµà´•ിളിനàµà´±àµ† അവശേഷികàµà´•àµà´¨àµà´¨ ഡാറàµà´± ഉപയോഗം, ഉപകരണം താൽകàµà´•ാലികമായി നിർതàµà´¤à´¿.\n\nà´ªàµà´¨à´°à´¾à´°à´‚à´­à´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ, നിങàµà´™à´³àµà´Ÿàµ† കാരിയറിൽ നിനàµà´¨àµ നിരകàµà´•àµà´•ൾകàµà´•ൠഇടയാകàµà´•ാം."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"à´ªàµà´¨à´°à´¾à´°à´‚à´­à´¿à´•àµà´•àµà´•"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"ഇനàµà´±àµ¼à´¨àµ†à´±àµà´±àµ കണകàµà´·àµ» ഇലàµà´²"</string>
- <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi കണകàµâ€Œà´±àµà´±àµà´šàµ†à´¯àµâ€Œà´¤àµ"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"വൈഫൈ കണകàµâ€Œà´±àµà´±àµà´šàµ†à´¯àµâ€Œà´¤àµ"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS-നായി തിരയàµà´¨àµà´¨àµ"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"ലൊകàµà´•േഷൻ സജàµà´œàµ€à´•à´°à´¿à´šàµà´šà´¤àµ GPS ആണàµ"</string>
<string name="accessibility_location_active" msgid="2427290146138169014">"ലൊകàµà´•േഷൻ à´…à´­àµà´¯àµ¼à´¤àµà´¥à´¨à´•ൾ സജീവമാണàµ"</string>
@@ -251,7 +251,7 @@
<string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"à´¬àµà´²àµ‚ടൂതàµà´¤àµ à´“à´«àµà´šàµ†à´¯àµà´¯àµà´•"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"ജോടിയാകàµà´•à´¿à´¯ ഉപകരണങàµà´™à´³àµŠà´¨àµà´¨àµà´‚ ലഭàµà´¯à´®à´²àµà´²"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"തെളിചàµà´šà´‚"</string>
- <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"à´“à´Ÿàµà´Ÿàµ‹ റൊടàµà´Ÿàµ‡à´±àµà´±àµ"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ആവശàµà´¯à´¾à´¨àµà´¸à´°à´£à´‚ തിരിയàµà´•"</string>
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"റൊടàµà´Ÿàµ‡à´·àµ» ലോകàµà´•àµà´šàµ†à´¯àµâ€Œà´¤àµ"</string>
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"പോർടàµà´°àµ†à´¯àµâ€Œà´±àµà´±àµ"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"ലാൻഡàµâ€Œà´¸àµâ€Œà´•േപàµà´ªàµ"</string>
@@ -266,11 +266,11 @@
<string name="quick_settings_user_label" msgid="5238995632130897840">"ഞാനàµâ€"</string>
<string name="quick_settings_user_title" msgid="4467690427642392403">"ഉപയോകàµà´¤à´¾à´µàµ"</string>
<string name="quick_settings_user_new_user" msgid="9030521362023479778">"à´ªàµà´¤à´¿à´¯ ഉപയോകàµà´¤à´¾à´µàµ"</string>
- <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"വൈഫൈ"</string>
<string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"കണ‌കàµà´±àµà´±àµà´šàµ†à´¯àµâ€Œà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²"</string>
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•ൠഒനàµà´¨àµà´®à´¿à´²àµà´²"</string>
- <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi à´“à´«àµà´šàµ†à´¯àµà´¯àµà´•"</string>
- <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•àµà´•ളൊനàµà´¨àµà´‚ ലഭàµà´¯à´®à´²àµà´²"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"വൈഫൈ à´“à´«àµà´šàµ†à´¯àµà´¯àµà´•"</string>
+ <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"വൈഫൈ നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•àµà´•ളൊനàµà´¨àµà´‚ ലഭàµà´¯à´®à´²àµà´²"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"കാസàµâ€Œà´±àµà´±àµà´šàµ†à´¯àµà´¯àµà´•"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"കാസàµà´±àµà´±àµà´šàµ†à´¯àµà´¯àµà´¨àµà´¨àµ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"പേരിടാതàµà´¤ ഉപകരണം"</string>
@@ -287,7 +287,7 @@
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"ടെതറിംഗàµ"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ഹോടàµà´Ÿàµâ€Œà´¸àµâ€Œà´ªàµ‹à´Ÿàµà´Ÿàµ"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"അറിയിപàµà´ªàµà´•ൾ"</string>
- <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"à´«àµà´²à´¾à´·àµâ€Œà´²àµˆà´±àµà´±àµ"</string>
+ <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ടോർചàµà´šàµ"</string>
<string name="quick_settings_cellular_detail_title" msgid="8575062783675171695">"സെലàµà´²àµà´²à´¾àµ¼ ഡാറàµà´±"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ഡാറàµà´± ഉപയോഗം"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ശേഷികàµà´•àµà´¨àµà´¨ ഡാറàµà´±"</string>
@@ -296,7 +296,7 @@
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> പരിധി"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ"</string>
<string name="recents_empty_message" msgid="8682129509540827999">"നിങàµà´™à´³àµà´Ÿàµ† à´ªàµà´¤à´¿à´¯ à´¸àµà´•àµà´°àµ€à´¨àµà´•ൾ ഇവിടെ ദൃശàµà´¯à´®à´¾à´•àµà´¨àµà´¨àµ"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"à´…à´ªàµà´²à´¿à´•àµà´•േഷൻ വിവരം"</string>
+ <string name="recents_app_info_button_label" msgid="2890317189376000030">"ആപàµà´ªàµ വിവരം"</string>
<string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"à´¸àµà´•àµà´°àµ€àµ» പിൻ ചെയàµà´¯àµ½"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"തിരയàµà´•"</string>
<string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ആരംഭികàµà´•ാനായിലàµà´²."</string>
diff --git a/packages/SystemUI/src/com/android/systemui/SysUIToast.java b/packages/SystemUI/src/com/android/systemui/SysUIToast.java
new file mode 100644
index 000000000000..89bc82f87930
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/SysUIToast.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui;
+
+import android.content.Context;
+import android.view.WindowManager;
+import android.widget.Toast;
+
+public class SysUIToast {
+
+ public static Toast makeText(Context context, CharSequence text, int duration) {
+ Toast toast = Toast.makeText(context, text, duration);
+ toast.getWindowParams().privateFlags |=
+ WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+ return toast;
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 7f61fc1d29c6..009a0d629c94 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -253,6 +253,7 @@ public class KeyguardViewMediator extends SystemUI {
private KeyguardUpdateMonitor mUpdateMonitor;
private boolean mDeviceInteractive;
+ private boolean mGoingToSleep;
// last known state of the cellular connection
private String mPhoneState = TelephonyManager.EXTRA_STATE_IDLE;
@@ -639,6 +640,7 @@ public class KeyguardViewMediator extends SystemUI {
if (DEBUG) Log.d(TAG, "onStartedGoingToSleep(" + why + ")");
synchronized (this) {
mDeviceInteractive = false;
+ mGoingToSleep = true;
// Lock immediately based on setting if secure (user has a pin/pattern/password).
// This also "locks" the device when not secure to provide easy access to the
@@ -678,6 +680,7 @@ public class KeyguardViewMediator extends SystemUI {
if (DEBUG) Log.d(TAG, "onFinishedGoingToSleep(" + why + ")");
synchronized (this) {
mDeviceInteractive = false;
+ mGoingToSleep = false;
resetKeyguardDonePendingLocked();
mHideAnimationRun = false;
@@ -1239,6 +1242,10 @@ public class KeyguardViewMediator extends SystemUI {
}
mUpdateMonitor.clearFingerprintRecognized();
+ if (mGoingToSleep) {
+ Log.i(TAG, "Device is going to sleep, aborting keyguardDone");
+ return;
+ }
if (mExitSecureCallback != null) {
try {
mExitSecureCallback.onKeyguardExitResult(authenticated);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
index 359ed5f0afd0..781ab1c7363c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -33,6 +33,7 @@ import android.widget.Toast;
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.Prefs;
import com.android.systemui.R;
+import com.android.systemui.SysUIToast;
import com.android.systemui.qs.QSTile;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.volume.ZenModePanel;
@@ -102,7 +103,7 @@ public class DndTile extends QSTile<QSTile.BooleanState> {
if (mController.isVolumeRestricted()) {
// Collapse the panels, so the user can see the toast.
mHost.collapsePanels();
- Toast.makeText(mContext, mContext.getString(
+ SysUIToast.makeText(mContext, mContext.getString(
com.android.internal.R.string.error_message_change_not_allowed),
Toast.LENGTH_LONG).show();
return;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index bda137466059..891cc738c10b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -1700,7 +1700,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
Log.v(TAG, "DEBUG_MEDIA: Fading out album artwork");
}
mBackdrop.animate()
- .alpha(0f)
+ // Never let the alpha become zero - otherwise the RenderNode
+ // won't draw anything and uninitialized memory will show through
+ // if mScrimSrcModeEnabled. Note that 0.001 is rounded down to 0 in libhwui.
+ .alpha(0.002f)
.setInterpolator(mBackdropInterpolator)
.setDuration(300)
.setStartDelay(0)
@@ -3030,11 +3033,14 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
}
final int N = newlyVisible.size();
- String[] newlyVisibleKeyAr = new String[N];
- for (int i = 0; i < N; i++) {
- newlyVisibleKeyAr[i] = newlyVisibleAr[i].key;
+ if (N > 0) {
+ String[] newlyVisibleKeyAr = new String[N];
+ for (int i = 0; i < N; i++) {
+ newlyVisibleKeyAr[i] = newlyVisibleAr[i].key;
+ }
+
+ setNotificationsShown(newlyVisibleKeyAr);
}
- setNotificationsShown(newlyVisibleKeyAr);
}
// State logging
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 24e3c78679f6..81f2d532de35 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -661,8 +661,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
for (int i = start /* get out of normal index range */; i < start + num; i++) {
subs.add(addSignalController(i, i));
}
+ mCallbackHandler.setSubs(subs);
}
- mCallbackHandler.setSubs(subs);
}
String nosim = args.getString("nosim");
if (nosim != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
index b505d9d32383..6af98543b214 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
@@ -25,7 +25,9 @@ import android.net.ConnectivityManager.NetworkCallback;
import android.net.IConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
import android.net.NetworkRequest;
+import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
@@ -34,6 +36,7 @@ import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
+import com.android.internal.net.LegacyVpnInfo;
import com.android.internal.net.VpnConfig;
import com.android.internal.net.VpnInfo;
import com.android.systemui.R;
@@ -210,9 +213,17 @@ public class SecurityControllerImpl implements SecurityController {
try {
for (UserInfo user : mUserManager.getUsers()) {
VpnConfig cfg = mConnectivityManagerService.getVpnConfig(user.id);
- if (cfg != null) {
- vpns.put(user.id, cfg);
+ if (cfg == null) {
+ continue;
+ } else if (cfg.legacy) {
+ // Legacy VPNs should do nothing if the network is disconnected. Third-party
+ // VPN warnings need to continue as traffic can still go to the app.
+ LegacyVpnInfo legacyVpn = mConnectivityManagerService.getLegacyVpnInfo(user.id);
+ if (legacyVpn == null || legacyVpn.state != LegacyVpnInfo.STATE_CONNECTED) {
+ continue;
+ }
}
+ vpns.put(user.id, cfg);
}
} catch (RemoteException rme) {
// Roll back to previous state
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java
index ca6aaeba8c0a..3f5ca58fe6ca 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java
@@ -103,6 +103,11 @@ public class DemoModeFragment extends PreferenceFragment implements OnPreference
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (preference == mEnabledSwitch) {
+ if (newValue != Boolean.TRUE) {
+ // Make sure we aren't in demo mode when disabling it.
+ mOnSwitch.setChecked(false);
+ stopDemoMode();
+ }
setGlobal(DEMO_MODE_ALLOWED, newValue == Boolean.TRUE ? 1 : 0);
} else if (preference == mOnSwitch) {
if (newValue == Boolean.TRUE) {
@@ -123,7 +128,7 @@ public class DemoModeFragment extends PreferenceFragment implements OnPreference
getContext().sendBroadcast(intent);
intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_CLOCK);
- intent.putExtra("hhmm", "0520");
+ intent.putExtra("hhmm", "0600");
getContext().sendBroadcast(intent);
intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_NETWORK);
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 8ca075f97d66..daac52104498 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -220,23 +220,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
private static final int ENABLED = 1;
private static final int DISABLED = 0;
- // Arguments to rematchNetworkAndRequests()
- private enum NascentState {
- // Indicates a network was just validated for the first time. If the network is found to
- // be unwanted (i.e. not satisfy any NetworkRequests) it is torn down.
- JUST_VALIDATED,
- // Indicates a network was not validated for the first time immediately prior to this call.
- NOT_JUST_VALIDATED
- };
private enum ReapUnvalidatedNetworks {
- // Tear down unvalidated networks that have no chance (i.e. even if validated) of becoming
- // the highest scoring network satisfying a NetworkRequest. This should be passed when it's
- // known that there may be unvalidated networks that could potentially be reaped, and when
+ // Tear down networks that have no chance (e.g. even if validated) of becoming
+ // the highest scoring network satisfying a NetworkRequest. This should be passed when
// all networks have been rematched against all NetworkRequests.
REAP,
- // Don't reap unvalidated networks. This should be passed when it's known that there are
- // no unvalidated networks that could potentially be reaped, and when some networks have
- // not yet been rematched against all NetworkRequests.
+ // Don't reap networks. This should be passed when some networks have not yet been
+ // rematched against all NetworkRequests.
DONT_REAP
};
@@ -569,8 +559,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
final DetailedState state = nai.networkInfo.getDetailedState();
for (int type = 0; type < mTypeLists.length; type++) {
final ArrayList<NetworkAgentInfo> list = mTypeLists[type];
+ final boolean contains = (list != null && list.contains(nai));
final boolean isFirst = (list != null && list.size() > 0 && nai == list.get(0));
- if (isFirst || isDefault) {
+ if (isFirst || (contains && isDefault)) {
maybeLogBroadcast(nai, state, type, isDefault);
sendLegacyNetworkBroadcast(nai, state, type);
}
@@ -890,7 +881,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
Network network = null;
String subscriberId = null;
- NetworkAgentInfo nai = mNetworkForRequestId.get(mDefaultRequest.requestId);
+ NetworkAgentInfo nai = getDefaultNetwork();
final Network[] networks = getVpnUnderlyingNetworks(uid);
if (networks != null) {
@@ -1795,7 +1786,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
pw.println();
pw.println();
- NetworkAgentInfo defaultNai = mNetworkForRequestId.get(mDefaultRequest.requestId);
+ final NetworkAgentInfo defaultNai = getDefaultNetwork();
pw.print("Active default network: ");
if (defaultNai == null) {
pw.println("none");
@@ -1920,8 +1911,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
networkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED)) {
Slog.wtf(TAG, "BUG: " + nai + " has stateful capability.");
}
- updateCapabilities(nai, networkCapabilities,
- NascentState.NOT_JUST_VALIDATED);
+ updateCapabilities(nai, networkCapabilities);
}
break;
}
@@ -2011,11 +2001,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (DBG) log(nai.name() + " validation " + (valid ? " passed" : "failed"));
if (valid != nai.lastValidated) {
final int oldScore = nai.getCurrentScore();
- final NascentState nascent = (valid && !nai.everValidated) ?
- NascentState.JUST_VALIDATED : NascentState.NOT_JUST_VALIDATED;
nai.lastValidated = valid;
nai.everValidated |= valid;
- updateCapabilities(nai, nai.networkCapabilities, nascent);
+ updateCapabilities(nai, nai.networkCapabilities);
// If score has changed, rebroadcast to NetworkFactories. b/17726566
if (oldScore != nai.getCurrentScore()) sendUpdatedScoreToFactories(nai);
}
@@ -2046,8 +2034,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (nai != null && (visible != nai.lastCaptivePortalDetected)) {
nai.lastCaptivePortalDetected = visible;
nai.everCaptivePortalDetected |= visible;
- updateCapabilities(nai, nai.networkCapabilities,
- NascentState.NOT_JUST_VALIDATED);
+ updateCapabilities(nai, nai.networkCapabilities);
}
if (!visible) {
setProvNotificationVisibleIntent(false, netId, null, 0, null, null, false);
@@ -2066,17 +2053,22 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
+ private void linger(NetworkAgentInfo nai) {
+ nai.lingering = true;
+ nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_LINGER);
+ notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_LOSING);
+ }
+
// Cancel any lingering so the linger timeout doesn't teardown a network.
// This should be called when a network begins satisfying a NetworkRequest.
// Note: depending on what state the NetworkMonitor is in (e.g.,
// if it's awaiting captive portal login, or if validation failed), this
// may trigger a re-evaluation of the network.
private void unlinger(NetworkAgentInfo nai) {
- if (VDBG) log("Canceling linger of " + nai.name());
- // If network has never been validated, it cannot have been lingered, so don't bother
- // needlessly triggering a re-evaluation.
- if (!nai.everValidated) return;
nai.networkLingered.clear();
+ if (!nai.lingering) return;
+ nai.lingering = false;
+ if (VDBG) log("Canceling linger of " + nai.name());
nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED);
}
@@ -2147,33 +2139,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
// available until we've told netd to delete it below.
mNetworkForNetId.remove(nai.network.netId);
}
- // Since we've lost the network, go through all the requests that
- // it was satisfying and see if any other factory can satisfy them.
- // TODO: This logic may be better replaced with a call to rematchAllNetworksAndRequests
- final ArrayList<NetworkAgentInfo> toActivate = new ArrayList<NetworkAgentInfo>();
+ // Remove all previously satisfied requests.
for (int i = 0; i < nai.networkRequests.size(); i++) {
NetworkRequest request = nai.networkRequests.valueAt(i);
NetworkAgentInfo currentNetwork = mNetworkForRequestId.get(request.requestId);
if (currentNetwork != null && currentNetwork.network.netId == nai.network.netId) {
- if (DBG) {
- log("Checking for replacement network to handle request " + request );
- }
mNetworkForRequestId.remove(request.requestId);
sendUpdatedScoreToFactories(request, 0);
- NetworkAgentInfo alternative = null;
- for (NetworkAgentInfo existing : mNetworkAgentInfos.values()) {
- if (existing.satisfies(request) &&
- (alternative == null ||
- alternative.getCurrentScore() < existing.getCurrentScore())) {
- alternative = existing;
- }
- }
- if (alternative != null) {
- if (DBG) log(" found replacement in " + alternative.name());
- if (!toActivate.contains(alternative)) {
- toActivate.add(alternative);
- }
- }
}
}
if (nai.networkRequests.get(mDefaultRequest.requestId) != null) {
@@ -2182,11 +2154,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
requestNetworkTransitionWakelock(nai.name());
}
mLegacyTypeTracker.remove(nai, wasDefault);
- for (NetworkAgentInfo networkToActivate : toActivate) {
- unlinger(networkToActivate);
- rematchNetworkAndRequests(networkToActivate, NascentState.NOT_JUST_VALIDATED,
- ReapUnvalidatedNetworks.DONT_REAP);
- }
+ rematchAllNetworksAndRequests(null, 0);
if (nai.created) {
// Tell netd to clean up the configuration for this network
// (routing rules, DNS, etc).
@@ -2240,49 +2208,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
private void handleRegisterNetworkRequest(NetworkRequestInfo nri) {
mNetworkRequests.put(nri.request, nri);
-
- // TODO: This logic may be better replaced with a call to rematchNetworkAndRequests
-
- // Check for the best currently alive network that satisfies this request
- NetworkAgentInfo bestNetwork = null;
- for (NetworkAgentInfo network : mNetworkAgentInfos.values()) {
- if (DBG) log("handleRegisterNetworkRequest checking " + network.name());
- if (network.satisfies(nri.request)) {
- if (DBG) log("apparently satisfied. currentScore=" + network.getCurrentScore());
- if (!nri.isRequest) {
- // Not setting bestNetwork here as a listening NetworkRequest may be
- // satisfied by multiple Networks. Instead the request is added to
- // each satisfying Network and notified about each.
- if (!network.addRequest(nri.request)) {
- Slog.wtf(TAG, "BUG: " + network.name() + " already has " + nri.request);
- }
- notifyNetworkCallback(network, nri);
- } else if (bestNetwork == null ||
- bestNetwork.getCurrentScore() < network.getCurrentScore()) {
- bestNetwork = network;
- }
- }
- }
- if (bestNetwork != null) {
- if (DBG) log("using " + bestNetwork.name());
- unlinger(bestNetwork);
- if (!bestNetwork.addRequest(nri.request)) {
- Slog.wtf(TAG, "BUG: " + bestNetwork.name() + " already has " + nri.request);
- }
- mNetworkForRequestId.put(nri.request.requestId, bestNetwork);
- notifyNetworkCallback(bestNetwork, nri);
- if (nri.request.legacyType != TYPE_NONE) {
- mLegacyTypeTracker.add(nri.request.legacyType, bestNetwork);
- }
- }
-
- if (nri.isRequest) {
- if (DBG) log("sending new NetworkRequest to factories");
- final int score = bestNetwork == null ? 0 : bestNetwork.getCurrentScore();
- for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
- nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score,
- 0, nri.request);
- }
+ rematchAllNetworksAndRequests(null, 0);
+ if (nri.isRequest && mNetworkForRequestId.get(nri.request.requestId) == null) {
+ sendUpdatedScoreToFactories(nri.request, 0);
}
}
@@ -2295,43 +2223,28 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
// Is nai unneeded by all NetworkRequests (and should be disconnected)?
- // For validated Networks this is simply whether it is satsifying any NetworkRequests.
- // For unvalidated Networks this is whether it is satsifying any NetworkRequests or
- // were it to become validated, would it have a chance of satisfying any NetworkRequests.
+ // This is whether it is satisfying any NetworkRequests or were it to become validated,
+ // would it have a chance of satisfying any NetworkRequests.
private boolean unneeded(NetworkAgentInfo nai) {
- if (!nai.created || nai.isVPN()) return false;
- boolean unneeded = true;
- if (nai.everValidated) {
- for (int i = 0; i < nai.networkRequests.size() && unneeded; i++) {
- final NetworkRequest nr = nai.networkRequests.valueAt(i);
- try {
- if (isRequest(nr)) unneeded = false;
- } catch (Exception e) {
- loge("Request " + nr + " not found in mNetworkRequests.");
- loge(" it came from request list of " + nai.name());
- }
- }
- } else {
- for (NetworkRequestInfo nri : mNetworkRequests.values()) {
- // If this Network is already the highest scoring Network for a request, or if
- // there is hope for it to become one if it validated, then it is needed.
- if (nri.isRequest && nai.satisfies(nri.request) &&
- (nai.networkRequests.get(nri.request.requestId) != null ||
- // Note that this catches two important cases:
- // 1. Unvalidated cellular will not be reaped when unvalidated WiFi
- // is currently satisfying the request. This is desirable when
- // cellular ends up validating but WiFi does not.
- // 2. Unvalidated WiFi will not be reaped when validated cellular
- // is currently satsifying the request. This is desirable when
- // WiFi ends up validating and out scoring cellular.
- mNetworkForRequestId.get(nri.request.requestId).getCurrentScore() <
- nai.getCurrentScoreAsValidated())) {
- unneeded = false;
- break;
- }
+ if (!nai.created || nai.isVPN() || nai.lingering) return false;
+ for (NetworkRequestInfo nri : mNetworkRequests.values()) {
+ // If this Network is already the highest scoring Network for a request, or if
+ // there is hope for it to become one if it validated, then it is needed.
+ if (nri.isRequest && nai.satisfies(nri.request) &&
+ (nai.networkRequests.get(nri.request.requestId) != null ||
+ // Note that this catches two important cases:
+ // 1. Unvalidated cellular will not be reaped when unvalidated WiFi
+ // is currently satisfying the request. This is desirable when
+ // cellular ends up validating but WiFi does not.
+ // 2. Unvalidated WiFi will not be reaped when validated cellular
+ // is currently satsifying the request. This is desirable when
+ // WiFi ends up validating and out scoring cellular.
+ mNetworkForRequestId.get(nri.request.requestId).getCurrentScore() <
+ nai.getCurrentScoreAsValidated())) {
+ return false;
}
}
- return unneeded;
+ return true;
}
private void handleReleaseNetworkRequest(NetworkRequest request, int callingUid) {
@@ -2441,7 +2354,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (accept != nai.networkMisc.acceptUnvalidated) {
int oldScore = nai.getCurrentScore();
nai.networkMisc.acceptUnvalidated = accept;
- rematchAllNetworksAndRequests(nai, oldScore, NascentState.NOT_JUST_VALIDATED);
+ rematchAllNetworksAndRequests(nai, oldScore);
sendUpdatedScoreToFactories(nai);
}
@@ -2750,16 +2663,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
- public void captivePortalAppResponse(Network network, int response, String actionToken) {
- if (response == ConnectivityManager.CAPTIVE_PORTAL_APP_RETURN_WANTED_AS_IS) {
- enforceConnectivityInternalPermission();
- }
- final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
- if (nai == null) return;
- nai.networkMonitor.sendMessage(NetworkMonitor.CMD_CAPTIVE_PORTAL_APP_FINISHED, response, 0,
- actionToken);
- }
-
private ProxyInfo getDefaultProxy() {
// this information is already available as a world read/writable jvm property
// so this API change wouldn't have a benifit. It also breaks the passing
@@ -3129,11 +3032,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
* are checked in Vpn class.
*/
@Override
- public LegacyVpnInfo getLegacyVpnInfo() {
+ public LegacyVpnInfo getLegacyVpnInfo(int userId) {
+ enforceCrossUserPermission(userId);
throwIfLockdownEnabled();
- int user = UserHandle.getUserId(Binder.getCallingUid());
synchronized(mVpns) {
- return mVpns.get(user).getLegacyVpnInfo();
+ return mVpns.get(userId).getLegacyVpnInfo();
}
}
@@ -4050,7 +3953,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
} catch (Exception e) {
loge("Exception in setDnsServersForNetwork: " + e);
}
- NetworkAgentInfo defaultNai = mNetworkForRequestId.get(mDefaultRequest.requestId);
+ final NetworkAgentInfo defaultNai = getDefaultNetwork();
if (defaultNai != null && defaultNai.network.netId == netId) {
setDefaultDnsSystemProperties(dnses);
}
@@ -4085,31 +3988,29 @@ public class ConnectivityService extends IConnectivityManager.Stub
* augmented with any stateful capabilities implied from {@code networkAgent}
* (e.g., validated status and captive portal status).
*
- * @param networkAgent the network having its capabilities updated.
+ * @param nai the network having its capabilities updated.
* @param networkCapabilities the new network capabilities.
- * @param nascent indicates whether {@code networkAgent} was validated
- * (i.e. had everValidated set for the first time) immediately prior to this call.
*/
- private void updateCapabilities(NetworkAgentInfo networkAgent,
- NetworkCapabilities networkCapabilities, NascentState nascent) {
+ private void updateCapabilities(NetworkAgentInfo nai, NetworkCapabilities networkCapabilities) {
// Don't modify caller's NetworkCapabilities.
networkCapabilities = new NetworkCapabilities(networkCapabilities);
- if (networkAgent.lastValidated) {
+ if (nai.lastValidated) {
networkCapabilities.addCapability(NET_CAPABILITY_VALIDATED);
} else {
networkCapabilities.removeCapability(NET_CAPABILITY_VALIDATED);
}
- if (networkAgent.lastCaptivePortalDetected) {
+ if (nai.lastCaptivePortalDetected) {
networkCapabilities.addCapability(NET_CAPABILITY_CAPTIVE_PORTAL);
} else {
networkCapabilities.removeCapability(NET_CAPABILITY_CAPTIVE_PORTAL);
}
- if (!Objects.equals(networkAgent.networkCapabilities, networkCapabilities)) {
- synchronized (networkAgent) {
- networkAgent.networkCapabilities = networkCapabilities;
+ if (!Objects.equals(nai.networkCapabilities, networkCapabilities)) {
+ final int oldScore = nai.getCurrentScore();
+ synchronized (nai) {
+ nai.networkCapabilities = networkCapabilities;
}
- rematchAllNetworksAndRequests(networkAgent, networkAgent.getCurrentScore(), nascent);
- notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_CAP_CHANGED);
+ rematchAllNetworksAndRequests(nai, oldScore);
+ notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
}
}
@@ -4251,7 +4152,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// one or more NetworkRequests, or if it is a VPN.
//
// - Tears down newNetwork if it just became validated
- // (i.e. nascent==JUST_VALIDATED) but turns out to be unneeded.
+ // but turns out to be unneeded.
//
// - If reapUnvalidatedNetworks==REAP, tears down unvalidated
// networks that have no chance (i.e. even if validated)
@@ -4264,17 +4165,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
// as it performs better by a factor of the number of Networks.
//
// @param newNetwork is the network to be matched against NetworkRequests.
- // @param nascent indicates if newNetwork just became validated, in which case it should be
- // torn down if unneeded.
// @param reapUnvalidatedNetworks indicates if an additional pass over all networks should be
// performed to tear down unvalidated networks that have no chance (i.e. even if
// validated) of becoming the highest scoring network.
- private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork, NascentState nascent,
+ private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork,
ReapUnvalidatedNetworks reapUnvalidatedNetworks) {
if (!newNetwork.created) return;
- if (nascent == NascentState.JUST_VALIDATED && !newNetwork.everValidated) {
- loge("ERROR: nascent network not validated.");
- }
boolean keep = newNetwork.isVPN();
boolean isNewDefault = false;
NetworkAgentInfo oldDefaultNetwork = null;
@@ -4287,7 +4183,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
for (NetworkRequestInfo nri : mNetworkRequests.values()) {
NetworkAgentInfo currentNetwork = mNetworkForRequestId.get(nri.request.requestId);
if (newNetwork == currentNetwork) {
- if (DBG) {
+ if (VDBG) {
log("Network " + newNetwork.name() + " was already satisfying" +
" request " + nri.request.requestId + ". No change.");
}
@@ -4344,10 +4240,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
// Linger any networks that are no longer needed.
for (NetworkAgentInfo nai : affectedNetworks) {
- if (nai.everValidated && unneeded(nai)) {
- nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_LINGER);
- notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_LOSING);
+ if (nai.lingering) {
+ // Already lingered. Nothing to do. This can only happen if "nai" is in
+ // "affectedNetworks" twice. The reasoning being that to get added to
+ // "affectedNetworks", "nai" must have been satisfying a NetworkRequest
+ // (i.e. not lingered) so it could have only been lingered by this loop.
+ // unneeded(nai) will be false and we'll call unlinger() below which would
+ // be bad, so handle it here.
+ } else if (unneeded(nai)) {
+ linger(nai);
} else {
+ // Clear nai.networkLingered we might have added above.
unlinger(nai);
}
}
@@ -4381,7 +4284,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mLegacyTypeTracker.remove(oldDefaultNetwork.networkInfo.getType(),
oldDefaultNetwork, true);
}
- mDefaultInetConditionPublished = newNetwork.everValidated ? 100 : 0;
+ mDefaultInetConditionPublished = newNetwork.lastValidated ? 100 : 0;
mLegacyTypeTracker.add(newNetwork.networkInfo.getType(), newNetwork);
notifyLockdownVpn(newNetwork);
}
@@ -4432,19 +4335,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (newNetwork.isVPN()) {
mLegacyTypeTracker.add(TYPE_VPN, newNetwork);
}
- } else if (nascent == NascentState.JUST_VALIDATED) {
- // Only tear down newly validated networks here. Leave unvalidated to either become
- // validated (and get evaluated against peers, one losing here), or get reaped (see
- // reapUnvalidatedNetworks) if they have no chance of becoming the highest scoring
- // network. Networks that have been up for a while and are validated should be torn
- // down via the lingering process so communication on that network is given time to
- // wrap up.
- if (DBG) log("Validated network turns out to be unwanted. Tear it down.");
- teardownUnneededNetwork(newNetwork);
}
if (reapUnvalidatedNetworks == ReapUnvalidatedNetworks.REAP) {
for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
- if (!nai.everValidated && unneeded(nai)) {
+ if (unneeded(nai)) {
if (DBG) log("Reaping " + nai.name());
teardownUnneededNetwork(nai);
}
@@ -4463,10 +4357,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
* this argument, otherwise pass {@code changed.getCurrentScore()} or 0 if
* {@code changed} is {@code null}. This is because NetworkCapabilities influence a
* network's score.
- * @param nascent indicates if {@code changed} has just been validated.
*/
- private void rematchAllNetworksAndRequests(NetworkAgentInfo changed, int oldScore,
- NascentState nascent) {
+ private void rematchAllNetworksAndRequests(NetworkAgentInfo changed, int oldScore) {
// TODO: This may get slow. The "changed" parameter is provided for future optimization
// to avoid the slowness. It is not simply enough to process just "changed", for
// example in the case where "changed"'s score decreases and another network should begin
@@ -4475,17 +4367,21 @@ public class ConnectivityService extends IConnectivityManager.Stub
// Optimization: Only reprocess "changed" if its score improved. This is safe because it
// can only add more NetworkRequests satisfied by "changed", and this is exactly what
// rematchNetworkAndRequests() handles.
- if (changed != null &&
- (oldScore < changed.getCurrentScore() || nascent == NascentState.JUST_VALIDATED)) {
- rematchNetworkAndRequests(changed, nascent, ReapUnvalidatedNetworks.REAP);
+ if (changed != null && oldScore < changed.getCurrentScore()) {
+ rematchNetworkAndRequests(changed, ReapUnvalidatedNetworks.REAP);
} else {
- for (Iterator i = mNetworkAgentInfos.values().iterator(); i.hasNext(); ) {
- rematchNetworkAndRequests((NetworkAgentInfo)i.next(),
- NascentState.NOT_JUST_VALIDATED,
+ final NetworkAgentInfo[] nais = mNetworkAgentInfos.values().toArray(
+ new NetworkAgentInfo[mNetworkAgentInfos.size()]);
+ // Rematch higher scoring networks first to prevent requests first matching a lower
+ // scoring network and then a higher scoring network, which could produce multiple
+ // callbacks and inadvertently unlinger networks.
+ Arrays.sort(nais);
+ for (NetworkAgentInfo nai : nais) {
+ rematchNetworkAndRequests(nai,
// Only reap the last time through the loop. Reaping before all rematching
// is complete could incorrectly teardown a network that hasn't yet been
// rematched.
- i.hasNext() ? ReapUnvalidatedNetworks.DONT_REAP
+ (nai != nais[nais.length-1]) ? ReapUnvalidatedNetworks.DONT_REAP
: ReapUnvalidatedNetworks.REAP);
}
}
@@ -4573,8 +4469,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
// Consider network even though it is not yet validated.
- rematchNetworkAndRequests(networkAgent, NascentState.NOT_JUST_VALIDATED,
- ReapUnvalidatedNetworks.REAP);
+ rematchNetworkAndRequests(networkAgent, ReapUnvalidatedNetworks.REAP);
// This has to happen after matching the requests, because callbacks are just requests.
notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_PRECHECK);
@@ -4594,8 +4489,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
state == NetworkInfo.State.SUSPENDED) {
// going into or coming out of SUSPEND: rescore and notify
if (networkAgent.getCurrentScore() != oldScore) {
- rematchAllNetworksAndRequests(networkAgent, oldScore,
- NascentState.NOT_JUST_VALIDATED);
+ rematchAllNetworksAndRequests(networkAgent, oldScore);
}
notifyNetworkCallbacks(networkAgent, (state == NetworkInfo.State.SUSPENDED ?
ConnectivityManager.CALLBACK_SUSPENDED :
@@ -4615,7 +4509,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
final int oldScore = nai.getCurrentScore();
nai.setCurrentScore(score);
- rematchAllNetworksAndRequests(nai, oldScore, NascentState.NOT_JUST_VALIDATED);
+ rematchAllNetworksAndRequests(nai, oldScore);
sendUpdatedScoreToFactories(nai);
}
@@ -4665,7 +4559,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
NetworkAgentInfo newDefaultAgent = null;
if (nai.networkRequests.get(mDefaultRequest.requestId) != null) {
- newDefaultAgent = mNetworkForRequestId.get(mDefaultRequest.requestId);
+ newDefaultAgent = getDefaultNetwork();
if (newDefaultAgent != null) {
intent.putExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO,
newDefaultAgent.networkInfo);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 88a0c8f42fea..6e94647615e5 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -498,13 +498,11 @@ public final class ActivityManagerService extends ActivityManagerNative
@Override
public void run() {
Slog.w(TAG, "getAssistContextExtras failed: timeout retrieving from " + activity);
- synchronized (ActivityManagerService.this) {
- synchronized (this) {
- haveResult = true;
- notifyAll();
- }
- pendingAssistExtrasTimedOutLocked(this);
+ synchronized (this) {
+ haveResult = true;
+ notifyAll();
}
+ pendingAssistExtrasTimedOut(this);
}
}
@@ -10753,9 +10751,13 @@ public final class ActivityManagerService extends ActivityManagerNative
}
}
- void pendingAssistExtrasTimedOutLocked(PendingAssistExtras pae) {
- mPendingAssistExtras.remove(pae);
- if (pae.receiver != null) {
+ void pendingAssistExtrasTimedOut(PendingAssistExtras pae) {
+ IResultReceiver receiver;
+ synchronized (this) {
+ mPendingAssistExtras.remove(pae);
+ receiver = pae.receiver;
+ }
+ if (receiver != null) {
// Caller wants result sent back to them.
try {
pae.receiver.send(0, null);
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 31cdcd51aff9..8c3a9508922d 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -2963,7 +2963,6 @@ final class ActivityStack {
r.state = ActivityState.FINISHING;
if (mode == FINISH_IMMEDIATELY
- || (mode == FINISH_AFTER_PAUSE && prevState == ActivityState.PAUSED)
|| prevState == ActivityState.STOPPED
|| prevState == ActivityState.INITIALIZING) {
// If this activity is already stopped, we can just finish
diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
index 51c6628d1ff3..8a7943032b33 100644
--- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
@@ -16,6 +16,8 @@
package com.android.server.connectivity;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
+
import android.content.Context;
import android.net.LinkProperties;
import android.net.Network;
@@ -31,14 +33,71 @@ import com.android.internal.util.AsyncChannel;
import com.android.server.connectivity.NetworkMonitor;
import java.util.ArrayList;
+import java.util.Comparator;
/**
* A bag class used by ConnectivityService for holding a collection of most recent
* information published by a particular NetworkAgent as well as the
* AsyncChannel/messenger for reaching that NetworkAgent and lists of NetworkRequests
- * interested in using it.
+ * interested in using it. Default sort order is descending by score.
*/
-public class NetworkAgentInfo {
+// States of a network:
+// --------------------
+// 1. registered, uncreated, disconnected, unvalidated
+// This state is entered when a NetworkFactory registers a NetworkAgent in any state except
+// the CONNECTED state.
+// 2. registered, uncreated, connected, unvalidated
+// This state is entered when a registered NetworkAgent transitions to the CONNECTED state
+// ConnectivityService will tell netd to create the network and immediately transition to
+// state #3.
+// 3. registered, created, connected, unvalidated
+// If this network can satsify the default NetworkRequest, then NetworkMonitor will
+// probe for Internet connectivity.
+// If this network cannot satisfy the default NetworkRequest, it will immediately be
+// transitioned to state #4.
+// A network may remain in this state if NetworkMonitor fails to find Internet connectivity,
+// for example:
+// a. a captive portal is present, or
+// b. a WiFi router whose Internet backhaul is down, or
+// c. a wireless connection stops transfering packets temporarily (e.g. device is in elevator
+// or tunnel) but does not disconnect from the AP/cell tower, or
+// d. a stand-alone device offering a WiFi AP without an uplink for configuration purposes.
+// 4. registered, created, connected, validated
+//
+// The device's default network connection:
+// ----------------------------------------
+// Networks in states #3 and #4 may be used as a device's default network connection if they
+// satisfy the default NetworkRequest.
+// A network, that satisfies the default NetworkRequest, in state #4 should always be chosen
+// in favor of a network, that satisfies the default NetworkRequest, in state #3.
+// When deciding between two networks, that both satisfy the default NetworkRequest, to select
+// for the default network connection, the one with the higher score should be chosen.
+//
+// When a network disconnects:
+// ---------------------------
+// If a network's transport disappears, for example:
+// a. WiFi turned off, or
+// b. cellular data turned off, or
+// c. airplane mode is turned on, or
+// d. a wireless connection disconnects from AP/cell tower entirely (e.g. device is out of range
+// of AP for an extended period of time, or switches to another AP without roaming)
+// then that network can transition from any state (#1-#4) to unregistered. This happens by
+// the transport disconnecting their NetworkAgent's AsyncChannel with ConnectivityManager.
+// ConnectivityService also tells netd to destroy the network.
+//
+// When ConnectivityService disconnects a network:
+// -----------------------------------------------
+// If a network has no chance of satisfying any requests (even if it were to become validated
+// and enter state #4), ConnectivityService will disconnect the NetworkAgent's AsyncChannel.
+// If the network ever for any period of time had satisfied a NetworkRequest (i.e. had been
+// the highest scoring that satisfied the NetworkRequest's constraints), but is no longer the
+// highest scoring network for any NetworkRequest, then there will be a 30s pause before
+// ConnectivityService disconnects the NetworkAgent's AsyncChannel. During this pause the
+// network is considered "lingering". This pause exists to allow network communication to be
+// wrapped up rather than abruptly terminated. During this pause if the network begins satisfying
+// a NetworkRequest, ConnectivityService will cancel the future disconnection of the NetworkAgent's
+// AsyncChannel, and the network is no longer considered "lingering".
+public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
public NetworkInfo networkInfo;
// This Network object should always be used if possible, so as to encourage reuse of the
// enclosed socket factory and connection pool. Avoid creating other Network objects.
@@ -72,6 +131,13 @@ public class NetworkAgentInfo {
// Whether a captive portal was found during the last network validation attempt.
public boolean lastCaptivePortalDetected;
+ // Indicates whether the network is lingering. Networks are lingered when they become unneeded
+ // as a result of their NetworkRequests being satisfied by a different network, so as to allow
+ // communication to wrap up before the network is taken down. This usually only happens to the
+ // default network. Lingering ends with either the linger timeout expiring and the network
+ // being taken down, or the network satisfying a request again.
+ public boolean lingering;
+
// This represents the last score received from the NetworkAgent.
private int currentScore;
// Penalty applied to scores of Networks that have not been validated.
@@ -148,7 +214,12 @@ public class NetworkAgentInfo {
}
int score = currentScore;
- if (!everValidated && !pretendValidated) score -= UNVALIDATED_SCORE_PENALTY;
+ // Use NET_CAPABILITY_VALIDATED here instead of lastValidated, this allows
+ // ConnectivityService.updateCapabilities() to compute the old score prior to updating
+ // networkCapabilities (with a potentially different validated state).
+ if (!networkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED) && !pretendValidated) {
+ score -= UNVALIDATED_SCORE_PENALTY;
+ }
if (score < 0) score = 0;
return score;
}
@@ -175,7 +246,7 @@ public class NetworkAgentInfo {
linkProperties + "} nc{" +
networkCapabilities + "} Score{" + getCurrentScore() + "} " +
"everValidated{" + everValidated + "} lastValidated{" + lastValidated + "} " +
- "created{" + created + "} " +
+ "created{" + created + "} lingering{" + lingering + "} " +
"explicitlySelected{" + networkMisc.explicitlySelected + "} " +
"acceptUnvalidated{" + networkMisc.acceptUnvalidated + "} " +
"everCaptivePortalDetected{" + everCaptivePortalDetected + "} " +
@@ -188,4 +259,10 @@ public class NetworkAgentInfo {
networkInfo.getSubtypeName() + ") - " +
(network == null ? "null" : network.toString()) + "]";
}
+
+ // Enables sorting in descending order of score.
+ @Override
+ public int compareTo(NetworkAgentInfo other) {
+ return other.getCurrentScore() - getCurrentScore();
+ }
}
diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
index e47292866d9c..26339395016b 100644
--- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -16,6 +16,10 @@
package com.android.server.connectivity;
+import static android.net.CaptivePortal.APP_RETURN_DISMISSED;
+import static android.net.CaptivePortal.APP_RETURN_UNWANTED;
+import static android.net.CaptivePortal.APP_RETURN_WANTED_AS_IS;
+
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
@@ -23,7 +27,9 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.net.CaptivePortal;
import android.net.ConnectivityManager;
+import android.net.ICaptivePortal;
import android.net.NetworkRequest;
import android.net.ProxyInfo;
import android.net.TrafficStats;
@@ -160,12 +166,12 @@ public class NetworkMonitor extends StateMachine {
/**
* Message to self indicating captive portal app finished.
- * arg1 = one of: CAPTIVE_PORTAL_APP_RETURN_DISMISSED,
- * CAPTIVE_PORTAL_APP_RETURN_UNWANTED,
- * CAPTIVE_PORTAL_APP_RETURN_WANTED_AS_IS
+ * arg1 = one of: APP_RETURN_DISMISSED,
+ * APP_RETURN_UNWANTED,
+ * APP_RETURN_WANTED_AS_IS
* obj = mCaptivePortalLoggedInResponseToken as String
*/
- public static final int CMD_CAPTIVE_PORTAL_APP_FINISHED = BASE + 9;
+ private static final int CMD_CAPTIVE_PORTAL_APP_FINISHED = BASE + 9;
/**
* Request ConnectivityService display provisioning notification.
@@ -234,7 +240,6 @@ public class NetworkMonitor extends StateMachine {
private final State mLingeringState = new LingeringState();
private CustomIntentReceiver mLaunchCaptivePortalAppBroadcastReceiver = null;
- private String mCaptivePortalLoggedInResponseToken = null;
private final LocalLog validationLogs = new LocalLog(20); // 20 lines
@@ -268,8 +273,6 @@ public class NetworkMonitor extends StateMachine {
mIsCaptivePortalCheckEnabled = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 1) == 1;
- mCaptivePortalLoggedInResponseToken = String.valueOf(new Random().nextLong());
-
start();
}
@@ -314,22 +317,18 @@ public class NetworkMonitor extends StateMachine {
transitionTo(mEvaluatingState);
return HANDLED;
case CMD_CAPTIVE_PORTAL_APP_FINISHED:
- if (!mCaptivePortalLoggedInResponseToken.equals((String)message.obj))
- return HANDLED;
log("CaptivePortal App responded with " + message.arg1);
- // Previous token was sent out, come up with a new one.
- mCaptivePortalLoggedInResponseToken = String.valueOf(new Random().nextLong());
switch (message.arg1) {
- case ConnectivityManager.CAPTIVE_PORTAL_APP_RETURN_DISMISSED:
+ case APP_RETURN_DISMISSED:
sendMessage(CMD_FORCE_REEVALUATION, 0 /* no UID */, 0);
break;
- case ConnectivityManager.CAPTIVE_PORTAL_APP_RETURN_WANTED_AS_IS:
+ case APP_RETURN_WANTED_AS_IS:
mDontDisplaySigninNotification = true;
// TODO: Distinguish this from a network that actually validates.
// Displaying the "!" on the system UI icon may still be a good idea.
transitionTo(mValidatedState);
break;
- case ConnectivityManager.CAPTIVE_PORTAL_APP_RETURN_UNWANTED:
+ case APP_RETURN_UNWANTED:
mDontDisplaySigninNotification = true;
mUserDoesNotWant = true;
mConnectivityServiceHandler.sendMessage(obtainMessage(
@@ -380,8 +379,18 @@ public class NetworkMonitor extends StateMachine {
final Intent intent = new Intent(
ConnectivityManager.ACTION_CAPTIVE_PORTAL_SIGN_IN);
intent.putExtra(ConnectivityManager.EXTRA_NETWORK, mNetworkAgentInfo.network);
- intent.putExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_TOKEN,
- mCaptivePortalLoggedInResponseToken);
+ intent.putExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL,
+ new CaptivePortal(new ICaptivePortal.Stub() {
+ @Override
+ public void appResponse(int response) {
+ if (response == APP_RETURN_WANTED_AS_IS) {
+ mContext.enforceCallingPermission(
+ android.Manifest.permission.CONNECTIVITY_INTERNAL,
+ "CaptivePortal");
+ }
+ sendMessage(CMD_CAPTIVE_PORTAL_APP_FINISHED, response);
+ }
+ }));
intent.setFlags(
Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivityAsUser(intent, UserHandle.CURRENT);
@@ -576,9 +585,12 @@ public class NetworkMonitor extends StateMachine {
switch (message.what) {
case CMD_NETWORK_CONNECTED:
log("Unlingered");
- // Go straight to active as we've already evaluated.
- transitionTo(mValidatedState);
- return HANDLED;
+ // If already validated, go straight to validated state.
+ if (mNetworkAgentInfo.lastValidated) {
+ transitionTo(mValidatedState);
+ return HANDLED;
+ }
+ return NOT_HANDLED;
case CMD_LINGER_EXPIRED:
if (message.arg1 != mLingerToken)
return HANDLED;
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
index 493471bb152a..3c35f5e0ef5d 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
@@ -33,6 +33,7 @@ import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
import java.io.UnsupportedEncodingException;
import java.util.List;
+import java.util.Locale;
/**
* Represent a logical device of type Playback residing in Android system.
@@ -317,6 +318,13 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {
try {
String iso3Language = new String(message.getParams(), 0, 3, "US-ASCII");
+ Locale currentLocale = mService.getContext().getResources().getConfiguration().locale;
+ if (currentLocale.getISO3Language().equals(iso3Language)) {
+ // Do not switch language if the new language is the same as the current one.
+ // This helps avoid accidental country variant switching from en_US to en_AU
+ // due to the limitation of CEC. See the warning below.
+ return true;
+ }
// Don't use Locale.getAvailableLocales() since it returns a locale
// which is not available on Settings.
diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
index 8e3334ff8f2f..7a7472919b10 100644
--- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
@@ -262,7 +262,6 @@ final class DefaultPermissionGrantPolicy {
&& doesPackageSupportRuntimePermissions(setupPackage)) {
grantRuntimePermissionsLPw(setupPackage, PHONE_PERMISSIONS, userId);
grantRuntimePermissionsLPw(setupPackage, CONTACTS_PERMISSIONS, userId);
- grantRuntimePermissionsLPw(setupPackage, SETTINGS_PERMISSIONS, userId);
}
// Camera
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 3c117aa2a61c..13aca79c2f58 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -477,6 +477,13 @@ public class PackageManagerService extends IPackageManager.Stub {
final ArrayMap<String, ArrayMap<String, PackageParser.Package>> mOverlays =
new ArrayMap<String, ArrayMap<String, PackageParser.Package>>();
+ /**
+ * Tracks new system packages [receiving in an OTA] that we expect to
+ * find updated user-installed versions. Keys are package name, values
+ * are package location.
+ */
+ final private ArrayMap<String, File> mExpectingBetter = new ArrayMap<>();
+
final Settings mSettings;
boolean mRestoredSettings;
@@ -2053,7 +2060,6 @@ public class PackageManagerService extends IPackageManager.Stub {
// Prune any system packages that no longer exist.
final List<String> possiblyDeletedUpdatedSystemApps = new ArrayList<String>();
- final ArrayMap<String, File> expectingBetter = new ArrayMap<>();
if (!mOnlyCore) {
Iterator<PackageSetting> psit = mSettings.mPackages.values().iterator();
while (psit.hasNext()) {
@@ -2086,7 +2092,7 @@ public class PackageManagerService extends IPackageManager.Stub {
+ ", versionCode=" + ps.versionCode + "; scanned versionCode="
+ scannedPkg.mVersionCode);
removePackageLI(ps, true);
- expectingBetter.put(ps.name, ps.codePath);
+ mExpectingBetter.put(ps.name, ps.codePath);
}
continue;
@@ -2160,10 +2166,10 @@ public class PackageManagerService extends IPackageManager.Stub {
* the userdata partition actually showed up. If they never
* appeared, crawl back and revive the system version.
*/
- for (int i = 0; i < expectingBetter.size(); i++) {
- final String packageName = expectingBetter.keyAt(i);
+ for (int i = 0; i < mExpectingBetter.size(); i++) {
+ final String packageName = mExpectingBetter.keyAt(i);
if (!mPackages.containsKey(packageName)) {
- final File scanFile = expectingBetter.valueAt(i);
+ final File scanFile = mExpectingBetter.valueAt(i);
logCriticalInfo(Log.WARN, "Expected better " + packageName
+ " but never showed up; reverting to system");
@@ -2198,6 +2204,7 @@ public class PackageManagerService extends IPackageManager.Stub {
}
}
}
+ mExpectingBetter.clear();
// Now that we know all of the shared libraries, update all clients to have
// the correct library paths.
@@ -3147,6 +3154,28 @@ public class PackageManagerService extends IPackageManager.Stub {
return PackageManager.PERMISSION_DENIED;
}
+ @Override
+ public boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId) {
+ if (UserHandle.getCallingUserId() != userId) {
+ mContext.enforceCallingPermission(
+ android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
+ "isPermissionRevokedByPolicy for user " + userId);
+ }
+
+ if (checkPermission(permission, packageName, userId)
+ == PackageManager.PERMISSION_GRANTED) {
+ return false;
+ }
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ final int flags = getPermissionFlags(permission, packageName, userId);
+ return (flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
/**
* Checks if the request is from the system or an app that has INTERACT_ACROSS_USERS
* or INTERACT_ACROSS_USERS_FULL permissions, if the userid is not for the caller.
@@ -3429,12 +3458,17 @@ public class PackageManagerService extends IPackageManager.Stub {
mSettings.writeRuntimePermissionsForUserLPr(userId, false);
}
+ // Only need to do this if user is initialized. Otherwise it's a new user
+ // and there are no processes running as the user yet and there's no need
+ // to make an expensive call to remount processes for the changed permissions.
if (READ_EXTERNAL_STORAGE.equals(name)
|| WRITE_EXTERNAL_STORAGE.equals(name)) {
final long token = Binder.clearCallingIdentity();
try {
- final StorageManager storage = mContext.getSystemService(StorageManager.class);
- storage.remountUid(uid);
+ if (sUserManager.isInitialized(userId)) {
+ final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ storage.remountUid(uid);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -4398,8 +4432,11 @@ public class PackageManagerService extends IPackageManager.Stub {
// cross-profile app linking works only towards the parent.
final UserInfo parent = getProfileParent(sourceUserId);
synchronized(mPackages) {
- return getCrossProfileDomainPreferredLpr(intent, resolvedType, 0, sourceUserId,
- parent.id) != null;
+ CrossProfileDomainInfo xpDomainInfo = getCrossProfileDomainPreferredLpr(
+ intent, resolvedType, 0, sourceUserId, parent.id);
+ return xpDomainInfo != null
+ && xpDomainInfo.bestDomainVerificationStatus !=
+ INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
}
}
return false;
@@ -4495,7 +4532,7 @@ public class PackageManagerService extends IPackageManager.Stub {
return result;
}
result = filterCandidatesWithDomainPreferredActivitiesLPr(flags, result,
- xpDomainInfo);
+ xpDomainInfo, userId);
Collections.sort(result, mResolvePrioritySorter);
}
return result;
@@ -4612,13 +4649,13 @@ public class PackageManagerService extends IPackageManager.Stub {
}
private List<ResolveInfo> filterCandidatesWithDomainPreferredActivitiesLPr(
- int flags, List<ResolveInfo> candidates, CrossProfileDomainInfo xpDomainInfo) {
+ int flags, List<ResolveInfo> candidates, CrossProfileDomainInfo xpDomainInfo,
+ int userId) {
if (DEBUG_PREFERRED || DEBUG_DOMAIN_VERIFICATION) {
- Slog.v("TAG", "Filtering results with preferred activities. Candidates count: " +
+ Slog.v(TAG, "Filtering results with preferred activities. Candidates count: " +
candidates.size());
}
- final int userId = UserHandle.getCallingUserId();
ArrayList<ResolveInfo> result = new ArrayList<ResolveInfo>();
ArrayList<ResolveInfo> alwaysList = new ArrayList<ResolveInfo>();
ArrayList<ResolveInfo> undefinedList = new ArrayList<ResolveInfo>();
@@ -5633,7 +5670,7 @@ public class PackageManagerService extends IPackageManager.Stub {
if (pkg.mVersionCode <= ps.versionCode) {
// The system package has been updated and the code path does not match
// Ignore entry. Skip it.
- Slog.i(TAG, "Package " + ps.name + " at " + scanFile
+ if (DEBUG_INSTALL) Slog.i(TAG, "Package " + ps.name + " at " + scanFile
+ " ignored: updated version " + ps.versionCode
+ " better than this " + pkg.mVersionCode);
if (!updatedPkg.codePath.equals(scanFile)) {
@@ -5646,7 +5683,10 @@ public class PackageManagerService extends IPackageManager.Stub {
updatedPkg.resourcePathString = scanFile.toString();
}
updatedPkg.pkg = pkg;
- throw new PackageManagerException(INSTALL_FAILED_DUPLICATE_PACKAGE, null);
+ throw new PackageManagerException(INSTALL_FAILED_DUPLICATE_PACKAGE,
+ "Package " + ps.name + " at " + scanFile
+ + " ignored: updated version " + ps.versionCode
+ + " better than this " + pkg.mVersionCode);
} else {
// The current app on the system partition is better than
// what we have updated to on the data partition; switch
@@ -6429,20 +6469,29 @@ public class PackageManagerService extends IPackageManager.Stub {
// scanned APK is both already known and at the path previously established
// for it. Previously unknown packages we pick up normally, but if we have an
// a priori expectation about this package's install presence, enforce it.
+ // With a singular exception for new system packages. When an OTA contains
+ // a new system package, we allow the codepath to change from a system location
+ // to the user-installed location. If we don't allow this change, any newer,
+ // user-installed version of the application will be ignored.
if ((scanFlags & SCAN_REQUIRE_KNOWN) != 0) {
- PackageSetting known = mSettings.peekPackageLPr(pkg.packageName);
- if (known != null) {
- if (DEBUG_PACKAGE_SCANNING) {
- Log.d(TAG, "Examining " + pkg.codePath
- + " and requiring known paths " + known.codePathString
- + " & " + known.resourcePathString);
- }
- if (!pkg.applicationInfo.getCodePath().equals(known.codePathString)
- || !pkg.applicationInfo.getResourcePath().equals(known.resourcePathString)) {
- throw new PackageManagerException(INSTALL_FAILED_PACKAGE_CHANGED,
- "Application package " + pkg.packageName
- + " found at " + pkg.applicationInfo.getCodePath()
- + " but expected at " + known.codePathString + "; ignoring.");
+ if (mExpectingBetter.containsKey(pkg.packageName)) {
+ logCriticalInfo(Log.WARN,
+ "Relax SCAN_REQUIRE_KNOWN requirement for package " + pkg.packageName);
+ } else {
+ PackageSetting known = mSettings.peekPackageLPr(pkg.packageName);
+ if (known != null) {
+ if (DEBUG_PACKAGE_SCANNING) {
+ Log.d(TAG, "Examining " + pkg.codePath
+ + " and requiring known paths " + known.codePathString
+ + " & " + known.resourcePathString);
+ }
+ if (!pkg.applicationInfo.getCodePath().equals(known.codePathString)
+ || !pkg.applicationInfo.getResourcePath().equals(known.resourcePathString)) {
+ throw new PackageManagerException(INSTALL_FAILED_PACKAGE_CHANGED,
+ "Application package " + pkg.packageName
+ + " found at " + pkg.applicationInfo.getCodePath()
+ + " but expected at " + known.codePathString + "; ignoring.");
+ }
}
}
}
@@ -15924,16 +15973,8 @@ public class PackageManagerService extends IPackageManager.Stub {
}
}
- void newUserCreatedLILPw(final int userHandle) {
- // We cannot grant the default permissions with a lock held as
- // we query providers from other components for default handlers
- // such as enabled IMEs, etc.
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mDefaultPermissionPolicy.grantDefaultPermissions(userHandle);
- }
- });
+ void newUserCreated(final int userHandle) {
+ mDefaultPermissionPolicy.grantDefaultPermissions(userHandle);
}
@Override
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 1a79b4eff6ed..23cb76771b58 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -1220,6 +1220,7 @@ public class UserManagerService extends IUserManager.Stub {
final boolean isManagedProfile = (flags & UserInfo.FLAG_MANAGED_PROFILE) != 0;
final long ident = Binder.clearCallingIdentity();
UserInfo userInfo = null;
+ final int userId;
try {
synchronized (mInstallLock) {
synchronized (mPackagesLock) {
@@ -1240,7 +1241,7 @@ public class UserManagerService extends IUserManager.Stub {
if (isGuest && findCurrentGuestUserLocked() != null) {
return null;
}
- int userId = getNextAvailableIdLocked();
+ userId = getNextAvailableIdLocked();
userInfo = new UserInfo(userId, name, null, flags);
userInfo.serialNumber = mNextSerialNumber++;
long now = System.currentTimeMillis();
@@ -1274,9 +1275,9 @@ public class UserManagerService extends IUserManager.Stub {
updateUserIdsLocked();
Bundle restrictions = new Bundle();
mUserRestrictions.append(userId, restrictions);
- mPm.newUserCreatedLILPw(userId);
}
}
+ mPm.newUserCreated(userId);
if (userInfo != null) {
Intent addedIntent = new Intent(Intent.ACTION_USER_ADDED);
addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userInfo.id);
@@ -2015,4 +2016,12 @@ public class UserManagerService extends IUserManager.Stub {
}
}
}
+
+ /**
+ * @param userId
+ * @return whether the user has been initialized yet
+ */
+ boolean isInitialized(int userId) {
+ return (getUserInfo(userId).flags & UserInfo.FLAG_INITIALIZED) != 0;
+ }
}
diff --git a/services/core/java/com/android/server/policy/BarController.java b/services/core/java/com/android/server/policy/BarController.java
index 5877b3eb8598..9095f57b175a 100644
--- a/services/core/java/com/android/server/policy/BarController.java
+++ b/services/core/java/com/android/server/policy/BarController.java
@@ -155,7 +155,7 @@ public class BarController {
}
private int computeStateLw(boolean wasVis, boolean wasAnim, WindowState win, boolean change) {
- if (win.hasDrawnLw()) {
+ if (win.isDrawnLw()) {
final boolean vis = win.isVisibleLw();
final boolean anim = win.isAnimatingLw();
if (mState == StatusBarManager.WINDOW_STATE_HIDING && !change && !vis) {
@@ -198,7 +198,7 @@ public class BarController {
}
public boolean checkHiddenLw() {
- if (mWin != null && mWin.hasDrawnLw()) {
+ if (mWin != null && mWin.isDrawnLw()) {
if (!mWin.isVisibleLw() && !mWin.isAnimatingLw()) {
updateStateLw(StatusBarManager.WINDOW_STATE_HIDDEN);
}
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java
index 11eb57264eaa..76301781f4d6 100644
--- a/services/core/java/com/android/server/wm/WindowAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowAnimator.java
@@ -349,6 +349,7 @@ public class WindowAnimator {
"Now policy hidden: " + win);
} else {
boolean applyExistingExitAnimation = mPostKeyguardExitAnimation != null
+ && !mPostKeyguardExitAnimation.hasEnded()
&& !winAnimator.mKeyguardGoingAwayAnimation
&& win.hasDrawnLw()
&& win.mAttachedWindow == null
@@ -499,8 +500,7 @@ public class WindowAnimator {
mPostKeyguardExitAnimation.getStartOffset(),
mPostKeyguardExitAnimation.getDuration());
mKeyguardGoingAway = false;
- } else if (mCurrentTime - mPostKeyguardExitAnimation.getStartTime()
- > mPostKeyguardExitAnimation.getDuration()) {
+ } else if (mPostKeyguardExitAnimation.hasEnded()) {
// Done with the animation, reset.
if (DEBUG_KEYGUARD) Slog.v(TAG, "Done with Keyguard exit animations.");
mPostKeyguardExitAnimation = null;
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index ac4fea8e42e0..ec566bc882ac 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -10978,6 +10978,13 @@ public class WindowManagerService extends IWindowManager.Stub
if (mLastDispatchedSystemUiVisibility == visibility) {
return;
}
+ final int globalDiff = (visibility ^ mLastDispatchedSystemUiVisibility)
+ // We are only interested in differences of one of the
+ // clearable flags...
+ & View.SYSTEM_UI_CLEARABLE_FLAGS
+ // ...if it has actually been cleared.
+ & ~visibility;
+
mLastDispatchedSystemUiVisibility = visibility;
mInputManager.setSystemUiVisibility(visibility);
final WindowList windows = getDefaultWindowListLocked();
@@ -10986,12 +10993,7 @@ public class WindowManagerService extends IWindowManager.Stub
WindowState ws = windows.get(i);
try {
int curValue = ws.mSystemUiVisibility;
- int diff = curValue ^ visibility;
- // We are only interested in differences of one of the
- // clearable flags...
- diff &= View.SYSTEM_UI_CLEARABLE_FLAGS;
- // ...if it has actually been cleared.
- diff &= ~visibility;
+ int diff = (curValue ^ visibility) & globalDiff;
int newValue = (curValue&~diff) | (visibility&diff);
if (newValue != curValue) {
ws.mSeq++;
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index b918a25f98de..c2548de64ec2 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1104,6 +1104,7 @@ final class WindowState implements WindowManagerPolicy.WindowState {
* Returns true if the window has a surface that it has drawn a
* complete UI in to.
*/
+ @Override
public boolean isDrawnLw() {
return mHasSurface && !mDestroying &&
(mWinAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW
diff --git a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java
index fb8a5bb82ba3..cb9c6a7673b9 100644
--- a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java
@@ -20,8 +20,24 @@ import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.ConnectivityManager.getNetworkTypeName;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_CBS;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_EIMS;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_FOTA;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_IA;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_IMS;
import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_MMS;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_RCS;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_SUPL;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_WIFI_P2P;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_XCAP;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static org.mockito.Matchers.anyInt;
@@ -135,6 +151,7 @@ public class ConnectivityServiceTest extends AndroidTestCase {
private final NetworkInfo mNetworkInfo;
private final NetworkCapabilities mNetworkCapabilities;
private final Thread mThread;
+ private final ConditionVariable mDisconnected = new ConditionVariable();
private int mScore;
private NetworkAgent mNetworkAgent;
@@ -161,7 +178,7 @@ public class ConnectivityServiceTest extends AndroidTestCase {
mNetworkAgent = new NetworkAgent(Looper.myLooper(), mServiceContext,
"Mock" + typeName, mNetworkInfo, mNetworkCapabilities,
new LinkProperties(), mScore, new NetworkMisc()) {
- public void unwanted() {}
+ public void unwanted() { mDisconnected.open(); }
};
initComplete.open();
Looper.loop();
@@ -176,8 +193,18 @@ public class ConnectivityServiceTest extends AndroidTestCase {
mNetworkAgent.sendNetworkScore(mScore);
}
+ public void addCapability(int capability) {
+ mNetworkCapabilities.addCapability(capability);
+ mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities);
+ }
+
+ public void connectWithoutInternet() {
+ mNetworkInfo.setDetailedState(DetailedState.CONNECTED, null, null);
+ mNetworkAgent.sendNetworkInfo(mNetworkInfo);
+ }
+
/**
- * Transition this NetworkAgent to CONNECTED state.
+ * Transition this NetworkAgent to CONNECTED state with NET_CAPABILITY_INTERNET.
* @param validated Indicate if network should pretend to be validated.
*/
public void connect(boolean validated) {
@@ -210,8 +237,7 @@ public class ConnectivityServiceTest extends AndroidTestCase {
mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities);
}
- mNetworkInfo.setDetailedState(DetailedState.CONNECTED, null, null);
- mNetworkAgent.sendNetworkInfo(mNetworkInfo);
+ connectWithoutInternet();
if (validated) {
// Wait for network to validate.
@@ -231,6 +257,10 @@ public class ConnectivityServiceTest extends AndroidTestCase {
public Network getNetwork() {
return new Network(mNetworkAgent.netId);
}
+
+ public ConditionVariable getDisconnectedCV() {
+ return mDisconnected;
+ }
}
private static class MockNetworkFactory extends NetworkFactory {
@@ -555,6 +585,34 @@ public class ConnectivityServiceTest extends AndroidTestCase {
}
@LargeTest
+ public void testUnlingeringDoesNotValidate() throws Exception {
+ // Test bringing up unvalidated cellular.
+ mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
+ ConditionVariable cv = waitForConnectivityBroadcasts(1);
+ mCellNetworkAgent.connect(false);
+ waitFor(cv);
+ verifyActiveNetwork(TRANSPORT_CELLULAR);
+ assertFalse(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability(
+ NET_CAPABILITY_VALIDATED));
+ // Test bringing up validated WiFi.
+ mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
+ cv = waitForConnectivityBroadcasts(2);
+ mWiFiNetworkAgent.connect(true);
+ waitFor(cv);
+ verifyActiveNetwork(TRANSPORT_WIFI);
+ assertFalse(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability(
+ NET_CAPABILITY_VALIDATED));
+ // Test WiFi disconnect.
+ cv = waitForConnectivityBroadcasts(2);
+ mWiFiNetworkAgent.disconnect();
+ waitFor(cv);
+ verifyActiveNetwork(TRANSPORT_CELLULAR);
+ // Unlingering a network should not cause it to be marked as validated.
+ assertFalse(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability(
+ NET_CAPABILITY_VALIDATED));
+ }
+
+ @LargeTest
public void testCellularOutscoresWeakWifi() throws Exception {
// Test bringing up validated cellular.
mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
@@ -582,6 +640,107 @@ public class ConnectivityServiceTest extends AndroidTestCase {
mWiFiNetworkAgent.disconnect();
}
+ @LargeTest
+ public void testReapingNetwork() throws Exception {
+ // Test bringing up WiFi without NET_CAPABILITY_INTERNET.
+ // Expect it to be torn down immediately because it satisfies no requests.
+ mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
+ ConditionVariable cv = mWiFiNetworkAgent.getDisconnectedCV();
+ mWiFiNetworkAgent.connectWithoutInternet();
+ waitFor(cv);
+ // Test bringing up cellular without NET_CAPABILITY_INTERNET.
+ // Expect it to be torn down immediately because it satisfies no requests.
+ mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
+ cv = mCellNetworkAgent.getDisconnectedCV();
+ mCellNetworkAgent.connectWithoutInternet();
+ waitFor(cv);
+ // Test bringing up validated WiFi.
+ mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
+ cv = waitForConnectivityBroadcasts(1);
+ mWiFiNetworkAgent.connect(true);
+ waitFor(cv);
+ verifyActiveNetwork(TRANSPORT_WIFI);
+ // Test bringing up unvalidated cellular.
+ // Expect it to be torn down because it could never be the highest scoring network
+ // satisfying the default request even if it validated.
+ mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
+ cv = mCellNetworkAgent.getDisconnectedCV();
+ mCellNetworkAgent.connect(false);
+ waitFor(cv);
+ verifyActiveNetwork(TRANSPORT_WIFI);
+ cv = mWiFiNetworkAgent.getDisconnectedCV();
+ mWiFiNetworkAgent.disconnect();
+ waitFor(cv);
+ }
+
+ @LargeTest
+ public void testCellularFallback() throws Exception {
+ // Test bringing up validated cellular.
+ mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
+ ConditionVariable cv = waitForConnectivityBroadcasts(1);
+ mCellNetworkAgent.connect(true);
+ waitFor(cv);
+ verifyActiveNetwork(TRANSPORT_CELLULAR);
+ // Test bringing up validated WiFi.
+ mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
+ cv = waitForConnectivityBroadcasts(2);
+ mWiFiNetworkAgent.connect(true);
+ waitFor(cv);
+ verifyActiveNetwork(TRANSPORT_WIFI);
+ // Reevaluate WiFi (it'll instantly fail DNS).
+ cv = waitForConnectivityBroadcasts(2);
+ assertTrue(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability(
+ NET_CAPABILITY_VALIDATED));
+ mCm.reportBadNetwork(mWiFiNetworkAgent.getNetwork());
+ // Should quickly fall back to Cellular.
+ waitFor(cv);
+ assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability(
+ NET_CAPABILITY_VALIDATED));
+ verifyActiveNetwork(TRANSPORT_CELLULAR);
+ // Reevaluate cellular (it'll instantly fail DNS).
+ cv = waitForConnectivityBroadcasts(2);
+ assertTrue(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability(
+ NET_CAPABILITY_VALIDATED));
+ mCm.reportBadNetwork(mCellNetworkAgent.getNetwork());
+ // Should quickly fall back to WiFi.
+ waitFor(cv);
+ assertFalse(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability(
+ NET_CAPABILITY_VALIDATED));
+ assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability(
+ NET_CAPABILITY_VALIDATED));
+ verifyActiveNetwork(TRANSPORT_WIFI);
+ mCellNetworkAgent.disconnect();
+ mWiFiNetworkAgent.disconnect();
+ }
+
+ @LargeTest
+ public void testWiFiFallback() throws Exception {
+ // Test bringing up unvalidated WiFi.
+ mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
+ ConditionVariable cv = waitForConnectivityBroadcasts(1);
+ mWiFiNetworkAgent.connect(false);
+ waitFor(cv);
+ verifyActiveNetwork(TRANSPORT_WIFI);
+ // Test bringing up validated cellular.
+ mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
+ cv = waitForConnectivityBroadcasts(2);
+ mCellNetworkAgent.connect(true);
+ waitFor(cv);
+ verifyActiveNetwork(TRANSPORT_CELLULAR);
+ // Reevaluate cellular (it'll instantly fail DNS).
+ cv = waitForConnectivityBroadcasts(2);
+ assertTrue(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability(
+ NET_CAPABILITY_VALIDATED));
+ mCm.reportBadNetwork(mCellNetworkAgent.getNetwork());
+ // Should quickly fall back to WiFi.
+ waitFor(cv);
+ assertFalse(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability(
+ NET_CAPABILITY_VALIDATED));
+ verifyActiveNetwork(TRANSPORT_WIFI);
+ mCellNetworkAgent.disconnect();
+ mWiFiNetworkAgent.disconnect();
+ }
+
enum CallbackState {
NONE,
AVAILABLE,
@@ -736,10 +895,9 @@ public class ConnectivityServiceTest extends AndroidTestCase {
assertEquals(CallbackState.NONE, wifiNetworkCallback.getLastCallback());
}
- @LargeTest
- public void testNetworkFactoryRequests() throws Exception {
+ private void tryNetworkFactoryRequests(int capability) throws Exception {
NetworkCapabilities filter = new NetworkCapabilities();
- filter.addCapability(NET_CAPABILITY_INTERNET);
+ filter.addCapability(capability);
final HandlerThread handlerThread = new HandlerThread("testNetworkFactoryRequests");
handlerThread.start();
final MockNetworkFactory testFactory = new MockNetworkFactory(handlerThread.getLooper(),
@@ -747,57 +905,91 @@ public class ConnectivityServiceTest extends AndroidTestCase {
testFactory.setScoreFilter(40);
ConditionVariable cv = testFactory.getNetworkStartedCV();
testFactory.register();
+ int expectedRequestCount = 1;
+ NetworkCallback networkCallback = null;
+ // For non-INTERNET capabilities we cannot rely on the default request being present, so
+ // add one.
+ if (capability != NET_CAPABILITY_INTERNET) {
+ testFactory.waitForNetworkRequests(1);
+ assertFalse(testFactory.getMyStartRequested());
+ NetworkRequest request = new NetworkRequest.Builder().addCapability(capability).build();
+ networkCallback = new NetworkCallback();
+ mCm.requestNetwork(request, networkCallback);
+ expectedRequestCount++;
+ }
waitFor(cv);
- assertEquals(1, testFactory.getMyRequestCount());
- assertEquals(true, testFactory.getMyStartRequested());
+ assertEquals(expectedRequestCount, testFactory.getMyRequestCount());
+ assertTrue(testFactory.getMyStartRequested());
- // now bring in a higher scored network
+ // Now bring in a higher scored network.
MockNetworkAgent testAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
- cv = waitForConnectivityBroadcasts(1);
- ConditionVariable cvRelease = testFactory.getNetworkStoppedCV();
- testAgent.connect(true);
+ // Rather than create a validated network which complicates things by registering it's
+ // own NetworkRequest during startup, just bump up the score to cancel out the
+ // unvalidated penalty.
+ testAgent.adjustScore(40);
+ cv = testFactory.getNetworkStoppedCV();
+ testAgent.connect(false);
+ testAgent.addCapability(capability);
waitFor(cv);
- // part of the bringup makes another network request and then releases it
- // wait for the release
- waitFor(cvRelease);
- assertEquals(false, testFactory.getMyStartRequested());
- testFactory.waitForNetworkRequests(1);
+ assertEquals(expectedRequestCount, testFactory.getMyRequestCount());
+ assertFalse(testFactory.getMyStartRequested());
- // bring in a bunch of requests..
+ // Bring in a bunch of requests.
ConnectivityManager.NetworkCallback[] networkCallbacks =
new ConnectivityManager.NetworkCallback[10];
for (int i = 0; i< networkCallbacks.length; i++) {
networkCallbacks[i] = new ConnectivityManager.NetworkCallback();
NetworkRequest.Builder builder = new NetworkRequest.Builder();
- builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ builder.addCapability(capability);
mCm.requestNetwork(builder.build(), networkCallbacks[i]);
}
- testFactory.waitForNetworkRequests(11);
- assertEquals(false, testFactory.getMyStartRequested());
+ testFactory.waitForNetworkRequests(10 + expectedRequestCount);
+ assertFalse(testFactory.getMyStartRequested());
- // remove the requests
+ // Remove the requests.
for (int i = 0; i < networkCallbacks.length; i++) {
mCm.unregisterNetworkCallback(networkCallbacks[i]);
}
- testFactory.waitForNetworkRequests(1);
- assertEquals(false, testFactory.getMyStartRequested());
+ testFactory.waitForNetworkRequests(expectedRequestCount);
+ assertFalse(testFactory.getMyStartRequested());
- // drop the higher scored network
- cv = waitForConnectivityBroadcasts(1);
+ // Drop the higher scored network.
+ cv = testFactory.getNetworkStartedCV();
testAgent.disconnect();
waitFor(cv);
- assertEquals(1, testFactory.getMyRequestCount());
- assertEquals(true, testFactory.getMyStartRequested());
+ assertEquals(expectedRequestCount, testFactory.getMyRequestCount());
+ assertTrue(testFactory.getMyStartRequested());
testFactory.unregister();
+ if (networkCallback != null) mCm.unregisterNetworkCallback(networkCallback);
handlerThread.quit();
}
@LargeTest
+ public void testNetworkFactoryRequests() throws Exception {
+ tryNetworkFactoryRequests(NET_CAPABILITY_MMS);
+ tryNetworkFactoryRequests(NET_CAPABILITY_SUPL);
+ tryNetworkFactoryRequests(NET_CAPABILITY_DUN);
+ tryNetworkFactoryRequests(NET_CAPABILITY_FOTA);
+ tryNetworkFactoryRequests(NET_CAPABILITY_IMS);
+ tryNetworkFactoryRequests(NET_CAPABILITY_CBS);
+ tryNetworkFactoryRequests(NET_CAPABILITY_WIFI_P2P);
+ tryNetworkFactoryRequests(NET_CAPABILITY_IA);
+ tryNetworkFactoryRequests(NET_CAPABILITY_RCS);
+ tryNetworkFactoryRequests(NET_CAPABILITY_XCAP);
+ tryNetworkFactoryRequests(NET_CAPABILITY_EIMS);
+ tryNetworkFactoryRequests(NET_CAPABILITY_NOT_METERED);
+ tryNetworkFactoryRequests(NET_CAPABILITY_INTERNET);
+ tryNetworkFactoryRequests(NET_CAPABILITY_TRUSTED);
+ tryNetworkFactoryRequests(NET_CAPABILITY_NOT_VPN);
+ // Skipping VALIDATED and CAPTIVE_PORTAL as they're disallowed.
+ }
+
+ @LargeTest
public void testNoMutableNetworkRequests() throws Exception {
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent("a"), 0);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
- builder.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+ builder.addCapability(NET_CAPABILITY_VALIDATED);
try {
mCm.requestNetwork(builder.build(), new NetworkCallback());
fail();
@@ -807,7 +999,7 @@ public class ConnectivityServiceTest extends AndroidTestCase {
fail();
} catch (IllegalArgumentException expected) {}
builder = new NetworkRequest.Builder();
- builder.addCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
+ builder.addCapability(NET_CAPABILITY_CAPTIVE_PORTAL);
try {
mCm.requestNetwork(builder.build(), new NetworkCallback());
fail();
@@ -818,6 +1010,71 @@ public class ConnectivityServiceTest extends AndroidTestCase {
} catch (IllegalArgumentException expected) {}
}
+ @LargeTest
+ public void testMMSonWiFi() throws Exception {
+ // Test bringing up cellular without MMS NetworkRequest gets reaped
+ mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
+ mCellNetworkAgent.addCapability(NET_CAPABILITY_MMS);
+ ConditionVariable cv = mCellNetworkAgent.getDisconnectedCV();
+ mCellNetworkAgent.connectWithoutInternet();
+ waitFor(cv);
+ waitFor(new Criteria() {
+ public boolean get() { return mCm.getAllNetworks().length == 0; } });
+ verifyNoNetwork();
+ // Test bringing up validated WiFi.
+ mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
+ cv = waitForConnectivityBroadcasts(1);
+ mWiFiNetworkAgent.connect(true);
+ waitFor(cv);
+ verifyActiveNetwork(TRANSPORT_WIFI);
+ // Register MMS NetworkRequest
+ NetworkRequest.Builder builder = new NetworkRequest.Builder();
+ builder.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS);
+ final TestNetworkCallback networkCallback = new TestNetworkCallback();
+ mCm.requestNetwork(builder.build(), networkCallback);
+ // Test bringing up unvalidated cellular with MMS
+ mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
+ mCellNetworkAgent.addCapability(NET_CAPABILITY_MMS);
+ cv = networkCallback.getConditionVariable();
+ mCellNetworkAgent.connectWithoutInternet();
+ waitFor(cv);
+ assertEquals(CallbackState.AVAILABLE, networkCallback.getLastCallback());
+ verifyActiveNetwork(TRANSPORT_WIFI);
+ // Test releasing NetworkRequest disconnects cellular with MMS
+ cv = mCellNetworkAgent.getDisconnectedCV();
+ mCm.unregisterNetworkCallback(networkCallback);
+ waitFor(cv);
+ verifyActiveNetwork(TRANSPORT_WIFI);
+ }
+
+ @LargeTest
+ public void testMMSonCell() throws Exception {
+ // Test bringing up cellular without MMS
+ mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
+ ConditionVariable cv = waitForConnectivityBroadcasts(1);
+ mCellNetworkAgent.connect(false);
+ waitFor(cv);
+ verifyActiveNetwork(TRANSPORT_CELLULAR);
+ // Register MMS NetworkRequest
+ NetworkRequest.Builder builder = new NetworkRequest.Builder();
+ builder.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS);
+ final TestNetworkCallback networkCallback = new TestNetworkCallback();
+ mCm.requestNetwork(builder.build(), networkCallback);
+ // Test bringing up MMS cellular network
+ cv = networkCallback.getConditionVariable();
+ MockNetworkAgent mmsNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
+ mmsNetworkAgent.addCapability(NET_CAPABILITY_MMS);
+ mmsNetworkAgent.connectWithoutInternet();
+ waitFor(cv);
+ assertEquals(CallbackState.AVAILABLE, networkCallback.getLastCallback());
+ verifyActiveNetwork(TRANSPORT_CELLULAR);
+ // Test releasing MMS NetworkRequest does not disconnect main cellular NetworkAgent
+ cv = mmsNetworkAgent.getDisconnectedCV();
+ mCm.unregisterNetworkCallback(networkCallback);
+ waitFor(cv);
+ verifyActiveNetwork(TRANSPORT_CELLULAR);
+ }
+
// @Override
// public void tearDown() throws Exception {
// super.tearDown();
diff --git a/telecomm/java/android/telecom/ConnectionServiceAdapter.java b/telecomm/java/android/telecom/ConnectionServiceAdapter.java
index 4ab9ee5c2351..456251476862 100644
--- a/telecomm/java/android/telecom/ConnectionServiceAdapter.java
+++ b/telecomm/java/android/telecom/ConnectionServiceAdapter.java
@@ -48,6 +48,12 @@ final class ConnectionServiceAdapter implements DeathRecipient {
}
void addAdapter(IConnectionServiceAdapter adapter) {
+ for (IConnectionServiceAdapter it : mAdapters) {
+ if (it.asBinder() == adapter.asBinder()) {
+ Log.w(this, "Ignoring duplicate adapter addition.");
+ return;
+ }
+ }
if (mAdapters.add(adapter)) {
try {
adapter.asBinder().linkToDeath(this, 0);
@@ -58,8 +64,13 @@ final class ConnectionServiceAdapter implements DeathRecipient {
}
void removeAdapter(IConnectionServiceAdapter adapter) {
- if (adapter != null && mAdapters.remove(adapter)) {
- adapter.asBinder().unlinkToDeath(this, 0);
+ if (adapter != null) {
+ for (IConnectionServiceAdapter it : mAdapters) {
+ if (it.asBinder() == adapter.asBinder() && mAdapters.remove(it)) {
+ adapter.asBinder().unlinkToDeath(this, 0);
+ break;
+ }
+ }
}
}
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index e74344cce660..89e9d2e1eb12 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -1339,7 +1339,21 @@ public class TelephonyManager {
* @return the NETWORK_TYPE_xxxx for current data connection.
*/
public int getNetworkType() {
- return getDataNetworkType();
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ return telephony.getNetworkType();
+ } else {
+ // This can happen when the ITelephony interface is not up yet.
+ return NETWORK_TYPE_UNKNOWN;
+ }
+ } catch(RemoteException ex) {
+ // This shouldn't happen in the normal case
+ return NETWORK_TYPE_UNKNOWN;
+ } catch (NullPointerException ex) {
+ // This could happen before phone restarts due to crashing
+ return NETWORK_TYPE_UNKNOWN;
+ }
}
/**
@@ -1365,6 +1379,10 @@ public class TelephonyManager {
* @see #NETWORK_TYPE_LTE
* @see #NETWORK_TYPE_EHRPD
* @see #NETWORK_TYPE_HSPAP
+ *
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
/** {@hide} */
public int getNetworkType(int subId) {
@@ -1407,6 +1425,9 @@ public class TelephonyManager {
* @see #NETWORK_TYPE_EHRPD
* @see #NETWORK_TYPE_HSPAP
*
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
public int getDataNetworkType() {
@@ -1419,6 +1440,10 @@ public class TelephonyManager {
* @return the network type
*
* @param subId for which network type is returned
+ *
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
/** {@hide} */
public int getDataNetworkType(int subId) {
@@ -1442,6 +1467,9 @@ public class TelephonyManager {
/**
* Returns the NETWORK_TYPE_xxxx for voice
*
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
public int getVoiceNetworkType() {
@@ -1451,13 +1479,16 @@ public class TelephonyManager {
/**
* Returns the NETWORK_TYPE_xxxx for voice for a subId
*
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
/** {@hide} */
public int getVoiceNetworkType(int subId) {
try{
ITelephony telephony = getITelephony();
if (telephony != null) {
- return telephony.getVoiceNetworkTypeForSubscriber(subId);
+ return telephony.getVoiceNetworkTypeForSubscriber(subId, getOpPackageName());
} else {
// This can happen when the ITelephony interface is not up yet.
return NETWORK_TYPE_UNKNOWN;
@@ -1897,6 +1928,10 @@ public class TelephonyManager {
* @return {@link PhoneConstants#LTE_ON_CDMA_UNKNOWN}, {@link PhoneConstants#LTE_ON_CDMA_FALSE}
* or {@link PhoneConstants#LTE_ON_CDMA_TRUE}
*
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
+ *
* @hide
*/
public int getLteOnCdmaMode() {
@@ -1912,6 +1947,9 @@ public class TelephonyManager {
* @return {@link PhoneConstants#LTE_ON_CDMA_UNKNOWN}, {@link PhoneConstants#LTE_ON_CDMA_FALSE}
* or {@link PhoneConstants#LTE_ON_CDMA_TRUE}
*
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
/** {@hide} */
public int getLteOnCdmaMode(int subId) {
@@ -2642,6 +2680,9 @@ public class TelephonyManager {
/**
* Returns the CDMA ERI icon index to display
*
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
public int getCdmaEriIconIndex() {
@@ -2650,6 +2691,9 @@ public class TelephonyManager {
/**
* Returns the CDMA ERI icon index to display for a subscription
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
/** {@hide} */
public int getCdmaEriIconIndex(int subId) {
@@ -2671,6 +2715,9 @@ public class TelephonyManager {
* 0 - ON
* 1 - FLASHING
*
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
public int getCdmaEriIconMode() {
@@ -2681,6 +2728,10 @@ public class TelephonyManager {
* Returns the CDMA ERI icon mode for a subscription.
* 0 - ON
* 1 - FLASHING
+ *
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
/** {@hide} */
public int getCdmaEriIconMode(int subId) {
@@ -2700,6 +2751,9 @@ public class TelephonyManager {
/**
* Returns the CDMA ERI text,
*
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
public String getCdmaEriText() {
@@ -2709,6 +2763,9 @@ public class TelephonyManager {
/**
* Returns the CDMA ERI text, of a subscription
*
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
/** {@hide} */
public String getCdmaEriText(int subId) {
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 6db88a76672f..a93e465d992c 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -455,9 +455,9 @@ interface ITelephony {
/**
* Returns the network type for data transmission
- * @param callingPackage package making the call.
+ * Legacy call, permission-free
*/
- int getNetworkType(String callingPackage);
+ int getNetworkType();
/**
* Returns the network type of a subId.
@@ -480,16 +480,12 @@ interface ITelephony {
int getDataNetworkTypeForSubscriber(int subId, String callingPackage);
/**
- * Returns the network type for voice
- */
- int getVoiceNetworkType();
-
- /**
* Returns the voice network type of a subId
* @param subId user preferred subId.
+ * @param callingPackage package making the call.
* Returns the network type
*/
- int getVoiceNetworkTypeForSubscriber(int subId);
+ int getVoiceNetworkTypeForSubscriber(int subId, String callingPackage);
/**
* Return true if an ICC card is present
diff --git a/telephony/java/com/android/internal/telephony/PhoneConstants.java b/telephony/java/com/android/internal/telephony/PhoneConstants.java
index 2a4032c61541..572cc6fb4bb9 100644
--- a/telephony/java/com/android/internal/telephony/PhoneConstants.java
+++ b/telephony/java/com/android/internal/telephony/PhoneConstants.java
@@ -133,7 +133,8 @@ public class PhoneConstants {
public static final String APN_TYPE_CBS = "cbs";
/** APN type for IA Initial Attach APN */
public static final String APN_TYPE_IA = "ia";
- /** APN type for IA Emergency PDN */
+ /** APN type for Emergency PDN. This is not an IA apn, but is used
+ * for access to carrier services in an emergency call situation. */
public static final String APN_TYPE_EMERGENCY = "emergency";
public static final int RIL_CARD_MAX_APPS = 8;
diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java
index ac92dc0371c9..3df7bbc91e9b 100644
--- a/test-runner/src/android/test/mock/MockPackageManager.java
+++ b/test-runner/src/android/test/mock/MockPackageManager.java
@@ -177,6 +177,11 @@ public class MockPackageManager extends PackageManager {
}
@Override
+ public boolean isPermissionRevokedByPolicy(String permName, String pkgName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public boolean addPermission(PermissionInfo info) {
throw new UnsupportedOperationException();
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java
index 401f0bba3c46..90ef28cd0fc3 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java
@@ -52,7 +52,6 @@ import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
import android.os.storage.VolumeInfo;
-
import java.util.List;
/**
@@ -168,6 +167,11 @@ public class BridgePackageManager extends PackageManager {
}
@Override
+ public boolean isPermissionRevokedByPolicy(String permName, String pkgName) {
+ return false;
+ }
+
+ @Override
public boolean addPermission(PermissionInfo info) {
return false;
}