summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.mk1
-rw-r--r--apct-tests/perftests/utils/src/android/perftests/utils/PerfStatusReporter.java61
-rw-r--r--api/current.txt6
-rw-r--r--api/system-current.txt6
-rw-r--r--api/test-current.txt6
-rw-r--r--cmds/am/src/com/android/commands/am/Am.java1773
-rw-r--r--cmds/idmap/scan.cpp21
-rw-r--r--cmds/pm/src/com/android/commands/pm/Pm.java22
-rw-r--r--compiled-classes-phone11
-rw-r--r--core/java/android/animation/KeyframeSet.java8
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java15
-rw-r--r--core/java/android/content/pm/ShortcutManager.java2
-rw-r--r--core/java/android/os/IUserManager.aidl2
-rw-r--r--core/java/android/os/PowerManagerInternal.java22
-rw-r--r--core/java/android/os/ShellCommand.java19
-rw-r--r--core/java/android/os/UserManager.java18
-rw-r--r--core/java/android/os/storage/VolumeInfo.java2
-rwxr-xr-xcore/java/android/provider/Settings.java8
-rw-r--r--core/java/android/text/AutoText.java15
-rw-r--r--core/java/android/text/BidiFormatter.java4
-rw-r--r--core/java/android/text/Html.java23
-rw-r--r--core/java/android/text/InputType.java78
-rw-r--r--core/java/android/text/TextLine.java2
-rw-r--r--core/java/android/text/TextUtils.java2
-rwxr-xr-xcore/java/android/text/format/DateFormat.java8
-rw-r--r--core/java/android/text/format/DateUtils.java12
-rw-r--r--core/java/android/text/format/Formatter.java3
-rw-r--r--core/java/android/text/format/Time.java6
-rw-r--r--core/java/android/text/format/TimeFormatter.java5
-rw-r--r--core/java/android/text/method/BaseKeyListener.java15
-rw-r--r--core/java/android/text/method/CharacterPickerDialog.java11
-rw-r--r--core/java/android/text/method/DateKeyListener.java4
-rw-r--r--core/java/android/text/method/DialerKeyListener.java6
-rw-r--r--core/java/android/text/method/DigitsKeyListener.java4
-rw-r--r--core/java/android/text/method/MetaKeyKeyListener.java22
-rw-r--r--core/java/android/text/method/MovementMethod.java4
-rw-r--r--core/java/android/text/method/MultiTapKeyListener.java13
-rw-r--r--core/java/android/text/method/NumberKeyListener.java6
-rw-r--r--core/java/android/text/method/PasswordTransformationMethod.java8
-rw-r--r--core/java/android/text/method/QwertyKeyListener.java21
-rw-r--r--core/java/android/text/method/ScrollingMovementMethod.java5
-rw-r--r--core/java/android/text/method/TextKeyListener.java15
-rw-r--r--core/java/android/text/method/TimeKeyListener.java4
-rw-r--r--core/java/android/text/method/WordIterator.java2
-rw-r--r--core/java/android/text/style/DrawableMarginSpan.java6
-rw-r--r--core/java/android/text/style/IconMarginSpan.java4
-rw-r--r--core/java/android/text/style/LeadingMarginSpan.java14
-rw-r--r--core/java/android/text/style/LineBackgroundSpan.java2
-rw-r--r--core/java/android/text/style/LocaleSpan.java4
-rw-r--r--core/java/android/text/style/QuoteSpan.java10
-rw-r--r--core/java/android/text/style/ReplacementSpan.java2
-rw-r--r--core/java/android/text/style/TtsSpan.java6
-rw-r--r--core/java/android/text/util/Linkify.java17
-rw-r--r--core/java/android/transition/ChangeBounds.java9
-rw-r--r--core/java/android/transition/ChangeScroll.java2
-rw-r--r--core/java/android/transition/ChangeTransform.java1
-rw-r--r--core/java/android/transition/Explode.java4
-rw-r--r--core/java/android/transition/PatternPathMotion.java4
-rw-r--r--core/java/android/transition/Slide.java1
-rw-r--r--core/java/android/transition/TransitionInflater.java10
-rw-r--r--core/java/android/transition/TranslationAnimationCreator.java4
-rw-r--r--core/java/android/util/LocalLog.java44
-rw-r--r--core/java/android/view/Display.java6
-rw-r--r--core/java/android/view/DisplayEventReceiver.java6
-rw-r--r--core/java/android/view/DisplayInfo.java4
-rw-r--r--core/java/android/view/FallbackEventHandler.java1
-rw-r--r--core/java/android/view/FrameMetrics.java1
-rw-r--r--core/java/android/view/FrameMetricsObserver.java3
-rw-r--r--core/java/android/view/HandlerActionQueue.java4
-rw-r--r--core/java/android/view/IAssetAtlas.aidl54
-rw-r--r--core/java/android/view/InputDevice.java2
-rw-r--r--core/java/android/view/InputEventReceiver.java4
-rw-r--r--core/java/android/view/InputEventSender.java4
-rw-r--r--core/java/android/view/InputFilter.java6
-rw-r--r--core/java/android/view/InputQueue.java6
-rw-r--r--core/java/android/view/KeyCharacterMap.java3
-rw-r--r--core/java/android/view/KeyEvent.java1
-rw-r--r--core/java/android/view/KeyboardShortcutGroup.java4
-rw-r--r--core/java/android/view/KeyboardShortcutInfo.java7
-rw-r--r--core/java/android/view/LayoutInflater.java84
-rw-r--r--core/java/android/view/MenuInflater.java66
-rw-r--r--core/java/android/view/PointerIcon.java6
-rw-r--r--core/java/android/view/RemotableViewMethod.java3
-rw-r--r--core/java/android/view/RenderNodeAnimatorSetHelper.java1
-rw-r--r--core/java/android/view/RoundScrollbarRenderer.java2
-rw-r--r--core/java/android/view/ScaleGestureDetector.java1
-rw-r--r--core/java/android/view/SearchEvent.java2
-rw-r--r--core/java/android/view/Surface.java4
-rw-r--r--core/java/android/view/SurfaceControl.java3
-rw-r--r--core/java/android/view/SurfaceView.java8
-rw-r--r--core/java/android/view/ThreadedRenderer.java30
-rw-r--r--core/java/android/view/TouchDelegate.java19
-rw-r--r--core/java/android/view/View.java14
-rw-r--r--core/java/android/view/ViewDebug.java2
-rw-r--r--core/java/android/view/ViewGroup.java4
-rw-r--r--core/java/android/view/ViewPropertyAnimator.java7
-rw-r--r--core/java/android/view/Window.java5
-rw-r--r--core/java/android/view/WindowManagerImpl.java5
-rw-r--r--core/java/android/view/WindowManagerPolicy.java2
-rw-r--r--core/java/android/view/accessibility/AccessibilityManager.java1
-rw-r--r--core/java/android/view/animation/Animation.java53
-rw-r--r--core/java/android/view/animation/AnimationSet.java36
-rw-r--r--core/java/android/view/animation/AnimationUtils.java10
-rw-r--r--core/java/android/view/animation/AnticipateInterpolator.java2
-rw-r--r--core/java/android/view/animation/AnticipateOvershootInterpolator.java8
-rw-r--r--core/java/android/view/animation/CycleInterpolator.java2
-rw-r--r--core/java/android/view/animation/DecelerateInterpolator.java2
-rw-r--r--core/java/android/view/animation/GridLayoutAnimationController.java8
-rw-r--r--core/java/android/view/inputmethod/BaseInputConnection.java51
-rw-r--r--core/java/android/view/inputmethod/InputConnectionInspector.java4
-rw-r--r--core/java/android/view/inputmethod/InputMethodInfo.java6
-rw-r--r--core/java/android/view/inputmethod/InputMethodManager.java172
-rw-r--r--core/java/android/view/textservice/SpellCheckerInfo.java6
-rw-r--r--core/java/android/view/textservice/SpellCheckerSession.java10
-rw-r--r--core/java/android/view/textservice/SpellCheckerSubtype.java4
-rw-r--r--core/java/android/view/textservice/SuggestionsInfo.java4
-rw-r--r--core/java/android/widget/AbsSeekBar.java41
-rw-r--r--core/java/android/widget/AbsSpinner.java64
-rw-r--r--core/java/android/widget/ActionMenuPresenter.java1
-rw-r--r--core/java/android/widget/ActionMenuView.java7
-rw-r--r--core/java/android/widget/ActivityChooserView.java6
-rw-r--r--core/java/android/widget/AnalogClock.java5
-rw-r--r--core/java/android/widget/AppSecurityPermissions.java19
-rw-r--r--core/java/android/widget/AutoCompleteTextView.java106
-rw-r--r--core/java/android/widget/CalendarView.java4
-rw-r--r--core/java/android/widget/CalendarViewLegacyDelegate.java6
-rw-r--r--core/java/android/widget/CheckBox.java13
-rw-r--r--core/java/android/widget/CheckedTextView.java12
-rw-r--r--core/java/android/widget/Chronometer.java17
-rw-r--r--core/java/android/widget/CompoundButton.java12
-rw-r--r--core/java/android/widget/DatePicker.java4
-rwxr-xr-xcore/java/android/widget/DatePickerCalendarDelegate.java4
-rw-r--r--core/java/android/widget/DatePickerSpinnerDelegate.java4
-rw-r--r--core/java/android/widget/DayPickerPagerAdapter.java6
-rw-r--r--core/java/android/widget/DayPickerView.java12
-rw-r--r--core/java/android/widget/DayPickerViewPager.java5
-rw-r--r--core/java/android/widget/DialerFilter.java6
-rw-r--r--core/java/android/widget/DigitalClock.java1
-rw-r--r--core/java/android/widget/DropDownListView.java4
-rw-r--r--core/java/android/widget/EdgeEffect.java7
-rw-r--r--core/java/android/widget/EditText.java1
-rw-r--r--core/java/android/widget/ExpandableListView.java212
-rw-r--r--core/java/android/widget/FrameLayout.java4
-rw-r--r--core/java/android/widget/GridLayout.java21
-rw-r--r--core/java/android/widget/GridView.java154
-rw-r--r--core/java/android/widget/ImageView.java8
-rw-r--r--core/java/android/widget/LinearLayout.java94
-rw-r--r--core/java/android/widget/ListPopupWindow.java112
-rw-r--r--core/java/android/widget/ListView.java34
-rw-r--r--core/java/android/widget/MenuItemHoverListener.java4
-rw-r--r--core/java/android/widget/NumberPicker.java10
-rw-r--r--core/java/android/widget/PopupMenu.java10
-rw-r--r--core/java/android/widget/PopupWindow.java13
-rw-r--r--core/java/android/widget/ProgressBar.java77
-rw-r--r--core/java/android/widget/QuickContactBadge.java4
-rw-r--r--core/java/android/widget/RadialTimePickerView.java8
-rw-r--r--core/java/android/widget/RadioGroup.java10
-rw-r--r--core/java/android/widget/RatingBar.java1
-rw-r--r--core/java/android/widget/RelativeLayout.java22
-rw-r--r--core/java/android/widget/RemoteViews.java3
-rw-r--r--core/java/android/widget/RemoteViewsAdapter.java12
-rw-r--r--core/java/android/widget/RemoteViewsService.java6
-rw-r--r--core/java/android/widget/ResourceCursorAdapter.java4
-rw-r--r--core/java/android/widget/ResourceCursorTreeAdapter.java16
-rw-r--r--core/java/android/widget/ScrollBarDrawable.java4
-rw-r--r--core/java/android/widget/ScrollView.java14
-rw-r--r--core/java/android/widget/SeekBar.java6
-rw-r--r--core/java/android/widget/SimpleAdapter.java18
-rw-r--r--core/java/android/widget/SimpleExpandableListAdapter.java22
-rw-r--r--core/java/android/widget/SimpleMonthView.java12
-rw-r--r--core/java/android/widget/Spinner.java36
-rw-r--r--core/java/android/widget/StackView.java16
-rw-r--r--core/java/android/widget/SuggestionsAdapter.java6
-rw-r--r--core/java/android/widget/Switch.java4
-rw-r--r--core/java/android/widget/TabHost.java5
-rw-r--r--core/java/android/widget/TabWidget.java8
-rw-r--r--core/java/android/widget/TableLayout.java5
-rw-r--r--core/java/android/widget/TextClock.java10
-rw-r--r--core/java/android/widget/TimePicker.java8
-rw-r--r--core/java/android/widget/TimePickerSpinnerDelegate.java9
-rw-r--r--core/java/android/widget/TwoLineListItem.java25
-rw-r--r--core/java/android/widget/ViewFlipper.java2
-rw-r--r--core/java/android/widget/YearPickerView.java4
-rw-r--r--core/java/android/widget/ZoomButtonsController.java2
-rw-r--r--core/jni/Android.mk8
-rwxr-xr-xcore/jni/android/graphics/Bitmap.cpp480
-rw-r--r--core/jni/android/graphics/Bitmap.h100
-rw-r--r--core/jni/android/graphics/BitmapFactory.cpp42
-rw-r--r--core/jni/android/graphics/BitmapRegionDecoder.cpp12
-rw-r--r--core/jni/android/graphics/Graphics.cpp121
-rw-r--r--core/jni/android/graphics/GraphicsJNI.h59
-rw-r--r--core/jni/android_graphics_Canvas.cpp8
-rw-r--r--core/jni/android_os_Debug.cpp14
-rw-r--r--core/jni/android_view_GraphicBuffer.cpp3
-rw-r--r--core/jni/android_view_Surface.cpp6
-rw-r--r--core/jni/android_view_SurfaceControl.cpp12
-rw-r--r--core/jni/android_view_TextureView.cpp3
-rw-r--r--core/jni/android_view_ThreadedRenderer.cpp16
-rw-r--r--core/res/AndroidManifest.xml2
-rw-r--r--core/res/res/layout-round-watch/alert_dialog_title_material.xml1
-rw-r--r--core/res/res/values-et-rEE/strings.xml2
-rw-r--r--core/res/res/values-eu-rES/strings.xml2
-rw-r--r--core/res/res/values-fr/strings.xml2
-rw-r--r--core/res/res/values-hy-rAM/strings.xml4
-rw-r--r--core/res/res/values-mcc302-mnc220/config.xml8
-rwxr-xr-xcore/res/res/values-mcc311-mnc480/config.xml3
-rw-r--r--core/res/res/values-nl/strings.xml28
-rw-r--r--core/res/res/values/attrs.xml9
-rw-r--r--core/res/res/values/config.xml3
-rw-r--r--core/res/res/values/public.xml1
-rw-r--r--core/res/res/values/symbols.xml1
-rw-r--r--core/tests/coretests/src/android/util/LocalLogTest.java110
-rw-r--r--docs/html/_redirects.yaml2
-rw-r--r--docs/html/design/_book.yaml2
-rw-r--r--docs/html/design/patterns/accessibility.jd98
-rw-r--r--docs/html/distribute/stories/apps.jd3
-rw-r--r--docs/html/distribute/stories/apps/condenast-shopping.jd76
-rw-r--r--docs/html/distribute/stories/apps/drupe-communications.jd98
-rw-r--r--docs/html/distribute/stories/apps/economist-espresso.jd70
-rw-r--r--docs/html/distribute/stories/apps/expressen-sports.jd57
-rw-r--r--docs/html/distribute/stories/apps/lifesum-health.jd60
-rw-r--r--docs/html/distribute/stories/apps/noom-health.jd115
-rw-r--r--docs/html/distribute/stories/games.jd3
-rw-r--r--docs/html/distribute/stories/games/animoca-star-girl.jd89
-rw-r--r--docs/html/distribute/stories/games/happy-labs-experiment.jd105
-rw-r--r--docs/html/distribute/stories/games/playlab-puzzles.jd87
-rw-r--r--docs/html/distribute/stories/index.jd8
-rw-r--r--docs/html/google/play/billing/billing_admin.jd630
-rw-r--r--docs/html/images/cards/distribute/stories/animoca.jpgbin0 -> 119544 bytes
-rw-r--r--docs/html/images/cards/distribute/stories/drupe.jpgbin0 -> 5445 bytes
-rw-r--r--docs/html/images/cards/distribute/stories/economist-espresso.pngbin0 -> 3844 bytes
-rw-r--r--docs/html/images/cards/distribute/stories/expressen-sport.pngbin0 -> 43570 bytes
-rw-r--r--docs/html/images/cards/distribute/stories/glamour.pngbin0 -> 27596 bytes
-rw-r--r--docs/html/images/cards/distribute/stories/happylabs-logo.pngbin0 -> 26083 bytes
-rw-r--r--docs/html/images/cards/distribute/stories/lifesum.pngbin0 -> 10652 bytes
-rw-r--r--docs/html/images/cards/distribute/stories/noom.jpgbin0 -> 7212 bytes
-rw-r--r--docs/html/images/cards/distribute/stories/playlab.jpgbin0 -> 6065 bytes
-rw-r--r--docs/html/images/distribute/stories/animoca-flow.jpgbin0 -> 194187 bytes
-rw-r--r--docs/html/images/distribute/stories/animoca-graph.jpgbin0 -> 24775 bytes
-rw-r--r--docs/html/images/distribute/stories/animoca-logo.pngbin0 -> 10092 bytes
-rw-r--r--docs/html/images/distribute/stories/drupe-icon.pngbin0 -> 10587 bytes
-rw-r--r--docs/html/images/distribute/stories/drupe-screenshot.pngbin0 -> 80525 bytes
-rw-r--r--docs/html/images/distribute/stories/economist-espresso-icon.pngbin0 -> 3844 bytes
-rw-r--r--docs/html/images/distribute/stories/expressen-icon.pngbin0 -> 23676 bytes
-rw-r--r--docs/html/images/distribute/stories/glamour-icon.pngbin0 -> 27596 bytes
-rw-r--r--docs/html/images/distribute/stories/happylabs-happy_pet_icon.pngbin0 -> 229095 bytes
-rw-r--r--docs/html/images/distribute/stories/happylabs-logo.pngbin0 -> 26083 bytes
-rw-r--r--docs/html/images/distribute/stories/happylabs-variant.pngbin0 -> 671310 bytes
-rw-r--r--docs/html/images/distribute/stories/lifesum-icon.pngbin0 -> 10652 bytes
-rw-r--r--docs/html/images/distribute/stories/noom-icon.pngbin0 -> 6530 bytes
-rw-r--r--docs/html/images/distribute/stories/noom-screenshot.pngbin0 -> 287413 bytes
-rw-r--r--docs/html/images/distribute/stories/playlab-icon.pngbin0 -> 4034 bytes
-rw-r--r--docs/html/images/distribute/stories/playlab-screenshot.pngbin0 -> 465397 bytes
-rw-r--r--docs/html/jd_extras_en.js9
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/alldiffs_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.Builder.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.CustomAction.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewPager.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewParentCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.ViewPropertyAnimatorCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatActivity.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatCallback.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatDelegate.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.app.AppCompatDialog.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/android.support.v7.util.SortedList.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/changes-summary.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/classes_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/constructors_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/fields_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_help.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_statistics.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/jdiff_topleftframe.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/methods_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/packages_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.media.session.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.view.accessibility.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v4.view.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v7.app.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.0/changes/pkg_android.support.v7.util.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.CoordinatorLayout.Behavior.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.FloatingActionButton.Behavior.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.FloatingActionButton.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.Snackbar.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.TabLayout.Tab.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.TabLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.app.DetailsFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.app.DetailsSupportFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.DetailsOverviewRowPresenter.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ItemBridgeAdapter.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ListRowPresenter.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.OnChildSelectedListener.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.Presenter.ViewHolder.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.Presenter.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.PresenterSelector.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.RowPresenter.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ShadowOverlayContainer.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.VerticalGridPresenter.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompat.Action.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompatBase.Action.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompatBase.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.attr.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.dimen.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.drawable.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.id.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.integer.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.layout.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.string.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.style.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.styleable.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.util.SortedList.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/changes-summary.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_help.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_statistics.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_topleftframe.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.design.widget.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v17.leanback.app.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v17.leanback.widget.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v4.app.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.app.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.appcompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.util.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsCallback.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsIntent.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsService.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsSession.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsSessionToken.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.Behavior.SavedState.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.Behavior.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.LayoutParams.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.CollapsingToolbarLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.CoordinatorLayout.SavedState.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.FloatingActionButton.Behavior.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.FloatingActionButton.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.NavigationView.SavedState.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.Snackbar.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.TextInputLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.percent.PercentLayoutHelper.PercentLayoutInfo.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v14.preference.EditTextPreferenceDialogFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.BrowseFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.DetailsFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.DetailsSupportFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.GuidedStepFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.PlaybackOverlayFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.PlaybackOverlaySupportFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.SearchFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.SearchSupportFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.VerticalGridFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.VerticalGridSupportFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.FragmentAnimationProvider.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidanceStylist.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedAction.Builder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedAction.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ImageCardView.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ListRowPresenter.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.RowPresenter.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.SearchBar.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ShadowOverlayContainer.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.VerticalGridPresenter.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.app.FragmentActivity.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.content.res.ResourcesCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.media.session.MediaSessionCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.view.ViewCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.NestedScrollView.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.ScrollerCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.TextViewCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.attr.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.bool.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.dimen.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.drawable.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.id.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.layout.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.string.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.style.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.styleable.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.graphics.Palette.Builder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.graphics.drawable.DrawerArrowDrawable.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouteDescriptor.Builder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouteDescriptor.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouter.RouteInfo.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.preference.EditTextPreferenceDialogFragmentCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/changes-summary.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_help.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_statistics.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_topleftframe.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.customtabs.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.design.widget.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.percent.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v14.preference.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v17.leanback.app.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v17.leanback.widget.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.app.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.content.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.content.res.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.media.session.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.view.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.widget.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.appcompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.graphics.drawable.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.graphics.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.media.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.preference.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsIntent.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsSession.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.CollapsingToolbarLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.CoordinatorLayout.Behavior.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.FloatingActionButton.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.HeaderScrollingViewBehavior.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.TabLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.TextInputLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.ViewOffsetBehavior.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.percent.PercentLayoutHelper.PercentLayoutInfo.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v14.preference.PreferenceFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BaseRowFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BaseRowSupportFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BrowseFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.DetailsFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.DetailsSupportFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.GuidedStepFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.GuidedStepSupportFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.RowsFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.RowsSupportFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidanceStylist.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedAction.Builder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedAction.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.ImageCardView.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.ListRowPresenter.ViewHolder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.AppOpsManagerCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.BundleCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.Fragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.FragmentActivity.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.FragmentHostCallback.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.NavUtils.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.NotificationManagerCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.RemoteInput.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.ServiceCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.ShareCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.TaskStackBuilder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ContentResolverCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ContextCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.IntentCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.LocalBroadcastManager.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ParallelExecutorCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.SharedPreferencesCompat.EditorCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.SharedPreferencesCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.pm.ActivityInfoCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.res.ResourcesCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.database.DatabaseUtilsCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.BitmapCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.ColorUtils.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.drawable.DrawableCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.hardware.fingerprint.FingerprintManagerCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.net.ConnectivityManagerCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.net.TrafficStatsCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.AsyncTaskCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.EnvironmentCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.ParcelableCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.TraceCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.ICUCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.TextDirectionHeuristicsCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.TextUtilsCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.GestureDetectorCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.GravityCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.InputDeviceCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.KeyEventCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.LayoutInflaterCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MarginLayoutParamsCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MenuCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MenuItemCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MotionEventCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ScaleGestureDetectorCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.VelocityTrackerCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewConfigurationCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewGroupCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewParentCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewPropertyAnimatorCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.WindowCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.animation.PathInterpolatorCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.DrawerLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.EdgeEffectCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.ListPopupWindowCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.PopupMenuCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.PopupWindowCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.ScrollerCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.SearchViewCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.TextViewCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.app.AppCompatDelegate.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.attr.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.drawable.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.style.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.styleable.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.graphics.Palette.Builder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.graphics.Palette.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouteDescriptor.Builder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouteDescriptor.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouter.Callback.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceFragmentCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceScreen.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceViewHolder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.recyclerview.R.dimen.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.OrientationHelper.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.ItemAnimator.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.LayoutManager.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.State.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.helper.ItemTouchHelper.Callback.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/changes-summary.html2
-rw-r--r--docs/html/sdk/support_api_diff/23.2.0/changes/classes_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/alldiffs_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/alldiffs_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/alldiffs_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/alldiffs_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.AppBarLayout.Behavior.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.AppBarLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.CollapsingToolbarLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.NavigationView.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.Snackbar.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TabLayout.Tab.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TabLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TextInputLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v13.app.FragmentCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.animation.AnimatorCompatHelper.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.ActivityCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.Fragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.FragmentActivity.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.AsyncTaskLoader.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.ContextCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.Loader.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.graphics.drawable.DrawableCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.graphics.drawable.RoundedBitmapDrawable.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.MediaDescriptionCompat.Builder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.MediaDescriptionCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.MediaControllerCompat.TransportControls.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.MediaSessionCompat.Callback.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.PlaybackStateCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.text.ICUCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.ViewCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.DrawerLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.ExploreByTouchHelper.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.PopupWindowCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.SwipeRefreshLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v7.app.AppCompatDelegate.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.attr.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.color.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.dimen.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.drawable.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.id.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.layout.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.style.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.styleable.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/android.support.v7.graphics.Palette.Builder.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/changes-summary.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/classes_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/classes_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/classes_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/classes_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/constructors_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/constructors_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/constructors_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/constructors_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/fields_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/fields_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/fields_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/fields_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/jdiff_help.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/jdiff_statistics.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/jdiff_topleftframe.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/methods_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/methods_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/methods_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/methods_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/packages_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/packages_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/packages_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/packages_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.design.widget.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v13.app.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v17.leanback.widget.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.animation.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.app.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.content.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.graphics.drawable.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.media.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.media.session.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.os.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.text.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.view.accessibility.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.view.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.widget.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.app.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.appcompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.graphics.html2
-rw-r--r--docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.util.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsIntent.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsSession.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.BottomSheetBehavior.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CollapsingToolbarLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.Behavior.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.LayoutParams.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.FloatingActionButton.Behavior.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.TabLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.TextInputLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v14.preference.PreferenceFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.AbstractMediaItemPresenter.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.ObjectAdapter.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.preference.LeanbackSettingsFragment.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ActivityCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ActivityOptionsCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.FragmentController.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ServiceCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.SharedElementCallback.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.content.ContextCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.graphics.drawable.DrawableCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaBrowserCompat.MediaItem.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaBrowserServiceCompat.BrowserRoot.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaDescriptionCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaMetadataCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaButtonReceiver.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaSessionCompat.QueueItem.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaSessionCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.os.BuildCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.KeyEventCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.MotionEventCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.ViewCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.ViewConfigurationCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.WindowInsetsCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeProviderCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityWindowInfoCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SwipeRefreshLayout.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.TextViewCompat.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.app.ActionBarDrawerToggle.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.app.AppCompatDelegate.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.content.res.AppCompatResources.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.graphics.Palette.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.util.SortedList.Callback.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.LinearLayoutManager.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.LinearSmoothScroller.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.RecyclerView.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.StaggeredGridLayoutManager.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/changes-summary.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_help.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_statistics.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_topleftframe.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_additions.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_all.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_changes.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_removals.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.customtabs.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.design.widget.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v14.preference.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v17.leanback.widget.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v17.preference.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.accessibilityservice.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.app.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.content.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.graphics.drawable.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.media.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.media.session.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.os.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.util.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.view.accessibility.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.view.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.widget.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.app.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.content.res.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.graphics.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.preference.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.util.html2
-rw-r--r--docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.widget.html2
-rw-r--r--docs/html/training/wearables/data-layer/messages.jd15
-rw-r--r--graphics/java/android/graphics/Atlas.java416
-rw-r--r--graphics/java/android/graphics/drawable/BitmapDrawable.java9
-rw-r--r--graphics/java/android/graphics/drawable/Drawable.java14
-rw-r--r--graphics/java/android/graphics/drawable/DrawableContainer.java16
-rw-r--r--graphics/java/android/graphics/drawable/DrawableWrapper.java11
-rw-r--r--graphics/java/android/graphics/drawable/LayerDrawable.java18
-rw-r--r--graphics/java/android/graphics/drawable/NinePatchDrawable.java10
-rw-r--r--libs/androidfw/AssetManager.cpp13
-rw-r--r--libs/hwui/Android.mk14
-rw-r--r--libs/hwui/AssetAtlas.cpp130
-rw-r--r--libs/hwui/AssetAtlas.h174
-rw-r--r--libs/hwui/BakedOpDispatcher.cpp52
-rw-r--r--libs/hwui/BakedOpRenderer.cpp6
-rw-r--r--libs/hwui/Caches.cpp2
-rw-r--r--libs/hwui/Caches.h15
-rw-r--r--libs/hwui/Dither.cpp98
-rw-r--r--libs/hwui/Dither.h56
-rw-r--r--libs/hwui/Extensions.cpp9
-rw-r--r--libs/hwui/Extensions.h4
-rw-r--r--libs/hwui/FloatColor.h9
-rw-r--r--libs/hwui/FontRenderer.cpp13
-rw-r--r--libs/hwui/FrameBuilder.cpp2
-rw-r--r--libs/hwui/GammaFontRenderer.cpp3
-rw-r--r--libs/hwui/GammaFontRenderer.h13
-rw-r--r--libs/hwui/GlopBuilder.cpp41
-rw-r--r--libs/hwui/GlopBuilder.h2
-rw-r--r--libs/hwui/GradientCache.cpp72
-rw-r--r--libs/hwui/GradientCache.h23
-rw-r--r--libs/hwui/Layer.h2
-rw-r--r--libs/hwui/PatchCache.cpp6
-rw-r--r--libs/hwui/PatchCache.h4
-rw-r--r--libs/hwui/Program.h7
-rw-r--r--libs/hwui/ProgramCache.cpp172
-rw-r--r--libs/hwui/ProgramCache.h1
-rw-r--r--libs/hwui/Properties.h4
-rw-r--r--libs/hwui/PropertyValuesHolder.cpp23
-rw-r--r--libs/hwui/Readback.cpp2
-rw-r--r--libs/hwui/RecordedOp.h1
-rw-r--r--libs/hwui/SkiaShader.cpp23
-rw-r--r--libs/hwui/SkiaShader.h5
-rw-r--r--libs/hwui/Texture.cpp83
-rw-r--r--libs/hwui/Texture.h15
-rw-r--r--libs/hwui/TextureCache.cpp25
-rw-r--r--libs/hwui/TextureCache.h30
-rw-r--r--libs/hwui/VectorDrawable.cpp16
-rw-r--r--libs/hwui/Vertex.h17
-rw-r--r--libs/hwui/font/CacheTexture.cpp7
-rw-r--r--libs/hwui/hwui/PixelRef.cpp171
-rw-r--r--libs/hwui/hwui/PixelRef.h97
-rw-r--r--libs/hwui/renderstate/OffscreenBufferPool.cpp3
-rw-r--r--libs/hwui/renderstate/RenderState.cpp12
-rw-r--r--libs/hwui/renderstate/RenderState.h3
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp5
-rw-r--r--libs/hwui/renderthread/CanvasContext.h3
-rw-r--r--libs/hwui/renderthread/EglManager.cpp42
-rw-r--r--libs/hwui/renderthread/EglManager.h7
-rw-r--r--libs/hwui/renderthread/RenderProxy.cpp17
-rw-r--r--libs/hwui/renderthread/RenderProxy.h1
-rw-r--r--libs/hwui/tests/common/TestUtils.h3
-rw-r--r--libs/hwui/tests/scripts/prep_ryu.sh31
-rw-r--r--libs/hwui/tests/unit/SkiaBehaviorTests.cpp7
-rw-r--r--libs/hwui/tests/unit/VectorDrawableTests.cpp44
-rw-r--r--libs/hwui/utils/Color.h24
-rw-r--r--libs/hwui/utils/TestWindowContext.cpp3
-rw-r--r--media/java/android/media/Ringtone.java8
-rw-r--r--packages/MtpDocumentsProvider/perf_tests/src/com/android/mtp/AppFusePerfTest.java (renamed from packages/MtpDocumentsProvider/perf_tests/src/com/android/mtp/AppFuseTest.java)4
-rw-r--r--packages/SettingsLib/res/values/strings.xml5
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/drawer/CategoryManager.java6
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java1
-rw-r--r--packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java9
-rw-r--r--packages/Shell/tests/src/com/android/shell/UiBot.java2
-rw-r--r--packages/SystemUI/AndroidManifest.xml9
-rw-r--r--packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSContainer.java3
-rw-r--r--packages/SystemUI/res/values-hy-rAM/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml2
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml2
-rw-r--r--packages/SystemUI/res/values/strings.xml4
-rw-r--r--packages/SystemUI/src/com/android/systemui/BootReceiver.java46
-rw-r--r--packages/SystemUI/src/com/android/systemui/LoadAverageService.java315
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java1
-rw-r--r--preloaded-classes3
-rw-r--r--proto/src/metrics_constants.proto3
-rw-r--r--services/backup/java/com/android/server/backup/BackupManagerService.java12
-rw-r--r--services/core/Android.mk3
-rw-r--r--services/core/java/com/android/server/AssetAtlasService.java717
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerShellCommand.java2278
-rw-r--r--services/core/java/com/android/server/am/ActivityStarter.java5
-rw-r--r--services/core/java/com/android/server/connectivity/NetdEventListenerService.java4
-rw-r--r--services/core/java/com/android/server/content/SyncManager.java54
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java2
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java15
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java2
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java22
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java18
-rw-r--r--services/core/java/com/android/server/policy/BurnInProtectionHelper.java11
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java21
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java12
-rw-r--r--services/core/java/com/android/server/wallpaper/WallpaperManagerService.java26
-rw-r--r--services/core/java/com/android/server/wm/AppWindowToken.java16
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java65
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java235
-rw-r--r--services/core/java/com/android/server/wm/TaskStack.java18
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java16
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java340
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java192
-rw-r--r--services/core/java/com/android/server/wm/WindowStateAnimator.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowSurfacePlacer.java3
-rw-r--r--services/core/java/com/android/server/wm/WindowToken.java35
-rw-r--r--services/core/jni/Android.mk8
-rw-r--r--services/core/jni/com_android_server_AssetAtlasService.cpp216
-rw-r--r--services/core/jni/com_android_server_VibratorService.cpp42
-rw-r--r--services/core/jni/com_android_server_am_BatteryStatsService.cpp141
-rw-r--r--services/core/jni/com_android_server_power_PowerManagerService.cpp46
-rw-r--r--services/core/jni/onload.cpp2
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java47
-rw-r--r--services/java/com/android/server/SystemServer.java20
-rw-r--r--services/net/java/android/net/apf/ApfFilter.java32
-rw-r--r--services/print/java/com/android/server/print/PrintManagerService.java24
-rw-r--r--services/tests/servicestests/src/android/net/apf/ApfTest.java42
-rw-r--r--services/tests/servicestests/src/com/android/server/connectivity/NetdEventListenerServiceTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java55
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java42
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java5
-rw-r--r--services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java156
-rw-r--r--services/usb/java/com/android/server/usb/UsbService.java9
-rw-r--r--services/usb/java/com/android/server/usb/UsbSettingsManager.java21
-rw-r--r--telephony/java/android/telephony/CarrierConfigManager.java9
-rw-r--r--telephony/java/com/android/internal/telephony/RILConstants.java1
-rw-r--r--tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java5
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java8
943 files changed, 7873 insertions, 8133 deletions
diff --git a/Android.mk b/Android.mk
index e352bc70d085..1f3210f7af6c 100644
--- a/Android.mk
+++ b/Android.mk
@@ -288,7 +288,6 @@ LOCAL_SRC_FILES += \
core/java/android/view/accessibility/IAccessibilityManagerClient.aidl \
core/java/android/view/IApplicationToken.aidl \
core/java/android/view/IAppTransitionAnimationSpecsFuture.aidl \
- core/java/android/view/IAssetAtlas.aidl \
core/java/android/view/IDockedStackListener.aidl \
core/java/android/view/IGraphicsStats.aidl \
core/java/android/view/IInputFilter.aidl \
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/PerfStatusReporter.java b/apct-tests/perftests/utils/src/android/perftests/utils/PerfStatusReporter.java
index 3933b57753dc..64b0bf589a1b 100644
--- a/apct-tests/perftests/utils/src/android/perftests/utils/PerfStatusReporter.java
+++ b/apct-tests/perftests/utils/src/android/perftests/utils/PerfStatusReporter.java
@@ -18,8 +18,9 @@ package android.perftests.utils;
import android.support.test.InstrumentationRegistry;
-import org.junit.rules.TestWatcher;
+import org.junit.rules.TestRule;
import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
@@ -47,7 +48,7 @@ import static junit.framework.Assert.assertTrue;
* name when using parameterization.
*/
-public class PerfStatusReporter extends TestWatcher {
+public class PerfStatusReporter implements TestRule {
private final BenchmarkState mState = new BenchmarkState();
public BenchmarkState getBenchmarkState() {
@@ -55,33 +56,39 @@ public class PerfStatusReporter extends TestWatcher {
}
@Override
- protected void succeeded(Description description) {
- String invokeMethodName = description.getMethodName();
- // validate and simplify the function name.
- // First, remove the "test" prefix which normally comes from CTS test.
- // Then make sure the [subTestName] is valid, not just numbers like [0].
- if (invokeMethodName.startsWith("test")) {
- assertTrue("The test name " + invokeMethodName + " is too short",
- invokeMethodName.length() > 5);
- invokeMethodName = invokeMethodName.substring(4, 5).toLowerCase()
- + invokeMethodName.substring(5);
- }
+ public Statement apply(Statement base, Description description) {
+ return new Statement() {
+ @Override
+ public void evaluate() throws Throwable {
+ String invokeMethodName = description.getMethodName();
+ // validate and simplify the function name.
+ // First, remove the "test" prefix which normally comes from CTS test.
+ // Then make sure the [subTestName] is valid, not just numbers like [0].
+ if (invokeMethodName.startsWith("test")) {
+ assertTrue("The test name " + invokeMethodName + " is too short",
+ invokeMethodName.length() > 5);
+ invokeMethodName = invokeMethodName.substring(4, 5).toLowerCase()
+ + invokeMethodName.substring(5);
+ }
- int index = invokeMethodName.lastIndexOf('[');
- if (index > 0) {
- boolean allDigits = true;
- for (int i = index + 1; i < invokeMethodName.length() - 1; i++) {
- if (!Character.isDigit(invokeMethodName.charAt(i))) {
- allDigits = false;
- break;
+ int index = invokeMethodName.lastIndexOf('[');
+ if (index > 0) {
+ boolean allDigits = true;
+ for (int i = index + 1; i < invokeMethodName.length() - 1; i++) {
+ if (!Character.isDigit(invokeMethodName.charAt(i))) {
+ allDigits = false;
+ break;
+ }
+ }
+ assertFalse("The name in [] can't contain only digits for " + invokeMethodName,
+ allDigits);
}
- }
- assertFalse("The name in [] can't contain only digits for " + invokeMethodName,
- allDigits);
- }
- mState.sendFullStatusReport(InstrumentationRegistry.getInstrumentation(),
- invokeMethodName);
- }
+ base.evaluate();
+ mState.sendFullStatusReport(InstrumentationRegistry.getInstrumentation(),
+ invokeMethodName);
+ }
+ };
+ }
}
diff --git a/api/current.txt b/api/current.txt
index 491883bc0951..9f5a8e28aa63 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -855,6 +855,7 @@ package android {
field public static final int mediaRouteTypes = 16843694; // 0x10103ae
field public static final int menuCategory = 16843230; // 0x10101de
field public static final int mimeType = 16842790; // 0x1010026
+ field public static final int min = 16843367; // 0x1010267
field public static final int minDate = 16843583; // 0x101033f
field public static final int minEms = 16843098; // 0x101015a
field public static final int minHeight = 16843072; // 0x1010140
@@ -32576,7 +32577,7 @@ package android.provider {
field public static final java.lang.String RADIO_CELL = "cell";
field public static final java.lang.String RADIO_NFC = "nfc";
field public static final java.lang.String RADIO_WIFI = "wifi";
- field public static final java.lang.String SHOW_PROCESSES = "show_processes";
+ field public static final deprecated java.lang.String SHOW_PROCESSES = "show_processes";
field public static final java.lang.String STAY_ON_WHILE_PLUGGED_IN = "stay_on_while_plugged_in";
field public static final java.lang.String TRANSITION_ANIMATION_SCALE = "transition_animation_scale";
field public static final java.lang.String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
@@ -36898,6 +36899,7 @@ package android.telephony {
field public static final java.lang.String KEY_CARRIER_SETTINGS_ENABLE_BOOL = "carrier_settings_enable_bool";
field public static final java.lang.String KEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY_BOOL = "carrier_use_ims_first_for_emergency_bool";
field public static final java.lang.String KEY_CARRIER_VOLTE_AVAILABLE_BOOL = "carrier_volte_available_bool";
+ field public static final java.lang.String KEY_CARRIER_VOLTE_PROVISIONED_BOOL = "carrier_volte_provisioned_bool";
field public static final java.lang.String KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL = "carrier_volte_provisioning_required_bool";
field public static final java.lang.String KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL = "carrier_volte_tty_supported_bool";
field public static final java.lang.String KEY_CARRIER_VT_AVAILABLE_BOOL = "carrier_vt_available_bool";
@@ -47474,6 +47476,7 @@ package android.widget {
method public android.graphics.PorterDuff.Mode getIndeterminateTintMode();
method public android.view.animation.Interpolator getInterpolator();
method public synchronized int getMax();
+ method public synchronized int getMin();
method public synchronized int getProgress();
method public android.content.res.ColorStateList getProgressBackgroundTintList();
method public android.graphics.PorterDuff.Mode getProgressBackgroundTintMode();
@@ -47496,6 +47499,7 @@ package android.widget {
method public void setInterpolator(android.content.Context, int);
method public void setInterpolator(android.view.animation.Interpolator);
method public synchronized void setMax(int);
+ method public synchronized void setMin(int);
method public synchronized void setProgress(int);
method public void setProgress(int, boolean);
method public void setProgressBackgroundTintList(android.content.res.ColorStateList);
diff --git a/api/system-current.txt b/api/system-current.txt
index 519bfb81fead..4d7c4af950ff 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -962,6 +962,7 @@ package android {
field public static final int mediaRouteTypes = 16843694; // 0x10103ae
field public static final int menuCategory = 16843230; // 0x10101de
field public static final int mimeType = 16842790; // 0x1010026
+ field public static final int min = 16843367; // 0x1010267
field public static final int minDate = 16843583; // 0x101033f
field public static final int minEms = 16843098; // 0x101015a
field public static final int minHeight = 16843072; // 0x1010140
@@ -35333,7 +35334,7 @@ package android.provider {
field public static final java.lang.String RADIO_CELL = "cell";
field public static final java.lang.String RADIO_NFC = "nfc";
field public static final java.lang.String RADIO_WIFI = "wifi";
- field public static final java.lang.String SHOW_PROCESSES = "show_processes";
+ field public static final deprecated java.lang.String SHOW_PROCESSES = "show_processes";
field public static final java.lang.String STAY_ON_WHILE_PLUGGED_IN = "stay_on_while_plugged_in";
field public static final java.lang.String THEATER_MODE_ON = "theater_mode_on";
field public static final java.lang.String TRANSITION_ANIMATION_SCALE = "transition_animation_scale";
@@ -39989,6 +39990,7 @@ package android.telephony {
field public static final java.lang.String KEY_CARRIER_SETTINGS_ENABLE_BOOL = "carrier_settings_enable_bool";
field public static final java.lang.String KEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY_BOOL = "carrier_use_ims_first_for_emergency_bool";
field public static final java.lang.String KEY_CARRIER_VOLTE_AVAILABLE_BOOL = "carrier_volte_available_bool";
+ field public static final java.lang.String KEY_CARRIER_VOLTE_PROVISIONED_BOOL = "carrier_volte_provisioned_bool";
field public static final java.lang.String KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL = "carrier_volte_provisioning_required_bool";
field public static final java.lang.String KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL = "carrier_volte_tty_supported_bool";
field public static final java.lang.String KEY_CARRIER_VT_AVAILABLE_BOOL = "carrier_vt_available_bool";
@@ -51013,6 +51015,7 @@ package android.widget {
method public android.graphics.PorterDuff.Mode getIndeterminateTintMode();
method public android.view.animation.Interpolator getInterpolator();
method public synchronized int getMax();
+ method public synchronized int getMin();
method public synchronized int getProgress();
method public android.content.res.ColorStateList getProgressBackgroundTintList();
method public android.graphics.PorterDuff.Mode getProgressBackgroundTintMode();
@@ -51035,6 +51038,7 @@ package android.widget {
method public void setInterpolator(android.content.Context, int);
method public void setInterpolator(android.view.animation.Interpolator);
method public synchronized void setMax(int);
+ method public synchronized void setMin(int);
method public synchronized void setProgress(int);
method public void setProgress(int, boolean);
method public void setProgressBackgroundTintList(android.content.res.ColorStateList);
diff --git a/api/test-current.txt b/api/test-current.txt
index 841fe431524d..4be2e7f47573 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -855,6 +855,7 @@ package android {
field public static final int mediaRouteTypes = 16843694; // 0x10103ae
field public static final int menuCategory = 16843230; // 0x10101de
field public static final int mimeType = 16842790; // 0x1010026
+ field public static final int min = 16843367; // 0x1010267
field public static final int minDate = 16843583; // 0x101033f
field public static final int minEms = 16843098; // 0x101015a
field public static final int minHeight = 16843072; // 0x1010140
@@ -32654,7 +32655,7 @@ package android.provider {
field public static final java.lang.String RADIO_CELL = "cell";
field public static final java.lang.String RADIO_NFC = "nfc";
field public static final java.lang.String RADIO_WIFI = "wifi";
- field public static final java.lang.String SHOW_PROCESSES = "show_processes";
+ field public static final deprecated java.lang.String SHOW_PROCESSES = "show_processes";
field public static final java.lang.String STAY_ON_WHILE_PLUGGED_IN = "stay_on_while_plugged_in";
field public static final java.lang.String TRANSITION_ANIMATION_SCALE = "transition_animation_scale";
field public static final java.lang.String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
@@ -36979,6 +36980,7 @@ package android.telephony {
field public static final java.lang.String KEY_CARRIER_SETTINGS_ENABLE_BOOL = "carrier_settings_enable_bool";
field public static final java.lang.String KEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY_BOOL = "carrier_use_ims_first_for_emergency_bool";
field public static final java.lang.String KEY_CARRIER_VOLTE_AVAILABLE_BOOL = "carrier_volte_available_bool";
+ field public static final java.lang.String KEY_CARRIER_VOLTE_PROVISIONED_BOOL = "carrier_volte_provisioned_bool";
field public static final java.lang.String KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL = "carrier_volte_provisioning_required_bool";
field public static final java.lang.String KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL = "carrier_volte_tty_supported_bool";
field public static final java.lang.String KEY_CARRIER_VT_AVAILABLE_BOOL = "carrier_vt_available_bool";
@@ -47567,6 +47569,7 @@ package android.widget {
method public android.graphics.PorterDuff.Mode getIndeterminateTintMode();
method public android.view.animation.Interpolator getInterpolator();
method public synchronized int getMax();
+ method public synchronized int getMin();
method public synchronized int getProgress();
method public android.content.res.ColorStateList getProgressBackgroundTintList();
method public android.graphics.PorterDuff.Mode getProgressBackgroundTintMode();
@@ -47589,6 +47592,7 @@ package android.widget {
method public void setInterpolator(android.content.Context, int);
method public void setInterpolator(android.view.animation.Interpolator);
method public synchronized void setMax(int);
+ method public synchronized void setMin(int);
method public synchronized void setProgress(int);
method public void setProgress(int, boolean);
method public void setProgressBackgroundTintList(android.content.res.ColorStateList);
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index 3759de2e7197..1996174afba9 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -385,78 +385,10 @@ public class Am extends BaseCommand {
String op = nextArgRequired();
- if (op.equals("start")) {
- runAmCmd(getRawArgs());
- } else if (op.equals("startservice")) {
- runStartService();
- } else if (op.equals("stopservice")) {
- runStopService();
- } else if (op.equals("force-stop") || op.equals("kill") || op.equals("kill-all")) {
- runAmCmd(getRawArgs());
- } else if (op.equals("instrument")) {
+ if (op.equals("instrument")) {
runInstrument();
- } else if (op.equals("trace-ipc")) {
- runTraceIpc();
- } else if (op.equals("broadcast")) {
- sendBroadcast();
- } else if (op.equals("profile")) {
- runProfile();
- } else if (op.equals("dumpheap")) {
- runDumpHeap();
- } else if (op.equals("set-debug-app")) {
- runSetDebugApp();
- } else if (op.equals("clear-debug-app")) {
- runClearDebugApp();
- } else if (op.equals("set-watch-heap")) {
- runSetWatchHeap();
- } else if (op.equals("clear-watch-heap")) {
- runClearWatchHeap();
- } else if (op.equals("bug-report")) {
- runBugReport();
- } else if (op.equals("monitor")) {
- runMonitor();
- } else if (op.equals("hang")) {
- runHang();
- } else if (op.equals("restart")) {
- runRestart();
- } else if (op.equals("idle-maintenance")) {
- runIdleMaintenance();
- } else if (op.equals("screen-compat")) {
- runScreenCompat();
- } else if (op.equals("package-importance")) {
- runPackageImportance();
- } else if (op.equals("to-uri")) {
- runToUri(0);
- } else if (op.equals("to-intent-uri")) {
- runToUri(Intent.URI_INTENT_SCHEME);
- } else if (op.equals("to-app-uri")) {
- runToUri(Intent.URI_ANDROID_APP_SCHEME);
- } else if (op.equals("switch-user")) {
- runSwitchUser();
- } else if (op.equals("start-user")) {
- runStartUserInBackground();
- } else if (op.equals("unlock-user")) {
- runUnlockUser();
- } else if (op.equals("stop-user")) {
- runStopUser();
- } else if (op.equals("stack")) {
- runStack();
- } else if (op.equals("task")) {
- runTask();
- } else if (op.equals("get-config")) {
- runGetConfig();
- } else if (op.equals("suppress-resize-config-changes")) {
- runSuppressResizeConfigChanges();
- } else if (op.equals("set-inactive")) {
- runSetInactive();
- } else if (op.equals("get-inactive")) {
- runGetInactive();
- } else if (op.equals("send-trim-memory")) {
- runSendTrimMemory();
- } else if (op.equals("get-current-user")) {
- runGetCurrentUser();
} else {
- showError("Error: unknown command '" + op + "'");
+ runAmCmd(getRawArgs());
}
}
@@ -473,7 +405,13 @@ public class Am extends BaseCommand {
}
static final class MyShellCallback extends ShellCallback {
+ boolean mActive = true;
+
@Override public ParcelFileDescriptor onOpenOutputFile(String path, String seLinuxContext) {
+ if (!mActive) {
+ System.err.println("Open attempt after active for: " + path);
+ return null;
+ }
File file = new File(path);
//System.err.println("Opening file: " + file.getAbsolutePath());
//Log.i("Am", "Opening file: " + file.getAbsolutePath());
@@ -506,109 +444,18 @@ public class Am extends BaseCommand {
}
void runAmCmd(String[] args) throws AndroidException {
+ final MyShellCallback cb = new MyShellCallback();
try {
mAm.asBinder().shellCommand(FileDescriptor.in, FileDescriptor.out, FileDescriptor.err,
- args, new MyShellCallback(), new ResultReceiver(null) { });
+ args, cb, new ResultReceiver(null) { });
} catch (RemoteException e) {
System.err.println(NO_SYSTEM_ERROR_CODE);
throw new AndroidException("Can't call activity manager; is the system running?");
+ } finally {
+ cb.mActive = false;
}
}
- private Intent makeIntent(int defUser) throws URISyntaxException {
- mStartFlags = 0;
- mWaitOption = false;
- mStopOption = false;
- mRepeat = 0;
- mProfileFile = null;
- mSamplingInterval = 0;
- mAutoStop = false;
- mUserId = defUser;
- mStackId = INVALID_STACK_ID;
-
- return Intent.parseCommandArgs(mArgs, new Intent.CommandOptionHandler() {
- @Override
- public boolean handleOption(String opt, ShellCommand cmd) {
- if (opt.equals("-D")) {
- mStartFlags |= ActivityManager.START_FLAG_DEBUG;
- } else if (opt.equals("-N")) {
- mStartFlags |= ActivityManager.START_FLAG_NATIVE_DEBUGGING;
- } else if (opt.equals("-W")) {
- mWaitOption = true;
- } else if (opt.equals("-P")) {
- mProfileFile = nextArgRequired();
- mAutoStop = true;
- } else if (opt.equals("--start-profiler")) {
- mProfileFile = nextArgRequired();
- mAutoStop = false;
- } else if (opt.equals("--sampling")) {
- mSamplingInterval = Integer.parseInt(nextArgRequired());
- } else if (opt.equals("-R")) {
- mRepeat = Integer.parseInt(nextArgRequired());
- } else if (opt.equals("-S")) {
- mStopOption = true;
- } else if (opt.equals("--track-allocation")) {
- mStartFlags |= ActivityManager.START_FLAG_TRACK_ALLOCATION;
- } else if (opt.equals("--user")) {
- mUserId = parseUserArg(nextArgRequired());
- } else if (opt.equals("--receiver-permission")) {
- mReceiverPermission = nextArgRequired();
- } else if (opt.equals("--stack")) {
- mStackId = Integer.parseInt(nextArgRequired());
- } else {
- return false;
- }
- return true;
- }
- });
- }
-
- private void runStartService() throws Exception {
- Intent intent = makeIntent(UserHandle.USER_CURRENT);
- if (mUserId == UserHandle.USER_ALL) {
- System.err.println("Error: Can't start activity with user 'all'");
- return;
- }
- System.out.println("Starting service: " + intent);
- ComponentName cn = mAm.startService(null, intent, intent.getType(),
- SHELL_PACKAGE_NAME, mUserId);
- if (cn == null) {
- System.err.println("Error: Not found; no service started.");
- } else if (cn.getPackageName().equals("!")) {
- System.err.println("Error: Requires permission " + cn.getClassName());
- } else if (cn.getPackageName().equals("!!")) {
- System.err.println("Error: " + cn.getClassName());
- }
- }
-
- private void runStopService() throws Exception {
- Intent intent = makeIntent(UserHandle.USER_CURRENT);
- if (mUserId == UserHandle.USER_ALL) {
- System.err.println("Error: Can't stop activity with user 'all'");
- return;
- }
- System.out.println("Stopping service: " + intent);
- int result = mAm.stopService(null, intent, intent.getType(), mUserId);
- if (result == 0) {
- System.err.println("Service not stopped: was not running.");
- } else if (result == 1) {
- System.err.println("Service stopped");
- } else if (result == -1) {
- System.err.println("Error stopping service");
- }
- }
-
- private void sendBroadcast() throws Exception {
- Intent intent = makeIntent(UserHandle.USER_CURRENT);
- IntentReceiver receiver = new IntentReceiver();
- String[] requiredPermissions = mReceiverPermission == null ? null
- : new String[] {mReceiverPermission};
- System.out.println("Broadcasting: " + intent);
- mAm.broadcastIntent(null, intent, null, receiver, 0, null, null, requiredPermissions,
- android.app.AppOpsManager.OP_NONE, null, true, false, mUserId);
- receiver.waitForFinish();
- }
-
private void runInstrument() throws Exception {
String profileFile = null;
boolean wait = false;
@@ -736,773 +583,6 @@ public class Am extends BaseCommand {
}
}
- private void runTraceIpc() throws Exception {
- String op = nextArgRequired();
- if (op.equals("start")) {
- runTraceIpcStart();
- } else if (op.equals("stop")) {
- runTraceIpcStop();
- } else {
- showError("Error: unknown command '" + op + "'");
- return;
- }
- }
-
- private void runTraceIpcStart() throws Exception {
- System.out.println("Starting IPC tracing.");
- mAm.startBinderTracking();
- }
-
- private void runTraceIpcStop() throws Exception {
- String opt;
- String filename = null;
- while ((opt=nextOption()) != null) {
- if (opt.equals("--dump-file")) {
- filename = nextArgRequired();
- } else {
- System.err.println("Error: Unknown option: " + opt);
- return;
- }
- }
- if (filename == null) {
- System.err.println("Error: Specify filename to dump logs to.");
- return;
- }
-
- ParcelFileDescriptor fd = null;
-
- try {
- File file = new File(filename);
- file.delete();
- fd = openForSystemServer(file,
- ParcelFileDescriptor.MODE_CREATE |
- ParcelFileDescriptor.MODE_TRUNCATE |
- ParcelFileDescriptor.MODE_WRITE_ONLY);
- } catch (FileNotFoundException e) {
- System.err.println("Error: Unable to open file: " + filename);
- System.err.println("Consider using a file under /data/local/tmp/");
- return;
- }
-
- ;
- if (!mAm.stopBinderTrackingAndDump(fd)) {
- throw new AndroidException("STOP TRACE FAILED.");
- }
-
- System.out.println("Stopped IPC tracing. Dumping logs to: " + filename);
- }
-
- static void removeWallOption() {
- String props = SystemProperties.get("dalvik.vm.extra-opts");
- if (props != null && props.contains("-Xprofile:wallclock")) {
- props = props.replace("-Xprofile:wallclock", "");
- props = props.trim();
- SystemProperties.set("dalvik.vm.extra-opts", props);
- }
- }
-
- private void runProfile() throws Exception {
- String profileFile = null;
- boolean start = false;
- boolean wall = false;
- int userId = UserHandle.USER_CURRENT;
- int profileType = 0;
- mSamplingInterval = 0;
-
- String process = null;
-
- String cmd = nextArgRequired();
-
- if ("start".equals(cmd)) {
- start = true;
- String opt;
- while ((opt=nextOption()) != null) {
- if (opt.equals("--user")) {
- userId = parseUserArg(nextArgRequired());
- } else if (opt.equals("--wall")) {
- wall = true;
- } else if (opt.equals("--sampling")) {
- mSamplingInterval = Integer.parseInt(nextArgRequired());
- } else {
- System.err.println("Error: Unknown option: " + opt);
- return;
- }
- }
- process = nextArgRequired();
- } else if ("stop".equals(cmd)) {
- String opt;
- while ((opt=nextOption()) != null) {
- if (opt.equals("--user")) {
- userId = parseUserArg(nextArgRequired());
- } else {
- System.err.println("Error: Unknown option: " + opt);
- return;
- }
- }
- process = nextArg();
- } else {
- // Compatibility with old syntax: process is specified first.
- process = cmd;
- cmd = nextArgRequired();
- if ("start".equals(cmd)) {
- start = true;
- } else if (!"stop".equals(cmd)) {
- throw new IllegalArgumentException("Profile command " + process + " not valid");
- }
- }
-
- if (userId == UserHandle.USER_ALL) {
- System.err.println("Error: Can't profile with user 'all'");
- return;
- }
-
- ParcelFileDescriptor fd = null;
- ProfilerInfo profilerInfo = null;
-
- if (start) {
- profileFile = nextArgRequired();
- try {
- fd = openForSystemServer(
- new File(profileFile),
- ParcelFileDescriptor.MODE_CREATE |
- ParcelFileDescriptor.MODE_TRUNCATE |
- ParcelFileDescriptor.MODE_WRITE_ONLY);
- } catch (FileNotFoundException e) {
- System.err.println("Error: Unable to open file: " + profileFile);
- System.err.println("Consider using a file under /data/local/tmp/");
- return;
- }
- profilerInfo = new ProfilerInfo(profileFile, fd, mSamplingInterval, false);
- }
-
- try {
- if (wall) {
- // XXX doesn't work -- this needs to be set before booting.
- String props = SystemProperties.get("dalvik.vm.extra-opts");
- if (props == null || !props.contains("-Xprofile:wallclock")) {
- props = props + " -Xprofile:wallclock";
- //SystemProperties.set("dalvik.vm.extra-opts", props);
- }
- } else if (start) {
- //removeWallOption();
- }
- if (!mAm.profileControl(process, userId, start, profilerInfo, profileType)) {
- wall = false;
- throw new AndroidException("PROFILE FAILED on process " + process);
- }
- } finally {
- if (!wall) {
- //removeWallOption();
- }
- }
- }
-
- private void runDumpHeap() throws Exception {
- boolean managed = true;
- int userId = UserHandle.USER_CURRENT;
-
- String opt;
- while ((opt=nextOption()) != null) {
- if (opt.equals("--user")) {
- userId = parseUserArg(nextArgRequired());
- if (userId == UserHandle.USER_ALL) {
- System.err.println("Error: Can't dump heap with user 'all'");
- return;
- }
- } else if (opt.equals("-n")) {
- managed = false;
- } else {
- System.err.println("Error: Unknown option: " + opt);
- return;
- }
- }
- String process = nextArgRequired();
- String heapFile = nextArgRequired();
- ParcelFileDescriptor fd = null;
-
- try {
- File file = new File(heapFile);
- file.delete();
- fd = openForSystemServer(file,
- ParcelFileDescriptor.MODE_CREATE |
- ParcelFileDescriptor.MODE_TRUNCATE |
- ParcelFileDescriptor.MODE_WRITE_ONLY);
- } catch (FileNotFoundException e) {
- System.err.println("Error: Unable to open file: " + heapFile);
- System.err.println("Consider using a file under /data/local/tmp/");
- return;
- }
-
- if (!mAm.dumpHeap(process, userId, managed, heapFile, fd)) {
- throw new AndroidException("HEAP DUMP FAILED on process " + process);
- }
- }
-
- private void runSetDebugApp() throws Exception {
- boolean wait = false;
- boolean persistent = false;
-
- String opt;
- while ((opt=nextOption()) != null) {
- if (opt.equals("-w")) {
- wait = true;
- } else if (opt.equals("--persistent")) {
- persistent = true;
- } else {
- System.err.println("Error: Unknown option: " + opt);
- return;
- }
- }
-
- String pkg = nextArgRequired();
- mAm.setDebugApp(pkg, wait, persistent);
- }
-
- private void runClearDebugApp() throws Exception {
- mAm.setDebugApp(null, false, true);
- }
-
- private void runSetWatchHeap() throws Exception {
- String proc = nextArgRequired();
- String limit = nextArgRequired();
- mAm.setDumpHeapDebugLimit(proc, 0, Long.parseLong(limit), null);
- }
-
- private void runClearWatchHeap() throws Exception {
- String proc = nextArgRequired();
- mAm.setDumpHeapDebugLimit(proc, 0, -1, null);
- }
-
- private void runBugReport() throws Exception {
- String opt;
- int bugreportType = ActivityManager.BUGREPORT_OPTION_FULL;
- while ((opt=nextOption()) != null) {
- if (opt.equals("--progress")) {
- bugreportType = ActivityManager.BUGREPORT_OPTION_INTERACTIVE;
- } else {
- System.err.println("Error: Unknown option: " + opt);
- return;
- }
- }
- mAm.requestBugReport(bugreportType);
- System.out.println("Your lovely bug report is being created; please be patient.");
- }
-
- private void runSwitchUser() throws Exception {
- String user = nextArgRequired();
- mAm.switchUser(Integer.parseInt(user));
- }
-
- private void runStartUserInBackground() throws Exception {
- String user = nextArgRequired();
- boolean success = mAm.startUserInBackground(Integer.parseInt(user));
- if (success) {
- System.out.println("Success: user started");
- } else {
- System.err.println("Error: could not start user");
- }
- }
-
- private byte[] argToBytes(String arg) {
- if (arg.equals("!")) {
- return null;
- } else {
- return HexDump.hexStringToByteArray(arg);
- }
- }
-
- private void runUnlockUser() throws Exception {
- int userId = Integer.parseInt(nextArgRequired());
- byte[] token = argToBytes(nextArgRequired());
- byte[] secret = argToBytes(nextArgRequired());
- boolean success = mAm.unlockUser(userId, token, secret, null);
- if (success) {
- System.out.println("Success: user unlocked");
- } else {
- System.err.println("Error: could not unlock user");
- }
- }
-
- private static class StopUserCallback extends IStopUserCallback.Stub {
- private boolean mFinished = false;
-
- public synchronized void waitForFinish() {
- try {
- while (!mFinished) wait();
- } catch (InterruptedException e) {
- throw new IllegalStateException(e);
- }
- }
-
- @Override
- public synchronized void userStopped(int userId) {
- mFinished = true;
- notifyAll();
- }
-
- @Override
- public synchronized void userStopAborted(int userId) {
- mFinished = true;
- notifyAll();
- }
- }
-
- private void runStopUser() throws Exception {
- boolean wait = false;
- boolean force = false;
- String opt;
- while ((opt = nextOption()) != null) {
- if ("-w".equals(opt)) {
- wait = true;
- } else if ("-f".equals(opt)) {
- force = true;
- } else {
- System.err.println("Error: unknown option: " + opt);
- return;
- }
- }
- int user = Integer.parseInt(nextArgRequired());
- StopUserCallback callback = wait ? new StopUserCallback() : null;
-
- int res = mAm.stopUser(user, force, callback);
- if (res != ActivityManager.USER_OP_SUCCESS) {
- String txt = "";
- switch (res) {
- case ActivityManager.USER_OP_IS_CURRENT:
- txt = " (Can't stop current user)";
- break;
- case ActivityManager.USER_OP_UNKNOWN_USER:
- txt = " (Unknown user " + user + ")";
- break;
- case ActivityManager.USER_OP_ERROR_IS_SYSTEM:
- txt = " (System user cannot be stopped)";
- break;
- case ActivityManager.USER_OP_ERROR_RELATED_USERS_CANNOT_STOP:
- txt = " (Can't stop user " + user
- + " - one of its related users can't be stopped)";
- break;
- }
- System.err.println("Switch failed: " + res + txt);
- } else if (callback != null) {
- callback.waitForFinish();
- }
- }
-
- class MyActivityController extends IActivityController.Stub {
- final String mGdbPort;
- final boolean mMonkey;
-
- static final int STATE_NORMAL = 0;
- static final int STATE_CRASHED = 1;
- static final int STATE_EARLY_ANR = 2;
- static final int STATE_ANR = 3;
-
- int mState;
-
- static final int RESULT_DEFAULT = 0;
-
- static final int RESULT_CRASH_DIALOG = 0;
- static final int RESULT_CRASH_KILL = 1;
-
- static final int RESULT_EARLY_ANR_CONTINUE = 0;
- static final int RESULT_EARLY_ANR_KILL = 1;
-
- static final int RESULT_ANR_DIALOG = 0;
- static final int RESULT_ANR_KILL = 1;
- static final int RESULT_ANR_WAIT = 1;
-
- int mResult;
-
- Process mGdbProcess;
- Thread mGdbThread;
- boolean mGotGdbPrint;
-
- MyActivityController(String gdbPort, boolean monkey) {
- mGdbPort = gdbPort;
- mMonkey = monkey;
- }
-
- @Override
- public boolean activityResuming(String pkg) {
- synchronized (this) {
- System.out.println("** Activity resuming: " + pkg);
- }
- return true;
- }
-
- @Override
- public boolean activityStarting(Intent intent, String pkg) {
- synchronized (this) {
- System.out.println("** Activity starting: " + pkg);
- }
- return true;
- }
-
- @Override
- public boolean appCrashed(String processName, int pid, String shortMsg, String longMsg,
- long timeMillis, String stackTrace) {
- synchronized (this) {
- System.out.println("** ERROR: PROCESS CRASHED");
- System.out.println("processName: " + processName);
- System.out.println("processPid: " + pid);
- System.out.println("shortMsg: " + shortMsg);
- System.out.println("longMsg: " + longMsg);
- System.out.println("timeMillis: " + timeMillis);
- System.out.println("stack:");
- System.out.print(stackTrace);
- System.out.println("#");
- int result = waitControllerLocked(pid, STATE_CRASHED);
- return result == RESULT_CRASH_KILL ? false : true;
- }
- }
-
- @Override
- public int appEarlyNotResponding(String processName, int pid, String annotation) {
- synchronized (this) {
- System.out.println("** ERROR: EARLY PROCESS NOT RESPONDING");
- System.out.println("processName: " + processName);
- System.out.println("processPid: " + pid);
- System.out.println("annotation: " + annotation);
- int result = waitControllerLocked(pid, STATE_EARLY_ANR);
- if (result == RESULT_EARLY_ANR_KILL) return -1;
- return 0;
- }
- }
-
- @Override
- public int appNotResponding(String processName, int pid, String processStats) {
- synchronized (this) {
- System.out.println("** ERROR: PROCESS NOT RESPONDING");
- System.out.println("processName: " + processName);
- System.out.println("processPid: " + pid);
- System.out.println("processStats:");
- System.out.print(processStats);
- System.out.println("#");
- int result = waitControllerLocked(pid, STATE_ANR);
- if (result == RESULT_ANR_KILL) return -1;
- if (result == RESULT_ANR_WAIT) return 1;
- return 0;
- }
- }
-
- @Override
- public int systemNotResponding(String message) {
- synchronized (this) {
- System.out.println("** ERROR: PROCESS NOT RESPONDING");
- System.out.println("message: " + message);
- System.out.println("#");
- System.out.println("Allowing system to die.");
- return -1;
- }
- }
-
- void killGdbLocked() {
- mGotGdbPrint = false;
- if (mGdbProcess != null) {
- System.out.println("Stopping gdbserver");
- mGdbProcess.destroy();
- mGdbProcess = null;
- }
- if (mGdbThread != null) {
- mGdbThread.interrupt();
- mGdbThread = null;
- }
- }
-
- int waitControllerLocked(int pid, int state) {
- if (mGdbPort != null) {
- killGdbLocked();
-
- try {
- System.out.println("Starting gdbserver on port " + mGdbPort);
- System.out.println("Do the following:");
- System.out.println(" adb forward tcp:" + mGdbPort + " tcp:" + mGdbPort);
- System.out.println(" gdbclient app_process :" + mGdbPort);
-
- mGdbProcess = Runtime.getRuntime().exec(new String[] {
- "gdbserver", ":" + mGdbPort, "--attach", Integer.toString(pid)
- });
- final InputStreamReader converter = new InputStreamReader(
- mGdbProcess.getInputStream());
- mGdbThread = new Thread() {
- @Override
- public void run() {
- BufferedReader in = new BufferedReader(converter);
- String line;
- int count = 0;
- while (true) {
- synchronized (MyActivityController.this) {
- if (mGdbThread == null) {
- return;
- }
- if (count == 2) {
- mGotGdbPrint = true;
- MyActivityController.this.notifyAll();
- }
- }
- try {
- line = in.readLine();
- if (line == null) {
- return;
- }
- System.out.println("GDB: " + line);
- count++;
- } catch (IOException e) {
- return;
- }
- }
- }
- };
- mGdbThread.start();
-
- // Stupid waiting for .5s. Doesn't matter if we end early.
- try {
- this.wait(500);
- } catch (InterruptedException e) {
- }
-
- } catch (IOException e) {
- System.err.println("Failure starting gdbserver: " + e);
- killGdbLocked();
- }
- }
- mState = state;
- System.out.println("");
- printMessageForState();
-
- while (mState != STATE_NORMAL) {
- try {
- wait();
- } catch (InterruptedException e) {
- }
- }
-
- killGdbLocked();
-
- return mResult;
- }
-
- void resumeController(int result) {
- synchronized (this) {
- mState = STATE_NORMAL;
- mResult = result;
- notifyAll();
- }
- }
-
- void printMessageForState() {
- switch (mState) {
- case STATE_NORMAL:
- System.out.println("Monitoring activity manager... available commands:");
- break;
- case STATE_CRASHED:
- System.out.println("Waiting after crash... available commands:");
- System.out.println("(c)ontinue: show crash dialog");
- System.out.println("(k)ill: immediately kill app");
- break;
- case STATE_EARLY_ANR:
- System.out.println("Waiting after early ANR... available commands:");
- System.out.println("(c)ontinue: standard ANR processing");
- System.out.println("(k)ill: immediately kill app");
- break;
- case STATE_ANR:
- System.out.println("Waiting after ANR... available commands:");
- System.out.println("(c)ontinue: show ANR dialog");
- System.out.println("(k)ill: immediately kill app");
- System.out.println("(w)ait: wait some more");
- break;
- }
- System.out.println("(q)uit: finish monitoring");
- }
-
- void run() throws RemoteException {
- try {
- printMessageForState();
-
- mAm.setActivityController(this, mMonkey);
- mState = STATE_NORMAL;
-
- InputStreamReader converter = new InputStreamReader(System.in);
- BufferedReader in = new BufferedReader(converter);
- String line;
-
- while ((line = in.readLine()) != null) {
- boolean addNewline = true;
- if (line.length() <= 0) {
- addNewline = false;
- } else if ("q".equals(line) || "quit".equals(line)) {
- resumeController(RESULT_DEFAULT);
- break;
- } else if (mState == STATE_CRASHED) {
- if ("c".equals(line) || "continue".equals(line)) {
- resumeController(RESULT_CRASH_DIALOG);
- } else if ("k".equals(line) || "kill".equals(line)) {
- resumeController(RESULT_CRASH_KILL);
- } else {
- System.out.println("Invalid command: " + line);
- }
- } else if (mState == STATE_ANR) {
- if ("c".equals(line) || "continue".equals(line)) {
- resumeController(RESULT_ANR_DIALOG);
- } else if ("k".equals(line) || "kill".equals(line)) {
- resumeController(RESULT_ANR_KILL);
- } else if ("w".equals(line) || "wait".equals(line)) {
- resumeController(RESULT_ANR_WAIT);
- } else {
- System.out.println("Invalid command: " + line);
- }
- } else if (mState == STATE_EARLY_ANR) {
- if ("c".equals(line) || "continue".equals(line)) {
- resumeController(RESULT_EARLY_ANR_CONTINUE);
- } else if ("k".equals(line) || "kill".equals(line)) {
- resumeController(RESULT_EARLY_ANR_KILL);
- } else {
- System.out.println("Invalid command: " + line);
- }
- } else {
- System.out.println("Invalid command: " + line);
- }
-
- synchronized (this) {
- if (addNewline) {
- System.out.println("");
- }
- printMessageForState();
- }
- }
-
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- mAm.setActivityController(null, mMonkey);
- }
- }
- }
-
- private void runMonitor() throws Exception {
- String opt;
- String gdbPort = null;
- boolean monkey = false;
- while ((opt=nextOption()) != null) {
- if (opt.equals("--gdb")) {
- gdbPort = nextArgRequired();
- } else if (opt.equals("-m")) {
- monkey = true;
- } else {
- System.err.println("Error: Unknown option: " + opt);
- return;
- }
- }
-
- MyActivityController controller = new MyActivityController(gdbPort, monkey);
- controller.run();
- }
-
- private void runHang() throws Exception {
- String opt;
- boolean allowRestart = false;
- while ((opt=nextOption()) != null) {
- if (opt.equals("--allow-restart")) {
- allowRestart = true;
- } else {
- System.err.println("Error: Unknown option: " + opt);
- return;
- }
- }
-
- System.out.println("Hanging the system...");
- mAm.hang(new Binder(), allowRestart);
- }
-
- private void runRestart() throws Exception {
- String opt;
- while ((opt=nextOption()) != null) {
- System.err.println("Error: Unknown option: " + opt);
- return;
- }
-
- System.out.println("Restart the system...");
- mAm.restart();
- }
-
- private void runIdleMaintenance() throws Exception {
- String opt;
- while ((opt=nextOption()) != null) {
- System.err.println("Error: Unknown option: " + opt);
- return;
- }
-
- System.out.println("Performing idle maintenance...");
- try {
- mAm.sendIdleJobTrigger();
- } catch (RemoteException e) {
- }
- }
-
- private void runScreenCompat() throws Exception {
- String mode = nextArgRequired();
- boolean enabled;
- if ("on".equals(mode)) {
- enabled = true;
- } else if ("off".equals(mode)) {
- enabled = false;
- } else {
- System.err.println("Error: enabled mode must be 'on' or 'off' at " + mode);
- return;
- }
-
- String packageName = nextArgRequired();
- do {
- try {
- mAm.setPackageScreenCompatMode(packageName, enabled
- ? ActivityManager.COMPAT_MODE_ENABLED
- : ActivityManager.COMPAT_MODE_DISABLED);
- } catch (RemoteException e) {
- }
- packageName = nextArg();
- } while (packageName != null);
- }
-
- private void runPackageImportance() throws Exception {
- String packageName = nextArgRequired();
- try {
- int procState = mAm.getPackageProcessState(packageName, "com.android.shell");
- System.out.println(
- ActivityManager.RunningAppProcessInfo.procStateToImportance(procState));
- } catch (RemoteException e) {
- }
- }
-
- private void runToUri(int flags) throws Exception {
- Intent intent = makeIntent(UserHandle.USER_CURRENT);
- System.out.println(intent.toUri(flags));
- }
-
- private class IntentReceiver extends IIntentReceiver.Stub {
- private boolean mFinished = false;
-
- @Override
- public void performReceive(Intent intent, int resultCode, String data, Bundle extras,
- boolean ordered, boolean sticky, int sendingUser) {
- String line = "Broadcast completed: result=" + resultCode;
- if (data != null) line = line + ", data=\"" + data + "\"";
- if (extras != null) line = line + ", extras: " + extras;
- System.out.println(line);
- synchronized (this) {
- mFinished = true;
- notifyAll();
- }
- }
-
- public synchronized void waitForFinish() {
- try {
- while (!mFinished) wait();
- } catch (InterruptedException e) {
- throw new IllegalStateException(e);
- }
- }
- }
-
private class InstrumentationWatcher extends IInstrumentationWatcher.Stub {
private boolean mFinished = false;
private boolean mRawMode = false;
@@ -1580,833 +660,4 @@ public class Am extends BaseCommand {
return true;
}
}
-
- private void runStack() throws Exception {
- String op = nextArgRequired();
- switch (op) {
- case "start":
- runStackStart();
- break;
- case "movetask":
- runStackMoveTask();
- break;
- case "resize":
- runStackResize();
- break;
- case "resize-animated":
- runStackResizeAnimated();
- break;
- case "resize-docked-stack":
- runStackResizeDocked();
- break;
- case "positiontask":
- runStackPositionTask();
- break;
- case "list":
- runStackList();
- break;
- case "info":
- runStackInfo();
- break;
- case "move-top-activity-to-pinned-stack":
- runMoveTopActivityToPinnedStack();
- break;
- case "size-docked-stack-test":
- runStackSizeDockedStackTest();
- break;
- case "remove":
- runStackRemove();
- break;
- default:
- showError("Error: unknown command '" + op + "'");
- break;
- }
- }
-
- private void runStackStart() throws Exception {
- String displayIdStr = nextArgRequired();
- int displayId = Integer.parseInt(displayIdStr);
- Intent intent = makeIntent(UserHandle.USER_CURRENT);
-
- try {
- IActivityContainer container = mAm.createStackOnDisplay(displayId);
- if (container != null) {
- container.startActivity(intent);
- }
- } catch (RemoteException e) {
- }
- }
-
- private void runStackMoveTask() throws Exception {
- String taskIdStr = nextArgRequired();
- int taskId = Integer.parseInt(taskIdStr);
- String stackIdStr = nextArgRequired();
- int stackId = Integer.parseInt(stackIdStr);
- String toTopStr = nextArgRequired();
- final boolean toTop;
- if ("true".equals(toTopStr)) {
- toTop = true;
- } else if ("false".equals(toTopStr)) {
- toTop = false;
- } else {
- System.err.println("Error: bad toTop arg: " + toTopStr);
- return;
- }
-
- try {
- mAm.moveTaskToStack(taskId, stackId, toTop);
- } catch (RemoteException e) {
- }
- }
-
- private void runStackResize() throws Exception {
- String stackIdStr = nextArgRequired();
- int stackId = Integer.parseInt(stackIdStr);
- final Rect bounds = getBounds();
- if (bounds == null) {
- System.err.println("Error: invalid input bounds");
- return;
- }
- resizeStack(stackId, bounds, 0);
- }
-
- private void runStackResizeAnimated() throws Exception {
- String stackIdStr = nextArgRequired();
- int stackId = Integer.parseInt(stackIdStr);
- final Rect bounds;
- if ("null".equals(mArgs.peekNextArg())) {
- bounds = null;
- } else {
- bounds = getBounds();
- if (bounds == null) {
- System.err.println("Error: invalid input bounds");
- return;
- }
- }
- resizeStackUnchecked(stackId, bounds, 0, true);
- }
-
- private void resizeStackUnchecked(int stackId, Rect bounds, int delayMs, boolean animate) {
- try {
- mAm.resizeStack(stackId, bounds, false, false, animate, -1);
- Thread.sleep(delayMs);
- } catch (RemoteException e) {
- showError("Error: resizing stack " + e);
- } catch (InterruptedException e) {
- }
- }
-
- private void runStackResizeDocked() throws Exception {
- final Rect bounds = getBounds();
- final Rect taskBounds = getBounds();
- if (bounds == null || taskBounds == null) {
- System.err.println("Error: invalid input bounds");
- return;
- }
- try {
- mAm.resizeDockedStack(bounds, taskBounds, null, null, null);
- } catch (RemoteException e) {
- showError("Error: resizing docked stack " + e);
- }
- }
-
- private void resizeStack(int stackId, Rect bounds, int delayMs)
- throws Exception {
- if (bounds == null) {
- showError("Error: invalid input bounds");
- return;
- }
- resizeStackUnchecked(stackId, bounds, delayMs, false);
- }
-
- private void runStackPositionTask() throws Exception {
- String taskIdStr = nextArgRequired();
- int taskId = Integer.parseInt(taskIdStr);
- String stackIdStr = nextArgRequired();
- int stackId = Integer.parseInt(stackIdStr);
- String positionStr = nextArgRequired();
- int position = Integer.parseInt(positionStr);
-
- try {
- mAm.positionTaskInStack(taskId, stackId, position);
- } catch (RemoteException e) {
- }
- }
-
- private void runStackList() throws Exception {
- try {
- List<StackInfo> stacks = mAm.getAllStackInfos();
- for (StackInfo info : stacks) {
- System.out.println(info);
- }
- } catch (RemoteException e) {
- }
- }
-
- private void runStackInfo() throws Exception {
- try {
- String stackIdStr = nextArgRequired();
- int stackId = Integer.parseInt(stackIdStr);
- StackInfo info = mAm.getStackInfo(stackId);
- System.out.println(info);
- } catch (RemoteException e) {
- }
- }
-
- private void runStackRemove() throws Exception {
- String stackIdStr = nextArgRequired();
- int stackId = Integer.parseInt(stackIdStr);
- mAm.removeStack(stackId);
- }
-
- private void runMoveTopActivityToPinnedStack() throws Exception {
- int stackId = Integer.parseInt(nextArgRequired());
- final Rect bounds = getBounds();
- if (bounds == null) {
- System.err.println("Error: invalid input bounds");
- return;
- }
-
- try {
- if (!mAm.moveTopActivityToPinnedStack(stackId, bounds)) {
- showError("Didn't move top activity to pinned stack.");
- }
- } catch (RemoteException e) {
- showError("Unable to move top activity: " + e);
- return;
- }
- }
-
- private void runStackSizeDockedStackTest() throws Exception {
- final int stepSize = Integer.parseInt(nextArgRequired());
- final String side = nextArgRequired();
- final String delayStr = nextArg();
- final int delayMs = (delayStr != null) ? Integer.parseInt(delayStr) : 0;
-
- Rect bounds;
- try {
- StackInfo info = mAm.getStackInfo(DOCKED_STACK_ID);
- if (info == null) {
- showError("Docked stack doesn't exist");
- return;
- }
- if (info.bounds == null) {
- showError("Docked stack doesn't have a bounds");
- return;
- }
- bounds = info.bounds;
- } catch (RemoteException e) {
- showError("Unable to get docked stack info:" + e);
- return;
- }
-
- final boolean horizontalGrowth = "l".equals(side) || "r".equals(side);
- final int changeSize = (horizontalGrowth ? bounds.width() : bounds.height()) / 2;
- int currentPoint;
- switch (side) {
- case "l":
- currentPoint = bounds.left;
- break;
- case "r":
- currentPoint = bounds.right;
- break;
- case "t":
- currentPoint = bounds.top;
- break;
- case "b":
- currentPoint = bounds.bottom;
- break;
- default:
- showError("Unknown growth side: " + side);
- return;
- }
-
- final int startPoint = currentPoint;
- final int minPoint = currentPoint - changeSize;
- final int maxPoint = currentPoint + changeSize;
-
- int maxChange;
- System.out.println("Shrinking docked stack side=" + side);
- while (currentPoint > minPoint) {
- maxChange = Math.min(stepSize, currentPoint - minPoint);
- currentPoint -= maxChange;
- setBoundsSide(bounds, side, currentPoint);
- resizeStack(DOCKED_STACK_ID, bounds, delayMs);
- }
-
- System.out.println("Growing docked stack side=" + side);
- while (currentPoint < maxPoint) {
- maxChange = Math.min(stepSize, maxPoint - currentPoint);
- currentPoint += maxChange;
- setBoundsSide(bounds, side, currentPoint);
- resizeStack(DOCKED_STACK_ID, bounds, delayMs);
- }
-
- System.out.println("Back to Original size side=" + side);
- while (currentPoint > startPoint) {
- maxChange = Math.min(stepSize, currentPoint - startPoint);
- currentPoint -= maxChange;
- setBoundsSide(bounds, side, currentPoint);
- resizeStack(DOCKED_STACK_ID, bounds, delayMs);
- }
- }
-
- private void setBoundsSide(Rect bounds, String side, int value) {
- switch (side) {
- case "l":
- bounds.left = value;
- break;
- case "r":
- bounds.right = value;
- break;
- case "t":
- bounds.top = value;
- break;
- case "b":
- bounds.bottom = value;
- break;
- default:
- showError("Unknown set side: " + side);
- break;
- }
- }
-
- private void runTask() throws Exception {
- String op = nextArgRequired();
- if (op.equals("lock")) {
- runTaskLock();
- } else if (op.equals("resizeable")) {
- runTaskResizeable();
- } else if (op.equals("resize")) {
- runTaskResize();
- } else if (op.equals("drag-task-test")) {
- runTaskDragTaskTest();
- } else if (op.equals("size-task-test")) {
- runTaskSizeTaskTest();
- } else {
- showError("Error: unknown command '" + op + "'");
- return;
- }
- }
-
- private void runTaskLock() throws Exception {
- String taskIdStr = nextArgRequired();
- try {
- if (taskIdStr.equals("stop")) {
- mAm.stopLockTaskMode();
- } else {
- int taskId = Integer.parseInt(taskIdStr);
- mAm.startLockTaskMode(taskId);
- }
- System.err.println("Activity manager is " + (mAm.isInLockTaskMode() ? "" : "not ") +
- "in lockTaskMode");
- } catch (RemoteException e) {
- }
- }
-
- private void runTaskResizeable() throws Exception {
- final String taskIdStr = nextArgRequired();
- final int taskId = Integer.parseInt(taskIdStr);
- final String resizeableStr = nextArgRequired();
- final int resizeableMode = Integer.parseInt(resizeableStr);
-
- try {
- mAm.setTaskResizeable(taskId, resizeableMode);
- } catch (RemoteException e) {
- }
- }
-
- private void runTaskResize() throws Exception {
- final String taskIdStr = nextArgRequired();
- final int taskId = Integer.parseInt(taskIdStr);
- final Rect bounds = getBounds();
- if (bounds == null) {
- System.err.println("Error: invalid input bounds");
- return;
- }
- taskResize(taskId, bounds, 0, false);
- }
-
- private void taskResize(int taskId, Rect bounds, int delay_ms, boolean pretendUserResize) {
- try {
- final int resizeMode = pretendUserResize ? RESIZE_MODE_USER : RESIZE_MODE_SYSTEM;
- mAm.resizeTask(taskId, bounds, resizeMode);
- Thread.sleep(delay_ms);
- } catch (RemoteException e) {
- System.err.println("Error changing task bounds: " + e);
- } catch (InterruptedException e) {
- }
- }
-
- private void runTaskDragTaskTest() {
- final int taskId = Integer.parseInt(nextArgRequired());
- final int stepSize = Integer.parseInt(nextArgRequired());
- final String delayStr = nextArg();
- final int delay_ms = (delayStr != null) ? Integer.parseInt(delayStr) : 0;
- final StackInfo stackInfo;
- Rect taskBounds;
- try {
- stackInfo = mAm.getStackInfo(mAm.getFocusedStackId());
- taskBounds = mAm.getTaskBounds(taskId);
- } catch (RemoteException e) {
- System.err.println("Error getting focus stack info or task bounds: " + e);
- return;
- }
- final Rect stackBounds = stackInfo.bounds;
- int travelRight = stackBounds.width() - taskBounds.width();
- int travelLeft = -travelRight;
- int travelDown = stackBounds.height() - taskBounds.height();
- int travelUp = -travelDown;
- int passes = 0;
-
- // We do 2 passes to get back to the original location of the task.
- while (passes < 2) {
- // Move right
- System.out.println("Moving right...");
- travelRight = moveTask(taskId, taskBounds, stackBounds, stepSize,
- travelRight, MOVING_FORWARD, MOVING_HORIZONTALLY, delay_ms);
- System.out.println("Still need to travel right by " + travelRight);
-
- // Move down
- System.out.println("Moving down...");
- travelDown = moveTask(taskId, taskBounds, stackBounds, stepSize,
- travelDown, MOVING_FORWARD, !MOVING_HORIZONTALLY, delay_ms);
- System.out.println("Still need to travel down by " + travelDown);
-
- // Move left
- System.out.println("Moving left...");
- travelLeft = moveTask(taskId, taskBounds, stackBounds, stepSize,
- travelLeft, !MOVING_FORWARD, MOVING_HORIZONTALLY, delay_ms);
- System.out.println("Still need to travel left by " + travelLeft);
-
- // Move up
- System.out.println("Moving up...");
- travelUp = moveTask(taskId, taskBounds, stackBounds, stepSize,
- travelUp, !MOVING_FORWARD, !MOVING_HORIZONTALLY, delay_ms);
- System.out.println("Still need to travel up by " + travelUp);
-
- try {
- taskBounds = mAm.getTaskBounds(taskId);
- } catch (RemoteException e) {
- System.err.println("Error getting task bounds: " + e);
- return;
- }
- passes++;
- }
- }
-
- private int moveTask(int taskId, Rect taskRect, Rect stackRect, int stepSize,
- int maxToTravel, boolean movingForward, boolean horizontal, int delay_ms) {
- int maxMove;
- if (movingForward) {
- while (maxToTravel > 0
- && ((horizontal && taskRect.right < stackRect.right)
- ||(!horizontal && taskRect.bottom < stackRect.bottom))) {
- if (horizontal) {
- maxMove = Math.min(stepSize, stackRect.right - taskRect.right);
- maxToTravel -= maxMove;
- taskRect.right += maxMove;
- taskRect.left += maxMove;
- } else {
- maxMove = Math.min(stepSize, stackRect.bottom - taskRect.bottom);
- maxToTravel -= maxMove;
- taskRect.top += maxMove;
- taskRect.bottom += maxMove;
- }
- taskResize(taskId, taskRect, delay_ms, false);
- }
- } else {
- while (maxToTravel < 0
- && ((horizontal && taskRect.left > stackRect.left)
- ||(!horizontal && taskRect.top > stackRect.top))) {
- if (horizontal) {
- maxMove = Math.min(stepSize, taskRect.left - stackRect.left);
- maxToTravel -= maxMove;
- taskRect.right -= maxMove;
- taskRect.left -= maxMove;
- } else {
- maxMove = Math.min(stepSize, taskRect.top - stackRect.top);
- maxToTravel -= maxMove;
- taskRect.top -= maxMove;
- taskRect.bottom -= maxMove;
- }
- taskResize(taskId, taskRect, delay_ms, false);
- }
- }
- // Return the remaining distance we didn't travel because we reached the target location.
- return maxToTravel;
- }
-
- private void runTaskSizeTaskTest() {
- final int taskId = Integer.parseInt(nextArgRequired());
- final int stepSize = Integer.parseInt(nextArgRequired());
- final String delayStr = nextArg();
- final int delay_ms = (delayStr != null) ? Integer.parseInt(delayStr) : 0;
- final StackInfo stackInfo;
- final Rect initialTaskBounds;
- try {
- stackInfo = mAm.getStackInfo(mAm.getFocusedStackId());
- initialTaskBounds = mAm.getTaskBounds(taskId);
- } catch (RemoteException e) {
- System.err.println("Error getting focus stack info or task bounds: " + e);
- return;
- }
- final Rect stackBounds = stackInfo.bounds;
- stackBounds.inset(STACK_BOUNDS_INSET, STACK_BOUNDS_INSET);
- final Rect currentTaskBounds = new Rect(initialTaskBounds);
-
- // Size by top-left
- System.out.println("Growing top-left");
- do {
- currentTaskBounds.top -= getStepSize(
- currentTaskBounds.top, stackBounds.top, stepSize, GREATER_THAN_TARGET);
-
- currentTaskBounds.left -= getStepSize(
- currentTaskBounds.left, stackBounds.left, stepSize, GREATER_THAN_TARGET);
-
- taskResize(taskId, currentTaskBounds, delay_ms, true);
- } while (stackBounds.top < currentTaskBounds.top
- || stackBounds.left < currentTaskBounds.left);
-
- // Back to original size
- System.out.println("Shrinking top-left");
- do {
- currentTaskBounds.top += getStepSize(
- currentTaskBounds.top, initialTaskBounds.top, stepSize, !GREATER_THAN_TARGET);
-
- currentTaskBounds.left += getStepSize(
- currentTaskBounds.left, initialTaskBounds.left, stepSize, !GREATER_THAN_TARGET);
-
- taskResize(taskId, currentTaskBounds, delay_ms, true);
- } while (initialTaskBounds.top > currentTaskBounds.top
- || initialTaskBounds.left > currentTaskBounds.left);
-
- // Size by top-right
- System.out.println("Growing top-right");
- do {
- currentTaskBounds.top -= getStepSize(
- currentTaskBounds.top, stackBounds.top, stepSize, GREATER_THAN_TARGET);
-
- currentTaskBounds.right += getStepSize(
- currentTaskBounds.right, stackBounds.right, stepSize, !GREATER_THAN_TARGET);
-
- taskResize(taskId, currentTaskBounds, delay_ms, true);
- } while (stackBounds.top < currentTaskBounds.top
- || stackBounds.right > currentTaskBounds.right);
-
- // Back to original size
- System.out.println("Shrinking top-right");
- do {
- currentTaskBounds.top += getStepSize(
- currentTaskBounds.top, initialTaskBounds.top, stepSize, !GREATER_THAN_TARGET);
-
- currentTaskBounds.right -= getStepSize(currentTaskBounds.right, initialTaskBounds.right,
- stepSize, GREATER_THAN_TARGET);
-
- taskResize(taskId, currentTaskBounds, delay_ms, true);
- } while (initialTaskBounds.top > currentTaskBounds.top
- || initialTaskBounds.right < currentTaskBounds.right);
-
- // Size by bottom-left
- System.out.println("Growing bottom-left");
- do {
- currentTaskBounds.bottom += getStepSize(
- currentTaskBounds.bottom, stackBounds.bottom, stepSize, !GREATER_THAN_TARGET);
-
- currentTaskBounds.left -= getStepSize(
- currentTaskBounds.left, stackBounds.left, stepSize, GREATER_THAN_TARGET);
-
- taskResize(taskId, currentTaskBounds, delay_ms, true);
- } while (stackBounds.bottom > currentTaskBounds.bottom
- || stackBounds.left < currentTaskBounds.left);
-
- // Back to original size
- System.out.println("Shrinking bottom-left");
- do {
- currentTaskBounds.bottom -= getStepSize(currentTaskBounds.bottom,
- initialTaskBounds.bottom, stepSize, GREATER_THAN_TARGET);
-
- currentTaskBounds.left += getStepSize(
- currentTaskBounds.left, initialTaskBounds.left, stepSize, !GREATER_THAN_TARGET);
-
- taskResize(taskId, currentTaskBounds, delay_ms, true);
- } while (initialTaskBounds.bottom < currentTaskBounds.bottom
- || initialTaskBounds.left > currentTaskBounds.left);
-
- // Size by bottom-right
- System.out.println("Growing bottom-right");
- do {
- currentTaskBounds.bottom += getStepSize(
- currentTaskBounds.bottom, stackBounds.bottom, stepSize, !GREATER_THAN_TARGET);
-
- currentTaskBounds.right += getStepSize(
- currentTaskBounds.right, stackBounds.right, stepSize, !GREATER_THAN_TARGET);
-
- taskResize(taskId, currentTaskBounds, delay_ms, true);
- } while (stackBounds.bottom > currentTaskBounds.bottom
- || stackBounds.right > currentTaskBounds.right);
-
- // Back to original size
- System.out.println("Shrinking bottom-right");
- do {
- currentTaskBounds.bottom -= getStepSize(currentTaskBounds.bottom,
- initialTaskBounds.bottom, stepSize, GREATER_THAN_TARGET);
-
- currentTaskBounds.right -= getStepSize(currentTaskBounds.right, initialTaskBounds.right,
- stepSize, GREATER_THAN_TARGET);
-
- taskResize(taskId, currentTaskBounds, delay_ms, true);
- } while (initialTaskBounds.bottom < currentTaskBounds.bottom
- || initialTaskBounds.right < currentTaskBounds.right);
- }
-
- private int getStepSize(int current, int target, int inStepSize, boolean greaterThanTarget) {
- int stepSize = 0;
- if (greaterThanTarget && target < current) {
- current -= inStepSize;
- stepSize = inStepSize;
- if (target > current) {
- stepSize -= (target - current);
- }
- }
- if (!greaterThanTarget && target > current) {
- current += inStepSize;
- stepSize = inStepSize;
- if (target < current) {
- stepSize += (current - target);
- }
- }
- return stepSize;
- }
-
- private List<Configuration> getRecentConfigurations(int days) {
- IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService(
- Context.USAGE_STATS_SERVICE));
- final long now = System.currentTimeMillis();
- final long nDaysAgo = now - (days * 24 * 60 * 60 * 1000);
- try {
- @SuppressWarnings("unchecked")
- ParceledListSlice<ConfigurationStats> configStatsSlice = usm.queryConfigurationStats(
- UsageStatsManager.INTERVAL_BEST, nDaysAgo, now, "com.android.shell");
- if (configStatsSlice == null) {
- return Collections.emptyList();
- }
-
- final ArrayMap<Configuration, Integer> recentConfigs = new ArrayMap<>();
- final List<ConfigurationStats> configStatsList = configStatsSlice.getList();
- final int configStatsListSize = configStatsList.size();
- for (int i = 0; i < configStatsListSize; i++) {
- final ConfigurationStats stats = configStatsList.get(i);
- final int indexOfKey = recentConfigs.indexOfKey(stats.getConfiguration());
- if (indexOfKey < 0) {
- recentConfigs.put(stats.getConfiguration(), stats.getActivationCount());
- } else {
- recentConfigs.setValueAt(indexOfKey,
- recentConfigs.valueAt(indexOfKey) + stats.getActivationCount());
- }
- }
-
- final Comparator<Configuration> comparator = new Comparator<Configuration>() {
- @Override
- public int compare(Configuration a, Configuration b) {
- return recentConfigs.get(b).compareTo(recentConfigs.get(a));
- }
- };
-
- ArrayList<Configuration> configs = new ArrayList<>(recentConfigs.size());
- configs.addAll(recentConfigs.keySet());
- Collections.sort(configs, comparator);
- return configs;
-
- } catch (RemoteException e) {
- return Collections.emptyList();
- }
- }
-
- private void runGetConfig() throws Exception {
- int days = 14;
- String option = nextOption();
- if (option != null) {
- if (!option.equals("--days")) {
- throw new IllegalArgumentException("unrecognized option " + option);
- }
-
- days = Integer.parseInt(nextArgRequired());
- if (days <= 0) {
- throw new IllegalArgumentException("--days must be a positive integer");
- }
- }
-
- try {
- Configuration config = mAm.getConfiguration();
- if (config == null) {
- System.err.println("Activity manager has no configuration");
- return;
- }
-
- System.out.println("config: " + Configuration.resourceQualifierString(config));
- System.out.println("abi: " + TextUtils.join(",", Build.SUPPORTED_ABIS));
-
- final List<Configuration> recentConfigs = getRecentConfigurations(days);
- final int recentConfigSize = recentConfigs.size();
- if (recentConfigSize > 0) {
- System.out.println("recentConfigs:");
- }
-
- for (int i = 0; i < recentConfigSize; i++) {
- System.out.println(" config: " + Configuration.resourceQualifierString(
- recentConfigs.get(i)));
- }
-
- } catch (RemoteException e) {
- }
- }
-
- private void runSuppressResizeConfigChanges() throws Exception {
- boolean suppress = Boolean.valueOf(nextArgRequired());
-
- try {
- mAm.suppressResizeConfigChanges(suppress);
- } catch (RemoteException e) {
- System.err.println("Error suppressing resize config changes: " + e);
- }
- }
-
- private void runSetInactive() throws Exception {
- int userId = UserHandle.USER_CURRENT;
-
- String opt;
- while ((opt=nextOption()) != null) {
- if (opt.equals("--user")) {
- userId = parseUserArg(nextArgRequired());
- } else {
- System.err.println("Error: Unknown option: " + opt);
- return;
- }
- }
- String packageName = nextArgRequired();
- String value = nextArgRequired();
-
- IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService(
- Context.USAGE_STATS_SERVICE));
- usm.setAppInactive(packageName, Boolean.parseBoolean(value), userId);
- }
-
- private void runGetInactive() throws Exception {
- int userId = UserHandle.USER_CURRENT;
-
- String opt;
- while ((opt=nextOption()) != null) {
- if (opt.equals("--user")) {
- userId = parseUserArg(nextArgRequired());
- } else {
- System.err.println("Error: Unknown option: " + opt);
- return;
- }
- }
- String packageName = nextArgRequired();
-
- IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService(
- Context.USAGE_STATS_SERVICE));
- boolean isIdle = usm.isAppInactive(packageName, userId);
- System.out.println("Idle=" + isIdle);
- }
-
- private void runSendTrimMemory() throws Exception {
- int userId = UserHandle.USER_CURRENT;
- String opt;
- while ((opt = nextOption()) != null) {
- if (opt.equals("--user")) {
- userId = parseUserArg(nextArgRequired());
- if (userId == UserHandle.USER_ALL) {
- System.err.println("Error: Can't use user 'all'");
- return;
- }
- } else {
- System.err.println("Error: Unknown option: " + opt);
- return;
- }
- }
-
- String proc = nextArgRequired();
- String levelArg = nextArgRequired();
- int level;
- switch (levelArg) {
- case "HIDDEN":
- level = ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN;
- break;
- case "RUNNING_MODERATE":
- level = ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE;
- break;
- case "BACKGROUND":
- level = ComponentCallbacks2.TRIM_MEMORY_BACKGROUND;
- break;
- case "RUNNING_LOW":
- level = ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW;
- break;
- case "MODERATE":
- level = ComponentCallbacks2.TRIM_MEMORY_MODERATE;
- break;
- case "RUNNING_CRITICAL":
- level = ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL;
- break;
- case "COMPLETE":
- level = ComponentCallbacks2.TRIM_MEMORY_COMPLETE;
- break;
- default:
- System.err.println("Error: Unknown level option: " + levelArg);
- return;
- }
- if (!mAm.setProcessMemoryTrimLevel(proc, userId, level)) {
- System.err.println("Unknown error: failed to set trim level");
- }
- }
-
- private void runGetCurrentUser() throws Exception {
- UserInfo currentUser = Preconditions.checkNotNull(mAm.getCurrentUser(),
- "Current user not set");
- System.out.println(currentUser.id);
- }
-
- /**
- * Open the given file for sending into the system process. This verifies
- * with SELinux that the system will have access to the file.
- */
- private static ParcelFileDescriptor openForSystemServer(File file, int mode)
- throws FileNotFoundException {
- final ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, mode);
- final String tcon = SELinux.getFileContext(file.getAbsolutePath());
- if (!SELinux.checkSELinuxAccess("u:r:system_server:s0", tcon, "file", "read")) {
- throw new FileNotFoundException("System server has no access to file context " + tcon);
- }
- return fd;
- }
-
- private Rect getBounds() {
- String leftStr = nextArgRequired();
- int left = Integer.parseInt(leftStr);
- String topStr = nextArgRequired();
- int top = Integer.parseInt(topStr);
- String rightStr = nextArgRequired();
- int right = Integer.parseInt(rightStr);
- String bottomStr = nextArgRequired();
- int bottom = Integer.parseInt(bottomStr);
- if (left < 0) {
- System.err.println("Error: bad left arg: " + leftStr);
- return null;
- }
- if (top < 0) {
- System.err.println("Error: bad top arg: " + topStr);
- return null;
- }
- if (right <= 0) {
- System.err.println("Error: bad right arg: " + rightStr);
- return null;
- }
- if (bottom <= 0) {
- System.err.println("Error: bad bottom arg: " + bottomStr);
- return null;
- }
- return new Rect(left, top, right, bottom);
- }
}
diff --git a/cmds/idmap/scan.cpp b/cmds/idmap/scan.cpp
index 6d30f0d0ce34..ab6adfb9475f 100644
--- a/cmds/idmap/scan.cpp
+++ b/cmds/idmap/scan.cpp
@@ -1,5 +1,6 @@
#include <dirent.h>
#include <inttypes.h>
+#include <sys/file.h>
#include <sys/stat.h>
#include "idmap.h"
@@ -35,16 +36,31 @@ namespace {
bool writePackagesList(const char *filename, const SortedVector<Overlay>& overlayVector)
{
- FILE* fout = fopen(filename, "w");
+ // the file is opened for appending so that it doesn't get truncated
+ // before we can guarantee mutual exclusion via the flock
+ FILE* fout = fopen(filename, "a");
if (fout == NULL) {
return false;
}
+ if (TEMP_FAILURE_RETRY(flock(fileno(fout), LOCK_EX)) != 0) {
+ fclose(fout);
+ return false;
+ }
+
+ if (TEMP_FAILURE_RETRY(ftruncate(fileno(fout), 0)) != 0) {
+ TEMP_FAILURE_RETRY(flock(fileno(fout), LOCK_UN));
+ fclose(fout);
+ return false;
+ }
+
for (size_t i = 0; i < overlayVector.size(); ++i) {
const Overlay& overlay = overlayVector[i];
fprintf(fout, "%s %s\n", overlay.apk_path.string(), overlay.idmap_path.string());
}
+ TEMP_FAILURE_RETRY(fflush(fout));
+ TEMP_FAILURE_RETRY(flock(fileno(fout), LOCK_UN));
fclose(fout);
// Make file world readable since Zygote (running as root) will read
@@ -171,9 +187,6 @@ int idmap_scan(const char *target_package_name, const char *target_apk_path,
{
String8 filename = String8(idmap_dir);
filename.appendPath("overlays.list");
- if (unlink(filename.string()) != 0 && errno != ENOENT) {
- return EXIT_FAILURE;
- }
SortedVector<Overlay> overlayVector;
const size_t N = overlay_dirs->size();
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index ac8ee8d38c3f..aba53dcdca4d 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -41,6 +41,10 @@ import android.content.pm.PackageInstaller;
import android.content.pm.PackageInstaller.SessionInfo;
import android.content.pm.PackageInstaller.SessionParams;
import android.content.pm.PackageManager;
+import android.content.pm.PackageParser;
+import android.content.pm.PackageParser.ApkLite;
+import android.content.pm.PackageParser.PackageLite;
+import android.content.pm.PackageParser.PackageParserException;
import android.content.pm.UserInfo;
import android.net.Uri;
import android.os.Binder;
@@ -398,11 +402,27 @@ public final class Pm {
*/
private int runInstall() throws RemoteException {
final InstallParams params = makeInstallParams();
+ final String inPath = nextArg();
+ if (params.sessionParams.sizeBytes < 0 && inPath != null) {
+ File file = new File(inPath);
+ if (file.isFile()) {
+ try {
+ ApkLite baseApk = PackageParser.parseApkLite(file, 0);
+ PackageLite pkgLite = new PackageLite(null, baseApk, null, null, null);
+ params.sessionParams.setSize(
+ PackageHelper.calculateInstalledSize(pkgLite, false,
+ params.sessionParams.abiOverride));
+ } catch (PackageParserException | IOException e) {
+ System.err.println("Error: Failed to parse APK file : " + e);
+ return 1;
+ }
+ }
+ }
+
final int sessionId = doCreateSession(params.sessionParams,
params.installerPackageName, params.userId);
try {
- final String inPath = nextArg();
if (inPath == null && params.sessionParams.sizeBytes == 0) {
System.err.println("Error: must either specify a package size or an APK file");
return 1;
diff --git a/compiled-classes-phone b/compiled-classes-phone
index 221d68739366..621430671eb4 100644
--- a/compiled-classes-phone
+++ b/compiled-classes-phone
@@ -1168,14 +1168,6 @@ android.drm.DrmManagerClient$OnEventListener
android.drm.DrmManagerClient$OnInfoListener
android.drm.DrmOutputStream
android.drm.DrmSupportInfo
-android.graphics.Atlas
-android.graphics.Atlas$Entry
-android.graphics.Atlas$Policy
-android.graphics.Atlas$SlicePolicy
-android.graphics.Atlas$SlicePolicy$Cell
-android.graphics.Atlas$SlicePolicy$MinAreaSplitDecision
-android.graphics.Atlas$SlicePolicy$SplitDecision
-android.graphics.Atlas$Type
android.graphics.Bitmap
android.graphics.Bitmap$1
android.graphics.Bitmap$CompressFormat
@@ -4264,9 +4256,6 @@ android.view.IAppTransitionAnimationSpecsFuture$Stub
android.view.IAppTransitionAnimationSpecsFuture$Stub$Proxy
android.view.IApplicationToken
android.view.IApplicationToken$Stub
-android.view.IAssetAtlas
-android.view.IAssetAtlas$Stub
-android.view.IAssetAtlas$Stub$Proxy
android.view.IDockedStackListener
android.view.IDockedStackListener$Stub
android.view.IDockedStackListener$Stub$Proxy
diff --git a/core/java/android/animation/KeyframeSet.java b/core/java/android/animation/KeyframeSet.java
index fd0bf0bc4727..116d0631bd7d 100644
--- a/core/java/android/animation/KeyframeSet.java
+++ b/core/java/android/animation/KeyframeSet.java
@@ -16,15 +16,15 @@
package android.animation;
-import java.util.Arrays;
-import java.util.List;
-
-import android.animation.Keyframe.IntKeyframe;
import android.animation.Keyframe.FloatKeyframe;
+import android.animation.Keyframe.IntKeyframe;
import android.animation.Keyframe.ObjectKeyframe;
import android.graphics.Path;
import android.util.Log;
+import java.util.Arrays;
+import java.util.List;
+
/**
* This class holds a collection of Keyframe objects and is called by ValueAnimator to calculate
* values between those keyframes for a given animation. The class internal to the animation
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index a207a52841e1..4ddcfe546f95 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -2352,18 +2352,23 @@ public class DevicePolicyManager {
* <p>The calling device admin must be a device or profile owner. If it is not,
* a {@link SecurityException} will be thrown.
*
+ * <p>The calling device admin can verify the value it has set by calling
+ * {@link #getRequiredStrongAuthTimeout(ComponentName)} and passing in its instance.
+ *
* <p>This method can be called on the {@link DevicePolicyManager} instance returned by
* {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
* profile.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param timeoutMs The new timeout, after which the user will have to unlock with strong
- * authentication method. If the timeout is lower than 1 hour (minimum) or higher than
- * 72 hours (default and maximum) an {@link IllegalArgumentException} is thrown.
+ * authentication method. A value of 0 means the admin is not participating in
+ * controlling the timeout.
+ * The minimum and maximum timeouts are platform-defined and are typically 1 hour and
+ * 72 hours, respectively. Though discouraged, the admin may choose to require strong
+ * auth at all times using {@link #KEYGUARD_DISABLE_FINGERPRINT} and/or
+ * {@link #KEYGUARD_DISABLE_TRUST_AGENTS}.
*
* @throws SecurityException if {@code admin} is not a device or profile owner.
- * @throws IllegalArgumentException if the timeout is lower than 1 hour (minimum) or higher than
- * 72 hours (default and maximum)
*
* @hide
*/
@@ -2389,7 +2394,7 @@ public class DevicePolicyManager {
*
* @param admin The name of the admin component to check, or {@code null} to aggregate
* accross all participating admins.
- * @return The timeout or default timeout if not configured
+ * @return The timeout or 0 if not configured for the provided admin.
*
* @hide
*/
diff --git a/core/java/android/content/pm/ShortcutManager.java b/core/java/android/content/pm/ShortcutManager.java
index cd248ea4e981..96ad67c6f3ab 100644
--- a/core/java/android/content/pm/ShortcutManager.java
+++ b/core/java/android/content/pm/ShortcutManager.java
@@ -329,7 +329,7 @@ import java.util.List;
* <p>Applications with a foreground activity or service are not rate-limited.
*
* <p>Rate-limiting will be reset upon certain events, so that even background applications
- * can call these APIs again until they are rate limit is reached again.
+ * can call these APIs again until the rate limit is reached again.
* These events include the following:
* <ul>
* <li>When an application comes to the foreground.
diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl
index 3324f6fe4589..427add19f14f 100644
--- a/core/java/android/os/IUserManager.aidl
+++ b/core/java/android/os/IUserManager.aidl
@@ -83,4 +83,6 @@ interface IUserManager {
boolean someUserHasSeedAccount(in String accountName, in String accountType);
boolean isManagedProfile(int userId);
boolean isDemoUser(int userId);
+ UserInfo createProfileForUserEvenWhenDisallowed(in String name, int flags, int userHandle,
+ in String[] disallowedPackages);
}
diff --git a/core/java/android/os/PowerManagerInternal.java b/core/java/android/os/PowerManagerInternal.java
index 9bbe8f951834..c153184e0084 100644
--- a/core/java/android/os/PowerManagerInternal.java
+++ b/core/java/android/os/PowerManagerInternal.java
@@ -53,24 +53,6 @@ public abstract class PowerManagerInternal {
*/
public static final int WAKEFULNESS_DOZING = 3;
-
- /**
- * Power hint:
- * Interaction: The user is interacting with the device. The corresponding data field must be
- * the expected duration of the interaction, or 0 if unknown.
- *
- * Sustained Performance Mode: The corresponding data field must be Enable/Disable
- * Sustained Performance Mode.
- *
- * Launch: This is specific for activity launching. The corresponding data field must be
- * the expected duration of the required boost, or 0 if unknown.
- *
- * These must be kept in sync with the values in hardware/libhardware/include/hardware/power.h
- */
- public static final int POWER_HINT_INTERACTION = 2;
- public static final int POWER_HINT_SUSTAINED_PERFORMANCE_MODE = 6;
- public static final int POWER_HINT_LAUNCH = 8;
-
public static String wakefulnessToString(int wakefulness) {
switch (wakefulness) {
case WAKEFULNESS_ASLEEP:
@@ -169,5 +151,9 @@ public abstract class PowerManagerInternal {
public abstract void uidGone(int uid);
+ /**
+ * The hintId sent through this method should be in-line with the
+ * PowerHint defined in android/hardware/power/<version 1.0 & up>/IPower.h
+ */
public abstract void powerHint(int hintId, int data);
}
diff --git a/core/java/android/os/ShellCommand.java b/core/java/android/os/ShellCommand.java
index 831c9b27ac45..dbb9650a7cb9 100644
--- a/core/java/android/os/ShellCommand.java
+++ b/core/java/android/os/ShellCommand.java
@@ -188,6 +188,25 @@ public abstract class ShellCommand {
}
/**
+ * Helper for just system services to ask the shell to open an output file.
+ * @hide
+ */
+ public ParcelFileDescriptor openOutputFileForSystem(String path) {
+ try {
+ ParcelFileDescriptor pfd = getShellCallback().openOutputFile(path,
+ "u:r:system_server:s0");
+ if (pfd != null) {
+ return pfd;
+ }
+ } catch (RuntimeException e) {
+ getErrPrintWriter().println("Failure opening file: " + e.getMessage());
+ }
+ getErrPrintWriter().println("Error: Unable to open file: " + path);
+ getErrPrintWriter().println("Consider using a file under /data/local/tmp/");
+ return null;
+ }
+
+ /**
* Return the next option on the command line -- that is an argument that
* starts with '-'. If the next argument is not an option, null is returned.
*/
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index c7e5e6308a8a..c656b066a51d 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -1374,6 +1374,24 @@ public class UserManager {
}
/**
+ * Similar to {@link #createProfileForUser(String, int, int, String[])}
+ * except bypassing the checking of {@link UserManager#DISALLOW_ADD_USER}.
+ * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
+ *
+ * @see #createProfileForUser(String, int, int, String[])
+ * @hide
+ */
+ public UserInfo createProfileForUserEvenWhenDisallowed(String name, int flags,
+ @UserIdInt int userHandle, String[] disallowedPackages) {
+ try {
+ return mService.createProfileForUserEvenWhenDisallowed(name, flags, userHandle,
+ disallowedPackages);
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Creates a restricted profile with the specified name. This method also sets necessary
* restrictions and adds shared accounts.
*
diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java
index 7399b7bfef2e..e399be0095bc 100644
--- a/core/java/android/os/storage/VolumeInfo.java
+++ b/core/java/android/os/storage/VolumeInfo.java
@@ -437,7 +437,7 @@ public class VolumeInfo implements Parcelable {
final Intent intent = new Intent(DocumentsContract.ACTION_BROWSE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
- intent.setData(uri);
+ intent.setDataAndType(uri, DocumentsContract.Root.MIME_TYPE_ITEM);
// note that docsui treats this as *force* show advanced. So sending
// false permits advanced to be shown based on user preferences.
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index bf73089e48e5..d7d8d5088657 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1853,7 +1853,6 @@ public final class Settings {
MOVED_TO_GLOBAL.add(Settings.Global.CALL_AUTO_RETRY);
MOVED_TO_GLOBAL.add(Settings.Global.DEBUG_APP);
MOVED_TO_GLOBAL.add(Settings.Global.WAIT_FOR_DEBUGGER);
- MOVED_TO_GLOBAL.add(Settings.Global.SHOW_PROCESSES);
MOVED_TO_GLOBAL.add(Settings.Global.ALWAYS_FINISH_ACTIVITIES);
MOVED_TO_GLOBAL.add(Settings.Global.TZINFO_UPDATE_CONTENT_URL);
MOVED_TO_GLOBAL.add(Settings.Global.TZINFO_UPDATE_METADATA_URL);
@@ -2791,7 +2790,8 @@ public final class Settings {
/**
* Control whether the process CPU usage meter should be shown.
*
- * @deprecated Use {@link Global#SHOW_PROCESSES} instead
+ * @deprecated This functionality is no longer available as of
+ * {@link android.os.Build.VERSION_CODES#N_MR1}.
*/
@Deprecated
public static final String SHOW_PROCESSES = Global.SHOW_PROCESSES;
@@ -8513,7 +8513,11 @@ public final class Settings {
/**
* Control whether the process CPU usage meter should be shown.
+ *
+ * @deprecated This functionality is no longer available as of
+ * {@link android.os.Build.VERSION_CODES#N_MR1}.
*/
+ @Deprecated
public static final String SHOW_PROCESSES = "show_processes";
/**
diff --git a/core/java/android/text/AutoText.java b/core/java/android/text/AutoText.java
index 04730ecd6cdd..c5339a42cbd1 100644
--- a/core/java/android/text/AutoText.java
+++ b/core/java/android/text/AutoText.java
@@ -18,11 +18,10 @@ package android.text;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
+import android.view.View;
import com.android.internal.util.XmlUtils;
-import android.view.View;
-
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -97,10 +96,10 @@ public class AutoText {
sInstance = instance;
}
}
-
+
return instance;
}
-
+
/**
* Retrieves a possible spelling correction for the specified range
* of text. Returns null if no correction can be found.
@@ -119,7 +118,7 @@ public class AutoText {
*/
public static int getSize(View view) {
- return getInstance(view).getSize();
+ return getInstance(view).getSize();
}
/**
@@ -137,7 +136,7 @@ public class AutoText {
for (; here != TRIE_NULL; here = mTrie[here + TRIE_NEXT]) {
if (c == mTrie[here + TRIE_C]) {
- if ((i == end - 1)
+ if ((i == end - 1)
&& (mTrie[here + TRIE_OFF] != TRIE_NULL)) {
int off = mTrie[here + TRIE_OFF];
int len = mText.charAt(off);
@@ -174,7 +173,7 @@ public class AutoText {
while (true) {
XmlUtils.nextElement(parser);
- String element = parser.getName();
+ String element = parser.getName();
if (element == null || !(element.equals("word"))) {
break;
}
@@ -214,7 +213,7 @@ public class AutoText {
int herep = TRIE_ROOT;
// Keep track of the size of the dictionary
mSize++;
-
+
for (int i = 0; i < slen; i++) {
char c = src.charAt(i);
boolean found = false;
diff --git a/core/java/android/text/BidiFormatter.java b/core/java/android/text/BidiFormatter.java
index 59273f428240..d84502f69035 100644
--- a/core/java/android/text/BidiFormatter.java
+++ b/core/java/android/text/BidiFormatter.java
@@ -16,11 +16,11 @@
package android.text;
+import static android.text.TextDirectionHeuristics.FIRSTSTRONG_LTR;
+
import android.annotation.Nullable;
import android.view.View;
-import static android.text.TextDirectionHeuristics.FIRSTSTRONG_LTR;
-
import java.util.Locale;
/**
diff --git a/core/java/android/text/Html.java b/core/java/android/text/Html.java
index 409994d7cd84..de8aa5af5ccc 100644
--- a/core/java/android/text/Html.java
+++ b/core/java/android/text/Html.java
@@ -16,19 +16,8 @@
package android.text;
-import com.android.internal.util.ArrayUtils;
-import org.ccil.cowan.tagsoup.HTMLSchema;
-import org.ccil.cowan.tagsoup.Parser;
-import org.xml.sax.Attributes;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-
import android.app.ActivityThread;
import android.app.Application;
-import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Typeface;
@@ -47,11 +36,21 @@ import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.SubscriptSpan;
import android.text.style.SuperscriptSpan;
-import android.text.style.TextAppearanceSpan;
import android.text.style.TypefaceSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
+import com.android.internal.util.ArrayUtils;
+
+import org.ccil.cowan.tagsoup.HTMLSchema;
+import org.ccil.cowan.tagsoup.Parser;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
diff --git a/core/java/android/text/InputType.java b/core/java/android/text/InputType.java
index c5963882e2bf..8967b709a04f 100644
--- a/core/java/android/text/InputType.java
+++ b/core/java/android/text/InputType.java
@@ -16,8 +16,6 @@
package android.text;
-import android.text.TextUtils;
-
/**
* Bit definitions for an integer defining the basic content type of text
* held in an {@link Editable} object. Supported classes may be combined
@@ -51,19 +49,19 @@ public interface InputType {
* or flags.<p>
*/
public static final int TYPE_MASK_CLASS = 0x0000000f;
-
+
/**
* Mask of bits that determine the variation of
* the base content class.
*/
public static final int TYPE_MASK_VARIATION = 0x00000ff0;
-
+
/**
* Mask of bits that provide addition bit flags
* of options.
*/
public static final int TYPE_MASK_FLAGS = 0x00fff000;
-
+
/**
* Special content type for when no explicit type has been specified.
* This should be interpreted to mean that the target input connection
@@ -75,11 +73,11 @@ public interface InputType {
* flag is set.
*/
public static final int TYPE_NULL = 0x00000000;
-
+
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
-
+
/**
* Class for normal text. This class supports the following flags (only
* one of which should be set):
@@ -92,7 +90,7 @@ public interface InputType {
* variation, normal should be assumed.
*/
public static final int TYPE_CLASS_TEXT = 0x00000001;
-
+
/**
* Flag for {@link #TYPE_CLASS_TEXT}: capitalize all characters. Overrides
* {@link #TYPE_TEXT_FLAG_CAP_WORDS} and
@@ -101,7 +99,7 @@ public interface InputType {
* this only affects languages where there are upper-case and lower-case letters.
*/
public static final int TYPE_TEXT_FLAG_CAP_CHARACTERS = 0x00001000;
-
+
/**
* Flag for {@link #TYPE_CLASS_TEXT}: capitalize the first character of
* every word. Overrides {@link #TYPE_TEXT_FLAG_CAP_SENTENCES}. This
@@ -110,7 +108,7 @@ public interface InputType {
* this only affects languages where there are upper-case and lower-case letters.
*/
public static final int TYPE_TEXT_FLAG_CAP_WORDS = 0x00002000;
-
+
/**
* Flag for {@link #TYPE_CLASS_TEXT}: capitalize the first character of
* each sentence. This value is explicitly defined
@@ -121,7 +119,7 @@ public interface InputType {
* this only affects languages where there are upper-case and lower-case letters.
*/
public static final int TYPE_TEXT_FLAG_CAP_SENTENCES = 0x00004000;
-
+
/**
* Flag for {@link #TYPE_CLASS_TEXT}: the user is entering free-form
* text that should have auto-correction applied to it. Without this flag,
@@ -135,7 +133,7 @@ public interface InputType {
* the IME offers an interface to show suggestions.
*/
public static final int TYPE_TEXT_FLAG_AUTO_CORRECT = 0x00008000;
-
+
/**
* Flag for {@link #TYPE_CLASS_TEXT}: the text editor (which means
* the application) is performing auto-completion of the text being entered
@@ -154,23 +152,23 @@ public interface InputType {
* it will rely on the Editor to pass completions/corrections.
*/
public static final int TYPE_TEXT_FLAG_AUTO_COMPLETE = 0x00010000;
-
+
/**
* Flag for {@link #TYPE_CLASS_TEXT}: multiple lines of text can be
- * entered into the field. If this flag is not set, the text field
+ * entered into the field. If this flag is not set, the text field
* will be constrained to a single line. The IME may also choose not to
* display an enter key when this flag is not set, as there should be no
* need to create new lines.
*/
public static final int TYPE_TEXT_FLAG_MULTI_LINE = 0x00020000;
-
+
/**
* Flag for {@link #TYPE_CLASS_TEXT}: the regular text view associated
* with this should not be multi-line, but when a fullscreen input method
* is providing text it should use multiple lines if it can.
*/
public static final int TYPE_TEXT_FLAG_IME_MULTI_LINE = 0x00040000;
-
+
/**
* Flag for {@link #TYPE_CLASS_TEXT}: the input method does not need to
* display any dictionary-based candidates. This is useful for text views that
@@ -191,36 +189,36 @@ public interface InputType {
public static final int TYPE_TEXT_FLAG_NO_SUGGESTIONS = 0x00080000;
// ----------------------------------------------------------------------
-
+
/**
* Default variation of {@link #TYPE_CLASS_TEXT}: plain old normal text.
*/
public static final int TYPE_TEXT_VARIATION_NORMAL = 0x00000000;
-
+
/**
* Variation of {@link #TYPE_CLASS_TEXT}: entering a URI.
*/
public static final int TYPE_TEXT_VARIATION_URI = 0x00000010;
-
+
/**
* Variation of {@link #TYPE_CLASS_TEXT}: entering an e-mail address.
*/
public static final int TYPE_TEXT_VARIATION_EMAIL_ADDRESS = 0x00000020;
-
+
/**
* Variation of {@link #TYPE_CLASS_TEXT}: entering the subject line of
* an e-mail.
*/
public static final int TYPE_TEXT_VARIATION_EMAIL_SUBJECT = 0x00000030;
-
+
/**
* Variation of {@link #TYPE_CLASS_TEXT}: entering a short, possibly informal
* message such as an instant message or a text message.
*/
public static final int TYPE_TEXT_VARIATION_SHORT_MESSAGE = 0x00000040;
-
+
/**
- * Variation of {@link #TYPE_CLASS_TEXT}: entering the content of a long, possibly
+ * Variation of {@link #TYPE_CLASS_TEXT}: entering the content of a long, possibly
* formal message such as the body of an e-mail.
*/
public static final int TYPE_TEXT_VARIATION_LONG_MESSAGE = 0x00000050;
@@ -229,34 +227,34 @@ public interface InputType {
* Variation of {@link #TYPE_CLASS_TEXT}: entering the name of a person.
*/
public static final int TYPE_TEXT_VARIATION_PERSON_NAME = 0x00000060;
-
+
/**
* Variation of {@link #TYPE_CLASS_TEXT}: entering a postal mailing address.
*/
public static final int TYPE_TEXT_VARIATION_POSTAL_ADDRESS = 0x00000070;
-
+
/**
* Variation of {@link #TYPE_CLASS_TEXT}: entering a password.
*/
public static final int TYPE_TEXT_VARIATION_PASSWORD = 0x00000080;
-
+
/**
* Variation of {@link #TYPE_CLASS_TEXT}: entering a password, which should
* be visible to the user.
*/
public static final int TYPE_TEXT_VARIATION_VISIBLE_PASSWORD = 0x00000090;
-
+
/**
* Variation of {@link #TYPE_CLASS_TEXT}: entering text inside of a web form.
*/
public static final int TYPE_TEXT_VARIATION_WEB_EDIT_TEXT = 0x000000a0;
-
+
/**
* Variation of {@link #TYPE_CLASS_TEXT}: entering text to filter contents
* of a list etc.
*/
public static final int TYPE_TEXT_VARIATION_FILTER = 0x000000b0;
-
+
/**
* Variation of {@link #TYPE_CLASS_TEXT}: entering text for phonetic
* pronunciation, such as a phonetic name field in contacts. This is mostly
@@ -264,7 +262,7 @@ public interface InputType {
* readings, like Japanese.
*/
public static final int TYPE_TEXT_VARIATION_PHONETIC = 0x000000c0;
-
+
/**
* Variation of {@link #TYPE_CLASS_TEXT}: entering e-mail address inside
* of a web form. This was added in
@@ -290,7 +288,7 @@ public interface InputType {
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
-
+
/**
* Class for numeric text. This class supports the following flags:
* {@link #TYPE_NUMBER_FLAG_SIGNED} and
@@ -301,19 +299,19 @@ public interface InputType {
* the variation, normal should be assumed.</p>
*/
public static final int TYPE_CLASS_NUMBER = 0x00000002;
-
+
/**
* Flag of {@link #TYPE_CLASS_NUMBER}: the number is signed, allowing
* a positive or negative sign at the start.
*/
public static final int TYPE_NUMBER_FLAG_SIGNED = 0x00001000;
-
+
/**
* Flag of {@link #TYPE_CLASS_NUMBER}: the number is decimal, allowing
* a decimal point to provide fractional values.
*/
public static final int TYPE_NUMBER_FLAG_DECIMAL = 0x00002000;
-
+
// ----------------------------------------------------------------------
/**
@@ -340,17 +338,17 @@ public interface InputType {
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
-
+
/**
* Class for a phone number. This class currently supports no variations
* or flags.
*/
public static final int TYPE_CLASS_PHONE = 0x00000003;
-
+
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
-
+
/**
* Class for dates and times. It supports the
* following variations:
@@ -359,19 +357,19 @@ public interface InputType {
* {@link #TYPE_DATETIME_VARIATION_TIME}.
*/
public static final int TYPE_CLASS_DATETIME = 0x00000004;
-
+
/**
* Default variation of {@link #TYPE_CLASS_DATETIME}: allows entering
* both a date and time.
*/
public static final int TYPE_DATETIME_VARIATION_NORMAL = 0x00000000;
-
+
/**
* Default variation of {@link #TYPE_CLASS_DATETIME}: allows entering
* only a date.
*/
public static final int TYPE_DATETIME_VARIATION_DATE = 0x00000010;
-
+
/**
* Default variation of {@link #TYPE_CLASS_DATETIME}: allows entering
* only a time.
diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java
index 2a52961984f7..03a2d6233967 100644
--- a/core/java/android/text/TextLine.java
+++ b/core/java/android/text/TextLine.java
@@ -16,11 +16,9 @@
package android.text;
-import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.FontMetricsInt;
-import android.graphics.RectF;
import android.text.Layout.Directions;
import android.text.Layout.TabStops;
import android.text.style.CharacterStyle;
diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java
index 23b22d1dcf96..6262fc2a4846 100644
--- a/core/java/android/text/TextUtils.java
+++ b/core/java/android/text/TextUtils.java
@@ -60,8 +60,6 @@ import android.view.View;
import com.android.internal.R;
import com.android.internal.util.ArrayUtils;
-import libcore.icu.ICU;
-
import java.lang.reflect.Array;
import java.util.Iterator;
import java.util.List;
diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java
index 3ed37b362336..b5a8acaf674f 100755
--- a/core/java/android/text/format/DateFormat.java
+++ b/core/java/android/text/format/DateFormat.java
@@ -23,15 +23,15 @@ import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.SpannedString;
+import libcore.icu.ICU;
+import libcore.icu.LocaleData;
+
+import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
-import java.text.SimpleDateFormat;
-
-import libcore.icu.ICU;
-import libcore.icu.LocaleData;
/**
* Utility class for producing strings with formatted date/time.
diff --git a/core/java/android/text/format/DateUtils.java b/core/java/android/text/format/DateUtils.java
index cb8852cf471a..f16e714d82d1 100644
--- a/core/java/android/text/format/DateUtils.java
+++ b/core/java/android/text/format/DateUtils.java
@@ -16,12 +16,16 @@
package android.text.format;
-import com.android.internal.R;
-
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
+import com.android.internal.R;
+
+import libcore.icu.DateIntervalFormat;
+import libcore.icu.LocaleData;
+import libcore.icu.RelativeDateTimeFormatter;
+
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
@@ -30,10 +34,6 @@ import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
-import libcore.icu.DateIntervalFormat;
-import libcore.icu.LocaleData;
-import libcore.icu.RelativeDateTimeFormatter;
-
/**
* This class contains various date-related utilities for creating text for things like
* elapsed time and date ranges, strings for days of the week and months, and AM/PM text etc.
diff --git a/core/java/android/text/format/Formatter.java b/core/java/android/text/format/Formatter.java
index be5246418d84..b67ac9840d60 100644
--- a/core/java/android/text/format/Formatter.java
+++ b/core/java/android/text/format/Formatter.java
@@ -20,11 +20,10 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Resources;
+import android.net.NetworkUtils;
import android.text.BidiFormatter;
import android.text.TextUtils;
import android.view.View;
-import android.net.NetworkUtils;
-import android.net.TrafficStats;
import java.util.Locale;
diff --git a/core/java/android/text/format/Time.java b/core/java/android/text/format/Time.java
index 69c2cff80cac..bbd9c9c0bac0 100644
--- a/core/java/android/text/format/Time.java
+++ b/core/java/android/text/format/Time.java
@@ -18,13 +18,13 @@ package android.text.format;
import android.util.TimeFormatException;
+import libcore.util.ZoneInfo;
+import libcore.util.ZoneInfoDB;
+
import java.io.IOException;
import java.util.Locale;
import java.util.TimeZone;
-import libcore.util.ZoneInfo;
-import libcore.util.ZoneInfoDB;
-
/**
* An alternative to the {@link java.util.Calendar} and
* {@link java.util.GregorianCalendar} classes. An instance of the Time class represents
diff --git a/core/java/android/text/format/TimeFormatter.java b/core/java/android/text/format/TimeFormatter.java
index 3a63805defe0..5a14092c95a8 100644
--- a/core/java/android/text/format/TimeFormatter.java
+++ b/core/java/android/text/format/TimeFormatter.java
@@ -22,12 +22,13 @@ package android.text.format;
import android.content.res.Resources;
+import libcore.icu.LocaleData;
+import libcore.util.ZoneInfo;
+
import java.nio.CharBuffer;
import java.util.Formatter;
import java.util.Locale;
import java.util.TimeZone;
-import libcore.icu.LocaleData;
-import libcore.util.ZoneInfo;
/**
* Formatting logic for {@link Time}. Contains a port of Bionic's broken strftime_tz to Java.
diff --git a/core/java/android/text/method/BaseKeyListener.java b/core/java/android/text/method/BaseKeyListener.java
index 14e0b4f8fcb8..90559dcdbcf4 100644
--- a/core/java/android/text/method/BaseKeyListener.java
+++ b/core/java/android/text/method/BaseKeyListener.java
@@ -19,19 +19,22 @@ package android.text.method;
import android.graphics.Paint;
import android.icu.lang.UCharacter;
import android.icu.lang.UProperty;
-import android.view.KeyEvent;
-import android.view.View;
-import android.text.*;
+import android.text.Editable;
+import android.text.Emoji;
+import android.text.InputType;
+import android.text.Layout;
+import android.text.NoCopySpan;
+import android.text.Selection;
+import android.text.Spanned;
import android.text.method.TextKeyListener.Capitalize;
import android.text.style.ReplacementSpan;
+import android.view.KeyEvent;
+import android.view.View;
import android.widget.TextView;
import com.android.internal.annotations.GuardedBy;
import java.text.BreakIterator;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
/**
* Abstract base class for key listeners.
diff --git a/core/java/android/text/method/CharacterPickerDialog.java b/core/java/android/text/method/CharacterPickerDialog.java
index 880e46daf1aa..7d838e06cd68 100644
--- a/core/java/android/text/method/CharacterPickerDialog.java
+++ b/core/java/android/text/method/CharacterPickerDialog.java
@@ -16,24 +16,25 @@
package android.text.method;
-import com.android.internal.R;
-
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
-import android.text.*;
+import android.text.Editable;
+import android.text.Selection;
import android.view.LayoutInflater;
-import android.view.View.OnClickListener;
import android.view.View;
+import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
-import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
+import com.android.internal.R;
+
/**
* Dialog for choosing accented characters related to a base character.
*/
diff --git a/core/java/android/text/method/DateKeyListener.java b/core/java/android/text/method/DateKeyListener.java
index e6f63d1ec4ee..88ef388bc420 100644
--- a/core/java/android/text/method/DateKeyListener.java
+++ b/core/java/android/text/method/DateKeyListener.java
@@ -16,8 +16,8 @@
package android.text.method;
-import android.view.KeyEvent;
import android.text.InputType;
+import android.view.KeyEvent;
/**
* For entering dates in a text field.
@@ -32,7 +32,7 @@ public class DateKeyListener extends NumberKeyListener
return InputType.TYPE_CLASS_DATETIME
| InputType.TYPE_DATETIME_VARIATION_DATE;
}
-
+
@Override
protected char[] getAcceptedChars()
{
diff --git a/core/java/android/text/method/DialerKeyListener.java b/core/java/android/text/method/DialerKeyListener.java
index bb8b0de8a9f3..17abed6c363a 100644
--- a/core/java/android/text/method/DialerKeyListener.java
+++ b/core/java/android/text/method/DialerKeyListener.java
@@ -16,10 +16,10 @@
package android.text.method;
-import android.view.KeyEvent;
-import android.view.KeyCharacterMap.KeyData;
import android.text.InputType;
import android.text.Spannable;
+import android.view.KeyCharacterMap.KeyData;
+import android.view.KeyEvent;
/**
* For dialing-only text entry
@@ -47,7 +47,7 @@ public class DialerKeyListener extends NumberKeyListener
public int getInputType() {
return InputType.TYPE_CLASS_PHONE;
}
-
+
/**
* Overrides the superclass's lookup method to prefer the number field
* from the KeyEvent.
diff --git a/core/java/android/text/method/DigitsKeyListener.java b/core/java/android/text/method/DigitsKeyListener.java
index c95df46810b1..4aeb39a4876d 100644
--- a/core/java/android/text/method/DigitsKeyListener.java
+++ b/core/java/android/text/method/DigitsKeyListener.java
@@ -17,8 +17,8 @@
package android.text.method;
import android.text.InputType;
-import android.text.Spanned;
import android.text.SpannableStringBuilder;
+import android.text.Spanned;
import android.view.KeyEvent;
@@ -133,7 +133,7 @@ public class DigitsKeyListener extends NumberKeyListener
}
return contentType;
}
-
+
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
diff --git a/core/java/android/text/method/MetaKeyKeyListener.java b/core/java/android/text/method/MetaKeyKeyListener.java
index e9db5fde77ed..c3c7302ce090 100644
--- a/core/java/android/text/method/MetaKeyKeyListener.java
+++ b/core/java/android/text/method/MetaKeyKeyListener.java
@@ -20,9 +20,9 @@ import android.text.Editable;
import android.text.NoCopySpan;
import android.text.Spannable;
import android.text.Spanned;
+import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.View;
-import android.view.KeyCharacterMap;
/**
* This base class encapsulates the behavior for tracking the state of
@@ -86,7 +86,7 @@ public abstract class MetaKeyKeyListener {
* Value equals {@link KeyEvent#META_SYM_ON}.
*/
public static final int META_SYM_ON = KeyEvent.META_SYM_ON;
-
+
/**
* Flag that indicates that the SHIFT key is locked in CAPS mode.
*/
@@ -111,11 +111,11 @@ public abstract class MetaKeyKeyListener {
private static final long META_CAP_USED = 1L << 32;
private static final long META_ALT_USED = 1L << 33;
private static final long META_SYM_USED = 1L << 34;
-
+
private static final long META_CAP_PRESSED = 1L << 40;
private static final long META_ALT_PRESSED = 1L << 41;
private static final long META_SYM_PRESSED = 1L << 42;
-
+
private static final long META_CAP_RELEASED = 1L << 48;
private static final long META_ALT_RELEASED = 1L << 49;
private static final long META_SYM_RELEASED = 1L << 50;
@@ -129,7 +129,7 @@ public abstract class MetaKeyKeyListener {
private static final long META_SYM_MASK = META_SYM_ON
| META_SYM_LOCKED | META_SYM_USED
| META_SYM_PRESSED | META_SYM_RELEASED;
-
+
private static final Object CAP = new NoCopySpan.Concrete();
private static final Object ALT = new NoCopySpan.Concrete();
private static final Object SYM = new NoCopySpan.Concrete();
@@ -150,7 +150,7 @@ public abstract class MetaKeyKeyListener {
/**
* Gets the state of the meta keys.
- *
+ *
* @param text the buffer in which the meta key would have been pressed.
*
* @return an integer in which each bit set to one represents a pressed
@@ -448,7 +448,7 @@ public abstract class MetaKeyKeyListener {
/**
* Gets the state of the meta keys.
- *
+ *
* @param state the current meta state bits.
*
* @return an integer in which each bit set to one represents a pressed
@@ -635,26 +635,26 @@ public abstract class MetaKeyKeyListener {
/**
* The meta key has been pressed but has not yet been used.
*/
- private static final int PRESSED =
+ private static final int PRESSED =
Spannable.SPAN_MARK_MARK | (1 << Spannable.SPAN_USER_SHIFT);
/**
* The meta key has been pressed and released but has still
* not yet been used.
*/
- private static final int RELEASED =
+ private static final int RELEASED =
Spannable.SPAN_MARK_MARK | (2 << Spannable.SPAN_USER_SHIFT);
/**
* The meta key has been pressed and used but has not yet been released.
*/
- private static final int USED =
+ private static final int USED =
Spannable.SPAN_MARK_MARK | (3 << Spannable.SPAN_USER_SHIFT);
/**
* The meta key has been pressed and released without use, and then
* pressed again; it may also have been released again.
*/
- private static final int LOCKED =
+ private static final int LOCKED =
Spannable.SPAN_MARK_MARK | (4 << Spannable.SPAN_USER_SHIFT);
}
diff --git a/core/java/android/text/method/MovementMethod.java b/core/java/android/text/method/MovementMethod.java
index 01979fdb5cd4..f6fe575a9265 100644
--- a/core/java/android/text/method/MovementMethod.java
+++ b/core/java/android/text/method/MovementMethod.java
@@ -16,10 +16,10 @@
package android.text.method;
-import android.widget.TextView;
+import android.text.Spannable;
import android.view.KeyEvent;
import android.view.MotionEvent;
-import android.text.*;
+import android.widget.TextView;
/**
* Provides cursor positioning, scrolling and text selection functionality in a {@link TextView}.
diff --git a/core/java/android/text/method/MultiTapKeyListener.java b/core/java/android/text/method/MultiTapKeyListener.java
index 95ac0a154e5c..5770482b3feb 100644
--- a/core/java/android/text/method/MultiTapKeyListener.java
+++ b/core/java/android/text/method/MultiTapKeyListener.java
@@ -16,13 +16,16 @@
package android.text.method;
-import android.view.KeyEvent;
-import android.view.View;
import android.os.Handler;
import android.os.SystemClock;
-import android.text.*;
+import android.text.Editable;
+import android.text.Selection;
+import android.text.SpanWatcher;
+import android.text.Spannable;
import android.text.method.TextKeyListener.Capitalize;
import android.util.SparseArray;
+import android.view.KeyEvent;
+import android.view.View;
/**
* This is the standard key listener for alphabetic input on 12-key
@@ -81,7 +84,7 @@ public class MultiTapKeyListener extends BaseKeyListener
public int getInputType() {
return makeTextContentType(mCapitalize, mAutoText);
}
-
+
public boolean onKeyDown(View view, Editable content,
int keyCode, KeyEvent event) {
int selStart, selEnd;
@@ -198,7 +201,7 @@ public class MultiTapKeyListener extends BaseKeyListener
if (selEnd != oldStart) {
Selection.setSelection(content, oldStart, selEnd);
- content.setSpan(TextKeyListener.LAST_TYPED,
+ content.setSpan(TextKeyListener.LAST_TYPED,
oldStart, selEnd,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
diff --git a/core/java/android/text/method/NumberKeyListener.java b/core/java/android/text/method/NumberKeyListener.java
index 988d566f5a7e..6b12b7e83c66 100644
--- a/core/java/android/text/method/NumberKeyListener.java
+++ b/core/java/android/text/method/NumberKeyListener.java
@@ -16,14 +16,14 @@
package android.text.method;
-import android.view.KeyEvent;
-import android.view.View;
import android.text.Editable;
import android.text.InputFilter;
import android.text.Selection;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
+import android.view.KeyEvent;
+import android.view.View;
/**
* For numeric text entry
@@ -91,7 +91,7 @@ public abstract class NumberKeyListener extends BaseKeyListener
return false;
}
-
+
@Override
public boolean onKeyDown(View view, Editable content,
int keyCode, KeyEvent event) {
diff --git a/core/java/android/text/method/PasswordTransformationMethod.java b/core/java/android/text/method/PasswordTransformationMethod.java
index 88a69b93f959..4485e3856619 100644
--- a/core/java/android/text/method/PasswordTransformationMethod.java
+++ b/core/java/android/text/method/PasswordTransformationMethod.java
@@ -16,18 +16,18 @@
package android.text.method;
+import android.graphics.Rect;
import android.os.Handler;
import android.os.SystemClock;
-import android.graphics.Rect;
-import android.view.View;
import android.text.Editable;
import android.text.GetChars;
import android.text.NoCopySpan;
+import android.text.Spannable;
+import android.text.Spanned;
import android.text.TextUtils;
import android.text.TextWatcher;
-import android.text.Spanned;
-import android.text.Spannable;
import android.text.style.UpdateLayout;
+import android.view.View;
import java.lang.ref.WeakReference;
diff --git a/core/java/android/text/method/QwertyKeyListener.java b/core/java/android/text/method/QwertyKeyListener.java
index b17f5021f59f..bea68b12062d 100644
--- a/core/java/android/text/method/QwertyKeyListener.java
+++ b/core/java/android/text/method/QwertyKeyListener.java
@@ -16,7 +16,12 @@
package android.text.method;
-import android.text.*;
+import android.text.AutoText;
+import android.text.Editable;
+import android.text.NoCopySpan;
+import android.text.Selection;
+import android.text.Spannable;
+import android.text.TextUtils;
import android.text.method.TextKeyListener.Capitalize;
import android.util.SparseArray;
import android.view.KeyCharacterMap;
@@ -80,7 +85,7 @@ public class QwertyKeyListener extends BaseKeyListener {
public int getInputType() {
return makeTextContentType(mAutoCap, mAutoText);
}
-
+
public boolean onKeyDown(View view, Editable content,
int keyCode, KeyEvent event) {
int selStart, selEnd;
@@ -191,9 +196,9 @@ public class QwertyKeyListener extends BaseKeyListener {
}
}
- if ((pref & TextKeyListener.AUTO_CAP) != 0 &&
- Character.isLowerCase(i) &&
- TextKeyListener.shouldCap(mAutoCap, content, selStart)) {
+ if ((pref & TextKeyListener.AUTO_CAP) != 0
+ && Character.isLowerCase(i)
+ && TextKeyListener.shouldCap(mAutoCap, content, selStart)) {
int where = content.getSpanEnd(TextKeyListener.CAPPED);
int flags = content.getSpanFlags(TextKeyListener.CAPPED);
@@ -361,9 +366,9 @@ public class QwertyKeyListener extends BaseKeyListener {
View view) {
int len = end - start;
boolean changecase = false;
-
+
String replacement = AutoText.get(src, start, end, view);
-
+
if (replacement == null) {
String key = TextUtils.substring(src, start, end).toLowerCase();
replacement = AutoText.get(key, 0, end - start, view);
@@ -372,7 +377,7 @@ public class QwertyKeyListener extends BaseKeyListener {
if (replacement == null)
return null;
}
-
+
int caps = 0;
if (changecase) {
diff --git a/core/java/android/text/method/ScrollingMovementMethod.java b/core/java/android/text/method/ScrollingMovementMethod.java
index b9f5d5f447e3..4f422cbf51cb 100644
--- a/core/java/android/text/method/ScrollingMovementMethod.java
+++ b/core/java/android/text/method/ScrollingMovementMethod.java
@@ -16,10 +16,11 @@
package android.text.method;
+import android.text.Layout;
+import android.text.Spannable;
import android.view.MotionEvent;
-import android.text.*;
-import android.widget.TextView;
import android.view.View;
+import android.widget.TextView;
/**
* A movement method that interprets movement keys by scrolling the text buffer.
diff --git a/core/java/android/text/method/TextKeyListener.java b/core/java/android/text/method/TextKeyListener.java
index 994f3d75cf43..9cbda9c07591 100644
--- a/core/java/android/text/method/TextKeyListener.java
+++ b/core/java/android/text/method/TextKeyListener.java
@@ -22,11 +22,16 @@ import android.database.ContentObserver;
import android.os.Handler;
import android.provider.Settings;
import android.provider.Settings.System;
-import android.text.*;
+import android.text.Editable;
+import android.text.InputType;
+import android.text.NoCopySpan;
+import android.text.Selection;
+import android.text.SpanWatcher;
+import android.text.Spannable;
+import android.text.TextUtils;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.View;
-import android.text.InputType;
import java.lang.ref.WeakReference;
@@ -127,7 +132,7 @@ public class TextKeyListener extends BaseKeyListener implements SpanWatcher {
public int getInputType() {
return makeTextContentType(mAutoCap, mAutoText);
}
-
+
@Override
public boolean onKeyDown(View view, Editable content,
int keyCode, KeyEvent event) {
@@ -213,7 +218,7 @@ public class TextKeyListener extends BaseKeyListener implements SpanWatcher {
public int getInputType() {
return InputType.TYPE_NULL;
}
-
+
public boolean onKeyDown(View view, Editable content,
int keyCode, KeyEvent event) {
return false;
@@ -230,7 +235,7 @@ public class TextKeyListener extends BaseKeyListener implements SpanWatcher {
public void clearMetaKeyState(View view, Editable content, int states) {
}
-
+
public static NullKeyListener getInstance() {
if (sInstance != null)
return sInstance;
diff --git a/core/java/android/text/method/TimeKeyListener.java b/core/java/android/text/method/TimeKeyListener.java
index c5bfd5cf95d7..01f40862ffb4 100644
--- a/core/java/android/text/method/TimeKeyListener.java
+++ b/core/java/android/text/method/TimeKeyListener.java
@@ -16,8 +16,8 @@
package android.text.method;
-import android.view.KeyEvent;
import android.text.InputType;
+import android.view.KeyEvent;
/**
* For entering times in a text field.
@@ -32,7 +32,7 @@ public class TimeKeyListener extends NumberKeyListener
return InputType.TYPE_CLASS_DATETIME
| InputType.TYPE_DATETIME_VARIATION_TIME;
}
-
+
@Override
protected char[] getAcceptedChars()
{
diff --git a/core/java/android/text/method/WordIterator.java b/core/java/android/text/method/WordIterator.java
index 89ed08cbcd59..17938a8cf7f3 100644
--- a/core/java/android/text/method/WordIterator.java
+++ b/core/java/android/text/method/WordIterator.java
@@ -18,8 +18,8 @@ package android.text.method;
import android.annotation.NonNull;
import android.icu.text.BreakIterator;
-import android.text.Selection;
import android.text.CharSequenceCharacterIterator;
+import android.text.Selection;
import java.util.Locale;
diff --git a/core/java/android/text/style/DrawableMarginSpan.java b/core/java/android/text/style/DrawableMarginSpan.java
index 20b6886facf0..35241796c3c3 100644
--- a/core/java/android/text/style/DrawableMarginSpan.java
+++ b/core/java/android/text/style/DrawableMarginSpan.java
@@ -16,11 +16,11 @@
package android.text.style;
-import android.graphics.drawable.Drawable;
-import android.graphics.Paint;
import android.graphics.Canvas;
-import android.text.Spanned;
+import android.graphics.Paint;
+import android.graphics.drawable.Drawable;
import android.text.Layout;
+import android.text.Spanned;
public class DrawableMarginSpan
implements LeadingMarginSpan, LineHeightSpan
diff --git a/core/java/android/text/style/IconMarginSpan.java b/core/java/android/text/style/IconMarginSpan.java
index cf9a70595715..304c83f19f02 100644
--- a/core/java/android/text/style/IconMarginSpan.java
+++ b/core/java/android/text/style/IconMarginSpan.java
@@ -16,11 +16,11 @@
package android.text.style;
-import android.graphics.Paint;
import android.graphics.Bitmap;
import android.graphics.Canvas;
-import android.text.Spanned;
+import android.graphics.Paint;
import android.text.Layout;
+import android.text.Spanned;
public class IconMarginSpan
implements LeadingMarginSpan, LineHeightSpan
diff --git a/core/java/android/text/style/LeadingMarginSpan.java b/core/java/android/text/style/LeadingMarginSpan.java
index 339d88524541..5bd2d60bb34f 100644
--- a/core/java/android/text/style/LeadingMarginSpan.java
+++ b/core/java/android/text/style/LeadingMarginSpan.java
@@ -16,8 +16,8 @@
package android.text.style;
-import android.graphics.Paint;
import android.graphics.Canvas;
+import android.graphics.Paint;
import android.os.Parcel;
import android.text.Layout;
import android.text.ParcelableSpan;
@@ -39,7 +39,7 @@ extends ParagraphStyle
* Returns the amount by which to adjust the leading margin. Positive values
* move away from the leading edge of the paragraph, negative values move
* towards it.
- *
+ *
* @param first true if the request is for the first line of a paragraph,
* false for subsequent lines
* @return the offset for the margin.
@@ -49,7 +49,7 @@ extends ParagraphStyle
/**
* Renders the leading margin. This is called before the margin has been
* adjusted by the value returned by {@link #getLeadingMargin(boolean)}.
- *
+ *
* @param c the canvas
* @param p the paint. The this should be left unchanged on exit.
* @param x the current position of the margin
@@ -98,11 +98,11 @@ extends ParagraphStyle
*/
public static class Standard implements LeadingMarginSpan, ParcelableSpan {
private final int mFirst, mRest;
-
+
/**
* Constructor taking separate indents for the first and subsequent
* lines.
- *
+ *
* @param first the indent for the first line of the paragraph
* @param rest the indent for the remaining lines of the paragraph
*/
@@ -123,7 +123,7 @@ extends ParagraphStyle
mFirst = src.readInt();
mRest = src.readInt();
}
-
+
public int getSpanTypeId() {
return getSpanTypeIdInternal();
}
@@ -132,7 +132,7 @@ extends ParagraphStyle
public int getSpanTypeIdInternal() {
return TextUtils.LEADING_MARGIN_SPAN;
}
-
+
public int describeContents() {
return 0;
}
diff --git a/core/java/android/text/style/LineBackgroundSpan.java b/core/java/android/text/style/LineBackgroundSpan.java
index 854aeafb9251..9c7859fb11e4 100644
--- a/core/java/android/text/style/LineBackgroundSpan.java
+++ b/core/java/android/text/style/LineBackgroundSpan.java
@@ -16,8 +16,8 @@
package android.text.style;
-import android.graphics.Paint;
import android.graphics.Canvas;
+import android.graphics.Paint;
public interface LineBackgroundSpan
extends ParagraphStyle
diff --git a/core/java/android/text/style/LocaleSpan.java b/core/java/android/text/style/LocaleSpan.java
index b8428517748f..479ff0e902b2 100644
--- a/core/java/android/text/style/LocaleSpan.java
+++ b/core/java/android/text/style/LocaleSpan.java
@@ -16,8 +16,6 @@
package android.text.style;
-import com.android.internal.util.Preconditions;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.graphics.Paint;
@@ -27,6 +25,8 @@ import android.text.ParcelableSpan;
import android.text.TextPaint;
import android.text.TextUtils;
+import com.android.internal.util.Preconditions;
+
import java.util.Locale;
/**
diff --git a/core/java/android/text/style/QuoteSpan.java b/core/java/android/text/style/QuoteSpan.java
index 0b0a82cabc45..7217e1e5efa8 100644
--- a/core/java/android/text/style/QuoteSpan.java
+++ b/core/java/android/text/style/QuoteSpan.java
@@ -17,8 +17,8 @@
package android.text.style;
import android.annotation.ColorInt;
-import android.graphics.Paint;
import android.graphics.Canvas;
+import android.graphics.Paint;
import android.os.Parcel;
import android.text.Layout;
import android.text.ParcelableSpan;
@@ -34,7 +34,7 @@ public class QuoteSpan implements LeadingMarginSpan, ParcelableSpan {
super();
mColor = 0xff0000ff;
}
-
+
public QuoteSpan(@ColorInt int color) {
super();
mColor = color;
@@ -43,7 +43,7 @@ public class QuoteSpan implements LeadingMarginSpan, ParcelableSpan {
public QuoteSpan(Parcel src) {
mColor = src.readInt();
}
-
+
public int getSpanTypeId() {
return getSpanTypeIdInternal();
}
@@ -52,7 +52,7 @@ public class QuoteSpan implements LeadingMarginSpan, ParcelableSpan {
public int getSpanTypeIdInternal() {
return TextUtils.QUOTE_SPAN;
}
-
+
public int describeContents() {
return 0;
}
@@ -70,7 +70,7 @@ public class QuoteSpan implements LeadingMarginSpan, ParcelableSpan {
public int getColor() {
return mColor;
}
-
+
public int getLeadingMargin(boolean first) {
return STRIPE_WIDTH + GAP_WIDTH;
}
diff --git a/core/java/android/text/style/ReplacementSpan.java b/core/java/android/text/style/ReplacementSpan.java
index 07190b2f1d6a..5f94ad054b63 100644
--- a/core/java/android/text/style/ReplacementSpan.java
+++ b/core/java/android/text/style/ReplacementSpan.java
@@ -19,8 +19,8 @@ package android.text.style;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.graphics.Paint;
import android.graphics.Canvas;
+import android.graphics.Paint;
import android.text.TextPaint;
public abstract class ReplacementSpan extends MetricAffectingSpan {
diff --git a/core/java/android/text/style/TtsSpan.java b/core/java/android/text/style/TtsSpan.java
index e9153ddba831..c5e5df091592 100644
--- a/core/java/android/text/style/TtsSpan.java
+++ b/core/java/android/text/style/TtsSpan.java
@@ -16,14 +16,14 @@
package android.text.style;
-import java.text.NumberFormat;
-import java.util.Locale;
-
import android.os.Parcel;
import android.os.PersistableBundle;
import android.text.ParcelableSpan;
import android.text.TextUtils;
+import java.text.NumberFormat;
+import java.util.Locale;
+
/**
* A span that supplies additional meta-data for the associated text intended
* for text-to-speech engines. If the text is being processed by a
diff --git a/core/java/android/text/util/Linkify.java b/core/java/android/text/util/Linkify.java
index ca037a229b0a..7e6eb4906c20 100644
--- a/core/java/android/text/util/Linkify.java
+++ b/core/java/android/text/util/Linkify.java
@@ -20,16 +20,21 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.telephony.PhoneNumberUtils;
-import android.text.method.LinkMovementMethod;
-import android.text.method.MovementMethod;
-import android.text.style.URLSpan;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
+import android.text.method.LinkMovementMethod;
+import android.text.method.MovementMethod;
+import android.text.style.URLSpan;
import android.util.Patterns;
import android.webkit.WebView;
import android.widget.TextView;
+import com.android.i18n.phonenumbers.PhoneNumberMatch;
+import com.android.i18n.phonenumbers.PhoneNumberUtil;
+import com.android.i18n.phonenumbers.PhoneNumberUtil.Leniency;
+
+import libcore.util.EmptyArray;
import java.io.UnsupportedEncodingException;
import java.lang.annotation.Retention;
@@ -42,12 +47,6 @@ import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import com.android.i18n.phonenumbers.PhoneNumberMatch;
-import com.android.i18n.phonenumbers.PhoneNumberUtil;
-import com.android.i18n.phonenumbers.PhoneNumberUtil.Leniency;
-
-import libcore.util.EmptyArray;
-
/**
* Linkify take a piece of text and a regular expression and turns all of the
* regex matches in the text into clickable links. This is particularly
diff --git a/core/java/android/transition/ChangeBounds.java b/core/java/android/transition/ChangeBounds.java
index a95da976d115..b6d8aa449533 100644
--- a/core/java/android/transition/ChangeBounds.java
+++ b/core/java/android/transition/ChangeBounds.java
@@ -16,19 +16,18 @@
package android.transition;
-import android.animation.AnimatorSet;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.PointF;
-
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.RectEvaluator;
+import android.content.Context;
+import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Path;
+import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
diff --git a/core/java/android/transition/ChangeScroll.java b/core/java/android/transition/ChangeScroll.java
index e09268553a18..8a3fd1c34daa 100644
--- a/core/java/android/transition/ChangeScroll.java
+++ b/core/java/android/transition/ChangeScroll.java
@@ -19,8 +19,6 @@ package android.transition;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.content.Context;
-import android.transition.Transition;
-import android.transition.TransitionValues;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
diff --git a/core/java/android/transition/ChangeTransform.java b/core/java/android/transition/ChangeTransform.java
index 974912167205..4b0b065ad6b1 100644
--- a/core/java/android/transition/ChangeTransform.java
+++ b/core/java/android/transition/ChangeTransform.java
@@ -30,6 +30,7 @@ import android.util.Property;
import android.view.GhostView;
import android.view.View;
import android.view.ViewGroup;
+
import com.android.internal.R;
/**
diff --git a/core/java/android/transition/Explode.java b/core/java/android/transition/Explode.java
index 3445ef2fbbaa..5f078ca53fec 100644
--- a/core/java/android/transition/Explode.java
+++ b/core/java/android/transition/Explode.java
@@ -15,8 +15,6 @@
*/
package android.transition;
-import com.android.internal.R;
-
import android.animation.Animator;
import android.animation.TimeInterpolator;
import android.content.Context;
@@ -26,6 +24,8 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
+
+import com.android.internal.R;
/**
* This transition tracks changes to the visibility of target views in the
* start and end scenes and moves views in or out from the edges of the
diff --git a/core/java/android/transition/PatternPathMotion.java b/core/java/android/transition/PatternPathMotion.java
index f23863f8851f..7a2c191be0dd 100644
--- a/core/java/android/transition/PatternPathMotion.java
+++ b/core/java/android/transition/PatternPathMotion.java
@@ -15,8 +15,6 @@
*/
package android.transition;
-import com.android.internal.R;
-
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Matrix;
@@ -25,6 +23,8 @@ import android.graphics.PathMeasure;
import android.util.AttributeSet;
import android.util.PathParser;
+import com.android.internal.R;
+
/**
* A PathMotion that takes a Path pattern and applies it to the separation between two points.
* The starting point of the Path will be moved to the origin and the end point will be scaled
diff --git a/core/java/android/transition/Slide.java b/core/java/android/transition/Slide.java
index 2645f861a5ad..9cf321014ff8 100644
--- a/core/java/android/transition/Slide.java
+++ b/core/java/android/transition/Slide.java
@@ -26,6 +26,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
+
import com.android.internal.R;
import java.lang.annotation.Retention;
diff --git a/core/java/android/transition/TransitionInflater.java b/core/java/android/transition/TransitionInflater.java
index cbf76bc3dc4b..4c5a71764728 100644
--- a/core/java/android/transition/TransitionInflater.java
+++ b/core/java/android/transition/TransitionInflater.java
@@ -17,11 +17,6 @@
package android.transition;
import android.annotation.TransitionRes;
-import com.android.internal.R;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
@@ -32,6 +27,11 @@ import android.util.Xml;
import android.view.InflateException;
import android.view.ViewGroup;
+import com.android.internal.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
diff --git a/core/java/android/transition/TranslationAnimationCreator.java b/core/java/android/transition/TranslationAnimationCreator.java
index b07f3f87b1e6..ae76e6254f6b 100644
--- a/core/java/android/transition/TranslationAnimationCreator.java
+++ b/core/java/android/transition/TranslationAnimationCreator.java
@@ -15,8 +15,6 @@
*/
package android.transition;
-import com.android.internal.R;
-
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
@@ -25,6 +23,8 @@ import android.graphics.Path;
import android.transition.Transition.TransitionListener;
import android.view.View;
+import com.android.internal.R;
+
/**
* This class is used by Slide and Explode to create an animator that goes from the start
* position to the end position. It takes into account the canceled position so that it
diff --git a/core/java/android/util/LocalLog.java b/core/java/android/util/LocalLog.java
index 39f66a5f18fc..665c583a56ab 100644
--- a/core/java/android/util/LocalLog.java
+++ b/core/java/android/util/LocalLog.java
@@ -20,44 +20,49 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.Iterator;
-import java.util.LinkedList;
+import java.util.Deque;
+import java.util.ArrayDeque;
/**
* @hide
*/
public final class LocalLog {
- private LinkedList<String> mLog;
- private int mMaxLines;
- private long mNow;
+ private final Deque<String> mLog;
+ private final int mMaxLines;
public LocalLog(int maxLines) {
- mLog = new LinkedList<String>();
- mMaxLines = maxLines;
+ mMaxLines = Math.max(0, maxLines);
+ mLog = new ArrayDeque<>(mMaxLines);
}
- public synchronized void log(String msg) {
- if (mMaxLines > 0) {
- mNow = System.currentTimeMillis();
- StringBuilder sb = new StringBuilder();
- Calendar c = Calendar.getInstance();
- c.setTimeInMillis(mNow);
- sb.append(String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c));
- mLog.add(sb.toString() + " - " + msg);
- while (mLog.size() > mMaxLines) mLog.remove();
+ public void log(String msg) {
+ if (mMaxLines <= 0) {
+ return;
}
+ Calendar c = Calendar.getInstance();
+ c.setTimeInMillis(System.currentTimeMillis());
+ append(String.format("%tm-%td %tH:%tM:%tS.%tL - %s", c, c, c, c, c, c, msg));
+ }
+
+ private synchronized void append(String logLine) {
+ while (mLog.size() >= mMaxLines) {
+ mLog.remove();
+ }
+ mLog.add(logLine);
}
public synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- Iterator<String> itr = mLog.listIterator(0);
+ Iterator<String> itr = mLog.iterator();
while (itr.hasNext()) {
pw.println(itr.next());
}
}
public synchronized void reverseDump(FileDescriptor fd, PrintWriter pw, String[] args) {
- for (int i = mLog.size() - 1; i >= 0; i--) {
- pw.println(mLog.get(i));
+ Iterator<String> itr = mLog.descendingIterator();
+ while (itr.hasNext()) {
+ pw.println(itr.next());
}
}
@@ -69,6 +74,9 @@ public final class LocalLog {
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
mLog.dump(fd, pw, args);
}
+ public void reverseDump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ mLog.reverseDump(fd, pw, args);
+ }
}
public ReadOnlyLocalLog readOnlyLocalLog() {
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 85a4bf9d9e8f..3beb00fc8d9e 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -16,11 +16,11 @@
package android.view;
+import static android.Manifest.permission.CONFIGURE_DISPLAY_COLOR_MODE;
+
import android.annotation.IntDef;
import android.annotation.RequiresPermission;
-import android.content.Context;
import android.content.res.CompatibilityInfo;
-import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
@@ -36,8 +36,6 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
-import static android.Manifest.permission.CONFIGURE_DISPLAY_COLOR_MODE;
-
/**
* Provides information about the size and density of a logical display.
* <p>
diff --git a/core/java/android/view/DisplayEventReceiver.java b/core/java/android/view/DisplayEventReceiver.java
index 4393992b3245..67cdfc53fb39 100644
--- a/core/java/android/view/DisplayEventReceiver.java
+++ b/core/java/android/view/DisplayEventReceiver.java
@@ -16,13 +16,13 @@
package android.view;
-import dalvik.annotation.optimization.FastNative;
-import dalvik.system.CloseGuard;
-
import android.os.Looper;
import android.os.MessageQueue;
import android.util.Log;
+import dalvik.annotation.optimization.FastNative;
+import dalvik.system.CloseGuard;
+
import java.lang.ref.WeakReference;
/**
diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java
index bc40849a47bc..1aef6ec0f302 100644
--- a/core/java/android/view/DisplayInfo.java
+++ b/core/java/android/view/DisplayInfo.java
@@ -23,10 +23,10 @@ import android.os.Parcelable;
import android.util.ArraySet;
import android.util.DisplayMetrics;
-import java.util.Arrays;
-
import libcore.util.Objects;
+import java.util.Arrays;
+
/**
* Describes the characteristics of a particular logical display.
* @hide
diff --git a/core/java/android/view/FallbackEventHandler.java b/core/java/android/view/FallbackEventHandler.java
index dd68d8966eb8..8e00d6da7ea7 100644
--- a/core/java/android/view/FallbackEventHandler.java
+++ b/core/java/android/view/FallbackEventHandler.java
@@ -24,4 +24,3 @@ public interface FallbackEventHandler {
public void preDispatchKeyEvent(KeyEvent event);
public boolean dispatchKeyEvent(KeyEvent event);
}
-
diff --git a/core/java/android/view/FrameMetrics.java b/core/java/android/view/FrameMetrics.java
index 2b938d0df7eb..800a63f7da07 100644
--- a/core/java/android/view/FrameMetrics.java
+++ b/core/java/android/view/FrameMetrics.java
@@ -17,7 +17,6 @@
package android.view;
import android.annotation.IntDef;
-import android.view.Window;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/core/java/android/view/FrameMetricsObserver.java b/core/java/android/view/FrameMetricsObserver.java
index 63313578cffe..9e81de0e09bb 100644
--- a/core/java/android/view/FrameMetricsObserver.java
+++ b/core/java/android/view/FrameMetricsObserver.java
@@ -17,15 +17,12 @@
package android.view;
import android.annotation.NonNull;
-import android.util.Log;
import android.os.Looper;
import android.os.MessageQueue;
import com.android.internal.util.VirtualRefBasePtr;
-import java.lang.NullPointerException;
import java.lang.ref.WeakReference;
-import java.lang.SuppressWarnings;
/**
* Provides streaming access to frame stats information from the rendering
diff --git a/core/java/android/view/HandlerActionQueue.java b/core/java/android/view/HandlerActionQueue.java
index 4758a3408dc2..d016a7444082 100644
--- a/core/java/android/view/HandlerActionQueue.java
+++ b/core/java/android/view/HandlerActionQueue.java
@@ -16,11 +16,9 @@
package android.view;
-import com.android.internal.util.GrowingArrayUtils;
-
import android.os.Handler;
-import java.util.ArrayList;
+import com.android.internal.util.GrowingArrayUtils;
/**
* Class used to enqueue pending work from Views when no Handler is attached.
diff --git a/core/java/android/view/IAssetAtlas.aidl b/core/java/android/view/IAssetAtlas.aidl
deleted file mode 100644
index edce05970b9a..000000000000
--- a/core/java/android/view/IAssetAtlas.aidl
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Copyright (c) 2013, 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.view;
-
-import android.view.GraphicBuffer;
-
-/**
- * Programming interface to the system assets atlas. This atlas, when
- * present, holds preloaded drawable in a single, shareable graphics
- * buffer. This allows multiple processes to share the same data to
- * save up on memory.
- *
- * @hide
- */
-interface IAssetAtlas {
- /**
- * Indicates whether the atlas is compatible with the specified
- * parent process id. If the atlas' ppid does not match, this
- * method will return false.
- */
- boolean isCompatible(int ppid);
-
- /**
- * Returns the atlas buffer (texture) or null if the atlas is
- * not available yet.
- */
- GraphicBuffer getBuffer();
-
- /**
- * Returns the map of the bitmaps stored in the atlas or null
- * if the atlas is not available yet.
- *
- * Each bitmap is represented by several entries in the array:
- * long0: SkBitmap*, the native bitmap object
- * long1: x position
- * long2: y position
- * long3: rotated, 1 if the bitmap must be rotated, 0 otherwise
- */
- long[] getMap();
-}
diff --git a/core/java/android/view/InputDevice.java b/core/java/android/view/InputDevice.java
index f8796c31fe93..55f64d9f6664 100644
--- a/core/java/android/view/InputDevice.java
+++ b/core/java/android/view/InputDevice.java
@@ -19,10 +19,10 @@ package android.view;
import android.content.Context;
import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager;
+import android.os.NullVibrator;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Vibrator;
-import android.os.NullVibrator;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/java/android/view/InputEventReceiver.java b/core/java/android/view/InputEventReceiver.java
index 91ef50d76180..20ab539f52d2 100644
--- a/core/java/android/view/InputEventReceiver.java
+++ b/core/java/android/view/InputEventReceiver.java
@@ -16,13 +16,13 @@
package android.view;
-import dalvik.system.CloseGuard;
-
import android.os.Looper;
import android.os.MessageQueue;
import android.util.Log;
import android.util.SparseIntArray;
+import dalvik.system.CloseGuard;
+
import java.lang.ref.WeakReference;
/**
diff --git a/core/java/android/view/InputEventSender.java b/core/java/android/view/InputEventSender.java
index 304ea3f8bd2b..b25fb65b654c 100644
--- a/core/java/android/view/InputEventSender.java
+++ b/core/java/android/view/InputEventSender.java
@@ -16,12 +16,12 @@
package android.view;
-import dalvik.system.CloseGuard;
-
import android.os.Looper;
import android.os.MessageQueue;
import android.util.Log;
+import dalvik.system.CloseGuard;
+
import java.lang.ref.WeakReference;
/**
diff --git a/core/java/android/view/InputFilter.java b/core/java/android/view/InputFilter.java
index 4aba30ca483e..d0dab4000fff 100644
--- a/core/java/android/view/InputFilter.java
+++ b/core/java/android/view/InputFilter.java
@@ -20,12 +20,6 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
-import android.view.IInputFilter;
-import android.view.InputEvent;
-import android.view.InputEventConsistencyVerifier;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.WindowManagerPolicy;
/**
* Filters input events before they are dispatched to the system.
diff --git a/core/java/android/view/InputQueue.java b/core/java/android/view/InputQueue.java
index aebc60152bf0..582ae79a743f 100644
--- a/core/java/android/view/InputQueue.java
+++ b/core/java/android/view/InputQueue.java
@@ -16,13 +16,13 @@
package android.view;
-import dalvik.system.CloseGuard;
-
import android.os.Looper;
import android.os.MessageQueue;
+import android.util.LongSparseArray;
import android.util.Pools.Pool;
import android.util.Pools.SimplePool;
-import android.util.LongSparseArray;
+
+import dalvik.system.CloseGuard;
import java.lang.ref.WeakReference;
diff --git a/core/java/android/view/KeyCharacterMap.java b/core/java/android/view/KeyCharacterMap.java
index c8b89e7ac607..88f2d3460346 100644
--- a/core/java/android/view/KeyCharacterMap.java
+++ b/core/java/android/view/KeyCharacterMap.java
@@ -16,14 +16,13 @@
package android.view;
+import android.hardware.input.InputManager;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.method.MetaKeyKeyListener;
import android.util.AndroidRuntimeException;
import android.util.SparseIntArray;
-import android.hardware.input.InputManager;
-import java.lang.Character;
import java.text.Normalizer;
/**
diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java
index b73acdaf6d8b..5d8f336ef193 100644
--- a/core/java/android/view/KeyEvent.java
+++ b/core/java/android/view/KeyEvent.java
@@ -21,7 +21,6 @@ import android.os.Parcelable;
import android.text.method.MetaKeyKeyListener;
import android.util.Log;
import android.util.SparseIntArray;
-import android.view.KeyCharacterMap;
import android.view.KeyCharacterMap.KeyData;
/**
diff --git a/core/java/android/view/KeyboardShortcutGroup.java b/core/java/android/view/KeyboardShortcutGroup.java
index 57d07c0d0eac..78f0b30e7e20 100644
--- a/core/java/android/view/KeyboardShortcutGroup.java
+++ b/core/java/android/view/KeyboardShortcutGroup.java
@@ -15,6 +15,8 @@
*/
package android.view;
+import static com.android.internal.util.Preconditions.checkNotNull;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Parcel;
@@ -24,8 +26,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import static com.android.internal.util.Preconditions.checkNotNull;
-
/**
* A group of {@link KeyboardShortcutInfo}.
*/
diff --git a/core/java/android/view/KeyboardShortcutInfo.java b/core/java/android/view/KeyboardShortcutInfo.java
index a9f2699a6bb1..c934a4e31f98 100644
--- a/core/java/android/view/KeyboardShortcutInfo.java
+++ b/core/java/android/view/KeyboardShortcutInfo.java
@@ -15,14 +15,15 @@
*/
package android.view;
+import static com.android.internal.util.Preconditions.checkArgument;
+
+import static java.lang.Character.MIN_VALUE;
+
import android.annotation.Nullable;
import android.graphics.drawable.Icon;
import android.os.Parcel;
import android.os.Parcelable;
-import static com.android.internal.util.Preconditions.checkArgument;
-import static java.lang.Character.MIN_VALUE;
-
/**
* Information about a Keyboard Shortcut.
*/
diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java
index 914bd5684b4a..e3ac40c5da4e 100644
--- a/core/java/android/view/LayoutInflater.java
+++ b/core/java/android/view/LayoutInflater.java
@@ -16,11 +16,6 @@
package android.view;
-import com.android.internal.R;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import android.annotation.LayoutRes;
import android.annotation.Nullable;
import android.content.Context;
@@ -37,6 +32,11 @@ import android.util.TypedValue;
import android.util.Xml;
import android.widget.FrameLayout;
+import com.android.internal.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.util.HashMap;
@@ -51,20 +51,20 @@ import java.util.HashMap;
*
* <pre>LayoutInflater inflater = (LayoutInflater)context.getSystemService
* (Context.LAYOUT_INFLATER_SERVICE);</pre>
- *
+ *
* <p>
* To create a new LayoutInflater with an additional {@link Factory} for your
* own views, you can use {@link #cloneInContext} to clone an existing
* ViewFactory, and then call {@link #setFactory} on it to include your
* Factory.
- *
+ *
* <p>
* For performance reasons, view inflation relies heavily on pre-processing of
* XML files that is done at build time. Therefore, it is not currently possible
* to use LayoutInflater with an XmlPullParser over a plain XML file at runtime;
* it only works with an XmlPullParser returned from a compiled resource
* (R.<em>something</em> file.)
- *
+ *
* @see Context#getSystemService
*/
public abstract class LayoutInflater {
@@ -95,7 +95,7 @@ public abstract class LayoutInflater {
private static final HashMap<String, Constructor<? extends View>> sConstructorMap =
new HashMap<String, Constructor<? extends View>>();
-
+
private HashMap<String, Boolean> mFilterMap;
private TypedValue mTempValue;
@@ -114,36 +114,36 @@ public abstract class LayoutInflater {
/**
* Hook to allow clients of the LayoutInflater to restrict the set of Views that are allowed
* to be inflated.
- *
+ *
*/
public interface Filter {
/**
- * Hook to allow clients of the LayoutInflater to restrict the set of Views
+ * Hook to allow clients of the LayoutInflater to restrict the set of Views
* that are allowed to be inflated.
- *
+ *
* @param clazz The class object for the View that is about to be inflated
- *
+ *
* @return True if this class is allowed to be inflated, or false otherwise
*/
@SuppressWarnings("unchecked")
boolean onLoadClass(Class clazz);
}
-
+
public interface Factory {
/**
* Hook you can supply that is called when inflating from a LayoutInflater.
* You can use this to customize the tag names available in your XML
* layout files.
- *
+ *
* <p>
* Note that it is good practice to prefix these custom names with your
* package (i.e., com.coolcompany.apps) to avoid conflicts with system
* names.
- *
+ *
* @param name Tag name to be inflated.
* @param context The context the view is being created in.
* @param attrs Inflation attributes as specified in XML file.
- *
+ *
* @return View Newly created view. Return null for the default
* behavior.
*/
@@ -171,14 +171,14 @@ public abstract class LayoutInflater {
private static class FactoryMerger implements Factory2 {
private final Factory mF1, mF2;
private final Factory2 mF12, mF22;
-
+
FactoryMerger(Factory f1, Factory2 f12, Factory f2, Factory2 f22) {
mF1 = f1;
mF2 = f2;
mF12 = f12;
mF22 = f22;
}
-
+
public View onCreateView(String name, Context context, AttributeSet attrs) {
View v = mF1.onCreateView(name, context, attrs);
if (v != null) return v;
@@ -193,13 +193,13 @@ public abstract class LayoutInflater {
: mF2.onCreateView(name, context, attrs);
}
}
-
+
/**
* Create a new LayoutInflater instance associated with a particular Context.
* Applications will almost always want to use
* {@link Context#getSystemService Context.getSystemService()} to retrieve
* the standard {@link Context#LAYOUT_INFLATER_SERVICE Context.INFLATER_SERVICE}.
- *
+ *
* @param context The Context in which this LayoutInflater will create its
* Views; most importantly, this supplies the theme from which the default
* values for their attributes are retrieved.
@@ -212,7 +212,7 @@ public abstract class LayoutInflater {
* Create a new LayoutInflater instance that is a copy of an existing
* LayoutInflater, optionally with its Context changed. For use in
* implementing {@link #cloneInContext}.
- *
+ *
* @param original The original LayoutInflater to copy.
* @param newContext The new Context to use.
*/
@@ -223,7 +223,7 @@ public abstract class LayoutInflater {
mPrivateFactory = original.mPrivateFactory;
setFilter(original.mFilter);
}
-
+
/**
* Obtains the LayoutInflater from the given context.
*/
@@ -241,15 +241,15 @@ public abstract class LayoutInflater {
* pointing to a different Context than the original. This is used by
* {@link ContextThemeWrapper} to create a new LayoutInflater to go along
* with the new Context theme.
- *
+ *
* @param newContext The new Context to associate with the new LayoutInflater.
* May be the same as the original Context if desired.
- *
+ *
* @return Returns a brand spanking new LayoutInflater object associated with
* the given Context.
*/
public abstract LayoutInflater cloneInContext(Context newContext);
-
+
/**
* Return the context we are running in, for access to resources, class
* loader, etc.
@@ -285,7 +285,7 @@ public abstract class LayoutInflater {
* called on each element name as the xml is parsed. If the factory returns
* a View, that is added to the hierarchy. If it returns null, the next
* factory default {@link #onCreateView} method is called.
- *
+ *
* <p>If you have an existing
* LayoutInflater and want to add your own factory to it, use
* {@link #cloneInContext} to clone the existing instance and then you
@@ -345,13 +345,13 @@ public abstract class LayoutInflater {
public Filter getFilter() {
return mFilter;
}
-
+
/**
* Sets the {@link Filter} to by this LayoutInflater. If a view is attempted to be inflated
* which is not allowed by the {@link Filter}, the {@link #inflate(int, ViewGroup)} call will
* throw an {@link InflateException}. This filter will replace any previous filter set on this
* LayoutInflater.
- *
+ *
* @param filter The Filter which restricts the set of Views that are allowed to be inflated.
* This filter will replace any previous filter set on this LayoutInflater.
*/
@@ -365,7 +365,7 @@ public abstract class LayoutInflater {
/**
* Inflate a new view hierarchy from the specified xml resource. Throws
* {@link InflateException} if there is an error.
- *
+ *
* @param resource ID for an XML layout resource to load (e.g.,
* <code>R.layout.main_page</code>)
* @param root Optional view to be the parent of the generated hierarchy.
@@ -385,7 +385,7 @@ public abstract class LayoutInflater {
* reasons, view inflation relies heavily on pre-processing of XML files
* that is done at build time. Therefore, it is not currently possible to
* use LayoutInflater with an XmlPullParser over a plain XML file at runtime.
- *
+ *
* @param parser XML dom node containing the description of the view
* hierarchy.
* @param root Optional view to be the parent of the generated hierarchy.
@@ -400,7 +400,7 @@ public abstract class LayoutInflater {
/**
* Inflate a new view hierarchy from the specified xml resource. Throws
* {@link InflateException} if there is an error.
- *
+ *
* @param resource ID for an XML layout resource to load (e.g.,
* <code>R.layout.main_page</code>)
* @param root Optional view to be the parent of the generated hierarchy (if
@@ -437,7 +437,7 @@ public abstract class LayoutInflater {
* reasons, view inflation relies heavily on pre-processing of XML files
* that is done at build time. Therefore, it is not currently possible to
* use LayoutInflater with an XmlPullParser over a plain XML file at runtime.
- *
+ *
* @param parser XML dom node containing the description of the view
* hierarchy.
* @param root Optional view to be the parent of the generated hierarchy (if
@@ -475,7 +475,7 @@ public abstract class LayoutInflater {
}
final String name = parser.getName();
-
+
if (DEBUG) {
System.out.println("**************************");
System.out.println("Creating root view: "
@@ -579,17 +579,17 @@ public abstract class LayoutInflater {
* Low-level function for instantiating a view by name. This attempts to
* instantiate a view class of the given <var>name</var> found in this
* LayoutInflater's ClassLoader.
- *
+ *
* <p>
* There are two things that can happen in an error case: either the
* exception describing the error will be thrown, or a null will be
* returned. You must deal with both possibilities -- the former will happen
* the first time createView() is called for a class of a particular name,
* the latter every time there-after for that class name.
- *
+ *
* @param name The full name of the class to be instantiated.
* @param attrs The XML attributes supplied for this instance.
- *
+ *
* @return View The newly instantiated view, or null.
*/
public final View createView(String name, String prefix, AttributeSet attrs)
@@ -608,7 +608,7 @@ public abstract class LayoutInflater {
// Class not found in the cache, see if it's real, and try to add it
clazz = mContext.getClassLoader().loadClass(
prefix != null ? (prefix + name) : name).asSubclass(View.class);
-
+
if (mFilter != null && clazz != null) {
boolean allowed = mFilter.onLoadClass(clazz);
if (!allowed) {
@@ -627,7 +627,7 @@ public abstract class LayoutInflater {
// New class -- remember whether it is allowed
clazz = mContext.getClassLoader().loadClass(
prefix != null ? (prefix + name) : name).asSubclass(View.class);
-
+
boolean allowed = clazz != null && mFilter.onLoadClass(clazz);
mFilterMap.put(name, allowed);
if (!allowed) {
@@ -689,10 +689,10 @@ public abstract class LayoutInflater {
* given the xml element name. Override it to handle custom view objects. If
* you override this in your subclass be sure to call through to
* super.onCreateView(name) for names you do not recognize.
- *
+ *
* @param name The fully qualified class name of the View to be create.
* @param attrs An AttributeSet of attributes to apply to the View.
- *
+ *
* @return View The View created.
*/
protected View onCreateView(String name, AttributeSet attrs)
@@ -842,7 +842,7 @@ public abstract class LayoutInflater {
}
final String name = parser.getName();
-
+
if (TAG_REQUEST_FOCUS.equals(name)) {
parseRequestFocus(parser, parent);
} else if (TAG_TAG.equals(name)) {
diff --git a/core/java/android/view/MenuInflater.java b/core/java/android/view/MenuInflater.java
index 1c67ba74184e..73ea9ee31bce 100644
--- a/core/java/android/view/MenuInflater.java
+++ b/core/java/android/view/MenuInflater.java
@@ -16,11 +16,6 @@
package android.view;
-import com.android.internal.view.menu.MenuItemImpl;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import android.annotation.MenuRes;
import android.app.Activity;
import android.content.Context;
@@ -31,6 +26,11 @@ import android.util.AttributeSet;
import android.util.Log;
import android.util.Xml;
+import com.android.internal.view.menu.MenuItemImpl;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
@@ -49,15 +49,15 @@ public class MenuInflater {
/** Menu tag name in XML. */
private static final String XML_MENU = "menu";
-
+
/** Group tag name in XML. */
private static final String XML_GROUP = "group";
-
+
/** Item tag name in XML. */
private static final String XML_ITEM = "item";
private static final int NO_ID = 0;
-
+
private static final Class<?>[] ACTION_VIEW_CONSTRUCTOR_SIGNATURE = new Class[] {Context.class};
private static final Class<?>[] ACTION_PROVIDER_CONSTRUCTOR_SIGNATURE = ACTION_VIEW_CONSTRUCTOR_SIGNATURE;
@@ -71,7 +71,7 @@ public class MenuInflater {
/**
* Constructs a menu inflater.
- *
+ *
* @see Activity#getMenuInflater()
*/
public MenuInflater(Context context) {
@@ -96,7 +96,7 @@ public class MenuInflater {
/**
* Inflate a menu hierarchy from the specified XML resource. Throws
* {@link InflateException} if there is an error.
- *
+ *
* @param menuRes Resource ID for an XML layout resource to load (e.g.,
* <code>R.menu.main_activity</code>)
* @param menu The Menu to inflate into. The items and submenus will be
@@ -107,7 +107,7 @@ public class MenuInflater {
try {
parser = mContext.getResources().getLayout(menuRes);
AttributeSet attrs = Xml.asAttributeSet(parser);
-
+
parseMenu(parser, attrs, menu);
} catch (XmlPullParserException e) {
throw new InflateException("Error inflating menu XML", e);
@@ -140,12 +140,12 @@ public class MenuInflater {
eventType = parser.next();
break;
}
-
+
throw new RuntimeException("Expecting menu, got " + tagName);
}
eventType = parser.next();
} while (eventType != XmlPullParser.END_DOCUMENT);
-
+
boolean reachedEndOfMenu = false;
while (!reachedEndOfMenu) {
switch (eventType) {
@@ -153,7 +153,7 @@ public class MenuInflater {
if (lookingForEndOfUnknownTag) {
break;
}
-
+
tagName = parser.getName();
if (tagName.equals(XML_GROUP)) {
menuState.readGroup(attrs);
@@ -171,7 +171,7 @@ public class MenuInflater {
unknownTagName = tagName;
}
break;
-
+
case XmlPullParser.END_TAG:
tagName = parser.getName();
if (lookingForEndOfUnknownTag && tagName.equals(unknownTagName)) {
@@ -194,11 +194,11 @@ public class MenuInflater {
reachedEndOfMenu = true;
}
break;
-
+
case XmlPullParser.END_DOCUMENT:
throw new RuntimeException("Unexpected end of document");
}
-
+
eventType = parser.next();
}
}
@@ -229,10 +229,10 @@ public class MenuInflater {
private static class InflatedOnMenuItemClickListener
implements MenuItem.OnMenuItemClickListener {
private static final Class<?>[] PARAM_TYPES = new Class[] { MenuItem.class };
-
+
private Object mRealOwner;
private Method mMethod;
-
+
public InflatedOnMenuItemClickListener(Object realOwner, String methodName) {
mRealOwner = realOwner;
Class<?> c = realOwner.getClass();
@@ -246,7 +246,7 @@ public class MenuInflater {
throw ex;
}
}
-
+
public boolean onMenuItemClick(MenuItem item) {
try {
if (mMethod.getReturnType() == Boolean.TYPE) {
@@ -277,7 +277,7 @@ public class MenuInflater {
}
return owner;
}
-
+
/**
* State for the current menu.
* <p>
@@ -316,7 +316,7 @@ public class MenuInflater {
private boolean itemChecked;
private boolean itemVisible;
private boolean itemEnabled;
-
+
/**
* Sync to attrs.xml enum, values in MenuItem:
* - 0: never
@@ -331,7 +331,7 @@ public class MenuInflater {
private String itemActionProviderClassName;
private String itemListenerMethodName;
-
+
private ActionProvider itemActionProvider;
private static final int defaultGroupId = NO_ID;
@@ -342,13 +342,13 @@ public class MenuInflater {
private static final boolean defaultItemChecked = false;
private static final boolean defaultItemVisible = true;
private static final boolean defaultItemEnabled = true;
-
+
public MenuState(final Menu menu) {
this.menu = menu;
-
+
resetGroup();
}
-
+
public void resetGroup() {
groupId = defaultGroupId;
groupCategory = defaultItemCategory;
@@ -364,7 +364,7 @@ public class MenuInflater {
public void readGroup(AttributeSet attrs) {
TypedArray a = mContext.obtainStyledAttributes(attrs,
com.android.internal.R.styleable.MenuGroup);
-
+
groupId = a.getResourceId(com.android.internal.R.styleable.MenuGroup_id, defaultGroupId);
groupCategory = a.getInt(com.android.internal.R.styleable.MenuGroup_menuCategory, defaultItemCategory);
groupOrder = a.getInt(com.android.internal.R.styleable.MenuGroup_orderInCategory, defaultItemOrder);
@@ -374,7 +374,7 @@ public class MenuInflater {
a.recycle();
}
-
+
/**
* Called when the parser is pointing to an item tag.
*/
@@ -436,7 +436,7 @@ public class MenuInflater {
return shortcutString.charAt(0);
}
}
-
+
private void setItem(MenuItem item) {
item.setChecked(itemChecked)
.setVisible(itemVisible)
@@ -446,11 +446,11 @@ public class MenuInflater {
.setIcon(itemIconResId)
.setAlphabeticShortcut(itemAlphabeticShortcut)
.setNumericShortcut(itemNumericShortcut);
-
+
if (itemShowAsAction >= 0) {
item.setShowAsAction(itemShowAsAction);
}
-
+
if (itemListenerMethodName != null) {
if (mContext.isRestricted()) {
throw new IllegalStateException("The android:onClick attribute cannot "
@@ -494,14 +494,14 @@ public class MenuInflater {
setItem(item);
return item;
}
-
+
public SubMenu addSubMenuItem() {
itemAdded = true;
SubMenu subMenu = menu.addSubMenu(groupId, itemId, itemCategoryOrder, itemTitle);
setItem(subMenu.getItem());
return subMenu;
}
-
+
public boolean hasAddedItem() {
return itemAdded;
}
diff --git a/core/java/android/view/PointerIcon.java b/core/java/android/view/PointerIcon.java
index fc79f53b744b..998fd0195a98 100644
--- a/core/java/android/view/PointerIcon.java
+++ b/core/java/android/view/PointerIcon.java
@@ -17,9 +17,6 @@
package android.view;
import android.annotation.NonNull;
-import android.util.SparseArray;
-import com.android.internal.util.XmlUtils;
-
import android.annotation.XmlRes;
import android.content.Context;
import android.content.res.Resources;
@@ -32,6 +29,9 @@ import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
+import android.util.SparseArray;
+
+import com.android.internal.util.XmlUtils;
/**
* Represents an icon that can be used as a mouse pointer.
diff --git a/core/java/android/view/RemotableViewMethod.java b/core/java/android/view/RemotableViewMethod.java
index e5cae84942f9..03aed9a53925 100644
--- a/core/java/android/view/RemotableViewMethod.java
+++ b/core/java/android/view/RemotableViewMethod.java
@@ -36,6 +36,3 @@ public @interface RemotableViewMethod {
*/
String asyncImpl() default "";
}
-
-
-
diff --git a/core/java/android/view/RenderNodeAnimatorSetHelper.java b/core/java/android/view/RenderNodeAnimatorSetHelper.java
index ba592d29fa3d..e1ef05941394 100644
--- a/core/java/android/view/RenderNodeAnimatorSetHelper.java
+++ b/core/java/android/view/RenderNodeAnimatorSetHelper.java
@@ -16,6 +16,7 @@
package android.view;
import android.animation.TimeInterpolator;
+
import com.android.internal.view.animation.FallbackLUTInterpolator;
import com.android.internal.view.animation.NativeInterpolatorFactory;
import com.android.internal.view.animation.NativeInterpolatorFactoryHelper;
diff --git a/core/java/android/view/RoundScrollbarRenderer.java b/core/java/android/view/RoundScrollbarRenderer.java
index b77be8c00e69..4c555aed40cc 100644
--- a/core/java/android/view/RoundScrollbarRenderer.java
+++ b/core/java/android/view/RoundScrollbarRenderer.java
@@ -19,8 +19,8 @@ package android.view;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
-import android.graphics.RectF;
import android.graphics.Rect;
+import android.graphics.RectF;
/**
* Helper class for drawing round scroll bars on round Wear devices.
diff --git a/core/java/android/view/ScaleGestureDetector.java b/core/java/android/view/ScaleGestureDetector.java
index 7cd161c17cd9..9787494c5018 100644
--- a/core/java/android/view/ScaleGestureDetector.java
+++ b/core/java/android/view/ScaleGestureDetector.java
@@ -20,7 +20,6 @@ import android.content.Context;
import android.content.res.Resources;
import android.os.Build;
import android.os.Handler;
-import android.os.SystemClock;
/**
* Detects scaling transformation gestures using the supplied {@link MotionEvent}s.
diff --git a/core/java/android/view/SearchEvent.java b/core/java/android/view/SearchEvent.java
index 643cc3ee28ec..72b5e4ba7398 100644
--- a/core/java/android/view/SearchEvent.java
+++ b/core/java/android/view/SearchEvent.java
@@ -16,8 +16,6 @@
package android.view;
-import android.view.InputDevice;
-
/**
* Class that contains information about an event that triggers a search.
*/
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 22e68a3b909c..ecd5e3b22188 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -26,11 +26,11 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
+import dalvik.system.CloseGuard;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import dalvik.system.CloseGuard;
-
/**
* Handle onto a raw buffer that is being managed by the screen compositor.
*
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 64568260c022..b87250e5f131 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -16,7 +16,6 @@
package android.view;
-import dalvik.system.CloseGuard;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.graphics.Region;
@@ -24,6 +23,8 @@ import android.os.IBinder;
import android.util.Log;
import android.view.Surface.OutOfResourcesException;
+import dalvik.system.CloseGuard;
+
/**
* SurfaceControl
* @hide
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 816bcf09a89d..80f447ec51f8 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -16,11 +16,9 @@
package android.view;
-import com.android.internal.view.BaseIWindow;
-
import android.content.Context;
-import android.content.res.Configuration;
import android.content.res.CompatibilityInfo.Translator;
+import android.content.res.Configuration;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
@@ -28,12 +26,14 @@ import android.graphics.Rect;
import android.graphics.Region;
import android.os.Handler;
import android.os.Message;
+import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.SystemClock;
-import android.os.ParcelFileDescriptor;
import android.util.AttributeSet;
import android.util.Log;
+import com.android.internal.view.BaseIWindow;
+
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.concurrent.locks.ReentrantLock;
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index ce390a239d2c..0bb84cca174a 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -16,9 +16,9 @@
package android.view;
-import android.app.ActivityManagerNative;
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.app.ActivityManagerNative;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
@@ -916,7 +916,6 @@ public final class ThreadedRenderer {
mInitialized = true;
initSched(context, renderProxy);
initGraphicsStats(context, renderProxy);
- initAssetAtlas(context, renderProxy);
}
private static void initSched(Context context, long renderProxy) {
@@ -944,32 +943,6 @@ public final class ThreadedRenderer {
Log.w(LOG_TAG, "Could not acquire gfx stats buffer", t);
}
}
-
- private static void initAssetAtlas(Context context, long renderProxy) {
- IBinder binder = ServiceManager.getService("assetatlas");
- if (binder == null) return;
-
- IAssetAtlas atlas = IAssetAtlas.Stub.asInterface(binder);
- try {
- if (atlas.isCompatible(android.os.Process.myPpid())) {
- GraphicBuffer buffer = atlas.getBuffer();
- if (buffer != null) {
- long[] map = atlas.getMap();
- if (map != null) {
- nSetAtlas(renderProxy, buffer, map);
- }
- // If IAssetAtlas is not the same class as the IBinder
- // we are using a remote service and we can safely
- // destroy the graphic buffer
- if (atlas.getClass() != binder.getClass()) {
- buffer.destroy();
- }
- }
- }
- } catch (RemoteException e) {
- Log.w(LOG_TAG, "Could not acquire atlas", e);
- }
- }
}
void addFrameMetricsObserver(FrameMetricsObserver observer) {
@@ -984,7 +957,6 @@ public final class ThreadedRenderer {
static native void setupShadersDiskCache(String cacheFile);
- private static native void nSetAtlas(long nativeProxy, GraphicBuffer buffer, long[] map);
private static native void nSetProcessStatsBuffer(long nativeProxy, int fd);
private static native int nGetRenderThreadTid(long nativeProxy);
diff --git a/core/java/android/view/TouchDelegate.java b/core/java/android/view/TouchDelegate.java
index 27b49dbb377c..cf36f4360c3b 100644
--- a/core/java/android/view/TouchDelegate.java
+++ b/core/java/android/view/TouchDelegate.java
@@ -17,9 +17,6 @@
package android.view;
import android.graphics.Rect;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
/**
* Helper class to handle situations where you want a view to have a larger touch area than its
@@ -33,24 +30,24 @@ import android.view.ViewConfiguration;
* </p>
*/
public class TouchDelegate {
-
+
/**
- * View that should receive forwarded touch events
+ * View that should receive forwarded touch events
*/
private View mDelegateView;
-
+
/**
* Bounds in local coordinates of the containing view that should be mapped to the delegate
* view. This rect is used for initial hit testing.
*/
private Rect mBounds;
-
+
/**
* mBounds inflated to include some slop. This rect is to track whether the motion events
* should be considered to be be within the delegate view.
*/
private Rect mSlopBounds;
-
+
/**
* True if the delegate had been targeted on a down event (intersected mBounds).
*/
@@ -82,7 +79,7 @@ public class TouchDelegate {
/**
* Constructor
- *
+ *
* @param bounds Bounds in local coordinates of the containing view that should be mapped to
* the delegate view
* @param delegateView The view that should receive motion events
@@ -99,7 +96,7 @@ public class TouchDelegate {
/**
* Will forward touch events to the delegate view if the event is within the bounds
* specified in the constructor.
- *
+ *
* @param event The touch event to forward
* @return True if the event was forwarded to the delegate, false otherwise.
*/
@@ -136,7 +133,7 @@ public class TouchDelegate {
}
if (sendToDelegate) {
final View delegateView = mDelegateView;
-
+
if (hit) {
// Offset event coordinates to be inside the target view
event.setLocation(delegateView.getWidth() / 2, delegateView.getHeight() / 2);
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index bdf93e40de47..49d664ea60d9 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -16,6 +16,14 @@
package android.view;
+import static android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH;
+import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
+import static android.os.Build.VERSION_CODES.KITKAT;
+import static android.os.Build.VERSION_CODES.M;
+import static android.os.Build.VERSION_CODES.N;
+
+import static java.lang.Math.max;
+
import android.animation.AnimatorInflater;
import android.animation.StateListAnimator;
import android.annotation.CallSuper;
@@ -79,11 +87,11 @@ import android.util.SparseArray;
import android.util.StateSet;
import android.util.SuperNotCalledException;
import android.util.TypedValue;
-import android.view.ContextMenu.ContextMenuInfo;
import android.view.AccessibilityIterators.CharacterTextSegmentIterator;
import android.view.AccessibilityIterators.ParagraphTextSegmentIterator;
import android.view.AccessibilityIterators.TextSegmentIterator;
import android.view.AccessibilityIterators.WordTextSegmentIterator;
+import android.view.ContextMenu.ContextMenuInfo;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityEventSource;
import android.view.accessibility.AccessibilityManager;
@@ -99,17 +107,15 @@ import android.view.inputmethod.InputMethodManager;
import android.widget.Checkable;
import android.widget.FrameLayout;
import android.widget.ScrollBarDrawable;
-import static android.os.Build.VERSION_CODES.*;
-import static java.lang.Math.max;
import com.android.internal.R;
import com.android.internal.util.Predicate;
import com.android.internal.view.menu.MenuBuilder;
import com.android.internal.widget.ScrollBarUtils;
+
import com.google.android.collect.Lists;
import com.google.android.collect.Maps;
-import java.lang.NullPointerException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java
index e1ff0d6735ab..047a515bb99e 100644
--- a/core/java/android/view/ViewDebug.java
+++ b/core/java/android/view/ViewDebug.java
@@ -51,8 +51,8 @@ import java.util.concurrent.CancellationException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
-import java.util.concurrent.TimeoutException;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicReference;
/**
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 2e428a734331..87a85f16043a 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -16,6 +16,8 @@
package android.view;
+import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
+
import android.animation.LayoutTransition;
import android.annotation.IdRes;
import android.annotation.NonNull;
@@ -62,8 +64,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
-
/**
* <p>
* A <code>ViewGroup</code> is a special view that can contain other views
diff --git a/core/java/android/view/ViewPropertyAnimator.java b/core/java/android/view/ViewPropertyAnimator.java
index c604234fa577..6c84b63bb241 100644
--- a/core/java/android/view/ViewPropertyAnimator.java
+++ b/core/java/android/view/ViewPropertyAnimator.java
@@ -17,8 +17,9 @@
package android.view;
import android.animation.Animator;
-import android.animation.ValueAnimator;
import android.animation.TimeInterpolator;
+import android.animation.ValueAnimator;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
@@ -42,7 +43,7 @@ import java.util.Set;
* <p>This class is not constructed by the caller, but rather by the View whose properties
* it will animate. Calls to {@link android.view.View#animate()} will return a reference
* to the appropriate ViewPropertyAnimator object for that View.</p>
- *
+ *
*/
public class ViewPropertyAnimator {
@@ -332,7 +333,7 @@ public class ViewPropertyAnimator {
* Sets the interpolator for the underlying animator that animates the requested properties.
* By default, the animator uses the default interpolator for ValueAnimator. Calling this method
* will cause the declared object to be used instead.
- *
+ *
* @param interpolator The TimeInterpolator to be used for ensuing property animations. A value
* of <code>null</code> will result in linear interpolation.
* @return This object, allowing calls to methods in this class to be chained.
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index b046e2d5c768..2c1383174eb6 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -16,6 +16,8 @@
package android.view;
+import static android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
+
import android.annotation.ColorInt;
import android.annotation.DrawableRes;
import android.annotation.IdRes;
@@ -24,7 +26,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.StyleRes;
import android.annotation.SystemApi;
-import android.app.ActivityManagerNative;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -44,8 +45,6 @@ import android.transition.Transition;
import android.transition.TransitionManager;
import android.view.accessibility.AccessibilityEvent;
-import static android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
-
import java.util.List;
/**
diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java
index dd4e09685362..c1b8f04a6865 100644
--- a/core/java/android/view/WindowManagerImpl.java
+++ b/core/java/android/view/WindowManagerImpl.java
@@ -23,7 +23,6 @@ import android.os.IBinder;
import android.os.RemoteException;
import com.android.internal.os.IResultReceiver;
-import com.android.internal.R;
import java.util.List;
@@ -38,11 +37,11 @@ import java.util.List;
* Additional window manager specific layout parameters are defined for
* control over how windows are displayed. It also implements the {@link WindowManager}
* interface, allowing you to control the displays attached to the device.
- *
+ *
* <p>Applications will not normally use WindowManager directly, instead relying
* on the higher-level facilities in {@link android.app.Activity} and
* {@link android.app.Dialog}.
- *
+ *
* <p>Even for low-level window manager access, it is almost never correct to use
* this class. For example, {@link android.app.Activity#getWindowManager}
* provides a window manager for adding windows that are associated with that
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index da361c1c04d2..b30104327f31 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -25,12 +25,12 @@ import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.Rect;
-import android.graphics.RectF;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.view.animation.Animation;
+
import com.android.internal.policy.IShortcutService;
import java.io.PrintWriter;
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index c125b32f237a..8084195468c5 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -21,7 +21,6 @@ import android.accessibilityservice.AccessibilityServiceInfo;
import android.annotation.NonNull;
import android.content.Context;
import android.content.pm.PackageManager;
-import android.content.pm.ParceledListSlice;
import android.content.pm.ServiceInfo;
import android.os.Binder;
import android.os.Handler;
diff --git a/core/java/android/view/animation/Animation.java b/core/java/android/view/animation/Animation.java
index d89c172be8a7..474db128fcc3 100644
--- a/core/java/android/view/animation/Animation.java
+++ b/core/java/android/view/animation/Animation.java
@@ -26,6 +26,7 @@ import android.os.Handler;
import android.os.SystemProperties;
import android.util.AttributeSet;
import android.util.TypedValue;
+
import dalvik.system.CloseGuard;
/**
@@ -80,13 +81,13 @@ public abstract class Animation implements Cloneable {
* order.
*/
public static final int ZORDER_NORMAL = 0;
-
+
/**
* Requests that the content being animated be forced on top of all other
* content for the duration of the animation.
*/
public static final int ZORDER_TOP = 1;
-
+
/**
* Requests that the content being animated be forced under all other
* content for the duration of the animation.
@@ -138,7 +139,7 @@ public abstract class Animation implements Cloneable {
/**
* Indicates whether fillBefore should be taken into account.
*/
- boolean mFillEnabled = false;
+ boolean mFillEnabled = false;
/**
* The time in milliseconds at which the animation must start;
@@ -240,7 +241,7 @@ public abstract class Animation implements Cloneable {
setDuration((long) a.getInt(com.android.internal.R.styleable.Animation_duration, 0));
setStartOffset((long) a.getInt(com.android.internal.R.styleable.Animation_startOffset, 0));
-
+
setFillEnabled(a.getBoolean(com.android.internal.R.styleable.Animation_fillEnabled, mFillEnabled));
setFillBefore(a.getBoolean(com.android.internal.R.styleable.Animation_fillBefore, mFillBefore));
setFillAfter(a.getBoolean(com.android.internal.R.styleable.Animation_fillAfter, mFillAfter));
@@ -249,7 +250,7 @@ public abstract class Animation implements Cloneable {
setRepeatMode(a.getInt(com.android.internal.R.styleable.Animation_repeatMode, RESTART));
setZAdjustment(a.getInt(com.android.internal.R.styleable.Animation_zAdjustment, ZORDER_NORMAL));
-
+
setBackgroundColor(a.getInt(com.android.internal.R.styleable.Animation_background, 0));
setDetachWallpaper(a.getBoolean(com.android.internal.R.styleable.Animation_detachWallpaper, false));
@@ -294,13 +295,13 @@ public abstract class Animation implements Cloneable {
/**
* Cancel the animation. Cancelling an animation invokes the animation
* listener, if set, to notify the end of the animation.
- *
+ *
* If you cancel an animation manually, you must call {@link #reset()}
* before starting the animation again.
- *
- * @see #reset()
- * @see #start()
- * @see #startNow()
+ *
+ * @see #reset()
+ * @see #start()
+ * @see #startNow()
*/
public void cancel() {
if (mStarted && !mEnded) {
@@ -356,7 +357,7 @@ public abstract class Animation implements Cloneable {
/**
* Sets the handler used to invoke listeners.
- *
+ *
* @hide
*/
public void setListenerHandler(Handler handler) {
@@ -424,7 +425,7 @@ public abstract class Animation implements Cloneable {
/**
* How long this animation should last. The duration cannot be negative.
- *
+ *
* @param durationMillis Duration in milliseconds
*
* @throws java.lang.IllegalArgumentException if the duration is < 0
@@ -443,7 +444,7 @@ public abstract class Animation implements Cloneable {
* than <var>durationMillis</var>. In addition to adjusting the duration
* itself, this ensures that the repeat count also will not make it run
* longer than the given time.
- *
+ *
* @param durationMillis The maximum duration the animation is allowed
* to run.
*/
@@ -455,7 +456,7 @@ public abstract class Animation implements Cloneable {
mRepeatCount = 0;
return;
}
-
+
long dur = mDuration + mStartOffset;
if (dur > durationMillis) {
mDuration = durationMillis-mStartOffset;
@@ -480,7 +481,7 @@ public abstract class Animation implements Cloneable {
}
}
}
-
+
/**
* How much to scale the duration by.
*
@@ -528,7 +529,7 @@ public abstract class Animation implements Cloneable {
/**
* Defines what this animation should do when it reaches the end. This
* setting is applied only when the repeat count is either greater than
- * 0 or {@link #INFINITE}. Defaults to {@link #RESTART}.
+ * 0 or {@link #INFINITE}. Defaults to {@link #RESTART}.
*
* @param repeatMode {@link #RESTART} or {@link #REVERSE}
* @attr ref android.R.styleable#Animation_repeatMode
@@ -606,7 +607,7 @@ public abstract class Animation implements Cloneable {
* @param fillAfter true if the animation should apply its transformation after it ends
* @attr ref android.R.styleable#Animation_fillAfter
*
- * @see #setFillEnabled(boolean)
+ * @see #setFillEnabled(boolean)
*/
public void setFillAfter(boolean fillAfter) {
mFillAfter = fillAfter;
@@ -614,7 +615,7 @@ public abstract class Animation implements Cloneable {
/**
* Set the Z ordering mode to use while running the animation.
- *
+ *
* @param zAdjustment The desired mode, one of {@link #ZORDER_NORMAL},
* {@link #ZORDER_TOP}, or {@link #ZORDER_BOTTOM}.
* @attr ref android.R.styleable#Animation_zAdjustment
@@ -622,7 +623,7 @@ public abstract class Animation implements Cloneable {
public void setZAdjustment(int zAdjustment) {
mZAdjustment = zAdjustment;
}
-
+
/**
* Set background behind animation.
*
@@ -634,11 +635,11 @@ public abstract class Animation implements Cloneable {
}
/**
- * The scale factor is set by the call to <code>getTransformation</code>. Overrides of
+ * The scale factor is set by the call to <code>getTransformation</code>. Overrides of
* {@link #getTransformation(long, Transformation, float)} will get this value
* directly. Overrides of {@link #applyTransformation(float, Transformation)} can
* call this method to get the value.
- *
+ *
* @return float The scale factor that should be applied to pre-scaled values in
* an Animation such as the pivot points in {@link ScaleAnimation} and {@link RotateAnimation}.
*/
@@ -748,7 +749,7 @@ public abstract class Animation implements Cloneable {
/**
* Returns the Z ordering mode to use while running the animation as
* previously set by {@link #setZAdjustment}.
- *
+ *
* @return Returns one of {@link #ZORDER_NORMAL},
* {@link #ZORDER_TOP}, or {@link #ZORDER_BOTTOM}.
* @attr ref android.R.styleable#Animation_zAdjustment
@@ -827,7 +828,7 @@ public abstract class Animation implements Cloneable {
public long computeDurationHint() {
return (getStartOffset() + getDuration()) * (getRepeatCount() + 1);
}
-
+
/**
* Gets the transformation to apply at a specified point in time. Implementations of this
* method should always replace the specified Transformation or document they are doing
@@ -975,7 +976,7 @@ public abstract class Animation implements Cloneable {
* their transforms given an interpolation value. Implementations of this
* method should always replace the specified Transformation or document
* they are doing otherwise.
- *
+ *
* @param interpolatedTime The value of the normalized time (0.0 to 1.0)
* after it has been run through the interpolation function.
* @param t The Transformation object to fill in with the current
@@ -1015,7 +1016,7 @@ public abstract class Animation implements Cloneable {
* @param bottom
* @param invalidate
* @param transformation
- *
+ *
* @hide
*/
public void getInvalidateRegion(int left, int top, int right, int bottom,
@@ -1072,7 +1073,7 @@ public abstract class Animation implements Cloneable {
/**
* Return true if this animation changes the view's alpha property.
- *
+ *
* @hide
*/
public boolean hasAlpha() {
diff --git a/core/java/android/view/animation/AnimationSet.java b/core/java/android/view/animation/AnimationSet.java
index 71c74506b917..09d4dfc93b19 100644
--- a/core/java/android/view/animation/AnimationSet.java
+++ b/core/java/android/view/animation/AnimationSet.java
@@ -18,17 +18,17 @@ package android.view.animation;
import android.content.Context;
import android.content.res.TypedArray;
+import android.graphics.RectF;
import android.os.Build;
import android.util.AttributeSet;
-import android.graphics.RectF;
import java.util.ArrayList;
import java.util.List;
/**
* Represents a group of Animations that should be played together.
- * The transformation of each individual animation are composed
- * together into a single transform.
+ * The transformation of each individual animation are composed
+ * together into a single transform.
* If AnimationSet sets any properties that its children also set
* (for example, duration or fillBefore), the values of AnimationSet
* override the child values.
@@ -72,17 +72,17 @@ public class AnimationSet extends Animation {
private long[] mStoredOffsets;
/**
- * Constructor used when an AnimationSet is loaded from a resource.
- *
+ * Constructor used when an AnimationSet is loaded from a resource.
+ *
* @param context Application context to use
* @param attrs Attribute set from which to read values
*/
public AnimationSet(Context context, AttributeSet attrs) {
super(context, attrs);
-
+
TypedArray a =
context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.AnimationSet);
-
+
setFlag(PROPERTY_SHARE_INTERPOLATOR_MASK,
a.getBoolean(com.android.internal.R.styleable.AnimationSet_shareInterpolator, true));
init();
@@ -108,11 +108,11 @@ public class AnimationSet extends Animation {
a.recycle();
}
-
-
+
+
/**
* Constructor to use when building an AnimationSet from code
- *
+ *
* @param shareInterpolator Pass true if all of the animations in this set
* should use the interpolator associated with this AnimationSet.
* Pass false if each animation should use its own interpolator.
@@ -244,10 +244,10 @@ public class AnimationSet extends Animation {
mDirty = true;
}
-
+
/**
* Sets the start time of this animation and all child animations
- *
+ *
* @see android.view.animation.Animation#setStartTime(long)
*/
@Override
@@ -289,11 +289,11 @@ public class AnimationSet extends Animation {
animations.get(i).restrictDuration(durationMillis);
}
}
-
+
/**
- * The duration of an AnimationSet is defined to be the
+ * The duration of an AnimationSet is defined to be the
* duration of the longest child animation.
- *
+ *
* @see android.view.animation.Animation#getDuration()
*/
@Override
@@ -317,7 +317,7 @@ public class AnimationSet extends Animation {
/**
* The duration hint of an animation set is the maximum of the duration
* hints of all of its component animations.
- *
+ *
* @see android.view.animation.Animation#computeDurationHint
*/
public long computeDurationHint() {
@@ -362,7 +362,7 @@ public class AnimationSet extends Animation {
/**
* The transformation of an animation set is the concatenation of all of its
* component animations.
- *
+ *
* @see android.view.animation.Animation#getTransformation
*/
@Override
@@ -404,7 +404,7 @@ public class AnimationSet extends Animation {
return more;
}
-
+
/**
* @see android.view.animation.Animation#scaleCurrentDuration(float)
*/
diff --git a/core/java/android/view/animation/AnimationUtils.java b/core/java/android/view/animation/AnimationUtils.java
index 351b6dbd6616..f5c36139df0f 100644
--- a/core/java/android/view/animation/AnimationUtils.java
+++ b/core/java/android/view/animation/AnimationUtils.java
@@ -16,19 +16,19 @@
package android.view.animation;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import android.annotation.AnimRes;
import android.annotation.InterpolatorRes;
import android.content.Context;
import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
import android.content.res.Resources.Theme;
import android.content.res.XmlResourceParser;
-import android.content.res.Resources.NotFoundException;
+import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.Xml;
-import android.os.SystemClock;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
diff --git a/core/java/android/view/animation/AnticipateInterpolator.java b/core/java/android/view/animation/AnticipateInterpolator.java
index fb66c312181c..7a837c37810c 100644
--- a/core/java/android/view/animation/AnticipateInterpolator.java
+++ b/core/java/android/view/animation/AnticipateInterpolator.java
@@ -18,8 +18,8 @@ package android.view.animation;
import android.content.Context;
import android.content.res.Resources;
-import android.content.res.TypedArray;
import android.content.res.Resources.Theme;
+import android.content.res.TypedArray;
import android.util.AttributeSet;
import com.android.internal.R;
diff --git a/core/java/android/view/animation/AnticipateOvershootInterpolator.java b/core/java/android/view/animation/AnticipateOvershootInterpolator.java
index 1af72da7a3a4..9a75134a0c21 100644
--- a/core/java/android/view/animation/AnticipateOvershootInterpolator.java
+++ b/core/java/android/view/animation/AnticipateOvershootInterpolator.java
@@ -16,6 +16,10 @@
package android.view.animation;
+import static com.android.internal.R.styleable.AnticipateOvershootInterpolator;
+import static com.android.internal.R.styleable.AnticipateOvershootInterpolator_extraTension;
+import static com.android.internal.R.styleable.AnticipateOvershootInterpolator_tension;
+
import android.content.Context;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
@@ -26,10 +30,6 @@ import com.android.internal.view.animation.HasNativeInterpolator;
import com.android.internal.view.animation.NativeInterpolatorFactory;
import com.android.internal.view.animation.NativeInterpolatorFactoryHelper;
-import static com.android.internal.R.styleable.AnticipateOvershootInterpolator_extraTension;
-import static com.android.internal.R.styleable.AnticipateOvershootInterpolator_tension;
-import static com.android.internal.R.styleable.AnticipateOvershootInterpolator;
-
/**
* An interpolator where the change starts backward then flings forward and overshoots
* the target value and finally goes back to the final value.
diff --git a/core/java/android/view/animation/CycleInterpolator.java b/core/java/android/view/animation/CycleInterpolator.java
index 663c1091ca29..72d64a16393a 100644
--- a/core/java/android/view/animation/CycleInterpolator.java
+++ b/core/java/android/view/animation/CycleInterpolator.java
@@ -18,8 +18,8 @@ package android.view.animation;
import android.content.Context;
import android.content.res.Resources;
-import android.content.res.TypedArray;
import android.content.res.Resources.Theme;
+import android.content.res.TypedArray;
import android.util.AttributeSet;
import com.android.internal.R;
diff --git a/core/java/android/view/animation/DecelerateInterpolator.java b/core/java/android/view/animation/DecelerateInterpolator.java
index f426f60dc581..f89743c149b1 100644
--- a/core/java/android/view/animation/DecelerateInterpolator.java
+++ b/core/java/android/view/animation/DecelerateInterpolator.java
@@ -18,8 +18,8 @@ package android.view.animation;
import android.content.Context;
import android.content.res.Resources;
-import android.content.res.TypedArray;
import android.content.res.Resources.Theme;
+import android.content.res.TypedArray;
import android.util.AttributeSet;
import com.android.internal.R;
diff --git a/core/java/android/view/animation/GridLayoutAnimationController.java b/core/java/android/view/animation/GridLayoutAnimationController.java
index 9161d8beba7a..0f189ae98030 100644
--- a/core/java/android/view/animation/GridLayoutAnimationController.java
+++ b/core/java/android/view/animation/GridLayoutAnimationController.java
@@ -16,11 +16,11 @@
package android.view.animation;
-import android.view.View;
-import android.view.ViewGroup;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
import java.util.Random;
@@ -43,7 +43,7 @@ import java.util.Random;
*
* @see LayoutAnimationController
* @see android.widget.GridView
- *
+ *
* @attr ref android.R.styleable#GridLayoutAnimation_columnDelay
* @attr ref android.R.styleable#GridLayoutAnimation_rowDelay
* @attr ref android.R.styleable#GridLayoutAnimation_direction
@@ -206,7 +206,7 @@ public class GridLayoutAnimationController extends LayoutAnimationController {
*
* @see #getRowDelay()
* @see #getColumnDelay()
- * @see #setColumnDelay(float)
+ * @see #setColumnDelay(float)
*/
public void setRowDelay(float rowDelay) {
mRowDelay = rowDelay;
diff --git a/core/java/android/view/inputmethod/BaseInputConnection.java b/core/java/android/view/inputmethod/BaseInputConnection.java
index 38962a36dd70..5f7a0f789fa4 100644
--- a/core/java/android/view/inputmethod/BaseInputConnection.java
+++ b/core/java/android/view/inputmethod/BaseInputConnection.java
@@ -1,12 +1,12 @@
/*
* Copyright (C) 2008 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
@@ -35,7 +35,6 @@ import android.util.LogPrinter;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.View;
-import android.view.ViewRootImpl;
class ComposingText implements NoCopySpan {
}
@@ -56,25 +55,25 @@ public class BaseInputConnection implements InputConnection {
protected final InputMethodManager mIMM;
final View mTargetView;
final boolean mDummyMode;
-
+
private Object[] mDefaultComposingSpans;
-
+
Editable mEditable;
KeyCharacterMap mKeyCharacterMap;
-
+
BaseInputConnection(InputMethodManager mgr, boolean fullEditor) {
mIMM = mgr;
mTargetView = null;
mDummyMode = !fullEditor;
}
-
+
public BaseInputConnection(View targetView, boolean fullEditor) {
mIMM = (InputMethodManager)targetView.getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
mTargetView = targetView;
mDummyMode = !fullEditor;
}
-
+
public static final void removeComposingSpans(Spannable text) {
text.removeSpan(COMPOSING);
Object[] sps = text.getSpans(0, text.length(), Object.class);
@@ -104,8 +103,8 @@ public class BaseInputConnection implements InputConnection {
}
final int fl = text.getSpanFlags(o);
- if ((fl&(Spanned.SPAN_COMPOSING|Spanned.SPAN_POINT_MARK_MASK))
- != (Spanned.SPAN_COMPOSING|Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)) {
+ if ((fl & (Spanned.SPAN_COMPOSING | Spanned.SPAN_POINT_MARK_MASK))
+ != (Spanned.SPAN_COMPOSING | Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)) {
text.setSpan(o, text.getSpanStart(o), text.getSpanEnd(o),
(fl & ~Spanned.SPAN_POINT_MARK_MASK)
| Spanned.SPAN_COMPOSING
@@ -117,15 +116,15 @@ public class BaseInputConnection implements InputConnection {
text.setSpan(COMPOSING, start, end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE | Spanned.SPAN_COMPOSING);
}
-
+
public static int getComposingSpanStart(Spannable text) {
return text.getSpanStart(COMPOSING);
}
-
+
public static int getComposingSpanEnd(Spannable text) {
return text.getSpanEnd(COMPOSING);
}
-
+
/**
* Return the target of edit operations. The default implementation
* returns its own fake editable that is just used for composing text;
@@ -139,7 +138,7 @@ public class BaseInputConnection implements InputConnection {
}
return mEditable;
}
-
+
/**
* Default implementation does nothing.
*/
@@ -452,10 +451,10 @@ public class BaseInputConnection implements InputConnection {
*/
public int getCursorCapsMode(int reqModes) {
if (mDummyMode) return 0;
-
+
final Editable content = getEditable();
if (content == null) return 0;
-
+
int a = Selection.getSelectionStart(content);
int b = Selection.getSelectionEnd(content);
@@ -495,7 +494,7 @@ public class BaseInputConnection implements InputConnection {
if (a <= 0) {
return "";
}
-
+
if (length > a) {
length = a;
}
@@ -702,7 +701,7 @@ public class BaseInputConnection implements InputConnection {
if (!mDummyMode) {
return;
}
-
+
Editable content = getEditable();
if (content != null) {
final int N = content.length();
@@ -727,7 +726,7 @@ public class BaseInputConnection implements InputConnection {
return;
}
}
-
+
// Otherwise, revert to the special key event containing
// the actual characters.
KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(),
@@ -768,7 +767,7 @@ public class BaseInputConnection implements InputConnection {
if (content == null) {
return;
}
-
+
beginBatchEdit();
// delete composing text set previously.
@@ -776,7 +775,7 @@ public class BaseInputConnection implements InputConnection {
int b = getComposingSpanEnd(content);
if (DEBUG) Log.v(TAG, "Composing span: " + a + " to " + b);
-
+
if (b < a) {
int tmp = a;
a = b;
@@ -814,11 +813,11 @@ public class BaseInputConnection implements InputConnection {
}
setComposingSpans(sp);
}
-
+
if (DEBUG) Log.v(TAG, "Replacing from " + a + " to " + b + " with \""
+ text + "\", composing=" + composing
+ ", type=" + text.getClass().getCanonicalName());
-
+
if (DEBUG) {
LogPrinter lp = new LogPrinter(Log.VERBOSE, TAG);
lp.println("Current text:");
@@ -842,13 +841,13 @@ public class BaseInputConnection implements InputConnection {
Selection.setSelection(content, newCursorPosition);
content.replace(a, b, text);
-
+
if (DEBUG) {
LogPrinter lp = new LogPrinter(Log.VERBOSE, TAG);
lp.println("Final text:");
TextUtils.dumpSpans(content, lp, " ");
}
-
+
endBatchEdit();
}
diff --git a/core/java/android/view/inputmethod/InputConnectionInspector.java b/core/java/android/view/inputmethod/InputConnectionInspector.java
index 2b292bbca849..5f25bf58ce57 100644
--- a/core/java/android/view/inputmethod/InputConnectionInspector.java
+++ b/core/java/android/view/inputmethod/InputConnectionInspector.java
@@ -16,6 +16,8 @@
package android.view.inputmethod;
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -28,8 +30,6 @@ import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
/**
* @hide
*/
diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java
index 661b52fd4366..5c8e6dc39960 100644
--- a/core/java/android/view/inputmethod/InputMethodInfo.java
+++ b/core/java/android/view/inputmethod/InputMethodInfo.java
@@ -16,9 +16,6 @@
package android.view.inputmethod;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ApplicationInfo;
@@ -39,6 +36,9 @@ import android.util.Slog;
import android.util.Xml;
import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index ca370dc749ef..2e99092006f0 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -1,12 +1,12 @@
/*
* Copyright (C) 2007-2008 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
@@ -16,15 +16,7 @@
package android.view.inputmethod;
-import com.android.internal.inputmethod.IInputContentUriToken;
-import com.android.internal.os.SomeArgs;
-import com.android.internal.view.IInputConnectionWrapper;
-import com.android.internal.view.IInputContext;
-import com.android.internal.view.IInputMethodClient;
-import com.android.internal.view.IInputMethodManager;
-import com.android.internal.view.IInputMethodSession;
-import com.android.internal.view.InputBindResult;
-import com.android.internal.view.InputMethodClient;
+import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -40,8 +32,8 @@ import android.os.Message;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ServiceManager;
-import android.os.Trace;
import android.os.ServiceManager.ServiceNotFoundException;
+import android.os.Trace;
import android.text.TextUtils;
import android.text.style.SuggestionSpan;
import android.util.Log;
@@ -56,11 +48,19 @@ import android.view.InputEventSender;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewRootImpl;
-import android.view.textservice.TextServicesManager;
+
+import com.android.internal.inputmethod.IInputContentUriToken;
+import com.android.internal.os.SomeArgs;
+import com.android.internal.view.IInputConnectionWrapper;
+import com.android.internal.view.IInputContext;
+import com.android.internal.view.IInputMethodClient;
+import com.android.internal.view.IInputMethodManager;
+import com.android.internal.view.IInputMethodSession;
+import com.android.internal.view.InputBindResult;
+import com.android.internal.view.InputMethodClient;
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -70,14 +70,12 @@ import java.util.Objects;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
-import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
-
/**
* Central system API to the overall input method framework (IMF) architecture,
* which arbitrates interaction between applications and the current input method.
* You can retrieve an instance of this interface with
* {@link Context#getSystemService(String) Context.getSystemService()}.
- *
+ *
* <p>Topics covered here:
* <ol>
* <li><a href="#ArchitectureOverview">Architecture Overview</a>
@@ -85,13 +83,13 @@ import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
* <li><a href="#InputMethods">Input Methods</a>
* <li><a href="#Security">Security</a>
* </ol>
- *
+ *
* <a name="ArchitectureOverview"></a>
* <h3>Architecture Overview</h3>
- *
+ *
* <p>There are three primary parties involved in the input method
* framework (IMF) architecture:</p>
- *
+ *
* <ul>
* <li> The <strong>input method manager</strong> as expressed by this class
* is the central point of the system that manages interaction between all
@@ -106,16 +104,16 @@ import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
* method manager for input focus and control over the state of the IME. Only
* one such client is ever active (working with the IME) at a time.
* </ul>
- *
- *
+ *
+ *
* <a name="Applications"></a>
* <h3>Applications</h3>
- *
+ *
* <p>In most cases, applications that are using the standard
* {@link android.widget.TextView} or its subclasses will have little they need
* to do to work well with soft input methods. The main things you need to
* be aware of are:</p>
- *
+ *
* <ul>
* <li> Properly set the {@link android.R.attr#inputType} in your editable
* text views, so that the input method will have enough context to help the
@@ -131,43 +129,43 @@ import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
* for your window using the same {@link android.R.attr#windowSoftInputMode}
* attribute.
* </ul>
- *
+ *
* <p>More finer-grained control is available through the APIs here to directly
* interact with the IMF and its IME -- either showing or hiding the input
* area, letting the user pick an input method, etc.</p>
- *
+ *
* <p>For the rare people amongst us writing their own text editors, you
* will need to implement {@link android.view.View#onCreateInputConnection}
* to return a new instance of your own {@link InputConnection} interface
* allowing the IME to interact with your editor.</p>
- *
- *
+ *
+ *
* <a name="InputMethods"></a>
* <h3>Input Methods</h3>
- *
+ *
* <p>An input method (IME) is implemented
* as a {@link android.app.Service}, typically deriving from
* {@link android.inputmethodservice.InputMethodService}. It must provide
* the core {@link InputMethod} interface, though this is normally handled by
* {@link android.inputmethodservice.InputMethodService} and implementors will
* only need to deal with the higher-level API there.</p>
- *
+ *
* See the {@link android.inputmethodservice.InputMethodService} class for
* more information on implementing IMEs.
- *
- *
+ *
+ *
* <a name="Security"></a>
* <h3>Security</h3>
- *
+ *
* <p>There are a lot of security issues associated with input methods,
* since they essentially have freedom to completely drive the UI and monitor
* everything the user enters. The Android input method framework also allows
* arbitrary third party IMEs, so care must be taken to restrict their
* selection and interactions.</p>
- *
+ *
* <p>Here are some key points about the security architecture behind the
* IMF:</p>
- *
+ *
* <ul>
* <li> <p>Only the system is allowed to directly access an IME's
* {@link InputMethod} interface, via the
@@ -175,11 +173,11 @@ import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
* enforced in the system by not binding to an input method service that does
* not require this permission, so the system can guarantee no other untrusted
* clients are accessing the current input method outside of its control.</p>
- *
+ *
* <li> <p>There may be many client processes of the IMF, but only one may
* be active at a time. The inactive clients can not interact with key
* parts of the IMF through the mechanisms described below.</p>
- *
+ *
* <li> <p>Clients of an input method are only given access to its
* {@link InputMethodSession} interface. One instance of this interface is
* created for each client, and only calls from the session associated with
@@ -187,19 +185,19 @@ import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
* by {@link android.inputmethodservice.AbstractInputMethodService} for normal
* IMEs, but must be explicitly handled by an IME that is customizing the
* raw {@link InputMethodSession} implementation.</p>
- *
+ *
* <li> <p>Only the active client's {@link InputConnection} will accept
* operations. The IMF tells each client process whether it is active, and
* the framework enforces that in inactive processes calls on to the current
* InputConnection will be ignored. This ensures that the current IME can
* only deliver events and text edits to the UI that the user sees as
* being in focus.</p>
- *
+ *
* <li> <p>An IME can never interact with an {@link InputConnection} while
* the screen is off. This is enforced by making all clients inactive while
* the screen is off, and prevents bad IMEs from driving the UI when the user
* can not be aware of its behavior.</p>
- *
+ *
* <li> <p>A client application can ask that the system let the user pick a
* new IME, but can not programmatically switch to one itself. This avoids
* malicious applications from switching the user to their own IME, which
@@ -207,7 +205,7 @@ import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
* IME, on the other hand, <em>is</em> allowed to programmatically switch
* the system to another IME, since it already has full control of user
* input.</p>
- *
+ *
* <li> <p>The user must explicitly enable a new IME in settings before
* they can switch to it, to confirm with the system that they know about it
* and want to make it available for use.</p>
@@ -268,11 +266,11 @@ public final class InputMethodManager {
final IInputMethodManager mService;
final Looper mMainLooper;
-
+
// For scheduling work on the main thread. This also serves as our
// global lock.
final H mH;
-
+
// Our generic input connection if the current target does not have its own.
final IInputContext mIInputContext;
@@ -280,20 +278,20 @@ public final class InputMethodManager {
* True if this input method client is active, initially false.
*/
boolean mActive = false;
-
+
/**
* Set whenever this client becomes inactive, to know we need to reset
* state with the IME the next time we receive focus.
*/
boolean mHasBeenInactive = true;
-
+
/**
* As reported by IME through InputConnection.
*/
boolean mFullscreenMode;
-
+
// -----------------------------------------------------------
-
+
/**
* This is the root view of the overall window that currently has input
* method focus.
@@ -328,7 +326,7 @@ public final class InputMethodManager {
* The completions that were last provided by the served view.
*/
CompletionInfo[] mCompletions;
-
+
// Cursor position on the screen.
Rect mTmpCursorRect = new Rect();
Rect mCursorRect = new Rect();
@@ -389,7 +387,7 @@ public final class InputMethodManager {
final SparseArray<PendingEvent> mPendingEvents = new SparseArray<>(20);
// -----------------------------------------------------------
-
+
static final int MSG_DUMP = 1;
static final int MSG_BIND = 2;
static final int MSG_UNBIND = 3;
@@ -403,7 +401,7 @@ public final class InputMethodManager {
H(Looper looper) {
super(looper, null, true);
}
-
+
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
@@ -654,7 +652,7 @@ public final class InputMethodManager {
return sInstance;
}
}
-
+
/**
* Private optimization: retrieve the global InputMethodManager instance,
* if it exists.
@@ -663,17 +661,17 @@ public final class InputMethodManager {
public static InputMethodManager peekInstance() {
return sInstance;
}
-
+
/** @hide */
public IInputMethodClient getClient() {
return mClient;
}
-
+
/** @hide */
public IInputContext getInputContext() {
return mIInputContext;
}
-
+
public List<InputMethodInfo> getInputMethodList() {
try {
return mService.getInputMethodList();
@@ -784,7 +782,7 @@ public final class InputMethodManager {
&& mCurrentTextBoxAttribute != null;
}
}
-
+
/**
* Return true if any view is currently active in the input method.
*/
@@ -794,7 +792,7 @@ public final class InputMethodManager {
return mServedView != null && mCurrentTextBoxAttribute != null;
}
}
-
+
/**
* Return true if the currently served view is accepting full text edits.
* If false, it has no input connection, so can only handle raw key events.
@@ -871,7 +869,7 @@ public final class InputMethodManager {
|| !mServedView.checkInputConnectionProxy(view))) {
return;
}
-
+
mCompletions = completions;
if (mCurMethod != null) {
try {
@@ -881,7 +879,7 @@ public final class InputMethodManager {
}
}
}
-
+
public void updateExtractedText(View view, int token, ExtractedText text) {
checkFocus();
synchronized (mH) {
@@ -889,7 +887,7 @@ public final class InputMethodManager {
|| !mServedView.checkInputConnectionProxy(view))) {
return;
}
-
+
if (mCurMethod != null) {
try {
mCurMethod.updateExtractedText(token, text);
@@ -898,26 +896,26 @@ public final class InputMethodManager {
}
}
}
-
+
/**
* Flag for {@link #showSoftInput} to indicate that this is an implicit
* request to show the input window, not as the result of a direct request
* by the user. The window may not be shown in this case.
*/
public static final int SHOW_IMPLICIT = 0x0001;
-
+
/**
* Flag for {@link #showSoftInput} to indicate that the user has forced
* the input method open (such as by long-pressing menu) so it should
* not be closed until they explicitly do so.
*/
public static final int SHOW_FORCED = 0x0002;
-
+
/**
* Synonym for {@link #showSoftInput(View, int, ResultReceiver)} without
* a result receiver: explicitly request that the current input method's
* soft input area be shown to the user, if needed.
- *
+ *
* @param view The currently focused view, which would like to receive
* soft keyboard input.
* @param flags Provides additional operating flags. Currently may be
@@ -926,7 +924,7 @@ public final class InputMethodManager {
public boolean showSoftInput(View view, int flags) {
return showSoftInput(view, flags, null);
}
-
+
/**
* Flag for the {@link ResultReceiver} result code from
* {@link #showSoftInput(View, int, ResultReceiver)} and
@@ -934,7 +932,7 @@ public final class InputMethodManager {
* state of the soft input window was unchanged and remains shown.
*/
public static final int RESULT_UNCHANGED_SHOWN = 0;
-
+
/**
* Flag for the {@link ResultReceiver} result code from
* {@link #showSoftInput(View, int, ResultReceiver)} and
@@ -942,7 +940,7 @@ public final class InputMethodManager {
* state of the soft input window was unchanged and remains hidden.
*/
public static final int RESULT_UNCHANGED_HIDDEN = 1;
-
+
/**
* Flag for the {@link ResultReceiver} result code from
* {@link #showSoftInput(View, int, ResultReceiver)} and
@@ -950,7 +948,7 @@ public final class InputMethodManager {
* state of the soft input window changed from hidden to shown.
*/
public static final int RESULT_SHOWN = 2;
-
+
/**
* Flag for the {@link ResultReceiver} result code from
* {@link #showSoftInput(View, int, ResultReceiver)} and
@@ -958,7 +956,7 @@ public final class InputMethodManager {
* state of the soft input window changed from shown to hidden.
*/
public static final int RESULT_HIDDEN = 3;
-
+
/**
* Explicitly request that the current input method's soft input area be
* shown to the user, if needed. Call this if the user interacts with
@@ -1000,7 +998,7 @@ public final class InputMethodManager {
}
}
}
-
+
/** @hide */
public void showSoftInputUnchecked(int flags, ResultReceiver resultReceiver) {
try {
@@ -1009,14 +1007,14 @@ public final class InputMethodManager {
throw e.rethrowFromSystemServer();
}
}
-
+
/**
* Flag for {@link #hideSoftInputFromWindow} to indicate that the soft
* input window should only be hidden if it was not explicitly shown
* by the user.
*/
public static final int HIDE_IMPLICIT_ONLY = 0x0001;
-
+
/**
* Flag for {@link #hideSoftInputFromWindow} to indicate that the soft
* input window should normally be hidden, unless it was originally
@@ -1028,7 +1026,7 @@ public final class InputMethodManager {
* Synonym for {@link #hideSoftInputFromWindow(IBinder, int, ResultReceiver)}
* without a result: request to hide the soft input window from the
* context of the window that is currently accepting input.
- *
+ *
* @param windowToken The token of the window that is making the request,
* as returned by {@link View#getWindowToken() View.getWindowToken()}.
* @param flags Provides additional operating flags. Currently may be
@@ -1037,7 +1035,7 @@ public final class InputMethodManager {
public boolean hideSoftInputFromWindow(IBinder windowToken, int flags) {
return hideSoftInputFromWindow(windowToken, flags, null);
}
-
+
/**
* Request to hide the soft input window from the context of the window
* that is currently accepting input. This should be called as a result
@@ -1079,11 +1077,11 @@ public final class InputMethodManager {
}
}
}
-
+
/**
* This method toggles the input method window display.
- * If the input window is already displayed, it gets hidden.
+ * If the input window is already displayed, it gets hidden.
* If not the input window will be displayed.
* @param windowToken The token of the window that is making the request,
* as returned by {@link View#getWindowToken() View.getWindowToken()}.
@@ -1110,7 +1108,7 @@ public final class InputMethodManager {
/*
* This method toggles the input method window display.
- * If the input window is already displayed, it gets hidden.
+ * If the input window is already displayed, it gets hidden.
* If not the input window will be displayed.
* @param showFlags Provides additional operating flags. May be
* 0 or have the {@link #SHOW_IMPLICIT},
@@ -1134,7 +1132,7 @@ public final class InputMethodManager {
* restart it with its new contents. You should call this when the text
* within your view changes outside of the normal input method or key
* input flow, such as when an application calls TextView.setText().
- *
+ *
* @param view The view whose text has changed.
*/
public void restartInput(View view) {
@@ -1144,7 +1142,7 @@ public final class InputMethodManager {
|| !mServedView.checkInputConnectionProxy(view))) {
return;
}
-
+
mServedConnecting = true;
}
@@ -1196,7 +1194,7 @@ public final class InputMethodManager {
});
return false;
}
-
+
// Okay we are now ready to call into the served view and have it
// do its stuff.
// Life is good: let's hook everything up!
@@ -1465,7 +1463,7 @@ public final class InputMethodManager {
return true;
}
-
+
void closeCurrentInput() {
try {
mService.hideSoftInput(mClient, HIDE_NOT_ALWAYS, null);
@@ -1504,7 +1502,7 @@ public final class InputMethodManager {
if (first) {
controlFlags |= CONTROL_WINDOW_FIRST;
}
-
+
if (checkFocusNoStartInput(forceNewFocus)) {
// We need to restart input on the current focus view. This
// should be done in conjunction with telling the system service
@@ -1792,7 +1790,7 @@ public final class InputMethodManager {
* Close/hide the input method's soft input area, so the user no longer
* sees it or can interact with it. This can only be called
* from the currently active input method, as validated by the given token.
- *
+ *
* @param token Supplies the identifying token given to an input method
* when it was started, which allows it to perform this operation on
* itself.
@@ -1807,13 +1805,13 @@ public final class InputMethodManager {
throw e.rethrowFromSystemServer();
}
}
-
+
/**
- * Show the input method's soft input area, so the user
+ * Show the input method's soft input area, so the user
* sees the input method window and can interact with it.
* This can only be called from the currently active input method,
* as validated by the given token.
- *
+ *
* @param token Supplies the identifying token given to an input method
* when it was started, which allows it to perform this operation on
* itself.
@@ -2335,7 +2333,7 @@ public final class InputMethodManager {
void doDump(FileDescriptor fd, PrintWriter fout, String[] args) {
final Printer p = new PrintWriterPrinter(fout);
p.println("Input method client state for " + this + ":");
-
+
p.println(" mService=" + mService);
p.println(" mMainLooper=" + mMainLooper);
p.println(" mIInputContext=" + mIInputContext);
diff --git a/core/java/android/view/textservice/SpellCheckerInfo.java b/core/java/android/view/textservice/SpellCheckerInfo.java
index fc17f7aed301..7aa2c23ae5e0 100644
--- a/core/java/android/view/textservice/SpellCheckerInfo.java
+++ b/core/java/android/view/textservice/SpellCheckerInfo.java
@@ -16,9 +16,6 @@
package android.view.textservice;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -35,6 +32,9 @@ import android.util.PrintWriterPrinter;
import android.util.Slog;
import android.util.Xml;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
diff --git a/core/java/android/view/textservice/SpellCheckerSession.java b/core/java/android/view/textservice/SpellCheckerSession.java
index e77dc0dd97d8..729eb8d131a7 100644
--- a/core/java/android/view/textservice/SpellCheckerSession.java
+++ b/core/java/android/view/textservice/SpellCheckerSession.java
@@ -16,11 +16,6 @@
package android.view.textservice;
-import com.android.internal.textservice.ISpellCheckerSession;
-import com.android.internal.textservice.ISpellCheckerSessionListener;
-import com.android.internal.textservice.ITextServicesManager;
-import com.android.internal.textservice.ITextServicesSessionListener;
-
import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
@@ -29,6 +24,11 @@ import android.os.Process;
import android.os.RemoteException;
import android.util.Log;
+import com.android.internal.textservice.ISpellCheckerSession;
+import com.android.internal.textservice.ISpellCheckerSessionListener;
+import com.android.internal.textservice.ITextServicesManager;
+import com.android.internal.textservice.ITextServicesSessionListener;
+
import java.util.LinkedList;
import java.util.Queue;
diff --git a/core/java/android/view/textservice/SpellCheckerSubtype.java b/core/java/android/view/textservice/SpellCheckerSubtype.java
index 8dff0c67eeee..026610ecb6f9 100644
--- a/core/java/android/view/textservice/SpellCheckerSubtype.java
+++ b/core/java/android/view/textservice/SpellCheckerSubtype.java
@@ -16,8 +16,6 @@
package android.view.textservice;
-import com.android.internal.inputmethod.InputMethodUtils;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
@@ -27,6 +25,8 @@ import android.os.Parcelable;
import android.text.TextUtils;
import android.util.Slog;
+import com.android.internal.inputmethod.InputMethodUtils;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
diff --git a/core/java/android/view/textservice/SuggestionsInfo.java b/core/java/android/view/textservice/SuggestionsInfo.java
index 78bc1a9678f1..dc2051cccbf6 100644
--- a/core/java/android/view/textservice/SuggestionsInfo.java
+++ b/core/java/android/view/textservice/SuggestionsInfo.java
@@ -16,11 +16,11 @@
package android.view.textservice;
-import com.android.internal.util.ArrayUtils;
-
import android.os.Parcel;
import android.os.Parcelable;
+import com.android.internal.util.ArrayUtils;
+
/**
* This class contains a metadata of suggestions from the text service
*/
diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java
index 01a95a4205d4..5d136dca51ec 100644
--- a/core/java/android/widget/AbsSeekBar.java
+++ b/core/java/android/widget/AbsSeekBar.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
@@ -36,6 +34,8 @@ import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.view.accessibility.AccessibilityNodeInfo;
+import com.android.internal.R;
+
/**
* AbsSeekBar extends the capabilities of ProgressBar by adding a draggable thumb.
@@ -469,7 +469,7 @@ public abstract class AbsSeekBar extends ProgressBar {
/**
* Returns the amount of progress changed via the arrow keys.
* <p>
- * By default, this will be a value that is derived from the max progress.
+ * By default, this will be a value that is derived from the progress range.
*
* @return The amount to increment or decrement when the user presses the
* arrow keys. This will be positive.
@@ -479,13 +479,27 @@ public abstract class AbsSeekBar extends ProgressBar {
}
@Override
+ public synchronized void setMin(int min) {
+ super.setMin(min);
+ int range = getMax() - getMin();
+
+ if ((mKeyProgressIncrement == 0) || (range / mKeyProgressIncrement > 20)) {
+
+ // It will take the user too long to change this via keys, change it
+ // to something more reasonable
+ setKeyProgressIncrement(Math.max(1, Math.round((float) range / 20)));
+ }
+ }
+
+ @Override
public synchronized void setMax(int max) {
super.setMax(max);
+ int range = getMax() - getMin();
- if ((mKeyProgressIncrement == 0) || (getMax() / mKeyProgressIncrement > 20)) {
+ if ((mKeyProgressIncrement == 0) || (range / mKeyProgressIncrement > 20)) {
// It will take the user too long to change this via keys, change it
// to something more reasonable
- setKeyProgressIncrement(Math.max(1, Math.round((float) getMax() / 20)));
+ setKeyProgressIncrement(Math.max(1, Math.round((float) range / 20)));
}
}
@@ -596,8 +610,10 @@ public abstract class AbsSeekBar extends ProgressBar {
}
private float getScale() {
- final int max = getMax();
- return max > 0 ? getProgress() / (float) max : 0;
+ int min = getMin();
+ int max = getMax();
+ int range = max - min;
+ return range > 0 ? (getProgress() - min) / (float) range : 0;
}
/**
@@ -691,7 +707,7 @@ public abstract class AbsSeekBar extends ProgressBar {
*/
void drawTickMarks(Canvas canvas) {
if (mTickMark != null) {
- final int count = getMax();
+ final int count = getMax() - getMin();
if (count > 1) {
final int w = mTickMark.getIntrinsicWidth();
final int h = mTickMark.getIntrinsicHeight();
@@ -847,8 +863,8 @@ public abstract class AbsSeekBar extends ProgressBar {
}
}
- final int max = getMax();
- progress += scale * max;
+ final int range = getMax() - getMin();
+ progress += scale * range;
setHotspot(x, y);
setProgressInternal(Math.round(progress), true, false);
@@ -922,7 +938,7 @@ public abstract class AbsSeekBar extends ProgressBar {
if (isEnabled()) {
final int progress = getProgress();
- if (progress > 0) {
+ if (progress > getMin()) {
info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD);
}
if (progress < getMax()) {
@@ -960,7 +976,8 @@ public abstract class AbsSeekBar extends ProgressBar {
if (!canUserSetProgress()) {
return false;
}
- int increment = Math.max(1, Math.round((float) getMax() / 20));
+ int range = getMax() - getMin();
+ int increment = Math.max(1, Math.round((float) range / 20));
if (action == AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD) {
increment = -increment;
}
diff --git a/core/java/android/widget/AbsSpinner.java b/core/java/android/widget/AbsSpinner.java
index 18db54ec5da0..bc3dfffc1411 100644
--- a/core/java/android/widget/AbsSpinner.java
+++ b/core/java/android/widget/AbsSpinner.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.content.Context;
import android.content.res.TypedArray;
import android.database.DataSetObserver;
@@ -29,10 +27,12 @@ import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
+import com.android.internal.R;
+
/**
* An abstract base class for spinner widgets. SDK users will probably not
* need to use this class.
- *
+ *
* @attr ref android.R.styleable#AbsSpinner_entries
*/
public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
@@ -104,12 +104,12 @@ public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
mAdapter.unregisterDataSetObserver(mDataSetObserver);
resetList();
}
-
+
mAdapter = adapter;
-
+
mOldSelectedPosition = INVALID_POSITION;
mOldSelectedRowId = INVALID_ROW_ID;
-
+
if (mAdapter != null) {
mOldItemCount = mItemCount;
mItemCount = mAdapter.getCount();
@@ -122,14 +122,14 @@ public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
setSelectedPositionInt(position);
setNextSelectedPositionInt(position);
-
+
if (mItemCount == 0) {
// Nothing selected
checkSelectionChanged();
}
-
+
} else {
- checkFocus();
+ checkFocus();
resetList();
// Nothing selected
checkSelectionChanged();
@@ -144,23 +144,23 @@ public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
void resetList() {
mDataChanged = false;
mNeedSync = false;
-
+
removeAllViewsInLayout();
mOldSelectedPosition = INVALID_POSITION;
mOldSelectedRowId = INVALID_ROW_ID;
-
+
setSelectedPositionInt(INVALID_POSITION);
setNextSelectedPositionInt(INVALID_POSITION);
invalidate();
}
- /**
+ /**
* @see android.view.View#measure(int, int)
- *
+ *
* Figure out the dimensions of this Spinner. The width comes from
* the widthMeasureSpec as Spinnners can't have their width set to
* UNSPECIFIED. The height is based on the height of the selected item
- * plus padding.
+ * plus padding.
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
@@ -180,11 +180,11 @@ public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
if (mDataChanged) {
handleDataChanged();
}
-
+
int preferredHeight = 0;
int preferredWidth = 0;
boolean needsMeasuring = true;
-
+
int selectedPosition = getSelectedItemPosition();
if (selectedPosition >= 0 && mAdapter != null && selectedPosition < mAdapter.getCount()) {
// Try looking in the recycler. (Maybe we were measured once already)
@@ -208,14 +208,14 @@ public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
mBlockLayoutRequests = false;
}
measureChild(view, widthMeasureSpec, heightMeasureSpec);
-
+
preferredHeight = getChildHeight(view) + mSpinnerPadding.top + mSpinnerPadding.bottom;
preferredWidth = getChildWidth(view) + mSpinnerPadding.left + mSpinnerPadding.right;
-
+
needsMeasuring = false;
}
}
-
+
if (needsMeasuring) {
// No views -- just use padding
preferredHeight = mSpinnerPadding.top + mSpinnerPadding.bottom;
@@ -238,18 +238,18 @@ public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
int getChildHeight(View child) {
return child.getMeasuredHeight();
}
-
+
int getChildWidth(View child) {
return child.getMeasuredWidth();
}
-
+
@Override
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
return new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
-
+
void recycleAllViews() {
final int childCount = getChildCount();
final AbsSpinner.RecycleBin recycleBin = mRecycler;
@@ -260,7 +260,7 @@ public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
View v = getChildAt(i);
int index = position + i;
recycleBin.put(index, v);
- }
+ }
}
/**
@@ -279,14 +279,14 @@ public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
requestLayout();
invalidate();
}
-
+
/**
* Makes the item at the supplied position selected.
- *
+ *
* @param position Position to select
* @param animate Should the transition be animated
- *
+ *
*/
void setSelectionInt(int position, boolean animate) {
if (position != mOldSelectedPosition) {
@@ -308,11 +308,11 @@ public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
return null;
}
}
-
+
/**
* Override to prevent spamming ourselves with layout requests
* as we place views
- *
+ *
* @see android.view.View#requestLayout()
*/
@Override
@@ -334,7 +334,7 @@ public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
/**
* Maps a point to a position in the list.
- *
+ *
* @param x X in local coordinate
* @param y Y in local coordinate
* @return The position of the item which contains the specified point, or
@@ -378,7 +378,7 @@ public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
SavedState(Parcelable superState) {
super(superState);
}
-
+
/**
* Constructor called from {@link #CREATOR}
*/
@@ -431,7 +431,7 @@ public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
@Override
public void onRestoreInstanceState(Parcelable state) {
SavedState ss = (SavedState) state;
-
+
super.onRestoreInstanceState(ss.getSuperState());
if (ss.selectedId >= 0) {
@@ -450,7 +450,7 @@ public abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
public void put(int position, View v) {
mScrapHeap.put(position, v);
}
-
+
View get(int position) {
// System.out.print("Looking for " + position);
View result = mScrapHeap.get(position);
diff --git a/core/java/android/widget/ActionMenuPresenter.java b/core/java/android/widget/ActionMenuPresenter.java
index ac8d578adae8..46269c667a8f 100644
--- a/core/java/android/widget/ActionMenuPresenter.java
+++ b/core/java/android/widget/ActionMenuPresenter.java
@@ -39,6 +39,7 @@ import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityNodeInfo;
+
import com.android.internal.view.ActionBarPolicy;
import com.android.internal.view.menu.ActionMenuItemView;
import com.android.internal.view.menu.BaseMenuPresenter;
diff --git a/core/java/android/widget/ActionMenuView.java b/core/java/android/widget/ActionMenuView.java
index 4d0a1c86fd92..c4bbdb005fe0 100644
--- a/core/java/android/widget/ActionMenuView.java
+++ b/core/java/android/widget/ActionMenuView.java
@@ -31,6 +31,7 @@ import android.view.ViewDebug;
import android.view.ViewGroup;
import android.view.ViewHierarchyEncoder;
import android.view.accessibility.AccessibilityEvent;
+
import com.android.internal.view.menu.ActionMenuItemView;
import com.android.internal.view.menu.MenuBuilder;
import com.android.internal.view.menu.MenuItemImpl;
@@ -45,7 +46,7 @@ import com.android.internal.view.menu.MenuView;
*/
public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvoker, MenuView {
private static final String TAG = "ActionMenuView";
-
+
static final int MIN_CELL_SIZE = 56; // dips
static final int GENERATED_ITEM_PADDING = 4; // dips
@@ -71,7 +72,7 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo
public ActionMenuView(Context context) {
this(context, null);
}
-
+
public ActionMenuView(Context context, AttributeSet attrs) {
super(context, attrs);
setBaselineAligned(false);
@@ -579,7 +580,7 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo
params.gravity = Gravity.CENTER_VERTICAL;
return params;
}
-
+
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new LayoutParams(getContext(), attrs);
diff --git a/core/java/android/widget/ActivityChooserView.java b/core/java/android/widget/ActivityChooserView.java
index f5c46db94f4f..51587a74987d 100644
--- a/core/java/android/widget/ActivityChooserView.java
+++ b/core/java/android/widget/ActivityChooserView.java
@@ -16,9 +16,6 @@
package android.widget;
-import com.android.internal.R;
-import com.android.internal.view.menu.ShowableListMenu;
-
import android.annotation.StringRes;
import android.content.Context;
import android.content.Intent;
@@ -39,6 +36,9 @@ import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.ActivityChooserModel.ActivityChooserModelClient;
+import com.android.internal.R;
+import com.android.internal.view.menu.ShowableListMenu;
+
/**
* This class is a view for choosing an activity for handling a given {@link Intent}.
* <p>
diff --git a/core/java/android/widget/AnalogClock.java b/core/java/android/widget/AnalogClock.java
index 7f5e21330b19..bde5f7fd5129 100644
--- a/core/java/android/widget/AnalogClock.java
+++ b/core/java/android/widget/AnalogClock.java
@@ -16,15 +16,14 @@
package android.widget;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.BroadcastReceiver;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
-import android.os.Handler;
import android.text.format.DateUtils;
import android.text.format.Time;
import android.util.AttributeSet;
@@ -258,7 +257,7 @@ public class AnalogClock extends View {
}
onTimeChanged();
-
+
invalidate();
}
};
diff --git a/core/java/android/widget/AppSecurityPermissions.java b/core/java/android/widget/AppSecurityPermissions.java
index 1a1680a16f41..68e6809a3f68 100644
--- a/core/java/android/widget/AppSecurityPermissions.java
+++ b/core/java/android/widget/AppSecurityPermissions.java
@@ -16,10 +16,6 @@
*/
package android.widget;
-import android.annotation.SystemApi;
-import android.os.UserHandle;
-import com.android.internal.R;
-
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
@@ -31,6 +27,7 @@ import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
+import android.os.UserHandle;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.util.AttributeSet;
@@ -39,6 +36,8 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import com.android.internal.R;
+
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
@@ -57,7 +56,7 @@ import java.util.Set;
* extended information consisting of all groups and permissions.
* To use this view define a LinearLayout or any ViewGroup and add this
* view by instantiating AppSecurityPermissions and invoking getPermissionsView.
- *
+ *
* {@hide}
*/
public class AppSecurityPermissions {
@@ -324,7 +323,7 @@ public class AppSecurityPermissions {
return getPermissionItemViewOld(context, inflater, grpName,
description, dangerous, icon);
}
-
+
private void getAllUsedPermissions(int sharedUid, Set<MyPermissionInfo> permSet) {
String sharedPkgList[] = mPm.getPackagesForUid(sharedUid);
if(sharedPkgList == null || (sharedPkgList.length == 0)) {
@@ -334,7 +333,7 @@ public class AppSecurityPermissions {
getPermissionsForPackage(sharedPkg, permSet);
}
}
-
+
private void getPermissionsForPackage(String packageName, Set<MyPermissionInfo> permSet) {
try {
PackageInfo pkgInfo = mPm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);
@@ -417,7 +416,7 @@ public class AppSecurityPermissions {
}
}
}
-
+
public int getPermissionCount() {
return getPermissionCount(WHICH_ALL);
}
@@ -570,7 +569,7 @@ public class AppSecurityPermissions {
}
return false;
}
-
+
private static class PermissionGroupInfoComparator implements Comparator<MyPermissionGroupInfo> {
private final Collator sCollator = Collator.getInstance();
@Override
@@ -578,7 +577,7 @@ public class AppSecurityPermissions {
return sCollator.compare(a.mLabel, b.mLabel);
}
}
-
+
private static class PermissionInfoComparator implements Comparator<MyPermissionInfo> {
private final Collator sCollator = Collator.getInstance();
PermissionInfoComparator() {
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index 6a4e36a9a578..49741d4d111e 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -39,7 +39,9 @@ import android.view.WindowManager;
import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
+
import com.android.internal.R;
+
import java.lang.ref.WeakReference;
/**
@@ -362,22 +364,22 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
* <p>Returns the current width for the auto-complete drop down list. This can
* be a fixed width, or {@link ViewGroup.LayoutParams#MATCH_PARENT} to fill the screen, or
* {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the width of its anchor view.</p>
- *
+ *
* @return the width for the drop down list
- *
+ *
* @attr ref android.R.styleable#AutoCompleteTextView_dropDownWidth
*/
public int getDropDownWidth() {
return mPopup.getWidth();
}
-
+
/**
* <p>Sets the current width for the auto-complete drop down list. This can
* be a fixed width, or {@link ViewGroup.LayoutParams#MATCH_PARENT} to fill the screen, or
* {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the width of its anchor view.</p>
- *
+ *
* @param width the width to use
- *
+ *
* @attr ref android.R.styleable#AutoCompleteTextView_dropDownWidth
*/
public void setDropDownWidth(int width) {
@@ -411,68 +413,68 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
public void setDropDownHeight(int height) {
mPopup.setHeight(height);
}
-
+
/**
* <p>Returns the id for the view that the auto-complete drop down list is anchored to.</p>
- *
+ *
* @return the view's id, or {@link View#NO_ID} if none specified
- *
+ *
* @attr ref android.R.styleable#AutoCompleteTextView_dropDownAnchor
*/
public int getDropDownAnchor() {
return mDropDownAnchorId;
}
-
+
/**
* <p>Sets the view to which the auto-complete drop down list should anchor. The view
* corresponding to this id will not be loaded until the next time it is needed to avoid
* loading a view which is not yet instantiated.</p>
- *
+ *
* @param id the id to anchor the drop down list view to
- *
- * @attr ref android.R.styleable#AutoCompleteTextView_dropDownAnchor
+ *
+ * @attr ref android.R.styleable#AutoCompleteTextView_dropDownAnchor
*/
public void setDropDownAnchor(int id) {
mDropDownAnchorId = id;
mPopup.setAnchorView(null);
}
-
+
/**
* <p>Gets the background of the auto-complete drop-down list.</p>
- *
+ *
* @return the background drawable
- *
+ *
* @attr ref android.R.styleable#PopupWindow_popupBackground
*/
public Drawable getDropDownBackground() {
return mPopup.getBackground();
}
-
+
/**
* <p>Sets the background of the auto-complete drop-down list.</p>
- *
+ *
* @param d the drawable to set as the background
- *
+ *
* @attr ref android.R.styleable#PopupWindow_popupBackground
*/
public void setDropDownBackgroundDrawable(Drawable d) {
mPopup.setBackgroundDrawable(d);
}
-
+
/**
* <p>Sets the background of the auto-complete drop-down list.</p>
- *
+ *
* @param id the id of the drawable to set as the background
- *
+ *
* @attr ref android.R.styleable#PopupWindow_popupBackground
*/
public void setDropDownBackgroundResource(@DrawableRes int id) {
mPopup.setBackgroundDrawable(getContext().getDrawable(id));
}
-
+
/**
* <p>Sets the vertical offset used for the auto-complete drop-down list.</p>
- *
+ *
* @param offset the vertical offset
*
* @attr ref android.R.styleable#ListPopupWindow_dropDownVerticalOffset
@@ -480,10 +482,10 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
public void setDropDownVerticalOffset(int offset) {
mPopup.setVerticalOffset(offset);
}
-
+
/**
* <p>Gets the vertical offset used for the auto-complete drop-down list.</p>
- *
+ *
* @return the vertical offset
*
* @attr ref android.R.styleable#ListPopupWindow_dropDownVerticalOffset
@@ -491,10 +493,10 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
public int getDropDownVerticalOffset() {
return mPopup.getVerticalOffset();
}
-
+
/**
* <p>Sets the horizontal offset used for the auto-complete drop-down list.</p>
- *
+ *
* @param offset the horizontal offset
*
* @attr ref android.R.styleable#ListPopupWindow_dropDownHorizontalOffset
@@ -502,10 +504,10 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
public void setDropDownHorizontalOffset(int offset) {
mPopup.setHorizontalOffset(offset);
}
-
+
/**
* <p>Gets the horizontal offset used for the auto-complete drop-down list.</p>
- *
+ *
* @return the horizontal offset
*
* @attr ref android.R.styleable#ListPopupWindow_dropDownHorizontalOffset
@@ -567,10 +569,10 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
public void setDropDownAlwaysVisible(boolean dropDownAlwaysVisible) {
mPopup.setDropDownAlwaysVisible(dropDownAlwaysVisible);
}
-
+
/**
* Checks whether the drop-down is dismissed when a suggestion is clicked.
- *
+ *
* @hide Pending API council approval
*/
public boolean isDropDownDismissedOnCompletion() {
@@ -578,17 +580,17 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
}
/**
- * Sets whether the drop-down is dismissed when a suggestion is clicked. This is
+ * Sets whether the drop-down is dismissed when a suggestion is clicked. This is
* true by default.
- *
+ *
* @param dropDownDismissedOnCompletion Whether to dismiss the drop-down.
- *
+ *
* @hide Pending API council approval
*/
public void setDropDownDismissedOnCompletion(boolean dropDownDismissedOnCompletion) {
mDropDownDismissedOnCompletion = dropDownDismissedOnCompletion;
}
-
+
/**
* <p>Returns the number of characters the user must type before the drop
* down list is shown.</p>
@@ -720,13 +722,13 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
/**
* <p>Changes the list of data used for auto completion. The provided list
* must be a filterable list adapter.</p>
- *
+ *
* <p>The caller is still responsible for managing any resources used by the adapter.
* Notably, when the AutoCompleteTextView is closed or released, the adapter is not notified.
* A common case is the use of {@link android.widget.CursorAdapter}, which
* contains a {@link android.database.Cursor} that must be closed. This can be done
- * automatically (see
- * {@link android.app.Activity#startManagingCursor(android.database.Cursor)
+ * automatically (see
+ * {@link android.app.Activity#startManagingCursor(android.database.Cursor)
* startManagingCursor()}),
* or by manually closing the cursor when the AutoCompleteTextView is dismissed.</p>
*
@@ -811,7 +813,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
if (mPopup.onKeyDown(keyCode, event)) {
return true;
}
-
+
if (!isPopupShowing()) {
switch(keyCode) {
case KeyEvent.KEYCODE_DPAD_DOWN:
@@ -924,18 +926,18 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
protected CharSequence convertSelectionToString(Object selectedItem) {
return mFilter.convertResultToString(selectedItem);
}
-
+
/**
- * <p>Clear the list selection. This may only be temporary, as user input will often bring
+ * <p>Clear the list selection. This may only be temporary, as user input will often bring
* it back.
*/
public void clearListSelection() {
mPopup.clearListSelection();
}
-
+
/**
* Set the position of the dropdown view selection.
- *
+ *
* @param position The position to move the selector to.
*/
public void setListSelection(int position) {
@@ -943,13 +945,13 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
}
/**
- * Get the position of the dropdown view selection, if there is one. Returns
+ * Get the position of the dropdown view selection, if there is one. Returns
* {@link ListView#INVALID_POSITION ListView.INVALID_POSITION} if there is no dropdown or if
* there is no selection.
- *
- * @return the position of the current selection, if there is one, or
+ *
+ * @return the position of the current selection, if there is one, or
* {@link ListView#INVALID_POSITION ListView.INVALID_POSITION} if not.
- *
+ *
* @see ListView#getSelectedItemPosition()
*/
public int getListSelection() {
@@ -1020,7 +1022,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
dismissDropDown();
}
}
-
+
/**
* Identifies whether the view is currently performing a text completion, so subclasses
* can decide whether to respond to text changed events.
@@ -1172,7 +1174,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
public void showDropDownAfterLayout() {
mPopup.postShow();
}
-
+
/**
* Ensures that the drop down is not obscuring the IME.
* @param visible whether the ime should be in front. If false, the ime is pushed to
@@ -1220,7 +1222,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
* Forces outside touches to be ignored. Normally if {@link #isDropDownAlwaysVisible()} is
* false, we allow outside touch to dismiss the dropdown. If this is set to true, then we
* ignore outside touch even when the drop down is not set to always visible.
- *
+ *
* @hide used only by SearchDialog
*/
public void setForceIgnoreOutsideTouch(boolean forceIgnoreOutsideTouch) {
@@ -1245,7 +1247,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
realCount++;
}
}
-
+
if (realCount != count) {
CompletionInfo[] tmp = new CompletionInfo[realCount];
System.arraycopy(completions, 0, tmp, 0, realCount);
@@ -1340,7 +1342,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
*/
CharSequence fixText(CharSequence invalidText);
}
-
+
/**
* Listener to respond to the AutoCompleteTextView's completion list being dismissed.
* @see AutoCompleteTextView#setOnDismissListener(OnDismissListener)
diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java
index 6ef15764bf00..db50e343b775 100644
--- a/core/java/android/widget/CalendarView.java
+++ b/core/java/android/widget/CalendarView.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.annotation.AttrRes;
import android.annotation.ColorInt;
import android.annotation.DrawableRes;
@@ -36,6 +34,8 @@ import android.icu.util.TimeZone;
import android.util.AttributeSet;
import android.util.Log;
+import com.android.internal.R;
+
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
diff --git a/core/java/android/widget/CalendarViewLegacyDelegate.java b/core/java/android/widget/CalendarViewLegacyDelegate.java
index bcda83fbd95c..557d41179921 100644
--- a/core/java/android/widget/CalendarViewLegacyDelegate.java
+++ b/core/java/android/widget/CalendarViewLegacyDelegate.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.app.Service;
import android.content.Context;
import android.content.res.Configuration;
@@ -38,10 +36,12 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
-import java.util.Locale;
+import com.android.internal.R;
import libcore.icu.LocaleData;
+import java.util.Locale;
+
/**
* A delegate implementing the legacy CalendarView
*/
diff --git a/core/java/android/widget/CheckBox.java b/core/java/android/widget/CheckBox.java
index 15bbdd217751..046f75fd37ac 100644
--- a/core/java/android/widget/CheckBox.java
+++ b/core/java/android/widget/CheckBox.java
@@ -19,7 +19,6 @@ package android.widget;
import android.content.Context;
import android.util.AttributeSet;
-
/**
* <p>
* A checkbox is a specific type of two-states button that can be either
@@ -44,12 +43,12 @@ import android.util.AttributeSet;
*
* <p>See the <a href="{@docRoot}guide/topics/ui/controls/checkbox.html">Checkboxes</a>
* guide.</p>
- *
- * <p><strong>XML attributes</strong></p>
+ *
+ * <p><strong>XML attributes</strong></p>
* <p>
- * See {@link android.R.styleable#CompoundButton CompoundButton Attributes},
- * {@link android.R.styleable#Button Button Attributes},
- * {@link android.R.styleable#TextView TextView Attributes},
+ * See {@link android.R.styleable#CompoundButton CompoundButton Attributes},
+ * {@link android.R.styleable#Button Button Attributes},
+ * {@link android.R.styleable#TextView TextView Attributes},
* {@link android.R.styleable#View View Attributes}
* </p>
*/
@@ -57,7 +56,7 @@ public class CheckBox extends CompoundButton {
public CheckBox(Context context) {
this(context, null);
}
-
+
public CheckBox(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.checkboxStyle);
}
diff --git a/core/java/android/widget/CheckedTextView.java b/core/java/android/widget/CheckedTextView.java
index 21595d15e624..92bfd56d8988 100644
--- a/core/java/android/widget/CheckedTextView.java
+++ b/core/java/android/widget/CheckedTextView.java
@@ -16,11 +16,8 @@
package android.widget;
-import android.annotation.NonNull;
-import android.view.ViewHierarchyEncoder;
-import com.android.internal.R;
-
import android.annotation.DrawableRes;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -34,9 +31,12 @@ import android.util.AttributeSet;
import android.view.Gravity;
import android.view.RemotableViewMethod;
import android.view.ViewDebug;
+import android.view.ViewHierarchyEncoder;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
+import com.android.internal.R;
+
/**
* An extension to {@link TextView} that supports the {@link Checkable}
* interface and displays.
@@ -394,7 +394,7 @@ public class CheckedTextView extends TextView implements Checkable {
y = (getHeight() - height) / 2;
break;
}
-
+
final boolean checkMarkAtStart = isCheckMarkAtStart();
final int width = getWidth();
final int top = y;
@@ -417,7 +417,7 @@ public class CheckedTextView extends TextView implements Checkable {
}
}
}
-
+
@Override
protected int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
diff --git a/core/java/android/widget/Chronometer.java b/core/java/android/widget/Chronometer.java
index adcb012674a8..b9224f36a922 100644
--- a/core/java/android/widget/Chronometer.java
+++ b/core/java/android/widget/Chronometer.java
@@ -24,7 +24,6 @@ import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
-import android.view.accessibility.AccessibilityEvent;
import android.widget.RemoteViews.RemoteView;
import com.android.internal.R;
@@ -80,7 +79,7 @@ public class Chronometer extends TextView {
private OnChronometerTickListener mOnChronometerTickListener;
private StringBuilder mRecycle = new StringBuilder(8);
private boolean mCountDown;
-
+
/**
* Initialize this Chronometer object.
* Sets the base to the current time.
@@ -191,7 +190,7 @@ public class Chronometer extends TextView {
/**
* Sets the listener to be called when the chronometer changes.
- *
+ *
* @param listener The listener.
*/
public void setOnChronometerTickListener(OnChronometerTickListener listener) {
@@ -209,10 +208,10 @@ public class Chronometer extends TextView {
/**
* Start counting up. This does not affect the base as set from {@link #setBase}, just
* the view display.
- *
- * Chronometer works by regularly scheduling messages to the handler, even when the
- * Widget is not visible. To make sure resource leaks do not occur, the user should
- * make sure that each start() call has a reciprocal call to {@link #stop}.
+ *
+ * Chronometer works by regularly scheduling messages to the handler, even when the
+ * Widget is not visible. To make sure resource leaks do not occur, the user should
+ * make sure that each start() call has a reciprocal call to {@link #stop}.
*/
public void start() {
mStarted = true;
@@ -222,9 +221,9 @@ public class Chronometer extends TextView {
/**
* Stop counting up. This does not affect the base as set from {@link #setBase}, just
* the view display.
- *
+ *
* This stops the messages to the handler, effectively releasing resources that would
- * be held as the chronometer is running, via {@link #start}.
+ * be held as the chronometer is running, via {@link #start}.
*/
public void stop() {
mStarted = false;
diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java
index 03578342bbed..dd63fef5f26f 100644
--- a/core/java/android/widget/CompoundButton.java
+++ b/core/java/android/widget/CompoundButton.java
@@ -19,14 +19,11 @@ package android.widget;
import android.annotation.DrawableRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.graphics.PorterDuff;
-import android.view.ViewHierarchyEncoder;
-import com.android.internal.R;
-
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Canvas;
+import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
@@ -34,9 +31,12 @@ import android.util.AttributeSet;
import android.view.Gravity;
import android.view.SoundEffectConstants;
import android.view.ViewDebug;
+import android.view.ViewHierarchyEncoder;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
+import com.android.internal.R;
+
/**
* <p>
* A button with two states, checked and unchecked. When the button is pressed
@@ -159,7 +159,7 @@ public abstract class CompoundButton extends Button implements Checkable {
mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked);
}
- mBroadcasting = false;
+ mBroadcasting = false;
}
}
@@ -492,7 +492,7 @@ public abstract class CompoundButton extends Button implements Checkable {
SavedState(Parcelable superState) {
super(superState);
}
-
+
/**
* Constructor called from {@link #CREATOR}
*/
diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java
index 80f25d40198e..517e20cd1947 100644
--- a/core/java/android/widget/DatePicker.java
+++ b/core/java/android/widget/DatePicker.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.annotation.IntDef;
import android.annotation.Nullable;
import android.annotation.TestApi;
@@ -35,6 +33,8 @@ import android.util.SparseArray;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
+import com.android.internal.R;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Locale;
diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java
index 1bf0c876aa81..f712685ec3e0 100755
--- a/core/java/android/widget/DatePickerCalendarDelegate.java
+++ b/core/java/android/widget/DatePickerCalendarDelegate.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -40,6 +38,8 @@ import android.view.accessibility.AccessibilityEvent;
import android.widget.DayPickerView.OnDaySelectedListener;
import android.widget.YearPickerView.OnYearSelectedListener;
+import com.android.internal.R;
+
import java.util.Locale;
/**
diff --git a/core/java/android/widget/DatePickerSpinnerDelegate.java b/core/java/android/widget/DatePickerSpinnerDelegate.java
index 9ecf8a54518e..702b2a5f822a 100644
--- a/core/java/android/widget/DatePickerSpinnerDelegate.java
+++ b/core/java/android/widget/DatePickerSpinnerDelegate.java
@@ -33,14 +33,14 @@ import android.view.inputmethod.InputMethodManager;
import android.widget.DatePicker.AbstractDatePickerDelegate;
import android.widget.NumberPicker.OnValueChangeListener;
+import libcore.icu.ICU;
+
import java.text.DateFormatSymbols;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Locale;
-import libcore.icu.ICU;
-
/**
* A delegate implementing the basic DatePicker
*/
diff --git a/core/java/android/widget/DayPickerPagerAdapter.java b/core/java/android/widget/DayPickerPagerAdapter.java
index f748d3aad038..8d5bf8f7bce4 100644
--- a/core/java/android/widget/DayPickerPagerAdapter.java
+++ b/core/java/android/widget/DayPickerPagerAdapter.java
@@ -16,9 +16,6 @@
package android.widget;
-import android.graphics.Rect;
-import com.android.internal.widget.PagerAdapter;
-
import android.annotation.IdRes;
import android.annotation.LayoutRes;
import android.annotation.NonNull;
@@ -26,6 +23,7 @@ import android.annotation.Nullable;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
+import android.graphics.Rect;
import android.icu.util.Calendar;
import android.util.SparseArray;
import android.view.LayoutInflater;
@@ -33,6 +31,8 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.SimpleMonthView.OnDayClickListener;
+import com.android.internal.widget.PagerAdapter;
+
/**
* An adapter for a list of {@link android.widget.SimpleMonthView} items.
*/
diff --git a/core/java/android/widget/DayPickerView.java b/core/java/android/widget/DayPickerView.java
index 0c02a2ba61fa..919c1e2c4a4c 100644
--- a/core/java/android/widget/DayPickerView.java
+++ b/core/java/android/widget/DayPickerView.java
@@ -18,15 +18,11 @@ package android.widget;
import static android.os.Build.VERSION_CODES.N_MR1;
-import android.graphics.Rect;
-import com.android.internal.R;
-import com.android.internal.widget.ViewPager;
-import com.android.internal.widget.ViewPager.OnPageChangeListener;
-
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
+import android.graphics.Rect;
import android.icu.util.Calendar;
import android.util.AttributeSet;
import android.util.MathUtils;
@@ -35,10 +31,14 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;
-import java.util.Locale;
+import com.android.internal.R;
+import com.android.internal.widget.ViewPager;
+import com.android.internal.widget.ViewPager.OnPageChangeListener;
import libcore.icu.LocaleData;
+import java.util.Locale;
+
class DayPickerView extends ViewGroup {
private static final int DEFAULT_LAYOUT = R.layout.day_picker_content_material;
private static final int DEFAULT_START_YEAR = 1900;
diff --git a/core/java/android/widget/DayPickerViewPager.java b/core/java/android/widget/DayPickerViewPager.java
index 5f0ae29bb96d..94022ae11b6d 100644
--- a/core/java/android/widget/DayPickerViewPager.java
+++ b/core/java/android/widget/DayPickerViewPager.java
@@ -16,17 +16,12 @@
package android.widget;
-import android.annotation.Nullable;
import android.content.Context;
-import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
import com.android.internal.util.Predicate;
-import com.android.internal.widget.PagerAdapter;
import com.android.internal.widget.ViewPager;
import java.util.ArrayList;
diff --git a/core/java/android/widget/DialerFilter.java b/core/java/android/widget/DialerFilter.java
index e37e3ba74c1c..8f9c96c8f0e9 100644
--- a/core/java/android/widget/DialerFilter.java
+++ b/core/java/android/widget/DialerFilter.java
@@ -17,7 +17,7 @@
package android.widget;
import android.content.Context;
-import android.view.KeyEvent;
+import android.graphics.Rect;
import android.text.Editable;
import android.text.InputFilter;
import android.text.Selection;
@@ -28,8 +28,8 @@ import android.text.method.DialerKeyListener;
import android.text.method.KeyListener;
import android.text.method.TextKeyListener;
import android.util.AttributeSet;
+import android.view.KeyEvent;
import android.view.View;
-import android.graphics.Rect;
/**
* This widget is a layout that contains several specifically-named child views that
@@ -169,7 +169,7 @@ public class DialerFilter extends RelativeLayout
// Only check to see if the digit is valid if the key is a printing key
// in the TextKeyListener. This prevents us from hiding the digits
// line when keys like UP and DOWN are hit.
- // XXX note that KEYCODE_TAB is special-cased here for
+ // XXX note that KEYCODE_TAB is special-cased here for
// devices that share tab and 0 on a single key.
boolean isPrint = event.isPrintingKey();
if (isPrint || keyCode == KeyEvent.KEYCODE_SPACE
diff --git a/core/java/android/widget/DigitalClock.java b/core/java/android/widget/DigitalClock.java
index 1df164308076..c503ef215ea1 100644
--- a/core/java/android/widget/DigitalClock.java
+++ b/core/java/android/widget/DigitalClock.java
@@ -23,6 +23,7 @@ import android.os.SystemClock;
import android.provider.Settings;
import android.text.format.DateFormat;
import android.util.AttributeSet;
+
import java.util.Calendar;
/**
diff --git a/core/java/android/widget/DropDownListView.java b/core/java/android/widget/DropDownListView.java
index 69e42180aa6a..e9c472821d08 100644
--- a/core/java/android/widget/DropDownListView.java
+++ b/core/java/android/widget/DropDownListView.java
@@ -17,13 +17,13 @@
package android.widget;
-import com.android.internal.widget.AutoScrollHelper.AbsListViewAutoScroller;
-
import android.annotation.NonNull;
import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
+import com.android.internal.widget.AutoScrollHelper.AbsListViewAutoScroller;
+
/**
* Wrapper class for a ListView. This wrapper can hijack the focus to
* make sure the list uses the appropriate drawables and states when
diff --git a/core/java/android/widget/EdgeEffect.java b/core/java/android/widget/EdgeEffect.java
index 9019f3123135..98d8a13d68b5 100644
--- a/core/java/android/widget/EdgeEffect.java
+++ b/core/java/android/widget/EdgeEffect.java
@@ -17,14 +17,13 @@
package android.widget;
import android.annotation.ColorInt;
+import android.content.Context;
import android.content.res.TypedArray;
+import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
-
-import android.content.Context;
-import android.graphics.Canvas;
import android.view.animation.AnimationUtils;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
@@ -103,7 +102,7 @@ public class EdgeEffect {
private int mState = STATE_IDLE;
private float mPullDistance;
-
+
private final Rect mBounds = new Rect();
private final Paint mPaint = new Paint();
private float mRadius;
diff --git a/core/java/android/widget/EditText.java b/core/java/android/widget/EditText.java
index 24d861843a13..a8d3984adc7e 100644
--- a/core/java/android/widget/EditText.java
+++ b/core/java/android/widget/EditText.java
@@ -17,7 +17,6 @@
package android.widget;
import android.content.Context;
-import android.os.Bundle;
import android.text.Editable;
import android.text.Selection;
import android.text.Spannable;
diff --git a/core/java/android/widget/ExpandableListView.java b/core/java/android/widget/ExpandableListView.java
index fac36c578da8..8d9848d41c59 100644
--- a/core/java/android/widget/ExpandableListView.java
+++ b/core/java/android/widget/ExpandableListView.java
@@ -16,7 +16,7 @@
package android.widget;
-import com.android.internal.R;
+import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
import android.content.Context;
import android.content.res.TypedArray;
@@ -27,14 +27,14 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
import android.view.SoundEffectConstants;
import android.view.View;
-import android.view.ContextMenu.ContextMenuInfo;
import android.widget.ExpandableListConnector.PositionMetadata;
-import java.util.ArrayList;
+import com.android.internal.R;
-import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
+import java.util.ArrayList;
/**
* A view that shows items in a vertically scrolling two-level list. This
@@ -68,7 +68,7 @@ import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
* wrap_content since it also can be any length. However, you can use
* wrap_content if the ExpandableListView parent has a specific size, such as
* 100 pixels.
- *
+ *
* @attr ref android.R.styleable#ExpandableListView_groupIndicator
* @attr ref android.R.styleable#ExpandableListView_indicatorLeft
* @attr ref android.R.styleable#ExpandableListView_indicatorRight
@@ -87,7 +87,7 @@ public class ExpandableListView extends ListView {
* The packed position represents a group.
*/
public static final int PACKED_POSITION_TYPE_GROUP = 0;
-
+
/**
* The packed position represents a child.
*/
@@ -97,14 +97,14 @@ public class ExpandableListView extends ListView {
* The packed position represents a neither/null/no preference.
*/
public static final int PACKED_POSITION_TYPE_NULL = 2;
-
+
/**
* The value for a packed position that represents neither/null/no
* preference. This value is not otherwise possible since a group type
* (first bit 0) should not have a child position filled.
*/
public static final long PACKED_POSITION_VALUE_NULL = 0x00000000FFFFFFFFL;
-
+
/** The mask (in packed position representation) for the child */
private static final long PACKED_POSITION_MASK_CHILD = 0x00000000FFFFFFFFL;
@@ -125,13 +125,13 @@ public class ExpandableListView extends ListView {
/** The mask (in integer group position representation) for the group */
private static final long PACKED_POSITION_INT_MASK_GROUP = 0x7FFFFFFF;
-
+
/** Serves as the glue/translator between a ListView and an ExpandableListView */
private ExpandableListConnector mConnector;
-
- /** Gives us Views through group+child positions */
+
+ /** Gives us Views through group+child positions */
private ExpandableListAdapter mAdapter;
-
+
/** Left bound for drawing the indicator. */
private int mIndicatorLeft;
@@ -210,7 +210,7 @@ public class ExpandableListView extends ListView {
/** State indicating the child is the last within its group. */
private static final int[] CHILD_LAST_STATE_SET =
{R.attr.state_last};
-
+
/** Drawable to be used as a divider when it is adjacent to any children */
private Drawable mChildDivider;
@@ -367,16 +367,16 @@ public class ExpandableListView extends ListView {
}
final int headerViewsCount = getHeaderViewsCount();
-
+
final int lastChildFlPos = mItemCount - getFooterViewsCount() - headerViewsCount - 1;
- final int myB = mBottom;
-
+ final int myB = mBottom;
+
PositionMetadata pos;
View item;
- Drawable indicator;
+ Drawable indicator;
int t, b;
-
+
// Start at a value that is neither child nor group
int lastItemType = ~(ExpandableListPosition.CHILD | ExpandableListPosition.GROUP);
@@ -385,7 +385,7 @@ public class ExpandableListView extends ListView {
// The "child" mentioned in the following two lines is this
// View's child, not referring to an expandable list's
// notion of a child (as opposed to a group)
- final int childCount = getChildCount();
+ final int childCount = getChildCount();
for (int i = 0, childFlPos = mFirstPosition - headerViewsCount; i < childCount;
i++, childFlPos++) {
@@ -396,11 +396,11 @@ public class ExpandableListView extends ListView {
// This child is footer, so are all subsequent children
break;
}
-
+
item = getChildAt(i);
t = item.getTop();
b = item.getBottom();
-
+
// This item isn't on the screen
if ((b < 0) || (t > myB)) continue;
@@ -435,7 +435,7 @@ public class ExpandableListView extends ListView {
indicatorRect.right += mPaddingLeft;
}
- lastItemType = pos.position.type;
+ lastItemType = pos.position.type;
}
if (indicatorRect.left != indicatorRect.right) {
@@ -448,7 +448,7 @@ public class ExpandableListView extends ListView {
indicatorRect.top = t;
indicatorRect.bottom = b;// + mDividerHeight;
}
-
+
// Get the indicator (with its state set to the item's state)
indicator = getIndicator(pos);
if (indicator != null) {
@@ -468,24 +468,24 @@ public class ExpandableListView extends ListView {
/**
* Gets the indicator for the item at the given position. If the indicator
* is stateful, the state will be given to the indicator.
- *
+ *
* @param pos The flat list position of the item whose indicator
* should be returned.
* @return The indicator in the proper state.
*/
private Drawable getIndicator(PositionMetadata pos) {
Drawable indicator;
-
+
if (pos.position.type == ExpandableListPosition.GROUP) {
indicator = mGroupIndicator;
-
+
if (indicator != null && indicator.isStateful()) {
// Empty check based on availability of data. If the groupMetadata isn't null,
// we do a check on it. Otherwise, the group is collapsed so we consider it
// empty for performance reasons.
boolean isEmpty = (pos.groupMetadata == null) ||
(pos.groupMetadata.lastChildFlPos == pos.groupMetadata.flPos);
-
+
final int stateSetIndex =
(pos.isExpanded() ? 1 : 0) | // Expanded?
(isEmpty ? 2 : 0); // Empty?
@@ -493,7 +493,7 @@ public class ExpandableListView extends ListView {
}
} else {
indicator = mChildIndicator;
-
+
if (indicator != null && indicator.isStateful()) {
// No need for a state sets array for the child since it only has two states
final int stateSet[] = pos.position.flatListPos == pos.groupMetadata.lastChildFlPos
@@ -502,15 +502,15 @@ public class ExpandableListView extends ListView {
indicator.setState(stateSet);
}
}
-
+
return indicator;
}
-
+
/**
* Sets the drawable that will be drawn adjacent to every child in the list. This will
* be drawn using the same height as the normal divider ({@link #setDivider(Drawable)}) or
* if it does not have an intrinsic height, the height set by {@link #setDividerHeight(int)}.
- *
+ *
* @param childDivider The drawable to use.
*/
public void setChildDivider(Drawable childDivider) {
@@ -520,7 +520,7 @@ public class ExpandableListView extends ListView {
@Override
void drawDivider(Canvas canvas, Rect bounds, int childIndex) {
int flatListPosition = childIndex + mFirstPosition;
-
+
// Only proceed as possible child if the divider isn't above all items (if it is above
// all items, then the item below it has to be a group)
if (flatListPosition >= 0) {
@@ -538,7 +538,7 @@ public class ExpandableListView extends ListView {
}
pos.recycle();
}
-
+
// Otherwise draw the default divider
super.drawDivider(canvas, bounds, flatListPosition);
}
@@ -589,18 +589,18 @@ public class ExpandableListView extends ListView {
public void setAdapter(ExpandableListAdapter adapter) {
// Set member variable
mAdapter = adapter;
-
+
if (adapter != null) {
// Create the connector
mConnector = new ExpandableListConnector(adapter);
} else {
mConnector = null;
}
-
+
// Link the ListView (superclass) to the expandable list data through the connector
super.setAdapter(mConnector);
}
-
+
/**
* Gets the adapter that provides data to this view.
* @return The adapter that provides data to this view.
@@ -608,7 +608,7 @@ public class ExpandableListView extends ListView {
public ExpandableListAdapter getExpandableListAdapter() {
return mAdapter;
}
-
+
/**
* @param position An absolute (including header and footer) flat list position.
* @return true if the position corresponds to a header or a footer item.
@@ -621,7 +621,7 @@ public class ExpandableListView extends ListView {
/**
* Converts an absolute item flat position into a group/child flat position, shifting according
* to the number of header items.
- *
+ *
* @param flatListPosition The absolute flat position
* @return A group/child flat position as expected by the connector.
*/
@@ -632,7 +632,7 @@ public class ExpandableListView extends ListView {
/**
* Converts a group/child flat position into an absolute flat position, that takes into account
* the possible headers.
- *
+ *
* @param flatListPosition The child/group flat position
* @return An absolute flat position.
*/
@@ -647,25 +647,25 @@ public class ExpandableListView extends ListView {
// Clicked on a header/footer, so ignore pass it on to super
return super.performItemClick(v, position, id);
}
-
+
// Internally handle the item click
final int adjustedPosition = getFlatPositionForConnector(position);
return handleItemClick(v, adjustedPosition, id);
}
-
+
/**
* This will either expand/collapse groups (if a group was clicked) or pass
* on the click to the proper child (if a child was clicked)
- *
+ *
* @param position The flat list position. This has already been factored to
* remove the header/footer.
* @param id The ListAdapter ID, not the group or child ID.
*/
boolean handleItemClick(View v, int position, long id) {
final PositionMetadata posMetadata = mConnector.getUnflattenedPos(position);
-
+
id = getChildOrGroupId(posMetadata.position);
-
+
boolean returnValue;
if (posMetadata.position.type == ExpandableListPosition.GROUP) {
/* It's a group, so handle collapsing/expanding */
@@ -697,11 +697,11 @@ public class ExpandableListView extends ListView {
if (mOnGroupExpandListener != null) {
mOnGroupExpandListener.onGroupExpand(posMetadata.position.groupPos);
}
-
+
final int groupPos = posMetadata.position.groupPos;
final int groupFlatPos = posMetadata.position.flatListPos;
- final int shiftedGroupPosition = groupFlatPos + getHeaderViewsCount();
+ final int shiftedGroupPosition = groupFlatPos + getHeaderViewsCount();
smoothScrollToPosition(shiftedGroupPosition + mAdapter.getChildrenCount(groupPos),
shiftedGroupPosition);
}
@@ -764,17 +764,17 @@ public class ExpandableListView extends ListView {
return retValue;
}
-
+
/**
* Collapse a group in the grouped list view
- *
+ *
* @param groupPos position of the group to collapse
* @return True if the group was collapsed, false otherwise (if the group
* was already collapsed, this will return false)
*/
public boolean collapseGroup(int groupPos) {
boolean retValue = mConnector.collapseGroup(groupPos);
-
+
if (mOnGroupCollapseListener != null) {
mOnGroupCollapseListener.onGroupCollapse(groupPos);
}
@@ -787,14 +787,14 @@ public class ExpandableListView extends ListView {
/**
* Callback method to be invoked when a group in this expandable list has
* been collapsed.
- *
+ *
* @param groupPosition The group position that was collapsed
*/
void onGroupCollapse(int groupPosition);
}
-
+
private OnGroupCollapseListener mOnGroupCollapseListener;
-
+
public void setOnGroupCollapseListener(
OnGroupCollapseListener onGroupCollapseListener) {
mOnGroupCollapseListener = onGroupCollapseListener;
@@ -805,14 +805,14 @@ public class ExpandableListView extends ListView {
/**
* Callback method to be invoked when a group in this expandable list has
* been expanded.
- *
+ *
* @param groupPosition The group position that was expanded
*/
void onGroupExpand(int groupPosition);
}
-
+
private OnGroupExpandListener mOnGroupExpandListener;
-
+
public void setOnGroupExpandListener(
OnGroupExpandListener onGroupExpandListener) {
mOnGroupExpandListener = onGroupExpandListener;
@@ -826,7 +826,7 @@ public class ExpandableListView extends ListView {
/**
* Callback method to be invoked when a group in this expandable list has
* been clicked.
- *
+ *
* @param parent The ExpandableListConnector where the click happened
* @param v The view within the expandable list/ListView that was clicked
* @param groupPosition The group position that was clicked
@@ -836,13 +836,13 @@ public class ExpandableListView extends ListView {
boolean onGroupClick(ExpandableListView parent, View v, int groupPosition,
long id);
}
-
+
private OnGroupClickListener mOnGroupClickListener;
public void setOnGroupClickListener(OnGroupClickListener onGroupClickListener) {
mOnGroupClickListener = onGroupClickListener;
}
-
+
/**
* Interface definition for a callback to be invoked when a child in this
* expandable list has been clicked.
@@ -851,7 +851,7 @@ public class ExpandableListView extends ListView {
/**
* Callback method to be invoked when a child in this expandable list has
* been clicked.
- *
+ *
* @param parent The ExpandableListView where the click happened
* @param v The view within the expandable list/ListView that was clicked
* @param groupPosition The group position that contains the child that
@@ -863,13 +863,13 @@ public class ExpandableListView extends ListView {
boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
int childPosition, long id);
}
-
+
private OnChildClickListener mOnChildClickListener;
public void setOnChildClickListener(OnChildClickListener onChildClickListener) {
mOnChildClickListener = onChildClickListener;
}
-
+
/**
* Converts a flat list position (the raw position of an item (child or group)
* in the list) to a group and/or child position (represented in a
@@ -878,7 +878,7 @@ public class ExpandableListView extends ListView {
* {@link ExpandableListView#getPackedPositionType} ,
* {@link ExpandableListView#getPackedPositionChild},
* {@link ExpandableListView#getPackedPositionGroup} to unpack.
- *
+ *
* @param flatListPosition The flat list position to be converted.
* @return The group and/or child position for the given flat list position
* in packed position representation. #PACKED_POSITION_VALUE_NULL if
@@ -895,12 +895,12 @@ public class ExpandableListView extends ListView {
pm.recycle();
return packedPos;
}
-
+
/**
* Converts a group and/or child position to a flat list position. This is
* useful in situations where the caller needs to use the underlying
* {@link ListView}'s methods.
- *
+ *
* @param packedPosition The group and/or child positions to be converted in
* packed position representation. Use
* {@link #getPackedPositionForChild(int, int)} or
@@ -920,7 +920,7 @@ public class ExpandableListView extends ListView {
/**
* Gets the position of the currently selected group or child (along with
* its type). Can return {@link #PACKED_POSITION_VALUE_NULL} if no selection.
- *
+ *
* @return A packed position containing the currently selected group or
* child's position and type. #PACKED_POSITION_VALUE_NULL if no selection
* or if selection is on a header or a footer item.
@@ -931,11 +931,11 @@ public class ExpandableListView extends ListView {
// The case where there is no selection (selectedPos == -1) is also handled here.
return getExpandableListPosition(selectedPos);
}
-
+
/**
* Gets the ID of the currently selected group or child. Can return -1 if no
* selection.
- *
+ *
* @return The ID of the currently selected group or child. -1 if no
* selection.
*/
@@ -944,7 +944,7 @@ public class ExpandableListView extends ListView {
if (packedPos == PACKED_POSITION_VALUE_NULL) return -1;
int groupPos = getPackedPositionGroup(packedPos);
-
+
if (getPackedPositionType(packedPos) == PACKED_POSITION_TYPE_GROUP) {
// It's a group
return mAdapter.getGroupId(groupPos);
@@ -953,7 +953,7 @@ public class ExpandableListView extends ListView {
return mAdapter.getChildId(groupPos, getPackedPositionChild(packedPos));
}
}
-
+
/**
* Sets the selection to the specified group.
* @param groupPosition The position of the group that should be selected.
@@ -967,12 +967,12 @@ public class ExpandableListView extends ListView {
super.setSelection(absoluteFlatPosition);
pm.recycle();
}
-
+
/**
* Sets the selection to the specified child. If the child is in a collapsed
* group, the group will only be expanded and child subsequently selected if
* shouldExpandGroup is set to true, otherwise the method will return false.
- *
+ *
* @param groupPosition The position of the group that contains the child.
* @param childPosition The position of the child within the group.
* @param shouldExpandGroup Whether the child's group should be expanded if
@@ -981,48 +981,48 @@ public class ExpandableListView extends ListView {
*/
public boolean setSelectedChild(int groupPosition, int childPosition, boolean shouldExpandGroup) {
ExpandableListPosition elChildPos = ExpandableListPosition.obtainChildPosition(
- groupPosition, childPosition);
+ groupPosition, childPosition);
PositionMetadata flatChildPos = mConnector.getFlattenedPos(elChildPos);
-
+
if (flatChildPos == null) {
// The child's group isn't expanded
-
+
// Shouldn't expand the group, so return false for we didn't set the selection
- if (!shouldExpandGroup) return false;
+ if (!shouldExpandGroup) return false;
expandGroup(groupPosition);
-
+
flatChildPos = mConnector.getFlattenedPos(elChildPos);
-
+
// Sanity check
if (flatChildPos == null) {
throw new IllegalStateException("Could not find child");
}
}
-
+
int absoluteFlatPosition = getAbsoluteFlatPosition(flatChildPos.position.flatListPos);
super.setSelection(absoluteFlatPosition);
-
+
elChildPos.recycle();
flatChildPos.recycle();
-
+
return true;
}
/**
* Whether the given group is currently expanded.
- *
+ *
* @param groupPosition The group to check.
* @return Whether the group is currently expanded.
*/
public boolean isGroupExpanded(int groupPosition) {
return mConnector.isGroupExpanded(groupPosition);
}
-
+
/**
* Gets the type of a packed position. See
* {@link #getPackedPositionForChild(int, int)}.
- *
+ *
* @param packedPosition The packed position for which to return the type.
* @return The type of the position contained within the packed position,
* either {@link #PACKED_POSITION_TYPE_CHILD}, {@link #PACKED_POSITION_TYPE_GROUP}, or
@@ -1032,7 +1032,7 @@ public class ExpandableListView extends ListView {
if (packedPosition == PACKED_POSITION_VALUE_NULL) {
return PACKED_POSITION_TYPE_NULL;
}
-
+
return (packedPosition & PACKED_POSITION_MASK_TYPE) == PACKED_POSITION_MASK_TYPE
? PACKED_POSITION_TYPE_CHILD
: PACKED_POSITION_TYPE_GROUP;
@@ -1041,7 +1041,7 @@ public class ExpandableListView extends ListView {
/**
* Gets the group position from a packed position. See
* {@link #getPackedPositionForChild(int, int)}.
- *
+ *
* @param packedPosition The packed position from which the group position
* will be returned.
* @return The group position portion of the packed position. If this does
@@ -1050,7 +1050,7 @@ public class ExpandableListView extends ListView {
public static int getPackedPositionGroup(long packedPosition) {
// Null
if (packedPosition == PACKED_POSITION_VALUE_NULL) return -1;
-
+
return (int) ((packedPosition & PACKED_POSITION_MASK_GROUP) >> PACKED_POSITION_SHIFT_GROUP);
}
@@ -1060,7 +1060,7 @@ public class ExpandableListView extends ListView {
* To get the group that this child belongs to, use
* {@link #getPackedPositionGroup(long)}. See
* {@link #getPackedPositionForChild(int, int)}.
- *
+ *
* @param packedPosition The packed position from which the child position
* will be returned.
* @return The child position portion of the packed position. If this does
@@ -1069,7 +1069,7 @@ public class ExpandableListView extends ListView {
public static int getPackedPositionChild(long packedPosition) {
// Null
if (packedPosition == PACKED_POSITION_VALUE_NULL) return -1;
-
+
// Group since a group type clears this bit
if ((packedPosition & PACKED_POSITION_MASK_TYPE) != PACKED_POSITION_MASK_TYPE) return -1;
@@ -1087,7 +1087,7 @@ public class ExpandableListView extends ListView {
* {@link #getPackedPositionChild(long)},
* {@link #getPackedPositionGroup(long)}, and
* {@link #getPackedPositionType(long)}.
- *
+ *
* @param groupPosition The child's parent group's position.
* @param childPosition The child position within the group.
* @return The packed position representation of the child (and parent group).
@@ -1096,20 +1096,20 @@ public class ExpandableListView extends ListView {
return (((long)PACKED_POSITION_TYPE_CHILD) << PACKED_POSITION_SHIFT_TYPE)
| ((((long)groupPosition) & PACKED_POSITION_INT_MASK_GROUP)
<< PACKED_POSITION_SHIFT_GROUP)
- | (childPosition & PACKED_POSITION_INT_MASK_CHILD);
+ | (childPosition & PACKED_POSITION_INT_MASK_CHILD);
}
/**
* Returns the packed position representation of a group's position. See
* {@link #getPackedPositionForChild(int, int)}.
- *
+ *
* @param groupPosition The child's parent group's position.
* @return The packed position representation of the group.
*/
public static long getPackedPositionForGroup(int groupPosition) {
// No need to OR a type in because PACKED_POSITION_GROUP == 0
return ((((long)groupPosition) & PACKED_POSITION_INT_MASK_GROUP)
- << PACKED_POSITION_SHIFT_GROUP);
+ << PACKED_POSITION_SHIFT_GROUP);
}
@Override
@@ -1122,12 +1122,12 @@ public class ExpandableListView extends ListView {
final int adjustedPosition = getFlatPositionForConnector(flatListPosition);
PositionMetadata pm = mConnector.getUnflattenedPos(adjustedPosition);
ExpandableListPosition pos = pm.position;
-
+
id = getChildOrGroupId(pos);
long packedPosition = pos.getPackedPosition();
pm.recycle();
-
+
return new ExpandableListContextMenuInfo(view, packedPosition, id);
}
@@ -1135,7 +1135,7 @@ public class ExpandableListView extends ListView {
* Gets the ID of the group or child at the given <code>position</code>.
* This is useful since there is no ListAdapter ID -> ExpandableListAdapter
* ID conversion mechanism (in some cases, it isn't possible).
- *
+ *
* @param position The position of the child or group whose ID should be
* returned.
*/
@@ -1146,10 +1146,10 @@ public class ExpandableListView extends ListView {
return mAdapter.getGroupId(position.groupPos);
}
}
-
+
/**
* Sets the indicator to be drawn next to a child.
- *
+ *
* @param childIndicator The drawable to be used as an indicator. If the
* child is the last child for a group, the state
* {@link android.R.attr#state_last} will be set.
@@ -1157,7 +1157,7 @@ public class ExpandableListView extends ListView {
public void setChildIndicator(Drawable childIndicator) {
mChildIndicator = childIndicator;
}
-
+
/**
* Sets the drawing bounds for the child indicator. For either, you can
* specify {@link #CHILD_INDICATOR_INHERIT} to use inherit from the general
@@ -1194,7 +1194,7 @@ public class ExpandableListView extends ListView {
/**
* Sets the indicator to be drawn next to a group.
- *
+ *
* @param groupIndicator The drawable to be used as an indicator. If the
* group is empty, the state {@link android.R.attr#state_empty} will be
* set. If the group is expanded, the state
@@ -1211,8 +1211,8 @@ public class ExpandableListView extends ListView {
* Sets the drawing bounds for the indicators (at minimum, the group indicator
* is affected by this; the child indicator is affected by this if the
* child indicator bounds are set to inherit).
- *
- * @see #setChildIndicatorBounds(int, int)
+ *
+ * @see #setChildIndicatorBounds(int, int)
* @param left The left position (relative to the left bounds of this View)
* to start drawing the indicator.
* @param right The right position (relative to the left bounds of this
@@ -1248,13 +1248,13 @@ public class ExpandableListView extends ListView {
* callback when a context menu is brought up for this AdapterView.
*/
public static class ExpandableListContextMenuInfo implements ContextMenu.ContextMenuInfo {
-
+
public ExpandableListContextMenuInfo(View targetView, long packedPosition, long id) {
this.targetView = targetView;
this.packedPosition = packedPosition;
this.id = id;
}
-
+
/**
* The view for which the context menu is being displayed. This
* will be one of the children Views of this {@link ExpandableListView}.
@@ -1276,10 +1276,10 @@ public class ExpandableListView extends ListView {
*/
public long id;
}
-
+
static class SavedState extends BaseSavedState {
ArrayList<ExpandableListConnector.GroupMetadata> expandedGroupMetadataList;
-
+
/**
* Constructor called from {@link ExpandableListView#onSaveInstanceState()}
*/
@@ -1333,7 +1333,7 @@ public class ExpandableListView extends ListView {
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
-
+
if (mConnector != null && ss.expandedGroupMetadataList != null) {
mConnector.setExpandedGroupMetadataList(ss.expandedGroupMetadataList);
}
diff --git a/core/java/android/widget/FrameLayout.java b/core/java/android/widget/FrameLayout.java
index b8c74d88b580..dc8ee01391b8 100644
--- a/core/java/android/widget/FrameLayout.java
+++ b/core/java/android/widget/FrameLayout.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.annotation.AttrRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -34,6 +32,8 @@ import android.view.ViewGroup;
import android.view.ViewHierarchyEncoder;
import android.widget.RemoteViews.RemoteView;
+import com.android.internal.R;
+
import java.util.ArrayList;
/**
diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java
index af2852cde22a..1c15c7ae7987 100644
--- a/core/java/android/widget/GridLayout.java
+++ b/core/java/android/widget/GridLayout.java
@@ -16,6 +16,20 @@
package android.widget;
+import static android.view.Gravity.AXIS_PULL_AFTER;
+import static android.view.Gravity.AXIS_PULL_BEFORE;
+import static android.view.Gravity.AXIS_SPECIFIED;
+import static android.view.Gravity.AXIS_X_SHIFT;
+import static android.view.Gravity.AXIS_Y_SHIFT;
+import static android.view.Gravity.HORIZONTAL_GRAVITY_MASK;
+import static android.view.Gravity.RELATIVE_LAYOUT_DIRECTION;
+import static android.view.Gravity.VERTICAL_GRAVITY_MASK;
+import static android.view.View.MeasureSpec.EXACTLY;
+import static android.view.View.MeasureSpec.makeMeasureSpec;
+
+import static java.lang.Math.max;
+import static java.lang.Math.min;
+
import android.annotation.IntDef;
import android.content.Context;
import android.content.res.TypedArray;
@@ -32,6 +46,7 @@ import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RemoteViews.RemoteView;
+
import com.android.internal.R;
import java.lang.annotation.Retention;
@@ -43,12 +58,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import static android.view.Gravity.*;
-import static android.view.View.MeasureSpec.EXACTLY;
-import static android.view.View.MeasureSpec.makeMeasureSpec;
-import static java.lang.Math.max;
-import static java.lang.Math.min;
-
/**
* A layout that places its children in a rectangular <em>grid</em>.
* <p>
diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java
index b95aa52c11e9..20543fb9ae8a 100644
--- a/core/java/android/widget/GridView.java
+++ b/core/java/android/widget/GridView.java
@@ -36,9 +36,9 @@ import android.view.ViewHierarchyEncoder;
import android.view.ViewRootImpl;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
-import android.view.accessibility.AccessibilityNodeProvider;
import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo;
import android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo;
+import android.view.accessibility.AccessibilityNodeProvider;
import android.view.animation.GridLayoutAnimationController;
import android.widget.RemoteViews.RemoteView;
@@ -54,7 +54,7 @@ import java.lang.annotation.RetentionPolicy;
*
* <p>See the <a href="{@docRoot}guide/topics/ui/layout/gridview.html">Grid
* View</a> guide.</p>
- *
+ *
* @attr ref android.R.styleable#GridView_horizontalSpacing
* @attr ref android.R.styleable#GridView_verticalSpacing
* @attr ref android.R.styleable#GridView_stretchMode
@@ -71,33 +71,33 @@ public class GridView extends AbsListView {
/**
* Disables stretching.
- *
- * @see #setStretchMode(int)
+ *
+ * @see #setStretchMode(int)
*/
public static final int NO_STRETCH = 0;
/**
* Stretches the spacing between columns.
- *
- * @see #setStretchMode(int)
+ *
+ * @see #setStretchMode(int)
*/
public static final int STRETCH_SPACING = 1;
/**
* Stretches columns.
- *
- * @see #setStretchMode(int)
+ *
+ * @see #setStretchMode(int)
*/
public static final int STRETCH_COLUMN_WIDTH = 2;
/**
* Stretches the spacing between columns. The spacing is uniform.
- *
- * @see #setStretchMode(int)
+ *
+ * @see #setStretchMode(int)
*/
public static final int STRETCH_SPACING_UNIFORM = 3;
/**
* Creates as many columns as can fit on screen.
- *
- * @see #setNumColumns(int)
+ *
+ * @see #setNumColumns(int)
*/
public static final int AUTO_FIT = -1;
@@ -161,7 +161,7 @@ public class GridView extends AbsListView {
if (index >= 0) {
setGravity(index);
}
-
+
a.recycle();
}
@@ -192,7 +192,7 @@ public class GridView extends AbsListView {
}
resetList();
- mRecycler.clear();
+ mRecycler.clear();
mAdapter = adapter;
mOldSelectedPosition = INVALID_POSITION;
@@ -222,7 +222,7 @@ public class GridView extends AbsListView {
setNextSelectedPositionInt(position);
checkSelectionChanged();
} else {
- checkFocus();
+ checkFocus();
// Nothing selected
checkSelectionChanged();
}
@@ -376,7 +376,7 @@ public class GridView extends AbsListView {
}
mReferenceView = child;
-
+
if (selectedView != null) {
mReferenceViewInSelectedRow = mReferenceView;
}
@@ -515,7 +515,7 @@ public class GridView extends AbsListView {
offsetChildrenTopAndBottom(offset);
}
}
- }
+ }
@Override
int findMotionRow(int y) {
@@ -624,7 +624,7 @@ public class GridView extends AbsListView {
// This is how far the bottom edge of the last view is from the bottom of the
// drawable area
- int bottomOffset = end - lastBottom;
+ int bottomOffset = end - lastBottom;
final View firstChild = getChildAt(0);
final int firstTop = firstChild.getTop();
@@ -636,7 +636,7 @@ public class GridView extends AbsListView {
// Don't pull the top too far down
bottomOffset = Math.min(bottomOffset, mListPadding.top - firstTop);
}
-
+
// Move everything down
offsetChildrenTopAndBottom(bottomOffset);
if (mFirstPosition > 0) {
@@ -679,7 +679,7 @@ public class GridView extends AbsListView {
// Don't pull the bottom too far up
topOffset = Math.min(topOffset, lastBottom - end);
}
-
+
// Move everything up
offsetChildrenTopAndBottom(-topOffset);
if (lastPosition < mItemCount - 1) {
@@ -965,7 +965,7 @@ public class GridView extends AbsListView {
final int stretchMode = mStretchMode;
final int requestedColumnWidth = mRequestedColumnWidth;
boolean didNotInitiallyFit = false;
-
+
if (mRequestedNumColumns == AUTO_FIT) {
if (requestedColumnWidth > 0) {
// Client told us to pick the number of columns
@@ -979,57 +979,57 @@ public class GridView extends AbsListView {
// We picked the columns
mNumColumns = mRequestedNumColumns;
}
-
+
if (mNumColumns <= 0) {
mNumColumns = 1;
}
switch (stretchMode) {
- case NO_STRETCH:
- // Nobody stretches
- mColumnWidth = requestedColumnWidth;
- mHorizontalSpacing = requestedHorizontalSpacing;
- break;
-
- default:
- int spaceLeftOver = availableSpace - (mNumColumns * requestedColumnWidth) -
- ((mNumColumns - 1) * requestedHorizontalSpacing);
-
- if (spaceLeftOver < 0) {
- didNotInitiallyFit = true;
- }
-
- switch (stretchMode) {
- case STRETCH_COLUMN_WIDTH:
- // Stretch the columns
- mColumnWidth = requestedColumnWidth + spaceLeftOver / mNumColumns;
+ case NO_STRETCH:
+ // Nobody stretches
+ mColumnWidth = requestedColumnWidth;
mHorizontalSpacing = requestedHorizontalSpacing;
break;
- case STRETCH_SPACING:
- // Stretch the spacing between columns
- mColumnWidth = requestedColumnWidth;
- if (mNumColumns > 1) {
- mHorizontalSpacing = requestedHorizontalSpacing +
- spaceLeftOver / (mNumColumns - 1);
- } else {
- mHorizontalSpacing = requestedHorizontalSpacing + spaceLeftOver;
+ default:
+ int spaceLeftOver = availableSpace - (mNumColumns * requestedColumnWidth)
+ - ((mNumColumns - 1) * requestedHorizontalSpacing);
+
+ if (spaceLeftOver < 0) {
+ didNotInitiallyFit = true;
}
- break;
- case STRETCH_SPACING_UNIFORM:
- // Stretch the spacing between columns
- mColumnWidth = requestedColumnWidth;
- if (mNumColumns > 1) {
- mHorizontalSpacing = requestedHorizontalSpacing +
- spaceLeftOver / (mNumColumns + 1);
- } else {
- mHorizontalSpacing = requestedHorizontalSpacing + spaceLeftOver;
+ switch (stretchMode) {
+ case STRETCH_COLUMN_WIDTH:
+ // Stretch the columns
+ mColumnWidth = requestedColumnWidth + spaceLeftOver / mNumColumns;
+ mHorizontalSpacing = requestedHorizontalSpacing;
+ break;
+
+ case STRETCH_SPACING:
+ // Stretch the spacing between columns
+ mColumnWidth = requestedColumnWidth;
+ if (mNumColumns > 1) {
+ mHorizontalSpacing = requestedHorizontalSpacing
+ + spaceLeftOver / (mNumColumns - 1);
+ } else {
+ mHorizontalSpacing = requestedHorizontalSpacing + spaceLeftOver;
+ }
+ break;
+
+ case STRETCH_SPACING_UNIFORM:
+ // Stretch the spacing between columns
+ mColumnWidth = requestedColumnWidth;
+ if (mNumColumns > 1) {
+ mHorizontalSpacing = requestedHorizontalSpacing
+ + spaceLeftOver / (mNumColumns + 1);
+ } else {
+ mHorizontalSpacing = requestedHorizontalSpacing + spaceLeftOver;
+ }
+ break;
}
- break;
- }
- break;
+ break;
}
return didNotInitiallyFit;
}
@@ -1052,7 +1052,7 @@ public class GridView extends AbsListView {
}
widthSize += getVerticalScrollbarWidth();
}
-
+
int childWidth = widthSize - mListPadding.left - mListPadding.right;
boolean didNotInitiallyFit = determineColumns(childWidth);
@@ -1087,7 +1087,7 @@ public class GridView extends AbsListView {
mRecycler.addScrapView(child, -1);
}
}
-
+
if (heightMode == MeasureSpec.UNSPECIFIED) {
heightSize = mListPadding.top + mListPadding.bottom + childHeight +
getVerticalFadingEdgeLength() * 2;
@@ -1095,7 +1095,7 @@ public class GridView extends AbsListView {
if (heightMode == MeasureSpec.AT_MOST) {
int ourSize = mListPadding.top + mListPadding.bottom;
-
+
final int numColumns = mNumColumns;
for (int i = 0; i < count; i += numColumns) {
ourSize += childHeight;
@@ -1574,9 +1574,9 @@ public class GridView extends AbsListView {
/**
* Sets the currently selected item
- *
+ *
* @param position Index (starting at 0) of the data item to be selected.
- *
+ *
* If in touch mode, the item will not be selected but it will still be positioned
* appropriately.
*/
@@ -1609,8 +1609,8 @@ public class GridView extends AbsListView {
setNextSelectedPositionInt(position);
layoutChildren();
-
- final int next = mStackFromBottom ? mItemCount - 1 - mNextSelectedPosition :
+
+ final int next = mStackFromBottom ? mItemCount - 1 - mNextSelectedPosition :
mNextSelectedPosition;
final int previous = mStackFromBottom ? mItemCount - 1
- previousSelectedPosition : previousSelectedPosition;
@@ -1802,7 +1802,7 @@ public class GridView extends AbsListView {
invokeOnItemScrollListener();
moved = true;
}
-
+
if (moved) {
awakenScrollBars();
}
@@ -1874,7 +1874,7 @@ public class GridView extends AbsListView {
if (moved) {
awakenScrollBars();
}
-
+
return moved;
}
@@ -2216,17 +2216,17 @@ public class GridView extends AbsListView {
requestLayoutIfNecessary();
}
}
-
+
/**
- * Get the number of columns in the grid.
+ * Get the number of columns in the grid.
* Returns {@link #AUTO_FIT} if the Grid has never been laid out.
*
* @attr ref android.R.styleable#GridView_numColumns
- *
+ *
* @see #setNumColumns(int)
*/
@ViewDebug.ExportedProperty
- public int getNumColumns() {
+ public int getNumColumns() {
return mNumColumns;
}
@@ -2259,13 +2259,13 @@ public class GridView extends AbsListView {
// we are too high, slide all views down to align with bottom
child = getChildAt(childCount - 1);
delta = child.getBottom() - (getHeight() - mListPadding.bottom);
-
+
if (mFirstPosition + childCount < mItemCount) {
// It's OK to have some space below the last item if it is
// part of the vertical spacing
delta += mVerticalSpacing;
}
-
+
if (delta > 0) {
// We only are looking to see if we are too high, not too low
delta = 0;
@@ -2277,14 +2277,14 @@ public class GridView extends AbsListView {
}
}
}
-
+
@Override
protected int computeVerticalScrollExtent() {
final int count = getChildCount();
if (count > 0) {
final int numColumns = mNumColumns;
final int rowCount = (count + numColumns - 1) / numColumns;
-
+
int extent = rowCount * 100;
View view = getChildAt(0);
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index d9cb269d8e6f..4d405c5a8627 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -467,6 +467,14 @@ public class ImageView extends View {
* {@link #setImageBitmap(android.graphics.Bitmap)} and
* {@link android.graphics.BitmapFactory} instead.</p>
*
+ * <p class="note">On devices running SDK < 24, this method will fail to
+ * apply correct density scaling to images loaded from
+ * {@link ContentResolver#SCHEME_CONTENT content} and
+ * {@link ContentResolver#SCHEME_FILE file} schemes. Applications running
+ * on devices with SDK >= 24 <strong>MUST</strong> specify the
+ * {@code targetSdkVersion} in their manifest as 24 or above for density
+ * scaling to be applied to images loaded from these schemes.</p>
+ *
* @param uri the Uri of an image, or {@code null} to clear the content
*/
@android.view.RemotableViewMethod(asyncImpl="setImageURIAsync")
diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java
index 6511de81b6cb..544e591158cf 100644
--- a/core/java/android/widget/LinearLayout.java
+++ b/core/java/android/widget/LinearLayout.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -34,15 +32,17 @@ import android.view.ViewGroup;
import android.view.ViewHierarchyEncoder;
import android.widget.RemoteViews.RemoteView;
+import com.android.internal.R;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
- * A Layout that arranges its children in a single column or a single row. The direction of
- * the row can be set by calling {@link #setOrientation(int) setOrientation()}.
+ * A Layout that arranges its children in a single column or a single row. The direction of
+ * the row can be set by calling {@link #setOrientation(int) setOrientation()}.
* You can also specify gravity, which specifies the alignment of all the child elements by
- * calling {@link #setGravity(int) setGravity()} or specify that specific children
+ * calling {@link #setGravity(int) setGravity()} or specify that specific children
* grow to fill up any remaining space in the layout by setting the <em>weight</em> member of
* {@link android.widget.LinearLayout.LayoutParams LinearLayout.LayoutParams}.
* The default orientation is horizontal.
@@ -202,7 +202,7 @@ public class LinearLayout extends ViewGroup {
public LinearLayout(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
-
+
public LinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
@@ -497,7 +497,7 @@ public class LinearLayout extends ViewGroup {
* When true, all children with a weight will be considered having
* the minimum size of the largest child. If false, all children are
* measured normally.
- *
+ *
* @return True to measure children with a weight using the minimum
* size of the largest child, false otherwise.
*
@@ -511,9 +511,9 @@ public class LinearLayout extends ViewGroup {
* When set to true, all children with a weight will be considered having
* the minimum size of the largest child. If false, all children are
* measured normally.
- *
+ *
* Disabled by default.
- *
+ *
* @param enabled True to measure children with a weight using the
* minimum size of the largest child, false otherwise.
*
@@ -589,7 +589,7 @@ public class LinearLayout extends ViewGroup {
/**
* @param i The index of the child that will be used if this layout is
* part of a larger layout that is baseline aligned.
- *
+ *
* @attr ref android.R.styleable#LinearLayout_baselineAlignedChildIndex
*/
@android.view.RemotableViewMethod
@@ -720,14 +720,14 @@ public class LinearLayout extends ViewGroup {
float totalWeight = 0;
final int count = getVirtualChildCount();
-
+
final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
boolean matchWidth = false;
boolean skippedMeasure = false;
- final int baselineChildIndex = mBaselineAlignedChildIndex;
+ final int baselineChildIndex = mBaselineAlignedChildIndex;
final boolean useLargestChild = mUseLargestChild;
int largestChildHeight = Integer.MIN_VALUE;
@@ -886,7 +886,7 @@ public class LinearLayout extends ViewGroup {
// Check against our minimum height
heightSize = Math.max(heightSize, getSuggestedMinimumHeight());
-
+
// Reconcile our calculated size with the heightMeasureSpec
int heightSizeAndState = resolveSizeAndState(heightSize, heightMeasureSpec, 0);
heightSize = heightSizeAndState & MEASURED_SIZE_MASK;
@@ -991,12 +991,12 @@ public class LinearLayout extends ViewGroup {
if (!allFillParent && widthMode != MeasureSpec.EXACTLY) {
maxWidth = alternativeMaxWidth;
}
-
+
maxWidth += mPaddingLeft + mPaddingRight;
// Check against our minimum width
maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());
-
+
setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
heightSizeAndState);
@@ -1013,13 +1013,13 @@ public class LinearLayout extends ViewGroup {
final View child = getVirtualChildAt(i);
if (child != null && child.getVisibility() != GONE) {
LinearLayout.LayoutParams lp = ((LinearLayout.LayoutParams)child.getLayoutParams());
-
+
if (lp.width == LayoutParams.MATCH_PARENT) {
// Temporarily force children to reuse their old measured height
// FIXME: this may not be right for something like wrapping text?
int oldHeight = lp.height;
lp.height = child.getMeasuredHeight();
-
+
// Remeasue with new dimensions
measureChildWithMargins(child, uniformMeasureSpec, 0, heightMeasureSpec, 0);
lp.height = oldHeight;
@@ -1037,7 +1037,7 @@ public class LinearLayout extends ViewGroup {
*
* @see #getOrientation()
* @see #setOrientation(int)
- * @see #onMeasure(int, int)
+ * @see #onMeasure(int, int)
*/
void measureHorizontal(int widthMeasureSpec, int heightMeasureSpec) {
mTotalLength = 0;
@@ -1049,7 +1049,7 @@ public class LinearLayout extends ViewGroup {
float totalWeight = 0;
final int count = getVirtualChildCount();
-
+
final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
@@ -1069,7 +1069,7 @@ public class LinearLayout extends ViewGroup {
final boolean baselineAligned = mBaselineAligned;
final boolean useLargestChild = mUseLargestChild;
-
+
final boolean isExactly = widthMode == MeasureSpec.EXACTLY;
int largestChildWidth = Integer.MIN_VALUE;
@@ -1084,7 +1084,7 @@ public class LinearLayout extends ViewGroup {
mTotalLength += measureNullChild(i);
continue;
}
-
+
if (child.getVisibility() == GONE) {
i += getChildrenSkipCount(child, i);
continue;
@@ -1263,16 +1263,16 @@ public class LinearLayout extends ViewGroup {
// Add in our padding
mTotalLength += mPaddingLeft + mPaddingRight;
-
+
int widthSize = mTotalLength;
-
+
// Check against our minimum width
widthSize = Math.max(widthSize, getSuggestedMinimumWidth());
-
+
// Reconcile our calculated size with the widthMeasureSpec
int widthSizeAndState = resolveSizeAndState(widthSize, widthMeasureSpec, 0);
widthSize = widthSizeAndState & MEASURED_SIZE_MASK;
-
+
// Either expand children with weight to take up available space or
// shrink them if they extend beyond our current bounds. If we skipped
// measurement on any children, we need to measure them now.
@@ -1409,12 +1409,12 @@ public class LinearLayout extends ViewGroup {
if (!allFillParent && heightMode != MeasureSpec.EXACTLY) {
maxHeight = alternativeMaxHeight;
}
-
+
maxHeight += mPaddingTop + mPaddingBottom;
// Check against our minimum height
maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
-
+
setMeasuredDimension(widthSizeAndState | (childState&MEASURED_STATE_MASK),
resolveSizeAndState(maxHeight, heightMeasureSpec,
(childState<<MEASURED_HEIGHT_STATE_SHIFT)));
@@ -1434,13 +1434,13 @@ public class LinearLayout extends ViewGroup {
final View child = getVirtualChildAt(i);
if (child != null && child.getVisibility() != GONE) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams();
-
+
if (lp.height == LayoutParams.MATCH_PARENT) {
// Temporarily force children to reuse their old measured width
// FIXME: this may not be right for something like wrapping text?
int oldWidth = lp.width;
lp.width = child.getMeasuredWidth();
-
+
// Remeasure with new dimensions
measureChildWithMargins(child, widthMeasureSpec, 0, uniformMeasureSpec, 0);
lp.width = oldWidth;
@@ -1541,14 +1541,14 @@ public class LinearLayout extends ViewGroup {
int childTop;
int childLeft;
-
+
// Where right end of child should go
final int width = right - left;
int childRight = width - mPaddingRight;
-
+
// Space available for child
int childSpace = width - paddingLeft - mPaddingRight;
-
+
final int count = getVirtualChildCount();
final int majorGravity = mGravity & Gravity.VERTICAL_GRAVITY_MASK;
@@ -1578,10 +1578,10 @@ public class LinearLayout extends ViewGroup {
} else if (child.getVisibility() != GONE) {
final int childWidth = child.getMeasuredWidth();
final int childHeight = child.getMeasuredHeight();
-
+
final LinearLayout.LayoutParams lp =
(LinearLayout.LayoutParams) child.getLayoutParams();
-
+
int gravity = lp.gravity;
if (gravity < 0) {
gravity = minorGravity;
@@ -1647,11 +1647,11 @@ public class LinearLayout extends ViewGroup {
int childTop;
int childLeft;
-
+
// Where bottom of child should go
final int height = bottom - top;
- int childBottom = height - mPaddingBottom;
-
+ int childBottom = height - mPaddingBottom;
+
// Space available for child
int childSpace = height - paddingTop - mPaddingBottom;
@@ -1707,12 +1707,12 @@ public class LinearLayout extends ViewGroup {
if (baselineAligned && lp.height != LayoutParams.MATCH_PARENT) {
childBaseline = child.getBaseline();
}
-
+
int gravity = lp.gravity;
if (gravity < 0) {
gravity = minorGravity;
}
-
+
switch (gravity & Gravity.VERTICAL_GRAVITY_MASK) {
case Gravity.TOP:
childTop = paddingTop + lp.topMargin;
@@ -1764,15 +1764,15 @@ public class LinearLayout extends ViewGroup {
}
}
- private void setChildFrame(View child, int left, int top, int width, int height) {
+ private void setChildFrame(View child, int left, int top, int width, int height) {
child.layout(left, top, left + width, top + height);
}
-
+
/**
* Should the layout be a column or a row.
* @param orientation Pass {@link #HORIZONTAL} or {@link #VERTICAL}. Default
* value is {@link #HORIZONTAL}.
- *
+ *
* @attr ref android.R.styleable#LinearLayout_orientation
*/
public void setOrientation(@OrientationMode int orientation) {
@@ -1784,7 +1784,7 @@ public class LinearLayout extends ViewGroup {
/**
* Returns the current orientation.
- *
+ *
* @return either {@link #HORIZONTAL} or {@link #VERTICAL}
*/
@OrientationMode
@@ -1797,9 +1797,9 @@ public class LinearLayout extends ViewGroup {
* this layout has a VERTICAL orientation, this controls where all the child
* views are placed if there is extra vertical space. If this layout has a
* HORIZONTAL orientation, this controls the alignment of the children.
- *
+ *
* @param gravity See {@link android.view.Gravity}
- *
+ *
* @attr ref android.R.styleable#LinearLayout_gravity
*/
@android.view.RemotableViewMethod
@@ -1845,7 +1845,7 @@ public class LinearLayout extends ViewGroup {
requestLayout();
}
}
-
+
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new LinearLayout.LayoutParams(getContext(), attrs);
@@ -1909,7 +1909,7 @@ public class LinearLayout extends ViewGroup {
/**
* Per-child layout information associated with ViewLinearLayout.
- *
+ *
* @attr ref android.R.styleable#LinearLayout_Layout_layout_weight
* @attr ref android.R.styleable#LinearLayout_Layout_layout_gravity
*/
diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java
index 6a10743c1c56..0bde983337f1 100644
--- a/core/java/android/widget/ListPopupWindow.java
+++ b/core/java/android/widget/ListPopupWindow.java
@@ -16,9 +16,6 @@
package android.widget;
-import com.android.internal.R;
-import com.android.internal.view.menu.ShowableListMenu;
-
import android.annotation.AttrRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -42,14 +39,17 @@ import android.view.ViewParent;
import android.view.WindowManager;
import android.widget.AdapterView.OnItemSelectedListener;
+import com.android.internal.R;
+import com.android.internal.view.menu.ShowableListMenu;
+
/**
* A ListPopupWindow anchors itself to a host view and displays a
* list of choices.
- *
+ *
* <p>ListPopupWindow contains a number of tricky behaviors surrounding
* positioning, scrolling parents to fit the dropdown, interacting
* sanely with the IME if present, and others.
- *
+ *
* @see android.widget.AutoCompleteTextView
* @see android.widget.Spinner
*/
@@ -116,7 +116,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* The provided prompt view should appear above list content.
- *
+ *
* @see #setPromptPosition(int)
* @see #getPromptPosition()
* @see #setPromptView(View)
@@ -125,7 +125,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* The provided prompt view should appear below list content.
- *
+ *
* @see #setPromptPosition(int)
* @see #getPromptPosition()
* @see #setPromptView(View)
@@ -138,13 +138,13 @@ public class ListPopupWindow implements ShowableListMenu {
* If used to specify a popup height, the popup will fill available space.
*/
public static final int MATCH_PARENT = ViewGroup.LayoutParams.MATCH_PARENT;
-
+
/**
* Alias for {@link ViewGroup.LayoutParams#WRAP_CONTENT}.
* If used to specify a popup width, the popup will use the width of its content.
*/
public static final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT;
-
+
/**
* Mode for {@link #setInputMethodMode(int)}: the requirements for the
* input method should be based on the focusability of the popup. That is
@@ -152,7 +152,7 @@ public class ListPopupWindow implements ShowableListMenu {
* it doesn't.
*/
public static final int INPUT_METHOD_FROM_FOCUSABLE = PopupWindow.INPUT_METHOD_FROM_FOCUSABLE;
-
+
/**
* Mode for {@link #setInputMethodMode(int)}: this popup always needs to
* work with an input method, regardless of whether it is focusable. This
@@ -160,7 +160,7 @@ public class ListPopupWindow implements ShowableListMenu {
* the input method while it is shown.
*/
public static final int INPUT_METHOD_NEEDED = PopupWindow.INPUT_METHOD_NEEDED;
-
+
/**
* Mode for {@link #setInputMethodMode(int)}: this popup never needs to
* work with an input method, regardless of whether it is focusable. This
@@ -172,7 +172,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Create a new, empty popup window capable of displaying items from a ListAdapter.
* Backgrounds should be set using {@link #setBackgroundDrawable(Drawable)}.
- *
+ *
* @param context Context used for contained views.
*/
public ListPopupWindow(@NonNull Context context) {
@@ -182,7 +182,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Create a new, empty popup window capable of displaying items from a ListAdapter.
* Backgrounds should be set using {@link #setBackgroundDrawable(Drawable)}.
- *
+ *
* @param context Context used for contained views.
* @param attrs Attributes from inflating parent views used to style the popup.
*/
@@ -193,7 +193,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Create a new, empty popup window capable of displaying items from a ListAdapter.
* Backgrounds should be set using {@link #setBackgroundDrawable(Drawable)}.
- *
+ *
* @param context Context used for contained views.
* @param attrs Attributes from inflating parent views used to style the popup.
* @param defStyleAttr Default style attribute to use for popup content.
@@ -206,7 +206,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Create a new, empty popup window capable of displaying items from a ListAdapter.
* Backgrounds should be set using {@link #setBackgroundDrawable(Drawable)}.
- *
+ *
* @param context Context used for contained views.
* @param attrs Attributes from inflating parent views used to style the popup.
* @param defStyleAttr Style attribute to read for default styling of popup content.
@@ -248,7 +248,7 @@ public class ListPopupWindow implements ShowableListMenu {
if (mAdapter != null) {
adapter.registerDataSetObserver(mObserver);
}
-
+
if (mDropDownList != null) {
mDropDownList.setAdapter(mAdapter);
}
@@ -257,9 +257,9 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Set where the optional prompt view should appear. The default is
* {@link #POSITION_PROMPT_ABOVE}.
- *
+ *
* @param position A position constant declaring where the prompt should be displayed.
- *
+ *
* @see #POSITION_PROMPT_ABOVE
* @see #POSITION_PROMPT_BELOW
*/
@@ -269,7 +269,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* @return Where the optional prompt view should appear.
- *
+ *
* @see #POSITION_PROMPT_ABOVE
* @see #POSITION_PROMPT_BELOW
*/
@@ -279,11 +279,11 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Set whether this window should be modal when shown.
- *
+ *
* <p>If a popup window is modal, it will receive all touch and key input.
* If the user touches outside the popup window's content area the popup window
* will be dismissed.
- *
+ *
* @param modal {@code true} if the popup window should be modal, {@code false} otherwise.
*/
public void setModal(boolean modal) {
@@ -293,7 +293,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Returns whether the popup window will be modal when shown.
- *
+ *
* @return {@code true} if the popup window will be modal, {@code false} otherwise.
*/
public boolean isModal() {
@@ -304,7 +304,7 @@ public class ListPopupWindow implements ShowableListMenu {
* Forces outside touches to be ignored. Normally if {@link #isDropDownAlwaysVisible()} is
* false, we allow outside touch to dismiss the dropdown. If this is set to true, then we
* ignore outside touch even when the drop down is not set to always visible.
- *
+ *
* @hide Used only by AutoCompleteTextView to handle some internal special cases.
*/
public void setForceIgnoreOutsideTouch(boolean forceIgnoreOutsideTouch) {
@@ -361,7 +361,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Sets a drawable to use as the list item selector.
- *
+ *
* @param selector List selector drawable to use in the popup.
*/
public void setListSelector(Drawable selector) {
@@ -377,7 +377,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Sets a drawable to be the background for the popup window.
- *
+ *
* @param d A drawable to set as the background.
*/
public void setBackgroundDrawable(@Nullable Drawable d) {
@@ -386,7 +386,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Set an animation style to use when the popup window is shown or dismissed.
- *
+ *
* @param animationStyle Animation style to use.
*/
public void setAnimationStyle(@StyleRes int animationStyle) {
@@ -396,7 +396,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Returns the animation style that will be used when the popup window is
* shown or dismissed.
- *
+ *
* @return Animation style that will be used.
*/
public @StyleRes int getAnimationStyle() {
@@ -405,7 +405,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Returns the view that will be used to anchor this popup.
- *
+ *
* @return The popup's anchor view
*/
public @Nullable View getAnchorView() {
@@ -415,7 +415,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Sets the popup's anchor view. This popup will always be positioned relative to
* the anchor view when shown.
- *
+ *
* @param anchor The view to use as an anchor.
*/
public void setAnchorView(@Nullable View anchor) {
@@ -431,7 +431,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Set the horizontal offset of this popup from its anchor view in pixels.
- *
+ *
* @param offset The horizontal offset of the popup from its anchor.
*/
public void setHorizontalOffset(int offset) {
@@ -450,7 +450,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Set the vertical offset of this popup from its anchor view in pixels.
- *
+ *
* @param offset The vertical offset of the popup from its anchor.
*/
public void setVerticalOffset(int offset) {
@@ -489,7 +489,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Sets the width of the popup window in pixels. Can also be {@link #MATCH_PARENT}
* or {@link #WRAP_CONTENT}.
- *
+ *
* @param width Width of the popup window.
*/
public void setWidth(int width) {
@@ -521,7 +521,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Sets the height of the popup window in pixels. Can also be {@link #MATCH_PARENT}.
- *
+ *
* @param height Height of the popup window.
*/
public void setHeight(int height) {
@@ -543,9 +543,9 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Sets a listener to receive events when a list item is clicked.
- *
+ *
* @param clickListener Listener to register
- *
+ *
* @see ListView#setOnItemClickListener(android.widget.AdapterView.OnItemClickListener)
*/
public void setOnItemClickListener(@Nullable AdapterView.OnItemClickListener clickListener) {
@@ -554,9 +554,9 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Sets a listener to receive events when a list item is selected.
- *
+ *
* @param selectedListener Listener to register.
- *
+ *
* @see ListView#setOnItemSelectedListener(OnItemSelectedListener)
*/
public void setOnItemSelectedListener(@Nullable OnItemSelectedListener selectedListener) {
@@ -566,7 +566,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Set a view to act as a user prompt for this popup window. Where the prompt view will appear
* is controlled by {@link #setPromptPosition(int)}.
- *
+ *
* @param prompt View to use as an informational prompt.
*/
public void setPromptView(@Nullable View prompt) {
@@ -662,7 +662,7 @@ public class ListPopupWindow implements ShowableListMenu {
mPopup.setWidth(widthSpec);
mPopup.setHeight(heightSpec);
mPopup.setClipToScreenEnabled(true);
-
+
// use outside touchable to dismiss drop down when touching outside of it, so
// only set this if the dropdown is not always visible
mPopup.setOutsideTouchable(!mForceIgnoreOutsideTouch && !mDropDownAlwaysVisible);
@@ -671,7 +671,7 @@ public class ListPopupWindow implements ShowableListMenu {
mPopup.showAsDropDown(getAnchorView(), mDropDownHorizontalOffset,
mDropDownVerticalOffset, mDropDownGravity);
mDropDownList.setSelection(ListView.INVALID_POSITION);
-
+
if (!mModal || mDropDownList.isInTouchMode()) {
clearListSelection();
}
@@ -716,11 +716,11 @@ public class ListPopupWindow implements ShowableListMenu {
* Control how the popup operates with an input method: one of
* {@link #INPUT_METHOD_FROM_FOCUSABLE}, {@link #INPUT_METHOD_NEEDED},
* or {@link #INPUT_METHOD_NOT_NEEDED}.
- *
+ *
* <p>If the popup is showing, calling this method will take effect only
* the next time the popup is shown or through a manual call to the {@link #show()}
* method.</p>
- *
+ *
* @see #getInputMethodMode()
* @see #show()
*/
@@ -730,7 +730,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Return the current value in {@link #setInputMethodMode(int)}.
- *
+ *
* @see #setInputMethodMode(int)
*/
public int getInputMethodMode() {
@@ -740,7 +740,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Set the selected position of the list.
* Only valid when {@link #isShowing()} == {@code true}.
- *
+ *
* @param position List position to set as selected.
*/
public void setSelection(int position) {
@@ -786,7 +786,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* Perform an item click operation on the specified list adapter position.
- *
+ *
* @param position Adapter position for performing the click
* @return true if the click action could be performed, false if not.
* (e.g. if the popup was not showing, this method would return false.)
@@ -817,7 +817,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* @return The position of the currently selected item or {@link ListView#INVALID_POSITION}
* if {@link #isShowing()} == {@code false}.
- *
+ *
* @see ListView#getSelectedItemPosition()
*/
public int getSelectedItemPosition() {
@@ -830,7 +830,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* @return The ID of the currently selected item or {@link ListView#INVALID_ROW_ID}
* if {@link #isShowing()} == {@code false}.
- *
+ *
* @see ListView#getSelectedItemId()
*/
public long getSelectedItemId() {
@@ -843,7 +843,7 @@ public class ListPopupWindow implements ShowableListMenu {
/**
* @return The View for the currently selected item or null if
* {@link #isShowing()} == {@code false}.
- *
+ *
* @see ListView#getSelectedView()
*/
public @Nullable View getSelectedView() {
@@ -904,7 +904,7 @@ public class ListPopupWindow implements ShowableListMenu {
final boolean below = !mPopup.isAboveAnchor();
final ListAdapter adapter = mAdapter;
-
+
boolean allEnabled;
int firstItem = Integer.MAX_VALUE;
int lastItem = Integer.MIN_VALUE;
@@ -914,9 +914,9 @@ public class ListPopupWindow implements ShowableListMenu {
firstItem = allEnabled ? 0 :
mDropDownList.lookForSelectablePosition(0, true);
lastItem = allEnabled ? adapter.getCount() - 1 :
- mDropDownList.lookForSelectablePosition(adapter.getCount() - 1, false);
+ mDropDownList.lookForSelectablePosition(adapter.getCount() - 1, false);
}
-
+
if ((below && keyCode == KeyEvent.KEYCODE_DPAD_UP && curIndex <= firstItem) ||
(!below && keyCode == KeyEvent.KEYCODE_DPAD_DOWN && curIndex >= lastItem)) {
// When the selection is at the top, we block the key
@@ -1132,18 +1132,18 @@ public class ListPopupWindow implements ShowableListMenu {
LinearLayout.LayoutParams hintParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, 0, 1.0f
);
-
+
switch (mPromptPosition) {
case POSITION_PROMPT_BELOW:
hintContainer.addView(dropDownView, hintParams);
hintContainer.addView(hintView);
break;
-
+
case POSITION_PROMPT_ABOVE:
hintContainer.addView(hintView);
hintContainer.addView(dropDownView, hintParams);
break;
-
+
default:
Log.e(TAG, "Invalid hint position " + mPromptPosition);
break;
@@ -1249,7 +1249,7 @@ public class ListPopupWindow implements ShowableListMenu {
show();
}
}
-
+
@Override
public void onInvalidated() {
dismiss();
@@ -1278,7 +1278,7 @@ public class ListPopupWindow implements ShowableListMenu {
final int action = event.getAction();
final int x = (int) event.getX();
final int y = (int) event.getY();
-
+
if (action == MotionEvent.ACTION_DOWN &&
mPopup != null && mPopup.isShowing() &&
(x >= 0 && x < mPopup.getWidth() && y >= 0 && y < mPopup.getHeight())) {
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index b0f19d7a0b49..e88c7efe43c8 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -16,11 +16,6 @@
package android.widget;
-import com.google.android.collect.Lists;
-
-import com.android.internal.R;
-import com.android.internal.util.Predicate;
-
import android.annotation.IdRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -53,6 +48,11 @@ import android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo;
import android.view.accessibility.AccessibilityNodeProvider;
import android.widget.RemoteViews.RemoteView;
+import com.android.internal.R;
+import com.android.internal.util.Predicate;
+
+import com.google.android.collect.Lists;
+
import java.util.ArrayList;
import java.util.List;
@@ -464,7 +464,7 @@ public class ListView extends AbsListView {
* data backing this list and for producing a view to represent an
* item in that data set.
*
- * @see #getAdapter()
+ * @see #getAdapter()
*/
@Override
public void setAdapter(ListAdapter adapter) {
@@ -1532,7 +1532,7 @@ public class ListView extends AbsListView {
adjustViewsUpOrDown();
}
} else if (lastPosition == mItemCount - 1) {
- adjustViewsUpOrDown();
+ adjustViewsUpOrDown();
}
}
}
@@ -1857,7 +1857,7 @@ public class ListView extends AbsListView {
&& focusLayoutRestoreView.getWindowToken() != null) {
focusLayoutRestoreView.dispatchFinishTemporaryDetach();
}
-
+
mLayoutMode = LAYOUT_NORMAL;
mDataChanged = false;
if (mPositionScrollAfterLayout != null) {
@@ -2109,7 +2109,7 @@ public class ListView extends AbsListView {
/**
* Makes the item at the supplied position selected.
- *
+ *
* @param position the position of the item to select
*/
@Override
@@ -2960,7 +2960,7 @@ public class ListView extends AbsListView {
if (startPos < firstPosition) {
startPos = firstPosition;
}
-
+
final int lastVisiblePos = getLastVisiblePosition();
final ListAdapter adapter = getAdapter();
for (int pos = startPos; pos <= lastVisiblePos; pos++) {
@@ -3129,7 +3129,7 @@ public class ListView extends AbsListView {
/**
* Determine the distance to the nearest edge of a view in a particular
* direction.
- *
+ *
* @param descendant A descendant of this list.
* @return The distance, or 0 if the nearest edge is already on screen.
*/
@@ -3386,7 +3386,7 @@ public class ListView extends AbsListView {
final int listBottom = mBottom - mTop - effectivePaddingBottom + mScrollY;
if (!mStackFromBottom) {
int bottom = 0;
-
+
// Draw top divider or header for overscroll
final int scrollY = mScrollY;
if (count > 0 && scrollY < 0) {
@@ -3483,7 +3483,7 @@ public class ListView extends AbsListView {
}
}
}
-
+
if (count > 0 && scrollY > 0) {
if (drawOverscrollFooter) {
final int absListBottom = mBottom;
@@ -3567,7 +3567,7 @@ public class ListView extends AbsListView {
public int getDividerHeight() {
return mDividerHeight;
}
-
+
/**
* Sets the height of the divider that will be drawn between each item in the list. Calling
* this will override the intrinsic height as set by {@link #setDivider(Drawable)}
@@ -3625,7 +3625,7 @@ public class ListView extends AbsListView {
public boolean areFooterDividersEnabled() {
return mFooterDividersEnabled;
}
-
+
/**
* Sets the drawable that will be drawn above all other list content.
* This area can become visible when the user overscrolls the list.
@@ -3878,10 +3878,10 @@ public class ListView extends AbsListView {
/**
* Returns the set of checked items ids. The result is only valid if the
* choice mode has not been set to {@link #CHOICE_MODE_NONE}.
- *
+ *
* @return A new array which contains the id of each checked item in the
* list.
- *
+ *
* @deprecated Use {@link #getCheckedItemIds()} instead.
*/
@Deprecated
diff --git a/core/java/android/widget/MenuItemHoverListener.java b/core/java/android/widget/MenuItemHoverListener.java
index 13f0e6a0f43c..835e4cdb248c 100644
--- a/core/java/android/widget/MenuItemHoverListener.java
+++ b/core/java/android/widget/MenuItemHoverListener.java
@@ -1,10 +1,10 @@
package android.widget;
-import com.android.internal.view.menu.MenuBuilder;
-
import android.annotation.NonNull;
import android.view.MenuItem;
+import com.android.internal.view.menu.MenuBuilder;
+
/**
* An interface notified when a menu item is hovered. Useful for cases when hover should trigger
* some behavior at a higher level, like managing the opening and closing of submenus.
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index 72b2e31a1d3a..662e64099fc8 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.annotation.CallSuper;
import android.annotation.IntDef;
import android.annotation.TestApi;
@@ -32,12 +30,10 @@ import android.graphics.Paint.Align;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.Spanned;
import android.text.TextUtils;
-import android.text.TextWatcher;
import android.text.method.NumberKeyListener;
import android.util.AttributeSet;
import android.util.SparseArray;
@@ -57,6 +53,10 @@ import android.view.animation.DecelerateInterpolator;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
+import com.android.internal.R;
+
+import libcore.icu.LocaleData;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -64,8 +64,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Locale;
-import libcore.icu.LocaleData;
-
/**
* A widget that enables the user to select a number from a predefined range.
* There are two flavors of this widget and which one is presented to the user
diff --git a/core/java/android/widget/PopupMenu.java b/core/java/android/widget/PopupMenu.java
index 027f8748dc17..eb27533c50ca 100644
--- a/core/java/android/widget/PopupMenu.java
+++ b/core/java/android/widget/PopupMenu.java
@@ -16,11 +16,6 @@
package android.widget;
-import com.android.internal.R;
-import com.android.internal.view.menu.MenuBuilder;
-import com.android.internal.view.menu.MenuPopupHelper;
-import com.android.internal.view.menu.ShowableListMenu;
-
import android.annotation.MenuRes;
import android.content.Context;
import android.view.Gravity;
@@ -30,6 +25,11 @@ import android.view.MenuItem;
import android.view.View;
import android.view.View.OnTouchListener;
+import com.android.internal.R;
+import com.android.internal.view.menu.MenuBuilder;
+import com.android.internal.view.menu.MenuPopupHelper;
+import com.android.internal.view.menu.ShowableListMenu;
+
/**
* A PopupMenu displays a {@link Menu} in a modal popup window anchored to a
* {@link View}. The popup will appear below the anchor view if there is room,
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index 5e73a631d1fd..fc1520b84259 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -16,7 +16,11 @@
package android.widget;
-import com.android.internal.R;
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+import static android.view.WindowManager.LayoutParams
+ .PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_WILL_NOT_REPLACE_ON_RELAUNCH;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -50,12 +54,9 @@ import android.view.ViewTreeObserver.OnScrollChangedListener;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
-import java.lang.ref.WeakReference;
+import com.android.internal.R;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_WILL_NOT_REPLACE_ON_RELAUNCH;
-import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
-import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+import java.lang.ref.WeakReference;
/**
* <p>
diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java
index 1f379c94cc03..266ff7520d91 100644
--- a/core/java/android/widget/ProgressBar.java
+++ b/core/java/android/widget/ProgressBar.java
@@ -22,9 +22,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.ColorStateList;
-import android.content.res.Resources;
import android.content.res.TypedArray;
-import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.PorterDuff;
import android.graphics.Rect;
@@ -60,6 +58,7 @@ import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;
import android.view.animation.Transformation;
import android.widget.RemoteViews.RemoteView;
+
import com.android.internal.R;
import java.util.ArrayList;
@@ -186,6 +185,7 @@ import java.util.ArrayList;
* @attr ref android.R.styleable#ProgressBar_indeterminateDuration
* @attr ref android.R.styleable#ProgressBar_indeterminateOnly
* @attr ref android.R.styleable#ProgressBar_interpolator
+ * @attr ref android.R.styleable#ProgressBar_min
* @attr ref android.R.styleable#ProgressBar_max
* @attr ref android.R.styleable#ProgressBar_maxHeight
* @attr ref android.R.styleable#ProgressBar_maxWidth
@@ -216,7 +216,10 @@ public class ProgressBar extends View {
private int mProgress;
private int mSecondaryProgress;
+ private int mMin;
+ private boolean mMinInitialized;
private int mMax;
+ private boolean mMaxInitialized;
private int mBehavior;
private int mDuration;
@@ -309,6 +312,7 @@ public class ProgressBar extends View {
setInterpolator(context, resID);
}
+ setMin(a.getInt(R.styleable.ProgressBar_min, mMin));
setMax(a.getInt(R.styleable.ProgressBar_max, mMax));
setProgress(a.getInt(R.styleable.ProgressBar_progress, mProgress));
@@ -565,6 +569,7 @@ public class ProgressBar extends View {
* </ul>
*/
private void initProgressBar() {
+ mMin = 0;
mMax = 100;
mProgress = 0;
mSecondaryProgress = 0;
@@ -1310,7 +1315,8 @@ public class ProgressBar extends View {
private synchronized void doRefreshProgress(int id, int progress, boolean fromUser,
boolean callBackToApp, boolean animate) {
- final float scale = mMax > 0 ? progress / (float) mMax : 0;
+ int range = mMax - mMin;
+ final float scale = range > 0 ? (progress - mMin) / (float) range : 0;
final boolean isPrimary = id == R.id.progress;
if (isPrimary && animate) {
@@ -1436,7 +1442,7 @@ public class ProgressBar extends View {
return false;
}
- progress = MathUtils.constrain(progress, 0, mMax);
+ progress = MathUtils.constrain(progress, mMin, mMax);
if (progress == mProgress) {
// No change from current.
@@ -1466,8 +1472,8 @@ public class ProgressBar extends View {
return;
}
- if (secondaryProgress < 0) {
- secondaryProgress = 0;
+ if (secondaryProgress < mMin) {
+ secondaryProgress = mMin;
}
if (secondaryProgress > mMax) {
@@ -1515,6 +1521,20 @@ public class ProgressBar extends View {
}
/**
+ * <p>Return the lower limit of this progress bar's range.</p>
+ *
+ * @return a positive integer
+ *
+ * @see #setMin(int)
+ * @see #getProgress()
+ * @see #getSecondaryProgress()
+ */
+ @ViewDebug.ExportedProperty(category = "progress")
+ public synchronized int getMin() {
+ return mMin;
+ }
+
+ /**
* <p>Return the upper limit of this progress bar's range.</p>
*
* @return a positive integer
@@ -1529,7 +1549,37 @@ public class ProgressBar extends View {
}
/**
- * <p>Set the range of the progress bar to 0...<tt>max</tt>.</p>
+ * <p>Set the lower range of the progress bar to <tt>min</tt>.</p>
+ *
+ * @param min the lower range of this progress bar
+ *
+ * @see #getMin()
+ * @see #setProgress(int)
+ * @see #setSecondaryProgress(int)
+ */
+ @android.view.RemotableViewMethod
+ public synchronized void setMin(int min) {
+ if (mMaxInitialized) {
+ if (min > mMax) {
+ min = mMax;
+ }
+ }
+ mMinInitialized = true;
+ if (mMaxInitialized && min != mMin) {
+ mMin = min;
+ postInvalidate();
+
+ if (mProgress < min) {
+ mProgress = min;
+ }
+ refreshProgress(R.id.progress, mProgress, false, false);
+ } else {
+ mMin = min;
+ }
+ }
+
+ /**
+ * <p>Set the upper range of the progress bar <tt>max</tt>.</p>
*
* @param max the upper range of this progress bar
*
@@ -1539,10 +1589,13 @@ public class ProgressBar extends View {
*/
@android.view.RemotableViewMethod
public synchronized void setMax(int max) {
- if (max < 0) {
- max = 0;
+ if (mMinInitialized) {
+ if (max < mMin) {
+ max = mMin;
+ }
}
- if (max != mMax) {
+ mMaxInitialized = true;
+ if (mMinInitialized && max != mMax) {
mMax = max;
postInvalidate();
@@ -1550,6 +1603,8 @@ public class ProgressBar extends View {
mProgress = max;
}
refreshProgress(R.id.progress, mProgress, false, false);
+ } else {
+ mMax = max;
}
}
@@ -1959,7 +2014,7 @@ public class ProgressBar extends View {
@Override
public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
super.onInitializeAccessibilityEventInternal(event);
- event.setItemCount(mMax);
+ event.setItemCount(mMax - mMin);
event.setCurrentItemIndex(mProgress);
}
diff --git a/core/java/android/widget/QuickContactBadge.java b/core/java/android/widget/QuickContactBadge.java
index 8c15cde4764f..8f6b0d538e32 100644
--- a/core/java/android/widget/QuickContactBadge.java
+++ b/core/java/android/widget/QuickContactBadge.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.content.Context;
@@ -38,6 +36,8 @@ import android.util.AttributeSet;
import android.view.View;
import android.view.View.OnClickListener;
+import com.android.internal.R;
+
/**
* Widget used to show an image with the standard QuickContact badge
* and on-click behavior.
diff --git a/core/java/android/widget/RadialTimePickerView.java b/core/java/android/widget/RadialTimePickerView.java
index 5a0e1f91d095..757a4ca04871 100644
--- a/core/java/android/widget/RadialTimePickerView.java
+++ b/core/java/android/widget/RadialTimePickerView.java
@@ -16,10 +16,6 @@
package android.widget;
-import android.view.PointerIcon;
-import com.android.internal.R;
-import com.android.internal.widget.ExploreByTouchHelper;
-
import android.animation.ObjectAnimator;
import android.annotation.IntDef;
import android.content.Context;
@@ -43,11 +39,15 @@ import android.util.StateSet;
import android.util.TypedValue;
import android.view.HapticFeedbackConstants;
import android.view.MotionEvent;
+import android.view.PointerIcon;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
+import com.android.internal.R;
+import com.android.internal.widget.ExploreByTouchHelper;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Calendar;
diff --git a/core/java/android/widget/RadioGroup.java b/core/java/android/widget/RadioGroup.java
index 065feb8b334e..54b57631366f 100644
--- a/core/java/android/widget/RadioGroup.java
+++ b/core/java/android/widget/RadioGroup.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.annotation.IdRes;
import android.content.Context;
import android.content.res.TypedArray;
@@ -25,6 +23,8 @@ import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
+import com.android.internal.R;
+
/**
* <p>This class is used to create a multiple-exclusion scope for a set of radio
@@ -39,14 +39,14 @@ import android.view.ViewGroup;
* in the XML layout file.</p>
*
* <p><strong>XML Attributes</strong></p>
- * <p>See {@link android.R.styleable#RadioGroup RadioGroup Attributes},
+ * <p>See {@link android.R.styleable#RadioGroup RadioGroup Attributes},
* {@link android.R.styleable#LinearLayout LinearLayout Attributes},
* {@link android.R.styleable#ViewGroup ViewGroup Attributes},
* {@link android.R.styleable#View View Attributes}</p>
* <p>Also see
* {@link android.widget.LinearLayout.LayoutParams LinearLayout.LayoutParams}
* for layout attributes.</p>
- *
+ *
* @see RadioButton
*
*/
@@ -310,7 +310,7 @@ public class RadioGroup extends LinearLayout {
} else {
width = WRAP_CONTENT;
}
-
+
if (a.hasValue(heightAttr)) {
height = a.getLayoutDimension(heightAttr, "layout_height");
} else {
diff --git a/core/java/android/widget/RatingBar.java b/core/java/android/widget/RatingBar.java
index 62dd90fddcd0..3b7fe86a5fa1 100644
--- a/core/java/android/widget/RatingBar.java
+++ b/core/java/android/widget/RatingBar.java
@@ -22,6 +22,7 @@ import android.graphics.drawable.shapes.RectShape;
import android.graphics.drawable.shapes.Shape;
import android.util.AttributeSet;
import android.view.accessibility.AccessibilityNodeInfo;
+
import com.android.internal.R;
/**
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index a189d3c0cc91..b424101d0470 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -16,20 +16,14 @@
package android.widget;
-import android.annotation.NonNull;
-import android.util.ArrayMap;
-import com.android.internal.R;
-
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.SortedSet;
-import java.util.TreeSet;
+import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
+import android.annotation.NonNull;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Rect;
import android.os.Build;
+import android.util.ArrayMap;
import android.util.AttributeSet;
import android.util.Pools.SynchronizedPool;
import android.util.SparseArray;
@@ -41,7 +35,13 @@ import android.view.ViewHierarchyEncoder;
import android.view.accessibility.AccessibilityEvent;
import android.widget.RemoteViews.RemoteView;
-import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
+import com.android.internal.R;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.SortedSet;
+import java.util.TreeSet;
/**
* A Layout where the positions of the children can be described in relation to each other or to the
@@ -209,7 +209,7 @@ public class RelativeLayout extends ViewGroup {
private int mIgnoreGravity;
private SortedSet<View> mTopToBottomLeftToRightSet = null;
-
+
private boolean mDirtyHierarchy;
private View[] mSortedHorizontalChildren;
private View[] mSortedVerticalChildren;
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 2a6e01f91b21..6543d0cf8bdd 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -59,11 +59,12 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView.OnItemClickListener;
-import libcore.util.Objects;
import com.android.internal.R;
import com.android.internal.util.Preconditions;
+import libcore.util.Objects;
+
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/core/java/android/widget/RemoteViewsAdapter.java b/core/java/android/widget/RemoteViewsAdapter.java
index 10abbab6aacd..e0f94fd207d3 100644
--- a/core/java/android/widget/RemoteViewsAdapter.java
+++ b/core/java/android/widget/RemoteViewsAdapter.java
@@ -16,13 +16,6 @@
package android.widget;
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-
import android.Manifest;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
@@ -48,6 +41,11 @@ import android.widget.RemoteViews.OnClickHandler;
import com.android.internal.widget.IRemoteViewsAdapterConnection;
import com.android.internal.widget.IRemoteViewsFactory;
+import java.lang.ref.WeakReference;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedList;
+
/**
* An adapter to a RemoteViewsService which fetches and caches RemoteViews
* to be later inflated as child views.
diff --git a/core/java/android/widget/RemoteViewsService.java b/core/java/android/widget/RemoteViewsService.java
index 07bd9188dca4..2827f634b389 100644
--- a/core/java/android/widget/RemoteViewsService.java
+++ b/core/java/android/widget/RemoteViewsService.java
@@ -16,14 +16,14 @@
package android.widget;
-import java.util.HashMap;
-
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import com.android.internal.widget.IRemoteViewsFactory;
+import java.util.HashMap;
+
/**
* The service to be connected to for a remote adapter to request RemoteViews. Users should
* extend the RemoteViewsService to provide the appropriate RemoteViewsFactory's used to
@@ -46,7 +46,7 @@ public abstract class RemoteViewsService extends Service {
* An interface for an adapter between a remote collection view (ListView, GridView, etc) and
* the underlying data for that view. The implementor is responsible for making a RemoteView
* for each item in the data set. This interface is a thin wrapper around {@link Adapter}.
- *
+ *
* @see android.widget.Adapter
* @see android.appwidget.AppWidgetManager
*/
diff --git a/core/java/android/widget/ResourceCursorAdapter.java b/core/java/android/widget/ResourceCursorAdapter.java
index 100f9192dd39..9732bb105c34 100644
--- a/core/java/android/widget/ResourceCursorAdapter.java
+++ b/core/java/android/widget/ResourceCursorAdapter.java
@@ -20,9 +20,9 @@ import android.content.Context;
import android.content.res.Resources;
import android.database.Cursor;
import android.view.ContextThemeWrapper;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.LayoutInflater;
/**
@@ -148,7 +148,7 @@ public abstract class ResourceCursorAdapter extends CursorAdapter {
public void setViewResource(int layout) {
mLayout = layout;
}
-
+
/**
* <p>Sets the layout resource of the drop down views.</p>
*
diff --git a/core/java/android/widget/ResourceCursorTreeAdapter.java b/core/java/android/widget/ResourceCursorTreeAdapter.java
index ddce515d825a..0894dba136c9 100644
--- a/core/java/android/widget/ResourceCursorTreeAdapter.java
+++ b/core/java/android/widget/ResourceCursorTreeAdapter.java
@@ -18,9 +18,9 @@ package android.widget;
import android.content.Context;
import android.database.Cursor;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.LayoutInflater;
/**
* A fairly simple ExpandableListAdapter that creates views defined in an XML
@@ -32,10 +32,10 @@ public abstract class ResourceCursorTreeAdapter extends CursorTreeAdapter {
private int mChildLayout;
private int mLastChildLayout;
private LayoutInflater mInflater;
-
+
/**
* Constructor.
- *
+ *
* @param context The context where the ListView associated with this
* SimpleListItemFactory is running
* @param cursor The database cursor
@@ -51,18 +51,18 @@ public abstract class ResourceCursorTreeAdapter extends CursorTreeAdapter {
public ResourceCursorTreeAdapter(Context context, Cursor cursor, int collapsedGroupLayout,
int expandedGroupLayout, int childLayout, int lastChildLayout) {
super(cursor, context);
-
+
mCollapsedGroupLayout = collapsedGroupLayout;
mExpandedGroupLayout = expandedGroupLayout;
mChildLayout = childLayout;
mLastChildLayout = lastChildLayout;
-
+
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
/**
* Constructor.
- *
+ *
* @param context The context where the ListView associated with this
* SimpleListItemFactory is running
* @param cursor The database cursor
@@ -80,7 +80,7 @@ public abstract class ResourceCursorTreeAdapter extends CursorTreeAdapter {
/**
* Constructor.
- *
+ *
* @param context The context where the ListView associated with this
* SimpleListItemFactory is running
* @param cursor The database cursor
@@ -93,7 +93,7 @@ public abstract class ResourceCursorTreeAdapter extends CursorTreeAdapter {
int childLayout) {
this(context, cursor, groupLayout, groupLayout, childLayout, childLayout);
}
-
+
@Override
public View newChildView(Context context, Cursor cursor, boolean isLastChild,
ViewGroup parent) {
diff --git a/core/java/android/widget/ScrollBarDrawable.java b/core/java/android/widget/ScrollBarDrawable.java
index 11eab2adad30..2ae38c9aa3fb 100644
--- a/core/java/android/widget/ScrollBarDrawable.java
+++ b/core/java/android/widget/ScrollBarDrawable.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.widget.ScrollBarUtils;
-
import android.annotation.NonNull;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
@@ -25,6 +23,8 @@ import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
+import com.android.internal.widget.ScrollBarUtils;
+
/**
* This is only used by View for displaying its scroll bars. It should probably
* be moved in to the view package since it is used in that lower-level layer.
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index e696ff7229e8..d8f337926073 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -17,18 +17,16 @@
package android.widget;
import android.annotation.NonNull;
-import android.content.res.Configuration;
-import android.os.Build;
-import android.os.Build.VERSION_CODES;
-import android.os.Parcel;
-import android.os.Parcelable;
-import com.android.internal.R;
-
import android.content.Context;
+import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
+import android.os.Build;
+import android.os.Build.VERSION_CODES;
import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
import android.os.StrictMode;
import android.util.AttributeSet;
import android.util.Log;
@@ -47,6 +45,8 @@ import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.AnimationUtils;
+import com.android.internal.R;
+
import java.util.List;
/**
diff --git a/core/java/android/widget/SeekBar.java b/core/java/android/widget/SeekBar.java
index 5d01d8d7cb16..f9aced09adcf 100644
--- a/core/java/android/widget/SeekBar.java
+++ b/core/java/android/widget/SeekBar.java
@@ -46,8 +46,10 @@ public class SeekBar extends AbsSeekBar {
* to distinguish user-initiated changes from those that occurred programmatically.
*
* @param seekBar The SeekBar whose progress has changed
- * @param progress The current progress level. This will be in the range 0..max where max
- * was set by {@link ProgressBar#setMax(int)}. (The default value for max is 100.)
+ * @param progress The current progress level. This will be in the range min..max where min
+ * and max were set by {@link ProgressBar#setMin(int)} and
+ * {@link ProgressBar#setMax(int)}, respectively. (The default values for
+ * min is 0 and max is 100.)
* @param fromUser True if the progress change was initiated by the user.
*/
void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser);
diff --git a/core/java/android/widget/SimpleAdapter.java b/core/java/android/widget/SimpleAdapter.java
index 3bf94850deef..91901178e81e 100644
--- a/core/java/android/widget/SimpleAdapter.java
+++ b/core/java/android/widget/SimpleAdapter.java
@@ -20,11 +20,11 @@ import android.annotation.IdRes;
import android.annotation.LayoutRes;
import android.content.Context;
import android.content.res.Resources;
+import android.net.Uri;
import android.view.ContextThemeWrapper;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.LayoutInflater;
-import android.net.Uri;
import java.util.ArrayList;
import java.util.List;
@@ -40,7 +40,7 @@ import java.util.Map;
* Binding data to views occurs in two phases. First, if a
* {@link android.widget.SimpleAdapter.ViewBinder} is available,
* {@link ViewBinder#setViewValue(android.view.View, Object, String)}
- * is invoked. If the returned value is true, binding has occurred.
+ * is invoked. If the returned value is true, binding has occurred.
* If the returned value is false, the following views are then tried in order:
* <ul>
* <li> A view that implements Checkable (e.g. CheckBox). The expected bind value is a boolean.
@@ -223,7 +223,7 @@ public class SimpleAdapter extends BaseAdapter implements Filterable, ThemedSpin
setViewText((TextView) v, text);
} else if (v instanceof ImageView) {
if (data instanceof Integer) {
- setViewImage((ImageView) v, (Integer) data);
+ setViewImage((ImageView) v, (Integer) data);
} else {
setViewImage((ImageView) v, text);
}
@@ -291,7 +291,7 @@ public class SimpleAdapter extends BaseAdapter implements Filterable, ThemedSpin
* @param v ImageView to receive an image
* @param value the value retrieved from the data set
*
- * @see #setViewImage(ImageView, int)
+ * @see #setViewImage(ImageView, int)
*/
public void setViewImage(ImageView v, String value) {
try {
@@ -381,18 +381,18 @@ public class SimpleAdapter extends BaseAdapter implements Filterable, ThemedSpin
for (int i = 0; i < count; i++) {
Map<String, ?> h = unfilteredValues.get(i);
if (h != null) {
-
+
int len = mTo.length;
for (int j=0; j<len; j++) {
String str = (String)h.get(mFrom[j]);
-
+
String[] words = str.split(" ");
int wordCount = words.length;
-
+
for (int k = 0; k < wordCount; k++) {
String word = words[k];
-
+
if (word.toLowerCase().startsWith(prefixString)) {
newValues.add(h);
break;
diff --git a/core/java/android/widget/SimpleExpandableListAdapter.java b/core/java/android/widget/SimpleExpandableListAdapter.java
index 015c169f74b5..597502b707e0 100644
--- a/core/java/android/widget/SimpleExpandableListAdapter.java
+++ b/core/java/android/widget/SimpleExpandableListAdapter.java
@@ -17,9 +17,9 @@
package android.widget;
import android.content.Context;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.LayoutInflater;
import java.util.List;
import java.util.Map;
@@ -42,18 +42,18 @@ public class SimpleExpandableListAdapter extends BaseExpandableListAdapter {
private int mCollapsedGroupLayout;
private String[] mGroupFrom;
private int[] mGroupTo;
-
+
private List<? extends List<? extends Map<String, ?>>> mChildData;
private int mChildLayout;
private int mLastChildLayout;
private String[] mChildFrom;
private int[] mChildTo;
-
+
private LayoutInflater mInflater;
-
+
/**
* Constructor
- *
+ *
* @param context The context where the {@link ExpandableListView}
* associated with this {@link SimpleExpandableListAdapter} is
* running
@@ -98,7 +98,7 @@ public class SimpleExpandableListAdapter extends BaseExpandableListAdapter {
/**
* Constructor
- *
+ *
* @param context The context where the {@link ExpandableListView}
* associated with this {@link SimpleExpandableListAdapter} is
* running
@@ -147,7 +147,7 @@ public class SimpleExpandableListAdapter extends BaseExpandableListAdapter {
/**
* Constructor
- *
+ *
* @param context The context where the {@link ExpandableListView}
* associated with this {@link SimpleExpandableListAdapter} is
* running
@@ -200,16 +200,16 @@ public class SimpleExpandableListAdapter extends BaseExpandableListAdapter {
mCollapsedGroupLayout = collapsedGroupLayout;
mGroupFrom = groupFrom;
mGroupTo = groupTo;
-
+
mChildData = childData;
mChildLayout = childLayout;
mLastChildLayout = lastChildLayout;
mChildFrom = childFrom;
mChildTo = childTo;
-
+
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
-
+
public Object getChild(int groupPosition, int childPosition) {
return mChildData.get(groupPosition).get(childPosition);
}
@@ -239,7 +239,7 @@ public class SimpleExpandableListAdapter extends BaseExpandableListAdapter {
public View newChildView(boolean isLastChild, ViewGroup parent) {
return mInflater.inflate((isLastChild) ? mLastChildLayout : mChildLayout, parent, false);
}
-
+
private void bindView(View view, Map<String, ?> data, String[] from, int[] to) {
int len = to.length;
diff --git a/core/java/android/widget/SimpleMonthView.java b/core/java/android/widget/SimpleMonthView.java
index 8c4378222a77..855d1d288a65 100644
--- a/core/java/android/widget/SimpleMonthView.java
+++ b/core/java/android/widget/SimpleMonthView.java
@@ -16,10 +16,6 @@
package android.widget;
-import android.view.PointerIcon;
-import com.android.internal.R;
-import com.android.internal.widget.ExploreByTouchHelper;
-
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -43,17 +39,21 @@ import android.util.MathUtils;
import android.util.StateSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
+import android.view.PointerIcon;
import android.view.View;
import android.view.ViewParent;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
-import java.text.NumberFormat;
-import java.util.Locale;
+import com.android.internal.R;
+import com.android.internal.widget.ExploreByTouchHelper;
import libcore.icu.LocaleData;
+import java.text.NumberFormat;
+import java.util.Locale;
+
/**
* A calendar-like view displaying a specified month and the appropriate selectable day numbers
* within the specified month.
diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java
index dc5e5a2964a4..28cc693f3b31 100644
--- a/core/java/android/widget/Spinner.java
+++ b/core/java/android/widget/Spinner.java
@@ -16,13 +16,9 @@
package android.widget;
-import android.annotation.TestApi;
-import android.view.PointerIcon;
-import com.android.internal.R;
-import com.android.internal.view.menu.ShowableListMenu;
-
import android.annotation.DrawableRes;
import android.annotation.Nullable;
+import android.annotation.TestApi;
import android.annotation.Widget;
import android.app.AlertDialog;
import android.content.Context;
@@ -42,6 +38,7 @@ import android.util.Log;
import android.view.ContextThemeWrapper;
import android.view.Gravity;
import android.view.MotionEvent;
+import android.view.PointerIcon;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
@@ -49,6 +46,9 @@ import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.PopupWindow.OnDismissListener;
+import com.android.internal.R;
+import com.android.internal.view.menu.ShowableListMenu;
+
/**
* A view that displays one child at a time and lets the user pick among them.
* The items in the Spinner come from the {@link Adapter} associated with
@@ -123,7 +123,7 @@ public class Spinner extends AbsSpinner implements OnClickListener {
* access the current theme, resources, etc.
* @param mode Constant describing how the user will select choices from
* the spinner.
- *
+ *
* @see #MODE_DIALOG
* @see #MODE_DROPDOWN
*/
@@ -563,7 +563,7 @@ public class Spinner extends AbsSpinner implements OnClickListener {
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
-
+
if (mPopup != null && mPopup.isShowing()) {
mPopup.dismiss();
}
@@ -772,7 +772,7 @@ public class Spinner extends AbsSpinner implements OnClickListener {
@Override
public boolean performClick() {
boolean handled = super.performClick();
-
+
if (!handled) {
handled = true;
@@ -1011,7 +1011,7 @@ public class Spinner extends AbsSpinner implements OnClickListener {
/**
* If the wrapped SpinnerAdapter is also a ListAdapter, delegate this call.
- * Otherwise, return true.
+ * Otherwise, return true.
*/
public boolean areAllItemsEnabled() {
final ListAdapter adapter = mListAdapter;
@@ -1042,19 +1042,19 @@ public class Spinner extends AbsSpinner implements OnClickListener {
public int getViewTypeCount() {
return 1;
}
-
+
public boolean isEmpty() {
return getCount() == 0;
}
}
-
+
/**
* Implements some sort of popup selection interface for selecting a spinner option.
* Allows for different spinner modes.
*/
private interface SpinnerPopup {
public void setAdapter(ListAdapter adapter);
-
+
/**
* Show the popup
*/
@@ -1064,12 +1064,12 @@ public class Spinner extends AbsSpinner implements OnClickListener {
* Dismiss the popup
*/
public void dismiss();
-
+
/**
* @return true if the popup is showing, false otherwise.
*/
public boolean isShowing();
-
+
/**
* Set hint text to be displayed to the user. This should provide
* a description of the choice being made.
@@ -1129,7 +1129,7 @@ public class Spinner extends AbsSpinner implements OnClickListener {
listView.setTextAlignment(textAlignment);
mPopup.show();
}
-
+
public void onClick(DialogInterface dialog, int which) {
setSelection(which);
if (mOnItemClickListener != null) {
@@ -1168,7 +1168,7 @@ public class Spinner extends AbsSpinner implements OnClickListener {
return 0;
}
}
-
+
private class DropdownPopup extends ListPopupWindow implements SpinnerPopup {
private CharSequence mHintText;
private ListAdapter mAdapter;
@@ -1190,7 +1190,7 @@ public class Spinner extends AbsSpinner implements OnClickListener {
}
});
}
-
+
@Override
public void setAdapter(ListAdapter adapter) {
super.setAdapter(adapter);
@@ -1200,7 +1200,7 @@ public class Spinner extends AbsSpinner implements OnClickListener {
public CharSequence getHintText() {
return mHintText;
}
-
+
public void setPromptText(CharSequence hintText) {
// Hint text is ignored for dropdowns, but maintain it here.
mHintText = hintText;
diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java
index 2bd31438976b..0e99c02cc6aa 100644
--- a/core/java/android/widget/StackView.java
+++ b/core/java/android/widget/StackView.java
@@ -15,8 +15,6 @@
package android.widget;
-import java.lang.ref.WeakReference;
-
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.content.Context;
@@ -45,6 +43,8 @@ import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.LinearInterpolator;
import android.widget.RemoteViews.RemoteView;
+import java.lang.ref.WeakReference;
+
@RemoteView
/**
* A view that displays its children in a stack and allows users to discretely swipe
@@ -670,12 +670,12 @@ public class StackView extends AdapterViewAnimator {
activeIndex = (swipeGestureType == GESTURE_SLIDE_DOWN) ? 1 : 0;
}
- boolean endOfStack = mLoopViews && adapterCount == 1 &&
- ((mStackMode == ITEMS_SLIDE_UP && swipeGestureType == GESTURE_SLIDE_UP) ||
- (mStackMode == ITEMS_SLIDE_DOWN && swipeGestureType == GESTURE_SLIDE_DOWN));
- boolean beginningOfStack = mLoopViews && adapterCount == 1 &&
- ((mStackMode == ITEMS_SLIDE_DOWN && swipeGestureType == GESTURE_SLIDE_UP) ||
- (mStackMode == ITEMS_SLIDE_UP && swipeGestureType == GESTURE_SLIDE_DOWN));
+ boolean endOfStack = mLoopViews && adapterCount == 1
+ && ((mStackMode == ITEMS_SLIDE_UP && swipeGestureType == GESTURE_SLIDE_UP)
+ || (mStackMode == ITEMS_SLIDE_DOWN && swipeGestureType == GESTURE_SLIDE_DOWN));
+ boolean beginningOfStack = mLoopViews && adapterCount == 1
+ && ((mStackMode == ITEMS_SLIDE_DOWN && swipeGestureType == GESTURE_SLIDE_UP)
+ || (mStackMode == ITEMS_SLIDE_UP && swipeGestureType == GESTURE_SLIDE_DOWN));
int stackMode;
if (mLoopViews && !beginningOfStack && !endOfStack) {
diff --git a/core/java/android/widget/SuggestionsAdapter.java b/core/java/android/widget/SuggestionsAdapter.java
index aad0625e71ca..f833d1b4a9d6 100644
--- a/core/java/android/widget/SuggestionsAdapter.java
+++ b/core/java/android/widget/SuggestionsAdapter.java
@@ -21,8 +21,8 @@ import android.app.SearchManager;
import android.app.SearchableInfo;
import android.content.ComponentName;
import android.content.ContentResolver;
-import android.content.Context;
import android.content.ContentResolver.OpenResourceIdResult;
+import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -39,8 +39,8 @@ import android.text.style.TextAppearanceSpan;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
-import android.view.ViewGroup;
import android.view.View.OnClickListener;
+import android.view.ViewGroup;
import com.android.internal.R;
@@ -111,7 +111,7 @@ class SuggestionsAdapter extends ResourceCursorAdapter implements OnClickListene
mProviderContext = mSearchable.getProviderContext(mContext, activityContext);
mOutsideDrawablesCache = outsideDrawablesCache;
-
+
// mStartSpinnerRunnable = new Runnable() {
// public void run() {
// // mSearchView.setWorking(true); // TODO:
diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java
index d51c5be640ae..fcc1667d8043 100644
--- a/core/java/android/widget/Switch.java
+++ b/core/java/android/widget/Switch.java
@@ -30,8 +30,8 @@ import android.graphics.Insets;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.Rect;
-import android.graphics.Typeface;
import android.graphics.Region.Op;
+import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.text.Layout;
import android.text.StaticLayout;
@@ -46,8 +46,8 @@ import android.view.Gravity;
import android.view.MotionEvent;
import android.view.SoundEffectConstants;
import android.view.VelocityTracker;
-import android.view.ViewStructure;
import android.view.ViewConfiguration;
+import android.view.ViewStructure;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
diff --git a/core/java/android/widget/TabHost.java b/core/java/android/widget/TabHost.java
index 583f037813f3..32418cdb8240 100644
--- a/core/java/android/widget/TabHost.java
+++ b/core/java/android/widget/TabHost.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.LocalActivityManager;
@@ -35,6 +33,9 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;
+
+import com.android.internal.R;
+
import java.util.ArrayList;
import java.util.List;
diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java
index 1f0cb7cebe56..05f7c0a1ee08 100644
--- a/core/java/android/widget/TabWidget.java
+++ b/core/java/android/widget/TabWidget.java
@@ -16,10 +16,6 @@
package android.widget;
-import android.view.MotionEvent;
-import android.view.PointerIcon;
-import com.android.internal.R;
-
import android.annotation.DrawableRes;
import android.annotation.Nullable;
import android.content.Context;
@@ -29,11 +25,15 @@ import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.PointerIcon;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
+import com.android.internal.R;
+
/**
*
* Displays a list of tab labels representing each page in the parent's tab
diff --git a/core/java/android/widget/TableLayout.java b/core/java/android/widget/TableLayout.java
index eed3c2d2c8e1..8bb4d16fe7df 100644
--- a/core/java/android/widget/TableLayout.java
+++ b/core/java/android/widget/TableLayout.java
@@ -16,14 +16,15 @@
package android.widget;
-import com.android.internal.R;
-
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.SparseBooleanArray;
import android.view.View;
import android.view.ViewGroup;
+
+import com.android.internal.R;
+
import java.util.regex.Pattern;
/**
diff --git a/core/java/android/widget/TextClock.java b/core/java/android/widget/TextClock.java
index 5003c610241a..a6a9db44c420 100644
--- a/core/java/android/widget/TextClock.java
+++ b/core/java/android/widget/TextClock.java
@@ -16,6 +16,9 @@
package android.widget;
+import static android.view.ViewDebug.ExportedProperty;
+import static android.widget.RemoteViews.RemoteView;
+
import android.annotation.NonNull;
import android.app.ActivityManager;
import android.content.BroadcastReceiver;
@@ -37,13 +40,10 @@ import android.view.ViewHierarchyEncoder;
import com.android.internal.R;
-import java.util.Calendar;
-import java.util.TimeZone;
-
import libcore.icu.LocaleData;
-import static android.view.ViewDebug.ExportedProperty;
-import static android.widget.RemoteViews.*;
+import java.util.Calendar;
+import java.util.TimeZone;
/**
* <p><code>TextClock</code> can display the current date and/or time as
diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java
index 6a76c5bb2b76..e6cd7987d59a 100644
--- a/core/java/android/widget/TimePicker.java
+++ b/core/java/android/widget/TimePicker.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
@@ -32,12 +30,14 @@ import android.util.MathUtils;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
+import com.android.internal.R;
+
+import libcore.icu.LocaleData;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Locale;
-import libcore.icu.LocaleData;
-
/**
* A widget for selecting the time of day, in either 24-hour or AM/PM mode.
* <p>
diff --git a/core/java/android/widget/TimePickerSpinnerDelegate.java b/core/java/android/widget/TimePickerSpinnerDelegate.java
index 26e1564aff6b..6a68f60b2c7a 100644
--- a/core/java/android/widget/TimePickerSpinnerDelegate.java
+++ b/core/java/android/widget/TimePickerSpinnerDelegate.java
@@ -16,6 +16,9 @@
package android.widget;
+import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
+import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES;
+
import android.annotation.TestApi;
import android.content.Context;
import android.content.res.TypedArray;
@@ -29,14 +32,12 @@ import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
-import com.android.internal.R;
-import java.util.Calendar;
+import com.android.internal.R;
import libcore.icu.LocaleData;
-import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
-import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES;
+import java.util.Calendar;
/**
* A delegate implementing the basic spinner-based TimePicker.
diff --git a/core/java/android/widget/TwoLineListItem.java b/core/java/android/widget/TwoLineListItem.java
index 69ff488b5b47..0445ebd50926 100644
--- a/core/java/android/widget/TwoLineListItem.java
+++ b/core/java/android/widget/TwoLineListItem.java
@@ -20,22 +20,21 @@ import android.annotation.Widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
-import android.widget.RelativeLayout;
/**
- * <p>A view group with two children, intended for use in ListViews. This item has two
- * {@link android.widget.TextView TextViews} elements (or subclasses) with the ID values
+ * <p>A view group with two children, intended for use in ListViews. This item has two
+ * {@link android.widget.TextView TextViews} elements (or subclasses) with the ID values
* {@link android.R.id#text1 text1}
- * and {@link android.R.id#text2 text2}. There is an optional third View element with the
- * ID {@link android.R.id#selectedIcon selectedIcon}, which can be any View subclass
+ * and {@link android.R.id#text2 text2}. There is an optional third View element with the
+ * ID {@link android.R.id#selectedIcon selectedIcon}, which can be any View subclass
* (though it is typically a graphic View, such as {@link android.widget.ImageView ImageView})
- * that can be displayed when a TwoLineListItem has focus. Android supplies a
- * {@link android.R.layout#two_line_list_item standard layout resource for TwoLineListView}
+ * that can be displayed when a TwoLineListItem has focus. Android supplies a
+ * {@link android.R.layout#two_line_list_item standard layout resource for TwoLineListView}
* (which does not include a selected item icon), but you can design your own custom XML
* layout for this object.
- *
+ *
* @attr ref android.R.styleable#TwoLineListItem_mode
- *
+ *
* @deprecated This class can be implemented easily by apps using a {@link RelativeLayout}
* or a {@link LinearLayout}.
*/
@@ -51,7 +50,7 @@ public class TwoLineListItem extends RelativeLayout {
}
public TwoLineListItem(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
+ this(context, attrs, 0);
}
public TwoLineListItem(Context context, AttributeSet attrs, int defStyleAttr) {
@@ -70,11 +69,11 @@ public class TwoLineListItem extends RelativeLayout {
@Override
protected void onFinishInflate() {
super.onFinishInflate();
-
+
mText1 = (TextView) findViewById(com.android.internal.R.id.text1);
mText2 = (TextView) findViewById(com.android.internal.R.id.text2);
}
-
+
/**
* Returns a handle to the item with ID text1.
* @return A handle to the item with ID text1.
@@ -82,7 +81,7 @@ public class TwoLineListItem extends RelativeLayout {
public TextView getText1() {
return mText1;
}
-
+
/**
* Returns a handle to the item with ID text2.
* @return A handle to the item with ID text2.
diff --git a/core/java/android/widget/ViewFlipper.java b/core/java/android/widget/ViewFlipper.java
index 65af7aa28a6b..e769d71b66eb 100644
--- a/core/java/android/widget/ViewFlipper.java
+++ b/core/java/android/widget/ViewFlipper.java
@@ -21,7 +21,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.TypedArray;
-import android.os.*;
+import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.RemoteViews.RemoteView;
diff --git a/core/java/android/widget/YearPickerView.java b/core/java/android/widget/YearPickerView.java
index a3f5a67baca1..824fec85de16 100644
--- a/core/java/android/widget/YearPickerView.java
+++ b/core/java/android/widget/YearPickerView.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.content.Context;
import android.content.res.Resources;
import android.icu.util.Calendar;
@@ -27,6 +25,8 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
+import com.android.internal.R;
+
/**
* Displays a selectable list of years.
*/
diff --git a/core/java/android/widget/ZoomButtonsController.java b/core/java/android/widget/ZoomButtonsController.java
index fb912a4e1882..69b799716f02 100644
--- a/core/java/android/widget/ZoomButtonsController.java
+++ b/core/java/android/widget/ZoomButtonsController.java
@@ -30,11 +30,11 @@ import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
+import android.view.View.OnClickListener;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.ViewRootImpl;
import android.view.WindowManager;
-import android.view.View.OnClickListener;
import android.view.WindowManager.LayoutParams;
/*
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index 4c6350ba9ad6..a7b0fe9ad869 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -19,6 +19,14 @@ ifneq ($(ENABLE_CPUSETS),)
LOCAL_CFLAGS += -DENABLE_CPUSETS
endif
+# TODO: Linear blending should be enabled by default, but we are
+# TODO: making it an opt-in while it's a work in progress
+# TODO: The final test should be:
+# TODO: ifneq ($(TARGET_ENABLE_LINEAR_BLENDING),false)
+ifeq ($(TARGET_ENABLE_LINEAR_BLENDING),true)
+ hwui_cflags += -DANDROID_ENABLE_LINEAR_BLENDING
+endif
+
LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES
LOCAL_CFLAGS += -DU_USING_ICU_NAMESPACE=0
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index 6acb76d365b5..9ed15881355b 100755
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -16,8 +16,8 @@
#include "android_util_Binder.h"
#include "android_nio_utils.h"
#include "CreateJavaOutputStreamAdaptor.h"
-#include <Caches.h>
#include <hwui/Paint.h>
+#include <hwui/PixelRef.h>
#include <renderthread/RenderProxy.h>
#include "core_jni_helpers.h"
@@ -25,324 +25,197 @@
#include <jni.h>
#include <memory>
#include <string>
-#include <sys/mman.h>
-#include <cutils/ashmem.h>
#define DEBUG_PARCEL 0
#define ASHMEM_BITMAP_MIN_SIZE (128 * (1 << 10))
+static jclass gBitmap_class;
+static jfieldID gBitmap_nativePtr;
+static jmethodID gBitmap_constructorMethodID;
+static jmethodID gBitmap_reinitMethodID;
+static jmethodID gBitmap_getAllocationByteCountMethodID;
+
namespace android {
-class WrappedPixelRef : public SkPixelRef {
+class Bitmap {
public:
- WrappedPixelRef(Bitmap* wrapper, void* storage,
- const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable)
- : SkPixelRef(info)
- , mBitmap(*wrapper)
- , mStorage(storage) {
- reconfigure(info, rowBytes, ctable);
+ Bitmap(PixelRef* pixelRef)
+ : mPixelRef(pixelRef) { }
+
+ void freePixels() {
+ mInfo = mPixelRef->info();
+ mHasHardwareMipMap = mPixelRef->hasHardwareMipMap();
+ mAllocationSize = mPixelRef->getAllocationByteCount();
+ mRowBytes = mPixelRef->rowBytes();
+ mGenerationId = mPixelRef->getGenerationID();
+ mPixelRef.reset();
}
- ~WrappedPixelRef() {
- // Tell SkRefCnt that everything is as it expects by forcing
- // the refcnt to 1
- internal_dispose_restore_refcnt_to_1();
- SkSafeUnref(mColorTable);
+ bool valid() {
+ return !!mPixelRef;
}
- void reconfigure(const SkImageInfo& newInfo, size_t rowBytes, SkColorTable* ctable) {
- if (kIndex_8_SkColorType != newInfo.colorType()) {
- ctable = nullptr;
- }
- mRowBytes = rowBytes;
- if (mColorTable != ctable) {
- SkSafeUnref(mColorTable);
- mColorTable = ctable;
- SkSafeRef(mColorTable);
- }
+ PixelRef* pixelRef() { return mPixelRef.get(); }
- // Need to validate the alpha type to filter against the color type
- // to prevent things like a non-opaque RGB565 bitmap
- SkAlphaType alphaType;
- LOG_ALWAYS_FATAL_IF(!SkColorTypeValidateAlphaType(
- newInfo.colorType(), newInfo.alphaType(), &alphaType),
- "Failed to validate alpha type!");
-
- // Dirty hack is dirty
- // TODO: Figure something out here, Skia's current design makes this
- // really hard to work with. Skia really, really wants immutable objects,
- // but with the nested-ref-count hackery going on that's just not
- // feasible without going insane trying to figure it out
- SkImageInfo* myInfo = const_cast<SkImageInfo*>(&this->info());
- *myInfo = newInfo;
- changeAlphaType(alphaType);
-
- // Docs say to only call this in the ctor, but we're going to call
- // it anyway even if this isn't always the ctor.
- // TODO: Fix this too as part of the above TODO
- setPreLocked(mStorage, mRowBytes, mColorTable);
- }
-
- // Can't mark as override since SkPixelRef::rowBytes isn't virtual
- // but that's OK since we just want BitmapWrapper to be able to rely
- // on calling rowBytes() on an unlocked pixelref, which it will be
- // doing on a WrappedPixelRef type, not a SkPixelRef, so static
- // dispatching will do what we want.
- size_t rowBytes() const { return mRowBytes; }
- SkColorTable* colorTable() const { return mColorTable; }
-
- bool hasHardwareMipMap() const {
- return mHasHardwareMipMap;
+ void assertValid() {
+ LOG_ALWAYS_FATAL_IF(!valid(), "Error, cannot access an invalid/free'd bitmap here!");
}
- void setHasHardwareMipMap(bool hasMipMap) {
- mHasHardwareMipMap = hasMipMap;
+ void getSkBitmap(SkBitmap* outBitmap) {
+ assertValid();
+ mPixelRef->getSkBitmap(outBitmap);
}
-protected:
- virtual bool onNewLockPixels(LockRec* rec) override {
- rec->fPixels = mStorage;
- rec->fRowBytes = mRowBytes;
- rec->fColorTable = mColorTable;
- return true;
+ bool hasHardwareMipMap() {
+ if (mPixelRef) {
+ return mPixelRef->hasHardwareMipMap();
+ }
+ return mHasHardwareMipMap;
}
- virtual void onUnlockPixels() override {
- // nothing
+ void setHasHardwareMipMap(bool hasMipMap) {
+ assertValid();
+ mPixelRef->setHasHardwareMipMap(hasMipMap);
}
- virtual size_t getAllocatedSizeInBytes() const override {
- return info().getSafeSize(mRowBytes);
+ void setAlphaType(SkAlphaType alphaType) {
+ assertValid();
+ mPixelRef->setAlphaType(alphaType);
}
-private:
- Bitmap& mBitmap;
- void* mStorage;
- size_t mRowBytes = 0;
- SkColorTable* mColorTable = nullptr;
- bool mHasHardwareMipMap = false;
-
- virtual void internal_dispose() const override {
- mBitmap.onStrongRefDestroyed();
+ const SkImageInfo& info() {
+ if (mPixelRef) {
+ return mPixelRef->info();
+ }
+ return mInfo;
}
-};
-Bitmap::Bitmap(void* address, size_t size, const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable)
- : mPixelStorageType(PixelStorageType::Heap) {
- mPixelStorage.heap.address = address;
- mPixelStorage.heap.size = size;
- mPixelRef.reset(new WrappedPixelRef(this, address, info, rowBytes, ctable));
- // Note: this will trigger a call to onStrongRefDestroyed(), but
- // we want the pixel ref to have a ref count of 0 at this point
- mPixelRef->unref();
-}
-
-Bitmap::Bitmap(void* address, void* context, FreeFunc freeFunc,
- const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable)
- : mPixelStorageType(PixelStorageType::External) {
- mPixelStorage.external.address = address;
- mPixelStorage.external.context = context;
- mPixelStorage.external.freeFunc = freeFunc;
- mPixelRef.reset(new WrappedPixelRef(this, address, info, rowBytes, ctable));
- // Note: this will trigger a call to onStrongRefDestroyed(), but
- // we want the pixel ref to have a ref count of 0 at this point
- mPixelRef->unref();
-}
-
-Bitmap::Bitmap(void* address, int fd, size_t mappedSize,
- const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable)
- : mPixelStorageType(PixelStorageType::Ashmem) {
- mPixelStorage.ashmem.address = address;
- mPixelStorage.ashmem.fd = fd;
- mPixelStorage.ashmem.size = mappedSize;
- mPixelRef.reset(new WrappedPixelRef(this, address, info, rowBytes, ctable));
- // Note: this will trigger a call to onStrongRefDestroyed(), but
- // we want the pixel ref to have a ref count of 0 at this point
- mPixelRef->unref();
-}
-Bitmap::~Bitmap() {
- doFreePixels();
-}
-
-void Bitmap::freePixels() {
- AutoMutex _lock(mLock);
- if (mPinnedRefCount == 0) {
- doFreePixels();
- mPixelStorageType = PixelStorageType::Invalid;
+ size_t getAllocationByteCount() const {
+ if (mPixelRef) {
+ return mPixelRef->getAllocationByteCount();
+ }
+ return mAllocationSize;
}
-}
-void Bitmap::doFreePixels() {
- switch (mPixelStorageType) {
- case PixelStorageType::Invalid:
- // already free'd, nothing to do
- break;
- case PixelStorageType::External:
- mPixelStorage.external.freeFunc(mPixelStorage.external.address,
- mPixelStorage.external.context);
- break;
- case PixelStorageType::Ashmem:
- munmap(mPixelStorage.ashmem.address, mPixelStorage.ashmem.size);
- close(mPixelStorage.ashmem.fd);
- break;
- case PixelStorageType::Heap:
- free(mPixelStorage.heap.address);
- break;
+ size_t rowBytes() const {
+ if (mPixelRef) {
+ return mPixelRef->rowBytes();
+ }
+ return mRowBytes;
}
- if (android::uirenderer::Caches::hasInstance()) {
- android::uirenderer::Caches::getInstance().textureCache.releaseTexture(
- mPixelRef->getStableID());
+ uint32_t getGenerationID() const {
+ if (mPixelRef) {
+ return mPixelRef->getGenerationID();
+ }
+ return mGenerationId;
}
-}
-bool Bitmap::hasHardwareMipMap() {
- return mPixelRef->hasHardwareMipMap();
-}
+ ~Bitmap() { }
-void Bitmap::setHasHardwareMipMap(bool hasMipMap) {
- mPixelRef->setHasHardwareMipMap(hasMipMap);
-}
+private:
+ sk_sp<PixelRef> mPixelRef;
+ SkImageInfo mInfo;
+ bool mHasHardwareMipMap;
+ size_t mAllocationSize;
+ size_t mRowBytes;
+ uint32_t mGenerationId;
+};
-int Bitmap::getAshmemFd() const {
- switch (mPixelStorageType) {
- case PixelStorageType::Ashmem:
- return mPixelStorage.ashmem.fd;
- default:
- return -1;
- }
-}
+// Convenience class that does not take a global ref on the pixels, relying
+// on the caller already having a local JNI ref
+class LocalScopedBitmap {
+public:
+ explicit LocalScopedBitmap(jlong bitmapHandle)
+ : mBitmap(reinterpret_cast<Bitmap*>(bitmapHandle)) {}
-size_t Bitmap::getAllocationByteCount() const {
- switch (mPixelStorageType) {
- case PixelStorageType::Heap:
- return mPixelStorage.heap.size;
- default:
- return rowBytes() * height();
+ Bitmap* operator->() {
+ return mBitmap;
}
-}
-const SkImageInfo& Bitmap::info() const {
- return mPixelRef->info();
-}
-
-size_t Bitmap::rowBytes() const {
- return mPixelRef->rowBytes();
-}
-
-SkPixelRef* Bitmap::peekAtPixelRef() const {
- assertValid();
- return mPixelRef.get();
-}
-
-SkPixelRef* Bitmap::refPixelRef() {
- assertValid();
- android::AutoMutex _lock(mLock);
- return refPixelRefLocked();
-}
+ void* pixels() {
+ return mBitmap->pixelRef()->pixels();
+ }
-SkPixelRef* Bitmap::refPixelRefLocked() {
- mPixelRef->ref();
- if (mPixelRef->unique()) {
- // We just restored this from 0, pin the pixels and inc the strong count
- // Note that there *might be* an incoming onStrongRefDestroyed from whatever
- // last unref'd
- mPinnedRefCount++;
+ bool valid() {
+ return mBitmap && mBitmap->valid();
}
- return mPixelRef.get();
-}
-void Bitmap::reconfigure(const SkImageInfo& info, size_t rowBytes,
- SkColorTable* ctable) {
- mPixelRef->reconfigure(info, rowBytes, ctable);
-}
+private:
+ Bitmap* mBitmap;
+};
-void Bitmap::reconfigure(const SkImageInfo& info) {
- reconfigure(info, info.minRowBytes(), nullptr);
-}
+namespace bitmap {
-void Bitmap::setAlphaType(SkAlphaType alphaType) {
- if (!SkColorTypeValidateAlphaType(info().colorType(), alphaType, &alphaType)) {
- return;
+// Assert that bitmap's SkAlphaType is consistent with isPremultiplied.
+static void assert_premultiplied(const SkImageInfo& info, bool isPremultiplied) {
+ // kOpaque_SkAlphaType and kIgnore_SkAlphaType mean that isPremultiplied is
+ // irrelevant. This just tests to ensure that the SkAlphaType is not
+ // opposite of isPremultiplied.
+ if (isPremultiplied) {
+ SkASSERT(info.alphaType() != kUnpremul_SkAlphaType);
+ } else {
+ SkASSERT(info.alphaType() != kPremul_SkAlphaType);
}
-
- mPixelRef->changeAlphaType(alphaType);
}
-void Bitmap::detachFromJava() {
- bool disposeSelf;
- {
- android::AutoMutex _lock(mLock);
- mAttachedToJava = false;
- disposeSelf = shouldDisposeSelfLocked();
- }
- if (disposeSelf) {
- delete this;
- }
+void reinitBitmap(JNIEnv* env, jobject javaBitmap, const SkImageInfo& info,
+ bool isPremultiplied)
+{
+ // The caller needs to have already set the alpha type properly, so the
+ // native SkBitmap stays in sync with the Java Bitmap.
+ assert_premultiplied(info, isPremultiplied);
+
+ env->CallVoidMethod(javaBitmap, gBitmap_reinitMethodID,
+ info.width(), info.height(), isPremultiplied);
}
-bool Bitmap::shouldDisposeSelfLocked() {
- return mPinnedRefCount == 0 && !mAttachedToJava;
+int getBitmapAllocationByteCount(JNIEnv* env, jobject javaBitmap)
+{
+ return env->CallIntMethod(javaBitmap, gBitmap_getAllocationByteCountMethodID);
}
+jobject createBitmap(JNIEnv* env, PixelRef* pixelRef,
+ int bitmapCreateFlags, jbyteArray ninePatchChunk, jobject ninePatchInsets,
+ int density) {
+ bool isMutable = bitmapCreateFlags & kBitmapCreateFlag_Mutable;
+ bool isPremultiplied = bitmapCreateFlags & kBitmapCreateFlag_Premultiplied;
+ // The caller needs to have already set the alpha type properly, so the
+ // native SkBitmap stays in sync with the Java Bitmap.
+ assert_premultiplied(pixelRef->info(), isPremultiplied);
+ Bitmap* bitmap = new Bitmap(pixelRef);
+ jobject obj = env->NewObject(gBitmap_class, gBitmap_constructorMethodID,
+ reinterpret_cast<jlong>(bitmap), pixelRef->width(), pixelRef->height(), density, isMutable,
+ isPremultiplied, ninePatchChunk, ninePatchInsets);
-void Bitmap::onStrongRefDestroyed() {
- bool disposeSelf = false;
- {
- android::AutoMutex _lock(mLock);
- if (mPinnedRefCount > 0) {
- mPinnedRefCount--;
- if (mPinnedRefCount == 0) {
- disposeSelf = shouldDisposeSelfLocked();
- }
- }
- }
- if (disposeSelf) {
- delete this;
+ if (env->ExceptionCheck() != 0) {
+ ALOGE("*** Uncaught exception returned from Java call!\n");
+ env->ExceptionDescribe();
}
+ return obj;
}
-void Bitmap::getSkBitmap(SkBitmap* outBitmap) {
- assertValid();
- android::AutoMutex _lock(mLock);
- // Safe because mPixelRef is a WrappedPixelRef type, otherwise rowBytes()
- // would require locking the pixels first.
- outBitmap->setInfo(mPixelRef->info(), mPixelRef->rowBytes());
- outBitmap->setPixelRef(refPixelRefLocked())->unref();
- outBitmap->setHasHardwareMipMap(hasHardwareMipMap());
+void toSkBitmap(jlong bitmapHandle, SkBitmap* outBitmap) {
+ LocalScopedBitmap bitmap(bitmapHandle);
+ bitmap->getSkBitmap(outBitmap);
}
-void Bitmap::assertValid() const {
- LOG_ALWAYS_FATAL_IF(mPixelStorageType == PixelStorageType::Invalid,
- "Error, cannot access an invalid/free'd bitmap here!");
+PixelRef* toPixelRef(JNIEnv* env, jobject bitmap) {
+ SkASSERT(env);
+ SkASSERT(bitmap);
+ SkASSERT(env->IsInstanceOf(bitmap, gBitmap_class));
+ jlong bitmapHandle = env->GetLongField(bitmap, gBitmap_nativePtr);
+ LocalScopedBitmap localBitmap(bitmapHandle);
+ localBitmap->assertValid();
+ return localBitmap->pixelRef();
}
+} // namespace bitmap
+
} // namespace android
using namespace android;
-
-// Convenience class that does not take a global ref on the pixels, relying
-// on the caller already having a local JNI ref
-class LocalScopedBitmap {
-public:
- explicit LocalScopedBitmap(jlong bitmapHandle)
- : mBitmap(reinterpret_cast<Bitmap*>(bitmapHandle)) {}
-
- Bitmap* operator->() {
- return mBitmap;
- }
-
- void* pixels() {
- return mBitmap->peekAtPixelRef()->pixels();
- }
-
- bool valid() {
- return mBitmap && mBitmap->valid();
- }
-
-private:
- Bitmap* mBitmap;
-};
+using namespace android::bitmap;
///////////////////////////////////////////////////////////////////////////////
// Conversions to/from SkColor, for get/setPixels, and the create method, which
@@ -649,8 +522,8 @@ static ToColorProc ChooseToColorProc(const SkBitmap& src) {
///////////////////////////////////////////////////////////////////////////////
static int getPremulBitmapCreateFlags(bool isMutable) {
- int flags = GraphicsJNI::kBitmapCreateFlag_Premultiplied;
- if (isMutable) flags |= GraphicsJNI::kBitmapCreateFlag_Mutable;
+ int flags = android::bitmap::kBitmapCreateFlag_Premultiplied;
+ if (isMutable) flags |= android::bitmap::kBitmapCreateFlag_Mutable;
return flags;
}
@@ -672,9 +545,10 @@ static jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors,
}
SkBitmap bitmap;
- bitmap.setInfo(SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType));
+ bitmap.setInfo(SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType,
+ GraphicsJNI::defaultColorSpace()));
- Bitmap* nativeBitmap = GraphicsJNI::allocateHeapPixelRef(&bitmap, NULL);
+ PixelRef* nativeBitmap = GraphicsJNI::allocateHeapPixelRef(&bitmap, NULL);
if (!nativeBitmap) {
return NULL;
}
@@ -684,7 +558,7 @@ static jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors,
0, 0, width, height, bitmap);
}
- return GraphicsJNI::createBitmap(env, nativeBitmap,
+ return createBitmap(env, nativeBitmap,
getPremulBitmapCreateFlags(isMutable));
}
@@ -699,29 +573,28 @@ static jobject Bitmap_copy(JNIEnv* env, jobject, jlong srcHandle,
if (!src.copyTo(&result, dstCT, &allocator)) {
return NULL;
}
- Bitmap* bitmap = allocator.getStorageObjAndReset();
- return GraphicsJNI::createBitmap(env, bitmap,
- getPremulBitmapCreateFlags(isMutable));
+ auto pixelRef = allocator.getStorageObjAndReset();
+ return createBitmap(env, pixelRef, getPremulBitmapCreateFlags(isMutable));
}
-static Bitmap* Bitmap_copyAshmemImpl(JNIEnv* env, SkBitmap& src, SkColorType& dstCT) {
+static PixelRef* Bitmap_copyAshmemImpl(JNIEnv* env, SkBitmap& src, SkColorType& dstCT) {
SkBitmap result;
AshmemPixelAllocator allocator(env);
if (!src.copyTo(&result, dstCT, &allocator)) {
return NULL;
}
- Bitmap* bitmap = allocator.getStorageObjAndReset();
- bitmap->peekAtPixelRef()->setImmutable();
- return bitmap;
+ auto pixelRef = allocator.getStorageObjAndReset();
+ pixelRef->setImmutable();
+ return pixelRef;
}
static jobject Bitmap_copyAshmem(JNIEnv* env, jobject, jlong srcHandle) {
SkBitmap src;
reinterpret_cast<Bitmap*>(srcHandle)->getSkBitmap(&src);
SkColorType dstCT = src.colorType();
- Bitmap* bitmap = Bitmap_copyAshmemImpl(env, src, dstCT);
- jobject ret = GraphicsJNI::createBitmap(env, bitmap, getPremulBitmapCreateFlags(false));
+ auto pixelRef = Bitmap_copyAshmemImpl(env, src, dstCT);
+ jobject ret = createBitmap(env, pixelRef, getPremulBitmapCreateFlags(false));
return ret;
}
@@ -729,13 +602,13 @@ static jobject Bitmap_copyAshmemConfig(JNIEnv* env, jobject, jlong srcHandle, ji
SkBitmap src;
reinterpret_cast<Bitmap*>(srcHandle)->getSkBitmap(&src);
SkColorType dstCT = GraphicsJNI::legacyBitmapConfigToColorType(dstConfigHandle);
- Bitmap* bitmap = Bitmap_copyAshmemImpl(env, src, dstCT);
- jobject ret = GraphicsJNI::createBitmap(env, bitmap, getPremulBitmapCreateFlags(false));
+ auto pixelRef = Bitmap_copyAshmemImpl(env, src, dstCT);
+ jobject ret = createBitmap(env, pixelRef, getPremulBitmapCreateFlags(false));
return ret;
}
static void Bitmap_destruct(Bitmap* bitmap) {
- bitmap->detachFromJava();
+ delete bitmap;
}
static jlong Bitmap_getNativeFinalizer(JNIEnv*, jobject) {
@@ -751,6 +624,7 @@ static jboolean Bitmap_recycle(JNIEnv* env, jobject, jlong bitmapHandle) {
static void Bitmap_reconfigure(JNIEnv* env, jobject clazz, jlong bitmapHandle,
jint width, jint height, jint configHandle, jboolean requestPremul) {
LocalScopedBitmap bitmap(bitmapHandle);
+ bitmap->assertValid();
SkColorType colorType = GraphicsJNI::legacyBitmapConfigToColorType(configHandle);
// ARGB_4444 is a deprecated format, convert automatically to 8888
@@ -773,7 +647,8 @@ static void Bitmap_reconfigure(JNIEnv* env, jobject clazz, jlong bitmapHandle,
// Otherwise respect the premultiplied request.
alphaType = requestPremul ? kPremul_SkAlphaType : kUnpremul_SkAlphaType;
}
- bitmap->reconfigure(SkImageInfo::Make(width, height, colorType, alphaType));
+ bitmap->pixelRef()->reconfigure(SkImageInfo::Make(width, height, colorType, alphaType,
+ sk_sp<SkColorSpace>(bitmap->info().colorSpace())));
}
// These must match the int values in Bitmap.java
@@ -843,7 +718,7 @@ static jint Bitmap_config(JNIEnv* env, jobject, jlong bitmapHandle) {
static jint Bitmap_getGenerationId(JNIEnv* env, jobject, jlong bitmapHandle) {
LocalScopedBitmap bitmap(bitmapHandle);
- return static_cast<jint>(bitmap->peekAtPixelRef()->getGenerationID());
+ return static_cast<jint>(bitmap->getGenerationID());
}
static jboolean Bitmap_isPremultiplied(JNIEnv* env, jobject, jlong bitmapHandle) {
@@ -906,6 +781,7 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
const bool isMutable = p->readInt32() != 0;
const SkColorType colorType = (SkColorType)p->readInt32();
const SkAlphaType alphaType = (SkAlphaType)p->readInt32();
+ const bool isSRGB = p->readInt32() != 0;
const int width = p->readInt32();
const int height = p->readInt32();
const int rowBytes = p->readInt32();
@@ -922,7 +798,8 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
std::unique_ptr<SkBitmap> bitmap(new SkBitmap);
- if (!bitmap->setInfo(SkImageInfo::Make(width, height, colorType, alphaType), rowBytes)) {
+ if (!bitmap->setInfo(SkImageInfo::Make(width, height, colorType, alphaType,
+ isSRGB ? SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named) : nullptr), rowBytes)) {
return NULL;
}
@@ -955,7 +832,7 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
}
// Map the bitmap in place from the ashmem region if possible otherwise copy.
- Bitmap* nativeBitmap;
+ PixelRef* nativeBitmap;
if (blob.fd() >= 0 && (blob.isMutable() || !isMutable) && (size >= ASHMEM_BITMAP_MIN_SIZE)) {
#if DEBUG_PARCEL
ALOGD("Bitmap.createFromParcel: mapped contents of %s bitmap from %s blob "
@@ -1018,7 +895,7 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
blob.release();
}
- return GraphicsJNI::createBitmap(env, nativeBitmap,
+ return createBitmap(env, nativeBitmap,
getPremulBitmapCreateFlags(isMutable), NULL, NULL, density);
}
@@ -1034,12 +911,16 @@ static jboolean Bitmap_writeToParcel(JNIEnv* env, jobject,
android::Parcel* p = android::parcelForJavaObject(env, parcel);
SkBitmap bitmap;
- android::Bitmap* androidBitmap = reinterpret_cast<Bitmap*>(bitmapHandle);
+ auto androidBitmap = reinterpret_cast<Bitmap*>(bitmapHandle);
androidBitmap->getSkBitmap(&bitmap);
+ sk_sp<SkColorSpace> sRGB = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named);
+ bool isSRGB = bitmap.colorSpace() == sRGB.get();
+
p->writeInt32(isMutable);
p->writeInt32(bitmap.colorType());
p->writeInt32(bitmap.alphaType());
+ p->writeInt32(isSRGB); // TODO: We should write the color space (b/32072280)
p->writeInt32(bitmap.width());
p->writeInt32(bitmap.height());
p->writeInt32(bitmap.rowBytes());
@@ -1061,7 +942,7 @@ static jboolean Bitmap_writeToParcel(JNIEnv* env, jobject,
// Transfer the underlying ashmem region if we have one and it's immutable.
android::status_t status;
- int fd = androidBitmap->getAshmemFd();
+ int fd = androidBitmap->pixelRef()->getAshmemFd();
if (fd >= 0 && !isMutable && p->allowFds()) {
#if DEBUG_PARCEL
ALOGD("Bitmap.writeToParcel: transferring immutable bitmap's ashmem fd as "
@@ -1131,7 +1012,7 @@ static jobject Bitmap_extractAlpha(JNIEnv* env, jobject clazz,
env->ReleaseIntArrayElements(offsetXY, array, 0);
}
- return GraphicsJNI::createBitmap(env, allocator.getStorageObjAndReset(),
+ return createBitmap(env, allocator.getStorageObjAndReset(),
getPremulBitmapCreateFlags(true));
}
@@ -1252,7 +1133,9 @@ static jboolean Bitmap_sameAs(JNIEnv* env, jobject, jlong bm0Handle,
reinterpret_cast<Bitmap*>(bm1Handle)->getSkBitmap(&bm1);
if (bm0.width() != bm1.width() ||
bm0.height() != bm1.height() ||
- bm0.colorType() != bm1.colorType()) {
+ bm0.colorType() != bm1.colorType() ||
+ bm0.alphaType() != bm1.alphaType() ||
+ bm0.colorSpace() != bm1.colorSpace()) {
return JNI_FALSE;
}
@@ -1307,7 +1190,7 @@ static jboolean Bitmap_sameAs(JNIEnv* env, jobject, jlong bm0Handle,
static jlong Bitmap_refPixelRef(JNIEnv* env, jobject, jlong bitmapHandle) {
LocalScopedBitmap bitmap(bitmapHandle);
- SkPixelRef* pixelRef = bitmap.valid() ? bitmap->peekAtPixelRef() : nullptr;
+ SkPixelRef* pixelRef = bitmap->pixelRef();
SkSafeRef(pixelRef);
return reinterpret_cast<jlong>(pixelRef);
}
@@ -1326,6 +1209,20 @@ static jint Bitmap_getAllocationByteCount(JNIEnv* env, jobject, jlong bitmapPtr)
}
///////////////////////////////////////////////////////////////////////////////
+static jclass make_globalref(JNIEnv* env, const char classname[])
+{
+ jclass c = env->FindClass(classname);
+ SkASSERT(c);
+ return (jclass) env->NewGlobalRef(c);
+}
+
+static jfieldID getFieldIDCheck(JNIEnv* env, jclass clazz,
+ const char fieldname[], const char type[])
+{
+ jfieldID id = env->GetFieldID(clazz, fieldname, type);
+ SkASSERT(id);
+ return id;
+}
static const JNINativeMethod gBitmapMethods[] = {
{ "nativeCreate", "([IIIIIIZ)Landroid/graphics/Bitmap;",
@@ -1374,6 +1271,11 @@ static const JNINativeMethod gBitmapMethods[] = {
int register_android_graphics_Bitmap(JNIEnv* env)
{
+ gBitmap_class = make_globalref(env, "android/graphics/Bitmap");
+ gBitmap_nativePtr = getFieldIDCheck(env, gBitmap_class, "mNativePtr", "J");
+ gBitmap_constructorMethodID = env->GetMethodID(gBitmap_class, "<init>", "(JIIIZZ[BLandroid/graphics/NinePatch$InsetStruct;)V");
+ gBitmap_reinitMethodID = env->GetMethodID(gBitmap_class, "reinit", "(IIZ)V");
+ gBitmap_getAllocationByteCountMethodID = env->GetMethodID(gBitmap_class, "getAllocationByteCount", "()I");
return android::RegisterMethodsOrDie(env, "android/graphics/Bitmap", gBitmapMethods,
NELEM(gBitmapMethods));
-}
+} \ No newline at end of file
diff --git a/core/jni/android/graphics/Bitmap.h b/core/jni/android/graphics/Bitmap.h
index 9ae1f3f3d07b..588a99c23bd3 100644
--- a/core/jni/android/graphics/Bitmap.h
+++ b/core/jni/android/graphics/Bitmap.h
@@ -20,98 +20,38 @@
#include <SkBitmap.h>
#include <SkColorTable.h>
#include <SkImageInfo.h>
-#include <utils/Mutex.h>
-#include <memory>
+#include <SkPixelRef.h>
namespace android {
-enum class PixelStorageType {
- Invalid,
- External,
- Heap,
- Ashmem,
-};
-
-class WrappedPixelRef;
-
-typedef void (*FreeFunc)(void* addr, void* context);
-
-/**
- * Glue-thingy that deals with managing the interaction between the Java
- * Bitmap object & SkBitmap along with trying to map a notion of strong/weak
- * lifecycles onto SkPixelRef which only has strong counts to avoid requiring
- * two GC passes to free the byte[] that backs a Bitmap.
- *
- * Since not all Bitmaps are byte[]-backed it also supports external allocations,
- * which currently is used by screenshots to wrap a gralloc buffer.
- */
-class Bitmap {
-public:
- Bitmap(void* address, size_t allocSize, const SkImageInfo& info, size_t rowBytes,
- SkColorTable* ctable);
- Bitmap(void* address, void* context, FreeFunc freeFunc,
- const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable);
- Bitmap(void* address, int fd, size_t mappedSize, const SkImageInfo& info,
- size_t rowBytes, SkColorTable* ctable);
-
- const SkImageInfo& info() const;
-
- int width() const { return info().width(); }
- int height() const { return info().height(); }
- size_t rowBytes() const;
- SkPixelRef* peekAtPixelRef() const;
- SkPixelRef* refPixelRef();
- bool valid() const { return mPixelStorageType != PixelStorageType::Invalid; }
+class PixelRef;
- void reconfigure(const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable);
- void reconfigure(const SkImageInfo& info);
- void setAlphaType(SkAlphaType alphaType);
+namespace bitmap {
- void getSkBitmap(SkBitmap* outBitmap);
- void detachFromJava();
+enum BitmapCreateFlags {
+ kBitmapCreateFlag_None = 0x0,
+ kBitmapCreateFlag_Mutable = 0x1,
+ kBitmapCreateFlag_Premultiplied = 0x2,
+};
- void freePixels();
+jobject createBitmap(JNIEnv* env, PixelRef* bitmap,
+ int bitmapCreateFlags, jbyteArray ninePatchChunk = NULL,
+ jobject ninePatchInsets = NULL, int density = -1);
- bool hasHardwareMipMap();
- void setHasHardwareMipMap(bool hasMipMap);
- int getAshmemFd() const;
- size_t getAllocationByteCount() const;
-private:
- friend class WrappedPixelRef;
+void toSkBitmap(jlong bitmapHandle, SkBitmap* outBitmap);
- ~Bitmap();
- void doFreePixels();
- void onStrongRefDestroyed();
+PixelRef* toPixelRef(JNIEnv* env, jobject bitmap);
- void pinPixelsLocked();
- bool shouldDisposeSelfLocked();
- void assertValid() const;
- SkPixelRef* refPixelRefLocked();
+/** Reinitialize a bitmap. bitmap must already have its SkAlphaType set in
+ sync with isPremultiplied
+*/
+void reinitBitmap(JNIEnv* env, jobject javaBitmap, const SkImageInfo& info,
+ bool isPremultiplied);
- android::Mutex mLock;
- int mPinnedRefCount = 0;
- std::unique_ptr<WrappedPixelRef> mPixelRef;
- PixelStorageType mPixelStorageType;
- bool mAttachedToJava = true;
+int getBitmapAllocationByteCount(JNIEnv* env, jobject javaBitmap);
- union {
- struct {
- void* address;
- void* context;
- FreeFunc freeFunc;
- } external;
- struct {
- void* address;
- int fd;
- size_t size;
- } ashmem;
- struct {
- void* address;
- size_t size;
- } heap;
- } mPixelStorage;
-};
+} // namespace bitmap
} // namespace android
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 5a540ce10662..5c24585cb182 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -162,7 +162,7 @@ private:
class RecyclingPixelAllocator : public SkBitmap::Allocator {
public:
- RecyclingPixelAllocator(android::Bitmap* bitmap, unsigned int size)
+ RecyclingPixelAllocator(android::PixelRef* bitmap, unsigned int size)
: mBitmap(bitmap), mSize(size) {
}
@@ -190,7 +190,8 @@ public:
}
mBitmap->reconfigure(info, bitmap->rowBytes(), ctable);
- bitmap->setPixelRef(mBitmap->refPixelRef())->unref();
+ mBitmap->ref();
+ bitmap->setPixelRef(mBitmap)->unref();
// since we're already allocated, we lockPixels right away
// HeapAllocator behaves this way too
@@ -199,7 +200,7 @@ public:
}
private:
- android::Bitmap* const mBitmap;
+ android::PixelRef* const mBitmap;
const unsigned int mSize;
};
@@ -326,16 +327,16 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding
scaledHeight = static_cast<int>(scaledHeight * scale + 0.5f);
}
- android::Bitmap* reuseBitmap = nullptr;
+ android::PixelRef* reuseBitmap = nullptr;
unsigned int existingBufferSize = 0;
if (javaBitmap != NULL) {
- reuseBitmap = GraphicsJNI::getBitmap(env, javaBitmap);
- if (reuseBitmap->peekAtPixelRef()->isImmutable()) {
+ reuseBitmap = bitmap::toPixelRef(env, javaBitmap);
+ if (reuseBitmap->isImmutable()) {
ALOGW("Unable to reuse an immutable bitmap as an image decoder target.");
javaBitmap = NULL;
reuseBitmap = nullptr;
} else {
- existingBufferSize = GraphicsJNI::getBitmapAllocationByteCount(env, javaBitmap);
+ existingBufferSize = bitmap::getBitmapAllocationByteCount(env, javaBitmap);
}
}
@@ -384,11 +385,8 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding
// Set the alpha type for the decode.
SkAlphaType alphaType = codec->computeOutputAlphaType(requireUnpremultiplied);
- // Enable legacy behavior to avoid any gamma correction. Android's assets are
- // adjusted to expect a non-gamma correct premultiply.
- sk_sp<SkColorSpace> colorSpace = nullptr;
- const SkImageInfo decodeInfo = SkImageInfo::Make(size.width(), size.height(), decodeColorType,
- alphaType, colorSpace);
+ const SkImageInfo decodeInfo = SkImageInfo::Make(size.width(), size.height(),
+ decodeColorType, alphaType, GraphicsJNI::defaultColorSpace());
SkImageInfo bitmapInfo = decodeInfo;
if (decodeColorType == kGray_8_SkColorType) {
@@ -412,7 +410,7 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding
// Use SkAndroidCodec to perform the decode.
SkAndroidCodec::AndroidOptions codecOptions;
- codecOptions.fZeroInitialized = decodeAllocator == &defaultAllocator ?
+ codecOptions.fZeroInitialized = decodeAllocator == &defaultAllocator ?
SkCodec::kYes_ZeroInitialized : SkCodec::kNo_ZeroInitialized;
codecOptions.fColorPtr = colorPtr;
codecOptions.fColorCount = colorCount;
@@ -451,8 +449,10 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding
jobject ninePatchInsets = NULL;
if (peeker.mHasInsets) {
ninePatchInsets = env->NewObject(gInsetStruct_class, gInsetStruct_constructorMethodID,
- peeker.mOpticalInsets[0], peeker.mOpticalInsets[1], peeker.mOpticalInsets[2], peeker.mOpticalInsets[3],
- peeker.mOutlineInsets[0], peeker.mOutlineInsets[1], peeker.mOutlineInsets[2], peeker.mOutlineInsets[3],
+ peeker.mOpticalInsets[0], peeker.mOpticalInsets[1],
+ peeker.mOpticalInsets[2], peeker.mOpticalInsets[3],
+ peeker.mOutlineInsets[0], peeker.mOutlineInsets[1],
+ peeker.mOutlineInsets[2], peeker.mOutlineInsets[3],
peeker.mOutlineRadius, peeker.mOutlineAlpha, scale);
if (ninePatchInsets == NULL) {
return nullObjectReturn("nine patch insets == null");
@@ -494,11 +494,11 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding
}
SkPaint paint;
- // kSrc_Mode instructs us to overwrite the unininitialized pixels in
+ // kSrc_Mode instructs us to overwrite the uninitialized pixels in
// outputBitmap. Otherwise we would blend by default, which is not
// what we want.
paint.setXfermodeMode(SkXfermode::kSrc_Mode);
- paint.setFilterQuality(kLow_SkFilterQuality);
+ paint.setFilterQuality(kLow_SkFilterQuality); // bilinear filtering
SkCanvas canvas(outputBitmap);
canvas.scale(sx, sy);
@@ -529,18 +529,18 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding
bool isPremultiplied = !requireUnpremultiplied;
if (javaBitmap != nullptr) {
- GraphicsJNI::reinitBitmap(env, javaBitmap, outputBitmap.info(), isPremultiplied);
+ bitmap::reinitBitmap(env, javaBitmap, outputBitmap.info(), isPremultiplied);
outputBitmap.notifyPixelsChanged();
// If a java bitmap was passed in for reuse, pass it back
return javaBitmap;
}
int bitmapCreateFlags = 0x0;
- if (isMutable) bitmapCreateFlags |= GraphicsJNI::kBitmapCreateFlag_Mutable;
- if (isPremultiplied) bitmapCreateFlags |= GraphicsJNI::kBitmapCreateFlag_Premultiplied;
+ if (isMutable) bitmapCreateFlags |= android::bitmap::kBitmapCreateFlag_Mutable;
+ if (isPremultiplied) bitmapCreateFlags |= android::bitmap::kBitmapCreateFlag_Premultiplied;
// now create the java bitmap
- return GraphicsJNI::createBitmap(env, defaultAllocator.getStorageObjAndReset(),
+ return bitmap::createBitmap(env, defaultAllocator.getStorageObjAndReset(),
bitmapCreateFlags, ninePatchChunk, ninePatchInsets, -1);
}
diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp
index 21850bde83d2..7d0915ba1bc2 100644
--- a/core/jni/android/graphics/BitmapRegionDecoder.cpp
+++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp
@@ -148,14 +148,14 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, jlong brdHandle, jint in
}
// Recycle a bitmap if possible.
- android::Bitmap* recycledBitmap = nullptr;
+ android::PixelRef* recycledBitmap = nullptr;
size_t recycledBytes = 0;
if (javaBitmap) {
- recycledBitmap = GraphicsJNI::getBitmap(env, javaBitmap);
- if (recycledBitmap->peekAtPixelRef()->isImmutable()) {
+ recycledBitmap = bitmap::toPixelRef(env, javaBitmap);
+ if (recycledBitmap->isImmutable()) {
ALOGW("Warning: Reusing an immutable bitmap as an image decoder target.");
}
- recycledBytes = GraphicsJNI::getBitmapAllocationByteCount(env, javaBitmap);
+ recycledBytes = bitmap::getBitmapAllocationByteCount(env, javaBitmap);
}
// Set up the pixel allocator
@@ -198,9 +198,9 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, jlong brdHandle, jint in
int bitmapCreateFlags = 0;
if (!requireUnpremul) {
- bitmapCreateFlags |= GraphicsJNI::kBitmapCreateFlag_Premultiplied;
+ bitmapCreateFlags |= android::bitmap::kBitmapCreateFlag_Premultiplied;
}
- return GraphicsJNI::createBitmap(env, heapAlloc.getStorageObjAndReset(), bitmapCreateFlags);
+ return android::bitmap::createBitmap(env, heapAlloc.getStorageObjAndReset(), bitmapCreateFlags);
}
static jint nativeGetHeight(JNIEnv* env, jobject, jlong brdHandle) {
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp
index 8cee814fa162..82b70fc683dc 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -157,12 +157,6 @@ static jclass gPointF_class;
static jfieldID gPointF_xFieldID;
static jfieldID gPointF_yFieldID;
-static jclass gBitmap_class;
-static jfieldID gBitmap_nativePtr;
-static jmethodID gBitmap_constructorMethodID;
-static jmethodID gBitmap_reinitMethodID;
-static jmethodID gBitmap_getAllocationByteCountMethodID;
-
static jclass gBitmapConfig_class;
static jfieldID gBitmapConfig_nativeInstanceID;
@@ -342,24 +336,15 @@ SkColorType GraphicsJNI::legacyBitmapConfigToColorType(jint legacyConfig) {
return static_cast<SkColorType>(gConfig2ColorType[legacyConfig]);
}
-android::Bitmap* GraphicsJNI::getBitmap(JNIEnv* env, jobject bitmap) {
- SkASSERT(env);
- SkASSERT(bitmap);
- SkASSERT(env->IsInstanceOf(bitmap, gBitmap_class));
- jlong bitmapHandle = env->GetLongField(bitmap, gBitmap_nativePtr);
- android::Bitmap* b = reinterpret_cast<android::Bitmap*>(bitmapHandle);
- SkASSERT(b);
- return b;
-}
-
void GraphicsJNI::getSkBitmap(JNIEnv* env, jobject bitmap, SkBitmap* outBitmap) {
- getBitmap(env, bitmap)->getSkBitmap(outBitmap);
+ android::bitmap::toPixelRef(env, bitmap)->getSkBitmap(outBitmap);
}
SkPixelRef* GraphicsJNI::refSkPixelRef(JNIEnv* env, jobject bitmap) {
- return getBitmap(env, bitmap)->refPixelRef();
+ SkPixelRef* pixelRef = android::bitmap::toPixelRef(env, bitmap);
+ pixelRef->ref();
+ return pixelRef;
}
-
SkColorType GraphicsJNI::getNativeBitmapColorType(JNIEnv* env, jobject jconfig) {
SkASSERT(env);
if (NULL == jconfig) {
@@ -394,50 +379,6 @@ SkRegion* GraphicsJNI::getNativeRegion(JNIEnv* env, jobject region)
///////////////////////////////////////////////////////////////////////////////////////////
-// Assert that bitmap's SkAlphaType is consistent with isPremultiplied.
-static void assert_premultiplied(const SkImageInfo& info, bool isPremultiplied) {
- // kOpaque_SkAlphaType and kIgnore_SkAlphaType mean that isPremultiplied is
- // irrelevant. This just tests to ensure that the SkAlphaType is not
- // opposite of isPremultiplied.
- if (isPremultiplied) {
- SkASSERT(info.alphaType() != kUnpremul_SkAlphaType);
- } else {
- SkASSERT(info.alphaType() != kPremul_SkAlphaType);
- }
-}
-
-jobject GraphicsJNI::createBitmap(JNIEnv* env, android::Bitmap* bitmap,
- int bitmapCreateFlags, jbyteArray ninePatchChunk, jobject ninePatchInsets,
- int density) {
- bool isMutable = bitmapCreateFlags & kBitmapCreateFlag_Mutable;
- bool isPremultiplied = bitmapCreateFlags & kBitmapCreateFlag_Premultiplied;
- // The caller needs to have already set the alpha type properly, so the
- // native SkBitmap stays in sync with the Java Bitmap.
- assert_premultiplied(bitmap->info(), isPremultiplied);
-
- jobject obj = env->NewObject(gBitmap_class, gBitmap_constructorMethodID,
- reinterpret_cast<jlong>(bitmap), bitmap->width(), bitmap->height(), density, isMutable,
- isPremultiplied, ninePatchChunk, ninePatchInsets);
- hasException(env); // For the side effect of logging.
- return obj;
-}
-
-void GraphicsJNI::reinitBitmap(JNIEnv* env, jobject javaBitmap, const SkImageInfo& info,
- bool isPremultiplied)
-{
- // The caller needs to have already set the alpha type properly, so the
- // native SkBitmap stays in sync with the Java Bitmap.
- assert_premultiplied(info, isPremultiplied);
-
- env->CallVoidMethod(javaBitmap, gBitmap_reinitMethodID,
- info.width(), info.height(), isPremultiplied);
-}
-
-int GraphicsJNI::getBitmapAllocationByteCount(JNIEnv* env, jobject javaBitmap)
-{
- return env->CallIntMethod(javaBitmap, gBitmap_getAllocationByteCountMethodID);
-}
-
jobject GraphicsJNI::createBitmapRegionDecoder(JNIEnv* env, SkBitmapRegionDecoder* bitmap)
{
SkASSERT(bitmap != NULL);
@@ -482,7 +423,7 @@ static bool computeAllocationSize(const SkBitmap& bitmap, size_t* size) {
return true;
}
-android::Bitmap* GraphicsJNI::allocateHeapPixelRef(SkBitmap* bitmap, SkColorTable* ctable) {
+android::PixelRef* GraphicsJNI::allocateHeapPixelRef(SkBitmap* bitmap, SkColorTable* ctable) {
const SkImageInfo& info = bitmap->info();
if (info.colorType() == kUnknown_SkColorType) {
LOG_ALWAYS_FATAL("unknown bitmap configuration");
@@ -503,7 +444,7 @@ android::Bitmap* GraphicsJNI::allocateHeapPixelRef(SkBitmap* bitmap, SkColorTabl
return nullptr;
}
- android::Bitmap* wrapper = new android::Bitmap(addr, size, info, rowBytes, ctable);
+ auto wrapper = new android::PixelRef(addr, size, info, rowBytes, ctable);
wrapper->getSkBitmap(bitmap);
// since we're already allocated, we lockPixels right away
// HeapAllocator behaves this way too
@@ -566,7 +507,7 @@ bool GraphicsJNI::allocatePixels(JNIEnv* env, SkBitmap* bitmap, SkColorTable* ct
return true;
}
-android::Bitmap* GraphicsJNI::allocateAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
+android::PixelRef* GraphicsJNI::allocateAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
SkColorTable* ctable) {
int fd;
@@ -603,7 +544,7 @@ android::Bitmap* GraphicsJNI::allocateAshmemPixelRef(JNIEnv* env, SkBitmap* bitm
return nullptr;
}
- android::Bitmap* wrapper = new android::Bitmap(addr, fd, size, info, rowBytes, ctable);
+ auto wrapper = new android::PixelRef(addr, fd, size, info, rowBytes, ctable);
wrapper->getSkBitmap(bitmap);
// since we're already allocated, we lockPixels right away
// HeapAllocator behaves this way too
@@ -612,7 +553,7 @@ android::Bitmap* GraphicsJNI::allocateAshmemPixelRef(JNIEnv* env, SkBitmap* bitm
return wrapper;
}
-android::Bitmap* GraphicsJNI::mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
+android::PixelRef* GraphicsJNI::mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
SkColorTable* ctable, int fd, void* addr, size_t size, bool readOnly) {
const SkImageInfo& info = bitmap->info();
if (info.colorType() == kUnknown_SkColorType) {
@@ -634,7 +575,7 @@ android::Bitmap* GraphicsJNI::mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
// attempting to compute our own.
const size_t rowBytes = bitmap->rowBytes();
- android::Bitmap* wrapper = new android::Bitmap(addr, fd, size, info, rowBytes, ctable);
+ auto wrapper = new android::PixelRef(addr, fd, size, info, rowBytes, ctable);
wrapper->getSkBitmap(bitmap);
if (readOnly) {
bitmap->pixelRef()->setImmutable();
@@ -646,25 +587,24 @@ android::Bitmap* GraphicsJNI::mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
return wrapper;
}
-///////////////////////////////////////////////////////////////////////////////
-
-HeapAllocator::HeapAllocator() {}
-
-HeapAllocator::~HeapAllocator() {
- if (mStorage) {
- mStorage->detachFromJava();
- }
+sk_sp<SkColorSpace> GraphicsJNI::defaultColorSpace() {
+#ifdef ANDROID_ENABLE_LINEAR_BLENDING
+ return SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named);
+#else
+ return nullptr;
+#endif
}
+///////////////////////////////////////////////////////////////////////////////
bool HeapAllocator::allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) {
- mStorage = GraphicsJNI::allocateHeapPixelRef(bitmap, ctable);
- return mStorage != nullptr;
+ mStorage.reset(GraphicsJNI::allocateHeapPixelRef(bitmap, ctable));
+ return !!mStorage;
}
////////////////////////////////////////////////////////////////////////////////
RecyclingClippingPixelAllocator::RecyclingClippingPixelAllocator(
- android::Bitmap* recycledBitmap, size_t recycledBytes)
+ android::PixelRef* recycledBitmap, size_t recycledBytes)
: mRecycledBitmap(recycledBitmap)
, mRecycledBytes(recycledBytes)
, mSkiaBitmap(nullptr)
@@ -707,7 +647,8 @@ bool RecyclingClippingPixelAllocator::allocPixelRef(SkBitmap* bitmap, SkColorTab
// skbug.com/4538: We also need to make sure that the rowBytes on the pixel ref
// match the rowBytes on the bitmap.
bitmap->setInfo(bitmap->info(), rowBytes);
- bitmap->setPixelRef(mRecycledBitmap->refPixelRef())->unref();
+ mRecycledBitmap->ref();
+ bitmap->setPixelRef(mRecycledBitmap)->unref();
// Make sure that the recycled bitmap has the correct alpha type.
mRecycledBitmap->setAlphaType(bitmap->alphaType());
@@ -734,7 +675,8 @@ bool RecyclingClippingPixelAllocator::allocPixelRef(SkBitmap* bitmap, SkColorTab
void RecyclingClippingPixelAllocator::copyIfNecessary() {
if (mNeedsCopy) {
- SkPixelRef* recycledPixels = mRecycledBitmap->refPixelRef();
+ mRecycledBitmap->ref();
+ SkPixelRef* recycledPixels = mRecycledBitmap;
void* dst = recycledPixels->pixels();
const size_t dstRowBytes = mRecycledBitmap->rowBytes();
const size_t bytesToCopy = std::min(mRecycledBitmap->info().minRowBytes(),
@@ -759,16 +701,10 @@ AshmemPixelAllocator::AshmemPixelAllocator(JNIEnv *env) {
"env->GetJavaVM failed");
}
-AshmemPixelAllocator::~AshmemPixelAllocator() {
- if (mStorage) {
- mStorage->detachFromJava();
- }
-}
-
bool AshmemPixelAllocator::allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) {
JNIEnv* env = vm2env(mJavaVM);
- mStorage = GraphicsJNI::allocateAshmemPixelRef(env, bitmap, ctable);
- return mStorage != nullptr;
+ mStorage.reset(GraphicsJNI::allocateAshmemPixelRef(env, bitmap, ctable));
+ return !!mStorage;
}
////////////////////////////////////////////////////////////////////////////////
@@ -813,11 +749,6 @@ int register_android_graphics_Graphics(JNIEnv* env)
gPointF_xFieldID = getFieldIDCheck(env, gPointF_class, "x", "F");
gPointF_yFieldID = getFieldIDCheck(env, gPointF_class, "y", "F");
- gBitmap_class = make_globalref(env, "android/graphics/Bitmap");
- gBitmap_nativePtr = getFieldIDCheck(env, gBitmap_class, "mNativePtr", "J");
- gBitmap_constructorMethodID = env->GetMethodID(gBitmap_class, "<init>", "(JIIIZZ[BLandroid/graphics/NinePatch$InsetStruct;)V");
- gBitmap_reinitMethodID = env->GetMethodID(gBitmap_class, "reinit", "(IIZ)V");
- gBitmap_getAllocationByteCountMethodID = env->GetMethodID(gBitmap_class, "getAllocationByteCount", "()I");
gBitmapRegionDecoder_class = make_globalref(env, "android/graphics/BitmapRegionDecoder");
gBitmapRegionDecoder_constructorMethodID = env->GetMethodID(gBitmapRegionDecoder_class, "<init>", "(J)V");
diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h
index 738ad54b715d..e5af52512abc 100644
--- a/core/jni/android/graphics/GraphicsJNI.h
+++ b/core/jni/android/graphics/GraphicsJNI.h
@@ -10,8 +10,10 @@
#include "SkMallocPixelRef.h"
#include "SkPoint.h"
#include "SkRect.h"
+#include "SkColorSpace.h"
#include <jni.h>
#include <hwui/Canvas.h>
+#include <hwui/PixelRef.h>
class SkBitmapRegionDecoder;
class SkCanvas;
@@ -23,12 +25,6 @@ struct Typeface;
class GraphicsJNI {
public:
- enum BitmapCreateFlags {
- kBitmapCreateFlag_None = 0x0,
- kBitmapCreateFlag_Mutable = 0x1,
- kBitmapCreateFlag_Premultiplied = 0x2,
- };
-
// returns true if an exception is set (and dumps it out to the Log)
static bool hasException(JNIEnv*);
@@ -51,7 +47,6 @@ public:
static void point_to_jpointf(const SkPoint& point, JNIEnv*, jobject jpointf);
static android::Canvas* getNativeCanvas(JNIEnv*, jobject canvas);
- static android::Bitmap* getBitmap(JNIEnv*, jobject bitmap);
static void getSkBitmap(JNIEnv*, jobject bitmap, SkBitmap* outBitmap);
static SkPixelRef* refSkPixelRef(JNIEnv*, jobject bitmap);
static SkRegion* getNativeRegion(JNIEnv*, jobject region);
@@ -73,32 +68,16 @@ public:
*/
static SkColorType getNativeBitmapColorType(JNIEnv*, jobject jconfig);
- /*
- * Create a java Bitmap object given the native bitmap
- * bitmap's SkAlphaType must already be in sync with bitmapCreateFlags.
- */
- static jobject createBitmap(JNIEnv* env, android::Bitmap* bitmap,
- int bitmapCreateFlags, jbyteArray ninePatchChunk = NULL,
- jobject ninePatchInsets = NULL, int density = -1);
-
- /** Reinitialize a bitmap. bitmap must already have its SkAlphaType set in
- sync with isPremultiplied
- */
- static void reinitBitmap(JNIEnv* env, jobject javaBitmap, const SkImageInfo& info,
- bool isPremultiplied);
-
- static int getBitmapAllocationByteCount(JNIEnv* env, jobject javaBitmap);
-
static jobject createRegion(JNIEnv* env, SkRegion* region);
static jobject createBitmapRegionDecoder(JNIEnv* env, SkBitmapRegionDecoder* bitmap);
- static android::Bitmap* allocateHeapPixelRef(SkBitmap* bitmap, SkColorTable* ctable);
+ static android::PixelRef* allocateHeapPixelRef(SkBitmap* bitmap, SkColorTable* ctable);
- static android::Bitmap* allocateAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
+ static android::PixelRef* allocateAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
SkColorTable* ctable);
- static android::Bitmap* mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
+ static android::PixelRef* mapAshmemPixelRef(JNIEnv* env, SkBitmap* bitmap,
SkColorTable* ctable, int fd, void* addr, size_t size, bool readOnly);
/**
@@ -116,27 +95,27 @@ public:
static bool SetPixels(JNIEnv* env, jintArray colors, int srcOffset,
int srcStride, int x, int y, int width, int height,
const SkBitmap& dstBitmap);
+
+ static sk_sp<SkColorSpace> defaultColorSpace();
};
class HeapAllocator : public SkBRDAllocator {
public:
- HeapAllocator();
- ~HeapAllocator();
+ HeapAllocator() { };
+ ~HeapAllocator() { };
virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) override;
/**
* Fetches the backing allocation object. Must be called!
*/
- android::Bitmap* getStorageObjAndReset() {
- android::Bitmap* result = mStorage;
- mStorage = NULL;
- return result;
+ android::PixelRef* getStorageObjAndReset() {
+ return mStorage.release();
};
SkCodec::ZeroInitialized zeroInit() const override { return SkCodec::kYes_ZeroInitialized; }
private:
- android::Bitmap* mStorage = nullptr;
+ sk_sp<android::PixelRef> mStorage;
};
/**
@@ -169,7 +148,7 @@ private:
class RecyclingClippingPixelAllocator : public SkBRDAllocator {
public:
- RecyclingClippingPixelAllocator(android::Bitmap* recycledBitmap,
+ RecyclingClippingPixelAllocator(android::PixelRef* recycledBitmap,
size_t recycledBytes);
~RecyclingClippingPixelAllocator();
@@ -194,7 +173,7 @@ public:
SkCodec::ZeroInitialized zeroInit() const override { return SkCodec::kNo_ZeroInitialized; }
private:
- android::Bitmap* mRecycledBitmap;
+ android::PixelRef* mRecycledBitmap;
const size_t mRecycledBytes;
SkBitmap* mSkiaBitmap;
bool mNeedsCopy;
@@ -203,17 +182,15 @@ private:
class AshmemPixelAllocator : public SkBitmap::Allocator {
public:
explicit AshmemPixelAllocator(JNIEnv* env);
- ~AshmemPixelAllocator();
+ ~AshmemPixelAllocator() { };
virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable);
- android::Bitmap* getStorageObjAndReset() {
- android::Bitmap* result = mStorage;
- mStorage = NULL;
- return result;
+ android::PixelRef* getStorageObjAndReset() {
+ return mStorage.release();
};
private:
JavaVM* mJavaVM;
- android::Bitmap* mStorage = nullptr;
+ sk_sp<android::PixelRef> mStorage;
};
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp
index a2bd2f842401..43f7ca5c1237 100644
--- a/core/jni/android_graphics_Canvas.cpp
+++ b/core/jni/android_graphics_Canvas.cpp
@@ -341,9 +341,8 @@ static void drawNinePatch(JNIEnv* env, jobject, jlong canvasHandle, jlong bitmap
jlong paintHandle, jint dstDensity, jint srcDensity) {
Canvas* canvas = get_canvas(canvasHandle);
- Bitmap* bitmap = reinterpret_cast<Bitmap*>(bitmapHandle);
SkBitmap skiaBitmap;
- bitmap->getSkBitmap(&skiaBitmap);
+ bitmap::toSkBitmap(bitmapHandle, &skiaBitmap);
const android::Res_png_9patch* chunk = reinterpret_cast<android::Res_png_9patch*>(chunkHandle);
const Paint* paint = reinterpret_cast<Paint*>(paintHandle);
@@ -443,9 +442,8 @@ static void drawBitmapArray(JNIEnv* env, jobject, jlong canvasHandle,
jboolean hasAlpha, jlong paintHandle) {
// Note: If hasAlpha is false, kRGB_565_SkColorType will be used, which will
// correct the alphaType to kOpaque_SkAlphaType.
- SkImageInfo info = SkImageInfo::Make(width, height,
- hasAlpha ? kN32_SkColorType : kRGB_565_SkColorType,
- kPremul_SkAlphaType);
+ SkImageInfo info = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType,
+ GraphicsJNI::defaultColorSpace());
SkBitmap bitmap;
bitmap.setInfo(info);
if (!GraphicsJNI::allocatePixels(env, &bitmap, NULL)) {
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index ba9facfd19cf..2b1353cb2d64 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -116,8 +116,6 @@ static stat_field_names stat_field_names[_NUM_CORE_HEAP] = {
jfieldID otherStats_field;
jfieldID hasSwappedOutPss_field;
-static bool memtrackLoaded;
-
struct stats_t {
int pss;
int swappablePss;
@@ -199,10 +197,6 @@ static int read_memtrack_memory(struct memtrack_proc* p, int pid,
*/
static int read_memtrack_memory(int pid, struct graphics_memory_pss* graphics_mem)
{
- if (!memtrackLoaded) {
- return -1;
- }
-
struct memtrack_proc* p = memtrack_proc_new();
if (p == NULL) {
ALOGW("failed to create memtrack_proc");
@@ -1095,14 +1089,6 @@ static const JNINativeMethod gMethods[] = {
int register_android_os_Debug(JNIEnv *env)
{
- int err = memtrack_init();
- if (err != 0) {
- memtrackLoaded = false;
- ALOGE("failed to load memtrack module: %d", err);
- } else {
- memtrackLoaded = true;
- }
-
jclass clazz = env->FindClass("android/os/Debug$MemoryInfo");
// Sanity check the number of other statistics expected in Java matches here.
diff --git a/core/jni/android_view_GraphicBuffer.cpp b/core/jni/android_view_GraphicBuffer.cpp
index 59c337b63f1d..17437318470d 100644
--- a/core/jni/android_view_GraphicBuffer.cpp
+++ b/core/jni/android_view_GraphicBuffer.cpp
@@ -182,7 +182,8 @@ static jboolean android_view_GraphicBuffer_lockCanvas(JNIEnv* env, jobject,
SkBitmap bitmap;
bitmap.setInfo(SkImageInfo::Make(buffer->getWidth(), buffer->getHeight(),
convertPixelFormat(buffer->getPixelFormat()),
- kPremul_SkAlphaType),
+ kPremul_SkAlphaType,
+ GraphicsJNI::defaultColorSpace()),
bytesCount);
if (buffer->getWidth() > 0 && buffer->getHeight() > 0) {
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index 3f2b924f225f..b6c81cf8738a 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -318,11 +318,11 @@ static jlong nativeLockCanvas(JNIEnv* env, jclass clazz,
return 0;
}
-
SkImageInfo info = SkImageInfo::Make(outBuffer.width, outBuffer.height,
convertPixelFormat(outBuffer.format),
- outBuffer.format == PIXEL_FORMAT_RGBX_8888 ?
- kOpaque_SkAlphaType : kPremul_SkAlphaType);
+ outBuffer.format == PIXEL_FORMAT_RGBX_8888
+ ? kOpaque_SkAlphaType : kPremul_SkAlphaType,
+ GraphicsJNI::defaultColorSpace());
SkBitmap bitmap;
ssize_t bpr = outBuffer.stride * bytesPerPixel(outBuffer.format);
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 73b3f52f078b..65f12ac1907a 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -175,7 +175,9 @@ static jobject nativeScreenshotBitmap(JNIEnv* env, jclass clazz,
}
SkImageInfo screenshotInfo = SkImageInfo::Make(screenshot->getWidth(),
screenshot->getHeight(),
- colorType, alphaType);
+ colorType,
+ alphaType,
+ GraphicsJNI::defaultColorSpace());
const size_t rowBytes =
screenshot->getStride() * android::bytesPerPixel(screenshot->getFormat());
@@ -184,14 +186,14 @@ static jobject nativeScreenshotBitmap(JNIEnv* env, jclass clazz,
return NULL;
}
- Bitmap* bitmap = new Bitmap(
+ auto pixelRef = new PixelRef(
(void*) screenshot->getPixels(), (void*) screenshot.get(), DeleteScreenshot,
screenshotInfo, rowBytes, nullptr);
screenshot.release();
- bitmap->peekAtPixelRef()->setImmutable();
+ pixelRef->setImmutable();
- return GraphicsJNI::createBitmap(env, bitmap,
- GraphicsJNI::kBitmapCreateFlag_Premultiplied, NULL);
+ return bitmap::createBitmap(env, pixelRef,
+ bitmap::kBitmapCreateFlag_Premultiplied, NULL);
}
static void nativeScreenshot(JNIEnv* env, jclass clazz, jobject displayTokenObj,
diff --git a/core/jni/android_view_TextureView.cpp b/core/jni/android_view_TextureView.cpp
index e185281dad8a..268aec57032d 100644
--- a/core/jni/android_view_TextureView.cpp
+++ b/core/jni/android_view_TextureView.cpp
@@ -90,7 +90,8 @@ static inline SkImageInfo convertPixelFormat(const ANativeWindow_Buffer& buffer)
default:
break;
}
- return SkImageInfo::Make(buffer.width, buffer.height, colorType, alphaType);
+ return SkImageInfo::Make(buffer.width, buffer.height, colorType, alphaType,
+ GraphicsJNI::defaultColorSpace());
}
/**
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp
index 309bb2f7b0b9..14dcb3febe6f 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -613,21 +613,6 @@ static jboolean android_view_ThreadedRenderer_supportsOpenGL(JNIEnv* env, jobjec
return atoi(prop) > 0 ? JNI_TRUE : JNI_FALSE;
}
-static void android_view_ThreadedRenderer_setAtlas(JNIEnv* env, jobject clazz,
- jlong proxyPtr, jobject graphicBuffer, jlongArray atlasMapArray) {
- sp<GraphicBuffer> buffer = graphicBufferForJavaObject(env, graphicBuffer);
- jsize len = env->GetArrayLength(atlasMapArray);
- if (len <= 0) {
- ALOGW("Failed to initialize atlas, invalid map length: %d", len);
- return;
- }
- int64_t* map = new int64_t[len];
- env->GetLongArrayRegion(atlasMapArray, 0, len, map);
-
- RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
- proxy->setTextureAtlas(buffer, map, len);
-}
-
static void android_view_ThreadedRenderer_setProcessStatsBuffer(JNIEnv* env, jobject clazz,
jlong proxyPtr, jint fd) {
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
@@ -955,7 +940,6 @@ const char* const kClassPathName = "android/view/ThreadedRenderer";
static const JNINativeMethod gMethods[] = {
{ "nSupportsOpenGL", "()Z", (void*) android_view_ThreadedRenderer_supportsOpenGL },
- { "nSetAtlas", "(JLandroid/view/GraphicBuffer;[J)V", (void*) android_view_ThreadedRenderer_setAtlas },
{ "nSetProcessStatsBuffer", "(JI)V", (void*) android_view_ThreadedRenderer_setProcessStatsBuffer },
{ "nGetRenderThreadTid", "(J)I", (void*) android_view_ThreadedRenderer_getRenderThreadTid },
{ "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode },
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index d4bef1729fa1..0942a24da117 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -149,6 +149,8 @@
<protected-broadcast
android:name="android.bluetooth.headset.action.VENDOR_SPECIFIC_HEADSET_EVENT" />
<protected-broadcast
+ android:name="android.bluetooth.headset.action.HF_INDICATORS_VALUE_CHANGED" />
+ <protected-broadcast
android:name="android.bluetooth.headsetclient.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
android:name="android.bluetooth.headsetclient.profile.action.AUDIO_STATE_CHANGED" />
diff --git a/core/res/res/layout-round-watch/alert_dialog_title_material.xml b/core/res/res/layout-round-watch/alert_dialog_title_material.xml
index 027991106c5a..7e71e4180341 100644
--- a/core/res/res/layout-round-watch/alert_dialog_title_material.xml
+++ b/core/res/res/layout-round-watch/alert_dialog_title_material.xml
@@ -24,6 +24,7 @@
android:maxHeight="24dp"
android:maxWidth="24dp"
android:layout_marginTop="12dp"
+ android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@null" />
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index d1a32157799a..d7ee50c45854 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -252,7 +252,7 @@
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"saata ja vaadata SMS-sõnumeid"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Mäluruum"</string>
- <string name="permgroupdesc_storage" msgid="637758554581589203">"juurde pääseda seadmesse salvestatud fotodele, meediale ja failidele"</string>
+ <string name="permgroupdesc_storage" msgid="637758554581589203">"juurde pääseda seadmesse salvestatud fotodele, meediasisule ja failidele"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"heli salvestamine"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kaamera"</string>
diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml
index da65093f3062..e7f3f0205f22 100644
--- a/core/res/res/values-eu-rES/strings.xml
+++ b/core/res/res/values-eu-rES/strings.xml
@@ -743,7 +743,7 @@
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Erabiltzaile-hautatzailea"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"Egoera"</string>
<string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Multimedia-kontrolak"</string>
+ <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Multimedia kontrolatzeko aukerak"</string>
<string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Widgetak berrantolatzen hasi da."</string>
<string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Widgetak berrantolatu dira."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widgeta ezabatu da."</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 6dfa50425683..09b55d9cdc1a 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -994,7 +994,7 @@
<string name="noApplications" msgid="2991814273936504689">"Aucune application ne peut effectuer cette action."</string>
<string name="aerr_application" msgid="250320989337856518">"<xliff:g id="APPLICATION">%1$s</xliff:g> a cessé de fonctionner."</string>
<string name="aerr_process" msgid="6201597323218674729">"Le processus <xliff:g id="PROCESS">%1$s</xliff:g> a cessé de fonctionner."</string>
- <string name="aerr_application_repeated" msgid="3146328699537439573">"<xliff:g id="APPLICATION">%1$s</xliff:g> ne cesse de s\'arrêter."</string>
+ <string name="aerr_application_repeated" msgid="3146328699537439573">"<xliff:g id="APPLICATION">%1$s</xliff:g> s\'arrête systématiquement"</string>
<string name="aerr_process_repeated" msgid="6235302956890402259">"Le processus \"<xliff:g id="PROCESS">%1$s</xliff:g>\" ne cesse de s\'arrêter."</string>
<string name="aerr_restart" msgid="7581308074153624475">"Rouvrir l\'application"</string>
<string name="aerr_report" msgid="5371800241488400617">"Envoyer des commentaires"</string>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index 83f899511a7c..7cdc9bb954e0 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -1058,8 +1058,8 @@
<string name="volume_icon_description_incall" msgid="8890073218154543397">"Զանգի ձայնի բարձրություն"</string>
<string name="volume_icon_description_media" msgid="4217311719665194215">"Մեդիա ձայնի բարձրություն"</string>
<string name="volume_icon_description_notification" msgid="7044986546477282274">"Ծանուցումների ձայնի ուժգնությունը"</string>
- <string name="ringtone_default" msgid="3789758980357696936">"Լռելյայն զանգերանգ"</string>
- <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Լռելյայն զանգերանգ (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"Կանխադրված զանգերանգ"</string>
+ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Կանխադրված զանգերանգ (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
<string name="ringtone_silent" msgid="7937634392408977062">"Ոչ մեկը"</string>
<string name="ringtone_picker_title" msgid="3515143939175119094">"Զանգերանգներ"</string>
<string name="ringtone_unknown" msgid="5477919988701784788">"Անհայտ զանգերանգ"</string>
diff --git a/core/res/res/values-mcc302-mnc220/config.xml b/core/res/res/values-mcc302-mnc220/config.xml
index d638b89d5c03..422f7c92648f 100644
--- a/core/res/res/values-mcc302-mnc220/config.xml
+++ b/core/res/res/values-mcc302-mnc220/config.xml
@@ -21,14 +21,6 @@
for different hardware and product builds. -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>302370</item>
- <item>302610</item>
- <item>302660</item>
- <item>302720</item>
- <item>302780</item>
- </string-array>
-
<integer name="config_mobile_mtu">1410</integer>
<!-- String containing the apn value for tethering. May be overriden by secure settings
diff --git a/core/res/res/values-mcc311-mnc480/config.xml b/core/res/res/values-mcc311-mnc480/config.xml
index 714b3123c708..439f1d6b56d6 100755
--- a/core/res/res/values-mcc311-mnc480/config.xml
+++ b/core/res/res/values-mcc311-mnc480/config.xml
@@ -48,9 +48,6 @@
provisioning, availability etc -->
<bool name="config_carrier_vt_available">true</bool>
- <!-- Flag specifying whether VoLTE availability is based on provisioning -->
- <bool name="config_carrier_volte_provisioned">true</bool>
-
<bool name="config_auto_attach_data_on_creation">false</bool>
<!-- Flag indicating whether strict threshold is used, or lenient threshold is used,
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 8e42bbc2bce2..13218b7f7218 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -237,7 +237,7 @@
<string name="global_action_voice_assist" msgid="7751191495200504480">"Spraakassistent"</string>
<string name="global_action_lockdown" msgid="8751542514724332873">"Nu vergrendelen"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string>
- <string name="notification_hidden_text" msgid="1135169301897151909">"Inhoud verborgen"</string>
+ <string name="notification_hidden_text" msgid="1135169301897151909">"Content verborgen"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Content verborgen op basis van beleid"</string>
<string name="safeMode" msgid="2788228061547930246">"Veilige modus"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-systeem"</string>
@@ -261,12 +261,12 @@
<string name="permgroupdesc_phone" msgid="6234224354060641055">"bellen en telefoontjes beheren"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Lichaamssensoren"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"toegang krijgen tot sensorgegevens over je vitale functies"</string>
- <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Inhoud van vensters ophalen"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"De inhoud inspecteren van een venster waarmee je interactie hebt."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Content van vensters ophalen"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"De content inspecteren van een venster waarmee je interactie hebt."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\'Verkennen via aanraking\' inschakelen"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Aangetikte items worden hardop benoemd en het scherm kan worden verkend door middel van gebaren."</string>
<string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Verbeterde internettoegankelijkheid inschakelen"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Er kunnen scripts worden geïnstalleerd om app-inhoud toegankelijker te maken."</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Er kunnen scripts worden geïnstalleerd om app-content toegankelijker te maken."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Tekst observeren die u typt"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Omvat persoonlijke gegevens zoals creditcardnummers en wachtwoorden."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Schermvergroting bedienen"</string>
@@ -296,9 +296,9 @@
<string name="permlab_sendSms" msgid="7544599214260982981">"sms\'jes verzenden en bekijken"</string>
<string name="permdesc_sendSms" msgid="7094729298204937667">"Hiermee kan de app sms-berichten verzenden. Dit kan tot onverwachte kosten leiden. Schadelijke apps kunnen u geld kosten doordat ze zonder je bevestiging berichten kunnen verzenden."</string>
<string name="permlab_readSms" msgid="8745086572213270480">"je tekstberichten (SMS of MMS) lezen"</string>
- <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Hiermee kan de app sms-berichten lezen die zijn opgeslagen op je tablet of simkaart. De app kan alle sms-berichten lezen, ongeacht inhoud of vertrouwelijkheid."</string>
- <string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Hiermee kan de app sms-berichten lezen die zijn opgeslagen op je tv of simkaart. De app kan alle sms-berichten lezen, ongeacht inhoud of vertrouwelijkheid."</string>
- <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Hiermee kan de app sms-berichten lezen die zijn opgeslagen op je telefoon of simkaart. De app kan alle sms-berichten lezen, ongeacht inhoud of vertrouwelijkheid."</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Hiermee kan de app sms-berichten lezen die zijn opgeslagen op je tablet of simkaart. De app kan alle sms-berichten lezen, ongeacht content of vertrouwelijkheid."</string>
+ <string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Hiermee kan de app sms-berichten lezen die zijn opgeslagen op je tv of simkaart. De app kan alle sms-berichten lezen, ongeacht content of vertrouwelijkheid."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Hiermee kan de app sms-berichten lezen die zijn opgeslagen op je telefoon of simkaart. De app kan alle sms-berichten lezen, ongeacht content of vertrouwelijkheid."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"tekstberichten (WAP) ontvangen"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Hiermee kan de app WAP-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verzonden, kan bijhouden of verwijderen zonder deze aan u weer te geven."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"actieve apps ophalen"</string>
@@ -460,12 +460,12 @@
<string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Hiermee kan een app de synchronisatie-instellingen aanpassen voor een account. Deze toestemming kan bijvoorbeeld worden gebruikt om synchronisatie van de app Personen in te schakelen voor een account."</string>
<string name="permlab_readSyncStats" msgid="7396577451360202448">"synchronisatiestatistieken lezen"</string>
<string name="permdesc_readSyncStats" msgid="1510143761757606156">"Hiermee kan een app de synchronisatiestatistieken voor een account lezen, inclusief de geschiedenis van synchronisatie-activiteiten en hoeveel gegevens zijn gesynchroniseerd."</string>
- <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"de inhoud van je USB-opslag lezen"</string>
- <string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"de inhoud van je SD-kaart lezen"</string>
- <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"De app toestaan de inhoud van je USB-opslag te lezen."</string>
- <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"De app toestaan de inhoud van je SD-kaart te lezen."</string>
- <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"de inhoud van je USB-opslag aanpassen of verwijderen"</string>
- <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"de inhoud van je SD-kaart aanpassen of verwijderen"</string>
+ <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"de content van je USB-opslag lezen"</string>
+ <string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"de content van je SD-kaart lezen"</string>
+ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"De app toestaan de content van je USB-opslag te lezen."</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"De app toestaan de content van je SD-kaart te lezen."</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"de content van je USB-opslag aanpassen of verwijderen"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"de content van je SD-kaart aanpassen of verwijderen"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Hiermee kan de app schrijven naar de USB-opslag."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Hiermee kan de app schrijven naar de SD-kaart."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP-oproepen plaatsen/ontvangen"</string>
@@ -1527,7 +1527,7 @@
<string name="mediasize_unknown_portrait" msgid="3088043641616409762">"Onbekend portret"</string>
<string name="mediasize_unknown_landscape" msgid="4876995327029361552">"Onbekend landschap"</string>
<string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Geannuleerd"</string>
- <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Fout bij schrijven van inhoud"</string>
+ <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Fout bij schrijven van content"</string>
<string name="reason_unknown" msgid="6048913880184628119">"onbekend"</string>
<string name="reason_service_unavailable" msgid="7824008732243903268">"Afdrukservice niet ingeschakeld"</string>
<string name="print_service_installed_title" msgid="2246317169444081628">"<xliff:g id="NAME">%s</xliff:g>-service geïnstalleerd"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index f0a25aa627c2..c3967e46c3e9 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3965,6 +3965,7 @@ i
</declare-styleable>
<declare-styleable name="ProgressBar">
+ <attr name="min" format="integer" />
<!-- Defines the maximum value the progress can take. -->
<attr name="max" format="integer" />
<!-- Defines the default progress value, between 0 and max. -->
@@ -7941,6 +7942,14 @@ i
<declare-styleable name="SeekBarPreference">
<attr name="layout" />
+ <!-- Attribute indicating whether the slider within this preference can be adjusted, that is
+ pressing left/right keys when this preference is focused will move the slider accordingly (e.g.
+ inline adjustable preferences). False, if the slider within the preference is read-only and
+ cannot be adjusted. By default, the seekbar is adjustable. -->
+ <attr name="adjustable" format="boolean" />
+ <!-- Flag indicating whether the TextView next to the seekbar that shows the current seekbar value will be
+ displayed. If true, the view is VISIBLE; if false, the view will be GONE. By default, this view is VISIBLE. -->
+ <attr name="showSeekBarValue" format="boolean" />
</declare-styleable>
<!-- Base attributes available to PreferenceFragment. -->
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 3d1acdf5f3a4..e8ae3ddbf33f 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2212,9 +2212,6 @@
provisioning, availability etc -->
<bool name="config_carrier_volte_available">false</bool>
- <!-- Flag specifying whether VoLTE availability is based on provisioning -->
- <bool name="config_carrier_volte_provisioned">false</bool>
-
<!-- Flag specifying whether VoLTE TTY is supported -->
<bool name="config_carrier_volte_tty_supported">true</bool>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 7bce3792e166..7999e7e48365 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2764,4 +2764,5 @@
<public-group type="id" first-id="0x01020041">
</public-group>
+ <public type="attr" name="min" />
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 019a5e86ca79..91f76f2d6097 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2219,7 +2219,6 @@
<java-symbol type="bool" name="imsServiceAllowTurnOff" />
<java-symbol type="bool" name="config_device_volte_available" />
<java-symbol type="bool" name="config_carrier_volte_available" />
- <java-symbol type="bool" name="config_carrier_volte_provisioned" />
<java-symbol type="bool" name="config_carrier_volte_tty_supported" />
<java-symbol type="bool" name="config_device_vt_available" />
<java-symbol type="bool" name="config_device_respects_hold_carrier_config" />
diff --git a/core/tests/coretests/src/android/util/LocalLogTest.java b/core/tests/coretests/src/android/util/LocalLogTest.java
new file mode 100644
index 000000000000..a63c8a084964
--- /dev/null
+++ b/core/tests/coretests/src/android/util/LocalLogTest.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.util;
+
+import junit.framework.TestCase;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+
+public class LocalLogTest extends TestCase {
+
+ public void testA() {
+ String[] lines = {
+ "foo",
+ "bar",
+ "baz"
+ };
+ String[] want = lines;
+ testcase(new LocalLog(10), lines, want);
+ }
+
+ public void testB() {
+ String[] lines = {
+ "foo",
+ "bar",
+ "baz"
+ };
+ String[] want = {};
+ testcase(new LocalLog(0), lines, want);
+ }
+
+ public void testC() {
+ String[] lines = {
+ "dropped",
+ "dropped",
+ "dropped",
+ "dropped",
+ "dropped",
+ "dropped",
+ "foo",
+ "bar",
+ "baz",
+ };
+ String[] want = {
+ "foo",
+ "bar",
+ "baz",
+ };
+ testcase(new LocalLog(3), lines, want);
+ }
+
+ void testcase(LocalLog logger, String[] input, String[] want) {
+ for (String l : input) {
+ logger.log(l);
+ }
+ verifyAllLines(want, dump(logger).split("\n"));
+ verifyAllLines(reverse(want), reverseDump(logger).split("\n"));
+ }
+
+ void verifyAllLines(String[] wantLines, String[] gotLines) {
+ for (int i = 0; i < wantLines.length; i++) {
+ String want = wantLines[i];
+ String got = gotLines[i];
+ String msg = String.format("%s did not contain %s", quote(got), quote(want));
+ assertTrue(msg, got.contains(want));
+ }
+ }
+
+ static String dump(LocalLog logger) {
+ StringWriter buffer = new StringWriter();
+ PrintWriter writer = new PrintWriter(buffer);
+ logger.dump(null, writer, new String[0]);
+ return buffer.toString();
+ }
+
+ static String reverseDump(LocalLog logger) {
+ StringWriter buffer = new StringWriter();
+ PrintWriter writer = new PrintWriter(buffer);
+ logger.reverseDump(null, writer, new String[0]);
+ return buffer.toString();
+ }
+
+ static String quote(String s) {
+ return '"' + s + '"';
+ }
+
+ static String[] reverse(String[] ary) {
+ List<String> ls = Arrays.asList(ary);
+ Collections.reverse(ls);
+ return ls.toArray(new String[ary.length]);
+ }
+}
diff --git a/docs/html/_redirects.yaml b/docs/html/_redirects.yaml
index 7200d4773517..6185dab16e22 100644
--- a/docs/html/_redirects.yaml
+++ b/docs/html/_redirects.yaml
@@ -289,6 +289,8 @@ redirects:
to: /design/patterns/app-structure.html
- from: /guide/practices/ui_guidelines/menu_design.html
to: /design/patterns/actionbar.html
+- from: /design/patterns/accessibility.html
+ to: https://material.google.com/usability/accessibility.html
- from: /design/get-started/ui-overview.html
to: /design/handhelds/index.html
- from: /design/building-blocks/buttons.html
diff --git a/docs/html/design/_book.yaml b/docs/html/design/_book.yaml
index 18b47194265f..8ffa9a4f2c87 100644
--- a/docs/html/design/_book.yaml
+++ b/docs/html/design/_book.yaml
@@ -117,8 +117,6 @@ toc:
path: /design/patterns/pure-android.html
- title: Compatibility
path: /design/patterns/compatibility.html
- - title: Accessibility
- path: /design/patterns/accessibility.html
- title: Help
path: /design/patterns/help.html
diff --git a/docs/html/design/patterns/accessibility.jd b/docs/html/design/patterns/accessibility.jd
deleted file mode 100644
index b910294292b3..000000000000
--- a/docs/html/design/patterns/accessibility.jd
+++ /dev/null
@@ -1,98 +0,0 @@
-page.title=Accessibility
-page.tags="accessibility","navigation","input"
-page.metaDescription=Design an app that's universally accessible to people with visual impairment, color deficiency, hearing loss, and limited dexterity.
-@jd:body
-
-<a class="notice-designers-material"
- href="http://www.google.com/design/spec/usability/accessibility.html">
- <div>
- <h3>Material Design</h3>
- <p>Accessibility<p>
- </div>
-</a>
-
-<a class="notice-developers" href="{@docRoot}training/accessibility/index.html">
- <div>
- <h3>Developer Docs</h3>
- <p>Implementing Accessibility</p>
- </div>
-</a>
-
-<p>One of Android's missions is to organize the world's information and make it universally accessible and useful. Accessibility is the measure of how successfully a product can be used by people with varying abilities. Our mission applies to all users-including people with disabilities such as visual impairment, color deficiency, hearing loss, and limited dexterity.</p>
-<p><a href="https://www.google.com/#hl=en&q=universal+design&fp=1">Universal design</a> is the practice of making products that are inherently accessible to all users, regardless of ability. The Android design patterns were created in accordance with universal design principles, and following them will help your app meet basic usability standards. Adhering to universal design and enabling Android's accessibility tools will make your app as accessible as possible.</p>
-<p>Robust support for accessibility will increase your app's user base. It may also be required for adoption by some organizations.</p>
-<p><a href="http://www.google.com/accessibility/">Learn more about Google and accessibility.</a></p>
-
-<h2 id="tools">Android's Accessibility Tools</h2>
-<p>Android includes several features that support access for users with visual impairments; they don't require drastic visual changes to your app.</p>
-
-<ul>
- <li><strong><a href="https://play.google.com/store/apps/details?id=com.google.android.marvin.talkback">TalkBack</a></strong> is a pre-installed screen reader service provided by Google. It uses spoken feedback to describe the results of actions such as launching an app, and events such as notifications.</li>
- <li><strong>Explore by Touch</strong> is a system feature that works with TalkBack, allowing you to touch your device's screen and hear what's under your finger via spoken feedback. This feature is helpful to users with low vision.</li>
- <li><strong>Accessibility settings</strong> let you modify your device's display and sound options, such as increasing the text size, changing the speed at which text is spoken, and more.</li>
-</ul>
-
-<p>Some users use hardware or software directional controllers (such as a D-pad, trackball, keyboard) to jump from selection to selection on a screen. They interact with the structure of your app in a linear fashion, similar to 4-way remote control navigation on a television.</p>
-
-<h2 id="tools">Guidelines</h2>
-<p>The Android design principle "I should always know where I am" is key for accessibility concerns. As a user navigates through an application, they need feedback and a mental model of where they are. All users benefit from a strong sense of information hierarchy and an architecture that makes sense. Most users benefit from visual and haptic feedback during their navigation (such as labels, colors, icons, touch feedback) Low vision users benefit from explicit verbal descriptions and large visuals with high contrast.</p>
-<p>As you design your app, think about the labels and notations needed to navigate your app by sound. When using Explore by Touch, the user enables an invisible but audible layer of structure in your application. Like any other aspect of app design, this structure can be simple, elegant, and robust. The following are Android's recommended guidelines to enable effective navigation for all users.</p>
-
-<h4>Make navigation intuitive</h4>
-<p>Design well-defined, clear task flows with minimal navigation steps, especially for major user tasks. Make sure those tasks are navigable via focus controls. </p>
-
-<h4>Use recommended touch target sizes</h4>
-<p>48 dp is the recommended touch target size for on screen elements. Read about <a href="{@docRoot}design/style/metrics-grids.html">Android Metrics and Grids</a> to learn about implementation strategies to help most of your users. For certain users, it may be appropriate to use larger touch targets. An example of this is educational apps, where buttons larger than the minimum recommendations are appropriate for children with developing motor skills and people with manual dexterity challenges.</p>
-
-
-<h4>Label visual UI elements meaningfully</h4>
-<p>In your wireframes, <a href="{@docRoot}guide/topics/ui/accessibility/apps.html#label-ui">label functional UI components</a> that have no visible text. Those components might be buttons, icons, tabs with icons, and icons with state (like stars). Developers can use the <code><a href="{@docRoot}guide/topics/ui/accessibility/apps.html#label-ui">contentDescription</a></code> attribute to set the label.</p>
-
-<div class ="cols">
- <div class="col-8">
- <img src="{@docRoot}design/media/accessibility_contentdesc.png">
- </div>
- <div class="col-5 with-callouts">
- <ol>
- <li class="value-1">group</li>
- <li class="value-2">all contacts</li>
- <li class="value-3">favorites</li>
- <li class="value-4">search</li>
- <li class="value-5">action overflow button</li>
- <li class="value-6">
- <em>when starred:</em> remove from favorites </br>
- <em>when not starred:</em> add to favorties</li>
- <li class="value-7">action overflow button</li>
- <li class="value-8">text message</li>
- </ol>
- </div>
-</div>
-
-<h4>Provide alternatives to affordances that time out</h4>
-<p>Your app may have icons or controls that disappear after a certain amount of time. For example, five seconds after starting a video, playback controls may fade from the screen.</p>
-
-<p>Due to the way that TalkBack works, those controls are not read out loud unless they are focused on. If they fade out from the screen quickly, your user may not even be aware that they are available. Therefore, make sure that you are not relying on timed out controls for high priority task flows. (This is a good universal design guideline too.) If the controls enable an important function, make sure that the user can turn on the controls again and/or their function is duplicated elsewhere. You can also change the behavior of your app when accessibility services are turned on. Your developer may be able to make sure that timed-out controls won't disappear.</p>
-
-<h4>Use standard framework controls or enable TalkBack for custom controls</h4>
-<p>Standard Android framework controls work automatically with accessibility services and have ContentDescriptions built in by default.</p>
-
-<p>An oft-overlooked system control is font size. Users can turn on a system-wide large font size in Settings; using the default system font size in your application will enable the user's preferences in your app as well. To enable system font size in your app, mark text and their associated containers to be measured in <a href="{@docRoot}guide/practices/screens_support.html#screen-independence">scale pixels</a>.</p>
-
-<p>Also, keep in mind that when users have large fonts enabled or speak a different language than you, their type might be larger than the space you've allotted for it. Read <a href="{@docRoot}design/style/devices-displays.html">Devices and Displays</a> and <a href="http://developer.android.com/guide/practices/screens_support.html">Supporting Multiple Screens</a> for design strategies.</p>
-
-<p>If you use custom controls, Android has the developer tools in place to allow adherence to the above guidelines and provide meaningful descriptions about the UI. Provide adequate notation on your wireframes and direct your developer to the <a href="{@docRoot}guide/topics/ui/accessibility/apps.html#custom-views">Custom Views</a> documentation.</p>
-
-<h4>Try it out yourself</h4>
-<p>Turn on the TalkBack service in <strong>Settings > Accessibility</strong> and navigate your application using directional controls or eyes-free navigation.</p>
-
-
-
-<h2>Checklist</h2>
-<ul>
- <li>Make navigation intuitive</li>
- <li>Use recommended touch target sizes</li>
- <li>Label visual UI elements meaningfully</li>
- <li>Provide alternatives to affordances that time out</li>
- <li>Use standard framework controls or enable TalkBack for custom controls</li>
- <li>Try it out yourself</li>
-</ul>
diff --git a/docs/html/distribute/stories/apps.jd b/docs/html/distribute/stories/apps.jd
index 76e9f5ac368b..47f4f7fc1a6a 100644
--- a/docs/html/distribute/stories/apps.jd
+++ b/docs/html/distribute/stories/apps.jd
@@ -25,8 +25,7 @@ page.metaDescription=How app developers are making use of localization, tablet f
<h2 class="norule">Articles</h2>
<div class="resource-widget resource-flow-layout col-16"
- data-query="type:distribute+tag:developerstory+tag:apps"
- data-sortOrder="-timestamp"
+ data-query="collection:distribute/stories/apps/docs"
data-cardSizes="6x6"
data-items-per-page="15"
data-initial-results="6"></div>
diff --git a/docs/html/distribute/stories/apps/condenast-shopping.jd b/docs/html/distribute/stories/apps/condenast-shopping.jd
new file mode 100644
index 000000000000..37c2b1f359f6
--- /dev/null
+++ b/docs/html/distribute/stories/apps/condenast-shopping.jd
@@ -0,0 +1,76 @@
+page.title=Glamour.de Connects Offline and Online Shopping Experiences with Google Play Billing
+page.metaDescription=Cond&eacute; Nast improves features on its Glamour app.
+page.tags="developerstory", "apps", "googleplay"
+page.image=images/cards/distribute/stories/glamour.png
+page.timestamp=null
+
+@jd:body
+
+
+<h3>Background</h3>
+
+<div class="figure">
+ <img src="{@docRoot}images/distribute/stories/glamour-icon.png" />
+</div>
+
+<p>
+ Glamour is one of the main
+ <a class="external-link"
+ href="https://play.google.com/store/apps/developer?id=Cond%C3%A9%20Nast%20Verlag%20GmbH&hl=en">
+ Cond&eacute; Nast</a> traditional brands. Every year, Glamour hosts a
+ successful shopping event called
+ <a class="external-link"
+ href="https://play.google.com/store/apps/details?id=de.glamour.android&e=-EnableAppDetailsPageRedesign">
+ <em>GLAMOUR Shopping-Week</em></a> in Germany, Austria, and Switzerland.
+ This event has always been print-focused, as readers received a shopping
+ card with the magazine to redeem discounts in selected shops, both offline
+ and online, for one week.
+</p>
+
+<p>
+ In March 2016, Glamour digitized this experience.
+</p>
+
+<h3>What they did</h3>
+
+<p>
+ To make the most of <em>GLAMOUR Shopping-Week</em>, Cond&eacute; Nast relaunched the
+ <a class="external-link"
+ href="https://play.google.com/store/apps/details?id=de.condenast.glamourde&e=-EnableAppDetailsPageRedesign">
+ GLAMOUR app</a> with a more appealing design and an improved user experience:
+<ul>
+ <li>The main features updated for the shopping week included a shop finder, online offers, and
+ a digital shopping card.</li>
+ <li>The current e-paper magazine was made available through the app and sold via Google Play
+ Billing.</li>
+ <li>They offered readers the in-app purchase of digital shopping cards and activation codes
+ through Google Play Billing. Readers can activate digital shopping cards via in-app
+ purchases or with the print shopping card activation code.</li>
+ <li>The online and offline shopping experience was also supported by online shopping discount
+ codes in the app or offline through the shop finder.</li>
+</ul>
+</p>
+
+<h3>Results</h3>
+
+<p>
+ The offline and online combination resulted in positive engagement both in terms of app
+ installs and sales:
+<ul>
+ <li>There were 130,000 new app downloads, and 100,000 users enabled location access to use
+ the shop finder.</li>
+ <li><strong>Sessions increased by 140%</strong> compared to previous weeks. Session length
+ doubled and <strong>the number of active users grew by five times</strong>.</li>
+ <li>12,000 in-app purchases were generated, increasing general e-paper sales by six times,
+ which resulted in <strong>an increase in total magazine circulation</strong>.</li>
+ <li>The digital shopping card was shown more than 200,000 times to redeem offers in shops.</li>
+</ul>
+</p>
+
+<h3>Get started</h3>
+
+<p>
+ Find out more about
+ <a href="https://developer.android.com/google/play/billing/billing_overview.html">
+ in-app purchases</a>.
+</p> \ No newline at end of file
diff --git a/docs/html/distribute/stories/apps/drupe-communications.jd b/docs/html/distribute/stories/apps/drupe-communications.jd
new file mode 100644
index 000000000000..4284077376aa
--- /dev/null
+++ b/docs/html/distribute/stories/apps/drupe-communications.jd
@@ -0,0 +1,98 @@
+page.title=drupe Launches Android First and Finds Global Success with Beta Testing
+page.metaDescription=Drupe uses beta testing to increase its global reach.
+page.tags="developerstory", "apps", "googleplay"
+page.image=images/cards/distribute/stories/drupe.jpg
+page.timestamp=1468901832
+
+@jd:body
+
+<div class="figure">
+ <img src="{@docRoot}images/distribute/stories/drupe-icon.png" />
+</div>
+
+<h3>
+ Background
+</h3>
+
+<p>
+ In 2015, <a class="external-link" href=
+ "https://play.google.com/store/apps/dev?id=8486231504544197967">
+ drupe mobile</a>, founded by Assaf Ziv and Barak Witkowski, launched the
+ <a class="external-link" href=
+ "https://play.google.com/store/apps/details?id=mobi.drupe.app">drupe app</a>
+ on Android first. With a unique, people-first approach, their communications
+ app is focused on reinventing the way people use their phone to do basic
+ actions. By constantly improving and expanding their cross-app
+ functionality, the app is used globally and was recently awarded Google
+ Play’s Editor’s Choice recognition.
+</p>
+
+<h3>
+ What they did
+</h3>
+
+<dl>
+ <dt><strong>Android openness</strong></dt>
+ <dd>From the start, drupe knew Android was their ideal mobile platform.
+ <em>"Thanks to the openness of the system, we can build a truly native
+ experience on Android. The real way to supply a people-centric experience
+ requires such an openness, not always existing on other platforms,"</em>
+ said Barak Witkowski, co-founder and CEO of drupe. Key to their innovative
+ approach, drupe uses the current context of the user to show them the
+ right contacts and actions to optimize the drupe experience.</dd>
+
+<div class="figure">
+ <img src="{@docRoot}images/distribute/stories/drupe-screenshot.png">
+</div>
+
+ <dt><strong>Beta testing</strong></dt>
+ <dd>They have a large community of 20,000 <em>druper</em> beta users on
+ Android, which has been critical to their success. To minimize risk and seek
+ feedback from valued users, the team built beta testing into their regular
+ development process. By having a dialogue with users worldwide, they are able
+ to gauge interest in new app versions, collect feature requests, and more.
+ This has helped the team achieve a 99.7% crash-free user ratio, as well
+ as verify new versions in real-life scenarios, on various devices, before
+ full launch.</dd>
+
+ <dt><strong>Going global</strong></dt>
+ <dd>With initial focus on building a high quality app, drupe then set out
+ to take advantage of Android’s global scale. Key to their international
+ growth, the app is now translated in 17 languages, and the store listing
+ page is available in 28 languages. This led to an increase in conversion
+ and retention rates. Additionally, when entering India, the team noticed
+ several user reviews requesting integration with a specific messaging app
+ widely used in the Indian market. Through a combination of this integration,
+ adding Hindi language translation, and other new features, drupe saw improved
+ performance. In six months, <strong>daily active users increased 300%, and
+ actions per average daily user increased 25% in the Indian
+ market</strong>.</dd>
+</dl>
+
+<h3>
+ Results
+</h3>
+
+<p>
+ Drupe’s focus on innovation and building a truly contextual and intuitive
+ app proved to be a model of success for attaining growth in both engagement
+ and new global reach. The team has continued to increase its relevance
+ through feedback loops and feature adoptions. <strong>This has led to 700%
+ growth in daily active users, and 550% growth in number of interactions
+ triggered via drupe</strong> in the past six months. The team is focused on
+ enhancing their recommendation engine to add even more contextual abilities
+ for their users while continuing to grow a successful business on Google
+ Play.
+</p>
+
+<h3>
+ Get started
+</h3>
+
+<p>
+ Learn more about
+ <a href="{@docRoot}distribute/engage/beta.html">beta testing</a>
+ and find out how to
+ <a href="{@docRoot}distribute/tools/localization-checklist.html">
+ localize your app</a> to create a high-quality experience for global users.
+</p> \ No newline at end of file
diff --git a/docs/html/distribute/stories/apps/economist-espresso.jd b/docs/html/distribute/stories/apps/economist-espresso.jd
new file mode 100644
index 000000000000..441393b4c9c8
--- /dev/null
+++ b/docs/html/distribute/stories/apps/economist-espresso.jd
@@ -0,0 +1,70 @@
+page.title=The Economist Espresso Increases Ratings by Launching Rating Requests
+page.metaDescription=The Economist improves ratings through user participation.
+page.tags="developerstory", "apps", "googleplay"
+page.image=images/cards/distribute/stories/economist-espresso.png
+page.timestamp=null
+
+@jd:body
+
+
+<h3>Background</h3>
+
+<div class="figure">
+ <img src="{@docRoot}images/distribute/stories/economist-espresso-icon.png" />
+</div>
+
+<p>
+ <a class="external-link" href="https://play.google.com/store/apps/details?id=uk.co.economist">
+ The Economist</a> launched the
+ <a class="external-link" href="https://play.google.com/store/apps/details?id=com.economist.darwin">
+ Espresso</a> app in November 2014. Espresso offers a morning briefing from the editors of The
+ Economist, six days a week. Delivered to readers’ mobile phones first thing in the morning, it
+ provides an overview of the global agenda for the coming day. It informs readers about what to
+ look out for in business, finance, and politics, and most importantly, what to make of it.
+</p>
+
+<p>
+ While the app received a lot of positive feedback from users on traditional customer support
+ channels, it received less feedback through direct app reviews. The Economist decided to run
+ tests to increase app reviews, resulting in improved ratings.
+
+<h3>What they did</h3>
+
+<p>
+ In April 2016, The Economist began testing to determine if asking for reviews would improve
+ user participation. They introduced rating requests into the app whereby users received a
+ notification asking them to rate the app while using it.
+</p>
+
+<p>
+ They prompted only users who had fully experienced the app, notifying those who had read more
+ than 25 articles after using it for more than a week. The prompt text was branded:
+ <em>Are you enjoying the Economist Espresso?</em> Upon clicking <em>yes</em>, the user was
+ taken to the Google Play store to review and rate the app.
+
+<h3>Results</h3>
+
+<p>
+ By capturing readers’ feedback in the Play store, The Economist was able to share the goodwill
+ and positive sentiment, <strong>further increasing its star rating and the number of app
+ installs</strong>.
+</p>
+
+<p>
+ After just one week following the launch of rating requests, The Espresso app's star rating
+ increased by 5%, with <strong>the average number of ratings received growing 40 times</strong>.
+</p>
+
+<h3>Get started</h3>
+
+<p>
+ Find out more about
+ <a class="external-link" href="https://support.google.com/googleplay/android-developer/answer/138230">
+ ratings and reviews</a>.
+</p>
+
+<p>
+ Get best practices for news publishers in
+ <a class="external-link" href="https://play.google.com/store/books/details/Google_Inc_The_News_Publisher_Playbook_for_Android?id=O7T3CwAAQBAJ&hl=en_GB&e=-EnableAppDetailsPageRedesign">
+ The News Publisher Playbook (for Android development)</a>.
+</p> \ No newline at end of file
diff --git a/docs/html/distribute/stories/apps/expressen-sports.jd b/docs/html/distribute/stories/apps/expressen-sports.jd
new file mode 100644
index 000000000000..b53cb627f943
--- /dev/null
+++ b/docs/html/distribute/stories/apps/expressen-sports.jd
@@ -0,0 +1,57 @@
+page.title=Expressen Sport App Improves Content Engagement with New Onboarding and Navigation
+page.metaDescription=Expressen enhances their Sport app.
+page.tags="developerstory", "apps", "googleplay"
+page.image=images/cards/distribute/stories/expressen-sport.png
+page.timestamp=null
+
+@jd:body
+
+
+<h3>Background</h3>
+
+<div class="figure">
+ <img src="{@docRoot}images/distribute/stories/expressen-icon.png" />
+</div>
+
+<p>
+ In January 2016,
+ <a class="external-link" href="https://play.google.com/store/apps/details?id=se.expressen.launcher&hl=en">
+ Expressen</a> launched a new sports app to reach sports enthusiasts directly
+ and to better optimize the app for sports content. They decided to analyze
+ users' behavior by looking at user paths in existing sports content,
+ combined with user research and testing various prototypes with real users.
+ They found that readers have different needs and preferences. For example,
+ some people like a specific sport, league, or player that others have no
+ interest in. Following these results, they integrated two main changes to
+ increase appeal to different types of readers.
+</p>
+
+<h3>What they did</h3>
+
+<p>
+ Expressen introduced a new onboarding flow that allows users to select the
+ type of push notifications they want to subscribe to. They also implemented
+ contextual navigation where the top header navigational links change,
+ showing the most relevant links to the reader at that moment in time. For
+ example, if you're reading about football, relevant links about that sport
+ are displayed.
+</p>
+
+<h3>Results</h3>
+
+<p>
+ After the new release of the app, <strong>results showed a higher opt-in
+ rate for push notifications in the Sport app (+16.9%)</strong> compared to
+ their main app, and content consumption increased +7% for page views and
+ +8.3% for video views.
+</p>
+
+<h3>Get started</h3>
+
+<p>
+ Learn more about the
+ <a href="https://developer.android.com/training/tv/playback/onboarding.html?hl=mk">
+ user onboarding flow</a> and find out how to
+ <a href="https://developer.android.com/design/patterns/navigation.html">
+ implement contextual navigation</a>.
+</p> \ No newline at end of file
diff --git a/docs/html/distribute/stories/apps/lifesum-health.jd b/docs/html/distribute/stories/apps/lifesum-health.jd
new file mode 100644
index 000000000000..2d3f20339535
--- /dev/null
+++ b/docs/html/distribute/stories/apps/lifesum-health.jd
@@ -0,0 +1,60 @@
+page.title=Lifesum Doubles Retention of Google Fit Users Following Integration on Android
+page.metaDescription=Lifesum integrates Google Fit into their app.
+page.tags="developerstory", "apps", "googleplay"
+page.image=images/cards/distribute/stories/lifesum.png
+page.timestamp=null
+
+@jd:body
+
+
+<h3>Background</h3>
+
+<div class="figure">
+ <img src="{@docRoot}images/distribute/stories/lifesum-icon.png" />
+</div>
+
+<p>
+ <a class="external-link" href="https://play.google.com/store/apps/details?id=com.sillens.shapeupclub">
+ Lifesum</a> is a health and fitness app from Sweden that was launched on Android in 2012.
+ Since then, the app has had more than five million installs on Android, and Lifesum collaborated
+ with Google for the launch of <a class="external-link" href="http://www.google.com/fit/">
+ Google Fit</a> in 2014. Google Fit soon became a key component of user activity outside the
+ app and has enabled Lifesum to scale partner integrations, accelerate development cycle, and
+ increase user satisfaction and engagement.
+</p>
+
+<h3>What they did</h3>
+
+<p>
+ Lifesum integrated Google Fit APIs to gather more insightful data, leading to a shift in
+ focus from simply gathering large amounts of user data to actual analysis of it. Google Fit has
+ also made direct integrations with partners much easier to scale and sometimes even
+ unnecessary, and has largely reduced app development time. Lifesum used findings from the
+ integration to launch their second app, <em>Movesum</em>, a step-counter app that imports steps
+ and calories and displays the information in a fun way. Thanks to the integration, the app was
+ developed in just two weeks.
+</p>
+
+<h3>Results</h3>
+
+<p>
+ Lifesum’s users now actively request integration with Google Fit, resulting in an improvement
+ in the app's ratings and reviews on the Google Play store. Engagement is also much higher for
+ Google Fit-connected users, whose <strong>retention rate is twice that of other Android
+ users</strong>. User retention on Android is 5-10% better than on other platforms.
+</p>
+
+<p>
+ Joakim Hammer, Android developer at Lifesum, says "Google Fit is our infrastructure for
+ integrating with other apps. It's great for the user as it increases the trustworthiness of the
+ data. Personally, it’s been a great experience leading the integration. The implementation was
+ fast and easy, and it has helped us with everything from product development and user
+ engagement, to partnerships."
+</p>
+
+<h3>Get started</h3>
+
+<p>
+ Find out more about <a class="external-link" href="https://developers.google.com/fit/">
+ The Google Fit SDK</a>.
+</p> \ No newline at end of file
diff --git a/docs/html/distribute/stories/apps/noom-health.jd b/docs/html/distribute/stories/apps/noom-health.jd
new file mode 100644
index 000000000000..c99eface8ae9
--- /dev/null
+++ b/docs/html/distribute/stories/apps/noom-health.jd
@@ -0,0 +1,115 @@
+page.title=Noom Grows International Revenue by 80% Through Localization on Google Play
+page.metaDescription=Noom increases revenue by localizing their app.
+page.tags="developerstory", "apps", "googleplay"
+page.image=images/cards/distribute/stories/noom.jpg
+page.timestamp=1468901832
+
+@jd:body
+
+<div class="figure">
+ <img src="{@docRoot}images/distribute/stories/noom-icon.png" />
+</div>
+
+<h3>
+ Background
+</h3>
+
+<p>
+ With a mission to help people live healthier lives,
+ <a class="external-link" href=
+ "https://play.google.com/store/apps/developer?id=Noom+Inc.">Noom</a> guides
+ their users through behavior change programs to create lifestyle habits and
+ target global health challenges. Available initially on Google Play,
+ Android first and Noom have achieved success expanding to international
+ markets, taking advantage of the broad reach of Android.
+</p>
+
+<h3>
+ What they did
+</h3>
+
+<p>
+ Launching first in the US, Noom created a series of programs tailored to
+ their users’ specific <a class="external-link" href=
+ "https://play.google.com/store/apps/details?id=com.wsl.noom">
+ health goals</a>. Key to their approach is offering a holistic solution,
+ including simple personalized tasks, progress tracking, meal feedback, and
+ support from both personal coaches and peers. The team has a strategic
+ approach to expanding their user base globally. Noom localized their app to
+ better connect with users in the following areas:
+</p>
+
+<ul>
+ <li><strong>Localized product</strong>
+ <ul style="list-style: none;">
+ <li>In addition to translating their app to five languages and their store
+ listing page to 11 languages, Noom conducted extensive analysis to
+ determine the right financial model tailored to each international
+ market. This included evaluation of their competitive landscape and
+ local health and wellness spending behavior, in addition to running
+ pricing experiments to determine the optimal offering between
+ subscriptions, IAPs, or a premium app.</li>
+ </ul>
+ </li>
+
+ <li><strong>Localized cuisines</strong>
+ <ul style="list-style: none;">
+ <li>When Noom started researching the Korean, Japanese, German, and Latin
+ American markets, they immediately focused on localizing their food
+ database. Using a combination of local food editors, existing food
+ databases, and user suggestions, their app now includes local cuisine
+ and popular packaged food brands, offering a simpler and more
+ comprehensive experience for users.</li>
+ </ul>
+ </li>
+
+ <li><strong>Localized coaches</strong>
+ <ul style="list-style: none;">
+ <li>Hiring local coaches not only removed language barriers, but also
+ reduced response times as they are located within the same time zone
+ as their users. Using various notification types, Noom has increased
+ user engagement by three to four times.</li>
+ </ul>
+ </li>
+</ul>
+
+<img src="{@docRoot}images/distribute/stories/noom-screenshot.png">
+ <p class="img-caption">
+ <strong>Figure 1.</strong> German Play Store listing page, Korean recipes,
+ and Japanese meal plan
+ </p>
+
+<h3>
+ Results
+</h3>
+
+<p>
+ <em>"Android's global focus and great localization tooling made the decision
+ to go global much easier. Localization to new markets has been a consistent
+ growth driver at Noom,"</em> said Artem Petakov, co-founder and President
+ at Noom.
+</p>
+
+<p>
+ Over the last three years, Noom’s localization efforts led to an <strong>80%
+ increase in international revenue growth on Android</strong>. In Japan
+ alone, <strong>revenue increased more than 480%</strong> during the same
+ time period. To identify future expansion opportunities, the team looks
+ towards countries with strong Android penetration and install growth
+ using the English product and plans to apply their localization methods to
+ achieve even greater success.
+</p>
+
+<h3>
+ Get started
+</h3>
+
+<p>
+ Learn more about <a class="external-link" href=
+ "https://material.google.com/patterns/notifications.html">Notifications</a>,
+ and find out about
+ <a href="{@docRoot}distribute/tools/localization-checklist.html">
+ app localization</a> and how to
+ <a href="{@docRoot}distribute/users/expand-to-new-markets.html">
+ Expand Into New Markets</a>.
+</p> \ No newline at end of file
diff --git a/docs/html/distribute/stories/games.jd b/docs/html/distribute/stories/games.jd
index daaac0d2acc8..cd31aaee7536 100644
--- a/docs/html/distribute/stories/games.jd
+++ b/docs/html/distribute/stories/games.jd
@@ -25,8 +25,7 @@ page.metaDescription=How game studios are using Google Play game services to del
<h2 class="norule">Articles</h2>
<div class="resource-widget resource-flow-layout col-16"
- data-query="type:distribute+tag:developerstory+tag:games"
- data-sortOrder="-timestamp"
+ data-query="collection:distribute/stories/games/docs"
data-cardSizes="6x6"
data-items-per-page="15"
data-initial-results="6"></div>
diff --git a/docs/html/distribute/stories/games/animoca-star-girl.jd b/docs/html/distribute/stories/games/animoca-star-girl.jd
new file mode 100644
index 000000000000..a38eed282aa3
--- /dev/null
+++ b/docs/html/distribute/stories/games/animoca-star-girl.jd
@@ -0,0 +1,89 @@
+page.title=Star Girl Increases In-App Purchases by 3.5X Through More Flexible Minimum Pricing on Google Play
+page.metaDescription=Star Girl Increases In-App Purchases by 3.5X.
+page.tags="developerstory", "games", "googleplay", "google play"
+page.image=images/cards/distribute/stories/animoca.jpg
+
+@jd:body
+
+<style type="text/css">
+ span.positive{
+ color:green;
+ font-size: 125%;
+ font-weight:bold;">
+ }
+ span.negative{
+ color:red;
+ font-size: 125%;
+ font-weight:bold;">
+ }
+</style>
+
+<h3>Background</h3>
+
+<div class="figure">
+ <img src="{@docRoot}images/distribute/stories/animoca-logo.png" />
+</div>
+
+<p>
+ <a class="external-link"
+ href="https://play.google.com/store/apps/details?id=com.animoca.google.starGirl&hl=en&e=-EnableAppDetailsPageRedesign">
+ Star Girl</a> is a series of SIM/role playing games published by <a class="external-link"
+ href="https://play.google.com/store/apps/dev?id=8271704752057011334&hl=en&e=-EnableAppDetailsPageRedesign">
+ Animoca</a>, a Hong Kong based game developer. The Star Girl series has more than 70 million
+ downloads and is localized in 18 languages. With a fast-growing user base in markets
+ including SEA, India, and Latin America, Animoca is exploring ways to effectively increase
+ monetization with a localized pricing strategy.
+</p>
+
+<h3>What they did</h3>
+
+<p>
+ Following the introduction of
+ <a class="external-link" href="http://android-developers.blogspot.com/2015/11/minimum-purchase-price-for-apps-and-in.html">
+ more flexible minimum pricing</a> in November 2015, Animoca took the opportunity to test
+ sachet pricing models across Thailand, Malaysia, Philippines, Indonesia, Brazil, and Russia:
+</p>
+
+<p>
+ <img src="{@docRoot}images/distribute/stories/animoca-flow.jpg" />
+</p>
+
+<p>
+ Animoca created a new sachet SKU, which offered 100 diamonds and 5,000 coins, at the new lower
+ minimum price available in these markets. The new SKU is approximately 60% cheaper than the
+ previous minimum-priced product and is accessible only through geo-targeted, in-game
+ banners in localized languages.
+</p>
+
+<h3>Results</h3>
+
+<div class="figure">
+ <img src="{@docRoot}images/distribute/stories/animoca-graph.jpg" />
+</div>
+
+<p>
+ The changes to minimum prices across these markets resulted in positive results, with the
+ number of transactions increasing 3.5X in the three months following launch.
+</p>
+
+<p>
+ Also, 90% of these transactions were first-time new buyers, half of which
+ followed up with purchases of regular packages. This helps to create a more sustainable revenue
+ impact, as described by Yusuf Goolamabbas, CTO of Animoca:
+</p>
+
+<p>
+ <em>“Sachet marketing has made IAPs more affordable to users in emerging markets. We are seeing
+ significant growth in new buyers as well as returning buyers and a positive impact on revenue in
+ emerging markets.”</em>
+</p>
+
+<h3>Get started</h3>
+
+<p>
+ <a class="external-link" href="https://support.google.com/googleplay/android-developer/answer/6334373?hl=en-GB">
+ Learn more about flexible minimum pricing</a> and
+ <a class="external-link" href="http://g.co/play/playbook-dac-writtenstudies-evergreen">
+ get the Playbook for Developers app</a> to grow your business and improve
+ monetization with Google Play.
+</p> \ No newline at end of file
diff --git a/docs/html/distribute/stories/games/happy-labs-experiment.jd b/docs/html/distribute/stories/games/happy-labs-experiment.jd
new file mode 100644
index 000000000000..e317e2106027
--- /dev/null
+++ b/docs/html/distribute/stories/games/happy-labs-experiment.jd
@@ -0,0 +1,105 @@
+page.title=Happy Labs Increases Installs by 32% on Google Play with Store Listing Experiments
+page.metaDescription=Happy Labs Increases Installs by 32%.
+page.tags="developerstory", "games", "googleplay", "google play"
+page.image=images/cards/distribute/stories/happylabs-logo.png
+
+@jd:body
+
+<style type="text/css">
+ span.positive{
+ color:green;
+ font-size: 125%;
+ font-weight:bold;">
+ }
+ span.negative{
+ color:red;
+ font-size: 125%;
+ font-weight:bold;">
+ }
+</style>
+
+<h3>Background</h3>
+
+<div class="figure">
+ <img src="{@docRoot}images/distribute/stories/happylabs-logo.png" />
+</div>
+
+<p>
+ <a class="external-link"
+ href="https://play.google.com/store/apps/dev?id=5211519071117278745&hl=en">
+ Happy Labs</a>, founded in 2012, is a successful game developer in Southeast Asia with 13
+ game titles and over 30 million downloads. Its flagship free-to-play virtual sim game,
+ <a class="external-link"
+ href="https://play.google.com/store/apps/dev?id=5211519071117278745&hl=en">Happy Pet Story</a>,
+ launched in February 2016 and is designed for female gamers of all ages.
+</p>
+
+<p>
+ Following the announcement of Store Listing Experiments in May, Happy Labs decided to test
+ variations of their game icon and screenshots to optimize their store listing.
+</p>
+
+<h3>What they did</h3>
+
+<p>
+ Happy Labs used the Store Listing Experiments feature in the Google Play Developer Console to
+ test three new variations of their new game icon. Encouraged by early results, they then
+ optimized the game screenshots displayed in their store listing.
+</p>
+
+<h3>Results</h3>
+
+<p>
+ The results showed that the new icon, <em>Sweet Bubbles</em> without a frame, outperformed
+ the initial <em>Mojo</em> icon and two other variants, with a 38.6% increase in installs:
+</p>
+
+<p>
+ <img src="{@docRoot}images/distribute/stories/happylabs-happy_pet_icon.png" />
+</p>
+
+<p>
+ Based on these findings, Happy Labs changed the Happy Pet Story icon to the new image globally
+ on Google Play.
+</p>
+
+<p>
+ Following the positive icon testing results, Happy Labs ran global store listing experiments
+ with a combination of screenshots from their store listing over a five week period. They then took
+ their best performing screenshots from the experiments and tested them across three specific
+ countries: Indonesia, Thailand, and Japan. The results showed an average increase of 19.87% in
+ installs.
+</p>
+
+<p>
+ Migrating from the original images to the variants shown in the following figure increased organic
+ installs in Thailand by 13.9%:
+</p>
+
+<p>
+ <img src="{@docRoot}images/distribute/stories/happylabs-variant.png" />
+</p>
+
+<p>
+ With the combination of both store listing experiments, Happy Pet Story saw an average increase of
+ 32% in month-on-month organic daily downloads globally, as described by Jeffrey Chee, CEO of Happy
+ Labs:
+</p>
+
+<p>
+ <em>“Store listing experiments have been an invaluable tool for us in optimizing our Play store
+ presence. I am really happy that we were able to get an uplift of 32% in organic installs with
+ minimal investment in terms of resources.”</em>
+</p>
+
+<h3>Get started</h3>
+
+<p>
+ Learn how to run
+ <a class="external-link" href="https://support.google.com/googleplay/android-developer/answer/6227309">
+ Store Listing Experiments</a> and read our best practices for
+ <a href="https://developer.android.com/distribute/users/experiments.html">
+ running successful experiments</a>. For more best practices on growing your business with Google
+ Play, <a class="external-link" href="http://g.co/play/playbook-dac-writtenstudies-evergreen">
+ get the Playbook for Developers app</a>.
+</p> \ No newline at end of file
diff --git a/docs/html/distribute/stories/games/playlab-puzzles.jd b/docs/html/distribute/stories/games/playlab-puzzles.jd
new file mode 100644
index 000000000000..ef1ccff9b035
--- /dev/null
+++ b/docs/html/distribute/stories/games/playlab-puzzles.jd
@@ -0,0 +1,87 @@
+page.title=Playlab Increases Juice Cubes Conversions by 25% with Store Listing Experiments
+page.metaDescription=Playlab uses store listing experiments to refresh their Juice Cubes icon.
+page.tags="developerstory", "apps", "googleplay"
+page.image=images/cards/distribute/stories/playlab.jpg
+page.timestamp=1468901832
+
+@jd:body
+
+<div class="figure">
+ <img src="{@docRoot}images/distribute/stories/playlab-icon.png" />
+</div>
+
+<h3>
+ Background
+</h3>
+
+<p>
+ <a class="external-link" href=
+ "https://play.google.com/store/apps/dev?id=9190927840679184784&e=-EnableAppDetailsPageRedesign">
+ Playlab</a> is a game developer and publisher based in Hong Kong, with
+ production studios in Bangkok and Manila. Playlab apps include
+ <a class="external-link" href=
+ "https://play.google.com/store/apps/details?id=ppl.unity.JuiceCubesBeta">
+ Juice Cubes</a>, <a class="external-link" href=
+ "https://play.google.com/store/apps/details?id=ppl.unity.junglecubes">
+ Jungle Cubes</a>, and <a class="external-link" href=
+ "https://play.google.com/store/apps/details?id=ppl.cocos2dx.ranchrun&hl=en">
+ Ranch Run</a>.
+
+ Released in 2013, <a class="external-link" href=
+ "https://play.google.com/store/apps/details?id=ppl.unity.JuiceCubesBeta">
+ Juice Cubes</a> is a strategy puzzle game with over 25 million downloads
+ worldwide and over 100,000 five-star reviews on Google Play. The game has
+ gained success in Southeast Asian markets such as Indonesia and Thailand,
+ and in Western markets such as the US, Australia, the UK, and Canada.
+</p>
+
+<h3>
+ What they did
+</h3>
+
+<p>
+ As part of Juice Cubes’ content update in April 2016, Playlab decided to
+ refresh its Play Store icon and test whether different icons could increase
+ their conversion rate.
+</p>
+
+<p>
+ Playlab used the <em>Store Listing Experiments</em> feature on the Google
+ Play Developer Console to test three variations of their new game icon.
+</p>
+
+<h3>
+ Results
+</h3>
+
+<p>
+ Within three days of running the store listing experiment, Playlab saw
+ positive results which led them to make an informed decision to change the
+ current icon to the best-performing version. Variant C outperformed the
+ initial control icon and the two other variants, with a <strong>25% increase
+ in installs</strong>. One month after applying the best-performing icon,
+ Juice Cubes continued to see a 25% increase in the number of conversions
+ from store visitors who made organic installs.
+</p>
+
+<img src="{@docRoot}images/distribute/stories/playlab-screenshot.png">
+
+<p>
+ <em>"Google Play Store Listing Experiments offer a fast, easy, and free way
+ to do A/B testing on an icon. The data provided after each test helped us
+ to make a decision really quickly. The best part is the team no longer needs
+ so many resources to decide which icon to use because we can let the
+ users decide."</em> said Jakob Lykkegaard, CEO and co-founder of Playlab.
+</p>
+
+<h3>
+ Get started
+</h3>
+
+<p>
+ Learn how to use <a class="external-link" href=
+ "https://support.google.com/googleplay/android-developer/answer/6227309">
+ A/B testing</a> and find out more about how to run
+ <a href="{@docRoot}distribute/users/experiments.html">
+ store listing experiments</a> on Google Play.
+</p> \ No newline at end of file
diff --git a/docs/html/distribute/stories/index.jd b/docs/html/distribute/stories/index.jd
index 17455358aeb1..7d84ce42bb24 100644
--- a/docs/html/distribute/stories/index.jd
+++ b/docs/html/distribute/stories/index.jd
@@ -21,11 +21,11 @@ page.metaDescription=Android developers, their apps, and their successes with An
<h3 class="norule">Articles</h3>
<div class="resource-widget resource-flow-layout col-16"
- data-query="type:distribute+tag:developerstory+tag:apps"
- data-sortOrder="-timestamp"
+ data-query="collection:distribute/stories/apps/docs"
data-cardSizes="6x6"
data-items-per-page="15"
data-initial-results="6"></div>
+
</div></section>
<section class="dac-section dac-small" id="latest-games"><div class="wrap">
@@ -43,9 +43,9 @@ page.metaDescription=Android developers, their apps, and their successes with An
<h3 class="norule">Articles</h3>
<div class="resource-widget resource-flow-layout col-16"
- data-query="type:distribute+tag:developerstory+tag:games"
- data-sortOrder="-timestamp"
+ data-query="collection:distribute/stories/games/docs"
data-cardSizes="6x6"
data-items-per-page="15"
data-initial-results="6"></div>
+
</div></section>
diff --git a/docs/html/google/play/billing/billing_admin.jd b/docs/html/google/play/billing/billing_admin.jd
index ad09f1f53b40..9936489d7d45 100644
--- a/docs/html/google/play/billing/billing_admin.jd
+++ b/docs/html/google/play/billing/billing_admin.jd
@@ -51,9 +51,9 @@ apps. You can sell an item using Google Play's in-app billing feature only if th
listed on an app's product list. Each app has its own product list; you cannot sell
items that appear on another app's product list.</p>
-<p>You can access an app's product list by opening the <strong>In-app Products</strong>
+<p>You can access an app's product list by opening the <em>In-app Products</em>
page for an app that is listed in your developer account. The link to the
-<strong>In-app Products</strong> page appears only if you have a Google payments merchant
+<em>In-app Products</em> page appears only if you have a Google payments merchant
account and the app's manifest includes the
<code>com.android.vending.BILLING</code> permission. For more information about this
permission, see <a href="{@docRoot}google/play/billing/billing_integrate.html#billing-permission">
@@ -73,7 +73,7 @@ uploading an unpublished draft version. This functionality is no longer
supported; instead, you must publish it to the alpha or beta distribution
channel. For more information, see <a
href="{@docRoot}google/play/billing/billing_testing.html#draft_apps">Draft Apps
-are No Longer Supported</a>.
+are No Longer Supported</a>.</p>
<p>In addition, an app package can have only one product list. If you create a product
list for an app, and you use the <a
@@ -82,8 +82,8 @@ more than one APK for that app, the product list applies to all APK versions tha
associated with the app listing. You cannot create individual product lists for each APK if
you are using the multiple APK feature.</p>
-<p>You can add items to a product list two ways: you can add items one at a time on the <strong>In-app
-Products</strong> page, or you can add a batch of items by importing the items from a
+<p>You can add items to a product list two ways: you can add items one at a time on the <em>In-app
+Products</em> page, or you can add a batch of items by importing the items from a
comma-separated values (CSV) file. Adding items one at a time is useful if your
app has only a few in-app items or you are adding only a few items to a
product list for testing purposes. The CSV file method is useful if your app has a large
@@ -100,14 +100,14 @@ number of in-app items.</p>
<ol>
<li><a href="http://play.google.com/apps/publish">Log in</a> to your publisher account.</li>
- <li>In the <strong>All applications</strong> panel, click on the
- app name, then open the <strong>In-app Products</strong> page.</li>
+ <li>In the <em>All applications</em> panel, click on the
+ app name, then open the <em>In-app Products</em> page.</li>
<li><p>Click <strong>Add new product</strong>. After you provide the product type and ID for the item you are
selling, click <strong>Continue</strong>.</p>
<dl>
<dt>Product Type</dt>
<dd>
- <p>The product type can be <strong>Managed product</strong> or <strong>Subscription</strong>. You cannot
+ <p>The product type can be "Managed product" or "Subscription." You cannot
change an item's product type after you create the item. For more information, see
<a href="#billing-purchase-type">Choosing a Product Type</a>.</p>
<p class="note"><strong>Note: </strong>For subscription items, you cannot change the
@@ -169,7 +169,7 @@ number of in-app items.</p>
<p>You can also change prices for other currencies manually, but you can do
this only if a currency is used in one of the target countries for your
app. You can specify target countries for your app on the
- <strong>Pricing &amp; Distribution</strong> page in the Google Play
+ <em>Pricing &amp; Distribution</em> page in the Google Play
Developer Console.</p>
</dd>
</dl>
@@ -187,266 +187,412 @@ number of in-app items.</p>
<h3 id="billing-bulk-add">Adding a batch of items to a product list</h3>
-<p>To add a batch of items to a product list using a CSV file, you first need to create your CSV
-file. The data values that you specify in the CSV file represent the same data values you specify
-manually through the In-app Products UI (see <a href="#billing-form-add">Adding items one at a time
-to a product list</a>).
+<p>To add a batch of items to a product list using a CSV file, you first need to
+create your CSV file. The data values that you specify in the CSV file represent
+the options that you set when adding in-app products to a product list using the
+Google Play Developer Console UI. For more information about using this UI, see
+<a href="#billing-form-add">Adding items one at a time to a product list</a>.
-<p>If you are importing and exporting CSV files with in-app products, keep
-country-specific pricing in mind. If you use auto-fill, you can provide a
-tax-exclusive default price, and tax-inclusive prices will be auto-filled. If you
-do not use auto-fill, prices you provide must include tax.</p>
+<p class="note"><strong>Note:</strong> Batch upload of in-app product lists
+containing subscriptions is not supported. Also, when updating existing items in
+a batch upload, you cannot include changes to in-app products that are linked to
+a <a href="#pricing-template">pricing template</a>.</p>
-<p class="note"><strong>Note:</strong> Batch upload of product lists containing
-subscriptions is not supported. Also, when updating existing items in a batch
-upload, you cannot include changes to in-app products that are linked to a
-<a href="#pricing-template">pricing template</a>.</p>
-
-<p>To import the items that are specified in your CSV file, do the following:</p>
+<p>To import the in-app products that are specified in your CSV file, do the
+following:</p>
<ol>
- <li><a href="http://play.google.com/apps/publish">Log in</a> to your publisher account.</li>
- <li>In the <strong>All applications</strong> panel, select the app
- name, then open the <strong>In-app Products</strong> page.</li>
- <li>On the In-app Products List page, click <strong>Import/Export</strong>
- &gt; <strong>Import in-app products from CSV file</strong>, then select your
- CSV file.
- <p>The CSV file must be on your local computer or on a local disk that is connected to your
- computer.</p>
- </li>
- <li>Select the <strong>Overwrite</strong> checkbox if you want to overwrite existing items in
- your product list.
- <p>This option overwrites values of existing items only if the value of the <em>product_id</em>
- in the CSV file matches the In-app Product ID for an existing item in the product list.
- Overwriting doesn't delete items that are on a product list but not present in the CSV
- file.</p>
+ <li>
+ <a href="http://play.google.com/apps/publish">Log in</a> to your
+ publisher account.
+ </li>
+ <li>In the <em>All applications</em> panel, select the app
+ name, then open the <em>In-app Products</em> page.</li>
+ <li>
+ <p>On the <em>In-app Products</em> page, click
+ <strong>Import/Export</strong> &gt; <strong>Import in-app products from CSV
+ file</strong> to open the <em>Import In-app Products</em> dialog.</p>
+ </li>
+ <li>
+ <p>
+ If you want to overwrite existing in-app products in your product list
+ during the import process, select the <strong>Overwrite existing
+ products</strong> checkbox.
+ </p>
+ <p>
+ This option overwrites values of existing items only if the value of the
+ <code>Product ID</code> in the CSV file matches the in-app product ID for
+ an existing in-app product in the product list. The overwriting process
+ doesn't delete in-app products that exist in a product list but aren't
+ included in the CSV file
+ </p>
+ <p class="note"><strong>Note: </strong>If you choose not to overwrite
+ existing items, the <code>Product ID</code> given to each item in the CSV
+ file must be different from any of the <code>Product ID</code> values
+ assigned to existing in-app products.
+ </p>
+ </li>
+ <li>
+ Select <strong>Browse files</strong>, then choose the CSV file that contains
+ the items you want to import. The CSV file must be stored locally.
</li>
</ol>
-<p>You can also export an existing product list to a CSV file by clicking <strong>Export to CSV
-</strong> on the In-app Product List page. This is useful if you have manually added items to
-a product list and you want to start managing the product list through a CSV file.</p>
+<p>
+ You can also export an existing product list to a CSV file by clicking
+ <strong>Import/Export</strong> &gt; <strong>Export in-app products to CSV file
+ </strong> on the <em>In-app Products page</em>. This is useful if you have
+ used the UI to add in-app products to your app but you want to start managing
+ the product list through a CSV file instead.
+</p>
<h4 id="billing-bulk-format">Formatting batches of items</h4>
-<p>The CSV file uses commas (,) and semicolons (;) to separate data values.
-Commas are used to separate primary data values, and semicolons are used to
-separate subvalues. For example, the syntax for the CSV file is as follows:</p>
+<p>
+ The CSV file uses commas (<code>,</code>) and semicolons (<code>;</code>) to
+ separate data values. Commas are used to separate primary data values, and
+ semicolons are used to separate subvalues. Each item must appear entirely on a
+ single line within the CSV file.
+</p>
+<p>
+ When creating a CSV file that represents a list of items, you must specify the
+ CSV syntax on the first row, followed by the items themselves on subsequent
+ rows, as shown in the following example:
+</p>
+
+<pre class="no-pretty-print">
+Product ID,Published State,Purchase Type,Auto Translate,Locale; Title; Description,Auto Fill Prices,Price,Pricing Template ID
+basic_sleeping_potion,published,managed_by_android,false,en_US; Basic Sleeping Potion; Puts small creatures to sleep.; es_ES; Poción básica de dormir; Causa las criaturas pequeñas ir a dormir.,false,,4637138456024710495
+standard_sleeping_potion,published,managed_by_android,false,en_US; Standard Sleeping Potion; Puts all creatures to sleep for 2 minutes.,true, 1990000,
+invisibility_potion,published,managed_by_android,false,en_US; Invisibility Potion; Invisible to all enemies for 5 minutes.,false, US; 1990000; BR; 6990000; RU; 129000000; IN; 130000000; ID; 27000000000; MX; 37000000;
+</pre>
-<p>"<em>product_id</em>","<em>publish_state</em>","<em>purchase_type</em>","<em>autotranslate</em>
-","<em>locale</em>; <em>title</em>; <em>description</em>","<em>autofill</em>","<em>country</em>;
-<em>price</em>", "<em>pricing_template_id</em>"
+<p>
+ This example contains details for three items, each of which represents an
+ in-app product:
</p>
+<ul>
+ <li>
+ The first item defines a title and description for the <code>en_US</code>
+ and <code>es_ES</code> locales. A pricing template defines the item's
+ price.
+ </li>
+ <li>
+ The second item doesn't use a pricing template. Instead, it specifies a
+ price for the default country (US). The Google Play Developer Console
+ uses current exchange rates and locally relevant pricing patterns to
+ automatically set the prices in all other countries where the app is
+ distributed.
+ </li>
+ <li>
+ The third item also doesn't use a pricing template. The item's price is
+ specified manually for each country where the app is distributed.
+ </li>
+</ul>
-<p>Descriptions and usage details are provided below.</p>
+<p>
+ Each row in a CSV file can contain the following values, though at least one
+ of these values is undefined in each row:
+</p>
<dl>
- <dt>product_id</dt>
+ <dt><code>Product ID</code></dt>
<dd>
- This is equivalent to the In-app Product ID setting in the In-app Products UI. If you specify
- a <em>product_id</em> that already exists in a product list, and you choose to overwrite
- the product list while importing the CSV file, the data for the existing item is overwritten with
- the values specified in the CSV file. The overwrite feature does not delete items that are on a
- product list but not present in the CSV file.
+ <p>
+ Setting this value in the CSV file has the same effect as entering a
+ <em>Product ID</em> when creating a new in-app product.
+ </p>
+ <p>
+ If you specify a <code>Product ID</code> assigned to an in-app product that already
+ exists in a product list, and you've checked the <strong>Overwrite
+ existing products</strong> checkbox in the <em>Import In-app Products</em>
+ dialog, the data for the existing in-app product is overwritten with the
+ values that you specify in the CSV file.
+ </p>
</dd>
- <dt>publish_state</dt>
+ <dt><code>Publish State</code></dt>
<dd>
- This is equivalent to the Publishing State setting in the In-app Products UI. Can be <code>
- published</code> or <code>unpublished</code>.
+ <p>
+ This value must be set to <code>published</code>
+ or <code>unpublished</code>.
+ </p>
+ <p>
+ Setting this value to <code>published</code> has the same effect as
+ navigating to an item's <em>Managed Product Details</em> page and choosing
+ <strong>Active</strong> in the drop-down list next to the in-app product's
+ title and product ID. Setting the value to <code>unpublished</code>
+ has the same effect as choosing <strong>Inactive</strong> in the same
+ drop-down list.
+ </p>
</dd>
- <dt>purchase_type</dt>
+ <dt><code>Purchase Type</code></dt>
<dd>
- This is equivalent to the Product Type setting in the In-app Products UI. Can be <code>
- managed_by_android</code>, which is equivalent to <strong>Managed per user account
- </strong> in the In-app Products UI, or <code>managed_by_publisher</code>, which is equivalent
- to <strong>Unmanaged</strong> in the In-app Products UI.
+ <p>
+ This value must be set to <code>managed_by_android</code> because batch
+ upload of product lists containing subscriptions is not supported.
+ </p>
+ <p>
+ Setting this value to <code>managed_by_android</code> has the same effect
+ as selecting <strong>Managed product</strong> in the <em>Add New
+ Product</em> dialog when creating an in-app product.
+ </p>
</dd>
- <dt>autotranslate</dt>
+ <dt><code>Auto Translate</code></dt>
<dd>
- This is equivalent to selecting the <strong>Fill fields with auto translation</strong>
- checkbox in the In-app Products UI. Can be <code>true</code> or <code>false</code>.
+ <p>
+ This value must be set to <code>false</code> because auto-translation of
+ in-app product details isn't supported.
+ </p>
+ <p>
+ If you want to provide translations of an in-app product's title and
+ description, you need to specify these translations explicitly within the
+ <code>Locale</code> value.
+ </p>
</dd>
- <dt>locale</dt>
+ <dt><code>Locale</code>, <code>Title</code>, and <code>Description</code></dt>
<dd>
- <p>This is equivalent to the Language setting in the In-app Products UI. You must have an entry
- for the default locale. The default locale must be the first entry in the list of
- locales, and it must include a <em>title</em> and <em>description</em>. If you want to provide
- translated versions of the <em>title</em> and <em>description</em> in addition to the default,
- you must use the following syntax rules:</p>
- <ul>
+ <p>
+ If you include only one locale for an item, you must specify your app's
+ default locale and the item's default title and description:
+ </p>
+
+<pre class="no-pretty-print">
+<var>app_default_locale</var>; <var>item_default_title</var>; <var>item_default_description</var>;
+</pre>
+
+ <p>
+ Setting these values has the same effect as performing the following
+ sequence of actions:
+ </p>
+ <ol>
<li>
- <p>If <em>autotranslate</em> is <code>true</code>, you must specify the default locale,
- default title, default description, and other locales using the following format:</p>
- <p>"true,"<em>default_locale</em>; <em>default_locale_title</em>;
- <em>default_locale_description</em>; <em>locale_2</em>; <em>locale_3</em>, ..."</p>
+ Choosing a default language when you add a new app to your
+ publisher account.
</li>
<li>
- <p>If <em>autotranslate</em> is <code>false</code>, you must specify the default locale,
- default title, and default description as well as the translated titles and descriptions using
- the following format:</p>
- <p>"false,"<em>default_locale</em>; <em>default_locale_title</em>;
- <em>default_locale_description</em>; <em>locale_2</em>; <em>locale_2_title</em>;
- <em>local_2_description</em>; <em>locale_3</em>; <em>locale_3_title</em>;
- <em>locale_3_description</em>; ..."</p>
+ Navigating to an in-app product's <em>Managed Product Details</em> page.
</li>
- </ul>
- <p>See table 1 for a list of the language codes you can use with the <em>locale</em> field.</p>
- </dd>
- <dt>title</dt>
- <dd>
- This is equivalent to the Title setting in the In-app Products UI. If the <em>title</em>
- contains a semicolon, it must be escaped with a backslash (for example, <code>\;</code>). Also, a backslash
- must be escaped with a backslash (for example, <code>\\</code>).
- </dd>
- <dt>description</dt>
- <dd>
- This is equivalent to the Description in the In-app Products UI. If the <em>description</em>
- contains a semicolon, it must be escaped with a backslash (for example, <code>\;</code>). Also, a backslash
- must be escaped with a backslash (for example, <code>\\</code>).
+ <li>
+ Specifying the in-app product's default title and description.
+ </li>
+ </ol>
+ <p>
+ When setting the <code>Locale</code> value, you can use any of the
+ language codes that appear within the <em>Add Your Own Translations</em>
+ dialog. You can access this dialog by navigating to an in-app product's
+ <em>Managed Product Details</em> page and clicking <strong>Add
+ translations</strong> or <strong>Manage translations</strong>.
+ </p>
+ <p class="note">
+ <strong>Note: </strong>When specifying the <code>Title</code> and
+ <code>Description</code> values, use backslashes to escape the semicolon
+ (<code>\;</code>) and backslash (<code>\\</code>) characters.
+ </p>
+ <p>
+ If you want to include translated versions of the item's title and
+ description, you must list the default locale, title, and description,
+ followed by the locales, titles, and descriptions for each translation.
+ In the following example, the in-app product uses <code>en_US</code>
+ (United States English) as the default locale and <code>es_ES</code>
+ (Spain Spanish) as a translation:
+ </p>
+<pre class="no-pretty-print">
+en_US; Invisibility Cloak; Makes you invisible.; es_ES; Capote Invisible; Se vuelven invisible.
+</pre>
+ <p class="note">
+ <strong>Note: </strong>An app contains a single default language, but each
+ in-app product maintains its own list of translations. Therefore, although
+ the first locale in each item's <code>Locale</code> value must be the same
+ throughout the CSV file, the other locales can differ from one item to
+ another.
+ </p>
+ <p>
+ Providing values for multiple translations has the same effect as
+ performing the following sequence of actions:
+ </p>
+ <ol>
+ <li>
+ Navigating to an in-app product's <em>Managed Product Details</em> page.
+ </li>
+ <li>
+ Clicking <strong>Add translations</strong>.
+ </li>
+ <li>
+ Selecting the languages for the translations and clicking
+ <strong>Add</strong>.
+ </li>
+ <li>
+ Choosing one of the languages you added in the previous step.
+ </li>
+ <li>
+ Specifying a new title and description, which serve as translations into
+ the selected language.
+ </li>
+ <li>
+ Repeating steps 4 and 5 to add translations into all other non-default
+ languages.
+ </li>
+ </ol>
</dd>
- <dt>autofill</dt>
+ <dt><code>Auto Fill Prices</code>, <code>Country</code>, and
+ <code>Price</code></dt>
<dd>
- <p>This is equivalent to clicking <strong>Auto Fill</strong> in the In-app Products UI. Can be
- <code>true</code> or <code>false</code>. The syntax for specifying the <em>country</em>
- and <em>price</em> varies depending on which <em>autofill</em> setting you use:</p>
- <ul>
+ <p>
+ You can set <code>Auto Fill Prices</code> to <code>true</code> or
+ <code>false</code>.
+ If an in-app product uses a <a href="#pricing-template">pricing
+ template</a>, you should set <code>Auto Fill Prices</code> to
+ <code>false</code>, and you shouldn't set a value for the
+ <code>Price</code>.
+ </p>
+ <p class="note">
+ <strong>Note: </strong>When you specify an item's price in a CSV file, you
+ provide a price in <em>micro-units</em>, where 1,000,000 micro-units is
+ equivalent to 1 unit of real currency.
+ </p>
+ <p>
+ The following sections describe how the value of
+ <code>Auto Fill Prices</code> affects the syntax and meaning of the
+ <code>Country</code> and <code>Price</code> values.
+ </p>
+ <h5>Using auto-filled prices</h5>
+ <p>
+ If you set <code>Auto Fill Prices</code> to <code>true</code>, you specify
+ only the item's default price; you don't include a <code>Country</code>
+ value. Setting <code>Auto Fill Prices</code> to <code>true</code> has the
+ same effect as performing the following sequence of actions:
+ </p>
+ <ol>
+ <li>
+ Navigating to an in-app product's <em>Managed Product Details</em> page.
+ </li>
+ <li>
+ Selecting <strong>Edit</strong> in the <em>Price</em> section.
+ </li>
+ <li>
+ Entering a default, tax-exclusive price. Auto-filled prices include tax.
+ </li>
+ <li>
+ Clicking the checkbox next to <em>COUNTRY</em> in the <em>Edit Local
+ Prices</em> dialog that appears.
+ </li>
<li>
- <p>If <em>autofill</em> is set to <code>true</code>, you need to specify only the default
- price in your home currency, and you must use this syntax:</p>
- <p>"true","<em>default_price_in_home_currency</em>"
+ Selecting <strong>Refresh exchange rates</strong>.
</li>
<li>
- <p>If <em>autofill</em> is set to <code>false</code>, you need to either specify the <em>pricing_template_id</em>
- that is linked to the in-app product or specify a <em>country</em> and a <em>price</em> for each currency.
- If you choose to specify countries and prices, you must use the following syntax:</p>
- <p>"false", "<em>home_country</em>; <em>default_price_in_home_currency</em>; <em>country_2</em>;
- <em>country_2_price</em>; <em>country_3</em>; <em>country_3_price</em>; ..."</p>
+ Selecting <strong>Apply</strong>.
</li>
+ </ol>
+ <p>
+ For example, under the following conditions:
+ </p>
+ <ul>
+ <li>Your app's default locale is <code>en_US</code>.</li>
+ <li>An in-app product's default, tax-exclusive price is $1.99.</li>
+ <li>You want the prices for other countries auto-filled.</li>
</ul>
- <p class="note"><strong>Note: </strong>If you use an <em>autofill</em> value of <code>false</code>
- and set country prices manually, you must incorporate country-specific
- pricing patterns, including tax rates, into the prices you provide.</p>
- </dd>
- <dt>country</dt>
- <dd>
- The country for which you are specifying a price. You can only list countries that your
- app is targeting. The country codes are two-letter uppercase
- ISO country codes (such as "US"), as defined by
- <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO 3166-2</a>.
- </dd>
- <dt>price</dt>
- <dd>
<p>
- If you use this value, you shouldn't specify a value for the <em>pricing_template_id</em>.
+ ...you'd set the values of <code>Auto Fill Prices</code> and
+ <code>Price</code> at the end of a row in the CSV file as follows:
+ </p>
+
+<pre class="no-pretty-print">
+true,1990000,
+</pre>
+
+ <h5>Not using auto-filled prices</h5>
+ <p>
+ If you set <code>Auto Fill Prices</code> to <code>false</code> instead,
+ you specify a series of <code>Country</code> and <code>Price</code>
+ values for all countries where you distribute your app, including the country corresponding to your app's default locale.
+ Each <code>Country</code> value is the two-letter uppercase <a
+ class="external-link"
+ href="https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO country
+ code</a> that represents a country where your app is distributed.
+ </p>
+ <p class="note">
+ <strong>Note: </strong>You must provide a country code and price for each
+ country that your app is targeting. To view and edit the list of countries
+ that your app targets, open your app's <em>Pricing &amp; Distribution</em>
+ page.
</p>
<p>
- This is equivalent to the Price in the In-app Products UI. The price must be specified in
- micro-units. To convert a currency value to micro-units, you multiply the real value by
- 1,000,000.
- For example, if you want to sell an in-app item for $1.99, you specify <code>1990000</code> in the
- <em>price</em> field.
+ Each <code>Price</code> value represents the cost of the item in
+ micro-units of the currency used in that country. Setting <code>Auto Fill
+ Prices</code> to <code>false</code> has the same effect as performing
+ the following sequence of actions:
</p>
+ <ol>
+ <li>
+ Navigating to an in-app product's <em>Managed Product Details</em> page.
+ </li>
+ <li>
+ Selecting <strong>Edit</strong> in the <em>Price</em> section.
+ </li>
+ <li>
+ Explicitly setting tax-inclusive prices for different countries in the
+ <em>Edit Local Prices</em> dialog that appears.
+ </li>
+ <li>
+ Selecting <strong>Apply</strong>.
+ </li>
+ </ol>
+ <p>
+ For example, if you're offering your app for the following prices (all
+ taxes included) in other countries:
+ </p>
+ <ul>
+ <li>R$6.99 in Brazil.</li>
+ <li>129&nbsp;&#8381; in Russia.</li>
+ <li>&#8377;130 in India.</li>
+ <li>Rp&nbsp;27,000 in Indonesia.</li>
+ <li>$37 in Mexico.</li>
+ </ul>
+ <p>
+ ...you'd set the values of <code>Auto Fill Prices</code>,
+ <code>Country</code>, and <code>Price</code> at the end of a row in the
+ CSV file as follows:
+ </p>
+
+<pre class="no-pretty-print">
+false, BR; 6990000; RU; 129000000; IN; 130000000; ID; 27000000000; MX; 37000000;
+</pre>
+
</dd>
- <dt>pricing_template_id</dt>
+ <dt><code>Pricing Template ID</code></dt>
<dd>
<p>
- If you use this value, you should set <em>autofill</em> to
- <code>false</code> and leave the <em>price</em> column empty.
+ If an item is linked to a pricing template, you should set <code>Auto Fill
+ Prices</code> to <code>false</code>, and you shouldn't set a value for the
+ <code>Price</code> column. If the item isn't linked to a pricing template,
+ you shouldn't set a value for the <code>Pricing Template ID</code>; instead,
+ you should set <code>Auto Fill Prices</code>, <code>Country</code>, and
+ <code>Price</code> based on how you want to set the in-app product's prices.
</p>
<p>
- This value represents the ID of the pricing template that you've linked to
- the in-app product. This ID appears under a pricing template's name
- on the <strong>Pricing template</strong> page. If an in-app product isn't
- linked to a pricing template, its <em>pricing_template_id</em> value is
- empty.
+ Setting this value has the same effect as navigating to an in-app product's
+ <em>Managed Product Details</em> page and linking the product's price to the
+ pricing template that has the same pricing template ID as the one specified
+ in the CSV file. This pricing template ID appears underneath a pricing
+ template's name on the <em>Pricing template</em> page.
</p>
<p>
- If you import a CSV file and choose to overwrite the product list, you can
- update the links between in-app products and pricing templates by changing
- the value of an in-app product's <em>pricing_template_id</em>. Leave the
- value empty to unlink an in-app product from all pricing templates.
+ If you import a CSV file, and you've checked the <strong>Overwrite existing
+ products</strong> checkbox in the <em>Import In-app Products</em> dialog,
+ you can update the links between in-app products and pricing templates. To
+ link the product to a specific pricing template, set the <code>Pricing
+ Template ID</code> value to that pricing template's ID. To unlink an in-app
+ product from all pricing templates, don't set a value for its <code>Pricing
+ Template ID</code>.
</p>
<p>
- <strong>Note: </strong>You can link up to 100 app prices or in-app product
- prices with a particular pricing template. Therefore, don't specify the same
- <em>pricing_template_id</em> value in more than 100 rows of your CSV file.
+ You can link up to 100 app prices or in-app product prices to a particular
+ pricing template. Therefore, don't specify the same <code>Pricing Template
+ ID</code> value in more than 100 rows of a CSV file.
</p>
</dd>
</dl>
-<p class="table-caption" id="language-table"><strong>Table 1.</strong> Language codes you can use
-with the <em>locale</em> field.</p>
-
-<table>
-
-<tr>
-<th>Language</th>
-<th>Code</th>
-<th>Language</th>
-<th>Code</th>
-</tr>
-<tr>
-<td>Chinese</td>
-<td>zh_TW</td>
-<td>Italian</td>
-<td>it_IT</td>
-</tr>
-<tr>
-<td>Czech</td>
-<td>cs_CZ</td>
-<td>Japanese</td>
-<td>ja_JP</td>
-</tr>
-<tr>
-<td>Danish</td>
-<td>da_DK</td>
-<td>Korean</td>
-<td>ko_KR</td>
-</tr>
-<tr>
-<td>Dutch</td>
-<td>nl_NL</td>
-<td>Norwegian</td>
-<td>no_NO</td>
-</tr>
-<tr>
-<td>English</td>
-<td>en_US</td>
-<td>Polish</td>
-<td>pl_PL</td>
-</tr>
-<tr>
-<td>French</td>
-<td>fr_FR</td>
-<td>Portuguese</td>
-<td>pt_PT</td>
-</tr>
-<tr>
-<td>Finnish</td>
-<td>fi_FI</td>
-<td>Russian</td>
-<td>ru_RU</td>
-</tr>
-<tr>
-<td>German</td>
-<td>de_DE</td>
-<td>Spanish</td>
-<td>es_ES</td>
-</tr>
-<tr>
-<td>Hebrew</td>
-<td>iw_IL</td>
-<td>Swedish</td>
-<td>sv_SE</td>
-</tr>
-<tr>
-<td>Hindi</td>
-<td>hi_IN</td>
-<td>--</td>
-<td>--</td>
-</tr>
-</table>
-
<h2 id="pricing-template">
Pricing Templates
</h2>
@@ -466,7 +612,8 @@ with the <em>locale</em> field.</p>
can apply to paid apps and in-app products. You can link the prices of up to
100 apps and in-app products to a single pricing template.
</p>
-</p>
+
+<p>
To add a pricing template, do the following:
</p>
@@ -476,14 +623,14 @@ with the <em>locale</em> field.</p>
account.
</li>
- <li>In the <strong>Settings</strong> panel, open the <strong>Pricing
- template</strong> page.
+ <li>In the <em>Settings</em> panel, open the <em>Pricing
+ template</em> page.
</li>
<li>
<p>
- If you are adding your first pricing template, the <strong>Add a Pricing
- Template</strong> banner appears. Select <strong>Add template</strong> to
+ If you are adding your first pricing template, the <em>Add a Pricing
+ Template</em> banner appears. Select <strong>Add template</strong> to
create a new template. The new template's <em>Pricing</em> tab appears.
</p>
@@ -544,8 +691,8 @@ with the <em>locale</em> field.</p>
account.
</li>
- <li>In the <strong>Settings</strong> panel, open the <strong>Pricing
- template</strong> page. This page shows the list of pricing templates you have
+ <li>In the <em>Settings</em> panel, open the <em>Pricing
+ template</em> page. This page shows the list of pricing templates you have
created for your account.
</li>
@@ -605,8 +752,8 @@ with the <em>locale</em> field.</p>
account.
</li>
- <li>In the <strong>All applications</strong> panel, select the app name, then
- open the <strong>In-app Products</strong> page.
+ <li>In the <em>All applications</em> panel, select the app name, then
+ open the <em>In-app Products</em> page.
</li>
<li>Choose the in-app product that you want to link to a pricing template.
@@ -625,7 +772,7 @@ with the <em>locale</em> field.</p>
<p>
To link the price of a paid app to a pricing template, you follow a similar
- process on the app's <strong>Pricing &amp; Distribution</strong> page.
+ process on the app's <em>Pricing &amp; Distribution</em> page.
</p>
<h3 id="delete-linked-item">
@@ -657,7 +804,7 @@ with the <em>locale</em> field.</p>
<li>Select the app that contains the in-app product you want to delete.
</li>
- <li>Open the app's <strong>In-app Products</strong> page.
+ <li>Open the app's <em>In-app Products</em> page.
</li>
<li>Choose the in-app product that you want to delete.
@@ -731,8 +878,8 @@ with the <em>locale</em> field.</p>
account.
</li>
- <li>In the <strong>Settings</strong> panel, open the <strong>Pricing
- template</strong> page, which shows the list of pricing templates you have
+ <li>In the <em>Settings</em> panel, open the <em>Pricing
+ template</em> page, which shows the list of pricing templates you have
created for your account.
</li>
@@ -746,15 +893,15 @@ with the <em>locale</em> field.</p>
</li>
</ol>
-<h2 id="billing-purchase-type">Choosing a Product Type</h3>
+<h2 id="billing-purchase-type">Choosing a Product Type</h2>
<p>An item's product type controls how Google Play manages the purchase of the item. The supported
product types include "managed product" and "subscription." Since support for different product
types can vary among versions of the In-app Billing API, make sure that you choose a product
-type that's valid for the version of the In-app Billing API that your app uses. </p>
+type that's valid for the version of the In-app Billing API that your app uses.</p>
<p>For details, refer to the documentation for the <a
-href="{@docRoot}google/play/billing/api.html#producttype">In-app Billing API</a>.
+href="{@docRoot}google/play/billing/api.html#producttype">In-app Billing API</a>.</p>
<h2 id="billing-refunds">Handling Refunds</h2>
@@ -782,9 +929,10 @@ you at the conclusion of the purchase flow, as the value of the
intent.</p>
<p class="note">
- <strong>Note:</strong> Test purchases don't have an <code>orderId</code>
- field. To track test transactions, you use the <code>purchaseToken</code>
- field instead. For more information about working with test purchases, see <a
+ <strong>Note:</strong> When a user completes a test purchase, the
+ <code>orderId</code> field remains blank. To track test transactions, use
+ the <code>purchaseToken</code> field instead. For more information about
+ working with test purchases, see <a
href="{@docRoot}google/play/billing/billing_testing.html">Testing In-app
Billing</a>.
</p>
@@ -799,14 +947,14 @@ assigned and managed by Google.</p>
<p>For transactions dated 5 December 2012 or later, Google payments assigns a
Merchant Order Number (rather than a Google Order Number) and reports the Merchant
-Order Number as the value of <code>orderId</code>. Here's an
+Order Number as the value of <code>orderID</code>. Here's an
example:</p>
<pre>"orderId" : "GPA.1234-5678-9012-34567"</pre>
<p>For transactions dated previous to 5 December 2012, Google checkout assigned
a Google Order Number and reported that number as the value of
-<code>orderId</code>. Here's an example of an <code>orderId</code> holding a
+<code>orderID</code>. Here's an example of an <code>orderID</code> holding a
Google Order Number:</p>
<pre>"orderId" : "556515565155651"</pre>
@@ -853,8 +1001,8 @@ app.</p>
<p>To locate the key for an app, follow these steps:</p>
<ol>
- <li>Open the <strong>All applications</strong> panel.</li>
- <li>Click on the app name, then open the <strong>Services &amp; APIs</strong>
+ <li>Open the <em>All applications</em> panel.</li>
+ <li>Click on the app name, then open the <em>Services &amp; APIs</em>
page.</li>
<li>Scroll down to the section of the page labeled Your License Key for This
Application, as shown in figure 5.</li>
@@ -869,7 +1017,7 @@ for apps that depend on the (former) developer key. </p>
width="700" alt="">
<figcaption>
<b>Figure 5. </b>You can find the license key for each app on the
- <strong>Services &amp; APIs</strong> page.
+ <em>Services &amp; APIs</em> page.
</figcaption>
</figure>
diff --git a/docs/html/images/cards/distribute/stories/animoca.jpg b/docs/html/images/cards/distribute/stories/animoca.jpg
new file mode 100644
index 000000000000..1886bcef0268
--- /dev/null
+++ b/docs/html/images/cards/distribute/stories/animoca.jpg
Binary files differ
diff --git a/docs/html/images/cards/distribute/stories/drupe.jpg b/docs/html/images/cards/distribute/stories/drupe.jpg
new file mode 100644
index 000000000000..52956956744c
--- /dev/null
+++ b/docs/html/images/cards/distribute/stories/drupe.jpg
Binary files differ
diff --git a/docs/html/images/cards/distribute/stories/economist-espresso.png b/docs/html/images/cards/distribute/stories/economist-espresso.png
new file mode 100644
index 000000000000..923bf5769d3f
--- /dev/null
+++ b/docs/html/images/cards/distribute/stories/economist-espresso.png
Binary files differ
diff --git a/docs/html/images/cards/distribute/stories/expressen-sport.png b/docs/html/images/cards/distribute/stories/expressen-sport.png
new file mode 100644
index 000000000000..842ed3da77a8
--- /dev/null
+++ b/docs/html/images/cards/distribute/stories/expressen-sport.png
Binary files differ
diff --git a/docs/html/images/cards/distribute/stories/glamour.png b/docs/html/images/cards/distribute/stories/glamour.png
new file mode 100644
index 000000000000..770b03fc7df5
--- /dev/null
+++ b/docs/html/images/cards/distribute/stories/glamour.png
Binary files differ
diff --git a/docs/html/images/cards/distribute/stories/happylabs-logo.png b/docs/html/images/cards/distribute/stories/happylabs-logo.png
new file mode 100644
index 000000000000..ea20e71a6ed6
--- /dev/null
+++ b/docs/html/images/cards/distribute/stories/happylabs-logo.png
Binary files differ
diff --git a/docs/html/images/cards/distribute/stories/lifesum.png b/docs/html/images/cards/distribute/stories/lifesum.png
new file mode 100644
index 000000000000..3975ff260ed4
--- /dev/null
+++ b/docs/html/images/cards/distribute/stories/lifesum.png
Binary files differ
diff --git a/docs/html/images/cards/distribute/stories/noom.jpg b/docs/html/images/cards/distribute/stories/noom.jpg
new file mode 100644
index 000000000000..dde18a21e417
--- /dev/null
+++ b/docs/html/images/cards/distribute/stories/noom.jpg
Binary files differ
diff --git a/docs/html/images/cards/distribute/stories/playlab.jpg b/docs/html/images/cards/distribute/stories/playlab.jpg
new file mode 100644
index 000000000000..3b641e63871d
--- /dev/null
+++ b/docs/html/images/cards/distribute/stories/playlab.jpg
Binary files differ
diff --git a/docs/html/images/distribute/stories/animoca-flow.jpg b/docs/html/images/distribute/stories/animoca-flow.jpg
new file mode 100644
index 000000000000..d2aa2f692edf
--- /dev/null
+++ b/docs/html/images/distribute/stories/animoca-flow.jpg
Binary files differ
diff --git a/docs/html/images/distribute/stories/animoca-graph.jpg b/docs/html/images/distribute/stories/animoca-graph.jpg
new file mode 100644
index 000000000000..c2a42f436d48
--- /dev/null
+++ b/docs/html/images/distribute/stories/animoca-graph.jpg
Binary files differ
diff --git a/docs/html/images/distribute/stories/animoca-logo.png b/docs/html/images/distribute/stories/animoca-logo.png
new file mode 100644
index 000000000000..4b5b6b53c750
--- /dev/null
+++ b/docs/html/images/distribute/stories/animoca-logo.png
Binary files differ
diff --git a/docs/html/images/distribute/stories/drupe-icon.png b/docs/html/images/distribute/stories/drupe-icon.png
new file mode 100644
index 000000000000..1b75ccae8318
--- /dev/null
+++ b/docs/html/images/distribute/stories/drupe-icon.png
Binary files differ
diff --git a/docs/html/images/distribute/stories/drupe-screenshot.png b/docs/html/images/distribute/stories/drupe-screenshot.png
new file mode 100644
index 000000000000..6fd4445348e8
--- /dev/null
+++ b/docs/html/images/distribute/stories/drupe-screenshot.png
Binary files differ
diff --git a/docs/html/images/distribute/stories/economist-espresso-icon.png b/docs/html/images/distribute/stories/economist-espresso-icon.png
new file mode 100644
index 000000000000..923bf5769d3f
--- /dev/null
+++ b/docs/html/images/distribute/stories/economist-espresso-icon.png
Binary files differ
diff --git a/docs/html/images/distribute/stories/expressen-icon.png b/docs/html/images/distribute/stories/expressen-icon.png
new file mode 100644
index 000000000000..4547ce775760
--- /dev/null
+++ b/docs/html/images/distribute/stories/expressen-icon.png
Binary files differ
diff --git a/docs/html/images/distribute/stories/glamour-icon.png b/docs/html/images/distribute/stories/glamour-icon.png
new file mode 100644
index 000000000000..770b03fc7df5
--- /dev/null
+++ b/docs/html/images/distribute/stories/glamour-icon.png
Binary files differ
diff --git a/docs/html/images/distribute/stories/happylabs-happy_pet_icon.png b/docs/html/images/distribute/stories/happylabs-happy_pet_icon.png
new file mode 100644
index 000000000000..9b24c4ad6859
--- /dev/null
+++ b/docs/html/images/distribute/stories/happylabs-happy_pet_icon.png
Binary files differ
diff --git a/docs/html/images/distribute/stories/happylabs-logo.png b/docs/html/images/distribute/stories/happylabs-logo.png
new file mode 100644
index 000000000000..ea20e71a6ed6
--- /dev/null
+++ b/docs/html/images/distribute/stories/happylabs-logo.png
Binary files differ
diff --git a/docs/html/images/distribute/stories/happylabs-variant.png b/docs/html/images/distribute/stories/happylabs-variant.png
new file mode 100644
index 000000000000..3ce534209157
--- /dev/null
+++ b/docs/html/images/distribute/stories/happylabs-variant.png
Binary files differ
diff --git a/docs/html/images/distribute/stories/lifesum-icon.png b/docs/html/images/distribute/stories/lifesum-icon.png
new file mode 100644
index 000000000000..3975ff260ed4
--- /dev/null
+++ b/docs/html/images/distribute/stories/lifesum-icon.png
Binary files differ
diff --git a/docs/html/images/distribute/stories/noom-icon.png b/docs/html/images/distribute/stories/noom-icon.png
new file mode 100644
index 000000000000..a85321878f0f
--- /dev/null
+++ b/docs/html/images/distribute/stories/noom-icon.png
Binary files differ
diff --git a/docs/html/images/distribute/stories/noom-screenshot.png b/docs/html/images/distribute/stories/noom-screenshot.png
new file mode 100644
index 000000000000..0293eea85d68
--- /dev/null
+++ b/docs/html/images/distribute/stories/noom-screenshot.png
Binary files differ
diff --git a/docs/html/images/distribute/stories/playlab-icon.png b/docs/html/images/distribute/stories/playlab-icon.png
new file mode 100644
index 000000000000..af8018348df3
--- /dev/null
+++ b/docs/html/images/distribute/stories/playlab-icon.png
Binary files differ
diff --git a/docs/html/images/distribute/stories/playlab-screenshot.png b/docs/html/images/distribute/stories/playlab-screenshot.png
new file mode 100644
index 000000000000..42ffb6ae93a6
--- /dev/null
+++ b/docs/html/images/distribute/stories/playlab-screenshot.png
Binary files differ
diff --git a/docs/html/jd_extras_en.js b/docs/html/jd_extras_en.js
index bb797b2ab1d1..1a97db4dc94e 100644
--- a/docs/html/jd_extras_en.js
+++ b/docs/html/jd_extras_en.js
@@ -2981,7 +2981,6 @@ METADATA['en'].extras = METADATA['en'].extras.concat([
"type": "distribute",
"category": "google"
},
-
{
"lang": "en",
"group": "",
@@ -5379,6 +5378,9 @@ METADATA['en'].collections = {
"distribute/stories/games/docs": {
"title": "",
"resources": [
+ "distribute/stories/games/animoca-star-girl.html",
+ "distribute/stories/games/happy-labs-experiment.html",
+ "distribute/stories/games/playlab-puzzles.html",
"distribute/stories/games/upbeat-games.html",
"distribute/stories/games/tapps.html",
"distribute/stories/games/noodlecake-super-stickman.html",
@@ -5401,6 +5403,11 @@ METADATA['en'].collections = {
"distribute/stories/apps/docs": {
"title": "",
"resources": [
+ "distribute/stories/apps/condenast-shopping.html",
+ "distribute/stories/apps/economist-espresso.html",
+ "distribute/stories/apps/expressen-sports.html",
+ "distribute/stories/apps/drupe-communications.html",
+ "distribute/stories/apps/noom-health.html",
"distribute/stories/apps/aftenposten.html",
"distribute/stories/apps/el-mundo.html",
"distribute/stories/apps/segundamano.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
index 9786c9209afc..fcff8eae612d 100644
--- 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
@@ -332,7 +332,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<!-- 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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 7055d159d487..4e923e6c814f 100644
--- 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
@@ -425,7 +425,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<!-- 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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index c40c9f5df723..4002f636788b 100644
--- 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
@@ -114,7 +114,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 68d2c20bf961..c6ec566bd53a 100644
--- 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
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index ae6415e1172a..42084ee96efc 100644
--- 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
@@ -129,7 +129,7 @@ Class android.support.v4.media.session.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 4e476b32ae72..deab0afb1d79 100644
--- 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
@@ -115,7 +115,7 @@ Class android.support.v4.media.session.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index bd3e5dd2d8e3..16b5462218a0 100644
--- 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
@@ -144,7 +144,7 @@ Class android.support.v4.media.session.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 157405095648..d48ce712712f 100644
--- 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
@@ -122,7 +122,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index f03c4036f33b..bed96129c4e6 100644
--- 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
@@ -140,7 +140,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 6cdd2998750e..08d2ab2ebbdd 100644
--- 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
@@ -108,7 +108,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 5706997ddb3a..1bfa2b33492c 100644
--- 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
@@ -129,7 +129,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index e746f089bdc6..09b19c2af6d6 100644
--- 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
@@ -151,7 +151,7 @@ Class android.support.v4.view.accessibility.<A HREF="../../../../reference/andro
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index ccce9c52467a..7b2f8bb00784 100644
--- 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
@@ -108,7 +108,7 @@ Class android.support.v7.app.<A HREF="../../../../reference/android/support/v7/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index f53a5196d485..fd75b745bee0 100644
--- 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
@@ -108,7 +108,7 @@ Interface android.support.v7.app.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 88490d45adb1..5df87b94b473 100644
--- 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
@@ -115,7 +115,7 @@ Class android.support.v7.app.<A HREF="../../../../reference/android/support/v7/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 42d29a85ab60..6d992ad4d83b 100644
--- 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
@@ -108,7 +108,7 @@ Class android.support.v7.app.<A HREF="../../../../reference/android/support/v7/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 0364519efffa..edfb8bd11a0b 100644
--- 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
@@ -108,7 +108,7 @@ Class android.support.v7.util.<A HREF="../../../../reference/android/support/v7/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index c6736cd33b87..72ddc5abaf1d 100644
--- 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
@@ -233,7 +233,7 @@ see the <a href="http://developer.android.com/index.html" target="_top">Android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index ccd5b665f73c..4537739ad95f 100644
--- 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
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 728e37df454b..50a77aa45abf 100644
--- 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
@@ -88,7 +88,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 64e7f44ef165..04fc9bc6fa02 100644
--- 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
@@ -88,7 +88,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 792fc4e35470..8881d7d2825c 100644
--- 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
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 3237ba33faee..603d3765d740 100644
--- 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
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 637582e518a9..a29ef642b518 100644
--- 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
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 728fa2d6b45e..182ad3c21ddf 100644
--- 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
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 1b95544e7f51..9f9bb4389dd3 100644
--- 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
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 48de992fd22a..6b0d99763d40 100644
--- 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
@@ -69,7 +69,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 02f6dc04424c..726deb65422c 100644
--- 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
@@ -69,7 +69,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 4ebfa31c2de0..e4376a5d2ee3 100644
--- 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
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 09b07264a18f..db6d007d5683 100644
--- 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
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 8bfbd1dea012..e978be0a4642 100644
--- 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
@@ -120,7 +120,7 @@ These links show and hide the HTML frames. All pages are available with or witho
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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 229819b53496..6a96e3944f2e 100644
--- 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
@@ -265,7 +265,7 @@ added, the change will be 100%.</p>
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 36f9836e4478..6a2e76e10fc2 100644
--- 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
@@ -49,7 +49,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index f7c84885444e..b7b94acc1990 100644
--- 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
@@ -264,7 +264,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
(<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 63a2848486ab..04d3884123ef 100644
--- 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
@@ -266,7 +266,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
(<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 3e43f87922e8..3bfd471bba04 100644
--- 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
@@ -53,7 +53,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index b5aea4f9d673..e85e6fc40290 100644
--- 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
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 7d92a82f538c..183d500c84cf 100644
--- 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
@@ -61,7 +61,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 2735fe9fe2f4..0fb83cf3f673 100644
--- 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
@@ -66,7 +66,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 3e408789137d..917e06035aa3 100644
--- 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
@@ -55,7 +55,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index d0ffabcf3c5b..d5a825d09b67 100644
--- 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
@@ -49,7 +49,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</div>
<br>
<div id="indexTableEntries">
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 4dfd7de9dbe7..992f05d634bc 100644
--- 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
@@ -119,7 +119,7 @@ Package <A HREF="../../../../reference/android/support/v4/media/session/package-
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index f52efcb39e1c..86dc84166722 100644
--- 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
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v4/view/accessibility/pac
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index f05d81276873..ad51e62342c8 100644
--- 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
@@ -126,7 +126,7 @@ Package <A HREF="../../../../reference/android/support/v4/view/package-summary.h
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index 44bf61d1fa06..508323f0704e 100644
--- 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
@@ -126,7 +126,7 @@ Package <A HREF="../../../../reference/android/support/v7/app/package-summary.ht
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
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
index d08d9af6748e..8f74fb71e68f 100644
--- 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
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v7/util/package-summary.h
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_additions.html b/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_additions.html
index 3374ffdea113..a1055f13efa1 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_additions.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_additions.html
@@ -660,7 +660,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<!-- Method useStaticShadow -->
<nobr><A HREF="android.support.v17.leanback.widget.ShadowOverlayContainer.html#android.support.v17.leanback.widget.ShadowOverlayContainer.useStaticShadow_added()" class="hiddenlink" target="rightframe"><b>useStaticShadow</b>
()</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_all.html b/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_all.html
index bb24c2944fa6..48f43d26b55a 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_all.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_all.html
@@ -913,7 +913,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.support.v17.leanback.widget.VerticalGridPresenter.html" class="hiddenlink" target="rightframe">VerticalGridPresenter</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_changes.html b/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_changes.html
index 83407498dffe..d5b60c9532bc 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_changes.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_changes.html
@@ -389,7 +389,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.support.v17.leanback.widget.VerticalGridPresenter.html" class="hiddenlink" target="rightframe">VerticalGridPresenter</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_removals.html b/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_removals.html
index 0d670c0ec8fe..f2a8797e072f 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_removals.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/alldiffs_index_removals.html
@@ -83,7 +83,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<!-- Field Platform_V12_AppCompat_Light -->
<nobr><A HREF="android.support.v7.appcompat.R.style.html#android.support.v7.appcompat.R.style.Platform_V12_AppCompat_Light" class="hiddenlink" target="rightframe"><strike>Platform_V12_AppCompat_Light</strike></A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.CoordinatorLayout.Behavior.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.CoordinatorLayout.Behavior.html
index 78392f44b554..c45efa2fb19d 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.CoordinatorLayout.Behavior.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.CoordinatorLayout.Behavior.html
@@ -108,7 +108,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.FloatingActionButton.Behavior.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.FloatingActionButton.Behavior.html
index 6d689765168e..a23105ae4c7f 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.FloatingActionButton.Behavior.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.FloatingActionButton.Behavior.html
@@ -115,7 +115,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.FloatingActionButton.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.FloatingActionButton.html
index 21b55c097928..91a6d772e8f9 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.FloatingActionButton.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.FloatingActionButton.html
@@ -115,7 +115,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.Snackbar.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.Snackbar.html
index 028df735a423..24fdf708a9b4 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.Snackbar.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.Snackbar.html
@@ -130,7 +130,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.TabLayout.Tab.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.TabLayout.Tab.html
index 2acf995d48ea..74a296d3edbf 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.TabLayout.Tab.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.TabLayout.Tab.html
@@ -108,7 +108,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.TabLayout.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.TabLayout.html
index 22a5ff5e1648..3a8d1519bec1 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.TabLayout.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.design.widget.TabLayout.html
@@ -108,7 +108,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.app.DetailsFragment.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.app.DetailsFragment.html
index 16e57980d564..7ae6ce162ba7 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.app.DetailsFragment.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.app.DetailsFragment.html
@@ -136,7 +136,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.app.DetailsSupportFragment.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.app.DetailsSupportFragment.html
index 78252928e212..d1733ac5de46 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.app.DetailsSupportFragment.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.app.DetailsSupportFragment.html
@@ -136,7 +136,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.DetailsOverviewRowPresenter.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.DetailsOverviewRowPresenter.html
index ba8e6afc75dc..799db3d93373 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.DetailsOverviewRowPresenter.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.DetailsOverviewRowPresenter.html
@@ -94,7 +94,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder.html
index 25f1b48ce80d..f8c0cbf490c1 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder.html
@@ -109,7 +109,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ItemBridgeAdapter.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ItemBridgeAdapter.html
index a88f69462e37..b98c33e58232 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ItemBridgeAdapter.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ItemBridgeAdapter.html
@@ -109,7 +109,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ListRowPresenter.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ListRowPresenter.html
index 5d71011a5238..f9ad8773f5ed 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ListRowPresenter.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ListRowPresenter.html
@@ -111,7 +111,7 @@ Change in signature from <code>void</code> to <code>Context</code>.<br>
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.OnChildSelectedListener.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.OnChildSelectedListener.html
index eb8a563acfc2..f13b1479fb21 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.OnChildSelectedListener.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.OnChildSelectedListener.html
@@ -94,7 +94,7 @@ Interface android.support.v17.leanback.widget.<A HREF="../../../../reference/and
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.Presenter.ViewHolder.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.Presenter.ViewHolder.html
index a94d9f542243..55f3575ea80f 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.Presenter.ViewHolder.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.Presenter.ViewHolder.html
@@ -116,7 +116,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.Presenter.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.Presenter.html
index fde5e4b1eab4..417bf868e744 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.Presenter.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.Presenter.html
@@ -116,7 +116,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.PresenterSelector.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.PresenterSelector.html
index 06a0a791f60e..827b2cf345a5 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.PresenterSelector.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.PresenterSelector.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.RowPresenter.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.RowPresenter.html
index 6da5f9b8cbf9..24b7683ec301 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.RowPresenter.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.RowPresenter.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ShadowOverlayContainer.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ShadowOverlayContainer.html
index ac3ac3a2c96b..98140658738a 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ShadowOverlayContainer.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.ShadowOverlayContainer.html
@@ -172,7 +172,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.VerticalGridPresenter.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.VerticalGridPresenter.html
index ab9ce07ab436..c18075e6da42 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.VerticalGridPresenter.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v17.leanback.widget.VerticalGridPresenter.html
@@ -111,7 +111,7 @@ Change in signature from <code>void</code> to <code>Context</code>.<br>
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompat.Action.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompat.Action.html
index 85196101ca94..d96b8742b0a2 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompat.Action.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompat.Action.html
@@ -131,7 +131,7 @@ Change of visibility from protected to public.<br>
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompatBase.Action.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompatBase.Action.html
index 498374e358fc..09ae7fcc7e80 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompatBase.Action.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompatBase.Action.html
@@ -151,7 +151,7 @@ Change of visibility from protected to public.<br>
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompatBase.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompatBase.html
index 309d7b6b45a1..98245745552c 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompatBase.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v4.app.NotificationCompatBase.html
@@ -109,7 +109,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.attr.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.attr.html
index 229289c399c9..541f134095ad 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.attr.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.attr.html
@@ -108,7 +108,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.dimen.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.dimen.html
index a253e59320f9..584073e56baf 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.dimen.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.dimen.html
@@ -122,7 +122,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.drawable.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.drawable.html
index 4f8712752126..45a1dc748f32 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.drawable.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.drawable.html
@@ -108,7 +108,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.id.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.id.html
index e856c8b9608b..cecd912b5ea1 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.id.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.id.html
@@ -192,7 +192,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.integer.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.integer.html
index 70585a799bbf..4b9073984e76 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.integer.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.integer.html
@@ -115,7 +115,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.layout.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.layout.html
index 8130707a294e..c0a13046c805 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.layout.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.layout.html
@@ -157,7 +157,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.string.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.string.html
index 6a01b20fe62d..39be2b2e4bad 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.string.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.string.html
@@ -108,7 +108,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.style.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.style.html
index 886f2ce2b8d6..ffc3690789e9 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.style.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.style.html
@@ -186,7 +186,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.styleable.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.styleable.html
index cd9cd60f45ac..713526be3aa6 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.styleable.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.appcompat.R.styleable.html
@@ -108,7 +108,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.util.SortedList.html b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.util.SortedList.html
index b38c6320a597..181a0fcd2b10 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.util.SortedList.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/android.support.v7.util.SortedList.html
@@ -122,7 +122,7 @@ Class android.support.v7.util.<A HREF="../../../../reference/android/support/v7/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/changes-summary.html b/docs/html/sdk/support_api_diff/22.2.1/changes/changes-summary.html
index e05b67d92b9a..b500246355c9 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/changes-summary.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/changes-summary.html
@@ -177,7 +177,7 @@ see the <a href="http://developer.android.com/index.html" target="_top">Android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_additions.html b/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_additions.html
index 52b4ab7023f2..f2fe6eceb9ab 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_additions.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_additions.html
@@ -103,7 +103,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.support.v17.leanback.widget.html#OnChildViewHolderSelectedListener" class="hiddenlink" target="rightframe"><b>OnChildViewHolderSelectedListener</b></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_all.html b/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_all.html
index 1edab7ace945..16ebdfaae1e1 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_all.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_all.html
@@ -339,7 +339,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.support.v17.leanback.widget.VerticalGridPresenter.html" class="hiddenlink" target="rightframe">VerticalGridPresenter</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_changes.html b/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_changes.html
index f46bc674d12a..8072f0ff8842 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_changes.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_changes.html
@@ -259,7 +259,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.support.v17.leanback.widget.VerticalGridPresenter.html" class="hiddenlink" target="rightframe">VerticalGridPresenter</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_removals.html b/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_removals.html
index 09c0d19ca6ba..757f5bb56b43 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_removals.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/classes_index_removals.html
@@ -63,7 +63,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.support.v17.leanback.widget.html#GridLayoutManager" class="hiddenlink" target="rightframe"><strike>GridLayoutManager</strike></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_additions.html b/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_additions.html
index e694216ea6d0..3bced292f229 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_additions.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_additions.html
@@ -53,7 +53,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v4.app.NotificationCompatBase.html#android.support.v4.app.NotificationCompatBase.ctor_added()" class="hiddenlink" target="rightframe"><b>NotificationCompatBase</b>
()</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_all.html b/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_all.html
index 27d7557f9a15..7769d75e61e6 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_all.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_all.html
@@ -53,7 +53,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v4.app.NotificationCompatBase.html#android.support.v4.app.NotificationCompatBase.ctor_added()" class="hiddenlink" target="rightframe"><b>NotificationCompatBase</b>
()</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_changes.html b/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_changes.html
index a5ca2efd88f9..122cdce9a3c0 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_changes.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_changes.html
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_removals.html b/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_removals.html
index 74a09badbd99..dadd1cd2bd10 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_removals.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/constructors_index_removals.html
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_additions.html b/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_additions.html
index 2ae52377ed25..5d6411a07928 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_additions.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_additions.html
@@ -263,7 +263,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</nobr><br>
<nobr><A HREF="android.support.v7.appcompat.R.id.html#android.support.v7.appcompat.R.id.time" class="hiddenlink" target="rightframe">time</A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_all.html b/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_all.html
index 4a9194d4ee65..85420c3a36c6 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_all.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_all.html
@@ -291,7 +291,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</nobr><br>
<nobr><A HREF="android.support.v7.appcompat.R.id.html#android.support.v7.appcompat.R.id.time" class="hiddenlink" target="rightframe">time</A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_changes.html b/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_changes.html
index 0e2ccff6c01b..301881a9cc49 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_changes.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_changes.html
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_removals.html b/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_removals.html
index 6245b05ff2e6..b1bf691a7585 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_removals.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/fields_index_removals.html
@@ -55,7 +55,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</nobr><br>
<nobr><A HREF="android.support.v7.appcompat.R.style.html#android.support.v7.appcompat.R.style.Platform_V12_AppCompat_Light" class="hiddenlink" target="rightframe"><strike>Platform_V12_AppCompat_Light</strike></A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_help.html b/docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_help.html
index 25acfbe5cb92..f9c1f08111a3 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_help.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_help.html
@@ -120,7 +120,7 @@ These links show and hide the HTML frames. All pages are available with or witho
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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_statistics.html b/docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_statistics.html
index 0f4805f54fc3..322ad4408f92 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_statistics.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_statistics.html
@@ -368,7 +368,7 @@ added, the change will be 100%.</p>
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_topleftframe.html b/docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_topleftframe.html
index 36f9836e4478..6a2e76e10fc2 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_topleftframe.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/jdiff_topleftframe.html
@@ -49,7 +49,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_additions.html b/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_additions.html
index 33a155f71bb0..5a237de2bbdc 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_additions.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_additions.html
@@ -224,7 +224,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</A></nobr><br>
<nobr><A HREF="android.support.v17.leanback.widget.ShadowOverlayContainer.html#android.support.v17.leanback.widget.ShadowOverlayContainer.useStaticShadow_added()" class="hiddenlink" target="rightframe"><b>useStaticShadow</b>
()</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_all.html b/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_all.html
index b9cf858ec933..014ef9ae3a61 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_all.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_all.html
@@ -256,7 +256,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</A></nobr><br>
<nobr><A HREF="android.support.v17.leanback.widget.ShadowOverlayContainer.html#android.support.v17.leanback.widget.ShadowOverlayContainer.useStaticShadow_added()" class="hiddenlink" target="rightframe"><b>useStaticShadow</b>
()</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_changes.html b/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_changes.html
index 4e2d32950a49..6b02e2a67b92 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_changes.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_changes.html
@@ -89,7 +89,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
&nbsp;&nbsp;<nobr><A HREF="android.support.v17.leanback.widget.VerticalGridPresenter.html#android.support.v17.leanback.widget.VerticalGridPresenter.isUsingZOrder_changed(android.content.Context)" class="hiddenlink" target="rightframe">type&nbsp;
(<code>Context</code>)&nbsp;in&nbsp;android.support.v17.leanback.widget.VerticalGridPresenter
</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_removals.html b/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_removals.html
index b5aea4f9d673..e85e6fc40290 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_removals.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/methods_index_removals.html
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_additions.html b/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_additions.html
index 6311752b72ae..d08c85c0d69d 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_additions.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_additions.html
@@ -51,7 +51,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<div id="indexTableEntries">
<A NAME="A"></A>
<A HREF="changes-summary.html#android.support.v17.leanback.system" class="hiddenlink" target="rightframe"><b>android.support.v17.leanback.system</b></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_all.html b/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_all.html
index 3f5ee1306b9e..712eac9fd2b5 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_all.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_all.html
@@ -58,7 +58,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="pkg_android.support.v7.app.html" class="hiddenlink" target="rightframe">android.support.v7.app</A><br>
<A HREF="pkg_android.support.v7.appcompat.html" class="hiddenlink" target="rightframe">android.support.v7.appcompat</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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_changes.html b/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_changes.html
index a4637a774082..e53ee870c2bc 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_changes.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_changes.html
@@ -57,7 +57,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="pkg_android.support.v7.app.html" class="hiddenlink" target="rightframe">android.support.v7.app</A><br>
<A HREF="pkg_android.support.v7.appcompat.html" class="hiddenlink" target="rightframe">android.support.v7.appcompat</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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_removals.html b/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_removals.html
index d0ffabcf3c5b..d5a825d09b67 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_removals.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/packages_index_removals.html
@@ -49,7 +49,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</div>
<br>
<div id="indexTableEntries">
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.design.widget.html b/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.design.widget.html
index 345f33b8d346..25070cee095f 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.design.widget.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.design.widget.html
@@ -140,7 +140,7 @@ Package <A HREF="../../../../reference/android/support/design/widget/package-sum
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v17.leanback.app.html b/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v17.leanback.app.html
index 873bc6b8ef2f..48f868b60166 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v17.leanback.app.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v17.leanback.app.html
@@ -112,7 +112,7 @@ Package <A HREF="../../../../reference/android/support/v17/leanback/app/package-
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v17.leanback.widget.html b/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v17.leanback.widget.html
index 7197d3a3210d..ac3d84358ea1 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v17.leanback.widget.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v17.leanback.widget.html
@@ -324,7 +324,7 @@ Package <A HREF="../../../../reference/android/support/v17/leanback/widget/packa
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v4.app.html b/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v4.app.html
index 1d15399bf085..3122461e777c 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v4.app.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v4.app.html
@@ -119,7 +119,7 @@ Package <A HREF="../../../../reference/android/support/v4/app/package-summary.ht
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.app.html b/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.app.html
index 47c0894c18fe..5f69310bfc1a 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.app.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.app.html
@@ -119,7 +119,7 @@ Package <A HREF="../../../../reference/android/support/v7/app/package-summary.ht
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.appcompat.html b/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.appcompat.html
index 4c562aecfbce..00bcf19ac19a 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.appcompat.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.appcompat.html
@@ -161,7 +161,7 @@ Package <A HREF="../../../../reference/android/support/v7/appcompat/package-summ
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.util.html b/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.util.html
index bac03139c313..e0f4bcd5ad30 100644
--- a/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.util.html
+++ b/docs/html/sdk/support_api_diff/22.2.1/changes/pkg_android.support.v7.util.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v7/util/package-summary.h
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_additions.html b/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_additions.html
index 5495f891cd15..1717f7db9c5f 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_additions.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_additions.html
@@ -1104,7 +1104,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<!-- Field Widget_AppCompat_SeekBar -->
<nobr><A HREF="android.support.v7.appcompat.R.style.html#android.support.v7.appcompat.R.style.Widget_AppCompat_SeekBar" class="hiddenlink" target="rightframe">Widget_AppCompat_SeekBar</A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_all.html b/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_all.html
index 575ee9538857..d4c30e3ca6fe 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_all.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_all.html
@@ -1511,7 +1511,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<!-- Field Widget_AppCompat_SeekBar -->
<nobr><A HREF="android.support.v7.appcompat.R.style.html#android.support.v7.appcompat.R.style.Widget_AppCompat_SeekBar" class="hiddenlink" target="rightframe">Widget_AppCompat_SeekBar</A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_changes.html b/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_changes.html
index d7ebd36de16f..6562fa80d6ef 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_changes.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_changes.html
@@ -548,7 +548,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="android.support.v17.leanback.app.VerticalGridSupportFragment.html" class="hiddenlink" target="rightframe">VerticalGridSupportFragment</A><br>
<!-- Class ViewCompat -->
<A HREF="android.support.v4.view.ViewCompat.html" class="hiddenlink" target="rightframe">ViewCompat</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_removals.html b/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_removals.html
index 0d7da0f5f190..9b21b1d1e956 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_removals.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/alldiffs_index_removals.html
@@ -270,7 +270,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v17.leanback.app.GuidedStepFragment.html#android.support.v17.leanback.app.GuidedStepFragment.setEntryTransitionEnabled_removed(boolean)" class="hiddenlink" target="rightframe"><strike>setEntryTransitionEnabled</strike>
(<code>boolean</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsCallback.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsCallback.html
index 0466d5da2f29..6ba5f8310a99 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsCallback.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsCallback.html
@@ -115,7 +115,7 @@ Class android.support.customtabs.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html
index e3aefb533f83..c53722b32b3b 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html
@@ -115,7 +115,7 @@ Class android.support.customtabs.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsIntent.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsIntent.html
index 9312755e8f45..db592589912d 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsIntent.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsIntent.html
@@ -115,7 +115,7 @@ Class android.support.customtabs.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsService.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsService.html
index 2a0fd18d0c6e..fd5a12b87d29 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsService.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsService.html
@@ -108,7 +108,7 @@ Class android.support.customtabs.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsSession.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsSession.html
index 6b702240bb99..6910bab80a73 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsSession.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsSession.html
@@ -108,7 +108,7 @@ Class android.support.customtabs.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsSessionToken.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsSessionToken.html
index 2bdb42ec68e0..0282d49508ba 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsSessionToken.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.customtabs.CustomTabsSessionToken.html
@@ -108,7 +108,7 @@ Class android.support.customtabs.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.Behavior.SavedState.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.Behavior.SavedState.html
index bb89bbd09780..cea16c01ee36 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.Behavior.SavedState.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.Behavior.SavedState.html
@@ -123,7 +123,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.Behavior.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.Behavior.html
index b538999a7221..672951db4118 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.Behavior.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.Behavior.html
@@ -131,7 +131,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.LayoutParams.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.LayoutParams.html
index 6d19d36c5b39..0218c3064d89 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.LayoutParams.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.LayoutParams.html
@@ -108,7 +108,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html
index c089db3b99b4..424a618d00fa 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html
@@ -124,7 +124,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.CollapsingToolbarLayout.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.CollapsingToolbarLayout.html
index 49d92737a199..8e708c08bb12 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.CollapsingToolbarLayout.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.CollapsingToolbarLayout.html
@@ -143,7 +143,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.CoordinatorLayout.SavedState.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.CoordinatorLayout.SavedState.html
index f92babd40330..496a4609a896 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.CoordinatorLayout.SavedState.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.CoordinatorLayout.SavedState.html
@@ -123,7 +123,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.FloatingActionButton.Behavior.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.FloatingActionButton.Behavior.html
index 07fdda1f67d9..eba424752aa1 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.FloatingActionButton.Behavior.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.FloatingActionButton.Behavior.html
@@ -108,7 +108,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.FloatingActionButton.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.FloatingActionButton.html
index 90553fa10bdb..520fdcf79397 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.FloatingActionButton.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.FloatingActionButton.html
@@ -116,7 +116,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.NavigationView.SavedState.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.NavigationView.SavedState.html
index 8a9ae8038ac2..61428cab3459 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.NavigationView.SavedState.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.NavigationView.SavedState.html
@@ -123,7 +123,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.Snackbar.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.Snackbar.html
index d74186337080..f33e47a7b17a 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.Snackbar.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.Snackbar.html
@@ -108,7 +108,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.TextInputLayout.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.TextInputLayout.html
index 30d0dd66aefd..609e8644b1fc 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.TextInputLayout.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.design.widget.TextInputLayout.html
@@ -129,7 +129,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.percent.PercentLayoutHelper.PercentLayoutInfo.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.percent.PercentLayoutHelper.PercentLayoutInfo.html
index b6f2e4838a2d..967542f022f8 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.percent.PercentLayoutHelper.PercentLayoutInfo.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.percent.PercentLayoutHelper.PercentLayoutInfo.html
@@ -108,7 +108,7 @@ Class android.support.percent.<A HREF="../../../../reference/android/support/per
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v14.preference.EditTextPreferenceDialogFragment.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v14.preference.EditTextPreferenceDialogFragment.html
index 30f22a802cba..6b6151b6784d 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v14.preference.EditTextPreferenceDialogFragment.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v14.preference.EditTextPreferenceDialogFragment.html
@@ -108,7 +108,7 @@ Class android.support.v14.preference.<A HREF="../../../../reference/android/supp
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.BrowseFragment.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.BrowseFragment.html
index f4d77bfaa0ab..14f6fdfac2d6 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.BrowseFragment.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.BrowseFragment.html
@@ -150,7 +150,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.html
index a48ea3bf721a..7adcbe8446c5 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.html
@@ -150,7 +150,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.DetailsFragment.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.DetailsFragment.html
index d38127c2db17..2240f4e48836 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.DetailsFragment.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.DetailsFragment.html
@@ -143,7 +143,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.DetailsSupportFragment.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.DetailsSupportFragment.html
index a02b8f3c13ae..23ca15166269 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.DetailsSupportFragment.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.DetailsSupportFragment.html
@@ -143,7 +143,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.GuidedStepFragment.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.GuidedStepFragment.html
index 725281a494a7..4c78b3032557 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.GuidedStepFragment.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.GuidedStepFragment.html
@@ -215,7 +215,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.PlaybackOverlayFragment.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.PlaybackOverlayFragment.html
index 71e230bd6b36..ecb35bef4691 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.PlaybackOverlayFragment.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.PlaybackOverlayFragment.html
@@ -115,7 +115,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.PlaybackOverlaySupportFragment.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.PlaybackOverlaySupportFragment.html
index a794f1482663..1809374d014d 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.PlaybackOverlaySupportFragment.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.PlaybackOverlaySupportFragment.html
@@ -115,7 +115,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.SearchFragment.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.SearchFragment.html
index 827f46bb0d91..2c444aecf55b 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.SearchFragment.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.SearchFragment.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.SearchSupportFragment.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.SearchSupportFragment.html
index f1e2826e4087..7ff0204050ff 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.SearchSupportFragment.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.SearchSupportFragment.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.VerticalGridFragment.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.VerticalGridFragment.html
index 01bb4de56b09..5516bda7e011 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.VerticalGridFragment.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.VerticalGridFragment.html
@@ -137,7 +137,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.VerticalGridSupportFragment.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.VerticalGridSupportFragment.html
index a818a7925727..0f09ec0d94a6 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.VerticalGridSupportFragment.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.app.VerticalGridSupportFragment.html
@@ -154,7 +154,7 @@ Method was inherited from <code>android.support.v4.app.Fragment</code>, but is n
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.FragmentAnimationProvider.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.FragmentAnimationProvider.html
index 1cf004d269af..e4574025d727 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.FragmentAnimationProvider.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.FragmentAnimationProvider.html
@@ -165,7 +165,7 @@ Interface android.support.v17.leanback.widget.<A HREF="../../../../reference/and
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidanceStylist.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidanceStylist.html
index e0b94bcef197..97949290fea9 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidanceStylist.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidanceStylist.html
@@ -165,7 +165,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedAction.Builder.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedAction.Builder.html
index 96d30a474676..3408bd9e341e 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedAction.Builder.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedAction.Builder.html
@@ -115,7 +115,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedAction.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedAction.html
index 84b93bf65a72..857b7d8f1282 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedAction.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedAction.html
@@ -143,7 +143,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder.html
index 38e83b458a8e..497e985a7995 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.html
index 104f3252f72c..cd45d6da04c3 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.html
@@ -165,7 +165,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ImageCardView.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ImageCardView.html
index 1535ca08dbf8..a5aa07e82c50 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ImageCardView.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ImageCardView.html
@@ -151,7 +151,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ListRowPresenter.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ListRowPresenter.html
index f536d92a1cee..11b95c408912 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ListRowPresenter.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ListRowPresenter.html
@@ -122,7 +122,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.RowPresenter.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.RowPresenter.html
index 3f10b2982ce3..0f254d7356bb 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.RowPresenter.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.RowPresenter.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.SearchBar.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.SearchBar.html
index 2965c1586a54..6e4b41c1bad9 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.SearchBar.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.SearchBar.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ShadowOverlayContainer.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ShadowOverlayContainer.html
index 761fd92167d8..553bbb17a37e 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ShadowOverlayContainer.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.ShadowOverlayContainer.html
@@ -127,7 +127,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.VerticalGridPresenter.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.VerticalGridPresenter.html
index e999838c6583..f1d6fb656e95 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.VerticalGridPresenter.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v17.leanback.widget.VerticalGridPresenter.html
@@ -129,7 +129,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.app.FragmentActivity.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.app.FragmentActivity.html
index c68356c24b8a..dd88acae38e5 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.app.FragmentActivity.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.app.FragmentActivity.html
@@ -115,7 +115,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.content.res.ResourcesCompat.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.content.res.ResourcesCompat.html
index 9bdd4f73c1c9..bb339dac9db8 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.content.res.ResourcesCompat.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.content.res.ResourcesCompat.html
@@ -115,7 +115,7 @@ Class android.support.v4.content.res.<A HREF="../../../../reference/android/supp
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.media.session.MediaSessionCompat.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.media.session.MediaSessionCompat.html
index 5b5f1e34f03e..278f42d66783 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.media.session.MediaSessionCompat.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.media.session.MediaSessionCompat.html
@@ -108,7 +108,7 @@ Class android.support.v4.media.session.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.view.ViewCompat.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.view.ViewCompat.html
index 2e3974574634..03dda5879b09 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.view.ViewCompat.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.view.ViewCompat.html
@@ -179,7 +179,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.NestedScrollView.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.NestedScrollView.html
index 8d4cbaad4853..cdb3d13a583b 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.NestedScrollView.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.NestedScrollView.html
@@ -109,7 +109,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.ScrollerCompat.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.ScrollerCompat.html
index 7f47eae625a6..9ef847eb9025 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.ScrollerCompat.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.ScrollerCompat.html
@@ -108,7 +108,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.TextViewCompat.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.TextViewCompat.html
index 36416257a232..87b1da22b750 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.TextViewCompat.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v4.widget.TextViewCompat.html
@@ -115,7 +115,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.attr.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.attr.html
index dc6fce28c822..ef315197d2ee 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.attr.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.attr.html
@@ -122,7 +122,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.bool.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.bool.html
index 973cf83e1bd5..c26367a3e66e 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.bool.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.bool.html
@@ -108,7 +108,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.dimen.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.dimen.html
index ca5fec2d3ee2..bd324cb77c86 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.dimen.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.dimen.html
@@ -186,7 +186,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.drawable.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.drawable.html
index 3cfba65b18fa..c9264d6387c2 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.drawable.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.drawable.html
@@ -157,7 +157,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.id.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.id.html
index a25139d0e371..e7f9f958b55c 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.id.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.id.html
@@ -122,7 +122,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.layout.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.layout.html
index 0b485ea9f614..c04d4f70675c 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.layout.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.layout.html
@@ -108,7 +108,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.string.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.string.html
index b5b32c7cac07..9dc84abded2b 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.string.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.string.html
@@ -115,7 +115,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.style.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.style.html
index a7b4e2de4b17..58f9025701a8 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.style.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.style.html
@@ -158,7 +158,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.styleable.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.styleable.html
index 3f6d157d1630..49adae899e01 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.styleable.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.appcompat.R.styleable.html
@@ -150,7 +150,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.graphics.Palette.Builder.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.graphics.Palette.Builder.html
index 03171fb78368..22ee483557e7 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.graphics.Palette.Builder.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.graphics.Palette.Builder.html
@@ -115,7 +115,7 @@ Class android.support.v7.graphics.<A HREF="../../../../reference/android/support
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.graphics.drawable.DrawerArrowDrawable.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.graphics.drawable.DrawerArrowDrawable.html
index ec3cb15f8dfc..77232baf8f8c 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.graphics.drawable.DrawerArrowDrawable.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.graphics.drawable.DrawerArrowDrawable.html
@@ -108,7 +108,7 @@ Class android.support.v7.graphics.drawable.<A HREF="../../../../reference/androi
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouteDescriptor.Builder.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouteDescriptor.Builder.html
index aec06c02a71c..5cac37294eb2 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouteDescriptor.Builder.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouteDescriptor.Builder.html
@@ -154,7 +154,7 @@ Class android.support.v7.media.<A HREF="../../../../reference/android/support/v7
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouteDescriptor.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouteDescriptor.html
index 381eb2053ccf..437c56d965fb 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouteDescriptor.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouteDescriptor.html
@@ -147,7 +147,7 @@ Class android.support.v7.media.<A HREF="../../../../reference/android/support/v7
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouter.RouteInfo.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouter.RouteInfo.html
index 239341d542c4..51afa4f755d0 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouter.RouteInfo.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.media.MediaRouter.RouteInfo.html
@@ -166,7 +166,7 @@ Class android.support.v7.media.<A HREF="../../../../reference/android/support/v7
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.preference.EditTextPreferenceDialogFragmentCompat.html b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.preference.EditTextPreferenceDialogFragmentCompat.html
index 05b65ff3563c..ac63d53e4d88 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.preference.EditTextPreferenceDialogFragmentCompat.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/android.support.v7.preference.EditTextPreferenceDialogFragmentCompat.html
@@ -108,7 +108,7 @@ Class android.support.v7.preference.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/changes-summary.html b/docs/html/sdk/support_api_diff/23.1.0/changes/changes-summary.html
index 728ade1f80c2..d9658ba07c8a 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/changes-summary.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/changes-summary.html
@@ -232,7 +232,7 @@ see the <a href="http://developer.android.com/index.html" target="_top">Android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_additions.html b/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_additions.html
index c0022c96e846..1a97c98e59a3 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_additions.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_additions.html
@@ -197,7 +197,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="pkg_android.support.v17.leanback.widget.html#ShadowOverlayHelper" class="hiddenlink" target="rightframe"><b>ShadowOverlayHelper</b></A><br>
<A HREF="pkg_android.support.v17.leanback.widget.html#ShadowOverlayHelper.Builder" class="hiddenlink" target="rightframe"><b>ShadowOverlayHelper.Builder</b></A><br>
<A HREF="pkg_android.support.v17.leanback.widget.html#ShadowOverlayHelper.Options" class="hiddenlink" target="rightframe"><b>ShadowOverlayHelper.Options</b></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_all.html b/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_all.html
index 05f83b828fb8..c8f86f4d57cd 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_all.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_all.html
@@ -471,7 +471,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="android.support.v17.leanback.widget.VerticalGridPresenter.html" class="hiddenlink" target="rightframe">VerticalGridPresenter</A><br>
<A HREF="android.support.v17.leanback.app.VerticalGridSupportFragment.html" class="hiddenlink" target="rightframe">VerticalGridSupportFragment</A><br>
<A HREF="android.support.v4.view.ViewCompat.html" class="hiddenlink" target="rightframe">ViewCompat</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_changes.html b/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_changes.html
index b1ee9721b893..f280906a5e16 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_changes.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_changes.html
@@ -415,7 +415,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="android.support.v17.leanback.widget.VerticalGridPresenter.html" class="hiddenlink" target="rightframe">VerticalGridPresenter</A><br>
<A HREF="android.support.v17.leanback.app.VerticalGridSupportFragment.html" class="hiddenlink" target="rightframe">VerticalGridSupportFragment</A><br>
<A HREF="android.support.v4.view.ViewCompat.html" class="hiddenlink" target="rightframe">ViewCompat</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_removals.html b/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_removals.html
index e6da73f487d3..c4662980dd50 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_removals.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/classes_index_removals.html
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_additions.html b/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_additions.html
index 3bf817825606..45f72f14392c 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_additions.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_additions.html
@@ -97,7 +97,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.design.widget.NavigationView.SavedState.html#android.support.design.widget.NavigationView.SavedState.ctor_added(android.os.Parcel, java.lang.ClassLoader)" class="hiddenlink" target="rightframe"><b>NavigationView.SavedState</b>
(<code>Parcel, ClassLoader</code>)</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_all.html b/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_all.html
index 546eae84529f..8dda68f6eee2 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_all.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_all.html
@@ -106,7 +106,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
(<code>Parcel</code>)</A></nobr>&nbsp;constructor<br>
&nbsp;&nbsp;<nobr><A HREF="android.support.design.widget.NavigationView.SavedState.html#android.support.design.widget.NavigationView.SavedState.ctor_added(android.os.Parcel, java.lang.ClassLoader)" class="hiddenlink" target="rightframe"><b>NavigationView.SavedState</b>
(<code>Parcel, ClassLoader</code>)</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_changes.html b/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_changes.html
index 52c8b49a944e..d6584d199e43 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_changes.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_changes.html
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_removals.html b/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_removals.html
index 337274d6fd8d..49ee23cf0463 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_removals.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/constructors_index_removals.html
@@ -71,7 +71,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.design.widget.NavigationView.SavedState.html#android.support.design.widget.NavigationView.SavedState.ctor_removed(android.os.Parcel)" class="hiddenlink" target="rightframe"><strike>NavigationView.SavedState</strike>
(<code>Parcel</code>)</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_additions.html b/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_additions.html
index d1ef3acb4293..0c43320ccf1e 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_additions.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_additions.html
@@ -329,7 +329,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</nobr><br>
<nobr><A HREF="android.support.v7.appcompat.R.style.html#android.support.v7.appcompat.R.style.Widget_AppCompat_SeekBar" class="hiddenlink" target="rightframe">Widget_AppCompat_SeekBar</A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_all.html b/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_all.html
index 697f16a69f71..71d9b7156c04 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_all.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_all.html
@@ -339,7 +339,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</nobr><br>
<nobr><A HREF="android.support.v7.appcompat.R.style.html#android.support.v7.appcompat.R.style.Widget_AppCompat_SeekBar" class="hiddenlink" target="rightframe">Widget_AppCompat_SeekBar</A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_changes.html b/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_changes.html
index 0e2ccff6c01b..301881a9cc49 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_changes.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_changes.html
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_removals.html b/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_removals.html
index 93bcdc37d760..f520de6a9ecf 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_removals.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/fields_index_removals.html
@@ -67,7 +67,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v7.appcompat.R.style.html#android.support.v7.appcompat.R.style.RtlOverlay_Widget_AppCompat_ActionButton_Overflow" class="hiddenlink" target="rightframe"><strike>RtlOverlay_Widget_AppCompat_ActionButton_Overflow</strike></A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_help.html b/docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_help.html
index b03b763db839..0ba76e740f14 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_help.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_help.html
@@ -120,7 +120,7 @@ These links show and hide the HTML frames. All pages are available with or witho
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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_statistics.html b/docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_statistics.html
index bdda25f1e927..ac4d43ede72b 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_statistics.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_statistics.html
@@ -568,7 +568,7 @@ added, the change will be 100%.</p>
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_topleftframe.html b/docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_topleftframe.html
index 36f9836e4478..6a2e76e10fc2 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_topleftframe.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/jdiff_topleftframe.html
@@ -49,7 +49,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_additions.html b/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_additions.html
index 9b4eab3e024e..fee36dfee95f 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_additions.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_additions.html
@@ -516,7 +516,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.customtabs.CustomTabsService.html#android.support.customtabs.CustomTabsService.updateVisuals_added(android.support.customtabs.CustomTabsSessionToken, android.os.Bundle)" class="hiddenlink" target="rightframe"><b>updateVisuals</b>
(<code>CustomTabsSessionToken, Bundle</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_all.html b/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_all.html
index d63656c30cb4..7a2fe5c7962f 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_all.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_all.html
@@ -616,7 +616,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.customtabs.CustomTabsService.html#android.support.customtabs.CustomTabsService.updateVisuals_added(android.support.customtabs.CustomTabsSessionToken, android.os.Bundle)" class="hiddenlink" target="rightframe"><b>updateVisuals</b>
(<code>CustomTabsSessionToken, Bundle</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_changes.html b/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_changes.html
index 8271b357c479..254a721fe5e8 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_changes.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_changes.html
@@ -77,7 +77,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v7.media.MediaRouteDescriptor.Builder.html#android.support.v7.media.MediaRouteDescriptor.Builder.setConnecting_changed(boolean)" class="hiddenlink" target="rightframe">setConnecting
(<code>boolean</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_removals.html b/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_removals.html
index 72505052971e..0b6f2b40cd39 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_removals.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/methods_index_removals.html
@@ -158,7 +158,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v17.leanback.app.GuidedStepFragment.html#android.support.v17.leanback.app.GuidedStepFragment.setEntryTransitionEnabled_removed(boolean)" class="hiddenlink" target="rightframe"><strike>setEntryTransitionEnabled</strike>
(<code>boolean</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_additions.html b/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_additions.html
index 1776064fe6a9..e7ed63ee4e2e 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_additions.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_additions.html
@@ -49,7 +49,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</div>
<br>
<div id="indexTableEntries">
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_all.html b/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_all.html
index 2bf097482753..42368474c9bd 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_all.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_all.html
@@ -67,7 +67,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="pkg_android.support.v7.graphics.drawable.html" class="hiddenlink" target="rightframe">android.support.v7.graphics.drawable</A><br>
<A HREF="pkg_android.support.v7.media.html" class="hiddenlink" target="rightframe">android.support.v7.media</A><br>
<A HREF="pkg_android.support.v7.preference.html" class="hiddenlink" target="rightframe">android.support.v7.preference</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_changes.html b/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_changes.html
index 519e9aae0bc5..8d51ea2e460d 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_changes.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_changes.html
@@ -67,7 +67,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="pkg_android.support.v7.graphics.drawable.html" class="hiddenlink" target="rightframe">android.support.v7.graphics.drawable</A><br>
<A HREF="pkg_android.support.v7.media.html" class="hiddenlink" target="rightframe">android.support.v7.media</A><br>
<A HREF="pkg_android.support.v7.preference.html" class="hiddenlink" target="rightframe">android.support.v7.preference</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_removals.html b/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_removals.html
index 9fd0f7e9a8e7..ae935f4fdcc9 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_removals.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/packages_index_removals.html
@@ -49,7 +49,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</div>
<br>
<div id="indexTableEntries">
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.customtabs.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.customtabs.html
index d85f3f8f8312..ea620042dbff 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.customtabs.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.customtabs.html
@@ -140,7 +140,7 @@ Package <A HREF="../../../../reference/android/support/customtabs/package-summar
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.design.widget.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.design.widget.html
index 449afa677898..45625b9adc43 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.design.widget.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.design.widget.html
@@ -211,7 +211,7 @@ Package <A HREF="../../../../reference/android/support/design/widget/package-sum
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.percent.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.percent.html
index 53b92a973821..13b9732c8e7b 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.percent.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.percent.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/percent/package-summary.h
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v14.preference.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v14.preference.html
index 3ef0a0f09093..7364b7c392b8 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v14.preference.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v14.preference.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v14/preference/package-su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v17.leanback.app.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v17.leanback.app.html
index 49ee52fdd061..21763fbae33d 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v17.leanback.app.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v17.leanback.app.html
@@ -211,7 +211,7 @@ Package <A HREF="../../../../reference/android/support/v17/leanback/app/package-
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v17.leanback.widget.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v17.leanback.widget.html
index 73d50503c2b2..ff00794053c6 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v17.leanback.widget.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v17.leanback.widget.html
@@ -239,7 +239,7 @@ Package <A HREF="../../../../reference/android/support/v17/leanback/widget/packa
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.app.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.app.html
index b1645a6494fe..ccdb5fe533ae 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.app.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.app.html
@@ -120,7 +120,7 @@ Package <A HREF="../../../../reference/android/support/v4/app/package-summary.ht
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.content.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.content.html
index efc62c92daf3..b1b6ffcff58c 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.content.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.content.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v4/content/package-summar
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.content.res.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.content.res.html
index fd9c9f828668..f6a13676263f 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.content.res.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.content.res.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v4/content/res/package-su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.media.session.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.media.session.html
index afd23b1bfb14..1182648e6372 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.media.session.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.media.session.html
@@ -120,7 +120,7 @@ Package <A HREF="../../../../reference/android/support/v4/media/session/package-
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.view.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.view.html
index 7d74c820ee98..b4fe9b22b69c 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.view.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.view.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v4/view/package-summary.h
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.widget.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.widget.html
index 4ca78740ff3b..e32ebc81d83f 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.widget.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v4.widget.html
@@ -134,7 +134,7 @@ Package <A HREF="../../../../reference/android/support/v4/widget/package-summary
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.appcompat.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.appcompat.html
index 553bdf2016af..b516a352ec7a 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.appcompat.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.appcompat.html
@@ -161,7 +161,7 @@ Package <A HREF="../../../../reference/android/support/v7/appcompat/package-summ
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.graphics.drawable.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.graphics.drawable.html
index e9d5cd9560d7..69c91d5259ba 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.graphics.drawable.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.graphics.drawable.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v7/graphics/drawable/pack
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.graphics.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.graphics.html
index ba9a092f51eb..13d6ef971a6c 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.graphics.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.graphics.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v7/graphics/package-summa
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.media.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.media.html
index 7892bf93acfc..4c2094c02bd0 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.media.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.media.html
@@ -134,7 +134,7 @@ Package <A HREF="../../../../reference/android/support/v7/media/package-summary.
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.preference.html b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.preference.html
index ced3a905a783..ed590bbadf7e 100644
--- a/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.preference.html
+++ b/docs/html/sdk/support_api_diff/23.1.0/changes/pkg_android.support.v7.preference.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v7/preference/package-sum
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_additions.html b/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_additions.html
index 09ec1eb27b09..3b43f275f281 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_additions.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_additions.html
@@ -1955,7 +1955,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<!-- Method XYZToLAB -->
<nobr><A HREF="android.support.v4.graphics.ColorUtils.html#android.support.v4.graphics.ColorUtils.XYZToLAB_added(double, double, double, double[])" class="hiddenlink" target="rightframe"><b>XYZToLAB</b>
(<code>double, double, double, double[]</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_all.html b/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_all.html
index 770d615c0dfc..6264757d4ad9 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_all.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_all.html
@@ -2914,7 +2914,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<!-- Method XYZToLAB -->
<nobr><A HREF="android.support.v4.graphics.ColorUtils.html#android.support.v4.graphics.ColorUtils.XYZToLAB_added(double, double, double, double[])" class="hiddenlink" target="rightframe"><b>XYZToLAB</b>
(<code>double, double, double, double[]</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_changes.html b/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_changes.html
index 134580df94d8..6113a9e2cc0d 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_changes.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_changes.html
@@ -939,7 +939,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.support.v4.view.WindowCompat.html" class="hiddenlink" target="rightframe">WindowCompat</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_removals.html b/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_removals.html
index a60b244fa76d..2df39dcbe9fb 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_removals.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/alldiffs_index_removals.html
@@ -956,7 +956,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v4.view.WindowCompat.html#android.support.v4.view.WindowCompat.ctor_removed()" class="hiddenlink" target="rightframe"><strike>WindowCompat</strike>
()</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html
index 46a0548ea78f..3e97afdff12d 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html
@@ -122,7 +122,7 @@ Class android.support.customtabs.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsIntent.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsIntent.html
index 7987724e063d..d7745e63bd53 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsIntent.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsIntent.html
@@ -151,7 +151,7 @@ Class android.support.customtabs.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsSession.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsSession.html
index 1296d4cdd49b..9b48018b5a6e 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsSession.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.customtabs.CustomTabsSession.html
@@ -108,7 +108,7 @@ Class android.support.customtabs.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html
index d5394814d779..80c8e11f666a 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html
@@ -136,7 +136,7 @@ Method was locally defined, but is now inherited from <a href="../../../../refer
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.CollapsingToolbarLayout.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.CollapsingToolbarLayout.html
index e47f317fc2ef..e1ae295f59a1 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.CollapsingToolbarLayout.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.CollapsingToolbarLayout.html
@@ -164,7 +164,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.CoordinatorLayout.Behavior.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.CoordinatorLayout.Behavior.html
index 04efe890b013..ee87ca60b315 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.CoordinatorLayout.Behavior.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.CoordinatorLayout.Behavior.html
@@ -121,7 +121,7 @@ Change from final to non-final.<br>
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.FloatingActionButton.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.FloatingActionButton.html
index 985adbad0f3c..33d67e2b174f 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.FloatingActionButton.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.FloatingActionButton.html
@@ -144,7 +144,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.HeaderScrollingViewBehavior.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.HeaderScrollingViewBehavior.html
index 7021ba2218e5..0e2435611b64 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.HeaderScrollingViewBehavior.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.HeaderScrollingViewBehavior.html
@@ -122,7 +122,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.TabLayout.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.TabLayout.html
index 9224ddb3a890..3d0eb9faf124 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.TabLayout.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.TabLayout.html
@@ -111,7 +111,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.TextInputLayout.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.TextInputLayout.html
index b0f5d63af06b..d72b373d462f 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.TextInputLayout.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.TextInputLayout.html
@@ -129,7 +129,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.ViewOffsetBehavior.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.ViewOffsetBehavior.html
index 1b4625f04906..9faa8260e14b 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.ViewOffsetBehavior.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.design.widget.ViewOffsetBehavior.html
@@ -108,7 +108,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.percent.PercentLayoutHelper.PercentLayoutInfo.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.percent.PercentLayoutHelper.PercentLayoutInfo.html
index c13de02f27cd..13c0b4e290c1 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.percent.PercentLayoutHelper.PercentLayoutInfo.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.percent.PercentLayoutHelper.PercentLayoutInfo.html
@@ -130,7 +130,7 @@ Class android.support.percent.<A HREF="../../../../reference/android/support/per
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v14.preference.PreferenceFragment.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v14.preference.PreferenceFragment.html
index 3a910d07b5c3..7ead465b8a5a 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v14.preference.PreferenceFragment.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v14.preference.PreferenceFragment.html
@@ -115,7 +115,7 @@ Class android.support.v14.preference.<A HREF="../../../../reference/android/supp
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BaseRowFragment.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BaseRowFragment.html
index 003f04be6a90..9bd2bd7dea76 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BaseRowFragment.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BaseRowFragment.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BaseRowSupportFragment.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BaseRowSupportFragment.html
index 6a30cc3b0783..cf9900ca3770 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BaseRowSupportFragment.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BaseRowSupportFragment.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BrowseFragment.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BrowseFragment.html
index 74cb1514d777..d7d0e76e7d19 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BrowseFragment.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BrowseFragment.html
@@ -129,7 +129,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.html
index a46a8ede205a..d7bb8c90e6b8 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.html
@@ -129,7 +129,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.DetailsFragment.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.DetailsFragment.html
index 34875c305bcb..852b28a6b7f1 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.DetailsFragment.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.DetailsFragment.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.DetailsSupportFragment.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.DetailsSupportFragment.html
index 4cd41edc83b3..444a537c4e9d 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.DetailsSupportFragment.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.DetailsSupportFragment.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.GuidedStepFragment.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.GuidedStepFragment.html
index 0962be78d201..1cfc19e3ddef 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.GuidedStepFragment.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.GuidedStepFragment.html
@@ -330,7 +330,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.GuidedStepSupportFragment.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.GuidedStepSupportFragment.html
index b464afafe513..c5f0d5aba1d1 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.GuidedStepSupportFragment.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.GuidedStepSupportFragment.html
@@ -330,7 +330,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener.html
index 0df02c464639..800f32bdc67f 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener.html
@@ -112,7 +112,7 @@ Change in signature from <code>void</code> to (<code>ViewHolder, Row</code>).<br
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener.html
index cc2eedabeafa..70ec5569e236 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener.html
@@ -94,7 +94,7 @@ Interface android.support.v17.leanback.app.<A HREF="../../../../reference/androi
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener.html
index 0c59abdeb4fe..ee37373fc35d 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener.html
@@ -112,7 +112,7 @@ Change in signature from <code>void</code> to (<code>ViewHolder, Row</code>).<br
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener.html
index ee27726aedd2..99e380d7ae73 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener.html
@@ -94,7 +94,7 @@ Interface android.support.v17.leanback.app.<A HREF="../../../../reference/androi
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.RowsFragment.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.RowsFragment.html
index 612c05ae627b..7c783224ac34 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.RowsFragment.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.RowsFragment.html
@@ -115,7 +115,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.RowsSupportFragment.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.RowsSupportFragment.html
index 7cbdf0c622f4..a112b199f46c 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.RowsSupportFragment.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.app.RowsSupportFragment.html
@@ -115,7 +115,7 @@ Class android.support.v17.leanback.app.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder.html
index 674231eb070a..ef74a4065847 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder.html
@@ -129,7 +129,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.html
index 74e170c3ff78..05a2205f353a 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidanceStylist.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidanceStylist.html
index 0a20eb4032d7..f67942ec509d 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidanceStylist.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidanceStylist.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedAction.Builder.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedAction.Builder.html
index b77684bccb44..4d1d86b2fcb7 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedAction.Builder.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedAction.Builder.html
@@ -281,7 +281,7 @@ Change in return type from <code>Builder</code> to <code>B</code>.<br>
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedAction.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedAction.html
index 20165c74685a..2ce2773353c1 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedAction.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedAction.html
@@ -307,7 +307,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder.html
index 0849383dea02..b9b78cb8cbab 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder.html
@@ -195,7 +195,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.html
index a8dff6f08e81..fbe6bb4d6179 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.html
@@ -306,7 +306,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.ImageCardView.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.ImageCardView.html
index f110a16ef4cc..dde52dd93646 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.ImageCardView.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.ImageCardView.html
@@ -111,7 +111,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.ListRowPresenter.ViewHolder.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.ListRowPresenter.ViewHolder.html
index 2207a6dfb470..9aadb33bc8e2 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.ListRowPresenter.ViewHolder.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v17.leanback.widget.ListRowPresenter.ViewHolder.html
@@ -115,7 +115,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat.html
index 2479a86c7676..4545dc6116d9 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.accessibilityservice.<A HREF="../../../../reference/and
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.AppOpsManagerCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.AppOpsManagerCompat.html
index 15ddb446d8d1..8d4b2812520f 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.AppOpsManagerCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.AppOpsManagerCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.BundleCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.BundleCompat.html
index 63ecf79ebe93..65cb6cea2a21 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.BundleCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.BundleCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.Fragment.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.Fragment.html
index d6c9e88827c0..adb8e8a6b60e 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.Fragment.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.Fragment.html
@@ -115,7 +115,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.FragmentActivity.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.FragmentActivity.html
index 72bd4de24510..843cf6834f61 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.FragmentActivity.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.FragmentActivity.html
@@ -108,7 +108,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.FragmentHostCallback.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.FragmentHostCallback.html
index fcb311f1111c..ca9cab8840bb 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.FragmentHostCallback.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.FragmentHostCallback.html
@@ -108,7 +108,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.NavUtils.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.NavUtils.html
index e4fb7fa4d54a..7267e5063c5e 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.NavUtils.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.NavUtils.html
@@ -94,7 +94,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.NotificationManagerCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.NotificationManagerCompat.html
index be48aac41fa7..06346b2a0d47 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.NotificationManagerCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.NotificationManagerCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.RemoteInput.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.RemoteInput.html
index a6a2a2dfd925..006eeeecaccb 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.RemoteInput.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.RemoteInput.html
@@ -94,7 +94,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.ServiceCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.ServiceCompat.html
index c038e5219a5e..613affee933c 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.ServiceCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.ServiceCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.ShareCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.ShareCompat.html
index 8e9c9457717e..90c063004872 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.ShareCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.ShareCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.TaskStackBuilder.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.TaskStackBuilder.html
index 8a8a3c7b990f..12d44de89cb7 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.TaskStackBuilder.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.app.TaskStackBuilder.html
@@ -94,7 +94,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ContentResolverCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ContentResolverCompat.html
index 6abd31a5b38a..37ab80d83696 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ContentResolverCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ContentResolverCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.content.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ContextCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ContextCompat.html
index c0abad26874d..92f946948e13 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ContextCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ContextCompat.html
@@ -111,7 +111,7 @@ Change from non-static to static.<br> Change from final to non-final.<br>
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.IntentCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.IntentCompat.html
index 707b2de697af..37a8b428ea5a 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.IntentCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.IntentCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.content.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.LocalBroadcastManager.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.LocalBroadcastManager.html
index fb0f8eb240c1..a3d8f8961774 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.LocalBroadcastManager.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.LocalBroadcastManager.html
@@ -94,7 +94,7 @@ Class android.support.v4.content.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ParallelExecutorCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ParallelExecutorCompat.html
index 135c65afb1e4..3dd3598d01fa 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ParallelExecutorCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.ParallelExecutorCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.content.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.SharedPreferencesCompat.EditorCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.SharedPreferencesCompat.EditorCompat.html
index 2a46cc879d7f..5159fec9c653 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.SharedPreferencesCompat.EditorCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.SharedPreferencesCompat.EditorCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.content.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.SharedPreferencesCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.SharedPreferencesCompat.html
index 99e7e845f6f3..3c4513afae07 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.SharedPreferencesCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.SharedPreferencesCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.content.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.pm.ActivityInfoCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.pm.ActivityInfoCompat.html
index 201f6e253747..1fa39360fa22 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.pm.ActivityInfoCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.pm.ActivityInfoCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.content.pm.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.res.ResourcesCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.res.ResourcesCompat.html
index 497d73b70e60..77e6d437dec1 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.res.ResourcesCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.content.res.ResourcesCompat.html
@@ -137,7 +137,7 @@ Change from non-static to static.<br>
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.database.DatabaseUtilsCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.database.DatabaseUtilsCompat.html
index 0feb04b65fbc..90a5d72af12c 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.database.DatabaseUtilsCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.database.DatabaseUtilsCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.database.<A HREF="../../../../reference/android/support
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.BitmapCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.BitmapCompat.html
index 3b50f8e92a08..912d5ee56239 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.BitmapCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.BitmapCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.graphics.<A HREF="../../../../reference/android/support
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.ColorUtils.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.ColorUtils.html
index 68c2dcebe9b8..1dfcdc59dcc4 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.ColorUtils.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.ColorUtils.html
@@ -186,7 +186,7 @@ Class android.support.v4.graphics.<A HREF="../../../../reference/android/support
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.drawable.DrawableCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.drawable.DrawableCompat.html
index 735909e31326..041cbfde4282 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.drawable.DrawableCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.drawable.DrawableCompat.html
@@ -152,7 +152,7 @@ Class android.support.v4.graphics.drawable.<A HREF="../../../../reference/androi
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory.html
index f0e4cbf04887..2323bf06a92f 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory.html
@@ -109,7 +109,7 @@ Class android.support.v4.graphics.drawable.<A HREF="../../../../reference/androi
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.hardware.fingerprint.FingerprintManagerCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.hardware.fingerprint.FingerprintManagerCompat.html
index 3c5e74d33897..8a49a32bb331 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.hardware.fingerprint.FingerprintManagerCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.hardware.fingerprint.FingerprintManagerCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.hardware.fingerprint.<A HREF="../../../../reference/and
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.net.ConnectivityManagerCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.net.ConnectivityManagerCompat.html
index 585fbe10e3c1..45e77fa035d4 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.net.ConnectivityManagerCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.net.ConnectivityManagerCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.net.<A HREF="../../../../reference/android/support/v4/n
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.net.TrafficStatsCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.net.TrafficStatsCompat.html
index d8d8d74ab7e8..89403e7d54c4 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.net.TrafficStatsCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.net.TrafficStatsCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.net.<A HREF="../../../../reference/android/support/v4/n
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.AsyncTaskCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.AsyncTaskCompat.html
index 0ea4b472ca1c..fcde361dd6e3 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.AsyncTaskCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.AsyncTaskCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.os.<A HREF="../../../../reference/android/support/v4/os
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.EnvironmentCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.EnvironmentCompat.html
index 4d625b175df0..914f3f009802 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.EnvironmentCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.EnvironmentCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.os.<A HREF="../../../../reference/android/support/v4/os
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.ParcelableCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.ParcelableCompat.html
index 0192ed6eb103..8933edd35dd4 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.ParcelableCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.ParcelableCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.os.<A HREF="../../../../reference/android/support/v4/os
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.TraceCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.TraceCompat.html
index 3f490baa396d..8778c2e47253 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.TraceCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.os.TraceCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.os.<A HREF="../../../../reference/android/support/v4/os
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.ICUCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.ICUCompat.html
index 2b9744045cec..c4ea966280ab 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.ICUCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.ICUCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.text.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.TextDirectionHeuristicsCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.TextDirectionHeuristicsCompat.html
index 45557e1a8c66..351a162ce7da 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.TextDirectionHeuristicsCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.TextDirectionHeuristicsCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.text.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.TextUtilsCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.TextUtilsCompat.html
index 16d083523975..d3ab7cea888e 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.TextUtilsCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.text.TextUtilsCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.text.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.GestureDetectorCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.GestureDetectorCompat.html
index 5c0463d11b22..e66c2611d424 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.GestureDetectorCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.GestureDetectorCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.GravityCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.GravityCompat.html
index 9ee14c5d55ed..95c665e2f22e 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.GravityCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.GravityCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.InputDeviceCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.InputDeviceCompat.html
index 4a7f3854f78b..38a1cd84de76 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.InputDeviceCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.InputDeviceCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.KeyEventCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.KeyEventCompat.html
index 49526ab67ff4..58692a9f1894 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.KeyEventCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.KeyEventCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.LayoutInflaterCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.LayoutInflaterCompat.html
index 7329ff71e6e5..b62e8764a870 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.LayoutInflaterCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.LayoutInflaterCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MarginLayoutParamsCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MarginLayoutParamsCompat.html
index 86a7b574ac0c..444980d622e1 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MarginLayoutParamsCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MarginLayoutParamsCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MenuCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MenuCompat.html
index 22ead5ecd220..17b8b7d94187 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MenuCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MenuCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MenuItemCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MenuItemCompat.html
index a321ac394c00..415dae2c85f1 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MenuItemCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MenuItemCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MotionEventCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MotionEventCompat.html
index cb8895da8d56..c1f81ba2b1ff 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MotionEventCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.MotionEventCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ScaleGestureDetectorCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ScaleGestureDetectorCompat.html
index 23f87187ed77..8733e6b571d7 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ScaleGestureDetectorCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ScaleGestureDetectorCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.VelocityTrackerCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.VelocityTrackerCompat.html
index 31a2b6605253..078bb964b9cd 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.VelocityTrackerCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.VelocityTrackerCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewCompat.html
index bbfebc10da77..0647acb0c852 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewConfigurationCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewConfigurationCompat.html
index 3deb282e4645..0721e0c78ca6 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewConfigurationCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewConfigurationCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewGroupCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewGroupCompat.html
index 973f25d1ae16..7c3f280150cc 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewGroupCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewGroupCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewParentCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewParentCompat.html
index 0ff69776f916..186cdce07e9c 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewParentCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewParentCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewPropertyAnimatorCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewPropertyAnimatorCompat.html
index dcb75fcdd1e4..7611f009854c 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewPropertyAnimatorCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.ViewPropertyAnimatorCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.WindowCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.WindowCompat.html
index a9711fa25316..bf16942a6c73 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.WindowCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.WindowCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html
index e2045d754e7f..b9b15c86cccf 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.view.accessibility.<A HREF="../../../../reference/andro
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.html
index d74f936fdc87..518052318f05 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.view.accessibility.<A HREF="../../../../reference/andro
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.animation.PathInterpolatorCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.animation.PathInterpolatorCompat.html
index 6701f777a7fa..715f73f35d57 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.animation.PathInterpolatorCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.view.animation.PathInterpolatorCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.view.animation.<A HREF="../../../../reference/android/s
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.DrawerLayout.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.DrawerLayout.html
index c2e7c837a8bf..f85950164d75 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.DrawerLayout.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.DrawerLayout.html
@@ -148,7 +148,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.EdgeEffectCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.EdgeEffectCompat.html
index 6993bec81552..a476dfb159f7 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.EdgeEffectCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.EdgeEffectCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.ListPopupWindowCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.ListPopupWindowCompat.html
index fc5ed8d84ea1..243f6d27640a 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.ListPopupWindowCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.ListPopupWindowCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.PopupMenuCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.PopupMenuCompat.html
index 1d55628d4a99..c3cca7042aad 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.PopupMenuCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.PopupMenuCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.PopupWindowCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.PopupWindowCompat.html
index 215118cd0e7f..0523e9f0f0b8 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.PopupWindowCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.PopupWindowCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.ScrollerCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.ScrollerCompat.html
index ea76c9260f2b..f13086d75dab 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.ScrollerCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.ScrollerCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.SearchViewCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.SearchViewCompat.html
index ce5abd342458..e3de11d9a1cf 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.SearchViewCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.SearchViewCompat.html
@@ -94,7 +94,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.TextViewCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.TextViewCompat.html
index e2078f4f9e54..e3a0f9a45c8c 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.TextViewCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v4.widget.TextViewCompat.html
@@ -109,7 +109,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.app.AppCompatDelegate.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.app.AppCompatDelegate.html
index 6fd286c48ecf..2dbee4327cd1 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.app.AppCompatDelegate.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.app.AppCompatDelegate.html
@@ -172,7 +172,7 @@ Class android.support.v7.app.<A HREF="../../../../reference/android/support/v7/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.attr.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.attr.html
index c399a8addc45..2a2364abcc26 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.attr.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.attr.html
@@ -122,7 +122,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.drawable.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.drawable.html
index ec1ee3842dd3..a2e1dc3c1431 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.drawable.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.drawable.html
@@ -347,7 +347,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.style.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.style.html
index 478d3338439e..32befe4ad6ee 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.style.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.style.html
@@ -178,7 +178,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.styleable.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.styleable.html
index 498ec5126e73..6433bc228dd7 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.styleable.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.appcompat.R.styleable.html
@@ -1705,7 +1705,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.graphics.Palette.Builder.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.graphics.Palette.Builder.html
index 83f441b3ec15..2758189686af 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.graphics.Palette.Builder.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.graphics.Palette.Builder.html
@@ -140,7 +140,7 @@ Class android.support.v7.graphics.<A HREF="../../../../reference/android/support
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.graphics.Palette.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.graphics.Palette.html
index be157a79f768..d7752f527156 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.graphics.Palette.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.graphics.Palette.html
@@ -122,7 +122,7 @@ Class android.support.v7.graphics.<A HREF="../../../../reference/android/support
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouteDescriptor.Builder.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouteDescriptor.Builder.html
index 7db6666146f8..9181648314e9 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouteDescriptor.Builder.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouteDescriptor.Builder.html
@@ -115,7 +115,7 @@ Class android.support.v7.media.<A HREF="../../../../reference/android/support/v7
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouteDescriptor.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouteDescriptor.html
index 315ba3dd81d9..0cb71cf48634 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouteDescriptor.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouteDescriptor.html
@@ -108,7 +108,7 @@ Class android.support.v7.media.<A HREF="../../../../reference/android/support/v7
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouter.Callback.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouter.Callback.html
index 66be68d45da8..5d6800677ca3 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouter.Callback.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.media.MediaRouter.Callback.html
@@ -108,7 +108,7 @@ Class android.support.v7.media.<A HREF="../../../../reference/android/support/v7
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceFragmentCompat.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceFragmentCompat.html
index 68aa733bc13d..980ff0d172d7 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceFragmentCompat.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceFragmentCompat.html
@@ -115,7 +115,7 @@ Class android.support.v7.preference.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceScreen.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceScreen.html
index 12de78c8eb92..de14ee0913d1 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceScreen.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceScreen.html
@@ -115,7 +115,7 @@ Class android.support.v7.preference.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceViewHolder.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceViewHolder.html
index b27e66cf0baa..0597c2a3d25c 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceViewHolder.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.preference.PreferenceViewHolder.html
@@ -129,7 +129,7 @@ Class android.support.v7.preference.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.recyclerview.R.dimen.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.recyclerview.R.dimen.html
index b38c6dc4d7d3..a56e1123c34b 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.recyclerview.R.dimen.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.recyclerview.R.dimen.html
@@ -115,7 +115,7 @@ Class android.support.v7.recyclerview.<A HREF="../../../../reference/android/sup
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.OrientationHelper.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.OrientationHelper.html
index 6a2a9b3b8cc6..911187739f40 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.OrientationHelper.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.OrientationHelper.html
@@ -115,7 +115,7 @@ Class android.support.v7.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.ItemAnimator.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.ItemAnimator.html
index 95e642eaa12c..a641975eeafa 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.ItemAnimator.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.ItemAnimator.html
@@ -108,7 +108,7 @@ Class android.support.v7.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.LayoutManager.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.LayoutManager.html
index 30b0a78ae774..173d636ce35e 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.LayoutManager.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.LayoutManager.html
@@ -193,7 +193,7 @@ Class android.support.v7.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.State.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.State.html
index 2b3ac61e8c38..86d91dcd890b 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.State.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.State.html
@@ -108,7 +108,7 @@ Class android.support.v7.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.html
index 5cdc7a0d5d54..a53430bab12f 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.RecyclerView.html
@@ -115,7 +115,7 @@ Class android.support.v7.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.helper.ItemTouchHelper.Callback.html b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.helper.ItemTouchHelper.Callback.html
index 1237408536c8..b241e6e4313b 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.helper.ItemTouchHelper.Callback.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/android.support.v7.widget.helper.ItemTouchHelper.Callback.html
@@ -115,7 +115,7 @@ Class android.support.v7.widget.helper.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/changes-summary.html b/docs/html/sdk/support_api_diff/23.2.0/changes/changes-summary.html
index d41ec1fc46ff..431b2ae20843 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/changes-summary.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/changes-summary.html
@@ -352,7 +352,7 @@ see the <a href="http://developer.android.com/index.html" target="_top">Android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23.2.0/changes/classes_index_additions.html b/docs/html/sdk/support_api_diff/23.2.0/changes/classes_index_additions.html
index a2e1d4477e28..eb0457cf2665 100644
--- a/docs/html/sdk/support_api_diff/23.2.0/changes/classes_index_additions.html
+++ b/docs/html/sdk/support_api_diff/23.2.0/changes/classes_index_additions.html
@@ -143,7 +143,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<A HREF="pkg_android.support.v17.leanback.widget.html#ViewHolderTask" class="hiddenlink" target="rightframe"><b><i>ViewHolderTask</i></b></A><br>
<A HREF="pkg_android.support.design.widget.html#VisibilityAwareImageButton" class="hiddenlink" target="rightframe"><b>VisibilityAwareImageButton</b></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_additions.html b/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_additions.html
index 78c94e1cc5ca..c526b4513f97 100644
--- a/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_additions.html
+++ b/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_additions.html
@@ -1128,7 +1128,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v7.appcompat.R.style.html#android.support.v7.appcompat.R.style.Widget_AppCompat_Button_Colored" class="hiddenlink" target="rightframe">Widget_AppCompat_Button_Colored</A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_all.html b/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_all.html
index f39d82ee96fc..61459adbcb03 100644
--- a/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_all.html
+++ b/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_all.html
@@ -1457,7 +1457,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v7.appcompat.R.style.html#android.support.v7.appcompat.R.style.Widget_AppCompat_Button_Colored" class="hiddenlink" target="rightframe">Widget_AppCompat_Button_Colored</A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_changes.html b/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_changes.html
index debbb14378c6..0a63a58f84cb 100644
--- a/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_changes.html
+++ b/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_changes.html
@@ -485,7 +485,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<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>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_removals.html b/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_removals.html
index a6cdb59d1d4c..9f13a01218d8 100644
--- a/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_removals.html
+++ b/docs/html/sdk/support_api_diff/23/changes/alldiffs_index_removals.html
@@ -332,7 +332,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<!-- Field View_backgroundTintMode -->
<nobr><A HREF="android.support.v7.appcompat.R.styleable.html#android.support.v7.appcompat.R.styleable.View_backgroundTintMode" class="hiddenlink" target="rightframe"><strike>View_backgroundTintMode</strike></A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.AppBarLayout.Behavior.html b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.AppBarLayout.Behavior.html
index a6bbf2d04d25..352dcfdc3c81 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.AppBarLayout.Behavior.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.AppBarLayout.Behavior.html
@@ -115,7 +115,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.AppBarLayout.html b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.AppBarLayout.html
index 71e3167308f1..cd2a11f5cce4 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.AppBarLayout.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.AppBarLayout.html
@@ -115,7 +115,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.CollapsingToolbarLayout.html b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.CollapsingToolbarLayout.html
index 7244be9cc784..d80f7ee073ca 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.CollapsingToolbarLayout.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.CollapsingToolbarLayout.html
@@ -150,7 +150,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.NavigationView.html b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.NavigationView.html
index a38990abe580..5dd3104f32d4 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.NavigationView.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.NavigationView.html
@@ -115,7 +115,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.Snackbar.html b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.Snackbar.html
index 9a53448a5a01..22472973e717 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.Snackbar.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.Snackbar.html
@@ -116,7 +116,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TabLayout.Tab.html b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TabLayout.Tab.html
index b7a01f576881..a0ea0521bc73 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TabLayout.Tab.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TabLayout.Tab.html
@@ -108,7 +108,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TabLayout.html b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TabLayout.html
index df626ac941b7..bd3c8e67cc56 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TabLayout.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TabLayout.html
@@ -115,7 +115,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TextInputLayout.html b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TextInputLayout.html
index 471e267b367c..a9a7b49e2474 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TextInputLayout.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.design.widget.TextInputLayout.html
@@ -165,7 +165,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v13.app.FragmentCompat.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v13.app.FragmentCompat.html
index 9eb5b245f354..b61fb5a32080 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v13.app.FragmentCompat.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v13.app.FragmentCompat.html
@@ -115,7 +115,7 @@ Class android.support.v13.app.<A HREF="../../../../reference/android/support/v13
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder.html
index 3c6165fb8745..f189083bb3c3 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.html
index b6d886306408..cb2156ac885f 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.html
@@ -179,7 +179,7 @@ Change from non-final to final.<br>
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.animation.AnimatorCompatHelper.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.animation.AnimatorCompatHelper.html
index 092a6c3589d0..5d5a9fcdcf55 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.animation.AnimatorCompatHelper.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.animation.AnimatorCompatHelper.html
@@ -108,7 +108,7 @@ Class android.support.v4.animation.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.ActivityCompat.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.ActivityCompat.html
index 76e8ce9b08d6..c318b707d8a3 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.ActivityCompat.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.ActivityCompat.html
@@ -122,7 +122,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.Fragment.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.Fragment.html
index 53a8bd5bf73b..2f56f59c853b 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.Fragment.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.Fragment.html
@@ -190,7 +190,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.FragmentActivity.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.FragmentActivity.html
index 8d2321ff611d..0338069e6485 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.FragmentActivity.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.app.FragmentActivity.html
@@ -109,7 +109,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.AsyncTaskLoader.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.AsyncTaskLoader.html
index 19be27cc7d6f..5dfbe6c5e769 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.AsyncTaskLoader.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.AsyncTaskLoader.html
@@ -133,7 +133,7 @@ Method was locally defined, but is now inherited from <a href="../../../../refer
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.ContextCompat.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.ContextCompat.html
index 6ed5b3e3ac5e..64d09ac6b48e 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.ContextCompat.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.ContextCompat.html
@@ -122,7 +122,7 @@ Class android.support.v4.content.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.Loader.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.Loader.html
index d4c3bb0b781a..f97def1f1c77 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.Loader.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.content.Loader.html
@@ -136,7 +136,7 @@ Class android.support.v4.content.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.graphics.drawable.DrawableCompat.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.graphics.drawable.DrawableCompat.html
index 87fefee0b008..ca42f3dd1e5c 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.graphics.drawable.DrawableCompat.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.graphics.drawable.DrawableCompat.html
@@ -115,7 +115,7 @@ Class android.support.v4.graphics.drawable.<A HREF="../../../../reference/androi
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.graphics.drawable.RoundedBitmapDrawable.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.graphics.drawable.RoundedBitmapDrawable.html
index 7c72cf4c42ed..793bd8bd06fb 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.graphics.drawable.RoundedBitmapDrawable.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.graphics.drawable.RoundedBitmapDrawable.html
@@ -115,7 +115,7 @@ Class android.support.v4.graphics.drawable.<A HREF="../../../../reference/androi
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.MediaDescriptionCompat.Builder.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.MediaDescriptionCompat.Builder.html
index c429c390a90a..6ae7186412ac 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.MediaDescriptionCompat.Builder.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.MediaDescriptionCompat.Builder.html
@@ -108,7 +108,7 @@ Class android.support.v4.media.<A HREF="../../../../reference/android/support/v4
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.MediaDescriptionCompat.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.MediaDescriptionCompat.html
index 4053435dab54..dde12a5ed96f 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.MediaDescriptionCompat.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.MediaDescriptionCompat.html
@@ -108,7 +108,7 @@ Class android.support.v4.media.<A HREF="../../../../reference/android/support/v4
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.MediaControllerCompat.TransportControls.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.MediaControllerCompat.TransportControls.html
index 4d10769fd07b..12743cd34a01 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.MediaControllerCompat.TransportControls.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.MediaControllerCompat.TransportControls.html
@@ -108,7 +108,7 @@ Class android.support.v4.media.session.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.MediaSessionCompat.Callback.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.MediaSessionCompat.Callback.html
index a0bbbf6a5eb9..4acf244465e1 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.MediaSessionCompat.Callback.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.MediaSessionCompat.Callback.html
@@ -108,7 +108,7 @@ Class android.support.v4.media.session.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.PlaybackStateCompat.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.PlaybackStateCompat.html
index 29e5f0b47b57..0f568c4216bf 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.PlaybackStateCompat.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.media.session.PlaybackStateCompat.html
@@ -108,7 +108,7 @@ Class android.support.v4.media.session.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.text.ICUCompat.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.text.ICUCompat.html
index 5f9f31e995c1..e357c503f9cc 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.text.ICUCompat.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.text.ICUCompat.html
@@ -130,7 +130,7 @@ Class android.support.v4.text.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.ViewCompat.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.ViewCompat.html
index 548502c7bfaf..caaf19a553e0 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.ViewCompat.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.ViewCompat.html
@@ -122,7 +122,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.html
index ce98f64f22eb..c60e7e1db489 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.html
@@ -255,7 +255,7 @@ Class android.support.v4.view.accessibility.<A HREF="../../../../reference/andro
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.html
index f3ef6667adc2..6f2e809edb4d 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.html
@@ -361,7 +361,7 @@ Class android.support.v4.view.accessibility.<A HREF="../../../../reference/andro
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.DrawerLayout.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.DrawerLayout.html
index 3297157ab8b0..c18ae6ccb280 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.DrawerLayout.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.DrawerLayout.html
@@ -115,7 +115,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.ExploreByTouchHelper.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.ExploreByTouchHelper.html
index 4026cd28aa61..be8512f38324 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.ExploreByTouchHelper.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.ExploreByTouchHelper.html
@@ -123,7 +123,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.PopupWindowCompat.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.PopupWindowCompat.html
index 8a9b9c619a8d..284dab4b5bdc 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.PopupWindowCompat.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.PopupWindowCompat.html
@@ -129,7 +129,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.SwipeRefreshLayout.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.SwipeRefreshLayout.html
index 91a99cbb6b7e..1fb912ff3af4 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.SwipeRefreshLayout.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v4.widget.SwipeRefreshLayout.html
@@ -94,7 +94,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.app.AppCompatDelegate.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.app.AppCompatDelegate.html
index 42ef2892f28c..9f768b95519f 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.app.AppCompatDelegate.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.app.AppCompatDelegate.html
@@ -137,7 +137,7 @@ Class android.support.v7.app.<A HREF="../../../../reference/android/support/v7/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.attr.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.attr.html
index cc285164bb56..98d2c2c9b8d2 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.attr.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.attr.html
@@ -221,7 +221,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.color.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.color.html
index 5f1a3f6780ad..852d5952d773 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.color.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.color.html
@@ -193,7 +193,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.dimen.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.dimen.html
index c4fba92a0024..893ea2540766 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.dimen.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.dimen.html
@@ -158,7 +158,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.drawable.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.drawable.html
index 0bf5ce1c7da6..482e9ffa91f1 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.drawable.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.drawable.html
@@ -144,7 +144,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.id.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.id.html
index 2b34b3a2125e..818a5b09c321 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.id.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.id.html
@@ -115,7 +115,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.layout.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.layout.html
index 9d249030b481..a0a33fb0f0dc 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.layout.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.layout.html
@@ -108,7 +108,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.style.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.style.html
index 8b16f1c3e6f5..d084de050676 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.style.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.style.html
@@ -207,7 +207,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.styleable.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.styleable.html
index 53653763eb3e..c021cbeac42e 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.styleable.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.styleable.html
@@ -333,7 +333,7 @@ Class android.support.v7.appcompat.<A HREF="../../../../reference/android/suppor
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.graphics.Palette.Builder.html b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.graphics.Palette.Builder.html
index 38934414613f..e7077306ed3a 100644
--- a/docs/html/sdk/support_api_diff/23/changes/android.support.v7.graphics.Palette.Builder.html
+++ b/docs/html/sdk/support_api_diff/23/changes/android.support.v7.graphics.Palette.Builder.html
@@ -115,7 +115,7 @@ Class android.support.v7.graphics.<A HREF="../../../../reference/android/support
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/changes-summary.html b/docs/html/sdk/support_api_diff/23/changes/changes-summary.html
index 3deee46e1c75..75c1eb327d81 100644
--- a/docs/html/sdk/support_api_diff/23/changes/changes-summary.html
+++ b/docs/html/sdk/support_api_diff/23/changes/changes-summary.html
@@ -310,7 +310,7 @@ see the <a href="http://developer.android.com/index.html" target="_top">Android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/classes_index_additions.html b/docs/html/sdk/support_api_diff/23/changes/classes_index_additions.html
index 094fff50177a..bc6961685765 100644
--- a/docs/html/sdk/support_api_diff/23/changes/classes_index_additions.html
+++ b/docs/html/sdk/support_api_diff/23/changes/classes_index_additions.html
@@ -160,7 +160,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="pkg_android.support.v4.content.html#SharedPreferencesCompat" class="hiddenlink" target="rightframe"><b>SharedPreferencesCompat</b></A><br>
<A HREF="pkg_android.support.v4.content.html#SharedPreferencesCompat.EditorCompat" class="hiddenlink" target="rightframe"><b>SharedPreferencesCompat.EditorCompat</b></A><br>
<A HREF="pkg_android.support.design.widget.html#Snackbar.Callback" class="hiddenlink" target="rightframe"><b>Snackbar.Callback</b></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/classes_index_all.html b/docs/html/sdk/support_api_diff/23/changes/classes_index_all.html
index cb1ed5f0bb7e..33a23bfe6873 100644
--- a/docs/html/sdk/support_api_diff/23/changes/classes_index_all.html
+++ b/docs/html/sdk/support_api_diff/23/changes/classes_index_all.html
@@ -419,7 +419,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<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>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/classes_index_changes.html b/docs/html/sdk/support_api_diff/23/changes/classes_index_changes.html
index b674f278b859..9588a73b801a 100644
--- a/docs/html/sdk/support_api_diff/23/changes/classes_index_changes.html
+++ b/docs/html/sdk/support_api_diff/23/changes/classes_index_changes.html
@@ -328,7 +328,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<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>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/classes_index_removals.html b/docs/html/sdk/support_api_diff/23/changes/classes_index_removals.html
index e6da73f487d3..c4662980dd50 100644
--- a/docs/html/sdk/support_api_diff/23/changes/classes_index_removals.html
+++ b/docs/html/sdk/support_api_diff/23/changes/classes_index_removals.html
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/constructors_index_additions.html b/docs/html/sdk/support_api_diff/23/changes/constructors_index_additions.html
index d1e52154ec8e..ae8c0d333f10 100644
--- a/docs/html/sdk/support_api_diff/23/changes/constructors_index_additions.html
+++ b/docs/html/sdk/support_api_diff/23/changes/constructors_index_additions.html
@@ -53,7 +53,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.design.widget.TextInputLayout.html#android.support.design.widget.TextInputLayout.ctor_added(android.content.Context, android.util.AttributeSet, int)" class="hiddenlink" target="rightframe"><b>TextInputLayout</b>
(<code>Context, AttributeSet, int</code>)</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/constructors_index_all.html b/docs/html/sdk/support_api_diff/23/changes/constructors_index_all.html
index 4618d885d12d..401df5710af9 100644
--- a/docs/html/sdk/support_api_diff/23/changes/constructors_index_all.html
+++ b/docs/html/sdk/support_api_diff/23/changes/constructors_index_all.html
@@ -53,7 +53,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.design.widget.TextInputLayout.html#android.support.design.widget.TextInputLayout.ctor_added(android.content.Context, android.util.AttributeSet, int)" class="hiddenlink" target="rightframe"><b>TextInputLayout</b>
(<code>Context, AttributeSet, int</code>)</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/constructors_index_changes.html b/docs/html/sdk/support_api_diff/23/changes/constructors_index_changes.html
index a5ca2efd88f9..122cdce9a3c0 100644
--- a/docs/html/sdk/support_api_diff/23/changes/constructors_index_changes.html
+++ b/docs/html/sdk/support_api_diff/23/changes/constructors_index_changes.html
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/constructors_index_removals.html b/docs/html/sdk/support_api_diff/23/changes/constructors_index_removals.html
index 74a09badbd99..dadd1cd2bd10 100644
--- a/docs/html/sdk/support_api_diff/23/changes/constructors_index_removals.html
+++ b/docs/html/sdk/support_api_diff/23/changes/constructors_index_removals.html
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/fields_index_additions.html b/docs/html/sdk/support_api_diff/23/changes/fields_index_additions.html
index 2f6ac9ca7f42..f9137b82a365 100644
--- a/docs/html/sdk/support_api_diff/23/changes/fields_index_additions.html
+++ b/docs/html/sdk/support_api_diff/23/changes/fields_index_additions.html
@@ -444,7 +444,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v7.appcompat.R.style.html#android.support.v7.appcompat.R.style.Widget_AppCompat_Button_Colored" class="hiddenlink" target="rightframe">Widget_AppCompat_Button_Colored</A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/fields_index_all.html b/docs/html/sdk/support_api_diff/23/changes/fields_index_all.html
index a7f5e18aee00..909dbcc4c482 100644
--- a/docs/html/sdk/support_api_diff/23/changes/fields_index_all.html
+++ b/docs/html/sdk/support_api_diff/23/changes/fields_index_all.html
@@ -538,7 +538,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v7.appcompat.R.style.html#android.support.v7.appcompat.R.style.Widget_AppCompat_Button_Colored" class="hiddenlink" target="rightframe">Widget_AppCompat_Button_Colored</A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/fields_index_changes.html b/docs/html/sdk/support_api_diff/23/changes/fields_index_changes.html
index 0e2ccff6c01b..301881a9cc49 100644
--- a/docs/html/sdk/support_api_diff/23/changes/fields_index_changes.html
+++ b/docs/html/sdk/support_api_diff/23/changes/fields_index_changes.html
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/fields_index_removals.html b/docs/html/sdk/support_api_diff/23/changes/fields_index_removals.html
index 502737450bef..174a5768fa73 100644
--- a/docs/html/sdk/support_api_diff/23/changes/fields_index_removals.html
+++ b/docs/html/sdk/support_api_diff/23/changes/fields_index_removals.html
@@ -241,7 +241,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</nobr><br>
<nobr><A HREF="android.support.v7.appcompat.R.styleable.html#android.support.v7.appcompat.R.styleable.View_backgroundTintMode" class="hiddenlink" target="rightframe"><strike>View_backgroundTintMode</strike></A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/jdiff_help.html b/docs/html/sdk/support_api_diff/23/changes/jdiff_help.html
index acb8508c33c6..125d4e84c1ee 100644
--- a/docs/html/sdk/support_api_diff/23/changes/jdiff_help.html
+++ b/docs/html/sdk/support_api_diff/23/changes/jdiff_help.html
@@ -120,7 +120,7 @@ These links show and hide the HTML frames. All pages are available with or witho
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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/jdiff_statistics.html b/docs/html/sdk/support_api_diff/23/changes/jdiff_statistics.html
index 4480788c5940..1e865b76ee55 100644
--- a/docs/html/sdk/support_api_diff/23/changes/jdiff_statistics.html
+++ b/docs/html/sdk/support_api_diff/23/changes/jdiff_statistics.html
@@ -467,7 +467,7 @@ added, the change will be 100%.</p>
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/jdiff_topleftframe.html b/docs/html/sdk/support_api_diff/23/changes/jdiff_topleftframe.html
index 36f9836e4478..6a2e76e10fc2 100644
--- a/docs/html/sdk/support_api_diff/23/changes/jdiff_topleftframe.html
+++ b/docs/html/sdk/support_api_diff/23/changes/jdiff_topleftframe.html
@@ -49,7 +49,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/methods_index_additions.html b/docs/html/sdk/support_api_diff/23/changes/methods_index_additions.html
index 3cec9a317ed7..c3e41767344f 100644
--- a/docs/html/sdk/support_api_diff/23/changes/methods_index_additions.html
+++ b/docs/html/sdk/support_api_diff/23/changes/methods_index_additions.html
@@ -529,7 +529,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v4.app.FragmentActivity.html#android.support.v4.app.FragmentActivity.validateRequestPermissionsRequestCode_added(int)" class="hiddenlink" target="rightframe"><b>validateRequestPermissionsRequestCode</b>
(<code>int</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/methods_index_all.html b/docs/html/sdk/support_api_diff/23/changes/methods_index_all.html
index 072b2ffc7feb..7b2f1d4f0b1e 100644
--- a/docs/html/sdk/support_api_diff/23/changes/methods_index_all.html
+++ b/docs/html/sdk/support_api_diff/23/changes/methods_index_all.html
@@ -550,7 +550,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v4.app.FragmentActivity.html#android.support.v4.app.FragmentActivity.validateRequestPermissionsRequestCode_added(int)" class="hiddenlink" target="rightframe"><b>validateRequestPermissionsRequestCode</b>
(<code>int</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/methods_index_changes.html b/docs/html/sdk/support_api_diff/23/changes/methods_index_changes.html
index d1905806df10..90a0a23410d6 100644
--- a/docs/html/sdk/support_api_diff/23/changes/methods_index_changes.html
+++ b/docs/html/sdk/support_api_diff/23/changes/methods_index_changes.html
@@ -83,7 +83,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.html#android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.setBackgroundColor_changed(int)" class="hiddenlink" target="rightframe">setBackgroundColor
(<code>int</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/methods_index_removals.html b/docs/html/sdk/support_api_diff/23/changes/methods_index_removals.html
index 251757501c08..ce89d27006e0 100644
--- a/docs/html/sdk/support_api_diff/23/changes/methods_index_removals.html
+++ b/docs/html/sdk/support_api_diff/23/changes/methods_index_removals.html
@@ -71,7 +71,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v4.app.Fragment.html#android.support.v4.app.Fragment.onAttach_removed(android.app.Activity)" class="hiddenlink" target="rightframe"><strike>onAttach</strike>
(<code>Activity</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/packages_index_additions.html b/docs/html/sdk/support_api_diff/23/changes/packages_index_additions.html
index 446ee581ec52..fc6d24dc0a8e 100644
--- a/docs/html/sdk/support_api_diff/23/changes/packages_index_additions.html
+++ b/docs/html/sdk/support_api_diff/23/changes/packages_index_additions.html
@@ -59,7 +59,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="changes-summary.html#android.support.v7.graphics.drawable" class="hiddenlink" target="rightframe"><b>android.support.v7.graphics.drawable</b></A><br>
<A HREF="changes-summary.html#android.support.v7.preference" class="hiddenlink" target="rightframe"><b>android.support.v7.preference</b></A><br>
<A HREF="changes-summary.html#android.support.v8.renderscript" class="hiddenlink" target="rightframe"><b>android.support.v8.renderscript</b></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/packages_index_all.html b/docs/html/sdk/support_api_diff/23/changes/packages_index_all.html
index d1dbbe19697f..c770167a84f8 100644
--- a/docs/html/sdk/support_api_diff/23/changes/packages_index_all.html
+++ b/docs/html/sdk/support_api_diff/23/changes/packages_index_all.html
@@ -77,7 +77,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="changes-summary.html#android.support.v7.preference" class="hiddenlink" target="rightframe"><b>android.support.v7.preference</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.v8.renderscript" class="hiddenlink" target="rightframe"><b>android.support.v8.renderscript</b></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/packages_index_changes.html b/docs/html/sdk/support_api_diff/23/changes/packages_index_changes.html
index 730633e52a31..2140313b24e5 100644
--- a/docs/html/sdk/support_api_diff/23/changes/packages_index_changes.html
+++ b/docs/html/sdk/support_api_diff/23/changes/packages_index_changes.html
@@ -68,7 +68,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="pkg_android.support.v7.appcompat.html" class="hiddenlink" target="rightframe">android.support.v7.appcompat</A><br>
<A HREF="pkg_android.support.v7.graphics.html" class="hiddenlink" target="rightframe">android.support.v7.graphics</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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/packages_index_removals.html b/docs/html/sdk/support_api_diff/23/changes/packages_index_removals.html
index d0ffabcf3c5b..d5a825d09b67 100644
--- a/docs/html/sdk/support_api_diff/23/changes/packages_index_removals.html
+++ b/docs/html/sdk/support_api_diff/23/changes/packages_index_removals.html
@@ -49,7 +49,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</div>
<br>
<div id="indexTableEntries">
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.design.widget.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.design.widget.html
index a8630f709352..6ebc3a7c4411 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.design.widget.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.design.widget.html
@@ -169,7 +169,7 @@ Package <A HREF="../../../../reference/android/support/design/widget/package-sum
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v13.app.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v13.app.html
index c56e8a44b6f9..877fd6c695cb 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v13.app.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v13.app.html
@@ -120,7 +120,7 @@ Package <A HREF="../../../../reference/android/support/v13/app/package-summary.h
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v17.leanback.widget.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v17.leanback.widget.html
index 3d7f780c7ac8..ea3848e0974a 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v17.leanback.widget.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v17.leanback.widget.html
@@ -112,7 +112,7 @@ Package <A HREF="../../../../reference/android/support/v17/leanback/widget/packa
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.animation.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.animation.html
index 36965dd20340..4a51cf863411 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.animation.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.animation.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v4/animation/package-summ
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.app.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.app.html
index 692e7ef7c76e..9fbee40602be 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.app.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.app.html
@@ -176,7 +176,7 @@ Package <A HREF="../../../../reference/android/support/v4/app/package-summary.ht
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.content.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.content.html
index 44e9f8113c43..9e654a679bb9 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.content.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.content.html
@@ -169,7 +169,7 @@ Package <A HREF="../../../../reference/android/support/v4/content/package-summar
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.graphics.drawable.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.graphics.drawable.html
index 6139c8e5630a..de7756194132 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.graphics.drawable.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.graphics.drawable.html
@@ -112,7 +112,7 @@ Package <A HREF="../../../../reference/android/support/v4/graphics/drawable/pack
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.media.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.media.html
index e6fe510e7796..761e746c45c8 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.media.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.media.html
@@ -112,7 +112,7 @@ Package <A HREF="../../../../reference/android/support/v4/media/package-summary.
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.media.session.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.media.session.html
index 9b0e47201783..18893f4669a0 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.media.session.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.media.session.html
@@ -119,7 +119,7 @@ Package <A HREF="../../../../reference/android/support/v4/media/session/package-
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.os.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.os.html
index 9a76a7b3c86d..2ed8d04b92d8 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.os.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.os.html
@@ -119,7 +119,7 @@ Package <A HREF="../../../../reference/android/support/v4/os/package-summary.htm
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.text.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.text.html
index b2a178a38e32..c995ed89ce7f 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.text.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.text.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v4/text/package-summary.h
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.view.accessibility.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.view.accessibility.html
index dcdbc56ed08f..ec695566d0fc 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.view.accessibility.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.view.accessibility.html
@@ -127,7 +127,7 @@ Package <A HREF="../../../../reference/android/support/v4/view/accessibility/pac
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.view.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.view.html
index 2a955d3bd645..2361c0f2c23a 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.view.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.view.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v4/view/package-summary.h
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.widget.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.widget.html
index 482bf1f45f21..c6b5e0cef15d 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.widget.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v4.widget.html
@@ -141,7 +141,7 @@ Package <A HREF="../../../../reference/android/support/v4/widget/package-summary
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.app.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.app.html
index 1dd5425e6fe4..a99b64120c95 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.app.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.app.html
@@ -120,7 +120,7 @@ Package <A HREF="../../../../reference/android/support/v7/app/package-summary.ht
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.appcompat.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.appcompat.html
index e01427867212..eb5ed0891914 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.appcompat.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.appcompat.html
@@ -154,7 +154,7 @@ Package <A HREF="../../../../reference/android/support/v7/appcompat/package-summ
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.graphics.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.graphics.html
index cb6c97b7003c..9f88138919ce 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.graphics.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.graphics.html
@@ -120,7 +120,7 @@ Package <A HREF="../../../../reference/android/support/v7/graphics/package-summa
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.util.html b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.util.html
index cc0065dc3de6..e4da2298593d 100644
--- a/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.util.html
+++ b/docs/html/sdk/support_api_diff/23/changes/pkg_android.support.v7.util.html
@@ -119,7 +119,7 @@ Package <A HREF="../../../../reference/android/support/v7/util/package-summary.h
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_additions.html b/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_additions.html
index cb62aa8af30b..f73d864f75b0 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_additions.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_additions.html
@@ -933,7 +933,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v4.view.WindowInsetsCompat.html#android.support.v4.view.WindowInsetsCompat.ctor_added(android.support.v4.view.WindowInsetsCompat)" class="hiddenlink" target="rightframe"><b>WindowInsetsCompat</b>
(<code>WindowInsetsCompat</code>)</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_all.html b/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_all.html
index 719f9af4a8d8..fb553f8eebd0 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_all.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_all.html
@@ -1313,7 +1313,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<!-- Constructor WindowInsetsCompat -->
&nbsp;&nbsp;<nobr><A HREF="android.support.v4.view.WindowInsetsCompat.html#android.support.v4.view.WindowInsetsCompat.ctor_added(android.support.v4.view.WindowInsetsCompat)" class="hiddenlink" target="rightframe"><b>WindowInsetsCompat</b>
(<code>WindowInsetsCompat</code>)</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_changes.html b/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_changes.html
index 854a487c4074..4718b46ab1ce 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_changes.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_changes.html
@@ -652,7 +652,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.support.v4.view.WindowInsetsCompat.html" class="hiddenlink" target="rightframe">WindowInsetsCompat</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_removals.html b/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_removals.html
index e6d9e07460e8..179472a32266 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_removals.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/alldiffs_index_removals.html
@@ -110,7 +110,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v7.widget.StaggeredGridLayoutManager.html#android.support.v7.widget.StaggeredGridLayoutManager.TAG" class="hiddenlink" target="rightframe"><strike>TAG</strike></A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html
index d6a9415c8a26..41ac3685bdae 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsIntent.Builder.html
@@ -108,7 +108,7 @@ Class android.support.customtabs.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsIntent.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsIntent.html
index dd0b5118a983..c4f0bfb10467 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsIntent.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsIntent.html
@@ -130,7 +130,7 @@ Class android.support.customtabs.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsSession.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsSession.html
index 16cac319e36b..1ccaab30114c 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsSession.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.customtabs.CustomTabsSession.html
@@ -126,7 +126,7 @@ Class android.support.customtabs.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html
index 7e1e59a443a0..ad3dfd83a5b4 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.AppBarLayout.ScrollingViewBehavior.html
@@ -108,7 +108,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.BottomSheetBehavior.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.BottomSheetBehavior.html
index e98c6f338f75..22984b8b4ccf 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.BottomSheetBehavior.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.BottomSheetBehavior.html
@@ -108,7 +108,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CollapsingToolbarLayout.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CollapsingToolbarLayout.html
index ebfdce11e38c..a20a1edc31c1 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CollapsingToolbarLayout.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CollapsingToolbarLayout.html
@@ -115,7 +115,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.Behavior.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.Behavior.html
index 8cf6146a5463..edc96ed9c48b 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.Behavior.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.Behavior.html
@@ -147,7 +147,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.LayoutParams.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.LayoutParams.html
index a36eab08e017..445da889f896 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.LayoutParams.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.LayoutParams.html
@@ -115,7 +115,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.html
index 4a7247a37caa..3ba5c1e3b31e 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.CoordinatorLayout.html
@@ -109,7 +109,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.FloatingActionButton.Behavior.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.FloatingActionButton.Behavior.html
index 633db38b7445..07099d61ad16 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.FloatingActionButton.Behavior.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.FloatingActionButton.Behavior.html
@@ -144,7 +144,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.TabLayout.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.TabLayout.html
index 01d4b6dbf6ee..a09656a8efb6 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.TabLayout.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.TabLayout.html
@@ -108,7 +108,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.TextInputLayout.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.TextInputLayout.html
index ecd6fd4ea321..9ad13eb8cd04 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.TextInputLayout.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.design.widget.TextInputLayout.html
@@ -171,7 +171,7 @@ Class android.support.design.widget.<A HREF="../../../../reference/android/suppo
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v14.preference.PreferenceFragment.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v14.preference.PreferenceFragment.html
index 9b31c9e55612..6b23c1781f61 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v14.preference.PreferenceFragment.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v14.preference.PreferenceFragment.html
@@ -94,7 +94,7 @@ Class android.support.v14.preference.<A HREF="../../../../reference/android/supp
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder.html
index 9df653650403..9f1f00cc9d6c 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder.html
@@ -136,7 +136,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.AbstractMediaItemPresenter.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.AbstractMediaItemPresenter.html
index 16b03ad052b2..a0b0aa984a48 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.AbstractMediaItemPresenter.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.AbstractMediaItemPresenter.html
@@ -151,7 +151,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.ObjectAdapter.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.ObjectAdapter.html
index 3e3ded03b782..3dad1a2b118d 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.ObjectAdapter.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.leanback.widget.ObjectAdapter.html
@@ -108,7 +108,7 @@ Class android.support.v17.leanback.widget.<A HREF="../../../../reference/android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.preference.LeanbackSettingsFragment.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.preference.LeanbackSettingsFragment.html
index 6e544651e2a9..690328a53b53 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.preference.LeanbackSettingsFragment.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v17.preference.LeanbackSettingsFragment.html
@@ -94,7 +94,7 @@ Class android.support.v17.preference.<A HREF="../../../../reference/android/supp
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat.html
index 0600e440cc88..a353745260f4 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat.html
@@ -126,7 +126,7 @@ Class android.support.v4.accessibilityservice.<A HREF="../../../../reference/and
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ActivityCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ActivityCompat.html
index 74ae6f61e93c..95b4fc69d6a0 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ActivityCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ActivityCompat.html
@@ -129,7 +129,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ActivityOptionsCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ActivityOptionsCompat.html
index ce96b49d4ca4..e675b7fd0749 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ActivityOptionsCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ActivityOptionsCompat.html
@@ -165,7 +165,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.FragmentController.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.FragmentController.html
index 13b2ce1f0d12..dfc1a60da373 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.FragmentController.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.FragmentController.html
@@ -108,7 +108,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ServiceCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ServiceCompat.html
index 6a404ebc691e..211a88f03b00 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ServiceCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.ServiceCompat.html
@@ -130,7 +130,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.SharedElementCallback.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.SharedElementCallback.html
index 1495fb4887de..73940592f238 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.SharedElementCallback.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.app.SharedElementCallback.html
@@ -108,7 +108,7 @@ Class android.support.v4.app.<A HREF="../../../../reference/android/support/v4/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.content.ContextCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.content.ContextCompat.html
index 1d6b9b1df4e5..b6157a2468dc 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.content.ContextCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.content.ContextCompat.html
@@ -111,7 +111,7 @@ Class android.support.v4.content.<A HREF="../../../../reference/android/support/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.graphics.drawable.DrawableCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.graphics.drawable.DrawableCompat.html
index 3408caa78122..92f1ba40d4ee 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.graphics.drawable.DrawableCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.graphics.drawable.DrawableCompat.html
@@ -108,7 +108,7 @@ Class android.support.v4.graphics.drawable.<A HREF="../../../../reference/androi
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaBrowserCompat.MediaItem.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaBrowserCompat.MediaItem.html
index acc16c1541d0..52da3d4fb553 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaBrowserCompat.MediaItem.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaBrowserCompat.MediaItem.html
@@ -115,7 +115,7 @@ Class android.support.v4.media.<A HREF="../../../../reference/android/support/v4
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaBrowserServiceCompat.BrowserRoot.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaBrowserServiceCompat.BrowserRoot.html
index 7a9c7331195d..7ea97f3bd552 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaBrowserServiceCompat.BrowserRoot.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaBrowserServiceCompat.BrowserRoot.html
@@ -108,7 +108,7 @@ Class android.support.v4.media.<A HREF="../../../../reference/android/support/v4
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaDescriptionCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaDescriptionCompat.html
index fbbaa1911733..fa1d61041437 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaDescriptionCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaDescriptionCompat.html
@@ -157,7 +157,7 @@ Class android.support.v4.media.<A HREF="../../../../reference/android/support/v4
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaMetadataCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaMetadataCompat.html
index e52493bd2480..7e0f137c5744 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaMetadataCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.MediaMetadataCompat.html
@@ -115,7 +115,7 @@ Class android.support.v4.media.<A HREF="../../../../reference/android/support/v4
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaButtonReceiver.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaButtonReceiver.html
index 3e2c68bb8eda..65467b8211ea 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaButtonReceiver.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaButtonReceiver.html
@@ -115,7 +115,7 @@ Class android.support.v4.media.session.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaSessionCompat.QueueItem.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaSessionCompat.QueueItem.html
index 5ce173ffedfb..e3b018488e4e 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaSessionCompat.QueueItem.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaSessionCompat.QueueItem.html
@@ -133,7 +133,7 @@ Class android.support.v4.media.session.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaSessionCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaSessionCompat.html
index ee7124499494..90bd5eb37dba 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaSessionCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.MediaSessionCompat.html
@@ -126,7 +126,7 @@ Class android.support.v4.media.session.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.html
index 2c54c1d0fd85..07e2449dd3dd 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.media.session.PlaybackStateCompat.html
@@ -108,7 +108,7 @@ Class android.support.v4.media.session.<A HREF="../../../../reference/android/su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.os.BuildCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.os.BuildCompat.html
index eb59ddb4c041..372415af6cee 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.os.BuildCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.os.BuildCompat.html
@@ -108,7 +108,7 @@ Class android.support.v4.os.<A HREF="../../../../reference/android/support/v4/os
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.KeyEventCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.KeyEventCompat.html
index b5f4371fb523..d62437e0fa9f 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.KeyEventCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.KeyEventCompat.html
@@ -141,7 +141,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.MotionEventCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.MotionEventCompat.html
index 9f85dab7d1ac..8f58037a524c 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.MotionEventCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.MotionEventCompat.html
@@ -161,7 +161,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.ViewCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.ViewCompat.html
index 1b4ea0feabce..0974230ed482 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.ViewCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.ViewCompat.html
@@ -181,7 +181,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.ViewConfigurationCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.ViewConfigurationCompat.html
index dcb2023dd0e5..3eec7fa0ae90 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.ViewConfigurationCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.ViewConfigurationCompat.html
@@ -111,7 +111,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.WindowInsetsCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.WindowInsetsCompat.html
index e0f77c9433c1..c5c1d220bff5 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.WindowInsetsCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.WindowInsetsCompat.html
@@ -108,7 +108,7 @@ Class android.support.v4.view.<A HREF="../../../../reference/android/support/v4/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html
index 6ff46b8c14d4..1f9801f37a3f 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityEventCompat.html
@@ -158,7 +158,7 @@ Class android.support.v4.view.accessibility.<A HREF="../../../../reference/andro
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat.html
index 5d63b93ae152..923ec80665cc 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat.html
@@ -110,7 +110,7 @@ Class android.support.v4.view.accessibility.<A HREF="../../../../reference/andro
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.html
index 004d89ef7aba..defa406ba0e3 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityManagerCompat.html
@@ -143,7 +143,7 @@ Change in signature from (<code>AccessibilityManager, AccessibilityStateChangeLi
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.html
index 695028b2ff57..d6f719e2bce8 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.html
@@ -157,7 +157,7 @@ Class android.support.v4.view.accessibility.<A HREF="../../../../reference/andro
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat.html
index 17109ec22cf7..d087e4a77173 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat.html
@@ -115,7 +115,7 @@ Class android.support.v4.view.accessibility.<A HREF="../../../../reference/andro
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat.html
index 30df540333ce..84fc73b92cb2 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat.html
@@ -108,7 +108,7 @@ Class android.support.v4.view.accessibility.<A HREF="../../../../reference/andro
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat.html
index 1d5a2509c49d..41abf7ef725a 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat.html
@@ -108,7 +108,7 @@ Class android.support.v4.view.accessibility.<A HREF="../../../../reference/andro
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.html
index 727576d9701d..005616afe0a1 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.html
@@ -144,7 +144,7 @@ Class android.support.v4.view.accessibility.<A HREF="../../../../reference/andro
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeProviderCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeProviderCompat.html
index 101070c3f085..bd6b7f8736c1 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeProviderCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityNodeProviderCompat.html
@@ -108,7 +108,7 @@ Class android.support.v4.view.accessibility.<A HREF="../../../../reference/andro
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityWindowInfoCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityWindowInfoCompat.html
index a3b8d96b4f41..40f3ca2bbd9f 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityWindowInfoCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.view.accessibility.AccessibilityWindowInfoCompat.html
@@ -108,7 +108,7 @@ Class android.support.v4.view.accessibility.<A HREF="../../../../reference/andro
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat.html
index cba004e0a9e5..3d9f2eaed0d5 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat.html
@@ -95,7 +95,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat.html
index c15d1b962a39..df0f3e1d9dce 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat.html
@@ -95,7 +95,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.html
index cbb39251c45f..4af1e4641ad6 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SearchViewCompat.html
@@ -121,7 +121,7 @@ Change in signature from (<code>View, OnQueryTextListenerCompat</code>) to (<cod
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SwipeRefreshLayout.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SwipeRefreshLayout.html
index 77dbdf642189..584878231ad8 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SwipeRefreshLayout.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.SwipeRefreshLayout.html
@@ -108,7 +108,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.TextViewCompat.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.TextViewCompat.html
index a80363405f37..87b9e6940c84 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.TextViewCompat.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v4.widget.TextViewCompat.html
@@ -108,7 +108,7 @@ Class android.support.v4.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.app.ActionBarDrawerToggle.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.app.ActionBarDrawerToggle.html
index 2a864f027a51..bc8abd6fd70b 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.app.ActionBarDrawerToggle.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.app.ActionBarDrawerToggle.html
@@ -115,7 +115,7 @@ Class android.support.v7.app.<A HREF="../../../../reference/android/support/v7/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.app.AppCompatDelegate.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.app.AppCompatDelegate.html
index adfcabbecdd9..7b131e65792d 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.app.AppCompatDelegate.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.app.AppCompatDelegate.html
@@ -108,7 +108,7 @@ Class android.support.v7.app.<A HREF="../../../../reference/android/support/v7/a
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.content.res.AppCompatResources.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.content.res.AppCompatResources.html
index e26c32b10b8f..02f43fd180a8 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.content.res.AppCompatResources.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.content.res.AppCompatResources.html
@@ -108,7 +108,7 @@ Class android.support.v7.content.res.<A HREF="../../../../reference/android/supp
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.graphics.Palette.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.graphics.Palette.html
index f588384fc1c9..1999a489db4e 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.graphics.Palette.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.graphics.Palette.html
@@ -115,7 +115,7 @@ Class android.support.v7.graphics.<A HREF="../../../../reference/android/support
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.util.SortedList.Callback.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.util.SortedList.Callback.html
index d235097955cd..95be79c89311 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.util.SortedList.Callback.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.util.SortedList.Callback.html
@@ -138,7 +138,7 @@ Class android.support.v7.util.<A HREF="../../../../reference/android/support/v7/
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.LinearLayoutManager.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.LinearLayoutManager.html
index cf5c0f602aaa..2fdfb0e44fbe 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.LinearLayoutManager.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.LinearLayoutManager.html
@@ -109,7 +109,7 @@ Class android.support.v7.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.LinearSmoothScroller.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.LinearSmoothScroller.html
index 3e13735bd73b..5cf79ee33512 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.LinearSmoothScroller.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.LinearSmoothScroller.html
@@ -112,7 +112,7 @@ Changed from abstract to non-abstract.
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.RecyclerView.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.RecyclerView.html
index d5e36f0537bf..5411a1f78364 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.RecyclerView.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.RecyclerView.html
@@ -116,7 +116,7 @@ Class android.support.v7.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.StaggeredGridLayoutManager.html b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.StaggeredGridLayoutManager.html
index 640ef38d25d7..9d0ab875b514 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.StaggeredGridLayoutManager.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/android.support.v7.widget.StaggeredGridLayoutManager.html
@@ -124,7 +124,7 @@ Class android.support.v7.widget.<A HREF="../../../../reference/android/support/v
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/changes-summary.html b/docs/html/sdk/support_api_diff/24.2.0/changes/changes-summary.html
index 12dfb4e9ed2b..4456c22e156b 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/changes-summary.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/changes-summary.html
@@ -315,7 +315,7 @@ see the <a href="http://developer.android.com/index.html" target="_top">Android
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_additions.html b/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_additions.html
index f3eb2ed91fb4..acb81154536d 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_additions.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_additions.html
@@ -291,7 +291,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="pkg_android.support.v7.widget.html#Toolbar.LayoutParams" class="hiddenlink" target="rightframe"><b>Toolbar.LayoutParams</b></A><br>
<A HREF="pkg_android.support.v7.widget.html#Toolbar.OnMenuItemClickListener" class="hiddenlink" target="rightframe"><b><i>Toolbar.OnMenuItemClickListener</i></b></A><br>
<A HREF="pkg_android.support.v7.widget.html#Toolbar.SavedState" class="hiddenlink" target="rightframe"><b>Toolbar.SavedState</b></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_all.html b/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_all.html
index 410ac8a65415..3e77bf2de155 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_all.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_all.html
@@ -514,7 +514,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.support.v4.view.WindowInsetsCompat.html" class="hiddenlink" target="rightframe">WindowInsetsCompat</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_changes.html b/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_changes.html
index 1baef5cd999b..58fe615bd673 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_changes.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_changes.html
@@ -380,7 +380,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<a href="#topheader"><font size="-2">TOP</font></a>
<p><div style="line-height:1.5em;color:black">
<A HREF="android.support.v4.view.WindowInsetsCompat.html" class="hiddenlink" target="rightframe">WindowInsetsCompat</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_removals.html b/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_removals.html
index e6da73f487d3..c4662980dd50 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_removals.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/classes_index_removals.html
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_additions.html b/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_additions.html
index b0c058727690..312effc0f2c0 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_additions.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_additions.html
@@ -53,7 +53,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v4.view.WindowInsetsCompat.html#android.support.v4.view.WindowInsetsCompat.ctor_added(android.support.v4.view.WindowInsetsCompat)" class="hiddenlink" target="rightframe"><b>WindowInsetsCompat</b>
(<code>WindowInsetsCompat</code>)</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_all.html b/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_all.html
index 91568dba6205..24310b7728cc 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_all.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_all.html
@@ -71,7 +71,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v4.view.WindowInsetsCompat.html#android.support.v4.view.WindowInsetsCompat.ctor_added(android.support.v4.view.WindowInsetsCompat)" class="hiddenlink" target="rightframe"><b>WindowInsetsCompat</b>
(<code>WindowInsetsCompat</code>)</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_changes.html b/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_changes.html
index b4142ed09971..62a75f8ccb38 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_changes.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_changes.html
@@ -61,7 +61,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v4.content.ContextCompat.html#android.support.v4.content.ContextCompat.ctor_changed()" class="hiddenlink" target="rightframe">ContextCompat
()</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_removals.html b/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_removals.html
index f1a99529b22d..2fbd2e12dd57 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_removals.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/constructors_index_removals.html
@@ -47,7 +47,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_additions.html b/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_additions.html
index 8923dbe088ec..cdb8ee8f91f4 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_additions.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_additions.html
@@ -253,7 +253,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</nobr><br>
<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.TYPE_WINDOWS_CHANGED" class="hiddenlink" target="rightframe">TYPE_WINDOWS_CHANGED</A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_all.html b/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_all.html
index 19cebb79bfba..14b3e97afc1b 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_all.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_all.html
@@ -285,7 +285,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</nobr><br>
<nobr><A HREF="android.support.v4.view.accessibility.AccessibilityEventCompat.html#android.support.v4.view.accessibility.AccessibilityEventCompat.TYPE_WINDOWS_CHANGED" class="hiddenlink" target="rightframe">TYPE_WINDOWS_CHANGED</A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_changes.html b/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_changes.html
index b5ab769834a3..c72b2deece72 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_changes.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_changes.html
@@ -57,7 +57,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
</nobr><br>
<nobr><A HREF="android.support.v4.view.ViewCompat.html#android.support.v4.view.ViewCompat.OVER_SCROLL_NEVER" class="hiddenlink" target="rightframe">OVER_SCROLL_NEVER</A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_removals.html b/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_removals.html
index 09ffac4441fb..61820d1f1ccb 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_removals.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/fields_index_removals.html
@@ -53,7 +53,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v7.widget.StaggeredGridLayoutManager.html#android.support.v7.widget.StaggeredGridLayoutManager.TAG" class="hiddenlink" target="rightframe"><strike>TAG</strike></A>
</nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_help.html b/docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_help.html
index ca0931f5ab22..966dda8764bb 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_help.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_help.html
@@ -120,7 +120,7 @@ These links show and hide the HTML frames. All pages are available with or witho
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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_statistics.html b/docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_statistics.html
index 698dbecc436d..7010da6a7e05 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_statistics.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_statistics.html
@@ -583,7 +583,7 @@ added, the change will be 100%.</p>
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_topleftframe.html b/docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_topleftframe.html
index 36f9836e4478..6a2e76e10fc2 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_topleftframe.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/jdiff_topleftframe.html
@@ -49,7 +49,7 @@ body{overflow:auto;}
<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 src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_additions.html b/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_additions.html
index 508018e23092..419a6073f3b1 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_additions.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_additions.html
@@ -434,7 +434,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<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.toKeyCode_added(long)" class="hiddenlink" target="rightframe"><b>toKeyCode</b>
(<code>long</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_all.html b/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_all.html
index a52d5c9d1460..d33bfc0d1338 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_all.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_all.html
@@ -565,7 +565,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<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.toKeyCode_added(long)" class="hiddenlink" target="rightframe"><b>toKeyCode</b>
(<code>long</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_changes.html b/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_changes.html
index 5faae4237b70..ef008cbad183 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_changes.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_changes.html
@@ -208,7 +208,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
(<code>int, Bitmap, String</code>)</A></nobr><br>
<nobr><A HREF="android.support.v4.view.KeyEventCompat.html#android.support.v4.view.KeyEventCompat.startTracking_changed(android.view.KeyEvent)" class="hiddenlink" target="rightframe">startTracking
(<code>KeyEvent</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_removals.html b/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_removals.html
index 062ac8f529af..1c0c6be7f863 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_removals.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/methods_index_removals.html
@@ -79,7 +79,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<p><div style="line-height:1.5em;color:black">
<nobr><A HREF="android.support.v7.widget.LinearLayoutManager.html#android.support.v7.widget.LinearLayoutManager.prepareForDrop_removed(android.view.View, android.view.View, int, int)" class="hiddenlink" target="rightframe"><strike>prepareForDrop</strike>
(<code>View, View, int, int</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_additions.html b/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_additions.html
index 2eff0f794573..bb88d9fe5593 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_additions.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_additions.html
@@ -52,7 +52,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A NAME="A"></A>
<A HREF="changes-summary.html#android.support.transition" class="hiddenlink" target="rightframe"><b>android.support.transition</b></A><br>
<A HREF="changes-summary.html#android.support.v4.text.util" class="hiddenlink" target="rightframe"><b>android.support.v4.text.util</b></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_all.html b/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_all.html
index 58e51ed762bb..78805db862fc 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_all.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_all.html
@@ -77,7 +77,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="pkg_android.support.v7.util.html" class="hiddenlink" target="rightframe">android.support.v7.util</A><br>
<A HREF="pkg_android.support.v7.widget.html" class="hiddenlink" target="rightframe">android.support.v7.widget</A><br>
<A HREF="changes-summary.html#android.support.v8.renderscript" class="hiddenlink" target="rightframe"><strike>android.support.v8.renderscript</strike></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_changes.html b/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_changes.html
index 1d9e42859cec..f5f642516151 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_changes.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_changes.html
@@ -72,7 +72,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="pkg_android.support.v7.preference.html" class="hiddenlink" target="rightframe">android.support.v7.preference</A><br>
<A HREF="pkg_android.support.v7.util.html" class="hiddenlink" target="rightframe">android.support.v7.util</A><br>
<A HREF="pkg_android.support.v7.widget.html" class="hiddenlink" target="rightframe">android.support.v7.widget</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_removals.html b/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_removals.html
index d52d40d15e4f..ce5ca5860503 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_removals.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/packages_index_removals.html
@@ -53,7 +53,7 @@ Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style=
<A HREF="changes-summary.html#android.support.v7.appcompat" class="hiddenlink" target="rightframe"><strike>android.support.v7.appcompat</strike></A><br>
<A HREF="changes-summary.html#android.support.v7.recyclerview" class="hiddenlink" target="rightframe"><strike>android.support.v7.recyclerview</strike></A><br>
<A HREF="changes-summary.html#android.support.v8.renderscript" class="hiddenlink" target="rightframe"><strike>android.support.v8.renderscript</strike></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.customtabs.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.customtabs.html
index 5959d63f6ec6..45a31ffa007a 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.customtabs.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.customtabs.html
@@ -119,7 +119,7 @@ Package <A HREF="../../../../reference/android/support/customtabs/package-summar
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.design.widget.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.design.widget.html
index 510b9bd230c4..a311b48ee54b 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.design.widget.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.design.widget.html
@@ -161,7 +161,7 @@ Package <A HREF="../../../../reference/android/support/design/widget/package-sum
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v14.preference.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v14.preference.html
index 84efadc653be..f24be00d1680 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v14.preference.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v14.preference.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v14/preference/package-su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v17.leanback.widget.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v17.leanback.widget.html
index 4ce1f3290d07..c07a4873251f 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v17.leanback.widget.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v17.leanback.widget.html
@@ -119,7 +119,7 @@ Package <A HREF="../../../../reference/android/support/v17/leanback/widget/packa
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v17.preference.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v17.preference.html
index ad0aaddf14d3..c61d79dcea10 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v17.preference.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v17.preference.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v17/preference/package-su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.accessibilityservice.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.accessibilityservice.html
index e904a7696f85..2c0f684969a5 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.accessibilityservice.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.accessibilityservice.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v4/accessibilityservice/p
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.app.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.app.html
index f8e4cb1ded5e..58ed06f92887 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.app.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.app.html
@@ -148,7 +148,7 @@ Package <A HREF="../../../../reference/android/support/v4/app/package-summary.ht
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.content.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.content.html
index 31aa1daa869c..65dd61658bc7 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.content.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.content.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v4/content/package-summar
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.graphics.drawable.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.graphics.drawable.html
index b1efab35302d..f8b31a57551a 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.graphics.drawable.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.graphics.drawable.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v4/graphics/drawable/pack
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.media.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.media.html
index 612a1a0ce7dd..5300c86b70b2 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.media.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.media.html
@@ -126,7 +126,7 @@ Package <A HREF="../../../../reference/android/support/v4/media/package-summary.
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.media.session.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.media.session.html
index 3e46335ffec8..459d0c3f4a7e 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.media.session.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.media.session.html
@@ -126,7 +126,7 @@ Package <A HREF="../../../../reference/android/support/v4/media/session/package-
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.os.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.os.html
index b250855c00b8..6d7f3993fe4e 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.os.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.os.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v4/os/package-summary.htm
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.util.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.util.html
index d34506eab361..6f0e7778fdb4 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.util.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.util.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v4/util/package-summary.h
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.view.accessibility.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.view.accessibility.html
index a6362fb09e0f..d5d126cbc7b7 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.view.accessibility.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.view.accessibility.html
@@ -190,7 +190,7 @@ Package <A HREF="../../../../reference/android/support/v4/view/accessibility/pac
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.view.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.view.html
index 10b1334d57ba..d720d413d37c 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.view.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.view.html
@@ -133,7 +133,7 @@ Package <A HREF="../../../../reference/android/support/v4/view/package-summary.h
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.widget.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.widget.html
index 5ed0f6541951..2efef4596456 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.widget.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v4.widget.html
@@ -162,7 +162,7 @@ Package <A HREF="../../../../reference/android/support/v4/widget/package-summary
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.app.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.app.html
index 8eb58aa3b4a5..f36cba52ec3c 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.app.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.app.html
@@ -162,7 +162,7 @@ Package <A HREF="../../../../reference/android/support/v7/app/package-summary.ht
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.content.res.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.content.res.html
index 90787f7741a7..2e4b703d349c 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.content.res.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.content.res.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v7/content/res/package-su
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.graphics.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.graphics.html
index bd9cf241109f..439c8d3b7c82 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.graphics.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.graphics.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v7/graphics/package-summa
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.preference.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.preference.html
index b80e0056eff5..b2b781b82892 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.preference.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.preference.html
@@ -105,7 +105,7 @@ Package <A HREF="../../../../reference/android/support/v7/preference/package-sum
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.util.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.util.html
index 365022f9469e..c35fb8c89385 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.util.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.util.html
@@ -148,7 +148,7 @@ Package <A HREF="../../../../reference/android/support/v7/util/package-summary.h
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.widget.html b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.widget.html
index e07d5b8ca8a6..72e5497cb0dd 100644
--- a/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.widget.html
+++ b/docs/html/sdk/support_api_diff/24.2.0/changes/pkg_android.support.v7.widget.html
@@ -449,7 +449,7 @@ Package <A HREF="../../../../reference/android/support/v7/widget/package-summary
</div> <!-- end footer -->
</div><!-- end doc-content -->
</div> <!-- end body-content -->
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
diff --git a/docs/html/training/wearables/data-layer/messages.jd b/docs/html/training/wearables/data-layer/messages.jd
index ef9bfb176a5b..8c4b730c97cd 100644
--- a/docs/html/training/wearables/data-layer/messages.jd
+++ b/docs/html/training/wearables/data-layer/messages.jd
@@ -10,12 +10,6 @@ page.title=Sending and Receiving Messages
<li><a href="#SendMessage">Send a Message</a></li>
<li><a href="#ReceiveMessage">Receive a Message</a></li>
</ol>
-<h2>Try it out</h2>
-<ul>
- <li>
- <a href="https://github.com/googlesamples/android-FindMyPhone/" class="external-link">FindMyPhone</a>
- </li>
-</ul>
</div>
</div>
@@ -27,6 +21,7 @@ and attach the following items to the message:</p>
<li>An arbitrary payload (optional)</li>
<li>A path that uniquely identifies the message's action</li>
</ul>
+
<p>
Unlike with data items, there is no syncing between the handheld and wearable apps.
Messages are a one-way communication mechanism that's good for remote procedure calls (RPC),
@@ -149,11 +144,9 @@ If you create a service that extends
<a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html"><code>WearableListenerService</code></a>
to detect capability changes, you may want to override the
<a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html#onConnectedNodes(java.util.List<com.google.android.gms.wearable.Node>)"><code>onConnectedNodes()</code></a>
-method to listen to finer-grained connectivity details, such as when a wearable device switches
-from Wi-Fi to a Bluetooth connection to the handset. For an example implementation, see the
-<code>DisconnectListenerService</code> class in the
-<a href="https://github.com/googlesamples/android-FindMyPhone/" class="external-link">FindMyPhone</a>
-sample. For more information on how to listen for important events, see
+method to listen to finer-grained connectivity details, such as when a wearable
+device switches from Wi-Fi to a Bluetooth connection to the handset.
+For more information on how to listen for important events, see
<a href="{@docRoot}training/wearables/data-layer/events.html#Listen">Listen for Data Layer Events</a>.
</p>
diff --git a/graphics/java/android/graphics/Atlas.java b/graphics/java/android/graphics/Atlas.java
deleted file mode 100644
index e0a534583b67..000000000000
--- a/graphics/java/android/graphics/Atlas.java
+++ /dev/null
@@ -1,416 +0,0 @@
-/*
- * Copyright (C) 2013 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.graphics;
-
-/**
- * @hide
- */
-public class Atlas {
- /**
- * WARNING: These flag values are part of the on-disk configuration information,
- * do not change their values.
- */
-
- /** DELETED: FLAG_ROTATION = 0x01 */
-
- /**
- * This flag indicates whether the packing algorithm should leave
- * an empty 1 pixel wide border around each bitmap. This border can
- * be useful if the content of the atlas will be used in OpenGL using
- * bilinear filtering.
- */
- public static final int FLAG_ADD_PADDING = 0x2;
- /**
- * Default flags: allow rotations and add padding.
- */
- public static final int FLAG_DEFAULTS = FLAG_ADD_PADDING;
-
- /**
- * Each type defines a different packing algorithm that can
- * be used by an {@link Atlas}. The best algorithm to use
- * will depend on the source dataset and the dimensions of
- * the atlas.
- */
- public enum Type {
- SliceMinArea,
- SliceMaxArea,
- SliceShortAxis,
- SliceLongAxis
- }
-
- /**
- * Represents a bitmap packed in the atlas. Each entry has a location in
- * pixels in the atlas and a rotation flag.
- */
- public static class Entry {
- /**
- * Location, in pixels, of the bitmap on the X axis in the atlas.
- */
- public int x;
- /**
- * Location, in pixels, of the bitmap on the Y axis in the atlas.
- */
- public int y;
- }
-
- private final Policy mPolicy;
-
- /**
- * Creates a new atlas with the specified algorithm and dimensions
- * in pixels. Calling this constructor is equivalent to calling
- * {@link #Atlas(Atlas.Type, int, int, int)} with {@link #FLAG_DEFAULTS}.
- *
- * @param type The algorithm to use to pack rectangles in the atlas
- * @param width The width of the atlas in pixels
- * @param height The height of the atlas in pixels
- *
- * @see #Atlas(Atlas.Type, int, int, int)
- */
- public Atlas(Type type, int width, int height) {
- this(type, width, height, FLAG_DEFAULTS);
- }
-
- /**
- * Creates a new atlas with the specified algorithm and dimensions
- * in pixels. A set of flags can also be specified to control the
- * behavior of the atlas.
- *
- * @param type The algorithm to use to pack rectangles in the atlas
- * @param width The width of the atlas in pixels
- * @param height The height of the atlas in pixels
- * @param flags Optional flags to control the behavior of the atlas:
- * {@link #FLAG_ADD_PADDING}, {@link #FLAG_ALLOW_ROTATIONS}
- *
- * @see #Atlas(Atlas.Type, int, int)
- */
- public Atlas(Type type, int width, int height, int flags) {
- mPolicy = findPolicy(type, width, height, flags);
- }
-
- /**
- * Packs a rectangle of the specified dimensions in this atlas.
- *
- * @param width The width of the rectangle to pack in the atlas
- * @param height The height of the rectangle to pack in the atlas
- *
- * @return An {@link Entry} instance if the rectangle was packed in
- * the atlas, or null if the rectangle could not fit
- *
- * @see #pack(int, int, Atlas.Entry)
- */
- public Entry pack(int width, int height) {
- return pack(width, height, null);
- }
-
- /**
- * Packs a rectangle of the specified dimensions in this atlas.
- *
- * @param width The width of the rectangle to pack in the atlas
- * @param height The height of the rectangle to pack in the atlas
- * @param entry Out parameter that will be filled in with the location
- * and attributes of the packed rectangle, can be null
- *
- * @return An {@link Entry} instance if the rectangle was packed in
- * the atlas, or null if the rectangle could not fit
- *
- * @see #pack(int, int)
- */
- public Entry pack(int width, int height, Entry entry) {
- if (entry == null) entry = new Entry();
- return mPolicy.pack(width, height, entry);
- }
-
- private static Policy findPolicy(Type type, int width, int height, int flags) {
- switch (type) {
- case SliceMinArea:
- return new SlicePolicy(width, height, flags,
- new SlicePolicy.MinAreaSplitDecision());
- case SliceMaxArea:
- return new SlicePolicy(width, height, flags,
- new SlicePolicy.MaxAreaSplitDecision());
- case SliceShortAxis:
- return new SlicePolicy(width, height, flags,
- new SlicePolicy.ShorterFreeAxisSplitDecision());
- case SliceLongAxis:
- return new SlicePolicy(width, height, flags,
- new SlicePolicy.LongerFreeAxisSplitDecision());
- }
- return null;
- }
-
- /**
- * A policy defines how the atlas performs the packing operation.
- */
- private static abstract class Policy {
- abstract Entry pack(int width, int height, Entry entry);
- }
-
- /**
- * The Slice algorightm divides the remaining empty space either
- * horizontally or vertically after a bitmap is placed in the atlas.
- *
- * NOTE: the algorithm is explained below using a tree but is
- * implemented using a linked list instead for performance reasons.
- *
- * The algorithm starts with a single empty cell covering the entire
- * atlas:
- *
- * -----------------------
- * | |
- * | |
- * | |
- * | Empty space |
- * | (C0) |
- * | |
- * | |
- * | |
- * -----------------------
- *
- * The tree of cells looks like this:
- *
- * N0(free)
- *
- * The algorithm then places a bitmap B1, if possible:
- *
- * -----------------------
- * | | |
- * | B1 | |
- * | | |
- * |-------- |
- * | |
- * | |
- * | |
- * | |
- * -----------------------
- *
- * After placing a bitmap in an empty cell, the algorithm splits
- * the remaining space in two new empty cells. The split can occur
- * vertically or horizontally (this is controlled by the "split
- * decision" parameter of the algorithm.)
- *
- * Here is for the instance the result of a vertical split:
- *
- * -----------------------
- * | | |
- * | B1 | |
- * | | |
- * |--------| C2 |
- * | | |
- * | | |
- * | C1 | |
- * | | |
- * -----------------------
- *
- * The cells tree now looks like this:
- *
- * C0(occupied)
- * / \
- * / \
- * / \
- * / \
- * C1(free) C2(free)
- *
- * For each bitmap to place in the atlas, the Slice algorithm
- * will visit the free cells until it finds one where a bitmap can
- * fit. It will then split the now occupied cell and proceed onto
- * the next bitmap.
- */
- private static class SlicePolicy extends Policy {
- private final Cell mRoot = new Cell();
-
- private final SplitDecision mSplitDecision;
-
- private final int mPadding;
-
- /**
- * A cell represents a sub-rectangle of the atlas. A cell is
- * a node in a linked list representing the available free
- * space in the atlas.
- */
- private static class Cell {
- int x;
- int y;
-
- int width;
- int height;
-
- Cell next;
-
- @Override
- public String toString() {
- return String.format("cell[x=%d y=%d width=%d height=%d", x, y, width, height);
- }
- }
-
- SlicePolicy(int width, int height, int flags, SplitDecision splitDecision) {
- mPadding = (flags & FLAG_ADD_PADDING) != 0 ? 1 : 0;
-
- // The entire atlas is empty at first, minus padding
- Cell first = new Cell();
- first.x = first.y = mPadding;
- first.width = width - 2 * mPadding;
- first.height = height - 2 * mPadding;
-
- mRoot.next = first;
- mSplitDecision = splitDecision;
- }
-
- @Override
- Entry pack(int width, int height, Entry entry) {
- Cell cell = mRoot.next;
- Cell prev = mRoot;
-
- while (cell != null) {
- if (insert(cell, prev, width, height, entry)) {
- return entry;
- }
-
- prev = cell;
- cell = cell.next;
- }
-
- return null;
- }
-
- /**
- * Defines how the remaining empty space should be split up:
- * vertically or horizontally.
- */
- private static interface SplitDecision {
- /**
- * Returns true if the remaining space defined by
- * <code>freeWidth</code> and <code>freeHeight</code>
- * should be split horizontally.
- *
- * @param freeWidth The rectWidth of the free space after packing a rectangle
- * @param freeHeight The rectHeight of the free space after packing a rectangle
- * @param rectWidth The rectWidth of the rectangle that was packed in a cell
- * @param rectHeight The rectHeight of the rectangle that was packed in a cell
- */
- boolean splitHorizontal(int freeWidth, int freeHeight,
- int rectWidth, int rectHeight);
- }
-
- // Splits the free area horizontally to minimize the horizontal section area
- private static class MinAreaSplitDecision implements SplitDecision {
- @Override
- public boolean splitHorizontal(int freeWidth, int freeHeight,
- int rectWidth, int rectHeight) {
- return rectWidth * freeHeight > freeWidth * rectHeight;
- }
- }
-
- // Splits the free area horizontally to maximize the horizontal section area
- private static class MaxAreaSplitDecision implements SplitDecision {
- @Override
- public boolean splitHorizontal(int freeWidth, int freeHeight,
- int rectWidth, int rectHeight) {
- return rectWidth * freeHeight <= freeWidth * rectHeight;
- }
- }
-
- // Splits the free area horizontally if the horizontal axis is shorter
- private static class ShorterFreeAxisSplitDecision implements SplitDecision {
- @Override
- public boolean splitHorizontal(int freeWidth, int freeHeight,
- int rectWidth, int rectHeight) {
- return freeWidth <= freeHeight;
- }
- }
-
- // Splits the free area horizontally if the vertical axis is shorter
- private static class LongerFreeAxisSplitDecision implements SplitDecision {
- @Override
- public boolean splitHorizontal(int freeWidth, int freeHeight,
- int rectWidth, int rectHeight) {
- return freeWidth > freeHeight;
- }
- }
-
- /**
- * Attempts to pack a rectangle of specified dimensions in the available
- * empty space.
- *
- * @param cell The cell representing free space in which to pack the rectangle
- * @param prev The previous cell in the free space linked list
- * @param width The width of the rectangle to pack
- * @param height The height of the rectangle to pack
- * @param entry Stores the location of the packged rectangle, if it fits
- *
- * @return True if the rectangle was packed in the atlas, false otherwise
- */
- private boolean insert(Cell cell, Cell prev, int width, int height, Entry entry) {
- if (cell.width < width || cell.height < height) {
- return false;
- }
-
- // Remaining free space after packing the rectangle
- int deltaWidth = cell.width - width;
- int deltaHeight = cell.height - height;
-
- // Split the remaining free space into two new cells
- Cell first = new Cell();
- Cell second = new Cell();
-
- first.x = cell.x + width + mPadding;
- first.y = cell.y;
- first.width = deltaWidth - mPadding;
-
- second.x = cell.x;
- second.y = cell.y + height + mPadding;
- second.height = deltaHeight - mPadding;
-
- if (mSplitDecision.splitHorizontal(deltaWidth, deltaHeight,
- width, height)) {
- first.height = height;
- second.width = cell.width;
- } else {
- first.height = cell.height;
- second.width = width;
-
- // The order of the cells matters for efficient packing
- // We want to give priority to the cell chosen by the
- // split decision heuristic
- Cell temp = first;
- first = second;
- second = temp;
- }
-
- // Remove degenerate cases to keep the free list as small as possible
- if (first.width > 0 && first.height > 0) {
- prev.next = first;
- prev = first;
- }
-
- if (second.width > 0 && second.height > 0) {
- prev.next = second;
- second.next = cell.next;
- } else {
- prev.next = cell.next;
- }
-
- // The cell is now completely removed from the free list
- cell.next = null;
-
- // Return the location and rotation of the packed rectangle
- entry.x = cell.x;
- entry.y = cell.y;
-
- return true;
- }
- }
-}
diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java
index df107f5ce3ef..6deeb0d9af9a 100644
--- a/graphics/java/android/graphics/drawable/BitmapDrawable.java
+++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java
@@ -49,7 +49,6 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
-import java.util.Collection;
/**
* A Drawable that wraps a bitmap and can be tiled, stretched, or aligned. You can create a
@@ -957,14 +956,6 @@ public class BitmapDrawable extends Drawable {
}
@Override
- public int addAtlasableBitmaps(Collection<Bitmap> atlasList) {
- if (isAtlasable(mBitmap) && atlasList.add(mBitmap)) {
- return mBitmap.getWidth() * mBitmap.getHeight();
- }
- return 0;
- }
-
- @Override
public Drawable newDrawable() {
return new BitmapDrawable(this, null);
}
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index 10f0dda5a976..6ddc2d7e192f 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -58,7 +58,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.util.Arrays;
-import java.util.Collection;
/**
* A Drawable is a general abstraction for "something that can be drawn." Most
@@ -1367,19 +1366,6 @@ public abstract class Drawable {
public abstract @Config int getChangingConfigurations();
/**
- * @return Total pixel count
- * @hide
- */
- public int addAtlasableBitmaps(@NonNull Collection<Bitmap> atlasList) {
- return 0;
- }
-
- /** @hide */
- protected final boolean isAtlasable(@Nullable Bitmap bitmap) {
- return bitmap != null && bitmap.getConfig() == Bitmap.Config.ARGB_8888;
- }
-
- /**
* Return whether this constant state can have a theme applied.
*/
public boolean canApplyTheme() {
diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java
index c7a3c75f3545..abdc2b91c2d9 100644
--- a/graphics/java/android/graphics/drawable/DrawableContainer.java
+++ b/graphics/java/android/graphics/drawable/DrawableContainer.java
@@ -21,7 +21,6 @@ import android.content.pm.ActivityInfo.Config;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
-import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Insets;
@@ -35,8 +34,6 @@ import android.util.LayoutDirection;
import android.util.SparseArray;
import android.view.View;
-import java.util.Collection;
-
/**
* A helper class that contains several {@link Drawable}s and selects which one to use.
*
@@ -1194,19 +1191,6 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
return true;
}
- /** @hide */
- @Override
- public int addAtlasableBitmaps(Collection<Bitmap> atlasList) {
- final int N = mNumChildren;
- int pixelCount = 0;
- for (int i = 0; i < N; i++) {
- final ConstantState state = getChild(i).getConstantState();
- if (state != null) {
- pixelCount += state.addAtlasableBitmaps(atlasList);
- }
- }
- return pixelCount;
- }
}
protected void setConstantState(DrawableContainerState state) {
diff --git a/graphics/java/android/graphics/drawable/DrawableWrapper.java b/graphics/java/android/graphics/drawable/DrawableWrapper.java
index 5abfc54bfce3..5887939b05a4 100644
--- a/graphics/java/android/graphics/drawable/DrawableWrapper.java
+++ b/graphics/java/android/graphics/drawable/DrawableWrapper.java
@@ -28,7 +28,6 @@ import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
-import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Insets;
@@ -41,7 +40,6 @@ import android.util.DisplayMetrics;
import android.view.View;
import java.io.IOException;
-import java.util.Collection;
/**
* Drawable container with only one child element.
@@ -508,15 +506,6 @@ public abstract class DrawableWrapper extends Drawable implements Drawable.Callb
}
@Override
- public int addAtlasableBitmaps(Collection<Bitmap> atlasList) {
- final Drawable.ConstantState state = mDrawableState;
- if (state != null) {
- return state.addAtlasableBitmaps(atlasList);
- }
- return 0;
- }
-
- @Override
public Drawable newDrawable() {
return newDrawable(null);
}
diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java
index c30c4c2f02d6..e09fea5af3ea 100644
--- a/graphics/java/android/graphics/drawable/LayerDrawable.java
+++ b/graphics/java/android/graphics/drawable/LayerDrawable.java
@@ -23,7 +23,6 @@ import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
-import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Outline;
@@ -42,7 +41,6 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
-import java.util.Collection;
/**
* A Drawable that manages an array of other Drawables. These are drawn in array
@@ -2128,22 +2126,6 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
mHaveIsStateful = false;
}
- @Override
- public int addAtlasableBitmaps(Collection<Bitmap> atlasList) {
- final ChildDrawable[] array = mChildren;
- final int N = mNum;
- int pixelCount = 0;
- for (int i = 0; i < N; i++) {
- final Drawable dr = array[i].mDrawable;
- if (dr != null) {
- final ConstantState state = dr.getConstantState();
- if (state != null) {
- pixelCount += state.addAtlasableBitmaps(atlasList);
- }
- }
- }
- return pixelCount;
- }
}
}
diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
index d96238521f94..c7183d9e8f50 100644
--- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java
+++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
@@ -49,7 +49,6 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
-import java.util.Collection;
/**
*
@@ -633,15 +632,6 @@ public class NinePatchDrawable extends Drawable {
}
@Override
- public int addAtlasableBitmaps(Collection<Bitmap> atlasList) {
- final Bitmap bitmap = mNinePatch.getBitmap();
- if (isAtlasable(bitmap) && atlasList.add(bitmap)) {
- return bitmap.getWidth() * bitmap.getHeight();
- }
- return 0;
- }
-
- @Override
public Drawable newDrawable() {
return new NinePatchDrawable(this, null);
}
diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp
index 796cb3633626..371bc9a25735 100644
--- a/libs/androidfw/AssetManager.cpp
+++ b/libs/androidfw/AssetManager.cpp
@@ -35,6 +35,9 @@
#include <utils/threads.h>
#include <utils/Timers.h>
#include <utils/Trace.h>
+#ifndef _WIN32
+#include <sys/file.h>
+#endif
#include <assert.h>
#include <dirent.h>
@@ -647,6 +650,12 @@ void AssetManager::addSystemOverlays(const char* pathOverlaysList,
return;
}
+#ifndef _WIN32
+ if (TEMP_FAILURE_RETRY(flock(fileno(fin), LOCK_SH)) != 0) {
+ fclose(fin);
+ return;
+ }
+#endif
char buf[1024];
while (fgets(buf, sizeof(buf), fin)) {
// format of each line:
@@ -677,6 +686,10 @@ void AssetManager::addSystemOverlays(const char* pathOverlaysList,
const_cast<AssetManager*>(this)->mZipSet.addOverlay(targetPackagePath, oap);
}
}
+
+#ifndef _WIN32
+ TEMP_FAILURE_RETRY(flock(fileno(fin), LOCK_UN));
+#endif
fclose(fin);
}
diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk
index 81a183126cce..b1177680b425 100644
--- a/libs/hwui/Android.mk
+++ b/libs/hwui/Android.mk
@@ -2,7 +2,7 @@ LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-BUGREPORT_FONT_CACHE_USAGE := true
+BUGREPORT_FONT_CACHE_USAGE := false
# Enables fine-grained GLES error checking
# If set to true, every GLES call is wrapped & error checked
@@ -16,6 +16,7 @@ hwui_src_files := \
hwui/MinikinSkia.cpp \
hwui/MinikinUtils.cpp \
hwui/PaintImpl.cpp \
+ hwui/PixelRef.cpp \
hwui/Typeface.cpp \
renderstate/Blend.cpp \
renderstate/MeshState.cpp \
@@ -45,7 +46,6 @@ hwui_src_files := \
AnimationContext.cpp \
Animator.cpp \
AnimatorManager.cpp \
- AssetAtlas.cpp \
BakedOpDispatcher.cpp \
BakedOpRenderer.cpp \
BakedOpState.cpp \
@@ -56,7 +56,6 @@ hwui_src_files := \
DeferredLayerUpdater.cpp \
DeviceInfo.cpp \
DisplayList.cpp \
- Dither.cpp \
Extensions.cpp \
FboCache.cpp \
FontRenderer.cpp \
@@ -130,6 +129,14 @@ ifeq ($(TARGET_USES_HWC2),true)
hwui_cflags += -DUSE_HWC2
endif
+# TODO: Linear blending should be enabled by default, but we are
+# TODO: making it an opt-in while it's a work in progress
+# TODO: The final test should be:
+# TODO: ifneq ($(TARGET_ENABLE_LINEAR_BLENDING),false)
+ifeq ($(TARGET_ENABLE_LINEAR_BLENDING),true)
+ hwui_cflags += -DANDROID_ENABLE_LINEAR_BLENDING
+endif
+
# GCC false-positives on this warning, and since we -Werror that's
# a problem
hwui_cflags += -Wno-free-nonheap-object
@@ -143,7 +150,6 @@ ifeq (true, $(BUGREPORT_FONT_CACHE_USAGE))
hwui_cflags += -DBUGREPORT_FONT_CACHE_USAGE
endif
-
ifndef HWUI_COMPILE_SYMBOLS
hwui_cflags += -fvisibility=hidden
endif
diff --git a/libs/hwui/AssetAtlas.cpp b/libs/hwui/AssetAtlas.cpp
deleted file mode 100644
index e2e7037202b8..000000000000
--- a/libs/hwui/AssetAtlas.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#include "AssetAtlas.h"
-#include "Caches.h"
-#include "Image.h"
-
-#include <GLES2/gl2ext.h>
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Lifecycle
-///////////////////////////////////////////////////////////////////////////////
-
-void AssetAtlas::init(const sp<GraphicBuffer>& buffer, int64_t* map, int count) {
- if (mImage) {
- return;
- }
-
- ATRACE_NAME("AssetAtlas::init");
-
- mImage = new Image(buffer);
- if (mImage->getTexture()) {
- if (!mTexture) {
- Caches& caches = Caches::getInstance();
- mTexture = new Texture(caches);
- mTexture->wrap(mImage->getTexture(),
- buffer->getWidth(), buffer->getHeight(), GL_RGBA);
- createEntries(caches, map, count);
- }
- } else {
- ALOGW("Could not create atlas image");
- terminate();
- }
-}
-
-void AssetAtlas::terminate() {
- delete mImage;
- mImage = nullptr;
- delete mTexture;
- mTexture = nullptr;
- mEntries.clear();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Entries
-///////////////////////////////////////////////////////////////////////////////
-
-AssetAtlas::Entry* AssetAtlas::getEntry(const SkPixelRef* pixelRef) const {
- auto result = mEntries.find(pixelRef);
- return result != mEntries.end() ? result->second.get() : nullptr;
-}
-
-Texture* AssetAtlas::getEntryTexture(const SkPixelRef* pixelRef) const {
- auto result = mEntries.find(pixelRef);
- return result != mEntries.end() ? result->second->texture : nullptr;
-}
-
-/**
- * Delegates changes to wrapping and filtering to the base atlas texture
- * instead of applying the changes to the virtual textures.
- */
-struct DelegateTexture: public Texture {
- DelegateTexture(Caches& caches, Texture* delegate)
- : Texture(caches), mDelegate(delegate) { }
-
- virtual void setWrapST(GLenum wrapS, GLenum wrapT, bool bindTexture = false,
- bool force = false, GLenum renderTarget = GL_TEXTURE_2D) override {
- mDelegate->setWrapST(wrapS, wrapT, bindTexture, force, renderTarget);
- }
-
- virtual void setFilterMinMag(GLenum min, GLenum mag, bool bindTexture = false,
- bool force = false, GLenum renderTarget = GL_TEXTURE_2D) override {
- mDelegate->setFilterMinMag(min, mag, bindTexture, force, renderTarget);
- }
-
-private:
- Texture* const mDelegate;
-}; // struct DelegateTexture
-
-void AssetAtlas::createEntries(Caches& caches, int64_t* map, int count) {
- const float width = float(mTexture->width());
- const float height = float(mTexture->height());
-
- for (int i = 0; i < count; ) {
- SkPixelRef* pixelRef = reinterpret_cast<SkPixelRef*>(map[i++]);
- // NOTE: We're converting from 64 bit signed values to 32 bit
- // signed values. This is guaranteed to be safe because the "x"
- // and "y" coordinate values are guaranteed to be representable
- // with 32 bits. The array is 64 bits wide so that it can carry
- // pointers on 64 bit architectures.
- const int x = static_cast<int>(map[i++]);
- const int y = static_cast<int>(map[i++]);
-
- // Bitmaps should never be null, we're just extra paranoid
- if (!pixelRef) continue;
-
- const UvMapper mapper(
- x / width, (x + pixelRef->info().width()) / width,
- y / height, (y + pixelRef->info().height()) / height);
-
- Texture* texture = new DelegateTexture(caches, mTexture);
- texture->blend = !SkAlphaTypeIsOpaque(pixelRef->info().alphaType());
- texture->wrap(mTexture->id(), pixelRef->info().width(),
- pixelRef->info().height(), mTexture->format());
-
- std::unique_ptr<Entry> entry(new Entry(pixelRef, texture, mapper, *this));
- texture->uvMapper = &entry->uvMapper;
-
- mEntries.emplace(entry->pixelRef, std::move(entry));
- }
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/AssetAtlas.h b/libs/hwui/AssetAtlas.h
deleted file mode 100644
index b32e51851b94..000000000000
--- a/libs/hwui/AssetAtlas.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#ifndef ANDROID_HWUI_ASSET_ATLAS_H
-#define ANDROID_HWUI_ASSET_ATLAS_H
-
-#include "Texture.h"
-#include "UvMapper.h"
-
-#include <cutils/compiler.h>
-#include <GLES2/gl2.h>
-#include <ui/GraphicBuffer.h>
-#include <SkBitmap.h>
-
-#include <memory>
-#include <unordered_map>
-
-namespace android {
-namespace uirenderer {
-
-class Caches;
-class Image;
-
-/**
- * An asset atlas holds a collection of framework bitmaps in a single OpenGL
- * texture. Each bitmap is associated with a location, defined in pixels,
- * inside the atlas. The atlas is generated by the framework and bound as
- * an external texture using the EGLImageKHR extension.
- */
-class AssetAtlas {
-public:
- /**
- * Entry representing the texture and uvMapper of a PixelRef in the
- * atlas
- */
- class Entry {
- public:
- /*
- * A "virtual texture" object that represents the texture
- * this entry belongs to. This texture should never be
- * modified.
- */
- Texture* texture;
-
- /**
- * Maps texture coordinates in the [0..1] range into the
- * correct range to sample this entry from the atlas.
- */
- const UvMapper uvMapper;
-
- /**
- * Unique identifier used to merge bitmaps and 9-patches stored
- * in the atlas.
- */
- const void* getMergeId() const {
- return texture->blend ? &atlas.mBlendKey : &atlas.mOpaqueKey;
- }
-
- ~Entry() {
- delete texture;
- }
-
- private:
- /**
- * The pixel ref that generated this atlas entry.
- */
- SkPixelRef* pixelRef;
-
- /**
- * Atlas this entry belongs to.
- */
- const AssetAtlas& atlas;
-
- Entry(SkPixelRef* pixelRef, Texture* texture, const UvMapper& mapper,
- const AssetAtlas& atlas)
- : texture(texture)
- , uvMapper(mapper)
- , pixelRef(pixelRef)
- , atlas(atlas) {
- }
-
- friend class AssetAtlas;
- };
-
- AssetAtlas(): mTexture(nullptr), mImage(nullptr),
- mBlendKey(true), mOpaqueKey(false) { }
- ~AssetAtlas() { terminate(); }
-
- /**
- * Initializes the atlas with the specified buffer and
- * map. The buffer is a gralloc'd texture that will be
- * used as an EGLImage. The map is a list of SkBitmap*
- * and their (x, y) positions
- *
- * This method returns immediately if the atlas is already
- * initialized. To re-initialize the atlas, you must
- * first call terminate().
- */
- ANDROID_API void init(const sp<GraphicBuffer>& buffer, int64_t* map, int count);
-
- /**
- * Destroys the atlas texture. This object can be
- * re-initialized after calling this method.
- *
- * After calling this method, the width, height
- * and texture are set to 0.
- */
- void terminate();
-
- /**
- * Returns the width of this atlas in pixels.
- * Can return 0 if the atlas is not initialized.
- */
- uint32_t getWidth() const {
- return mTexture ? mTexture->width() : 0;
- }
-
- /**
- * Returns the height of this atlas in pixels.
- * Can return 0 if the atlas is not initialized.
- */
- uint32_t getHeight() const {
- return mTexture ? mTexture->height() : 0;
- }
-
- /**
- * Returns the OpenGL name of the texture backing this atlas.
- * Can return 0 if the atlas is not initialized.
- */
- GLuint getTexture() const {
- return mTexture ? mTexture->id() : 0;
- }
-
- /**
- * Returns the entry in the atlas associated with the specified
- * pixelRef. If the pixelRef is not in the atlas, return NULL.
- */
- Entry* getEntry(const SkPixelRef* pixelRef) const;
-
- /**
- * Returns the texture for the atlas entry associated with the
- * specified pixelRef. If the pixelRef is not in the atlas, return NULL.
- */
- Texture* getEntryTexture(const SkPixelRef* pixelRef) const;
-
-private:
- void createEntries(Caches& caches, int64_t* map, int count);
-
- Texture* mTexture;
- Image* mImage;
-
- const bool mBlendKey;
- const bool mOpaqueKey;
-
- std::unordered_map<const SkPixelRef*, std::unique_ptr<Entry>> mEntries;
-}; // class AssetAtlas
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_ASSET_ATLAS_H
diff --git a/libs/hwui/BakedOpDispatcher.cpp b/libs/hwui/BakedOpDispatcher.cpp
index 8b3f1722dddf..699503991e02 100644
--- a/libs/hwui/BakedOpDispatcher.cpp
+++ b/libs/hwui/BakedOpDispatcher.cpp
@@ -35,11 +35,11 @@
namespace android {
namespace uirenderer {
-static void storeTexturedRect(TextureVertex* vertices, const Rect& bounds, const Rect& texCoord) {
- vertices[0] = { bounds.left, bounds.top, texCoord.left, texCoord.top };
- vertices[1] = { bounds.right, bounds.top, texCoord.right, texCoord.top };
- vertices[2] = { bounds.left, bounds.bottom, texCoord.left, texCoord.bottom };
- vertices[3] = { bounds.right, bounds.bottom, texCoord.right, texCoord.bottom };
+static void storeTexturedRect(TextureVertex* vertices, const Rect& bounds) {
+ vertices[0] = { bounds.left, bounds.top, 0, 0 };
+ vertices[1] = { bounds.right, bounds.top, 1, 0 };
+ vertices[2] = { bounds.left, bounds.bottom, 0, 1 };
+ vertices[3] = { bounds.right, bounds.bottom, 1, 1 };
}
void BakedOpDispatcher::onMergedBitmapOps(BakedOpRenderer& renderer,
@@ -48,16 +48,11 @@ void BakedOpDispatcher::onMergedBitmapOps(BakedOpRenderer& renderer,
const BakedOpState& firstState = *(opList.states[0]);
const SkBitmap* bitmap = (static_cast<const BitmapOp*>(opList.states[0]->op))->bitmap;
- AssetAtlas::Entry* entry = renderer.renderState().assetAtlas().getEntry(bitmap->pixelRef());
- Texture* texture = entry ? entry->texture : renderer.caches().textureCache.get(bitmap);
+ Texture* texture = renderer.caches().textureCache.get(bitmap);
if (!texture) return;
const AutoTexture autoCleanup(texture);
TextureVertex vertices[opList.count * 4];
- Rect texCoords(0, 0, 1, 1);
- if (entry) {
- entry->uvMapper.map(texCoords);
- }
for (size_t i = 0; i < opList.count; i++) {
const BakedOpState& state = *(opList.states[i]);
TextureVertex* rectVerts = &vertices[i * 4];
@@ -69,7 +64,7 @@ void BakedOpDispatcher::onMergedBitmapOps(BakedOpRenderer& renderer,
// pure translate, so snap (same behavior as onBitmapOp)
opBounds.snapToPixelBoundaries();
}
- storeTexturedRect(rectVerts, opBounds, texCoords);
+ storeTexturedRect(rectVerts, opBounds);
renderer.dirtyRenderTarget(opBounds);
}
@@ -92,8 +87,6 @@ void BakedOpDispatcher::onMergedPatchOps(BakedOpRenderer& renderer,
const MergedBakedOpList& opList) {
const PatchOp& firstOp = *(static_cast<const PatchOp*>(opList.states[0]->op));
const BakedOpState& firstState = *(opList.states[0]);
- AssetAtlas::Entry* entry = renderer.renderState().assetAtlas().getEntry(
- firstOp.bitmap->pixelRef());
// Batches will usually contain a small number of items so it's
// worth performing a first iteration to count the exact number
@@ -105,7 +98,7 @@ void BakedOpDispatcher::onMergedPatchOps(BakedOpRenderer& renderer,
// TODO: cache mesh lookups
const Patch* opMesh = renderer.caches().patchCache.get(
- entry, op.bitmap->width(), op.bitmap->height(),
+ op.bitmap->width(), op.bitmap->height(),
op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight(), op.patch);
totalVertices += opMesh->verticesCount;
}
@@ -126,7 +119,7 @@ void BakedOpDispatcher::onMergedPatchOps(BakedOpRenderer& renderer,
// TODO: cache mesh lookups
const Patch* opMesh = renderer.caches().patchCache.get(
- entry, op.bitmap->width(), op.bitmap->height(),
+ op.bitmap->width(), op.bitmap->height(),
op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight(), op.patch);
@@ -172,7 +165,7 @@ void BakedOpDispatcher::onMergedPatchOps(BakedOpRenderer& renderer,
}
- Texture* texture = entry ? entry->texture : renderer.caches().textureCache.get(firstOp.bitmap);
+ Texture* texture = renderer.caches().textureCache.get(firstOp.bitmap);
if (!texture) return;
const AutoTexture autoCleanup(texture);
@@ -442,7 +435,12 @@ void BakedOpDispatcher::onBitmapOp(BakedOpRenderer& renderer, const BitmapOp& op
}
void BakedOpDispatcher::onBitmapMeshOp(BakedOpRenderer& renderer, const BitmapMeshOp& op, const BakedOpState& state) {
- const static UvMapper defaultUvMapper;
+ Texture* texture = renderer.caches().textureCache.get(op.bitmap);
+ if (!texture) {
+ return;
+ }
+ const AutoTexture autoCleanup(texture);
+
const uint32_t elementCount = op.meshWidth * op.meshHeight * 6;
std::unique_ptr<ColorTextureVertex[]> mesh(new ColorTextureVertex[elementCount]);
@@ -457,9 +455,6 @@ void BakedOpDispatcher::onBitmapMeshOp(BakedOpRenderer& renderer, const BitmapMe
colors = tempColors.get();
}
- Texture* texture = renderer.renderState().assetAtlas().getEntryTexture(op.bitmap->pixelRef());
- const UvMapper& mapper(texture && texture->uvMapper ? *texture->uvMapper : defaultUvMapper);
-
for (int32_t y = 0; y < op.meshHeight; y++) {
for (int32_t x = 0; x < op.meshWidth; x++) {
uint32_t i = (y * (op.meshWidth + 1) + x) * 2;
@@ -469,8 +464,6 @@ void BakedOpDispatcher::onBitmapMeshOp(BakedOpRenderer& renderer, const BitmapMe
float v1 = float(y) / op.meshHeight;
float v2 = float(y + 1) / op.meshHeight;
- mapper.map(u1, v1, u2, v2);
-
int ax = i + (op.meshWidth + 1) * 2;
int ay = ax + 1;
int bx = i;
@@ -491,14 +484,6 @@ void BakedOpDispatcher::onBitmapMeshOp(BakedOpRenderer& renderer, const BitmapMe
}
}
- if (!texture) {
- texture = renderer.caches().textureCache.get(op.bitmap);
- if (!texture) {
- return;
- }
- }
- const AutoTexture autoCleanup(texture);
-
/*
* TODO: handle alpha_8 textures correctly by applying paint color, but *not*
* shader in that case to mimic the behavior in SkiaCanvas::drawBitmapMesh.
@@ -599,12 +584,11 @@ void BakedOpDispatcher::onPatchOp(BakedOpRenderer& renderer, const PatchOp& op,
}
// TODO: avoid redoing the below work each frame:
- AssetAtlas::Entry* entry = renderer.renderState().assetAtlas().getEntry(op.bitmap->pixelRef());
const Patch* mesh = renderer.caches().patchCache.get(
- entry, op.bitmap->width(), op.bitmap->height(),
+ op.bitmap->width(), op.bitmap->height(),
op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight(), op.patch);
- Texture* texture = entry ? entry->texture : renderer.caches().textureCache.get(op.bitmap);
+ Texture* texture = renderer.caches().textureCache.get(op.bitmap);
if (CC_LIKELY(texture)) {
const AutoTexture autoCleanup(texture);
Glop glop;
diff --git a/libs/hwui/BakedOpRenderer.cpp b/libs/hwui/BakedOpRenderer.cpp
index 6db345ac0006..ac7a600af85f 100644
--- a/libs/hwui/BakedOpRenderer.cpp
+++ b/libs/hwui/BakedOpRenderer.cpp
@@ -182,11 +182,7 @@ void BakedOpRenderer::clearColorBuffer(const Rect& rect) {
}
Texture* BakedOpRenderer::getTexture(const SkBitmap* bitmap) {
- Texture* texture = mRenderState.assetAtlas().getEntryTexture(bitmap->pixelRef());
- if (!texture) {
- return mCaches.textureCache.get(bitmap);
- }
- return texture;
+ return mCaches.textureCache.get(bitmap);
}
void BakedOpRenderer::drawRects(const float* rects, int count, const SkPaint* paint) {
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index 741cdccaa778..b463e45fb39b 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -53,7 +53,6 @@ Caches::Caches(RenderState& renderState)
: gradientCache(mExtensions)
, patchCache(renderState)
, programCache(mExtensions)
- , dither(*this)
, mRenderState(&renderState)
, mInitialized(false) {
INIT_LOGD("Creating OpenGL renderer caches");
@@ -238,7 +237,6 @@ void Caches::flush(FlushMode mode) {
gradientCache.clear();
fontRenderer.clear();
fboCache.clear();
- dither.clear();
// fall through
case FlushMode::Moderate:
fontRenderer.flush();
diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h
index 344ee71a2cc5..7c2e78c7d3b8 100644
--- a/libs/hwui/Caches.h
+++ b/libs/hwui/Caches.h
@@ -16,8 +16,6 @@
#pragma once
-#include "AssetAtlas.h"
-#include "Dither.h"
#include "Extensions.h"
#include "FboCache.h"
#include "GammaFontRenderer.h"
@@ -130,6 +128,15 @@ public:
TextureVertex* getRegionMesh();
/**
+ * Returns the GL RGBA internal format to use for the current device
+ * If the device supports linear blending and needSRGB is true,
+ * this function returns GL_SRGB8_ALPHA8, otherwise it returns GL_RGBA
+ */
+ constexpr GLint rgbaInternalFormat(bool needSRGB = true) const {
+ return extensions().hasSRGB() && needSRGB ? GL_SRGB8_ALPHA8 : GL_RGBA;
+ }
+
+ /**
* Displays the memory usage of each cache and the total sum.
*/
void dumpMemoryUsage();
@@ -157,8 +164,6 @@ public:
TaskManager tasks;
- Dither dither;
-
bool gpuPixelBuffersEnabled;
// Debug methods
@@ -169,7 +174,7 @@ public:
void setProgram(const ProgramDescription& description);
void setProgram(Program* program);
- Extensions& extensions() { return mExtensions; }
+ const Extensions& extensions() const { return mExtensions; }
Program& program() { return *mProgram; }
PixelBufferState& pixelBufferState() { return *mPixelBufferState; }
TextureState& textureState() { return *mTextureState; }
diff --git a/libs/hwui/Dither.cpp b/libs/hwui/Dither.cpp
deleted file mode 100644
index ec2013e27401..000000000000
--- a/libs/hwui/Dither.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#include "Caches.h"
-#include "Dither.h"
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Lifecycle
-///////////////////////////////////////////////////////////////////////////////
-
-Dither::Dither(Caches& caches)
- : mCaches(caches)
- , mInitialized(false)
- , mDitherTexture(0) {
-}
-
-void Dither::bindDitherTexture() {
- if (!mInitialized) {
- glGenTextures(1, &mDitherTexture);
- mCaches.textureState().bindTexture(mDitherTexture);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-
- if (mCaches.extensions().hasFloatTextures()) {
- // We use a R16F texture, let's remap the alpha channel to the
- // red channel to avoid changing the shader sampling code on GL ES 3.0+
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_RED);
-
- float dither = 1.0f / (255.0f * DITHER_KERNEL_SIZE * DITHER_KERNEL_SIZE);
- const GLfloat pattern[] = {
- 0 * dither, 8 * dither, 2 * dither, 10 * dither,
- 12 * dither, 4 * dither, 14 * dither, 6 * dither,
- 3 * dither, 11 * dither, 1 * dither, 9 * dither,
- 15 * dither, 7 * dither, 13 * dither, 5 * dither
- };
-
- glTexImage2D(GL_TEXTURE_2D, 0, GL_R16F, DITHER_KERNEL_SIZE, DITHER_KERNEL_SIZE, 0,
- GL_RED, GL_FLOAT, &pattern);
- } else {
- const uint8_t pattern[] = {
- 0, 8, 2, 10,
- 12, 4, 14, 6,
- 3, 11, 1, 9,
- 15, 7, 13, 5
- };
-
- glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, DITHER_KERNEL_SIZE, DITHER_KERNEL_SIZE, 0,
- GL_ALPHA, GL_UNSIGNED_BYTE, &pattern);
- }
-
- mInitialized = true;
- } else {
- mCaches.textureState().bindTexture(mDitherTexture);
- }
-}
-
-void Dither::clear() {
- if (mInitialized) {
- mCaches.textureState().deleteTexture(mDitherTexture);
- mInitialized = false;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Program management
-///////////////////////////////////////////////////////////////////////////////
-
-void Dither::setupProgram(Program& program, GLuint* textureUnit) {
- GLuint textureSlot = (*textureUnit)++;
- mCaches.textureState().activateTexture(textureSlot);
-
- bindDitherTexture();
-
- glUniform1i(program.getUniform("ditherSampler"), textureSlot);
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/Dither.h b/libs/hwui/Dither.h
deleted file mode 100644
index 6af3e8384472..000000000000
--- a/libs/hwui/Dither.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#ifndef ANDROID_HWUI_DITHER_H
-#define ANDROID_HWUI_DITHER_H
-
-#include <GLES3/gl3.h>
-
-namespace android {
-namespace uirenderer {
-
-class Caches;
-class Extensions;
-class Program;
-
-// Must be a power of two
-#define DITHER_KERNEL_SIZE 4
-// These must not use the .0f notation as they are used from GLSL
-#define DITHER_KERNEL_SIZE_INV (1.0 / 4.0)
-#define DITHER_KERNEL_SIZE_INV_SQUARE (1.0 / 16.0)
-
-/**
- * Handles dithering for programs.
- */
-class Dither {
-public:
- explicit Dither(Caches& caches);
-
- void clear();
- void setupProgram(Program& program, GLuint* textureUnit);
-
-private:
- void bindDitherTexture();
-
- Caches& mCaches;
- bool mInitialized;
- GLuint mDitherTexture;
-};
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_DITHER_H
diff --git a/libs/hwui/Extensions.cpp b/libs/hwui/Extensions.cpp
index 02caaa49e99c..4dc7536d60bc 100644
--- a/libs/hwui/Extensions.cpp
+++ b/libs/hwui/Extensions.cpp
@@ -22,6 +22,7 @@
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
+
#include <utils/Log.h>
namespace android {
@@ -44,6 +45,14 @@ Extensions::Extensions() {
mHas1BitStencil = extensions.has("GL_OES_stencil1");
mHas4BitStencil = extensions.has("GL_OES_stencil4");
mHasUnpackSubImage = extensions.has("GL_EXT_unpack_subimage");
+ mHasSRGB = extensions.has("GL_EXT_sRGB");
+ mHasSRGBWriteControl = extensions.has("GL_EXT_sRGB_write_control");
+
+ // If linear blending is enabled, the device must have ES3.0 and GL_EXT_sRGB_write_control
+#ifdef ANDROID_ENABLE_LINEAR_BLENDING
+ assert(mVersionMajor >= 3 || mHasSRGB);
+ assert(mHasSRGBWriteControl);
+#endif
const char* version = (const char*) glGetString(GL_VERSION);
diff --git a/libs/hwui/Extensions.h b/libs/hwui/Extensions.h
index 67cc747015e0..cc73c2317720 100644
--- a/libs/hwui/Extensions.h
+++ b/libs/hwui/Extensions.h
@@ -43,6 +43,8 @@ public:
inline bool hasPixelBufferObjects() const { return mVersionMajor >= 3; }
inline bool hasOcclusionQueries() const { return mVersionMajor >= 3; }
inline bool hasFloatTextures() const { return mVersionMajor >= 3; }
+ inline bool hasSRGB() const { return mVersionMajor >= 3 || mHasSRGB; }
+ inline bool hasSRGBWriteControl() const { return hasSRGB() && mHasSRGBWriteControl; }
inline int getMajorGlVersion() const { return mVersionMajor; }
inline int getMinorGlVersion() const { return mVersionMinor; }
@@ -55,6 +57,8 @@ private:
bool mHas1BitStencil;
bool mHas4BitStencil;
bool mHasUnpackSubImage;
+ bool mHasSRGB;
+ bool mHasSRGBWriteControl;
int mVersionMajor;
int mVersionMinor;
diff --git a/libs/hwui/FloatColor.h b/libs/hwui/FloatColor.h
index 9a39ec28aa3d..6d19b7ccdd79 100644
--- a/libs/hwui/FloatColor.h
+++ b/libs/hwui/FloatColor.h
@@ -16,6 +16,7 @@
#ifndef FLOATCOLOR_H
#define FLOATCOLOR_H
+#include "utils/Color.h"
#include "utils/Macros.h"
#include "utils/MathUtils.h"
@@ -25,11 +26,13 @@ namespace android {
namespace uirenderer {
struct FloatColor {
+ // "color" is a gamma-encoded sRGB color
+ // After calling this method, the color is stored as a pre-multiplied linear color
void set(uint32_t color) {
a = ((color >> 24) & 0xff) / 255.0f;
- r = a * ((color >> 16) & 0xff) / 255.0f;
- g = a * ((color >> 8) & 0xff) / 255.0f;
- b = a * ((color ) & 0xff) / 255.0f;
+ r = a * EOCF_sRGB(((color >> 16) & 0xff) / 255.0f);
+ g = a * EOCF_sRGB(((color >> 8) & 0xff) / 255.0f);
+ b = a * EOCF_sRGB(((color ) & 0xff) / 255.0f);
}
bool isNotBlack() {
diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp
index 9b60dfcb5867..effc65ea967f 100644
--- a/libs/hwui/FontRenderer.cpp
+++ b/libs/hwui/FontRenderer.cpp
@@ -60,11 +60,17 @@ void TextDrawFunctor::draw(CacheTexture& texture, bool linearFiltering) {
}
int transformFlags = pureTranslate
? TransformFlags::MeshIgnoresCanvasTransform : TransformFlags::None;
+#ifdef ANDROID_ENABLE_LINEAR_BLENDING
+ bool gammaCorrection = true;
+#else
+ bool gammaCorrection = false;
+#endif
Glop glop;
GlopBuilder(renderer->renderState(), renderer->caches(), &glop)
.setRoundRectClipState(bakedState->roundRectClipState)
.setMeshTexturedIndexedQuads(texture.mesh(), texture.meshElementCount())
.setFillTexturePaint(texture.getTexture(), textureFillFlags, paint, bakedState->alpha)
+ .setGammaCorrection(gammaCorrection)
.setTransform(bakedState->computedState.transform, transformFlags)
.setModelViewIdentityEmptyBounds()
.build();
@@ -287,24 +293,23 @@ void FontRenderer::cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyp
// Copy the glyph image, taking the mask format into account
switch (format) {
case SkMask::kA8_Format: {
- uint32_t cacheX = 0, bX = 0, cacheY = 0, bY = 0;
uint32_t row = (startY - TEXTURE_BORDER_SIZE) * cacheWidth + startX
- TEXTURE_BORDER_SIZE;
// write leading border line
memset(&cacheBuffer[row], 0, glyph.fWidth + 2 * TEXTURE_BORDER_SIZE);
// write glyph data
if (mGammaTable) {
- for (cacheY = startY, bY = 0; cacheY < endY; cacheY++, bY += srcStride) {
+ for (uint32_t cacheY = startY, bY = 0; cacheY < endY; cacheY++, bY += srcStride) {
row = cacheY * cacheWidth;
cacheBuffer[row + startX - TEXTURE_BORDER_SIZE] = 0;
- for (cacheX = startX, bX = 0; cacheX < endX; cacheX++, bX++) {
+ for (uint32_t cacheX = startX, bX = 0; cacheX < endX; cacheX++, bX++) {
uint8_t tempCol = bitmapBuffer[bY + bX];
cacheBuffer[row + cacheX] = mGammaTable[tempCol];
}
cacheBuffer[row + endX + TEXTURE_BORDER_SIZE - 1] = 0;
}
} else {
- for (cacheY = startY, bY = 0; cacheY < endY; cacheY++, bY += srcStride) {
+ for (uint32_t cacheY = startY, bY = 0; cacheY < endY; cacheY++, bY += srcStride) {
row = cacheY * cacheWidth;
memcpy(&cacheBuffer[row + startX], &bitmapBuffer[bY], glyph.fWidth);
cacheBuffer[row + startX - TEXTURE_BORDER_SIZE] = 0;
diff --git a/libs/hwui/FrameBuilder.cpp b/libs/hwui/FrameBuilder.cpp
index be4fdac5f800..17ad0e36fa90 100644
--- a/libs/hwui/FrameBuilder.cpp
+++ b/libs/hwui/FrameBuilder.cpp
@@ -612,7 +612,6 @@ void FrameBuilder::deferBitmapOp(const BitmapOp& op) {
&& op.bitmap->colorType() != kAlpha_8_SkColorType
&& hasMergeableClip(*bakedState)) {
mergeid_t mergeId = reinterpret_cast<mergeid_t>(op.bitmap->getGenerationID());
- // TODO: AssetAtlas in mergeId
currentLayer().deferMergeableOp(mAllocator, bakedState, OpBatchType::Bitmap, mergeId);
} else {
currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::Bitmap);
@@ -687,7 +686,6 @@ void FrameBuilder::deferPatchOp(const PatchOp& op) {
&& PaintUtils::getXfermodeDirect(op.paint) == SkXfermode::kSrcOver_Mode
&& hasMergeableClip(*bakedState)) {
mergeid_t mergeId = reinterpret_cast<mergeid_t>(op.bitmap->getGenerationID());
- // TODO: AssetAtlas in mergeId
// Only use the MergedPatch batchId when merged, so Bitmap+Patch don't try to merge together
currentLayer().deferMergeableOp(mAllocator, bakedState, OpBatchType::MergedPatch, mergeId);
diff --git a/libs/hwui/GammaFontRenderer.cpp b/libs/hwui/GammaFontRenderer.cpp
index 96cac86386b5..8aff0a24b4f0 100644
--- a/libs/hwui/GammaFontRenderer.cpp
+++ b/libs/hwui/GammaFontRenderer.cpp
@@ -24,12 +24,13 @@ namespace uirenderer {
GammaFontRenderer::GammaFontRenderer() {
INIT_LOGD("Creating lookup gamma font renderer");
+#ifndef ANDROID_ENABLE_LINEAR_BLENDING
// Compute the gamma tables
const float gamma = 1.0f / Properties::textGamma;
-
for (uint32_t i = 0; i <= 255; i++) {
mGammaTable[i] = uint8_t((float)::floor(pow(i / 255.0f, gamma) * 255.0f + 0.5f));
}
+#endif
}
void GammaFontRenderer::endPrecaching() {
diff --git a/libs/hwui/GammaFontRenderer.h b/libs/hwui/GammaFontRenderer.h
index bd27a1a72060..c9cf69bc7d9f 100644
--- a/libs/hwui/GammaFontRenderer.h
+++ b/libs/hwui/GammaFontRenderer.h
@@ -18,11 +18,6 @@
#define ANDROID_HWUI_GAMMA_FONT_RENDERER_H
#include "FontRenderer.h"
-#include "Program.h"
-
-#include <SkPaint.h>
-
-#include <utils/String8.h>
namespace android {
namespace uirenderer {
@@ -43,7 +38,11 @@ public:
FontRenderer& getFontRenderer() {
if (!mRenderer) {
- mRenderer.reset(new FontRenderer(&mGammaTable[0]));
+ const uint8_t* table = nullptr;
+#ifndef ANDROID_ENABLE_LINEAR_BLENDING
+ table = &mGammaTable[0];
+#endif
+ mRenderer.reset(new FontRenderer(table));
}
return *mRenderer;
}
@@ -64,7 +63,9 @@ public:
private:
std::unique_ptr<FontRenderer> mRenderer;
+#ifndef ANDROID_ENABLE_LINEAR_BLENDING
uint8_t mGammaTable[256];
+#endif
};
}; // namespace uirenderer
diff --git a/libs/hwui/GlopBuilder.cpp b/libs/hwui/GlopBuilder.cpp
index 1091736ab9c3..ff88d020030c 100644
--- a/libs/hwui/GlopBuilder.cpp
+++ b/libs/hwui/GlopBuilder.cpp
@@ -223,16 +223,16 @@ void GlopBuilder::setFill(int color, float alphaScale,
SkXfermode::Mode mode, Blend::ModeOrderSwap modeUsage,
const SkShader* shader, const SkColorFilter* colorFilter) {
if (mode != SkXfermode::kClear_Mode) {
- float alpha = (SkColorGetA(color) / 255.0f) * alphaScale;
if (!shader) {
- float colorScale = alpha / 255.0f;
- mOutGlop->fill.color = {
- colorScale * SkColorGetR(color),
- colorScale * SkColorGetG(color),
- colorScale * SkColorGetB(color),
- alpha
- };
+ FloatColor c;
+ c.set(color);
+ c.r *= alphaScale;
+ c.g *= alphaScale;
+ c.b *= alphaScale;
+ c.a *= alphaScale;
+ mOutGlop->fill.color = c;
} else {
+ float alpha = (SkColorGetA(color) / 255.0f) * alphaScale;
mOutGlop->fill.color = { 1, 1, 1, alpha };
}
} else {
@@ -276,15 +276,7 @@ void GlopBuilder::setFill(int color, float alphaScale,
if (colorFilter->asColorMode(&color, &mode)) {
mOutGlop->fill.filterMode = mDescription.colorOp = ProgramDescription::ColorFilterMode::Blend;
mDescription.colorMode = mode;
-
- const float alpha = SkColorGetA(color) / 255.0f;
- float colorScale = alpha / 255.0f;
- mOutGlop->fill.filter.color = {
- colorScale * SkColorGetR(color),
- colorScale * SkColorGetG(color),
- colorScale * SkColorGetB(color),
- alpha,
- };
+ mOutGlop->fill.filter.color.set(color);
} else if (colorFilter->asColorMatrix(srcColorMatrix)) {
mOutGlop->fill.filterMode = mDescription.colorOp = ProgramDescription::ColorFilterMode::Matrix;
@@ -297,10 +289,10 @@ void GlopBuilder::setFill(int color, float alphaScale,
// Skia uses the range [0..255] for the addition vector, but we need
// the [0..1] range to apply the vector in GLSL
float* colorVector = mOutGlop->fill.filter.matrix.vector;
- colorVector[0] = srcColorMatrix[4] / 255.0f;
- colorVector[1] = srcColorMatrix[9] / 255.0f;
- colorVector[2] = srcColorMatrix[14] / 255.0f;
- colorVector[3] = srcColorMatrix[19] / 255.0f;
+ colorVector[0] = EOCF_sRGB(srcColorMatrix[4] / 255.0f);
+ colorVector[1] = EOCF_sRGB(srcColorMatrix[9] / 255.0f);
+ colorVector[2] = EOCF_sRGB(srcColorMatrix[14] / 255.0f);
+ colorVector[3] = EOCF_sRGB(srcColorMatrix[19] / 255.0f);
} else {
LOG_ALWAYS_FATAL("unsupported ColorFilter");
}
@@ -481,6 +473,13 @@ GlopBuilder& GlopBuilder::setFillExternalTexture(Texture& texture, Matrix4& text
return *this;
}
+GlopBuilder& GlopBuilder::setGammaCorrection(bool enabled) {
+ REQUIRE_STAGES(kFillStage);
+
+ mDescription.hasGammaCorrection = enabled;
+ return *this;
+}
+
////////////////////////////////////////////////////////////////////////////////
// Transform
////////////////////////////////////////////////////////////////////////////////
diff --git a/libs/hwui/GlopBuilder.h b/libs/hwui/GlopBuilder.h
index 11524615074e..1f3b53abdb29 100644
--- a/libs/hwui/GlopBuilder.h
+++ b/libs/hwui/GlopBuilder.h
@@ -105,6 +105,8 @@ public:
GlopBuilder& setRoundRectClipState(const RoundRectClipState* roundRectClipState);
+ GlopBuilder& setGammaCorrection(bool enabled);
+
void build();
static void dump(const Glop& glop);
diff --git a/libs/hwui/GradientCache.cpp b/libs/hwui/GradientCache.cpp
index c8f5e9435594..8573ab078aaf 100644
--- a/libs/hwui/GradientCache.cpp
+++ b/libs/hwui/GradientCache.cpp
@@ -67,7 +67,8 @@ GradientCache::GradientCache(Extensions& extensions)
, mSize(0)
, mMaxSize(Properties::gradientCacheSize)
, mUseFloatTexture(extensions.hasFloatTextures())
- , mHasNpot(extensions.hasNPot()){
+ , mHasNpot(extensions.hasNPot())
+ , mHasSRGB(extensions.hasSRGB()) {
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
mCache.setOnEntryRemovedListener(this);
@@ -176,71 +177,50 @@ Texture* GradientCache::addLinearGradient(GradientCacheEntry& gradient,
size_t GradientCache::bytesPerPixel() const {
// We use 4 channels (RGBA)
- return 4 * (mUseFloatTexture ? sizeof(float) : sizeof(uint8_t));
-}
-
-void GradientCache::splitToBytes(uint32_t inColor, GradientColor& outColor) const {
- outColor.r = (inColor >> 16) & 0xff;
- outColor.g = (inColor >> 8) & 0xff;
- outColor.b = (inColor >> 0) & 0xff;
- outColor.a = (inColor >> 24) & 0xff;
+ return 4 * (mUseFloatTexture ? /* fp16 */ 2 : sizeof(uint8_t));
}
-void GradientCache::splitToFloats(uint32_t inColor, GradientColor& outColor) const {
- outColor.r = ((inColor >> 16) & 0xff) / 255.0f;
- outColor.g = ((inColor >> 8) & 0xff) / 255.0f;
- outColor.b = ((inColor >> 0) & 0xff) / 255.0f;
- outColor.a = ((inColor >> 24) & 0xff) / 255.0f;
+size_t GradientCache::sourceBytesPerPixel() const {
+ // We use 4 channels (RGBA) and upload from floats (not half floats)
+ return 4 * (mUseFloatTexture ? sizeof(float) : sizeof(uint8_t));
}
-void GradientCache::mixBytes(GradientColor& start, GradientColor& end, float amount,
+void GradientCache::mixBytes(FloatColor& start, FloatColor& end, float amount,
uint8_t*& dst) const {
float oppAmount = 1.0f - amount;
- const float alpha = start.a * oppAmount + end.a * amount;
- const float a = alpha / 255.0f;
-
- *dst++ = uint8_t(a * (start.r * oppAmount + end.r * amount));
- *dst++ = uint8_t(a * (start.g * oppAmount + end.g * amount));
- *dst++ = uint8_t(a * (start.b * oppAmount + end.b * amount));
- *dst++ = uint8_t(alpha);
+ *dst++ = uint8_t(OECF_sRGB((start.r * oppAmount + end.r * amount) * 255.0f));
+ *dst++ = uint8_t(OECF_sRGB((start.g * oppAmount + end.g * amount) * 255.0f));
+ *dst++ = uint8_t(OECF_sRGB((start.b * oppAmount + end.b * amount) * 255.0f));
+ *dst++ = uint8_t( (start.a * oppAmount + end.a * amount) * 255.0f);
}
-void GradientCache::mixFloats(GradientColor& start, GradientColor& end, float amount,
+void GradientCache::mixFloats(FloatColor& start, FloatColor& end, float amount,
uint8_t*& dst) const {
float oppAmount = 1.0f - amount;
- const float a = start.a * oppAmount + end.a * amount;
-
float* d = (float*) dst;
- *d++ = a * (start.r * oppAmount + end.r * amount);
- *d++ = a * (start.g * oppAmount + end.g * amount);
- *d++ = a * (start.b * oppAmount + end.b * amount);
- *d++ = a;
-
+ *d++ = start.r * oppAmount + end.r * amount;
+ *d++ = start.g * oppAmount + end.g * amount;
+ *d++ = start.b * oppAmount + end.b * amount;
+ *d++ = start.a * oppAmount + end.a * amount;
dst += 4 * sizeof(float);
}
void GradientCache::generateTexture(uint32_t* colors, float* positions,
const uint32_t width, const uint32_t height, Texture* texture) {
- const GLsizei rowBytes = width * bytesPerPixel();
+ const GLsizei rowBytes = width * sourceBytesPerPixel();
uint8_t pixels[rowBytes * height];
- static ChannelSplitter gSplitters[] = {
- &android::uirenderer::GradientCache::splitToBytes,
- &android::uirenderer::GradientCache::splitToFloats,
- };
- ChannelSplitter split = gSplitters[mUseFloatTexture];
-
static ChannelMixer gMixers[] = {
- &android::uirenderer::GradientCache::mixBytes,
- &android::uirenderer::GradientCache::mixFloats,
+ &android::uirenderer::GradientCache::mixBytes, // colors are stored gamma-encoded
+ &android::uirenderer::GradientCache::mixFloats, // colors are stored in linear
};
ChannelMixer mix = gMixers[mUseFloatTexture];
- GradientColor start;
- (this->*split)(colors[0], start);
+ FloatColor start;
+ start.set(colors[0]);
- GradientColor end;
- (this->*split)(colors[1], end);
+ FloatColor end;
+ end.set(colors[1]);
int currentPos = 1;
float startPos = positions[0];
@@ -255,7 +235,7 @@ void GradientCache::generateTexture(uint32_t* colors, float* positions,
currentPos++;
- (this->*split)(colors[currentPos], end);
+ end.set(colors[currentPos]);
distance = positions[currentPos] - startPos;
}
@@ -266,10 +246,10 @@ void GradientCache::generateTexture(uint32_t* colors, float* positions,
memcpy(pixels + rowBytes, pixels, rowBytes);
if (mUseFloatTexture) {
- // We have to use GL_RGBA16F because GL_RGBA32F does not support filtering
texture->upload(GL_RGBA16F, width, height, GL_RGBA, GL_FLOAT, pixels);
} else {
- texture->upload(GL_RGBA, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+ GLint internalFormat = mHasSRGB ? GL_SRGB8_ALPHA8 : GL_RGBA;
+ texture->upload(internalFormat, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
}
texture->setFilter(GL_LINEAR);
diff --git a/libs/hwui/GradientCache.h b/libs/hwui/GradientCache.h
index 49be19ab1c81..3fd8e80dd64b 100644
--- a/libs/hwui/GradientCache.h
+++ b/libs/hwui/GradientCache.h
@@ -26,6 +26,8 @@
#include <utils/LruCache.h>
#include <utils/Mutex.h>
+#include "FloatColor.h"
+
namespace android {
namespace uirenderer {
@@ -150,25 +152,13 @@ private:
void getGradientInfo(const uint32_t* colors, const int count, GradientInfo& info);
size_t bytesPerPixel() const;
+ size_t sourceBytesPerPixel() const;
- struct GradientColor {
- float r;
- float g;
- float b;
- float a;
- };
-
- typedef void (GradientCache::*ChannelSplitter)(uint32_t inColor,
- GradientColor& outColor) const;
-
- void splitToBytes(uint32_t inColor, GradientColor& outColor) const;
- void splitToFloats(uint32_t inColor, GradientColor& outColor) const;
-
- typedef void (GradientCache::*ChannelMixer)(GradientColor& start, GradientColor& end,
+ typedef void (GradientCache::*ChannelMixer)(FloatColor& start, FloatColor& end,
float amount, uint8_t*& dst) const;
- void mixBytes(GradientColor& start, GradientColor& end, float amount, uint8_t*& dst) const;
- void mixFloats(GradientColor& start, GradientColor& end, float amount, uint8_t*& dst) const;
+ void mixBytes(FloatColor& start, FloatColor& end, float amount, uint8_t*& dst) const;
+ void mixFloats(FloatColor& start, FloatColor& end, float amount, uint8_t*& dst) const;
LruCache<GradientCacheEntry, Texture*> mCache;
@@ -178,6 +168,7 @@ private:
GLint mMaxTextureSize;
bool mUseFloatTexture;
bool mHasNpot;
+ bool mHasSRGB;
mutable Mutex mLock;
}; // class GradientCache
diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h
index c688a96aa8cd..01650ef5745f 100644
--- a/libs/hwui/Layer.h
+++ b/libs/hwui/Layer.h
@@ -75,7 +75,7 @@ public:
}
void setSize(uint32_t width, uint32_t height) {
- texture.updateSize(width, height, texture.format());
+ texture.updateSize(width, height, texture.internalFormat(), texture.format());
}
inline void setBlend(bool blend) {
diff --git a/libs/hwui/PatchCache.cpp b/libs/hwui/PatchCache.cpp
index a6c281dc9839..52c62cc34670 100644
--- a/libs/hwui/PatchCache.cpp
+++ b/libs/hwui/PatchCache.cpp
@@ -225,17 +225,15 @@ void PatchCache::setupMesh(Patch* newMesh) {
static const UvMapper sIdentity;
-const Patch* PatchCache::get(const AssetAtlas::Entry* entry,
- const uint32_t bitmapWidth, const uint32_t bitmapHeight,
+const Patch* PatchCache::get( const uint32_t bitmapWidth, const uint32_t bitmapHeight,
const float pixelWidth, const float pixelHeight, const Res_png_9patch* patch) {
const PatchDescription description(bitmapWidth, bitmapHeight, pixelWidth, pixelHeight, patch);
const Patch* mesh = mCache.get(description);
if (!mesh) {
- const UvMapper& mapper = entry ? entry->uvMapper : sIdentity;
Patch* newMesh = new Patch(bitmapWidth, bitmapHeight,
- pixelWidth, pixelHeight, mapper, patch);
+ pixelWidth, pixelHeight, sIdentity, patch);
if (newMesh->vertices) {
setupMesh(newMesh);
diff --git a/libs/hwui/PatchCache.h b/libs/hwui/PatchCache.h
index 6e6a730ffe2b..0624c355332c 100644
--- a/libs/hwui/PatchCache.h
+++ b/libs/hwui/PatchCache.h
@@ -22,7 +22,6 @@
#include <androidfw/ResourceTypes.h>
-#include "AssetAtlas.h"
#include "Debug.h"
#include "utils/Pair.h"
@@ -54,8 +53,7 @@ public:
explicit PatchCache(RenderState& renderState);
~PatchCache();
- const Patch* get(const AssetAtlas::Entry* entry,
- const uint32_t bitmapWidth, const uint32_t bitmapHeight,
+ const Patch* get(const uint32_t bitmapWidth, const uint32_t bitmapHeight,
const float pixelWidth, const float pixelHeight, const Res_png_9patch* patch);
void clear();
diff --git a/libs/hwui/Program.h b/libs/hwui/Program.h
index e5200a516777..f5beb62a84ed 100644
--- a/libs/hwui/Program.h
+++ b/libs/hwui/Program.h
@@ -85,6 +85,8 @@ namespace uirenderer {
#define PROGRAM_HAS_DEBUG_HIGHLIGHT 42
#define PROGRAM_HAS_ROUND_RECT_CLIP 43
+#define PROGRAM_HAS_GAMMA_CORRECTION 44
+
///////////////////////////////////////////////////////////////////////////////
// Types
///////////////////////////////////////////////////////////////////////////////
@@ -158,6 +160,8 @@ struct ProgramDescription {
bool hasDebugHighlight;
bool hasRoundRectClip;
+ bool hasGammaCorrection;
+
/**
* Resets this description. All fields are reset back to the default
* values they hold after building a new instance.
@@ -196,6 +200,8 @@ struct ProgramDescription {
hasDebugHighlight = false;
hasRoundRectClip = false;
+
+ hasGammaCorrection = false;
}
/**
@@ -262,6 +268,7 @@ struct ProgramDescription {
if (hasColors) key |= programid(0x1) << PROGRAM_HAS_COLORS;
if (hasDebugHighlight) key |= programid(0x1) << PROGRAM_HAS_DEBUG_HIGHLIGHT;
if (hasRoundRectClip) key |= programid(0x1) << PROGRAM_HAS_ROUND_RECT_CLIP;
+ if (hasGammaCorrection) key |= programid(0x1) << PROGRAM_HAS_GAMMA_CORRECTION;
return key;
}
diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp
index 59225e108ac7..315c60eccb3e 100644
--- a/libs/hwui/ProgramCache.cpp
+++ b/libs/hwui/ProgramCache.cpp
@@ -17,8 +17,8 @@
#include <utils/String8.h>
#include "Caches.h"
-#include "Dither.h"
#include "ProgramCache.h"
+#include "Properties.h"
namespace android {
namespace uirenderer {
@@ -69,22 +69,16 @@ const char* gVS_Header_Varyings_HasBitmap =
"varying highp vec2 outBitmapTexCoords;\n";
const char* gVS_Header_Varyings_HasGradient[6] = {
// Linear
- "varying highp vec2 linear;\n"
- "varying vec2 ditherTexCoords;\n",
- "varying float linear;\n"
- "varying vec2 ditherTexCoords;\n",
+ "varying highp vec2 linear;\n",
+ "varying float linear;\n",
// Circular
- "varying highp vec2 circular;\n"
- "varying vec2 ditherTexCoords;\n",
- "varying highp vec2 circular;\n"
- "varying vec2 ditherTexCoords;\n",
+ "varying highp vec2 circular;\n",
+ "varying highp vec2 circular;\n",
// Sweep
- "varying highp vec2 sweep;\n"
- "varying vec2 ditherTexCoords;\n",
- "varying highp vec2 sweep;\n"
- "varying vec2 ditherTexCoords;\n",
+ "varying highp vec2 sweep;\n",
+ "varying highp vec2 sweep;\n",
};
const char* gVS_Header_Varyings_HasRoundRectClip =
"varying highp vec2 roundRectPos;\n";
@@ -98,22 +92,16 @@ const char* gVS_Main_OutTransformedTexCoords =
" outTexCoords = (mainTextureTransform * vec4(texCoords, 0.0, 1.0)).xy;\n";
const char* gVS_Main_OutGradient[6] = {
// Linear
- " linear = vec2((screenSpace * position).x, 0.5);\n"
- " ditherTexCoords = (transform * position).xy * " STR(DITHER_KERNEL_SIZE_INV) ";\n",
- " linear = (screenSpace * position).x;\n"
- " ditherTexCoords = (transform * position).xy * " STR(DITHER_KERNEL_SIZE_INV) ";\n",
+ " linear = vec2((screenSpace * position).x, 0.5);\n",
+ " linear = (screenSpace * position).x;\n",
// Circular
- " circular = (screenSpace * position).xy;\n"
- " ditherTexCoords = (transform * position).xy * " STR(DITHER_KERNEL_SIZE_INV) ";\n",
- " circular = (screenSpace * position).xy;\n"
- " ditherTexCoords = (transform * position).xy * " STR(DITHER_KERNEL_SIZE_INV) ";\n",
+ " circular = (screenSpace * position).xy;\n",
+ " circular = (screenSpace * position).xy;\n",
// Sweep
+ " sweep = (screenSpace * position).xy;\n",
" sweep = (screenSpace * position).xy;\n"
- " ditherTexCoords = (transform * position).xy * " STR(DITHER_KERNEL_SIZE_INV) ";\n",
- " sweep = (screenSpace * position).xy;\n"
- " ditherTexCoords = (transform * position).xy * " STR(DITHER_KERNEL_SIZE_INV) ";\n",
};
const char* gVS_Main_OutBitmapTexCoords =
" outBitmapTexCoords = (textureTransform * position).xy * textureDimension;\n";
@@ -147,12 +135,11 @@ const char* gFS_Uniforms_TextureSampler =
"uniform sampler2D baseSampler;\n";
const char* gFS_Uniforms_ExternalTextureSampler =
"uniform samplerExternalOES baseSampler;\n";
-const char* gFS_Uniforms_Dither =
- "uniform sampler2D ditherSampler;";
const char* gFS_Uniforms_GradientSampler[2] = {
- "%s\n"
+ "uniform vec2 screenSize;\n"
"uniform sampler2D gradientSampler;\n",
- "%s\n"
+
+ "uniform vec2 screenSize;\n"
"uniform vec4 startColor;\n"
"uniform vec4 endColor;\n"
};
@@ -172,18 +159,51 @@ const char* gFS_Uniforms_HasRoundRectClip =
"uniform vec4 roundRectInnerRectLTRB;\n"
"uniform float roundRectRadius;\n";
+// Dithering must be done in the quantization space
+// When we are writing to an sRGB framebuffer, we must do the following:
+// EOCF(OECF(color) + dither)
+// We approximate the transfer functions with gamma 2.0 to avoid branches and pow()
+// The dithering pattern is generated with a triangle noise generator in the range [-0.5,1.5[
+// TODO: Handle linear fp16 render targets
+const char* gFS_Dither_Functions =
+ "\nmediump float triangleNoise(const highp vec2 n) {\n"
+ " highp vec2 p = fract(n * vec2(5.3987, 5.4421));\n"
+ " p += dot(p.yx, p.xy + vec2(21.5351, 14.3137));\n"
+ " highp float xy = p.x * p.y;\n"
+ " return fract(xy * 95.4307) + fract(xy * 75.04961) - 0.5;\n"
+ "}\n";
+const char* gFS_Dither_Preamble[2] = {
+ // Linear framebuffer
+ "\nvec4 dither(const vec4 color) {\n"
+ " return vec4(color.rgb + (triangleNoise(gl_FragCoord.xy * screenSize.xy) / 255.0), color.a);"
+ "}\n",
+ // sRGB framebuffer
+ "\nvec4 dither(const vec4 color) {\n"
+ " vec3 dithered = sqrt(color.rgb) + (triangleNoise(gl_FragCoord.xy * screenSize.xy) / 255.0);\n"
+ " return vec4(dithered * dithered, color.a);\n"
+ "}\n"
+};
+
+// Uses luminance coefficients from Rec.709 to choose the appropriate gamma
+// The gamma() function assumes that bright text will be displayed on a dark
+// background and that dark text will be displayed on bright background
+// The gamma coefficient is chosen to thicken or thin the text accordingly
+// The dot product used to compute the luminance could be approximated with
+// a simple max(color.r, color.g, color.b)
+const char* gFS_Gamma_Preamble =
+ "\n#define GAMMA (%.2f)\n"
+ "#define GAMMA_INV (%.2f)\n"
+ "\nfloat gamma(float a, const vec3 color) {\n"
+ " float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));\n"
+ " return pow(a, luminance < 0.5 ? GAMMA_INV : GAMMA);\n"
+ "}\n";
+
const char* gFS_Main =
"\nvoid main(void) {\n"
- " lowp vec4 fragColor;\n";
+ " vec4 fragColor;\n";
-const char* gFS_Main_Dither[2] = {
- // ES 2.0
- "texture2D(ditherSampler, ditherTexCoords).a * " STR(DITHER_KERNEL_SIZE_INV_SQUARE),
- // ES 3.0
- "texture2D(ditherSampler, ditherTexCoords).a"
-};
-const char* gFS_Main_AddDitherToGradient =
- " gradientColor += %s;\n";
+const char* gFS_Main_AddDither =
+ " fragColor = dither(fragColor);\n";
// Fast cases
const char* gFS_Fast_SingleColor =
@@ -202,24 +222,32 @@ const char* gFS_Fast_SingleA8Texture =
"\nvoid main(void) {\n"
" gl_FragColor = texture2D(baseSampler, outTexCoords);\n"
"}\n\n";
+const char* gFS_Fast_SingleA8Texture_ApplyGamma =
+ "\nvoid main(void) {\n"
+ " gl_FragColor = vec4(0.0, 0.0, 0.0, pow(texture2D(baseSampler, outTexCoords).a, GAMMA));\n"
+ "}\n\n";
const char* gFS_Fast_SingleModulateA8Texture =
"\nvoid main(void) {\n"
" gl_FragColor = color * texture2D(baseSampler, outTexCoords).a;\n"
"}\n\n";
+const char* gFS_Fast_SingleModulateA8Texture_ApplyGamma =
+ "\nvoid main(void) {\n"
+ " gl_FragColor = color * gamma(texture2D(baseSampler, outTexCoords).a, color.rgb);\n"
+ "}\n\n";
const char* gFS_Fast_SingleGradient[2] = {
"\nvoid main(void) {\n"
- " gl_FragColor = %s + texture2D(gradientSampler, linear);\n"
+ " gl_FragColor = dither(texture2D(gradientSampler, linear));\n"
"}\n\n",
"\nvoid main(void) {\n"
- " gl_FragColor = %s + mix(startColor, endColor, clamp(linear, 0.0, 1.0));\n"
+ " gl_FragColor = dither(mix(startColor, endColor, clamp(linear, 0.0, 1.0)));\n"
"}\n\n",
};
const char* gFS_Fast_SingleModulateGradient[2] = {
"\nvoid main(void) {\n"
- " gl_FragColor = %s + color.a * texture2D(gradientSampler, linear);\n"
+ " gl_FragColor = dither(color.a * texture2D(gradientSampler, linear));\n"
"}\n\n",
"\nvoid main(void) {\n"
- " gl_FragColor = %s + color.a * mix(startColor, endColor, clamp(linear, 0.0, 1.0));\n"
+ " gl_FragColor = dither(color.a * mix(startColor, endColor, clamp(linear, 0.0, 1.0)));\n"
"}\n\n"
};
@@ -239,11 +267,13 @@ const char* gFS_Main_FetchTexture[2] = {
// Modulate
" fragColor = color * texture2D(baseSampler, outTexCoords);\n"
};
-const char* gFS_Main_FetchA8Texture[2] = {
+const char* gFS_Main_FetchA8Texture[4] = {
// Don't modulate
" fragColor = texture2D(baseSampler, outTexCoords);\n",
+ " fragColor = texture2D(baseSampler, outTexCoords);\n",
// Modulate
" fragColor = color * texture2D(baseSampler, outTexCoords).a;\n",
+ " fragColor = color * gamma(texture2D(baseSampler, outTexCoords).a, color.rgb);\n",
};
const char* gFS_Main_FetchGradient[6] = {
// Linear
@@ -271,29 +301,38 @@ const char* gFS_Main_BlendShadersBG =
" fragColor = blendShaders(gradientColor, bitmapColor)";
const char* gFS_Main_BlendShadersGB =
" fragColor = blendShaders(bitmapColor, gradientColor)";
-const char* gFS_Main_BlendShaders_Modulate[3] = {
+const char* gFS_Main_BlendShaders_Modulate[6] = {
// Don't modulate
";\n",
+ ";\n",
// Modulate
" * color.a;\n",
+ " * color.a;\n",
// Modulate with alpha 8 texture
" * texture2D(baseSampler, outTexCoords).a;\n",
+ " * gamma(texture2D(baseSampler, outTexCoords).a, color.rgb);\n",
};
-const char* gFS_Main_GradientShader_Modulate[3] = {
+const char* gFS_Main_GradientShader_Modulate[6] = {
// Don't modulate
" fragColor = gradientColor;\n",
+ " fragColor = gradientColor;\n",
// Modulate
" fragColor = gradientColor * color.a;\n",
+ " fragColor = gradientColor * color.a;\n",
// Modulate with alpha 8 texture
" fragColor = gradientColor * texture2D(baseSampler, outTexCoords).a;\n",
+ " fragColor = gradientColor * gamma(texture2D(baseSampler, outTexCoords).a, gradientColor.rgb);\n",
};
-const char* gFS_Main_BitmapShader_Modulate[3] = {
+const char* gFS_Main_BitmapShader_Modulate[6] = {
// Don't modulate
" fragColor = bitmapColor;\n",
+ " fragColor = bitmapColor;\n",
// Modulate
" fragColor = bitmapColor * color.a;\n",
+ " fragColor = bitmapColor * color.a;\n",
// Modulate with alpha 8 texture
" fragColor = bitmapColor * texture2D(baseSampler, outTexCoords).a;\n",
+ " fragColor = bitmapColor * gamma(texture2D(baseSampler, outTexCoords).a, bitmapColor.rgb);\n",
};
const char* gFS_Main_FragColor =
" gl_FragColor = fragColor;\n";
@@ -385,7 +424,8 @@ const char* gBlendOps[18] = {
///////////////////////////////////////////////////////////////////////////////
ProgramCache::ProgramCache(Extensions& extensions)
- : mHasES3(extensions.getMajorGlVersion() >= 3) {
+ : mHasES3(extensions.getMajorGlVersion() >= 3)
+ , mHasSRGB(extensions.hasSRGB()) {
}
ProgramCache::~ProgramCache() {
@@ -518,6 +558,7 @@ String8 ProgramCache::generateVertexShader(const ProgramDescription& description
static bool shaderOp(const ProgramDescription& description, String8& shader,
const int modulateOp, const char** snippets) {
int op = description.hasAlpha8Texture ? MODULATE_OP_MODULATE_A8 : modulateOp;
+ op = op * 2 + description.hasGammaCorrection;
shader.append(snippets[op]);
return description.hasAlpha8Texture;
}
@@ -570,13 +611,16 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti
shader.append(gFS_Uniforms_ExternalTextureSampler);
}
if (description.hasGradient) {
- shader.appendFormat(gFS_Uniforms_GradientSampler[description.isSimpleGradient],
- gFS_Uniforms_Dither);
+ shader.append(gFS_Uniforms_GradientSampler[description.isSimpleGradient]);
}
if (description.hasRoundRectClip) {
shader.append(gFS_Uniforms_HasRoundRectClip);
}
+ if (description.hasGammaCorrection) {
+ shader.appendFormat(gFS_Gamma_Preamble, Properties::textGamma, 1.0f / Properties::textGamma);
+ }
+
// Optimization for common cases
if (!description.hasVertexAlpha
&& !blendFramebuffer
@@ -607,18 +651,26 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti
fast = true;
} else if (singleA8Texture) {
if (!description.modulate) {
- shader.append(gFS_Fast_SingleA8Texture);
+ if (description.hasGammaCorrection) {
+ shader.append(gFS_Fast_SingleA8Texture_ApplyGamma);
+ } else {
+ shader.append(gFS_Fast_SingleA8Texture);
+ }
} else {
- shader.append(gFS_Fast_SingleModulateA8Texture);
+ if (description.hasGammaCorrection) {
+ shader.append(gFS_Fast_SingleModulateA8Texture_ApplyGamma);
+ } else {
+ shader.append(gFS_Fast_SingleModulateA8Texture);
+ }
}
fast = true;
} else if (singleGradient) {
+ shader.append(gFS_Dither_Functions);
+ shader.append(gFS_Dither_Preamble[mHasSRGB]);
if (!description.modulate) {
- shader.appendFormat(gFS_Fast_SingleGradient[description.isSimpleGradient],
- gFS_Main_Dither[mHasES3]);
+ shader.append(gFS_Fast_SingleGradient[description.isSimpleGradient]);
} else {
- shader.appendFormat(gFS_Fast_SingleModulateGradient[description.isSimpleGradient],
- gFS_Main_Dither[mHasES3]);
+ shader.append(gFS_Fast_SingleModulateGradient[description.isSimpleGradient]);
}
fast = true;
}
@@ -652,6 +704,10 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti
if (description.isBitmapNpot) {
generateTextureWrap(shader, description.bitmapWrapS, description.bitmapWrapT);
}
+ if (description.hasGradient) {
+ shader.append(gFS_Dither_Functions);
+ shader.append(gFS_Dither_Preamble[mHasSRGB]);
+ }
// Begin the shader
shader.append(gFS_Main); {
@@ -659,7 +715,8 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti
if (description.hasTexture || description.hasExternalTexture) {
if (description.hasAlpha8Texture) {
if (!description.hasGradient && !description.hasBitmap) {
- shader.append(gFS_Main_FetchA8Texture[modulateOp]);
+ shader.append(
+ gFS_Main_FetchA8Texture[modulateOp * 2 + description.hasGammaCorrection]);
}
} else {
shader.append(gFS_Main_FetchTexture[modulateOp]);
@@ -671,7 +728,6 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti
}
if (description.hasGradient) {
shader.append(gFS_Main_FetchGradient[gradientIndex(description)]);
- shader.appendFormat(gFS_Main_AddDitherToGradient, gFS_Main_Dither[mHasES3]);
}
if (description.hasBitmap) {
if (!description.isBitmapNpot) {
@@ -715,6 +771,10 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti
}
}
+ if (description.hasGradient) {
+ shader.append(gFS_Main_AddDither);
+ }
+
// Output the fragment
if (!blendFramebuffer) {
shader.append(gFS_Main_FragColor);
diff --git a/libs/hwui/ProgramCache.h b/libs/hwui/ProgramCache.h
index 9ac885b665e7..292ecdfdc2b6 100644
--- a/libs/hwui/ProgramCache.h
+++ b/libs/hwui/ProgramCache.h
@@ -59,6 +59,7 @@ private:
std::map<programid, std::unique_ptr<Program>> mCache;
const bool mHasES3;
+ const bool mHasSRGB;
}; // class ProgramCache
}; // namespace uirenderer
diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h
index eedc9e7d5333..92a49d28c408 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -203,7 +203,7 @@ enum DebugLevel {
#define PROPERTY_TEXT_LARGE_CACHE_WIDTH "ro.hwui.text_large_cache_width"
#define PROPERTY_TEXT_LARGE_CACHE_HEIGHT "ro.hwui.text_large_cache_height"
-// Gamma (>= 1.0, <= 10.0)
+// Gamma (>= 1.0, <= 3.0)
#define PROPERTY_TEXT_GAMMA "hwui.text_gamma"
///////////////////////////////////////////////////////////////////////////////
@@ -222,7 +222,7 @@ enum DebugLevel {
#define DEFAULT_TEXTURE_CACHE_FLUSH_RATE 0.6f
-#define DEFAULT_TEXT_GAMMA 1.4f
+#define DEFAULT_TEXT_GAMMA 1.45f // Match design tools
// cap to 256 to limite paths in the path cache
#define DEFAULT_PATH_TEXTURE_CAP 256
diff --git a/libs/hwui/PropertyValuesHolder.cpp b/libs/hwui/PropertyValuesHolder.cpp
index 6ba0ab59a88c..2a03e6a3ebc5 100644
--- a/libs/hwui/PropertyValuesHolder.cpp
+++ b/libs/hwui/PropertyValuesHolder.cpp
@@ -16,6 +16,7 @@
#include "PropertyValuesHolder.h"
+#include "utils/Color.h"
#include "utils/VectorDrawableUtils.h"
#include <utils/Log.h>
@@ -25,18 +26,26 @@ namespace uirenderer {
using namespace VectorDrawable;
-inline U8CPU lerp(U8CPU fromValue, U8CPU toValue, float fraction) {
- return (U8CPU) (fromValue * (1 - fraction) + toValue * fraction);
+inline constexpr float lerp(float fromValue, float toValue, float fraction) {
+ return float (fromValue * (1 - fraction) + toValue * fraction);
+}
+
+inline constexpr float linearize(U8CPU component) {
+ return EOCF_sRGB(component / 255.0f);
}
// TODO: Add a test for this
void ColorEvaluator::evaluate(SkColor* outColor,
const SkColor& fromColor, const SkColor& toColor, float fraction) const {
- U8CPU alpha = lerp(SkColorGetA(fromColor), SkColorGetA(toColor), fraction);
- U8CPU red = lerp(SkColorGetR(fromColor), SkColorGetR(toColor), fraction);
- U8CPU green = lerp(SkColorGetG(fromColor), SkColorGetG(toColor), fraction);
- U8CPU blue = lerp(SkColorGetB(fromColor), SkColorGetB(toColor), fraction);
- *outColor = SkColorSetARGB(alpha, red, green, blue);
+ float a = lerp(SkColorGetA(fromColor) / 255.0f, SkColorGetA(toColor) / 255.0f, fraction);
+ float r = lerp(linearize(SkColorGetR(fromColor)), linearize(SkColorGetR(toColor)), fraction);
+ float g = lerp(linearize(SkColorGetG(fromColor)), linearize(SkColorGetG(toColor)), fraction);
+ float b = lerp(linearize(SkColorGetB(fromColor)), linearize(SkColorGetB(toColor)), fraction);
+ *outColor = SkColorSetARGB(
+ (U8CPU) roundf(a * 255.0f),
+ (U8CPU) roundf(OECF_sRGB(r) * 255.0f),
+ (U8CPU) roundf(OECF_sRGB(g) * 255.0f),
+ (U8CPU) roundf(OECF_sRGB(b) * 255.0f));
}
void PathEvaluator::evaluate(PathData* out,
diff --git a/libs/hwui/Readback.cpp b/libs/hwui/Readback.cpp
index ddca122788d1..22c6dfc6b55a 100644
--- a/libs/hwui/Readback.cpp
+++ b/libs/hwui/Readback.cpp
@@ -197,7 +197,7 @@ CopyResult Readback::copySurfaceInto(renderthread::RenderThread& renderThread,
Texture sourceTexture(caches);
sourceTexture.wrap(sourceTexId,
- sourceBuffer->getWidth(), sourceBuffer->getHeight(), 0 /* total lie */);
+ sourceBuffer->getWidth(), sourceBuffer->getHeight(), 0, 0 /* total lie */);
CopyResult copyResult = copyTextureInto(caches, renderThread.renderState(),
sourceTexture, texTransform, srcRect, bitmap);
diff --git a/libs/hwui/RecordedOp.h b/libs/hwui/RecordedOp.h
index a65c22c3a555..ebc41b18ed8c 100644
--- a/libs/hwui/RecordedOp.h
+++ b/libs/hwui/RecordedOp.h
@@ -216,7 +216,6 @@ struct BitmapOp : RecordedOp {
: SUPER(BitmapOp)
, bitmap(bitmap) {}
const SkBitmap* bitmap;
- // TODO: asset atlas/texture id lookup?
};
struct BitmapMeshOp : RecordedOp {
diff --git a/libs/hwui/SkiaShader.cpp b/libs/hwui/SkiaShader.cpp
index 6f4a6839be4e..9838df2f6013 100644
--- a/libs/hwui/SkiaShader.cpp
+++ b/libs/hwui/SkiaShader.cpp
@@ -177,11 +177,12 @@ bool tryStoreGradient(Caches& caches, const SkShader& shader, const Matrix4 mode
outData->endColor.set(gradInfo.fColors[1]);
}
- outData->ditherSampler = (*textureUnit)++;
return true;
}
-void applyGradient(Caches& caches, const SkiaShaderData::GradientShaderData& data) {
+void applyGradient(Caches& caches, const SkiaShaderData::GradientShaderData& data,
+ const GLsizei width, const GLsizei height) {
+
if (CC_UNLIKELY(data.gradientTexture)) {
caches.textureState().activateTexture(data.gradientSampler);
bindTexture(&caches, data.gradientTexture, data.wrapST, data.wrapST);
@@ -191,10 +192,7 @@ void applyGradient(Caches& caches, const SkiaShaderData::GradientShaderData& dat
bindUniformColor(caches.program().getUniform("endColor"), data.endColor);
}
- // TODO: remove sampler slot incrementing from dither.setupProgram,
- // since this assignment of slots is done at store, not apply time
- GLuint ditherSampler = data.ditherSampler;
- caches.dither.setupProgram(caches.program(), &ditherSampler);
+ glUniform2f(caches.program().getUniform("screenSize"), 1.0f / width, 1.0f / height);
glUniformMatrix4fv(caches.program().getUniform("screenSpace"), 1,
GL_FALSE, &data.screenSpace.data[0]);
}
@@ -208,13 +206,7 @@ bool tryStoreBitmap(Caches& caches, const SkShader& shader, const Matrix4& model
return false;
}
- /*
- * Bypass the AssetAtlas, since those textures:
- * 1) require UV mapping, which isn't implemented in matrix computation below
- * 2) can't handle REPEAT simply
- * 3) are safe to upload here (outside of sync stage), since they're static
- */
- outData->bitmapTexture = caches.textureCache.getAndBypassAtlas(&bitmap);
+ outData->bitmapTexture = caches.textureCache.get(&bitmap);
if (!outData->bitmapTexture) return false;
outData->bitmapSampler = (*textureUnit)++;
@@ -388,11 +380,12 @@ void SkiaShader::store(Caches& caches, const SkShader& shader, const Matrix4& mo
outData->skiaShaderType = kNone_SkiaShaderType;
}
-void SkiaShader::apply(Caches& caches, const SkiaShaderData& data) {
+void SkiaShader::apply(Caches& caches, const SkiaShaderData& data,
+ const GLsizei width, const GLsizei height) {
if (!data.skiaShaderType) return;
if (data.skiaShaderType & kGradient_SkiaShaderType) {
- applyGradient(caches, data.gradientData);
+ applyGradient(caches, data.gradientData, width, height);
}
if (data.skiaShaderType & kBitmap_SkiaShaderType) {
applyBitmap(caches, data.bitmapData);
diff --git a/libs/hwui/SkiaShader.h b/libs/hwui/SkiaShader.h
index 884196d9fc62..5854289f49a7 100644
--- a/libs/hwui/SkiaShader.h
+++ b/libs/hwui/SkiaShader.h
@@ -62,7 +62,6 @@ struct SkiaShaderData {
} bitmapData;
struct GradientShaderData {
Matrix4 screenSpace;
- GLuint ditherSampler;
// simple gradient
FloatColor startColor;
@@ -72,7 +71,6 @@ struct SkiaShaderData {
Texture* gradientTexture;
GLuint gradientSampler;
GLenum wrapST;
-
} gradientData;
struct LayerShaderData {
Layer* layer;
@@ -90,7 +88,8 @@ public:
static void store(Caches& caches, const SkShader& shader, const Matrix4& modelViewMatrix,
GLuint* textureUnit, ProgramDescription* description,
SkiaShaderData* outData);
- static void apply(Caches& caches, const SkiaShaderData& data);
+ static void apply(Caches& caches, const SkiaShaderData& data,
+ const GLsizei width, const GLsizei height);
};
}; // namespace uirenderer
diff --git a/libs/hwui/Texture.cpp b/libs/hwui/Texture.cpp
index 4f49a3518be0..908f57265906 100644
--- a/libs/hwui/Texture.cpp
+++ b/libs/hwui/Texture.cpp
@@ -26,19 +26,23 @@
namespace android {
namespace uirenderer {
+// Number of bytes used by a texture in the given format
static int bytesPerPixel(GLint glFormat) {
switch (glFormat) {
// The wrapped-texture case, usually means a SurfaceTexture
case 0:
return 0;
+ case GL_LUMINANCE:
case GL_ALPHA:
return 1;
+ case GL_SRGB8:
case GL_RGB:
return 3;
+ case GL_SRGB8_ALPHA8:
case GL_RGBA:
return 4;
case GL_RGBA16F:
- return 16;
+ return 8;
default:
LOG_ALWAYS_FATAL("UNKNOWN FORMAT %d", glFormat);
}
@@ -83,14 +87,16 @@ void Texture::deleteTexture() {
mId = 0;
}
-bool Texture::updateSize(uint32_t width, uint32_t height, GLint format) {
- if (mWidth == width && mHeight == height && mFormat == format) {
+bool Texture::updateSize(uint32_t width, uint32_t height, GLint internalFormat, GLint format) {
+ if (mWidth == width && mHeight == height &&
+ mFormat == format && mInternalFormat == internalFormat) {
return false;
}
mWidth = width;
mHeight = height;
mFormat = format;
- notifySizeChanged(mWidth * mHeight * bytesPerPixel(mFormat));
+ mInternalFormat = internalFormat;
+ notifySizeChanged(mWidth * mHeight * bytesPerPixel(internalFormat));
return true;
}
@@ -101,10 +107,10 @@ void Texture::resetCachedParams() {
mMagFilter = GL_LINEAR;
}
-void Texture::upload(GLint internalformat, uint32_t width, uint32_t height,
+void Texture::upload(GLint internalFormat, uint32_t width, uint32_t height,
GLenum format, GLenum type, const void* pixels) {
GL_CHECKPOINT(MODERATE);
- bool needsAlloc = updateSize(width, height, internalformat);
+ bool needsAlloc = updateSize(width, height, internalFormat, format);
if (!mId) {
glGenTextures(1, &mId);
needsAlloc = true;
@@ -112,17 +118,17 @@ void Texture::upload(GLint internalformat, uint32_t width, uint32_t height,
}
mCaches.textureState().bindTexture(GL_TEXTURE_2D, mId);
if (needsAlloc) {
- glTexImage2D(GL_TEXTURE_2D, 0, mFormat, mWidth, mHeight, 0,
+ glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, mWidth, mHeight, 0,
format, type, pixels);
} else if (pixels) {
- glTexSubImage2D(GL_TEXTURE_2D, 0, mFormat, mWidth, mHeight, 0,
+ glTexSubImage2D(GL_TEXTURE_2D, 0, internalFormat, mWidth, mHeight, 0,
format, type, pixels);
}
GL_CHECKPOINT(MODERATE);
}
-static void uploadToTexture(bool resize, GLenum format, GLenum type, GLsizei stride, GLsizei bpp,
- GLsizei width, GLsizei height, const GLvoid * data) {
+static void uploadToTexture(bool resize, GLint internalFormat, GLenum format, GLenum type,
+ GLsizei stride, GLsizei bpp, GLsizei width, GLsizei height, const GLvoid * data) {
const bool useStride = stride != width
&& Caches::getInstance().extensions().hasUnpackRowLength();
@@ -132,7 +138,7 @@ static void uploadToTexture(bool resize, GLenum format, GLenum type, GLsizei str
}
if (resize) {
- glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, type, data);
+ glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, type, data);
} else {
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, format, type, data);
}
@@ -156,7 +162,7 @@ static void uploadToTexture(bool resize, GLenum format, GLenum type, GLsizei str
}
if (resize) {
- glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, type, temp);
+ glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, type, temp);
} else {
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, format, type, temp);
}
@@ -166,31 +172,44 @@ static void uploadToTexture(bool resize, GLenum format, GLenum type, GLsizei str
}
static void uploadSkBitmapToTexture(const SkBitmap& bitmap,
- bool resize, GLenum format, GLenum type) {
- uploadToTexture(resize, format, type, bitmap.rowBytesAsPixels(), bitmap.bytesPerPixel(),
- bitmap.width(), bitmap.height(), bitmap.getPixels());
+ bool resize, GLint internalFormat, GLenum format, GLenum type) {
+ uploadToTexture(resize, internalFormat, format, type, bitmap.rowBytesAsPixels(),
+ bitmap.bytesPerPixel(), bitmap.width(), bitmap.height(), bitmap.getPixels());
}
-static void colorTypeToGlFormatAndType(SkColorType colorType,
- GLint* outFormat, GLint* outType) {
+static void colorTypeToGlFormatAndType(const Caches& caches, SkColorType colorType,
+ bool needSRGB, GLint* outInternalFormat, GLint* outFormat, GLint* outType) {
switch (colorType) {
case kAlpha_8_SkColorType:
*outFormat = GL_ALPHA;
+ *outInternalFormat = GL_ALPHA;
*outType = GL_UNSIGNED_BYTE;
break;
case kRGB_565_SkColorType:
- *outFormat = GL_RGB;
- *outType = GL_UNSIGNED_SHORT_5_6_5;
+ if (needSRGB) {
+ // We would ideally use a GL_RGB/GL_SRGB8 texture but the
+ // intermediate Skia bitmap needs to be ARGB_8888
+ *outFormat = GL_RGBA;
+ *outInternalFormat = caches.rgbaInternalFormat();
+ *outType = GL_UNSIGNED_BYTE;
+ } else {
+ *outFormat = GL_RGB;
+ *outInternalFormat = GL_RGB;
+ *outType = GL_UNSIGNED_SHORT_5_6_5;
+ }
break;
// ARGB_4444 and Index_8 are both upconverted to RGBA_8888
case kARGB_4444_SkColorType:
case kIndex_8_SkColorType:
case kN32_SkColorType:
*outFormat = GL_RGBA;
+ *outInternalFormat = caches.rgbaInternalFormat(needSRGB);
*outType = GL_UNSIGNED_BYTE;
break;
case kGray_8_SkColorType:
+ // TODO: Handle sRGB
*outFormat = GL_LUMINANCE;
+ *outInternalFormat = GL_LUMINANCE;
*outType = GL_UNSIGNED_BYTE;
break;
default:
@@ -224,29 +243,36 @@ void Texture::upload(const SkBitmap& bitmap) {
setDefaultParams = true;
}
- GLint format, type;
- colorTypeToGlFormatAndType(bitmap.colorType(), &format, &type);
+ sk_sp<SkColorSpace> sRGB = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named);
+ bool needSRGB = bitmap.colorSpace() == sRGB.get();
- if (updateSize(bitmap.width(), bitmap.height(), format)) {
+ GLint internalFormat, format, type;
+ colorTypeToGlFormatAndType(mCaches, bitmap.colorType(), needSRGB, &internalFormat, &format, &type);
+
+ if (updateSize(bitmap.width(), bitmap.height(), internalFormat, format)) {
needsAlloc = true;
}
blend = !bitmap.isOpaque();
mCaches.textureState().bindTexture(mId);
+ // TODO: Handle sRGB gray bitmaps
+ bool hasSRGB = mCaches.extensions().hasSRGB();
if (CC_UNLIKELY(bitmap.colorType() == kARGB_4444_SkColorType
- || bitmap.colorType() == kIndex_8_SkColorType)) {
+ || bitmap.colorType() == kIndex_8_SkColorType
+ || (bitmap.colorType() == kRGB_565_SkColorType && hasSRGB && needSRGB))) {
+
SkBitmap rgbaBitmap;
- rgbaBitmap.allocPixels(SkImageInfo::MakeN32(mWidth, mHeight,
- bitmap.alphaType()));
+ rgbaBitmap.allocPixels(SkImageInfo::MakeN32(
+ mWidth, mHeight, bitmap.alphaType(), hasSRGB ? sRGB : nullptr));
rgbaBitmap.eraseColor(0);
SkCanvas canvas(rgbaBitmap);
canvas.drawBitmap(bitmap, 0.0f, 0.0f, nullptr);
- uploadSkBitmapToTexture(rgbaBitmap, needsAlloc, format, type);
+ uploadSkBitmapToTexture(rgbaBitmap, needsAlloc, internalFormat, format, type);
} else {
- uploadSkBitmapToTexture(bitmap, needsAlloc, format, type);
+ uploadSkBitmapToTexture(bitmap, needsAlloc, internalFormat, format, type);
}
if (canMipMap) {
@@ -262,11 +288,12 @@ void Texture::upload(const SkBitmap& bitmap) {
}
}
-void Texture::wrap(GLuint id, uint32_t width, uint32_t height, GLint format) {
+void Texture::wrap(GLuint id, uint32_t width, uint32_t height, GLint internalFormat, GLint format) {
mId = id;
mWidth = width;
mHeight = height;
mFormat = format;
+ mInternalFormat = internalFormat;
// We're wrapping an existing texture, so don't double count this memory
notifySizeChanged(0);
}
diff --git a/libs/hwui/Texture.h b/libs/hwui/Texture.h
index b72742f45654..aa8a6d3fae82 100644
--- a/libs/hwui/Texture.h
+++ b/libs/hwui/Texture.h
@@ -69,8 +69,8 @@ public:
*
* The image data is undefined after calling this.
*/
- void resize(uint32_t width, uint32_t height, GLint format) {
- upload(format, width, height, format, GL_UNSIGNED_BYTE, nullptr);
+ void resize(uint32_t width, uint32_t height, GLint internalFormat, GLint format) {
+ upload(internalFormat, width, height, format, GL_UNSIGNED_BYTE, nullptr);
}
/**
@@ -85,13 +85,13 @@ public:
/**
* Basically glTexImage2D/glTexSubImage2D.
*/
- void upload(GLint internalformat, uint32_t width, uint32_t height,
+ void upload(GLint internalFormat, uint32_t width, uint32_t height,
GLenum format, GLenum type, const void* pixels);
/**
* Wraps an existing texture.
*/
- void wrap(GLuint id, uint32_t width, uint32_t height, GLint format);
+ void wrap(GLuint id, uint32_t width, uint32_t height, GLint internalFormat, GLint format);
GLuint id() const {
return mId;
@@ -109,6 +109,10 @@ public:
return mFormat;
}
+ GLint internalFormat() const {
+ return mInternalFormat;
+ }
+
/**
* Generation of the backing bitmap,
*/
@@ -148,13 +152,14 @@ private:
friend class Layer;
// Returns true if the size changed, false if it was the same
- bool updateSize(uint32_t width, uint32_t height, GLint format);
+ bool updateSize(uint32_t width, uint32_t height, GLint internalFormat, GLint format);
void resetCachedParams();
GLuint mId = 0;
uint32_t mWidth = 0;
uint32_t mHeight = 0;
GLint mFormat = 0;
+ GLint mInternalFormat = 0;
/* See GLES spec section 3.8.14
* "In the initial state, the value assigned to TEXTURE_MIN_FILTER is
diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp
index 523924af5ef1..5ccdbda67e74 100644
--- a/libs/hwui/TextureCache.cpp
+++ b/libs/hwui/TextureCache.cpp
@@ -18,7 +18,6 @@
#include <utils/Mutex.h>
-#include "AssetAtlas.h"
#include "Caches.h"
#include "Texture.h"
#include "TextureCache.h"
@@ -36,8 +35,7 @@ TextureCache::TextureCache()
: mCache(LruCache<uint32_t, Texture*>::kUnlimitedCapacity)
, mSize(0)
, mMaxSize(Properties::textureCacheSize)
- , mFlushRate(Properties::textureCacheFlushRate)
- , mAssetAtlas(nullptr) {
+ , mFlushRate(Properties::textureCacheFlushRate) {
mCache.setOnEntryRemovedListener(this);
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
@@ -84,10 +82,6 @@ void TextureCache::operator()(uint32_t&, Texture*& texture) {
// Caching
///////////////////////////////////////////////////////////////////////////////
-void TextureCache::setAssetAtlas(AssetAtlas* assetAtlas) {
- mAssetAtlas = assetAtlas;
-}
-
void TextureCache::resetMarkInUse(void* ownerToken) {
LruCache<uint32_t, Texture*>::Iterator iter(mCache);
while (iter.next()) {
@@ -108,14 +102,7 @@ bool TextureCache::canMakeTextureFromBitmap(const SkBitmap* bitmap) {
// Returns a prepared Texture* that either is already in the cache or can fit
// in the cache (and is thus added to the cache)
-Texture* TextureCache::getCachedTexture(const SkBitmap* bitmap, AtlasUsageType atlasUsageType) {
- if (CC_LIKELY(mAssetAtlas != nullptr) && atlasUsageType == AtlasUsageType::Use) {
- AssetAtlas::Entry* entry = mAssetAtlas->getEntry(bitmap->pixelRef());
- if (CC_UNLIKELY(entry)) {
- return entry->texture;
- }
- }
-
+Texture* TextureCache::getCachedTexture(const SkBitmap* bitmap) {
Texture* texture = mCache.get(bitmap->pixelRef()->getStableID());
if (!texture) {
@@ -160,7 +147,7 @@ Texture* TextureCache::getCachedTexture(const SkBitmap* bitmap, AtlasUsageType a
}
bool TextureCache::prefetchAndMarkInUse(void* ownerToken, const SkBitmap* bitmap) {
- Texture* texture = getCachedTexture(bitmap, AtlasUsageType::Use);
+ Texture* texture = getCachedTexture(bitmap);
if (texture) {
texture->isInUse = ownerToken;
}
@@ -168,11 +155,11 @@ bool TextureCache::prefetchAndMarkInUse(void* ownerToken, const SkBitmap* bitmap
}
bool TextureCache::prefetch(const SkBitmap* bitmap) {
- return getCachedTexture(bitmap, AtlasUsageType::Use);
+ return getCachedTexture(bitmap);
}
-Texture* TextureCache::get(const SkBitmap* bitmap, AtlasUsageType atlasUsageType) {
- Texture* texture = getCachedTexture(bitmap, atlasUsageType);
+Texture* TextureCache::get(const SkBitmap* bitmap) {
+ Texture* texture = getCachedTexture(bitmap);
if (!texture) {
if (!canMakeTextureFromBitmap(bitmap)) {
diff --git a/libs/hwui/TextureCache.h b/libs/hwui/TextureCache.h
index 0a61b6b1a522..88ef7711e844 100644
--- a/libs/hwui/TextureCache.h
+++ b/libs/hwui/TextureCache.h
@@ -47,8 +47,6 @@ class Texture;
// Classes
///////////////////////////////////////////////////////////////////////////////
-class AssetAtlas;
-
/**
* A simple LRU texture cache. The cache has a maximum size expressed in bytes.
* Any texture added to the cache causing the cache to grow beyond the maximum
@@ -85,20 +83,10 @@ public:
bool prefetch(const SkBitmap* bitmap);
/**
- * Returns the texture associated with the specified bitmap from either within the cache, or
- * the AssetAtlas. If the texture cannot be found in the cache, a new texture is generated.
- */
- Texture* get(const SkBitmap* bitmap) {
- return get(bitmap, AtlasUsageType::Use);
- }
-
- /**
- * Returns the texture associated with the specified bitmap. If the texture cannot be found in
- * the cache, a new texture is generated, even if it resides in the AssetAtlas.
+ * Returns the texture associated with the specified bitmap from within the cache.
+ * If the texture cannot be found in the cache, a new texture is generated.
*/
- Texture* getAndBypassAtlas(const SkBitmap* bitmap) {
- return get(bitmap, AtlasUsageType::Bypass);
- }
+ Texture* get(const SkBitmap* bitmap);
/**
* Removes the texture associated with the specified pixelRef. This is meant
@@ -130,18 +118,10 @@ public:
*/
void flush();
- void setAssetAtlas(AssetAtlas* assetAtlas);
-
private:
- enum class AtlasUsageType {
- Use,
- Bypass,
- };
-
bool canMakeTextureFromBitmap(const SkBitmap* bitmap);
- Texture* get(const SkBitmap* bitmap, AtlasUsageType atlasUsageType);
- Texture* getCachedTexture(const SkBitmap* bitmap, AtlasUsageType atlasUsageType);
+ Texture* getCachedTexture(const SkBitmap* bitmap);
LruCache<uint32_t, Texture*> mCache;
@@ -155,8 +135,6 @@ private:
std::vector<uint32_t> mGarbage;
mutable Mutex mLock;
-
- AssetAtlas* mAssetAtlas;
}; // class TextureCache
}; // namespace uirenderer
diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp
index 2b7994139641..a2f3cb6b3d85 100644
--- a/libs/hwui/VectorDrawable.cpp
+++ b/libs/hwui/VectorDrawable.cpp
@@ -202,7 +202,9 @@ void FullPath::drawPath(SkCanvas* outCanvas, SkPath& renderPath, float strokeSca
if (properties.getFillGradient() != nullptr) {
paint.setColor(applyAlpha(SK_ColorBLACK, properties.getFillAlpha()));
SkShader* newShader = properties.getFillGradient()->newWithLocalMatrix(matrix);
- paint.setShader(newShader);
+ // newWithLocalMatrix(...) creates a new SkShader and returns a bare pointer. We need to
+ // remove the extra ref so that the ref count is correctly managed.
+ paint.setShader(newShader)->unref();
needsFill = true;
} else if (properties.getFillColor() != SK_ColorTRANSPARENT) {
paint.setColor(applyAlpha(properties.getFillColor(), properties.getFillAlpha()));
@@ -222,7 +224,9 @@ void FullPath::drawPath(SkCanvas* outCanvas, SkPath& renderPath, float strokeSca
if (properties.getStrokeGradient() != nullptr) {
paint.setColor(applyAlpha(SK_ColorBLACK, properties.getStrokeAlpha()));
SkShader* newShader = properties.getStrokeGradient()->newWithLocalMatrix(matrix);
- paint.setShader(newShader);
+ // newWithLocalMatrix(...) creates a new SkShader and returns a bare pointer. We need to
+ // remove the extra ref so that the ref count is correctly managed.
+ paint.setShader(newShader)->unref();
needsStroke = true;
} else if (properties.getStrokeColor() != SK_ColorTRANSPARENT) {
paint.setColor(applyAlpha(properties.getStrokeColor(), properties.getStrokeAlpha()));
@@ -561,8 +565,12 @@ void Tree::updateBitmapCache(SkBitmap* outCache, bool useStagingData) {
bool Tree::allocateBitmapIfNeeded(SkBitmap* outCache, int width, int height) {
if (!canReuseBitmap(*outCache, width, height)) {
- SkImageInfo info = SkImageInfo::Make(width, height,
- kN32_SkColorType, kPremul_SkAlphaType);
+#ifndef ANDROID_ENABLE_LINEAR_BLENDING
+ sk_sp<SkColorSpace> colorSpace = nullptr;
+#else
+ sk_sp<SkColorSpace> colorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named);
+#endif
+ SkImageInfo info = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType, colorSpace);
outCache->setInfo(info);
// TODO: Count the bitmap cache against app's java heap
outCache->allocPixels(info);
diff --git a/libs/hwui/Vertex.h b/libs/hwui/Vertex.h
index c1bf980658b2..db982ad0c8f4 100644
--- a/libs/hwui/Vertex.h
+++ b/libs/hwui/Vertex.h
@@ -19,6 +19,7 @@
#include "Vector.h"
+#include "FloatColor.h"
#include "utils/Macros.h"
namespace android {
@@ -76,21 +77,19 @@ struct TextureVertex {
REQUIRE_COMPATIBLE_LAYOUT(TextureVertex);
/**
- * Simple structure to describe a vertex with a position, texture UV and ARGB color.
+ * Simple structure to describe a vertex with a position, texture UV and an
+ * sRGB color with alpha. The color is stored pre-multiplied in linear space.
*/
struct ColorTextureVertex {
float x, y;
float u, v;
- float r, g, b, a;
+ float r, g, b, a; // pre-multiplied linear
static inline void set(ColorTextureVertex* vertex, float x, float y,
- float u, float v, int color) {
-
- float a = ((color >> 24) & 0xff) / 255.0f;
- float r = a * ((color >> 16) & 0xff) / 255.0f;
- float g = a * ((color >> 8) & 0xff) / 255.0f;
- float b = a * ((color) & 0xff) / 255.0f;
- *vertex = { x, y, u, v, r, g, b, a };
+ float u, float v, uint32_t color) {
+ FloatColor c;
+ c.set(color);
+ *vertex = { x, y, u, v, c.r, c.g, c.b, c.a };
}
}; // struct ColorTextureVertex
diff --git a/libs/hwui/font/CacheTexture.cpp b/libs/hwui/font/CacheTexture.cpp
index 49e9f65582ae..e2844ad0649a 100644
--- a/libs/hwui/font/CacheTexture.cpp
+++ b/libs/hwui/font/CacheTexture.cpp
@@ -180,7 +180,12 @@ void CacheTexture::allocatePixelBuffer() {
mPixelBuffer = PixelBuffer::create(mFormat, getWidth(), getHeight());
}
- mTexture.resize(mWidth, mHeight, mFormat);
+ GLint internalFormat = mFormat;
+ if (mFormat == GL_RGBA) {
+ internalFormat = mCaches.rgbaInternalFormat();
+ }
+
+ mTexture.resize(mWidth, mHeight, internalFormat, mFormat);
mTexture.setFilter(getLinearFiltering() ? GL_LINEAR : GL_NEAREST);
mTexture.setWrap(GL_CLAMP_TO_EDGE);
}
diff --git a/libs/hwui/hwui/PixelRef.cpp b/libs/hwui/hwui/PixelRef.cpp
new file mode 100644
index 000000000000..795de6be1d6f
--- /dev/null
+++ b/libs/hwui/hwui/PixelRef.cpp
@@ -0,0 +1,171 @@
+/*
+ * 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.
+ */
+#include "PixelRef.h"
+
+#include "Caches.h"
+
+#include <cutils/log.h>
+#include <sys/mman.h>
+#include <cutils/ashmem.h>
+
+namespace android {
+
+void PixelRef::reconfigure(const SkImageInfo& newInfo, size_t rowBytes, SkColorTable* ctable) {
+ if (kIndex_8_SkColorType != newInfo.colorType()) {
+ ctable = nullptr;
+ }
+ mRowBytes = rowBytes;
+ if (mColorTable.get() != ctable) {
+ mColorTable.reset(ctable);
+ }
+
+ // Need to validate the alpha type to filter against the color type
+ // to prevent things like a non-opaque RGB565 bitmap
+ SkAlphaType alphaType;
+ LOG_ALWAYS_FATAL_IF(!SkColorTypeValidateAlphaType(
+ newInfo.colorType(), newInfo.alphaType(), &alphaType),
+ "Failed to validate alpha type!");
+
+ // Dirty hack is dirty
+ // TODO: Figure something out here, Skia's current design makes this
+ // really hard to work with. Skia really, really wants immutable objects,
+ // but with the nested-ref-count hackery going on that's just not
+ // feasible without going insane trying to figure it out
+ SkImageInfo* myInfo = const_cast<SkImageInfo*>(&this->info());
+ *myInfo = newInfo;
+ changeAlphaType(alphaType);
+
+ // Docs say to only call this in the ctor, but we're going to call
+ // it anyway even if this isn't always the ctor.
+ // TODO: Fix this too as part of the above TODO
+ setPreLocked(getStorage(), mRowBytes, mColorTable.get());
+}
+
+PixelRef::PixelRef(void* address, size_t size, const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable)
+ : SkPixelRef(info)
+ , mPixelStorageType(PixelStorageType::Heap) {
+ mPixelStorage.heap.address = address;
+ mPixelStorage.heap.size = size;
+ reconfigure(info, rowBytes, ctable);
+}
+
+PixelRef::PixelRef(void* address, void* context, FreeFunc freeFunc,
+ const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable)
+ : SkPixelRef(info)
+ , mPixelStorageType(PixelStorageType::External) {
+ mPixelStorage.external.address = address;
+ mPixelStorage.external.context = context;
+ mPixelStorage.external.freeFunc = freeFunc;
+ reconfigure(info, rowBytes, ctable);
+}
+
+PixelRef::PixelRef(void* address, int fd, size_t mappedSize,
+ const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable)
+ : SkPixelRef(info)
+ , mPixelStorageType(PixelStorageType::Ashmem) {
+ mPixelStorage.ashmem.address = address;
+ mPixelStorage.ashmem.fd = fd;
+ mPixelStorage.ashmem.size = mappedSize;
+ reconfigure(info, rowBytes, ctable);
+}
+
+PixelRef::~PixelRef() {
+ switch (mPixelStorageType) {
+ case PixelStorageType::External:
+ mPixelStorage.external.freeFunc(mPixelStorage.external.address,
+ mPixelStorage.external.context);
+ break;
+ case PixelStorageType::Ashmem:
+ munmap(mPixelStorage.ashmem.address, mPixelStorage.ashmem.size);
+ close(mPixelStorage.ashmem.fd);
+ break;
+ case PixelStorageType::Heap:
+ free(mPixelStorage.heap.address);
+ break;
+ }
+
+ if (android::uirenderer::Caches::hasInstance()) {
+ android::uirenderer::Caches::getInstance().textureCache.releaseTexture(getStableID());
+ }
+}
+
+bool PixelRef::hasHardwareMipMap() const {
+ return mHasHardwareMipMap;
+}
+
+void PixelRef::setHasHardwareMipMap(bool hasMipMap) {
+ mHasHardwareMipMap = hasMipMap;
+}
+
+void* PixelRef::getStorage() const {
+ switch (mPixelStorageType) {
+ case PixelStorageType::External:
+ return mPixelStorage.external.address;
+ case PixelStorageType::Ashmem:
+ return mPixelStorage.ashmem.address;
+ case PixelStorageType::Heap:
+ return mPixelStorage.heap.address;
+ }
+}
+
+bool PixelRef::onNewLockPixels(LockRec* rec) {
+ rec->fPixels = getStorage();
+ rec->fRowBytes = mRowBytes;
+ rec->fColorTable = mColorTable.get();
+ return true;
+}
+
+size_t PixelRef::getAllocatedSizeInBytes() const {
+ return info().getSafeSize(mRowBytes);
+}
+
+int PixelRef::getAshmemFd() const {
+ switch (mPixelStorageType) {
+ case PixelStorageType::Ashmem:
+ return mPixelStorage.ashmem.fd;
+ default:
+ return -1;
+ }
+}
+
+size_t PixelRef::getAllocationByteCount() const {
+ switch (mPixelStorageType) {
+ case PixelStorageType::Heap:
+ return mPixelStorage.heap.size;
+ default:
+ return rowBytes() * height();
+ }
+}
+
+void PixelRef::reconfigure(const SkImageInfo& info) {
+ reconfigure(info, info.minRowBytes(), nullptr);
+}
+
+void PixelRef::setAlphaType(SkAlphaType alphaType) {
+ if (!SkColorTypeValidateAlphaType(info().colorType(), alphaType, &alphaType)) {
+ return;
+ }
+
+ changeAlphaType(alphaType);
+}
+
+void PixelRef::getSkBitmap(SkBitmap* outBitmap) {
+ outBitmap->setInfo(info(), rowBytes());
+ outBitmap->setPixelRef(this);
+ outBitmap->setHasHardwareMipMap(mHasHardwareMipMap);
+}
+
+} // namespace android \ No newline at end of file
diff --git a/libs/hwui/hwui/PixelRef.h b/libs/hwui/hwui/PixelRef.h
new file mode 100644
index 000000000000..3f8aea6ebf4a
--- /dev/null
+++ b/libs/hwui/hwui/PixelRef.h
@@ -0,0 +1,97 @@
+/*
+ * 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.
+ */
+#pragma once
+
+#include <SkBitmap.h>
+#include <SkColorTable.h>
+#include <SkImageInfo.h>
+#include <SkPixelRef.h>
+#include <cutils/compiler.h>
+
+namespace android {
+
+enum class PixelStorageType {
+ External,
+ Heap,
+ Ashmem,
+};
+
+typedef void (*FreeFunc)(void* addr, void* context);
+
+class ANDROID_API PixelRef : public SkPixelRef {
+public:
+ PixelRef(void* address, size_t allocSize, const SkImageInfo& info, size_t rowBytes,
+ SkColorTable* ctable);
+ PixelRef(void* address, void* context, FreeFunc freeFunc,
+ const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable);
+ PixelRef(void* address, int fd, size_t mappedSize, const SkImageInfo& info,
+ size_t rowBytes, SkColorTable* ctable);
+
+ int width() const { return info().width(); }
+ int height() const { return info().height(); }
+
+ // Can't mark as override since SkPixelRef::rowBytes isn't virtual
+ // but that's OK since we just want Bitmap to be able to rely
+ // on calling rowBytes() on an unlocked pixelref, which it will be
+ // doing on a PixelRef type, not a SkPixelRef, so static
+ // dispatching will do what we want.
+ size_t rowBytes() const { return mRowBytes; }
+ void reconfigure(const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable);
+ void reconfigure(const SkImageInfo& info);
+ void setAlphaType(SkAlphaType alphaType);
+
+ void getSkBitmap(SkBitmap* outBitmap);
+
+ int getAshmemFd() const;
+ size_t getAllocationByteCount() const;
+
+protected:
+ virtual bool onNewLockPixels(LockRec* rec) override;
+ virtual void onUnlockPixels() override { };
+ virtual size_t getAllocatedSizeInBytes() const override;
+private:
+ friend class Bitmap;
+ virtual ~PixelRef();
+ void doFreePixels();
+ void* getStorage() const;
+ void setHasHardwareMipMap(bool hasMipMap);
+ bool hasHardwareMipMap() const;
+
+ PixelStorageType mPixelStorageType;
+
+ size_t mRowBytes = 0;
+ sk_sp<SkColorTable> mColorTable;
+ bool mHasHardwareMipMap = false;
+
+ union {
+ struct {
+ void* address;
+ void* context;
+ FreeFunc freeFunc;
+ } external;
+ struct {
+ void* address;
+ int fd;
+ size_t size;
+ } ashmem;
+ struct {
+ void* address;
+ size_t size;
+ } heap;
+ } mPixelStorage;
+};
+
+} //namespace android \ No newline at end of file
diff --git a/libs/hwui/renderstate/OffscreenBufferPool.cpp b/libs/hwui/renderstate/OffscreenBufferPool.cpp
index 10a26e08f897..a9bbb273dbb5 100644
--- a/libs/hwui/renderstate/OffscreenBufferPool.cpp
+++ b/libs/hwui/renderstate/OffscreenBufferPool.cpp
@@ -22,6 +22,7 @@
#include "utils/FatVector.h"
#include "utils/TraceUtils.h"
+#include <utils/Color.h>
#include <utils/Log.h>
#include <GLES2/gl2.h>
@@ -44,7 +45,7 @@ OffscreenBuffer::OffscreenBuffer(RenderState& renderState, Caches& caches,
uint32_t height = computeIdealDimension(viewportHeight);
ATRACE_FORMAT("Allocate %ux%u HW Layer", width, height);
caches.textureState().activateTexture(0);
- texture.resize(width, height, GL_RGBA);
+ texture.resize(width, height, caches.rgbaInternalFormat(), GL_RGBA);
texture.blend = true;
texture.setWrap(GL_CLAMP_TO_EDGE);
// not setting filter on texture, since it's set when drawing, based on transform
diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp
index ee4619d2c222..84ab3f31e7ab 100644
--- a/libs/hwui/renderstate/RenderState.cpp
+++ b/libs/hwui/renderstate/RenderState.cpp
@@ -52,7 +52,6 @@ void RenderState::onGLContextCreated() {
mCaches = &Caches::createInstance(*this);
}
mCaches->init();
- mCaches->textureCache.setAssetAtlas(&mAssetAtlas);
}
static void layerLostGlContext(Layer* layer) {
@@ -64,7 +63,6 @@ void RenderState::onGLContextDestroyed() {
// TODO: reset all cached state in state objects
std::for_each(mActiveLayers.begin(), mActiveLayers.end(), layerLostGlContext);
- mAssetAtlas.terminate();
mCaches->terminate();
@@ -147,9 +145,17 @@ void RenderState::interruptForFunctorInvoke() {
meshState().resetVertexPointers();
meshState().disableTexCoordsVertexArray();
debugOverdraw(false, false);
+ // TODO: We need a way to know whether the functor is sRGB aware (b/32072673)
+ if (mCaches->extensions().hasSRGBWriteControl()) {
+ glDisable(GL_FRAMEBUFFER_SRGB_EXT);
+ }
}
void RenderState::resumeFromFunctorInvoke() {
+ if (mCaches->extensions().hasSRGBWriteControl()) {
+ glEnable(GL_FRAMEBUFFER_SRGB_EXT);
+ }
+
glViewport(0, 0, mViewportWidth, mViewportHeight);
glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
debugOverdraw(false, false);
@@ -308,7 +314,7 @@ void RenderState::render(const Glop& glop, const Matrix4& orthoMatrix) {
glVertexAttribPointer(alphaLocation, 1, GL_FLOAT, GL_FALSE, vertices.stride, alphaCoords);
}
// Shader uniforms
- SkiaShader::apply(*mCaches, fill.skiaShaderData);
+ SkiaShader::apply(*mCaches, fill.skiaShaderData, mViewportWidth, mViewportHeight);
GL_CHECKPOINT(MODERATE);
Texture* texture = (fill.skiaShaderData.skiaShaderType & kBitmap_SkiaShaderType) ?
diff --git a/libs/hwui/renderstate/RenderState.h b/libs/hwui/renderstate/RenderState.h
index 9e0fb121be65..3d119dc9e290 100644
--- a/libs/hwui/renderstate/RenderState.h
+++ b/libs/hwui/renderstate/RenderState.h
@@ -16,7 +16,6 @@
#ifndef RENDERSTATE_H
#define RENDERSTATE_H
-#include "AssetAtlas.h"
#include "Caches.h"
#include "Glop.h"
#include "renderstate/Blend.h"
@@ -92,7 +91,6 @@ public:
void render(const Glop& glop, const Matrix4& orthoMatrix);
- AssetAtlas& assetAtlas() { return mAssetAtlas; }
Blend& blend() { return *mBlend; }
MeshState& meshState() { return *mMeshState; }
Scissor& scissor() { return *mScissor; }
@@ -120,7 +118,6 @@ private:
OffscreenBufferPool mLayerPool;
- AssetAtlas mAssetAtlas;
std::set<Layer*> mActiveLayers;
std::set<renderthread::CanvasContext*> mRegisteredContexts;
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 0f2d55bc209d..fe0f56ad1332 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -545,11 +545,6 @@ DeferredLayerUpdater* CanvasContext::createTextureLayer() {
return mRenderPipeline->createTextureLayer();
}
-void CanvasContext::setTextureAtlas(RenderThread& thread,
- const sp<GraphicBuffer>& buffer, int64_t* map, size_t mapSize) {
- thread.eglManager().setTextureAtlas(buffer, map, mapSize);
-}
-
void CanvasContext::dumpFrames(int fd) {
FILE* file = fdopen(fd, "a");
fprintf(file, "\n\n---PROFILEDATA---\n");
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index 652cddd968bb..41b658e083da 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -119,9 +119,6 @@ public:
DeferredLayerUpdater* createTextureLayer();
- ANDROID_API static void setTextureAtlas(RenderThread& thread,
- const sp<GraphicBuffer>& buffer, int64_t* map, size_t mapSize);
-
void stopDrawing();
void notifyFramePending();
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index 86731c9581be..beda0455c145 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -91,9 +91,7 @@ EglManager::EglManager(RenderThread& thread)
, mEglConfig(nullptr)
, mEglContext(EGL_NO_CONTEXT)
, mPBufferSurface(EGL_NO_SURFACE)
- , mCurrentSurface(EGL_NO_SURFACE)
- , mAtlasMap(nullptr)
- , mAtlasMapSize(0) {
+ , mCurrentSurface(EGL_NO_SURFACE) {
}
void EglManager::initialize() {
@@ -128,7 +126,6 @@ void EglManager::initialize() {
makeCurrent(mPBufferSurface);
DeviceInfo::initialize();
mRenderThread.renderState().onGLContextCreated();
- initAtlas();
}
void EglManager::initExtensions() {
@@ -191,32 +188,6 @@ void EglManager::createContext() {
"Failed to create context, error = %s", egl_error_str());
}
-void EglManager::setTextureAtlas(const sp<GraphicBuffer>& buffer,
- int64_t* map, size_t mapSize) {
-
- // Already initialized
- if (mAtlasBuffer.get()) {
- ALOGW("Multiple calls to setTextureAtlas!");
- delete map;
- return;
- }
-
- mAtlasBuffer = buffer;
- mAtlasMap = map;
- mAtlasMapSize = mapSize;
-
- if (hasEglContext()) {
- initAtlas();
- }
-}
-
-void EglManager::initAtlas() {
- if (mAtlasBuffer.get()) {
- mRenderThread.renderState().assetAtlas().init(mAtlasBuffer,
- mAtlasMap, mAtlasMapSize);
- }
-}
-
void EglManager::createPBufferSurface() {
LOG_ALWAYS_FATAL_IF(mEglDisplay == EGL_NO_DISPLAY,
"usePBufferSurface() called on uninitialized GlobalContext!");
@@ -229,7 +200,16 @@ void EglManager::createPBufferSurface() {
EGLSurface EglManager::createSurface(EGLNativeWindowType window) {
initialize();
- EGLSurface surface = eglCreateWindowSurface(mEglDisplay, mEglConfig, window, nullptr);
+
+ EGLint attribs[] = {
+#ifdef ANDROID_ENABLE_LINEAR_BLENDING
+ EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_SRGB_KHR,
+ EGL_COLORSPACE, EGL_COLORSPACE_sRGB,
+#endif
+ EGL_NONE
+ };
+
+ EGLSurface surface = eglCreateWindowSurface(mEglDisplay, mEglConfig, window, attribs);
LOG_ALWAYS_FATAL_IF(surface == EGL_NO_SURFACE,
"Failed to create EGLSurface for window %p, eglErr = %s",
(void*) window, egl_error_str());
diff --git a/libs/hwui/renderthread/EglManager.h b/libs/hwui/renderthread/EglManager.h
index 41047fecf960..ba4a3e1c5192 100644
--- a/libs/hwui/renderthread/EglManager.h
+++ b/libs/hwui/renderthread/EglManager.h
@@ -79,8 +79,6 @@ public:
// Returns true iff the surface is now preserving buffers.
bool setPreserveBuffer(EGLSurface surface, bool preserve);
- void setTextureAtlas(const sp<GraphicBuffer>& buffer, int64_t* map, size_t mapSize);
-
void fence();
private:
@@ -94,7 +92,6 @@ private:
void createPBufferSurface();
void loadConfig();
void createContext();
- void initAtlas();
EGLint queryBufferAge(EGLSurface surface);
RenderThread& mRenderThread;
@@ -106,10 +103,6 @@ private:
EGLSurface mCurrentSurface;
- sp<GraphicBuffer> mAtlasBuffer;
- int64_t* mAtlasMap;
- size_t mAtlasMapSize;
-
enum class SwapBehavior {
Discard,
Preserved,
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index dcbc980763ec..c2ed8643c0ad 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -480,23 +480,6 @@ void RenderProxy::dumpGraphicsMemory(int fd) {
staticPostAndWait(task);
}
-CREATE_BRIDGE4(setTextureAtlas, RenderThread* thread, GraphicBuffer* buffer, int64_t* map,
- size_t size) {
- CanvasContext::setTextureAtlas(*args->thread, args->buffer, args->map, args->size);
- args->buffer->decStrong(nullptr);
- return nullptr;
-}
-
-void RenderProxy::setTextureAtlas(const sp<GraphicBuffer>& buffer, int64_t* map, size_t size) {
- SETUP_TASK(setTextureAtlas);
- args->thread = &mRenderThread;
- args->buffer = buffer.get();
- args->buffer->incStrong(nullptr);
- args->map = map;
- args->size = size;
- post(task);
-}
-
CREATE_BRIDGE2(setProcessStatsBuffer, RenderThread* thread, int fd) {
args->thread->jankTracker().switchStorageToAshmem(args->fd);
close(args->fd);
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index d4aaea6d7280..50a6f64fe5ca 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -112,7 +112,6 @@ public:
uint32_t frameTimePercentile(int p);
ANDROID_API static void dumpGraphicsMemory(int fd);
- ANDROID_API void setTextureAtlas(const sp<GraphicBuffer>& buffer, int64_t* map, size_t size);
ANDROID_API void setProcessStatsBuffer(int fd);
ANDROID_API int getRenderThreadTid();
diff --git a/libs/hwui/tests/common/TestUtils.h b/libs/hwui/tests/common/TestUtils.h
index 78e9bc475826..51c0a05fb6d7 100644
--- a/libs/hwui/tests/common/TestUtils.h
+++ b/libs/hwui/tests/common/TestUtils.h
@@ -124,8 +124,9 @@ public:
static SkBitmap createSkBitmap(int width, int height,
SkColorType colorType = kN32_SkColorType) {
SkBitmap bitmap;
+ sk_sp<SkColorSpace> colorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named);
SkImageInfo info = SkImageInfo::Make(width, height,
- colorType, kPremul_SkAlphaType);
+ colorType, kPremul_SkAlphaType, colorSpace);
bitmap.setInfo(info);
bitmap.allocPixels(info);
return bitmap;
diff --git a/libs/hwui/tests/scripts/prep_ryu.sh b/libs/hwui/tests/scripts/prep_ryu.sh
new file mode 100644
index 000000000000..7c6c0df8d58e
--- /dev/null
+++ b/libs/hwui/tests/scripts/prep_ryu.sh
@@ -0,0 +1,31 @@
+adb root
+adb wait-for-device
+adb shell stop thermal-engine
+adb shell stop perfd
+
+# 51000 102000 204000 306000 408000 510000 612000 714000 816000 918000
+# 1020000 1122000 1224000 1326000 1428000 1530000 1632000 1734000 1836000 1912500
+S=1326000
+echo "set cpu to $S hz";
+adb shell "echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"
+adb shell "echo $S > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq"
+adb shell "echo $S > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq"
+
+#01: core 76 MHz emc 408 MHz
+#02: core 153 MHz emc 665 MHz
+#03: core 230 MHz emc 800 MHz *
+#04: core 307 MHz emc 1065 MHz
+#05: core 384 MHz emc 1331 MHz
+#06: core 460 MHz emc 1600 MHz
+#07: core 537 MHz emc 1600 MHz
+#08: core 614 MHz emc 1600 MHz
+#09: core 691 MHz emc 1600 MHz
+#0a: core 768 MHz emc 1600 MHz
+#0b: core 844 MHz emc 1600 MHz
+#0c: core 921 MHz emc 1600 MHz
+#0d: core 998 MHz emc 1600 MHz
+#AC: core 230 MHz emc 800 MHz a A d D
+
+echo "set gpu to core 307 MHz emc 1065 MHz"
+# it will lock gpu until you touch a screen
+adb shell "echo 04 > /sys/devices/57000000.gpu/pstate"
diff --git a/libs/hwui/tests/unit/SkiaBehaviorTests.cpp b/libs/hwui/tests/unit/SkiaBehaviorTests.cpp
index a30ada0df453..5cab04d26c2a 100644
--- a/libs/hwui/tests/unit/SkiaBehaviorTests.cpp
+++ b/libs/hwui/tests/unit/SkiaBehaviorTests.cpp
@@ -18,6 +18,7 @@
#include <gtest/gtest.h>
#include <SkColorMatrixFilter.h>
+#include <SkColorSpace.h>
#include <SkImagePriv.h>
#include <SkShader.h>
@@ -82,3 +83,9 @@ TEST(SkiaBehavior, porterDuffCreateIsCached) {
paint.setXfermodeMode(SkXfermode::kOverlay_Mode);
ASSERT_EQ(expected, paint.getXfermode());
}
+
+TEST(SkiaBehavior, srgbColorSpaceIsSingleton) {
+ sk_sp<SkColorSpace> sRGB1 = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named);
+ sk_sp<SkColorSpace> sRGB2 = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named);
+ ASSERT_EQ(sRGB1.get(), sRGB2.get());
+}
diff --git a/libs/hwui/tests/unit/VectorDrawableTests.cpp b/libs/hwui/tests/unit/VectorDrawableTests.cpp
index 83b485fa705e..8e0d3ee572a6 100644
--- a/libs/hwui/tests/unit/VectorDrawableTests.cpp
+++ b/libs/hwui/tests/unit/VectorDrawableTests.cpp
@@ -426,5 +426,49 @@ TEST(VectorDrawable, groupProperties) {
EXPECT_EQ(1.0f, properties->getPivotY());
}
+
+static SkShader* createShader(bool* isDestroyed) {
+ class TestShader : public SkShader {
+ public:
+ TestShader(bool* isDestroyed) : SkShader(), mDestroyed(isDestroyed) {
+ }
+ ~TestShader() {
+ *mDestroyed = true;
+ }
+
+ Factory getFactory() const override { return nullptr; }
+ private:
+ bool* mDestroyed;
+ };
+ return new TestShader(isDestroyed);
+}
+
+TEST(VectorDrawable, drawPathWithoutIncrementingShaderRefCount) {
+ VectorDrawable::FullPath path("m1 1", 4);
+ SkBitmap bitmap;
+ SkImageInfo info = SkImageInfo::Make(5, 5, kN32_SkColorType, kPremul_SkAlphaType);
+ bitmap.setInfo(info);
+ bitmap.allocPixels(info);
+ SkCanvas canvas(bitmap);
+
+ bool shaderIsDestroyed = false;
+
+ // Initial ref count is 1
+ SkShader* shader = createShader(&shaderIsDestroyed);
+
+ // Setting the fill gradient increments the ref count of the shader by 1
+ path.mutateStagingProperties()->setFillGradient(shader);
+ path.draw(&canvas, SkMatrix::I(), 1.0f, 1.0f, true);
+ // Resetting the fill gradient decrements the ref count of the shader by 1
+ path.mutateStagingProperties()->setFillGradient(nullptr);
+
+ // Expect ref count to be 1 again, i.e. nothing else to have a ref to the shader now. Unref()
+ // again should bring the ref count to zero and consequently trigger detor.
+ shader->unref();
+
+ // Verify that detor is called.
+ EXPECT_TRUE(shaderIsDestroyed);
+}
+
}; // namespace uirenderer
}; // namespace android
diff --git a/libs/hwui/utils/Color.h b/libs/hwui/utils/Color.h
index b5157f401438..c8f8c7071075 100644
--- a/libs/hwui/utils/Color.h
+++ b/libs/hwui/utils/Color.h
@@ -16,6 +16,8 @@
#ifndef COLOR_H
#define COLOR_H
+#include <math.h>
+
#include <SkColor.h>
namespace android {
@@ -80,6 +82,28 @@ namespace uirenderer {
};
static constexpr int BrightColorsCount = sizeof(BrightColors) / sizeof(Color::Color);
+ // Opto-electronic conversion function for the sRGB color space
+ // Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
+ static constexpr float OECF_sRGB(float linear) {
+#ifdef ANDROID_ENABLE_LINEAR_BLENDING
+ // IEC 61966-2-1:1999
+ return linear <= 0.0031308f ?
+ linear * 12.92f : (powf(linear, 1.0f / 2.4f) * 1.055f) - 0.055f;
+#else
+ return linear;
+#endif
+ }
+
+ // Electro-optical conversion function for the sRGB color space
+ // Takes a linear sRGB value and converts it to a gamma-encoded sRGB value
+ static constexpr float EOCF_sRGB(float srgb) {
+#ifdef ANDROID_ENABLE_LINEAR_BLENDING
+ // IEC 61966-2-1:1999
+ return srgb <= 0.04045f ? srgb / 12.92f : powf((srgb + 0.055f) / 1.055f, 2.4f);
+#else
+ return srgb;
+#endif
+ }
} /* namespace uirenderer */
} /* namespace android */
diff --git a/libs/hwui/utils/TestWindowContext.cpp b/libs/hwui/utils/TestWindowContext.cpp
index b879f781bce1..624d20763384 100644
--- a/libs/hwui/utils/TestWindowContext.cpp
+++ b/libs/hwui/utils/TestWindowContext.cpp
@@ -110,9 +110,10 @@ public:
}
bool capturePixels(SkBitmap* bmp) {
+ sk_sp<SkColorSpace> colorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named);
SkImageInfo destinationConfig =
SkImageInfo::Make(mSize.width(), mSize.height(),
- kRGBA_8888_SkColorType, kPremul_SkAlphaType);
+ kRGBA_8888_SkColorType, kPremul_SkAlphaType, colorSpace);
bmp->allocPixels(destinationConfig);
android_memset32((uint32_t*) bmp->getPixels(), SK_ColorRED,
mSize.width() * mSize.height() * 4);
diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java
index 8ae6e6bda0f2..754fe45c2a06 100644
--- a/media/java/android/media/Ringtone.java
+++ b/media/java/android/media/Ringtone.java
@@ -371,6 +371,7 @@ public class Ringtone {
private void destroyLocalPlayer() {
if (mLocalPlayer != null) {
+ mLocalPlayer.setOnCompletionListener(null);
mLocalPlayer.reset();
mLocalPlayer.release();
mLocalPlayer = null;
@@ -467,11 +468,14 @@ public class Ringtone {
}
class MyOnCompletionListener implements MediaPlayer.OnCompletionListener {
- public void onCompletion(MediaPlayer mp)
- {
+ @Override
+ public void onCompletion(MediaPlayer mp) {
synchronized (sActiveRingtones) {
sActiveRingtones.remove(Ringtone.this);
}
+ if (mLocalPlayer != null) {
+ mLocalPlayer.setOnCompletionListener(null);
+ }
}
}
}
diff --git a/packages/MtpDocumentsProvider/perf_tests/src/com/android/mtp/AppFuseTest.java b/packages/MtpDocumentsProvider/perf_tests/src/com/android/mtp/AppFusePerfTest.java
index a3e2e6b32baa..0762571910dc 100644
--- a/packages/MtpDocumentsProvider/perf_tests/src/com/android/mtp/AppFuseTest.java
+++ b/packages/MtpDocumentsProvider/perf_tests/src/com/android/mtp/AppFusePerfTest.java
@@ -35,10 +35,10 @@ import org.junit.runners.JUnit4;
import org.junit.Test;
@RunWith(JUnit4.class)
-public class AppFuseTest {
+public class AppFusePerfTest {
@Test
@LargeTest
- public void testPerfReadWriteFile() throws IOException {
+ public void testReadWriteFile() throws IOException {
final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
final StorageManager storageManager = context.getSystemService(StorageManager.class);
final int INODE = 10;
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 1a1aa57a0148..972fc738cb09 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -582,11 +582,6 @@
<!-- UI debug setting: force right to left layout summary [CHAR LIMIT=100] -->
<string name="force_rtl_layout_all_locales_summary">Force screen layout direction to RTL for all locales</string>
- <!-- UI debug setting: show how CPU is being used? [CHAR LIMIT=25] -->
- <string name="show_cpu_usage">Show CPU usage</string>
- <!-- UI debug setting: show cpu usage summary [CHAR LIMIT=50] -->
- <string name="show_cpu_usage_summary">Screen overlay showing current CPU usage</string>
-
<!-- UI debug setting: force hardware acceleration to render apps [CHAR LIMIT=25] -->
<string name="force_hw_ui">Force GPU rendering</string>
<!-- UI debug setting: force hardware acceleration summary [CHAR LIMIT=50] -->
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryManager.java b/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryManager.java
index ce16336d20be..a51ad76405a2 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryManager.java
@@ -59,11 +59,7 @@ public class CategoryManager {
public synchronized DashboardCategory getTilesByCategory(Context context, String categoryKey) {
tryInitCategories(context);
- final DashboardCategory category = mCategoryByKeyMap.get(categoryKey);
- if (category == null) {
- throw new IllegalStateException("Can't find category with key " + categoryKey);
- }
- return category;
+ return mCategoryByKeyMap.get(categoryKey);
}
public synchronized List<DashboardCategory> getCategories(Context context) {
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 7338a9cb654b..c1a1f844f6d9 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -1483,7 +1483,6 @@ class DatabaseHelper extends SQLiteOpenHelper {
Settings.Global.CALL_AUTO_RETRY,
Settings.Global.DEBUG_APP,
Settings.Global.WAIT_FOR_DEBUGGER,
- Settings.Global.SHOW_PROCESSES,
Settings.Global.ALWAYS_FINISH_ACTIVITIES,
};
String[] secureToGlobal = {
diff --git a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
index dde71ebe5530..b4bfb0124455 100644
--- a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
+++ b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
@@ -201,7 +201,12 @@ public class BugreportReceiverTest {
@After
public void tearDown() throws Exception {
Log.i(TAG, getName() + ".tearDown()");
- cancelExistingNotifications();
+ try {
+ cancelExistingNotifications();
+ } finally {
+ // Collapses just in case, so a failure here does not compromise tests on other classes.
+ mUiBot.collapseStatusBar();
+ }
}
@Test
@@ -362,7 +367,7 @@ public class BugreportReceiverTest {
detailsUi.assertName(NAME); // Sanity check
cancelFromNotification();
- mUiBot.closeNotifications();
+ mUiBot.collapseStatusBar();
assertDetailsUiClosed();
assertServiceNotRunning();
diff --git a/packages/Shell/tests/src/com/android/shell/UiBot.java b/packages/Shell/tests/src/com/android/shell/UiBot.java
index deab7da953fa..e8397659e692 100644
--- a/packages/Shell/tests/src/com/android/shell/UiBot.java
+++ b/packages/Shell/tests/src/com/android/shell/UiBot.java
@@ -62,7 +62,7 @@ final class UiBot {
return getObject(text);
}
- public void closeNotifications() throws Exception {
+ public void collapseStatusBar() throws Exception {
// TODO: mDevice should provide such method..
StatusBarManager sbm =
(StatusBarManager) mInstrumentation.getContext().getSystemService("statusbar");
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 31844c0f0af5..02518f2f5c69 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -219,19 +219,10 @@
</intent-filter>
</receiver>
- <service android:name=".LoadAverageService"
- android:exported="true" />
-
<service android:name=".ImageWallpaper"
android:permission="android.permission.BIND_WALLPAPER"
android:exported="true" />
- <receiver android:name=".BootReceiver" androidprv:systemUserOnly="true">
- <intent-filter android:priority="1000">
- <action android:name="android.intent.action.BOOT_COMPLETED" />
- </intent-filter>
- </receiver>
-
<activity android:name=".tuner.TunerActivity"
android:enabled="false"
android:icon="@drawable/tuner"
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSContainer.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSContainer.java
index 3270587e7266..a616369874de 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSContainer.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSContainer.java
@@ -31,7 +31,7 @@ public abstract class QSContainer extends FrameLayout {
// This should be incremented any time this class or ActivityStarter or BaseStatusBarHeader
// change in incompatible ways.
- public static final int VERSION = 1;
+ public static final int VERSION = 2;
public QSContainer(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
@@ -40,6 +40,7 @@ public abstract class QSContainer extends FrameLayout {
public abstract void setPanelView(HeightListener notificationPanelView);
public abstract BaseStatusBarHeader getHeader();
+ public abstract void hideImmediately();
public abstract int getQsMinExpansionHeight();
public abstract int getDesiredHeight();
public abstract void setHeightOverride(int desiredHeight);
diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml
index 1b0f3d7eefba..c1c8bf98da0a 100644
--- a/packages/SystemUI/res/values-hy-rAM/strings.xml
+++ b/packages/SystemUI/res/values-hy-rAM/strings.xml
@@ -643,7 +643,7 @@
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Բացել կարգավորումները:"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Բացել արագ կարգավորումները:"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Փակել արագ կարգավորումները:"</string>
- <string name="accessibility_quick_settings_alarm_set" msgid="1863000242431528676">"Զարթուցիչը կարգավորված է:"</string>
+ <string name="accessibility_quick_settings_alarm_set" msgid="1863000242431528676">"Զարթուցիչը դրված է:"</string>
<string name="accessibility_quick_settings_user" msgid="1567445362870421770">"Մուտք է գործել որպես <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_no_internet" msgid="31890692343084075">"Ինտերնետ կապ չկա:"</string>
<string name="accessibility_quick_settings_open_details" msgid="4230931801728005194">"Բացել մանրամասները:"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 0f7a7db8cec3..11ce95055450 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -328,7 +328,7 @@
<string name="recents_empty_message" msgid="808480104164008572">"Niciun element recent"</string>
<string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Ați șters tot"</string>
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informații despre aplicație"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixare pe ecran"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixarea ecranului"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"căutare"</string>
<string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> nu a putut porni."</string>
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplicația <xliff:g id="APP">%s</xliff:g> este dezactivată în modul sigur."</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 26b0d9fa2bd6..7e2ec6ef61f3 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -330,7 +330,7 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> är inaktiverad i säkert läge."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Rensa alla"</string>
<string name="recents_incompatible_app_message" msgid="5075812958564082451">"Appen har inte stöd för delad skärm."</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Dra här om du vill dela upp skärmen"</string>
+ <string name="recents_drag_hint_message" msgid="2649739267073203985">"Dra hit för att dela upp skärmen"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Dela horisontellt"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Dela vertikalt"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Dela anpassad"</string>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 3f485c3bad8b..81f932e1799e 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -755,10 +755,6 @@
<string name="quick_settings_work_mode_label">Work mode</string>
<!-- QuickSettings: Label for the toggle to activate Night display (renamed "Night Light" with title caps). [CHAR LIMIT=20] -->
<string name="quick_settings_night_display_label">Night Light</string>
- <!-- QuickSettings: Summary for the toggle to deactivate Night display when it's on (renamed "Night Light" with title caps). [CHAR LIMIT=NONE] -->
- <string name="quick_settings_night_display_summary_on">Night Light on, tap to turn off</string>
- <!-- QuickSettings: Label for the toggle to activate Night display when it's off (renamed "Night Light" with title caps). [CHAR LIMIT=NONE] -->
- <string name="quick_settings_night_display_summary_off">Night Light off, tap to turn on</string>
<!-- Recents: The empty recents string. [CHAR LIMIT=NONE] -->
<string name="recents_empty_message">No recent items</string>
diff --git a/packages/SystemUI/src/com/android/systemui/BootReceiver.java b/packages/SystemUI/src/com/android/systemui/BootReceiver.java
deleted file mode 100644
index 8e24eebd10cc..000000000000
--- a/packages/SystemUI/src/com/android/systemui/BootReceiver.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2011 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.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.provider.Settings;
-import android.util.Log;
-
-/**
- * Performs a number of miscellaneous, non-system-critical actions
- * after the system has finished booting.
- */
-public class BootReceiver extends BroadcastReceiver {
- private static final String TAG = "SystemUIBootReceiver";
-
- @Override
- public void onReceive(final Context context, Intent intent) {
- try {
- // Start the load average overlay, if activated
- ContentResolver res = context.getContentResolver();
- if (Settings.Global.getInt(res, Settings.Global.SHOW_PROCESSES, 0) != 0) {
- Intent loadavg = new Intent(context, com.android.systemui.LoadAverageService.class);
- context.startService(loadavg);
- }
- } catch (Exception e) {
- Log.e(TAG, "Can't start load average service", e);
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/LoadAverageService.java b/packages/SystemUI/src/com/android/systemui/LoadAverageService.java
deleted file mode 100644
index 59ffe03b842f..000000000000
--- a/packages/SystemUI/src/com/android/systemui/LoadAverageService.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * Copyright (C) 2007 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.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.PixelFormat;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.view.Gravity;
-import android.view.View;
-import android.view.WindowManager;
-
-import com.android.internal.os.ProcessCpuTracker;
-
-public class LoadAverageService extends Service {
- private View mView;
-
- private static final class CpuTracker extends ProcessCpuTracker {
- String mLoadText;
- int mLoadWidth;
-
- private final Paint mPaint;
-
- CpuTracker(Paint paint) {
- super(false);
- mPaint = paint;
- }
-
- @Override
- public void onLoadChanged(float load1, float load5, float load15) {
- mLoadText = load1 + " / " + load5 + " / " + load15;
- mLoadWidth = (int)mPaint.measureText(mLoadText);
- }
-
- @Override
- public int onMeasureProcessName(String name) {
- return (int)mPaint.measureText(name);
- }
- }
-
- private class LoadView extends View {
- private Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- if (msg.what == 1) {
- mStats.update();
- updateDisplay();
- Message m = obtainMessage(1);
- sendMessageDelayed(m, 2000);
- }
- }
- };
-
- private final CpuTracker mStats;
-
- private Paint mLoadPaint;
- private Paint mAddedPaint;
- private Paint mRemovedPaint;
- private Paint mShadowPaint;
- private Paint mShadow2Paint;
- private Paint mIrqPaint;
- private Paint mSystemPaint;
- private Paint mUserPaint;
- private float mAscent;
- private int mFH;
-
- private int mNeededWidth;
- private int mNeededHeight;
-
- LoadView(Context c) {
- super(c);
-
- setPadding(4, 4, 4, 4);
- //setBackgroundResource(com.android.internal.R.drawable.load_average_background);
-
- // Need to scale text size by density... but we won't do it
- // linearly, because with higher dps it is nice to squeeze the
- // text a bit to fit more of it. And with lower dps, trying to
- // go much smaller will result in unreadable text.
- int textSize = 10;
- float density = c.getResources().getDisplayMetrics().density;
- if (density < 1) {
- textSize = 9;
- } else {
- textSize = (int)(10*density);
- if (textSize < 10) {
- textSize = 10;
- }
- }
- mLoadPaint = new Paint();
- mLoadPaint.setAntiAlias(true);
- mLoadPaint.setTextSize(textSize);
- mLoadPaint.setARGB(255, 255, 255, 255);
-
- mAddedPaint = new Paint();
- mAddedPaint.setAntiAlias(true);
- mAddedPaint.setTextSize(textSize);
- mAddedPaint.setARGB(255, 128, 255, 128);
-
- mRemovedPaint = new Paint();
- mRemovedPaint.setAntiAlias(true);
- mRemovedPaint.setStrikeThruText(true);
- mRemovedPaint.setTextSize(textSize);
- mRemovedPaint.setARGB(255, 255, 128, 128);
-
- mShadowPaint = new Paint();
- mShadowPaint.setAntiAlias(true);
- mShadowPaint.setTextSize(textSize);
- //mShadowPaint.setFakeBoldText(true);
- mShadowPaint.setARGB(192, 0, 0, 0);
- mLoadPaint.setShadowLayer(4, 0, 0, 0xff000000);
-
- mShadow2Paint = new Paint();
- mShadow2Paint.setAntiAlias(true);
- mShadow2Paint.setTextSize(textSize);
- //mShadow2Paint.setFakeBoldText(true);
- mShadow2Paint.setARGB(192, 0, 0, 0);
- mLoadPaint.setShadowLayer(2, 0, 0, 0xff000000);
-
- mIrqPaint = new Paint();
- mIrqPaint.setARGB(0x80, 0, 0, 0xff);
- mIrqPaint.setShadowLayer(2, 0, 0, 0xff000000);
- mSystemPaint = new Paint();
- mSystemPaint.setARGB(0x80, 0xff, 0, 0);
- mSystemPaint.setShadowLayer(2, 0, 0, 0xff000000);
- mUserPaint = new Paint();
- mUserPaint.setARGB(0x80, 0, 0xff, 0);
- mSystemPaint.setShadowLayer(2, 0, 0, 0xff000000);
-
- mAscent = mLoadPaint.ascent();
- float descent = mLoadPaint.descent();
- mFH = (int)(descent - mAscent + .5f);
-
- mStats = new CpuTracker(mLoadPaint);
- mStats.init();
- updateDisplay();
- }
-
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- mHandler.sendEmptyMessage(1);
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- mHandler.removeMessages(1);
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- setMeasuredDimension(resolveSize(mNeededWidth, widthMeasureSpec),
- resolveSize(mNeededHeight, heightMeasureSpec));
- }
-
- @Override
- public void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- final int W = mNeededWidth;
- final int RIGHT = getWidth()-1;
-
- final CpuTracker stats = mStats;
- final int userTime = stats.getLastUserTime();
- final int systemTime = stats.getLastSystemTime();
- final int iowaitTime = stats.getLastIoWaitTime();
- final int irqTime = stats.getLastIrqTime();
- final int softIrqTime = stats.getLastSoftIrqTime();
- final int idleTime = stats.getLastIdleTime();
-
- final int totalTime = userTime+systemTime+iowaitTime+irqTime+softIrqTime+idleTime;
- if (totalTime == 0) {
- return;
- }
- int userW = (userTime*W)/totalTime;
- int systemW = (systemTime*W)/totalTime;
- int irqW = ((iowaitTime+irqTime+softIrqTime)*W)/totalTime;
-
- int paddingRight = getPaddingRight();
- int x = RIGHT - paddingRight;
- int top = getPaddingTop() + 2;
- int bottom = getPaddingTop() + mFH - 2;
-
- if (irqW > 0) {
- canvas.drawRect(x-irqW, top, x, bottom, mIrqPaint);
- x -= irqW;
- }
- if (systemW > 0) {
- canvas.drawRect(x-systemW, top, x, bottom, mSystemPaint);
- x -= systemW;
- }
- if (userW > 0) {
- canvas.drawRect(x-userW, top, x, bottom, mUserPaint);
- x -= userW;
- }
-
- int y = getPaddingTop() - (int)mAscent;
- canvas.drawText(stats.mLoadText, RIGHT-paddingRight-stats.mLoadWidth-1,
- y-1, mShadowPaint);
- canvas.drawText(stats.mLoadText, RIGHT-paddingRight-stats.mLoadWidth-1,
- y+1, mShadowPaint);
- canvas.drawText(stats.mLoadText, RIGHT-paddingRight-stats.mLoadWidth+1,
- y-1, mShadow2Paint);
- canvas.drawText(stats.mLoadText, RIGHT-paddingRight-stats.mLoadWidth+1,
- y+1, mShadow2Paint);
- canvas.drawText(stats.mLoadText, RIGHT-paddingRight-stats.mLoadWidth,
- y, mLoadPaint);
-
- int N = stats.countWorkingStats();
- for (int i=0; i<N; i++) {
- CpuTracker.Stats st = stats.getWorkingStats(i);
- y += mFH;
- top += mFH;
- bottom += mFH;
-
- userW = (st.rel_utime*W)/totalTime;
- systemW = (st.rel_stime*W)/totalTime;
- x = RIGHT - paddingRight;
- if (systemW > 0) {
- canvas.drawRect(x-systemW, top, x, bottom, mSystemPaint);
- x -= systemW;
- }
- if (userW > 0) {
- canvas.drawRect(x-userW, top, x, bottom, mUserPaint);
- x -= userW;
- }
-
- canvas.drawText(st.name, RIGHT-paddingRight-st.nameWidth-1,
- y-1, mShadowPaint);
- canvas.drawText(st.name, RIGHT-paddingRight-st.nameWidth-1,
- y+1, mShadowPaint);
- canvas.drawText(st.name, RIGHT-paddingRight-st.nameWidth+1,
- y-1, mShadow2Paint);
- canvas.drawText(st.name, RIGHT-paddingRight-st.nameWidth+1,
- y+1, mShadow2Paint);
- Paint p = mLoadPaint;
- if (st.added) p = mAddedPaint;
- if (st.removed) p = mRemovedPaint;
- canvas.drawText(st.name, RIGHT-paddingRight-st.nameWidth, y, p);
- }
- }
-
- void updateDisplay() {
- final CpuTracker stats = mStats;
- final int NW = stats.countWorkingStats();
-
- int maxWidth = stats.mLoadWidth;
- for (int i=0; i<NW; i++) {
- CpuTracker.Stats st = stats.getWorkingStats(i);
- if (st.nameWidth > maxWidth) {
- maxWidth = st.nameWidth;
- }
- }
-
- int neededWidth = getPaddingLeft() + getPaddingRight() + maxWidth;
- int neededHeight = getPaddingTop() + getPaddingBottom() + (mFH*(1+NW));
- if (neededWidth != mNeededWidth || neededHeight != mNeededHeight) {
- mNeededWidth = neededWidth;
- mNeededHeight = neededHeight;
- requestLayout();
- } else {
- invalidate();
- }
- }
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- mView = new LoadView(this);
- WindowManager.LayoutParams params = new WindowManager.LayoutParams(
- WindowManager.LayoutParams.MATCH_PARENT,
- WindowManager.LayoutParams.WRAP_CONTENT,
- WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY,
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
- WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
- PixelFormat.TRANSLUCENT);
- params.gravity = Gravity.END | Gravity.TOP;
- params.setTitle("Load Average");
- WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
- wm.addView(mView, params);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- ((WindowManager)getSystemService(WINDOW_SERVICE)).removeView(mView);
- mView = null;
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
-
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index 217392204764..f345172752ba 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -334,4 +334,10 @@ public class QSContainerImpl extends QSContainer {
public int getQsMinExpansionHeight() {
return mHeader.getHeight();
}
+
+ @Override
+ public void hideImmediately() {
+ animate().cancel();
+ setY(-mHeader.getHeight());
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
index 9415b27f7570..c02e5aee9ccf 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
@@ -75,14 +75,12 @@ public class NightDisplayTile extends QSTile<QSTile.BooleanState>
protected void handleUpdateState(BooleanState state, Object arg) {
final boolean isActivated = mController.isActivated();
state.value = isActivated;
- state.label = mContext.getString(R.string.quick_settings_night_display_label);
+ state.label = state.contentDescription =
+ mContext.getString(R.string.quick_settings_night_display_label);
state.icon = ResourceIcon.get(isActivated ? R.drawable.ic_qs_night_display_on
: R.drawable.ic_qs_night_display_off);
- state.contentDescription = mContext.getString(isActivated
- ? R.string.quick_settings_night_display_summary_on
- : R.string.quick_settings_night_display_summary_off);
- state.minimalAccessibilityClassName = state.expandedAccessibilityClassName
- = Switch.class.getName();
+ state.minimalAccessibilityClassName = state.expandedAccessibilityClassName =
+ Switch.class.getName();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 9c1eaa6b7906..20dddab14990 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -1002,8 +1002,8 @@ public class NotificationPanelView extends PanelView implements
mKeyguardShowing = keyguardShowing;
mQsContainer.setKeyguardShowing(mKeyguardShowing);
- if (goingToFullShade || (oldState == StatusBarState.KEYGUARD
- && statusBarState == StatusBarState.SHADE_LOCKED)) {
+ if (oldState == StatusBarState.KEYGUARD
+ && (goingToFullShade || statusBarState == StatusBarState.SHADE_LOCKED)) {
animateKeyguardStatusBarOut();
long delay = mStatusBarState == StatusBarState.SHADE_LOCKED
? 0 : mStatusBar.calculateGoingToFullShadeDelay();
@@ -1017,6 +1017,7 @@ public class NotificationPanelView extends PanelView implements
mKeyguardStatusBar.setVisibility(keyguardShowing ? View.VISIBLE : View.INVISIBLE);
if (keyguardShowing && oldState != mStatusBarState) {
mKeyguardBottomArea.onKeyguardShowingChanged();
+ mQsContainer.hideImmediately();
}
}
if (keyguardShowing) {
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 221cc916bfa4..84deabebfc70 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -4475,6 +4475,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
animateCollapsePanels();
return true;
}
+ if (mKeyguardUserSwitcher.hideIfNotSimple(true)) {
+ return true;
+ }
return false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java
index 21f3f5e8da06..1cf405020298 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java
@@ -128,7 +128,7 @@ public class KeyguardUserSwitcher {
}
}
- private void hide(boolean animate) {
+ private boolean hide(boolean animate) {
if (mUserSwitcher != null && mUserSwitcherContainer.getVisibility() == View.VISIBLE) {
cancelAnimations();
if (animate) {
@@ -137,7 +137,9 @@ public class KeyguardUserSwitcher {
mUserSwitcherContainer.setVisibility(View.GONE);
}
mStatusBarView.setKeyguardUserSwitcherShowing(false, animate);
+ return true;
}
+ return false;
}
private void cancelAnimations() {
@@ -223,10 +225,11 @@ public class KeyguardUserSwitcher {
}
}
- public void hideIfNotSimple(boolean animate) {
+ public boolean hideIfNotSimple(boolean animate) {
if (mUserSwitcherContainer != null && !mUserSwitcherController.isSimpleUserSwitcher()) {
- hide(animate);
+ return hide(animate);
}
+ return false;
}
boolean isAnimating() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index 9dc9062aeb8e..9bb98306cdf0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -2038,6 +2038,7 @@ public class NotificationStackScrollLayout extends ViewGroup
if (!mIsExpanded) {
mBackgroundBounds.top = 0;
mBackgroundBounds.bottom = 0;
+ return;
}
ActivatableNotificationView firstView = mFirstVisibleBackgroundChild;
int top = 0;
diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java
index 085e003f8869..53a54d6d29e4 100644
--- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java
@@ -298,6 +298,7 @@ public class PipManager {
mListeners.get(i).onMoveToFullscreen();
}
resizePinnedStack(mState);
+ updatePipVisibility(false);
}
/**
diff --git a/preloaded-classes b/preloaded-classes
index 42f290e22b3f..5ddd08b8cddf 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -2077,9 +2077,6 @@ android.view.Gravity
android.view.HandlerActionQueue
android.view.HandlerActionQueue$HandlerAction
android.view.HardwareLayer
-android.view.IAssetAtlas
-android.view.IAssetAtlas$Stub
-android.view.IAssetAtlas$Stub$Proxy
android.view.IGraphicsStats
android.view.IGraphicsStats$Stub
android.view.IGraphicsStats$Stub$Proxy
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 815978ebb180..64d8a4c47a01 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -2572,6 +2572,9 @@ message MetricsEvent {
// ACTION: Logs action which triggered provisioning.
PROVISIONING_ACTION = 611;
+ // ACTION: Logs extra passed by the dpc while provisioning.
+ PROVISIONING_EXTRA = 612;
+
// ---- End O Constants, all O constants go above this line ----
// Add new aosp constants above this line.
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index 497eac9f2ecb..8424b3963d78 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -6057,7 +6057,11 @@ public class BackupManagerService {
// the app developer's cert, so they're different on every
// device.
if (signaturesMatch(sigs, pkgInfo)) {
- if (pkgInfo.versionCode >= version) {
+ if ((pkgInfo.applicationInfo.flags
+ & ApplicationInfo.FLAG_RESTORE_ANY_VERSION) != 0) {
+ Slog.i(TAG, "Package has restoreAnyVersion; taking data");
+ policy = RestorePolicy.ACCEPT;
+ } else if (pkgInfo.versionCode >= version) {
Slog.i(TAG, "Sig + version match; taking data");
policy = RestorePolicy.ACCEPT;
} else {
@@ -7479,7 +7483,11 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF
// the app developer's cert, so they're different on every
// device.
if (signaturesMatch(sigs, pkgInfo)) {
- if (pkgInfo.versionCode >= version) {
+ if ((pkgInfo.applicationInfo.flags
+ & ApplicationInfo.FLAG_RESTORE_ANY_VERSION) != 0) {
+ Slog.i(TAG, "Package has restoreAnyVersion; taking data");
+ policy = RestorePolicy.ACCEPT;
+ } else if (pkgInfo.versionCode >= version) {
Slog.i(TAG, "Sig + version match; taking data");
policy = RestorePolicy.ACCEPT;
} else {
diff --git a/services/core/Android.mk b/services/core/Android.mk
index 58f207499888..fedce0c964fe 100644
--- a/services/core/Android.mk
+++ b/services/core/Android.mk
@@ -17,7 +17,8 @@ LOCAL_SRC_FILES += \
LOCAL_AIDL_INCLUDES += \
system/netd/server/binder
-LOCAL_JAVA_LIBRARIES := services.net telephony-common
+LOCAL_JAVA_LIBRARIES := services.net telephony-common \
+ android.hardware.power@1.0-java
LOCAL_STATIC_JAVA_LIBRARIES := tzdata_update
LOCAL_PROTOC_OPTIMIZE_TYPE := nano
diff --git a/services/core/java/com/android/server/AssetAtlasService.java b/services/core/java/com/android/server/AssetAtlasService.java
deleted file mode 100644
index b0f60482df1d..000000000000
--- a/services/core/java/com/android/server/AssetAtlasService.java
+++ /dev/null
@@ -1,717 +0,0 @@
-/*
- * Copyright (C) 2013 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.server;
-
-import android.content.Context;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.graphics.Atlas;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.drawable.Drawable;
-import android.os.Environment;
-import android.os.RemoteException;
-import android.os.SystemProperties;
-import android.util.Log;
-import android.util.LongSparseArray;
-import android.view.GraphicBuffer;
-import android.view.IAssetAtlas;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * This service is responsible for packing preloaded bitmaps into a single
- * atlas texture. The resulting texture can be shared across processes to
- * reduce overall memory usage.
- *
- * @hide
- */
-public class AssetAtlasService extends IAssetAtlas.Stub {
- /**
- * Name of the <code>AssetAtlasService</code>.
- */
- public static final String ASSET_ATLAS_SERVICE = "assetatlas";
-
- private static final String LOG_TAG = "AssetAtlas";
-
- // Turns debug logs on/off. Debug logs are kept to a minimum and should
- // remain on to diagnose issues
- private static final boolean DEBUG_ATLAS = true;
-
- // When set to true the content of the atlas will be saved to disk
- // in /data/system/atlas.png. The shared GraphicBuffer may be empty
- private static final boolean DEBUG_ATLAS_TEXTURE = false;
-
- // Minimum size in pixels to consider for the resulting texture
- private static final int MIN_SIZE = 512;
- // Maximum size in pixels to consider for the resulting texture
- private static final int MAX_SIZE = 2048;
- // Increment in number of pixels between size variants when looking
- // for the best texture dimensions
- private static final int STEP = 64;
-
- // This percentage of the total number of pixels represents the minimum
- // number of pixels we want to be able to pack in the atlas
- private static final float PACKING_THRESHOLD = 0.8f;
-
- // Defines the number of int fields used to represent a single entry
- // in the atlas map. This number defines the size of the array returned
- // by the getMap(). See the mAtlasMap field for more information
- private static final int ATLAS_MAP_ENTRY_FIELD_COUNT = 3;
-
- // Specifies how our GraphicBuffer will be used. To get proper swizzling
- // the buffer will be written to using OpenGL (from JNI) so we can leave
- // the software flag set to "never"
- private static final int GRAPHIC_BUFFER_USAGE = GraphicBuffer.USAGE_SW_READ_NEVER |
- GraphicBuffer.USAGE_SW_WRITE_NEVER | GraphicBuffer.USAGE_HW_TEXTURE;
-
- // This boolean is set to true if an atlas was successfully
- // computed and rendered
- private final AtomicBoolean mAtlasReady = new AtomicBoolean(false);
-
- private final Context mContext;
-
- // Version name of the current build, used to identify changes to assets list
- private final String mVersionName;
-
- // Holds the atlas' data. This buffer can be mapped to
- // OpenGL using an EGLImage
- private GraphicBuffer mBuffer;
-
- // Describes how bitmaps are placed in the atlas. Each bitmap is
- // represented by several entries in the array:
- // long0: SkBitmap*, the native bitmap object
- // long1: x position
- // long2: y position
- private long[] mAtlasMap;
-
- /**
- * Creates a new service. Upon creating, the service will gather the list of
- * assets to consider for packing into the atlas and spawn a new thread to
- * start the packing work.
- *
- * @param context The context giving access to preloaded resources
- */
- public AssetAtlasService(Context context) {
- mContext = context;
- mVersionName = queryVersionName(context);
-
- Collection<Bitmap> bitmaps = new HashSet<Bitmap>(300);
- int totalPixelCount = 0;
-
- // We only care about drawables that hold bitmaps
- final Resources resources = context.getResources();
- final LongSparseArray<Drawable.ConstantState> drawables = resources.getPreloadedDrawables();
-
- final int count = drawables.size();
- for (int i = 0; i < count; i++) {
- try {
- totalPixelCount += drawables.valueAt(i).addAtlasableBitmaps(bitmaps);
- } catch (Throwable t) {
- Log.e("AssetAtlas", "Failed to fetch preloaded drawable state", t);
- throw t;
- }
- }
-
- ArrayList<Bitmap> sortedBitmaps = new ArrayList<Bitmap>(bitmaps);
- // Our algorithms perform better when the bitmaps are first sorted
- // The comparator will sort the bitmap by width first, then by height
- Collections.sort(sortedBitmaps, new Comparator<Bitmap>() {
- @Override
- public int compare(Bitmap b1, Bitmap b2) {
- if (b1.getWidth() == b2.getWidth()) {
- return b2.getHeight() - b1.getHeight();
- }
- return b2.getWidth() - b1.getWidth();
- }
- });
-
- // Kick off the packing work on a worker thread
- new Thread(new Renderer(sortedBitmaps, totalPixelCount)).start();
- }
-
- /**
- * Queries the version name stored in framework's AndroidManifest.
- * The version name can be used to identify possible changes to
- * framework resources.
- *
- * @see #getBuildIdentifier(String)
- */
- private static String queryVersionName(Context context) {
- try {
- String packageName = context.getPackageName();
- PackageInfo info = context.getPackageManager().getPackageInfo(packageName,
- PackageManager.MATCH_DEBUG_TRIAGED_MISSING);
- return info.versionName;
- } catch (PackageManager.NameNotFoundException e) {
- Log.w(LOG_TAG, "Could not get package info", e);
- }
- return null;
- }
-
- /**
- * Callback invoked by the server thread to indicate we can now run
- * 3rd party code.
- */
- public void systemRunning() {
- }
-
- /**
- * The renderer does all the work:
- */
- private class Renderer implements Runnable {
- private final ArrayList<Bitmap> mBitmaps;
- private final int mPixelCount;
-
- Renderer(ArrayList<Bitmap> bitmaps, int pixelCount) {
- mBitmaps = bitmaps;
- mPixelCount = pixelCount;
- }
-
- /**
- * 1. On first boot or after every update, brute-force through all the
- * possible atlas configurations and look for the best one (maximimize
- * number of packed assets and minimize texture size)
- * a. If a best configuration was computed, write it out to disk for
- * future use
- * 2. Read best configuration from disk
- * 3. Compute the packing using the best configuration
- * 4. Allocate a GraphicBuffer
- * 5. Render assets in the buffer
- */
- @Override
- public void run() {
- Configuration config = chooseConfiguration(mBitmaps, mPixelCount, mVersionName);
- if (DEBUG_ATLAS) Log.d(LOG_TAG, "Loaded configuration: " + config);
-
- if (config != null) {
- mBuffer = GraphicBuffer.create(config.width, config.height,
- PixelFormat.RGBA_8888, GRAPHIC_BUFFER_USAGE);
-
- if (mBuffer != null) {
- Atlas atlas = new Atlas(config.type, config.width, config.height, config.flags);
- if (renderAtlas(mBuffer, atlas, config.count)) {
- mAtlasReady.set(true);
- }
- }
- }
- }
-
- /**
- * Renders a list of bitmaps into the atlas. The position of each bitmap
- * was decided by the packing algorithm and will be honored by this
- * method.
- *
- * @param buffer The buffer to render the atlas entries into
- * @param atlas The atlas to pack the bitmaps into
- * @param packCount The number of bitmaps that will be packed in the atlas
- *
- * @return true if the atlas was rendered, false otherwise
- */
- @SuppressWarnings("MismatchedReadAndWriteOfArray")
- private boolean renderAtlas(GraphicBuffer buffer, Atlas atlas, int packCount) {
- // Use a Source blend mode to improve performance, the target bitmap
- // will be zero'd out so there's no need to waste time applying blending
- final Paint paint = new Paint();
- paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
-
- // We always render the atlas into a bitmap. This bitmap is then
- // uploaded into the GraphicBuffer using OpenGL to swizzle the content
- final Bitmap atlasBitmap = Bitmap.createBitmap(
- buffer.getWidth(), buffer.getHeight(), Bitmap.Config.ARGB_8888);
- final Canvas canvas = new Canvas(atlasBitmap);
-
- final Atlas.Entry entry = new Atlas.Entry();
-
- mAtlasMap = new long[packCount * ATLAS_MAP_ENTRY_FIELD_COUNT];
- long[] atlasMap = mAtlasMap;
- int mapIndex = 0;
-
- boolean result = false;
- final long startRender = System.nanoTime();
- final int count = mBitmaps.size();
-
- for (int i = 0; i < count; i++) {
- final Bitmap bitmap = mBitmaps.get(i);
- if (atlas.pack(bitmap.getWidth(), bitmap.getHeight(), entry) != null) {
- // We have more bitmaps to pack than the current configuration
- // says, we were most likely not able to detect a change in the
- // list of preloaded drawables, abort and delete the configuration
- if (mapIndex >= mAtlasMap.length) {
- deleteDataFile();
- break;
- }
-
- canvas.save();
- canvas.translate(entry.x, entry.y);
- canvas.drawBitmap(bitmap, 0.0f, 0.0f, null);
- canvas.restore();
- atlasMap[mapIndex++] = bitmap.refSkPixelRef();
- atlasMap[mapIndex++] = entry.x;
- atlasMap[mapIndex++] = entry.y;
- }
- }
-
- final long endRender = System.nanoTime();
- releaseCanvas(canvas, atlasBitmap);
- result = nUploadAtlas(buffer, atlasBitmap);
- atlasBitmap.recycle();
- final long endUpload = System.nanoTime();
-
- if (DEBUG_ATLAS) {
- float renderDuration = (endRender - startRender) / 1000.0f / 1000.0f;
- float uploadDuration = (endUpload - endRender) / 1000.0f / 1000.0f;
- Log.d(LOG_TAG, String.format("Rendered atlas in %.2fms (%.2f+%.2fms)",
- renderDuration + uploadDuration, renderDuration, uploadDuration));
- }
-
- return result;
- }
-
- /**
- * Releases the canvas used to render into the buffer. Calling this method
- * will release any resource previously acquired. If {@link #DEBUG_ATLAS_TEXTURE}
- * is turend on, calling this method will write the content of the atlas
- * to disk in /data/system/atlas.png for debugging.
- */
- private void releaseCanvas(Canvas canvas, Bitmap atlasBitmap) {
- canvas.setBitmap(null);
- if (DEBUG_ATLAS_TEXTURE) {
-
- File systemDirectory = new File(Environment.getDataDirectory(), "system");
- File dataFile = new File(systemDirectory, "atlas.png");
-
- try {
- FileOutputStream out = new FileOutputStream(dataFile);
- atlasBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
- out.close();
- } catch (FileNotFoundException e) {
- // Ignore
- } catch (IOException e) {
- // Ignore
- }
- }
- }
- }
-
- private static native boolean nUploadAtlas(GraphicBuffer buffer, Bitmap bitmap);
-
- @Override
- public boolean isCompatible(int ppid) {
- return ppid == android.os.Process.myPpid();
- }
-
- @Override
- public GraphicBuffer getBuffer() throws RemoteException {
- return mAtlasReady.get() ? mBuffer : null;
- }
-
- @Override
- public long[] getMap() throws RemoteException {
- return mAtlasReady.get() ? mAtlasMap : null;
- }
-
- /**
- * Finds the best atlas configuration to pack the list of supplied bitmaps.
- * This method takes advantage of multi-core systems by spawning a number
- * of threads equal to the number of available cores.
- */
- private static Configuration computeBestConfiguration(
- ArrayList<Bitmap> bitmaps, int pixelCount) {
- if (DEBUG_ATLAS) Log.d(LOG_TAG, "Computing best atlas configuration...");
-
- long begin = System.nanoTime();
- List<WorkerResult> results = Collections.synchronizedList(new ArrayList<WorkerResult>());
-
- // Don't bother with an extra thread if there's only one processor
- int cpuCount = Runtime.getRuntime().availableProcessors();
- if (cpuCount == 1) {
- new ComputeWorker(MIN_SIZE, MAX_SIZE, STEP, bitmaps, pixelCount, results, null).run();
- } else {
- int start = MIN_SIZE + (cpuCount - 1) * STEP;
- int end = MAX_SIZE;
- int step = STEP * cpuCount;
-
- final CountDownLatch signal = new CountDownLatch(cpuCount);
-
- for (int i = 0; i < cpuCount; i++, start -= STEP, end -= STEP) {
- ComputeWorker worker = new ComputeWorker(start, end, step,
- bitmaps, pixelCount, results, signal);
- new Thread(worker, "Atlas Worker #" + (i + 1)).start();
- }
-
- boolean isAllWorkerFinished;
- try {
- isAllWorkerFinished = signal.await(10, TimeUnit.SECONDS);
- } catch (InterruptedException e) {
- Log.w(LOG_TAG, "Could not complete configuration computation");
- return null;
- }
-
- if (!isAllWorkerFinished) {
- // We have to abort here, otherwise the async updates on "results" would crash the
- // sort later.
- Log.w(LOG_TAG, "Could not complete configuration computation before timeout.");
- return null;
- }
- }
-
- // Maximize the number of packed bitmaps, minimize the texture size
- Collections.sort(results, new Comparator<WorkerResult>() {
- @Override
- public int compare(WorkerResult r1, WorkerResult r2) {
- int delta = r2.count - r1.count;
- if (delta != 0) return delta;
- return r1.width * r1.height - r2.width * r2.height;
- }
- });
-
- if (DEBUG_ATLAS) {
- float delay = (System.nanoTime() - begin) / 1000.0f / 1000.0f / 1000.0f;
- Log.d(LOG_TAG, String.format("Found best atlas configuration (out of %d) in %.2fs",
- results.size(), delay));
- }
-
- WorkerResult result = results.get(0);
- return new Configuration(result.type, result.width, result.height, result.count);
- }
-
- /**
- * Returns the path to the file containing the best computed
- * atlas configuration.
- */
- private static File getDataFile() {
- File systemDirectory = new File(Environment.getDataDirectory(), "system");
- return new File(systemDirectory, "framework_atlas.config");
- }
-
- private static void deleteDataFile() {
- Log.w(LOG_TAG, "Current configuration inconsistent with assets list");
- if (!getDataFile().delete()) {
- Log.w(LOG_TAG, "Could not delete the current configuration");
- }
- }
-
- private File getFrameworkResourcesFile() {
- return new File(mContext.getApplicationInfo().sourceDir);
- }
-
- /**
- * Returns the best known atlas configuration. This method will either
- * read the configuration from disk or start a brute-force search
- * and save the result out to disk.
- */
- private Configuration chooseConfiguration(ArrayList<Bitmap> bitmaps, int pixelCount,
- String versionName) {
- Configuration config = null;
-
- final File dataFile = getDataFile();
- if (dataFile.exists()) {
- config = readConfiguration(dataFile, versionName);
- }
-
- if (config == null) {
- config = computeBestConfiguration(bitmaps, pixelCount);
- if (config != null) writeConfiguration(config, dataFile, versionName);
- }
-
- return config;
- }
-
- /**
- * Writes the specified atlas configuration to the specified file.
- */
- private void writeConfiguration(Configuration config, File file, String versionName) {
- BufferedWriter writer = null;
- try {
- writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
- writer.write(getBuildIdentifier(versionName));
- writer.newLine();
- writer.write(config.type.toString());
- writer.newLine();
- writer.write(String.valueOf(config.width));
- writer.newLine();
- writer.write(String.valueOf(config.height));
- writer.newLine();
- writer.write(String.valueOf(config.count));
- writer.newLine();
- writer.write(String.valueOf(config.flags));
- writer.newLine();
- } catch (FileNotFoundException e) {
- Log.w(LOG_TAG, "Could not write " + file, e);
- } catch (IOException e) {
- Log.w(LOG_TAG, "Could not write " + file, e);
- } finally {
- if (writer != null) {
- try {
- writer.close();
- } catch (IOException e) {
- // Ignore
- }
- }
- }
- }
-
- /**
- * Reads an atlas configuration from the specified file. This method
- * returns null if an error occurs or if the configuration is invalid.
- */
- private Configuration readConfiguration(File file, String versionName) {
- BufferedReader reader = null;
- Configuration config = null;
- try {
- reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
-
- if (checkBuildIdentifier(reader, versionName)) {
- Atlas.Type type = Atlas.Type.valueOf(reader.readLine());
- int width = readInt(reader, MIN_SIZE, MAX_SIZE);
- int height = readInt(reader, MIN_SIZE, MAX_SIZE);
- int count = readInt(reader, 0, Integer.MAX_VALUE);
- int flags = readInt(reader, Integer.MIN_VALUE, Integer.MAX_VALUE);
-
- config = new Configuration(type, width, height, count, flags);
- }
- } catch (IllegalArgumentException e) {
- Log.w(LOG_TAG, "Invalid parameter value in " + file, e);
- } catch (FileNotFoundException e) {
- Log.w(LOG_TAG, "Could not read " + file, e);
- } catch (IOException e) {
- Log.w(LOG_TAG, "Could not read " + file, e);
- } finally {
- if (reader != null) {
- try {
- reader.close();
- } catch (IOException e) {
- // Ignore
- }
- }
- }
- return config;
- }
-
- private static int readInt(BufferedReader reader, int min, int max) throws IOException {
- return Math.max(min, Math.min(max, Integer.parseInt(reader.readLine())));
- }
-
- /**
- * Compares the next line in the specified buffered reader to the current
- * build identifier. Returns whether the two values are equal.
- *
- * @see #getBuildIdentifier(String)
- */
- private boolean checkBuildIdentifier(BufferedReader reader, String versionName)
- throws IOException {
- String deviceBuildId = getBuildIdentifier(versionName);
- String buildId = reader.readLine();
- return deviceBuildId.equals(buildId);
- }
-
- /**
- * Returns an identifier for the current build that can be used to detect
- * likely changes to framework resources. The build identifier is made of
- * several distinct values:
- *
- * build fingerprint/framework version name/file size of framework resources apk
- *
- * Only the build fingerprint should be necessary on user builds but
- * the other values are useful to detect changes on eng builds during
- * development.
- *
- * This identifier does not attempt to be exact: a new identifier does not
- * necessarily mean the preloaded drawables have changed. It is important
- * however that whenever the list of preloaded drawables changes, this
- * identifier changes as well.
- *
- * @see #checkBuildIdentifier(java.io.BufferedReader, String)
- */
- private String getBuildIdentifier(String versionName) {
- return SystemProperties.get("ro.build.fingerprint", "") + '/' + versionName + '/' +
- String.valueOf(getFrameworkResourcesFile().length());
- }
-
- /**
- * Atlas configuration. Specifies the algorithm, dimensions and flags to use.
- */
- private static class Configuration {
- final Atlas.Type type;
- final int width;
- final int height;
- final int count;
- final int flags;
-
- Configuration(Atlas.Type type, int width, int height, int count) {
- this(type, width, height, count, Atlas.FLAG_DEFAULTS);
- }
-
- Configuration(Atlas.Type type, int width, int height, int count, int flags) {
- this.type = type;
- this.width = width;
- this.height = height;
- this.count = count;
- this.flags = flags;
- }
-
- @Override
- public String toString() {
- return type.toString() + " (" + width + "x" + height + ") flags=0x" +
- Integer.toHexString(flags) + " count=" + count;
- }
- }
-
- /**
- * Used during the brute-force search to gather information about each
- * variant of the packing algorithm.
- */
- private static class WorkerResult {
- Atlas.Type type;
- int width;
- int height;
- int count;
-
- WorkerResult(Atlas.Type type, int width, int height, int count) {
- this.type = type;
- this.width = width;
- this.height = height;
- this.count = count;
- }
-
- @Override
- public String toString() {
- return String.format("%s %dx%d", type.toString(), width, height);
- }
- }
-
- /**
- * A compute worker will try a finite number of variations of the packing
- * algorithms and save the results in a supplied list.
- */
- private static class ComputeWorker implements Runnable {
- private final int mStart;
- private final int mEnd;
- private final int mStep;
- private final List<Bitmap> mBitmaps;
- private final List<WorkerResult> mResults;
- private final CountDownLatch mSignal;
- private final int mThreshold;
-
- /**
- * Creates a new compute worker to brute-force through a range of
- * packing algorithms variants.
- *
- * @param start The minimum texture width to try
- * @param end The maximum texture width to try
- * @param step The number of pixels to increment the texture width by at each step
- * @param bitmaps The list of bitmaps to pack in the atlas
- * @param pixelCount The total number of pixels occupied by the list of bitmaps
- * @param results The list of results in which to save the brute-force search results
- * @param signal Latch to decrement when this worker is done, may be null
- */
- ComputeWorker(int start, int end, int step, List<Bitmap> bitmaps, int pixelCount,
- List<WorkerResult> results, CountDownLatch signal) {
- mStart = start;
- mEnd = end;
- mStep = step;
- mBitmaps = bitmaps;
- mResults = results;
- mSignal = signal;
-
- // Minimum number of pixels we want to be able to pack
- int threshold = (int) (pixelCount * PACKING_THRESHOLD);
- // Make sure we can find at least one configuration
- while (threshold > MAX_SIZE * MAX_SIZE) {
- threshold >>= 1;
- }
- mThreshold = threshold;
- }
-
- @Override
- public void run() {
- if (DEBUG_ATLAS) Log.d(LOG_TAG, "Running " + Thread.currentThread().getName());
-
- Atlas.Entry entry = new Atlas.Entry();
-
- for (int width = mEnd; width > mStart; width -= mStep) {
- for (int height = MAX_SIZE; height > MIN_SIZE; height -= STEP) {
- // If the atlas is not big enough, skip it
- if (width * height <= mThreshold) continue;
-
- boolean packSuccess = false;
-
- for (Atlas.Type type : Atlas.Type.values()) {
- final int count = packBitmaps(type, width, height, entry);
- if (count > 0) {
- mResults.add(new WorkerResult(type, width, height, count));
- if (count == mBitmaps.size()) {
- // If we were able to pack everything let's stop here
- // Changing the type further won't make things better
- packSuccess = true;
- break;
- }
- }
- }
-
- // If we were not able to pack everything let's stop here
- // Decreasing the height further won't make things better
- if (!packSuccess) {
- break;
- }
- }
- }
-
- if (mSignal != null) {
- mSignal.countDown();
- }
- }
-
- private int packBitmaps(Atlas.Type type, int width, int height, Atlas.Entry entry) {
- int total = 0;
- Atlas atlas = new Atlas(type, width, height);
-
- final int count = mBitmaps.size();
- for (int i = 0; i < count; i++) {
- final Bitmap bitmap = mBitmaps.get(i);
- if (atlas.pack(bitmap.getWidth(), bitmap.getHeight(), entry) != null) {
- total++;
- }
- }
-
- return total;
- }
- }
-}
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 7142d3fa5c2e..7d9a706a951e 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -19,26 +19,76 @@ package com.android.server.am;
import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.AppGlobals;
+import android.app.IActivityContainer;
+import android.app.IActivityController;
import android.app.IActivityManager;
+import android.app.IInstrumentationWatcher;
+import android.app.IStopUserCallback;
+import android.app.Instrumentation;
import android.app.ProfilerInfo;
+import android.app.UiAutomationConnection;
+import android.app.usage.ConfigurationStats;
+import android.app.usage.IUsageStatsManager;
+import android.app.usage.UsageStatsManager;
+import android.content.ComponentCallbacks2;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.IIntentReceiver;
import android.content.Intent;
import android.content.pm.IPackageManager;
+import android.content.pm.InstrumentationInfo;
+import android.content.pm.ParceledListSlice;
import android.content.pm.ResolveInfo;
+import android.content.pm.UserInfo;
+import android.content.res.Configuration;
+import android.graphics.Rect;
+import android.os.Binder;
+import android.os.Build;
+import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.ShellCommand;
import android.os.SystemClock;
+import android.os.SystemProperties;
import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.DebugUtils;
+import android.view.IWindowManager;
+import com.android.internal.util.HexDump;
+import com.android.internal.util.Preconditions;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
+import static android.app.ActivityManager.RESIZE_MODE_SYSTEM;
+import static android.app.ActivityManager.RESIZE_MODE_USER;
+import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
-class ActivityManagerShellCommand extends ShellCommand {
+final class ActivityManagerShellCommand extends ShellCommand {
public static final String NO_CLASS_ERROR_CODE = "Error type 3";
+ private static final String SHELL_PACKAGE_NAME = "com.android.shell";
+
+ // Is the object moving in a positive direction?
+ private static final boolean MOVING_FORWARD = true;
+ // Is the object moving in the horizontal plan?
+ private static final boolean MOVING_HORIZONTALLY = true;
+ // Is the object current point great then its target point?
+ private static final boolean GREATER_THAN_TARGET = true;
+ // Amount we reduce the stack size by when testing a task re-size.
+ private static final int STACK_BOUNDS_INSET = 10;
// IPC interface to activity manager -- don't need to do additional security checks.
final IActivityManager mInterface;
@@ -84,30 +134,92 @@ class ActivityManagerShellCommand extends ShellCommand {
return runStartActivity(pw);
case "startservice":
case "start-service":
- return 1; //runStartService(pw);
+ return runStartService(pw);
case "stopservice":
case "stop-service":
- return 1; //runStopService(pw);
+ return runStopService(pw);
+ case "broadcast":
+ return runSendBroadcast(pw);
+ case "instrument":
+ return runInstrument(pw);
+ case "trace-ipc":
+ return runTraceIpc(pw);
+ case "profile":
+ return runProfile(pw);
+ case "dumpheap":
+ return runDumpHeap(pw);
+ case "set-debug-app":
+ return runSetDebugApp(pw);
+ case "clear-debug-app":
+ return runClearDebugApp(pw);
+ case "set-watch-heap":
+ return runSetWatchHeap(pw);
+ case "clear-watch-heap":
+ return runClearWatchHeap(pw);
+ case "bug-report":
+ return runBugReport(pw);
case "force-stop":
return runForceStop(pw);
case "kill":
return runKill(pw);
case "kill-all":
return runKillAll(pw);
- case "write":
- return runWrite(pw);
+ case "monitor":
+ return runMonitor(pw);
+ case "hang":
+ return runHang(pw);
+ case "restart":
+ return runRestart(pw);
+ case "idle-maintenance":
+ return runIdleMaintenance(pw);
+ case "screen-compat":
+ return runScreenCompat(pw);
+ case "package-importance":
+ return runPackageImportance(pw);
+ case "to-uri":
+ return runToUri(pw, 0);
+ case "to-intent-uri":
+ return runToUri(pw, Intent.URI_INTENT_SCHEME);
+ case "to-app-uri":
+ return runToUri(pw, Intent.URI_ANDROID_APP_SCHEME);
+ case "switch-user":
+ return runSwitchUser(pw);
+ case "get-current-user":
+ return runGetCurrentUser(pw);
+ case "start-user":
+ return runStartUser(pw);
+ case "unlock-user":
+ return runUnlockUser(pw);
+ case "stop-user":
+ return runStopUser(pw);
+ case "is-user-stopped":
+ return runIsUserStopped(pw);
+ case "get-started-user-state":
+ return runGetStartedUserState(pw);
case "track-associations":
return runTrackAssociations(pw);
case "untrack-associations":
return runUntrackAssociations(pw);
- case "is-user-stopped":
- return runIsUserStopped(pw);
case "lenient-background-check":
return runLenientBackgroundCheck(pw);
case "get-uid-state":
return getUidState(pw);
- case "get-started-user-state":
- return getStartedUserState(pw);
+ case "get-config":
+ return runGetConfig(pw);
+ case "suppress-resize-config-changes":
+ return runSuppressResizeConfigChanges(pw);
+ case "set-inactive":
+ return runSetInactive(pw);
+ case "get-inactive":
+ return runGetInactive(pw);
+ case "send-trim-memory":
+ return runSendTrimMemory(pw);
+ case "stack":
+ return runStack(pw);
+ case "task":
+ return runTask(pw);
+ case "write":
+ return runWrite(pw);
default:
return handleDefaultCommands(cmd);
}
@@ -165,21 +277,6 @@ class ActivityManagerShellCommand extends ShellCommand {
});
}
- ParcelFileDescriptor openOutputFile(String path) {
- try {
- ParcelFileDescriptor pfd = getShellCallback().openOutputFile(path,
- "u:r:system_server:s0");
- if (pfd != null) {
- return pfd;
- }
- } catch (RuntimeException e) {
- getErrPrintWriter().println("Failure opening file: " + e.getMessage());
- }
- getErrPrintWriter().println("Error: Unable to open file: " + path);
- getErrPrintWriter().println("Consider using a file under /data/local/tmp/");
- return null;
- }
-
int runStartActivity(PrintWriter pw) throws RemoteException {
Intent intent;
try {
@@ -220,6 +317,7 @@ class ActivityManagerShellCommand extends ShellCommand {
packageName = activities.get(0).activityInfo.packageName;
}
pw.println("Stopping: " + packageName);
+ pw.flush();
mInterface.forceStopPackage(packageName, mUserId);
try {
Thread.sleep(250);
@@ -230,7 +328,7 @@ class ActivityManagerShellCommand extends ShellCommand {
ProfilerInfo profilerInfo = null;
if (mProfileFile != null) {
- ParcelFileDescriptor fd = openOutputFile(mProfileFile);
+ ParcelFileDescriptor fd = openOutputFileForSystem(mProfileFile);
if (fd == null) {
return 1;
}
@@ -238,6 +336,7 @@ class ActivityManagerShellCommand extends ShellCommand {
}
pw.println("Starting: " + intent);
+ pw.flush();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
IActivityManager.WaitResult result = null;
@@ -326,6 +425,7 @@ class ActivityManagerShellCommand extends ShellCommand {
"Error: Activity not started, unknown error code " + res);
break;
}
+ out.flush();
if (mWaitOption && launched) {
if (result == null) {
result = new IActivityManager.WaitResult();
@@ -343,6 +443,7 @@ class ActivityManagerShellCommand extends ShellCommand {
}
pw.println("WaitTime: " + (endTime-startTime));
pw.println("Complete");
+ pw.flush();
}
mRepeat--;
if (mRepeat > 0) {
@@ -352,10 +453,573 @@ class ActivityManagerShellCommand extends ShellCommand {
return 0;
}
- int runIsUserStopped(PrintWriter pw) {
- int userId = UserHandle.parseUserArg(getNextArgRequired());
- boolean stopped = mInternal.isUserStopped(userId);
- pw.println(stopped);
+ int runStartService(PrintWriter pw) throws RemoteException {
+ final PrintWriter err = getErrPrintWriter();
+ Intent intent;
+ try {
+ intent = makeIntent(UserHandle.USER_CURRENT);
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ if (mUserId == UserHandle.USER_ALL) {
+ err.println("Error: Can't start activity with user 'all'");
+ return -1;
+ }
+ pw.println("Starting service: " + intent);
+ pw.flush();
+ ComponentName cn = mInterface.startService(null, intent, intent.getType(),
+ SHELL_PACKAGE_NAME, mUserId);
+ if (cn == null) {
+ err.println("Error: Not found; no service started.");
+ return -1;
+ } else if (cn.getPackageName().equals("!")) {
+ err.println("Error: Requires permission " + cn.getClassName());
+ return -1;
+ } else if (cn.getPackageName().equals("!!")) {
+ err.println("Error: " + cn.getClassName());
+ return -1;
+ }
+ return 0;
+ }
+
+ int runStopService(PrintWriter pw) throws RemoteException {
+ final PrintWriter err = getErrPrintWriter();
+ Intent intent;
+ try {
+ intent = makeIntent(UserHandle.USER_CURRENT);
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ if (mUserId == UserHandle.USER_ALL) {
+ err.println("Error: Can't stop activity with user 'all'");
+ return -1;
+ }
+ pw.println("Stopping service: " + intent);
+ pw.flush();
+ int result = mInterface.stopService(null, intent, intent.getType(), mUserId);
+ if (result == 0) {
+ err.println("Service not stopped: was not running.");
+ return -1;
+ } else if (result == 1) {
+ err.println("Service stopped");
+ return -1;
+ } else if (result == -1) {
+ err.println("Error stopping service");
+ return -1;
+ }
+ return 0;
+ }
+
+ final static class IntentReceiver extends IIntentReceiver.Stub {
+ private final PrintWriter mPw;
+ private boolean mFinished = false;
+
+ IntentReceiver(PrintWriter pw) {
+ mPw = pw;
+ }
+
+ @Override
+ public void performReceive(Intent intent, int resultCode, String data, Bundle extras,
+ boolean ordered, boolean sticky, int sendingUser) {
+ String line = "Broadcast completed: result=" + resultCode;
+ if (data != null) line = line + ", data=\"" + data + "\"";
+ if (extras != null) line = line + ", extras: " + extras;
+ mPw.println(line);
+ mPw.flush();
+ synchronized (this) {
+ mFinished = true;
+ notifyAll();
+ }
+ }
+
+ public synchronized void waitForFinish() {
+ try {
+ while (!mFinished) wait();
+ } catch (InterruptedException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
+
+ int runSendBroadcast(PrintWriter pw) throws RemoteException {
+ Intent intent;
+ try {
+ intent = makeIntent(UserHandle.USER_CURRENT);
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ IntentReceiver receiver = new IntentReceiver(pw);
+ String[] requiredPermissions = mReceiverPermission == null ? null
+ : new String[] {mReceiverPermission};
+ pw.println("Broadcasting: " + intent);
+ pw.flush();
+ mInterface.broadcastIntent(null, intent, null, receiver, 0, null, null, requiredPermissions,
+ android.app.AppOpsManager.OP_NONE, null, true, false, mUserId);
+ receiver.waitForFinish();
+ return 0;
+ }
+
+ final static class InstrumentationWatcher extends IInstrumentationWatcher.Stub {
+ private final IActivityManager mInterface;
+ private final PrintWriter mPw;
+ private boolean mFinished = false;
+ private boolean mRawMode = false;
+
+ InstrumentationWatcher(IActivityManager iam, PrintWriter pw) {
+ mInterface = iam;
+ mPw = pw;
+ }
+
+ /**
+ * Set or reset "raw mode". In "raw mode", all bundles are dumped. In "pretty mode",
+ * if a bundle includes Instrumentation.REPORT_KEY_STREAMRESULT, just print that.
+ * @param rawMode true for raw mode, false for pretty mode.
+ */
+ public void setRawOutput(boolean rawMode) {
+ mRawMode = rawMode;
+ }
+
+ @Override
+ public void instrumentationStatus(ComponentName name, int resultCode, Bundle results) {
+ synchronized (this) {
+ // pretty printer mode?
+ String pretty = null;
+ if (!mRawMode && results != null) {
+ pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT);
+ }
+ if (pretty != null) {
+ mPw.print(pretty);
+ } else {
+ if (results != null) {
+ for (String key : results.keySet()) {
+ mPw.println(
+ "INSTRUMENTATION_STATUS: " + key + "=" + results.get(key));
+ }
+ }
+ mPw.println("INSTRUMENTATION_STATUS_CODE: " + resultCode);
+ }
+ mPw.flush();
+ notifyAll();
+ }
+ }
+
+ @Override
+ public void instrumentationFinished(ComponentName name, int resultCode,
+ Bundle results) {
+ synchronized (this) {
+ // pretty printer mode?
+ String pretty = null;
+ if (!mRawMode && results != null) {
+ pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT);
+ }
+ if (pretty != null) {
+ mPw.println(pretty);
+ } else {
+ if (results != null) {
+ for (String key : results.keySet()) {
+ mPw.println(
+ "INSTRUMENTATION_RESULT: " + key + "=" + results.get(key));
+ }
+ }
+ mPw.println("INSTRUMENTATION_CODE: " + resultCode);
+ }
+ mPw.flush();
+ mFinished = true;
+ notifyAll();
+ }
+ }
+
+ public boolean waitForFinish() {
+ synchronized (this) {
+ while (!mFinished) {
+ try {
+ if (!mInterface.asBinder().pingBinder()) {
+ return false;
+ }
+ wait(1000);
+ } catch (InterruptedException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
+ return true;
+ }
+ }
+
+ int runInstrument(PrintWriter pw) throws RemoteException {
+ final PrintWriter err = getErrPrintWriter();
+ String profileFile = null;
+ boolean wait = false;
+ boolean rawMode = false;
+ boolean no_window_animation = false;
+ int userId = UserHandle.USER_CURRENT;
+ Bundle args = new Bundle();
+ String argKey = null, argValue = null;
+ IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
+ String abi = null;
+
+ String opt;
+ while ((opt=getNextOption()) != null) {
+ if (opt.equals("-p")) {
+ profileFile = getNextArgRequired();
+ } else if (opt.equals("-w")) {
+ wait = true;
+ } else if (opt.equals("-r")) {
+ rawMode = true;
+ } else if (opt.equals("-e")) {
+ argKey = getNextArgRequired();
+ argValue = getNextArgRequired();
+ args.putString(argKey, argValue);
+ } else if (opt.equals("--no_window_animation")
+ || opt.equals("--no-window-animation")) {
+ no_window_animation = true;
+ } else if (opt.equals("--user")) {
+ userId = UserHandle.parseUserArg(getNextArgRequired());
+ } else if (opt.equals("--abi")) {
+ abi = getNextArgRequired();
+ } else {
+ err.println("Error: Unknown option: " + opt);
+ return -1;
+ }
+ }
+
+ if (userId == UserHandle.USER_ALL) {
+ err.println("Error: Can't start instrumentation with user 'all'");
+ return -1;
+ }
+
+ String cnArg = getNextArgRequired();
+
+ ComponentName cn;
+ if (cnArg.contains("/")) {
+ cn = ComponentName.unflattenFromString(cnArg);
+ if (cn == null) throw new IllegalArgumentException("Bad component name: " + cnArg);
+ } else {
+ List<InstrumentationInfo> infos = mPm.queryInstrumentation(null, 0).getList();
+
+ final int numInfos = infos == null ? 0: infos.size();
+ List<ComponentName> cns = new ArrayList<>();
+ for (int i = 0; i < numInfos; i++) {
+ InstrumentationInfo info = infos.get(i);
+
+ ComponentName c = new ComponentName(info.packageName, info.name);
+ if (cnArg.equals(info.packageName)) {
+ cns.add(c);
+ }
+ }
+
+ if (cns.size() == 0) {
+ throw new IllegalArgumentException("No instrumentation found for: " + cnArg);
+ } else if (cns.size() == 1) {
+ cn = cns.get(0);
+ } else {
+ StringBuilder cnsStr = new StringBuilder();
+ final int numCns = cns.size();
+ for (int i = 0; i < numCns; i++) {
+ cnsStr.append(cns.get(i).flattenToString());
+ cnsStr.append(", ");
+ }
+
+ // Remove last ", "
+ cnsStr.setLength(cnsStr.length() - 2);
+
+ throw new IllegalArgumentException("Found multiple instrumentations: "
+ + cnsStr.toString());
+ }
+ }
+
+ InstrumentationWatcher watcher = null;
+ UiAutomationConnection connection = null;
+ if (wait) {
+ watcher = new InstrumentationWatcher(mInterface, pw);
+ watcher.setRawOutput(rawMode);
+ // Don't yet know how to support this.
+ connection = null; //new UiAutomationConnection();
+ }
+
+ float[] oldAnims = null;
+ if (no_window_animation) {
+ oldAnims = wm.getAnimationScales();
+ wm.setAnimationScale(0, 0.0f);
+ wm.setAnimationScale(1, 0.0f);
+ }
+
+ if (abi != null) {
+ final String[] supportedAbis = Build.SUPPORTED_ABIS;
+ boolean matched = false;
+ for (String supportedAbi : supportedAbis) {
+ if (supportedAbi.equals(abi)) {
+ matched = true;
+ break;
+ }
+ }
+
+ if (!matched) {
+ throw new RuntimeException(
+ "INSTRUMENTATION_FAILED: Unsupported instruction set " + abi);
+ }
+ }
+
+ if (!mInterface.startInstrumentation(cn, profileFile, 0, args, watcher, connection, userId,
+ abi)) {
+ throw new RuntimeException("INSTRUMENTATION_FAILED: " + cn.flattenToString());
+ }
+
+ if (watcher != null) {
+ if (!watcher.waitForFinish()) {
+ pw.println("INSTRUMENTATION_ABORTED: System has crashed.");
+ }
+ }
+
+ if (oldAnims != null) {
+ wm.setAnimationScales(oldAnims);
+ }
+ return 0;
+ }
+
+ int runTraceIpc(PrintWriter pw) throws RemoteException {
+ String op = getNextArgRequired();
+ if (op.equals("start")) {
+ return runTraceIpcStart(pw);
+ } else if (op.equals("stop")) {
+ return runTraceIpcStop(pw);
+ } else {
+ getErrPrintWriter().println("Error: unknown trace ipc command '" + op + "'");
+ return -1;
+ }
+ }
+
+ int runTraceIpcStart(PrintWriter pw) throws RemoteException {
+ pw.println("Starting IPC tracing.");
+ pw.flush();
+ mInterface.startBinderTracking();
+ return 0;
+ }
+
+ int runTraceIpcStop(PrintWriter pw) throws RemoteException {
+ final PrintWriter err = getErrPrintWriter();
+ String opt;
+ String filename = null;
+ while ((opt=getNextOption()) != null) {
+ if (opt.equals("--dump-file")) {
+ filename = getNextArgRequired();
+ } else {
+ err.println("Error: Unknown option: " + opt);
+ return -1;
+ }
+ }
+ if (filename == null) {
+ err.println("Error: Specify filename to dump logs to.");
+ return -1;
+ }
+
+ File file = new File(filename);
+ file.delete();
+ ParcelFileDescriptor fd = openOutputFileForSystem(filename);
+ if (fd == null) {
+ return -1;
+ }
+
+ ;
+ if (!mInterface.stopBinderTrackingAndDump(fd)) {
+ err.println("STOP TRACE FAILED.");
+ return -1;
+ }
+
+ pw.println("Stopped IPC tracing. Dumping logs to: " + filename);
+ return 0;
+ }
+
+ static void removeWallOption() {
+ String props = SystemProperties.get("dalvik.vm.extra-opts");
+ if (props != null && props.contains("-Xprofile:wallclock")) {
+ props = props.replace("-Xprofile:wallclock", "");
+ props = props.trim();
+ SystemProperties.set("dalvik.vm.extra-opts", props);
+ }
+ }
+
+ private int runProfile(PrintWriter pw) throws RemoteException {
+ final PrintWriter err = getErrPrintWriter();
+ String profileFile = null;
+ boolean start = false;
+ boolean wall = false;
+ int userId = UserHandle.USER_CURRENT;
+ int profileType = 0;
+ mSamplingInterval = 0;
+
+ String process = null;
+
+ String cmd = getNextArgRequired();
+
+ if ("start".equals(cmd)) {
+ start = true;
+ String opt;
+ while ((opt=getNextOption()) != null) {
+ if (opt.equals("--user")) {
+ userId = UserHandle.parseUserArg(getNextArgRequired());
+ } else if (opt.equals("--wall")) {
+ wall = true;
+ } else if (opt.equals("--sampling")) {
+ mSamplingInterval = Integer.parseInt(getNextArgRequired());
+ } else {
+ err.println("Error: Unknown option: " + opt);
+ return -1;
+ }
+ }
+ process = getNextArgRequired();
+ } else if ("stop".equals(cmd)) {
+ String opt;
+ while ((opt=getNextOption()) != null) {
+ if (opt.equals("--user")) {
+ userId = UserHandle.parseUserArg(getNextArgRequired());
+ } else {
+ err.println("Error: Unknown option: " + opt);
+ return -1;
+ }
+ }
+ process = getNextArg();
+ } else {
+ // Compatibility with old syntax: process is specified first.
+ process = cmd;
+ cmd = getNextArgRequired();
+ if ("start".equals(cmd)) {
+ start = true;
+ } else if (!"stop".equals(cmd)) {
+ throw new IllegalArgumentException("Profile command " + process + " not valid");
+ }
+ }
+
+ if (userId == UserHandle.USER_ALL) {
+ err.println("Error: Can't profile with user 'all'");
+ return -1;
+ }
+
+ ParcelFileDescriptor fd = null;
+ ProfilerInfo profilerInfo = null;
+
+ if (start) {
+ profileFile = getNextArgRequired();
+ fd = openOutputFileForSystem(profileFile);
+ if (fd == null) {
+ return -1;
+ }
+ profilerInfo = new ProfilerInfo(profileFile, fd, mSamplingInterval, false);
+ }
+
+ try {
+ if (wall) {
+ // XXX doesn't work -- this needs to be set before booting.
+ String props = SystemProperties.get("dalvik.vm.extra-opts");
+ if (props == null || !props.contains("-Xprofile:wallclock")) {
+ props = props + " -Xprofile:wallclock";
+ //SystemProperties.set("dalvik.vm.extra-opts", props);
+ }
+ } else if (start) {
+ //removeWallOption();
+ }
+ if (!mInterface.profileControl(process, userId, start, profilerInfo, profileType)) {
+ wall = false;
+ err.println("PROFILE FAILED on process " + process);
+ return -1;
+ }
+ } finally {
+ if (!wall) {
+ //removeWallOption();
+ }
+ }
+ return 0;
+ }
+
+ int runDumpHeap(PrintWriter pw) throws RemoteException {
+ final PrintWriter err = getErrPrintWriter();
+ boolean managed = true;
+ int userId = UserHandle.USER_CURRENT;
+
+ String opt;
+ while ((opt=getNextOption()) != null) {
+ if (opt.equals("--user")) {
+ userId = UserHandle.parseUserArg(getNextArgRequired());
+ if (userId == UserHandle.USER_ALL) {
+ err.println("Error: Can't dump heap with user 'all'");
+ return -1;
+ }
+ } else if (opt.equals("-n")) {
+ managed = false;
+ } else {
+ err.println("Error: Unknown option: " + opt);
+ return -1;
+ }
+ }
+ String process = getNextArgRequired();
+ String heapFile = getNextArgRequired();
+
+ File file = new File(heapFile);
+ file.delete();
+ ParcelFileDescriptor fd = openOutputFileForSystem(heapFile);
+ if (fd == null) {
+ return -1;
+ }
+
+ if (!mInterface.dumpHeap(process, userId, managed, heapFile, fd)) {
+ err.println("HEAP DUMP FAILED on process " + process);
+ return -1;
+ }
+ return 0;
+ }
+
+ int runSetDebugApp(PrintWriter pw) throws RemoteException {
+ boolean wait = false;
+ boolean persistent = false;
+
+ String opt;
+ while ((opt=getNextOption()) != null) {
+ if (opt.equals("-w")) {
+ wait = true;
+ } else if (opt.equals("--persistent")) {
+ persistent = true;
+ } else {
+ getErrPrintWriter().println("Error: Unknown option: " + opt);
+ return -1;
+ }
+ }
+
+ String pkg = getNextArgRequired();
+ mInterface.setDebugApp(pkg, wait, persistent);
+ return 0;
+ }
+
+ int runClearDebugApp(PrintWriter pw) throws RemoteException {
+ mInterface.setDebugApp(null, false, true);
+ return 0;
+ }
+
+ int runSetWatchHeap(PrintWriter pw) throws RemoteException {
+ String proc = getNextArgRequired();
+ String limit = getNextArgRequired();
+ mInterface.setDumpHeapDebugLimit(proc, 0, Long.parseLong(limit), null);
+ return 0;
+ }
+
+ int runClearWatchHeap(PrintWriter pw) throws RemoteException {
+ String proc = getNextArgRequired();
+ mInterface.setDumpHeapDebugLimit(proc, 0, -1, null);
+ return 0;
+ }
+
+ int runBugReport(PrintWriter pw) throws RemoteException {
+ String opt;
+ int bugreportType = ActivityManager.BUGREPORT_OPTION_FULL;
+ while ((opt=getNextOption()) != null) {
+ if (opt.equals("--progress")) {
+ bugreportType = ActivityManager.BUGREPORT_OPTION_INTERACTIVE;
+ } else {
+ getErrPrintWriter().println("Error: Unknown option: " + opt);
+ return -1;
+ }
+ }
+ mInterface.requestBugReport(bugreportType);
+ pw.println("Your lovely bug report is being created; please be patient.");
return 0;
}
@@ -367,7 +1031,7 @@ class ActivityManagerShellCommand extends ShellCommand {
if (opt.equals("--user")) {
userId = UserHandle.parseUserArg(getNextArgRequired());
} else {
- pw.println("Error: Unknown option: " + opt);
+ getErrPrintWriter().println("Error: Unknown option: " + opt);
return -1;
}
}
@@ -383,7 +1047,7 @@ class ActivityManagerShellCommand extends ShellCommand {
if (opt.equals("--user")) {
userId = UserHandle.parseUserArg(getNextArgRequired());
} else {
- pw.println("Error: Unknown option: " + opt);
+ getErrPrintWriter().println("Error: Unknown option: " + opt);
return -1;
}
}
@@ -396,11 +1060,553 @@ class ActivityManagerShellCommand extends ShellCommand {
return 0;
}
- int runWrite(PrintWriter pw) {
- mInternal.enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
- "registerUidObserver()");
- mInternal.mRecentTasks.flush();
- pw.println("All tasks persisted.");
+ static final class MyActivityController extends IActivityController.Stub {
+ final IActivityManager mInterface;
+ final PrintWriter mPw;
+ final InputStream mInput;
+ final String mGdbPort;
+ final boolean mMonkey;
+
+ static final int STATE_NORMAL = 0;
+ static final int STATE_CRASHED = 1;
+ static final int STATE_EARLY_ANR = 2;
+ static final int STATE_ANR = 3;
+
+ int mState;
+
+ static final int RESULT_DEFAULT = 0;
+
+ static final int RESULT_CRASH_DIALOG = 0;
+ static final int RESULT_CRASH_KILL = 1;
+
+ static final int RESULT_EARLY_ANR_CONTINUE = 0;
+ static final int RESULT_EARLY_ANR_KILL = 1;
+
+ static final int RESULT_ANR_DIALOG = 0;
+ static final int RESULT_ANR_KILL = 1;
+ static final int RESULT_ANR_WAIT = 1;
+
+ int mResult;
+
+ Process mGdbProcess;
+ Thread mGdbThread;
+ boolean mGotGdbPrint;
+
+ MyActivityController(IActivityManager iam, PrintWriter pw, InputStream input,
+ String gdbPort, boolean monkey) {
+ mInterface = iam;
+ mPw = pw;
+ mInput = input;
+ mGdbPort = gdbPort;
+ mMonkey = monkey;
+ }
+
+ @Override
+ public boolean activityResuming(String pkg) {
+ synchronized (this) {
+ mPw.println("** Activity resuming: " + pkg);
+ mPw.flush();
+ }
+ return true;
+ }
+
+ @Override
+ public boolean activityStarting(Intent intent, String pkg) {
+ synchronized (this) {
+ mPw.println("** Activity starting: " + pkg);
+ mPw.flush();
+ }
+ return true;
+ }
+
+ @Override
+ public boolean appCrashed(String processName, int pid, String shortMsg, String longMsg,
+ long timeMillis, String stackTrace) {
+ synchronized (this) {
+ mPw.println("** ERROR: PROCESS CRASHED");
+ mPw.println("processName: " + processName);
+ mPw.println("processPid: " + pid);
+ mPw.println("shortMsg: " + shortMsg);
+ mPw.println("longMsg: " + longMsg);
+ mPw.println("timeMillis: " + timeMillis);
+ mPw.println("stack:");
+ mPw.print(stackTrace);
+ mPw.println("#");
+ mPw.flush();
+ int result = waitControllerLocked(pid, STATE_CRASHED);
+ return result == RESULT_CRASH_KILL ? false : true;
+ }
+ }
+
+ @Override
+ public int appEarlyNotResponding(String processName, int pid, String annotation) {
+ synchronized (this) {
+ mPw.println("** ERROR: EARLY PROCESS NOT RESPONDING");
+ mPw.println("processName: " + processName);
+ mPw.println("processPid: " + pid);
+ mPw.println("annotation: " + annotation);
+ mPw.flush();
+ int result = waitControllerLocked(pid, STATE_EARLY_ANR);
+ if (result == RESULT_EARLY_ANR_KILL) return -1;
+ return 0;
+ }
+ }
+
+ @Override
+ public int appNotResponding(String processName, int pid, String processStats) {
+ synchronized (this) {
+ mPw.println("** ERROR: PROCESS NOT RESPONDING");
+ mPw.println("processName: " + processName);
+ mPw.println("processPid: " + pid);
+ mPw.println("processStats:");
+ mPw.print(processStats);
+ mPw.println("#");
+ mPw.flush();
+ int result = waitControllerLocked(pid, STATE_ANR);
+ if (result == RESULT_ANR_KILL) return -1;
+ if (result == RESULT_ANR_WAIT) return 1;
+ return 0;
+ }
+ }
+
+ @Override
+ public int systemNotResponding(String message) {
+ synchronized (this) {
+ mPw.println("** ERROR: PROCESS NOT RESPONDING");
+ mPw.println("message: " + message);
+ mPw.println("#");
+ mPw.println("Allowing system to die.");
+ mPw.flush();
+ return -1;
+ }
+ }
+
+ void killGdbLocked() {
+ mGotGdbPrint = false;
+ if (mGdbProcess != null) {
+ mPw.println("Stopping gdbserver");
+ mPw.flush();
+ mGdbProcess.destroy();
+ mGdbProcess = null;
+ }
+ if (mGdbThread != null) {
+ mGdbThread.interrupt();
+ mGdbThread = null;
+ }
+ }
+
+ int waitControllerLocked(int pid, int state) {
+ if (mGdbPort != null) {
+ killGdbLocked();
+
+ try {
+ mPw.println("Starting gdbserver on port " + mGdbPort);
+ mPw.println("Do the following:");
+ mPw.println(" adb forward tcp:" + mGdbPort + " tcp:" + mGdbPort);
+ mPw.println(" gdbclient app_process :" + mGdbPort);
+ mPw.flush();
+
+ mGdbProcess = Runtime.getRuntime().exec(new String[] {
+ "gdbserver", ":" + mGdbPort, "--attach", Integer.toString(pid)
+ });
+ final InputStreamReader converter = new InputStreamReader(
+ mGdbProcess.getInputStream());
+ mGdbThread = new Thread() {
+ @Override
+ public void run() {
+ BufferedReader in = new BufferedReader(converter);
+ String line;
+ int count = 0;
+ while (true) {
+ synchronized (MyActivityController.this) {
+ if (mGdbThread == null) {
+ return;
+ }
+ if (count == 2) {
+ mGotGdbPrint = true;
+ MyActivityController.this.notifyAll();
+ }
+ }
+ try {
+ line = in.readLine();
+ if (line == null) {
+ return;
+ }
+ mPw.println("GDB: " + line);
+ mPw.flush();
+ count++;
+ } catch (IOException e) {
+ return;
+ }
+ }
+ }
+ };
+ mGdbThread.start();
+
+ // Stupid waiting for .5s. Doesn't matter if we end early.
+ try {
+ this.wait(500);
+ } catch (InterruptedException e) {
+ }
+
+ } catch (IOException e) {
+ mPw.println("Failure starting gdbserver: " + e);
+ mPw.flush();
+ killGdbLocked();
+ }
+ }
+ mState = state;
+ mPw.println("");
+ printMessageForState();
+ mPw.flush();
+
+ while (mState != STATE_NORMAL) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ }
+ }
+
+ killGdbLocked();
+
+ return mResult;
+ }
+
+ void resumeController(int result) {
+ synchronized (this) {
+ mState = STATE_NORMAL;
+ mResult = result;
+ notifyAll();
+ }
+ }
+
+ void printMessageForState() {
+ switch (mState) {
+ case STATE_NORMAL:
+ mPw.println("Monitoring activity manager... available commands:");
+ break;
+ case STATE_CRASHED:
+ mPw.println("Waiting after crash... available commands:");
+ mPw.println("(c)ontinue: show crash dialog");
+ mPw.println("(k)ill: immediately kill app");
+ break;
+ case STATE_EARLY_ANR:
+ mPw.println("Waiting after early ANR... available commands:");
+ mPw.println("(c)ontinue: standard ANR processing");
+ mPw.println("(k)ill: immediately kill app");
+ break;
+ case STATE_ANR:
+ mPw.println("Waiting after ANR... available commands:");
+ mPw.println("(c)ontinue: show ANR dialog");
+ mPw.println("(k)ill: immediately kill app");
+ mPw.println("(w)ait: wait some more");
+ break;
+ }
+ mPw.println("(q)uit: finish monitoring");
+ }
+
+ void run() throws RemoteException {
+ try {
+ printMessageForState();
+ mPw.flush();
+
+ mInterface.setActivityController(this, mMonkey);
+ mState = STATE_NORMAL;
+
+ InputStreamReader converter = new InputStreamReader(mInput);
+ BufferedReader in = new BufferedReader(converter);
+ String line;
+
+ while ((line = in.readLine()) != null) {
+ boolean addNewline = true;
+ if (line.length() <= 0) {
+ addNewline = false;
+ } else if ("q".equals(line) || "quit".equals(line)) {
+ resumeController(RESULT_DEFAULT);
+ break;
+ } else if (mState == STATE_CRASHED) {
+ if ("c".equals(line) || "continue".equals(line)) {
+ resumeController(RESULT_CRASH_DIALOG);
+ } else if ("k".equals(line) || "kill".equals(line)) {
+ resumeController(RESULT_CRASH_KILL);
+ } else {
+ mPw.println("Invalid command: " + line);
+ }
+ } else if (mState == STATE_ANR) {
+ if ("c".equals(line) || "continue".equals(line)) {
+ resumeController(RESULT_ANR_DIALOG);
+ } else if ("k".equals(line) || "kill".equals(line)) {
+ resumeController(RESULT_ANR_KILL);
+ } else if ("w".equals(line) || "wait".equals(line)) {
+ resumeController(RESULT_ANR_WAIT);
+ } else {
+ mPw.println("Invalid command: " + line);
+ }
+ } else if (mState == STATE_EARLY_ANR) {
+ if ("c".equals(line) || "continue".equals(line)) {
+ resumeController(RESULT_EARLY_ANR_CONTINUE);
+ } else if ("k".equals(line) || "kill".equals(line)) {
+ resumeController(RESULT_EARLY_ANR_KILL);
+ } else {
+ mPw.println("Invalid command: " + line);
+ }
+ } else {
+ mPw.println("Invalid command: " + line);
+ }
+
+ synchronized (this) {
+ if (addNewline) {
+ mPw.println("");
+ }
+ printMessageForState();
+ mPw.flush();
+ }
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace(mPw);
+ mPw.flush();
+ } finally {
+ mInterface.setActivityController(null, mMonkey);
+ }
+ }
+ }
+
+ int runMonitor(PrintWriter pw) throws RemoteException {
+ String opt;
+ String gdbPort = null;
+ boolean monkey = false;
+ while ((opt=getNextOption()) != null) {
+ if (opt.equals("--gdb")) {
+ gdbPort = getNextArgRequired();
+ } else if (opt.equals("-m")) {
+ monkey = true;
+ } else {
+ getErrPrintWriter().println("Error: Unknown option: " + opt);
+ return -1;
+ }
+ }
+
+ MyActivityController controller = new MyActivityController(mInterface, pw,
+ getRawInputStream(), gdbPort, monkey);
+ controller.run();
+ return 0;
+ }
+
+ int runHang(PrintWriter pw) throws RemoteException {
+ String opt;
+ boolean allowRestart = false;
+ while ((opt=getNextOption()) != null) {
+ if (opt.equals("--allow-restart")) {
+ allowRestart = true;
+ } else {
+ getErrPrintWriter().println("Error: Unknown option: " + opt);
+ return -1;
+ }
+ }
+
+ pw.println("Hanging the system...");
+ pw.flush();
+ mInterface.hang(new Binder(), allowRestart);
+ return 0;
+ }
+
+ int runRestart(PrintWriter pw) throws RemoteException {
+ String opt;
+ while ((opt=getNextOption()) != null) {
+ getErrPrintWriter().println("Error: Unknown option: " + opt);
+ return -1;
+ }
+
+ pw.println("Restart the system...");
+ pw.flush();
+ mInterface.restart();
+ return 0;
+ }
+
+ int runIdleMaintenance(PrintWriter pw) throws RemoteException {
+ String opt;
+ while ((opt=getNextOption()) != null) {
+ getErrPrintWriter().println("Error: Unknown option: " + opt);
+ return -1;
+ }
+
+ pw.println("Performing idle maintenance...");
+ mInterface.sendIdleJobTrigger();
+ return 0;
+ }
+
+ int runScreenCompat(PrintWriter pw) throws RemoteException {
+ String mode = getNextArgRequired();
+ boolean enabled;
+ if ("on".equals(mode)) {
+ enabled = true;
+ } else if ("off".equals(mode)) {
+ enabled = false;
+ } else {
+ getErrPrintWriter().println("Error: enabled mode must be 'on' or 'off' at " + mode);
+ return -1;
+ }
+
+ String packageName = getNextArgRequired();
+ do {
+ try {
+ mInterface.setPackageScreenCompatMode(packageName, enabled
+ ? ActivityManager.COMPAT_MODE_ENABLED
+ : ActivityManager.COMPAT_MODE_DISABLED);
+ } catch (RemoteException e) {
+ }
+ packageName = getNextArg();
+ } while (packageName != null);
+ return 0;
+ }
+
+ int runPackageImportance(PrintWriter pw) throws RemoteException {
+ String packageName = getNextArgRequired();
+ int procState = mInterface.getPackageProcessState(packageName, "com.android.shell");
+ pw.println(ActivityManager.RunningAppProcessInfo.procStateToImportance(procState));
+ return 0;
+ }
+
+ int runToUri(PrintWriter pw, int flags) throws RemoteException {
+ Intent intent;
+ try {
+ intent = makeIntent(UserHandle.USER_CURRENT);
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ pw.println(intent.toUri(flags));
+ return 0;
+ }
+
+ int runSwitchUser(PrintWriter pw) throws RemoteException {
+ String user = getNextArgRequired();
+ mInterface.switchUser(Integer.parseInt(user));
+ return 0;
+ }
+
+ int runGetCurrentUser(PrintWriter pw) throws RemoteException {
+ UserInfo currentUser = Preconditions.checkNotNull(mInterface.getCurrentUser(),
+ "Current user not set");
+ pw.println(currentUser.id);
+ return 0;
+ }
+
+ int runStartUser(PrintWriter pw) throws RemoteException {
+ String user = getNextArgRequired();
+ boolean success = mInterface.startUserInBackground(Integer.parseInt(user));
+ if (success) {
+ pw.println("Success: user started");
+ } else {
+ getErrPrintWriter().println("Error: could not start user");
+ }
+ return 0;
+ }
+
+ private static byte[] argToBytes(String arg) {
+ if (arg.equals("!")) {
+ return null;
+ } else {
+ return HexDump.hexStringToByteArray(arg);
+ }
+ }
+
+ int runUnlockUser(PrintWriter pw) throws RemoteException {
+ int userId = Integer.parseInt(getNextArgRequired());
+ byte[] token = argToBytes(getNextArgRequired());
+ byte[] secret = argToBytes(getNextArgRequired());
+ boolean success = mInterface.unlockUser(userId, token, secret, null);
+ if (success) {
+ pw.println("Success: user unlocked");
+ } else {
+ getErrPrintWriter().println("Error: could not unlock user");
+ }
+ return 0;
+ }
+
+ static final class StopUserCallback extends IStopUserCallback.Stub {
+ private boolean mFinished = false;
+
+ public synchronized void waitForFinish() {
+ try {
+ while (!mFinished) wait();
+ } catch (InterruptedException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ @Override
+ public synchronized void userStopped(int userId) {
+ mFinished = true;
+ notifyAll();
+ }
+
+ @Override
+ public synchronized void userStopAborted(int userId) {
+ mFinished = true;
+ notifyAll();
+ }
+ }
+
+ int runStopUser(PrintWriter pw) throws RemoteException {
+ boolean wait = false;
+ boolean force = false;
+ String opt;
+ while ((opt = getNextOption()) != null) {
+ if ("-w".equals(opt)) {
+ wait = true;
+ } else if ("-f".equals(opt)) {
+ force = true;
+ } else {
+ getErrPrintWriter().println("Error: unknown option: " + opt);
+ return -1;
+ }
+ }
+ int user = Integer.parseInt(getNextArgRequired());
+ StopUserCallback callback = wait ? new StopUserCallback() : null;
+
+ int res = mInterface.stopUser(user, force, callback);
+ if (res != ActivityManager.USER_OP_SUCCESS) {
+ String txt = "";
+ switch (res) {
+ case ActivityManager.USER_OP_IS_CURRENT:
+ txt = " (Can't stop current user)";
+ break;
+ case ActivityManager.USER_OP_UNKNOWN_USER:
+ txt = " (Unknown user " + user + ")";
+ break;
+ case ActivityManager.USER_OP_ERROR_IS_SYSTEM:
+ txt = " (System user cannot be stopped)";
+ break;
+ case ActivityManager.USER_OP_ERROR_RELATED_USERS_CANNOT_STOP:
+ txt = " (Can't stop user " + user
+ + " - one of its related users can't be stopped)";
+ break;
+ }
+ getErrPrintWriter().println("Switch failed: " + res + txt);
+ return -1;
+ } else if (callback != null) {
+ callback.waitForFinish();
+ }
+ return 0;
+ }
+
+ int runIsUserStopped(PrintWriter pw) {
+ int userId = UserHandle.parseUserArg(getNextArgRequired());
+ boolean stopped = mInternal.isUserStopped(userId);
+ pw.println(stopped);
+ return 0;
+ }
+
+ int runGetStartedUserState(PrintWriter pw) throws RemoteException {
+ mInternal.enforceCallingPermission(android.Manifest.permission.DUMP,
+ "runGetStartedUserState()");
+ final int userId = Integer.parseInt(getNextArgRequired());
+ try {
+ pw.println(mInternal.getStartedUserState(userId));
+ } catch (NullPointerException e) {
+ pw.println("User is not started: " + userId);
+ }
return 0;
}
@@ -460,15 +1666,799 @@ class ActivityManagerShellCommand extends ShellCommand {
return 0;
}
- int getStartedUserState(PrintWriter pw) throws RemoteException {
- mInternal.enforceCallingPermission(android.Manifest.permission.DUMP,
- "getStartedUserState()");
- final int userId = Integer.parseInt(getNextArgRequired());
+ private List<Configuration> getRecentConfigurations(int days) {
+ IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService(
+ Context.USAGE_STATS_SERVICE));
+ final long now = System.currentTimeMillis();
+ final long nDaysAgo = now - (days * 24 * 60 * 60 * 1000);
try {
- pw.println(mInternal.getStartedUserState(userId));
- } catch (NullPointerException e) {
- pw.println("User is not started: " + userId);
+ @SuppressWarnings("unchecked")
+ ParceledListSlice<ConfigurationStats> configStatsSlice = usm.queryConfigurationStats(
+ UsageStatsManager.INTERVAL_BEST, nDaysAgo, now, "com.android.shell");
+ if (configStatsSlice == null) {
+ return Collections.emptyList();
+ }
+
+ final ArrayMap<Configuration, Integer> recentConfigs = new ArrayMap<>();
+ final List<ConfigurationStats> configStatsList = configStatsSlice.getList();
+ final int configStatsListSize = configStatsList.size();
+ for (int i = 0; i < configStatsListSize; i++) {
+ final ConfigurationStats stats = configStatsList.get(i);
+ final int indexOfKey = recentConfigs.indexOfKey(stats.getConfiguration());
+ if (indexOfKey < 0) {
+ recentConfigs.put(stats.getConfiguration(), stats.getActivationCount());
+ } else {
+ recentConfigs.setValueAt(indexOfKey,
+ recentConfigs.valueAt(indexOfKey) + stats.getActivationCount());
+ }
+ }
+
+ final Comparator<Configuration> comparator = new Comparator<Configuration>() {
+ @Override
+ public int compare(Configuration a, Configuration b) {
+ return recentConfigs.get(b).compareTo(recentConfigs.get(a));
+ }
+ };
+
+ ArrayList<Configuration> configs = new ArrayList<>(recentConfigs.size());
+ configs.addAll(recentConfigs.keySet());
+ Collections.sort(configs, comparator);
+ return configs;
+
+ } catch (RemoteException e) {
+ return Collections.emptyList();
+ }
+ }
+
+ int runGetConfig(PrintWriter pw) throws RemoteException {
+ int days = 14;
+ String option = getNextOption();
+ if (option != null) {
+ if (!option.equals("--days")) {
+ throw new IllegalArgumentException("unrecognized option " + option);
+ }
+
+ days = Integer.parseInt(getNextArgRequired());
+ if (days <= 0) {
+ throw new IllegalArgumentException("--days must be a positive integer");
+ }
+ }
+
+ Configuration config = mInterface.getConfiguration();
+ if (config == null) {
+ getErrPrintWriter().println("Activity manager has no configuration");
+ return -1;
+ }
+
+ pw.println("config: " + Configuration.resourceQualifierString(config));
+ pw.println("abi: " + TextUtils.join(",", Build.SUPPORTED_ABIS));
+
+ final List<Configuration> recentConfigs = getRecentConfigurations(days);
+ final int recentConfigSize = recentConfigs.size();
+ if (recentConfigSize > 0) {
+ pw.println("recentConfigs:");
+ }
+
+ for (int i = 0; i < recentConfigSize; i++) {
+ pw.println(" config: " + Configuration.resourceQualifierString(
+ recentConfigs.get(i)));
+ }
+ return 0;
+ }
+
+ int runSuppressResizeConfigChanges(PrintWriter pw) throws RemoteException {
+ boolean suppress = Boolean.valueOf(getNextArgRequired());
+ mInterface.suppressResizeConfigChanges(suppress);
+ return 0;
+ }
+
+ int runSetInactive(PrintWriter pw) throws RemoteException {
+ int userId = UserHandle.USER_CURRENT;
+
+ String opt;
+ while ((opt=getNextOption()) != null) {
+ if (opt.equals("--user")) {
+ userId = UserHandle.parseUserArg(getNextArgRequired());
+ } else {
+ getErrPrintWriter().println("Error: Unknown option: " + opt);
+ return -1;
+ }
+ }
+ String packageName = getNextArgRequired();
+ String value = getNextArgRequired();
+
+ IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService(
+ Context.USAGE_STATS_SERVICE));
+ usm.setAppInactive(packageName, Boolean.parseBoolean(value), userId);
+ return 0;
+ }
+
+ int runGetInactive(PrintWriter pw) throws RemoteException {
+ int userId = UserHandle.USER_CURRENT;
+
+ String opt;
+ while ((opt=getNextOption()) != null) {
+ if (opt.equals("--user")) {
+ userId = UserHandle.parseUserArg(getNextArgRequired());
+ } else {
+ getErrPrintWriter().println("Error: Unknown option: " + opt);
+ return -1;
+ }
+ }
+ String packageName = getNextArgRequired();
+
+ IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService(
+ Context.USAGE_STATS_SERVICE));
+ boolean isIdle = usm.isAppInactive(packageName, userId);
+ pw.println("Idle=" + isIdle);
+ return 0;
+ }
+
+ int runSendTrimMemory(PrintWriter pw) throws RemoteException {
+ int userId = UserHandle.USER_CURRENT;
+ String opt;
+ while ((opt = getNextOption()) != null) {
+ if (opt.equals("--user")) {
+ userId = UserHandle.parseUserArg(getNextArgRequired());
+ if (userId == UserHandle.USER_ALL) {
+ getErrPrintWriter().println("Error: Can't use user 'all'");
+ return -1;
+ }
+ } else {
+ getErrPrintWriter().println("Error: Unknown option: " + opt);
+ return -1;
+ }
+ }
+
+ String proc = getNextArgRequired();
+ String levelArg = getNextArgRequired();
+ int level;
+ switch (levelArg) {
+ case "HIDDEN":
+ level = ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN;
+ break;
+ case "RUNNING_MODERATE":
+ level = ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE;
+ break;
+ case "BACKGROUND":
+ level = ComponentCallbacks2.TRIM_MEMORY_BACKGROUND;
+ break;
+ case "RUNNING_LOW":
+ level = ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW;
+ break;
+ case "MODERATE":
+ level = ComponentCallbacks2.TRIM_MEMORY_MODERATE;
+ break;
+ case "RUNNING_CRITICAL":
+ level = ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL;
+ break;
+ case "COMPLETE":
+ level = ComponentCallbacks2.TRIM_MEMORY_COMPLETE;
+ break;
+ default:
+ getErrPrintWriter().println("Error: Unknown level option: " + levelArg);
+ return -1;
+ }
+ if (!mInterface.setProcessMemoryTrimLevel(proc, userId, level)) {
+ getErrPrintWriter().println("Unknown error: failed to set trim level");
+ return -1;
+ }
+ return 0;
+ }
+
+ int runStack(PrintWriter pw) throws RemoteException {
+ String op = getNextArgRequired();
+ switch (op) {
+ case "start":
+ return runStackStart(pw);
+ case "movetask":
+ return runStackMoveTask(pw);
+ case "resize":
+ return runStackResize(pw);
+ case "resize-animated":
+ return runStackResizeAnimated(pw);
+ case "resize-docked-stack":
+ return runStackResizeDocked(pw);
+ case "positiontask":
+ return runStackPositionTask(pw);
+ case "list":
+ return runStackList(pw);
+ case "info":
+ return runStackInfo(pw);
+ case "move-top-activity-to-pinned-stack":
+ return runMoveTopActivityToPinnedStack(pw);
+ case "size-docked-stack-test":
+ return runStackSizeDockedStackTest(pw);
+ case "remove":
+ return runStackRemove(pw);
+ default:
+ getErrPrintWriter().println("Error: unknown command '" + op + "'");
+ return -1;
+ }
+ }
+
+
+ private Rect getBounds() {
+ String leftStr = getNextArgRequired();
+ int left = Integer.parseInt(leftStr);
+ String topStr = getNextArgRequired();
+ int top = Integer.parseInt(topStr);
+ String rightStr = getNextArgRequired();
+ int right = Integer.parseInt(rightStr);
+ String bottomStr = getNextArgRequired();
+ int bottom = Integer.parseInt(bottomStr);
+ if (left < 0) {
+ getErrPrintWriter().println("Error: bad left arg: " + leftStr);
+ return null;
+ }
+ if (top < 0) {
+ getErrPrintWriter().println("Error: bad top arg: " + topStr);
+ return null;
+ }
+ if (right <= 0) {
+ getErrPrintWriter().println("Error: bad right arg: " + rightStr);
+ return null;
+ }
+ if (bottom <= 0) {
+ getErrPrintWriter().println("Error: bad bottom arg: " + bottomStr);
+ return null;
+ }
+ return new Rect(left, top, right, bottom);
+ }
+
+ int runStackStart(PrintWriter pw) throws RemoteException {
+ String displayIdStr = getNextArgRequired();
+ int displayId = Integer.parseInt(displayIdStr);
+ Intent intent;
+ try {
+ intent = makeIntent(UserHandle.USER_CURRENT);
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+
+ IActivityContainer container = mInterface.createStackOnDisplay(displayId);
+ if (container != null) {
+ container.startActivity(intent);
+ }
+ return 0;
+ }
+
+ int runStackMoveTask(PrintWriter pw) throws RemoteException {
+ String taskIdStr = getNextArgRequired();
+ int taskId = Integer.parseInt(taskIdStr);
+ String stackIdStr = getNextArgRequired();
+ int stackId = Integer.parseInt(stackIdStr);
+ String toTopStr = getNextArgRequired();
+ final boolean toTop;
+ if ("true".equals(toTopStr)) {
+ toTop = true;
+ } else if ("false".equals(toTopStr)) {
+ toTop = false;
+ } else {
+ getErrPrintWriter().println("Error: bad toTop arg: " + toTopStr);
+ return -1;
+ }
+
+ mInterface.moveTaskToStack(taskId, stackId, toTop);
+ return 0;
+ }
+
+ int runStackResize(PrintWriter pw) throws RemoteException {
+ String stackIdStr = getNextArgRequired();
+ int stackId = Integer.parseInt(stackIdStr);
+ final Rect bounds = getBounds();
+ if (bounds == null) {
+ getErrPrintWriter().println("Error: invalid input bounds");
+ return -1;
+ }
+ return resizeStack(stackId, bounds, 0);
+ }
+
+ int runStackResizeAnimated(PrintWriter pw) throws RemoteException {
+ String stackIdStr = getNextArgRequired();
+ int stackId = Integer.parseInt(stackIdStr);
+ final Rect bounds;
+ if ("null".equals(peekNextArg())) {
+ bounds = null;
+ } else {
+ bounds = getBounds();
+ if (bounds == null) {
+ getErrPrintWriter().println("Error: invalid input bounds");
+ return -1;
+ }
+ }
+ return resizeStackUnchecked(stackId, bounds, 0, true);
+ }
+
+ int resizeStackUnchecked(int stackId, Rect bounds, int delayMs, boolean animate)
+ throws RemoteException {
+ try {
+ mInterface.resizeStack(stackId, bounds, false, false, animate, -1);
+ Thread.sleep(delayMs);
+ } catch (InterruptedException e) {
+ }
+ return 0;
+ }
+
+ int runStackResizeDocked(PrintWriter pw) throws RemoteException {
+ final Rect bounds = getBounds();
+ final Rect taskBounds = getBounds();
+ if (bounds == null || taskBounds == null) {
+ getErrPrintWriter().println("Error: invalid input bounds");
+ return -1;
+ }
+ mInterface.resizeDockedStack(bounds, taskBounds, null, null, null);
+ return 0;
+ }
+
+ int resizeStack(int stackId, Rect bounds, int delayMs) throws RemoteException {
+ if (bounds == null) {
+ getErrPrintWriter().println("Error: invalid input bounds");
+ return -1;
+ }
+ return resizeStackUnchecked(stackId, bounds, delayMs, false);
+ }
+
+ int runStackPositionTask(PrintWriter pw) throws RemoteException {
+ String taskIdStr = getNextArgRequired();
+ int taskId = Integer.parseInt(taskIdStr);
+ String stackIdStr = getNextArgRequired();
+ int stackId = Integer.parseInt(stackIdStr);
+ String positionStr = getNextArgRequired();
+ int position = Integer.parseInt(positionStr);
+
+ mInterface.positionTaskInStack(taskId, stackId, position);
+ return 0;
+ }
+
+ int runStackList(PrintWriter pw) throws RemoteException {
+ List<ActivityManager.StackInfo> stacks = mInterface.getAllStackInfos();
+ for (ActivityManager.StackInfo info : stacks) {
+ pw.println(info);
+ }
+ return 0;
+ }
+
+ int runStackInfo(PrintWriter pw) throws RemoteException {
+ String stackIdStr = getNextArgRequired();
+ int stackId = Integer.parseInt(stackIdStr);
+ ActivityManager.StackInfo info = mInterface.getStackInfo(stackId);
+ pw.println(info);
+ return 0;
+ }
+
+ int runStackRemove(PrintWriter pw) throws RemoteException {
+ String stackIdStr = getNextArgRequired();
+ int stackId = Integer.parseInt(stackIdStr);
+ mInterface.removeStack(stackId);
+ return 0;
+ }
+
+ int runMoveTopActivityToPinnedStack(PrintWriter pw) throws RemoteException {
+ int stackId = Integer.parseInt(getNextArgRequired());
+ final Rect bounds = getBounds();
+ if (bounds == null) {
+ getErrPrintWriter().println("Error: invalid input bounds");
+ return -1;
+ }
+
+ if (!mInterface.moveTopActivityToPinnedStack(stackId, bounds)) {
+ getErrPrintWriter().println("Didn't move top activity to pinned stack.");
+ return -1;
+ }
+ return 0;
+ }
+
+ int runStackSizeDockedStackTest(PrintWriter pw) throws RemoteException {
+ final PrintWriter err = getErrPrintWriter();
+ final int stepSize = Integer.parseInt(getNextArgRequired());
+ final String side = getNextArgRequired();
+ final String delayStr = getNextArg();
+ final int delayMs = (delayStr != null) ? Integer.parseInt(delayStr) : 0;
+
+ ActivityManager.StackInfo info = mInterface.getStackInfo(DOCKED_STACK_ID);
+ if (info == null) {
+ err.println("Docked stack doesn't exist");
+ return -1;
+ }
+ if (info.bounds == null) {
+ err.println("Docked stack doesn't have a bounds");
+ return -1;
+ }
+ Rect bounds = info.bounds;
+
+ final boolean horizontalGrowth = "l".equals(side) || "r".equals(side);
+ final int changeSize = (horizontalGrowth ? bounds.width() : bounds.height()) / 2;
+ int currentPoint;
+ switch (side) {
+ case "l":
+ currentPoint = bounds.left;
+ break;
+ case "r":
+ currentPoint = bounds.right;
+ break;
+ case "t":
+ currentPoint = bounds.top;
+ break;
+ case "b":
+ currentPoint = bounds.bottom;
+ break;
+ default:
+ err.println("Unknown growth side: " + side);
+ return -1;
+ }
+
+ final int startPoint = currentPoint;
+ final int minPoint = currentPoint - changeSize;
+ final int maxPoint = currentPoint + changeSize;
+
+ int maxChange;
+ pw.println("Shrinking docked stack side=" + side);
+ pw.flush();
+ while (currentPoint > minPoint) {
+ maxChange = Math.min(stepSize, currentPoint - minPoint);
+ currentPoint -= maxChange;
+ setBoundsSide(bounds, side, currentPoint);
+ int res = resizeStack(DOCKED_STACK_ID, bounds, delayMs);
+ if (res < 0) {
+ return res;
+ }
+ }
+
+ pw.println("Growing docked stack side=" + side);
+ pw.flush();
+ while (currentPoint < maxPoint) {
+ maxChange = Math.min(stepSize, maxPoint - currentPoint);
+ currentPoint += maxChange;
+ setBoundsSide(bounds, side, currentPoint);
+ int res = resizeStack(DOCKED_STACK_ID, bounds, delayMs);
+ if (res < 0) {
+ return res;
+ }
+ }
+
+ pw.println("Back to Original size side=" + side);
+ pw.flush();
+ while (currentPoint > startPoint) {
+ maxChange = Math.min(stepSize, currentPoint - startPoint);
+ currentPoint -= maxChange;
+ setBoundsSide(bounds, side, currentPoint);
+ int res = resizeStack(DOCKED_STACK_ID, bounds, delayMs);
+ if (res < 0) {
+ return res;
+ }
+ }
+ return 0;
+ }
+
+ void setBoundsSide(Rect bounds, String side, int value) {
+ switch (side) {
+ case "l":
+ bounds.left = value;
+ break;
+ case "r":
+ bounds.right = value;
+ break;
+ case "t":
+ bounds.top = value;
+ break;
+ case "b":
+ bounds.bottom = value;
+ break;
+ default:
+ getErrPrintWriter().println("Unknown set side: " + side);
+ break;
+ }
+ }
+
+ int runTask(PrintWriter pw) throws RemoteException {
+ String op = getNextArgRequired();
+ if (op.equals("lock")) {
+ return runTaskLock(pw);
+ } else if (op.equals("resizeable")) {
+ return runTaskResizeable(pw);
+ } else if (op.equals("resize")) {
+ return runTaskResize(pw);
+ } else if (op.equals("drag-task-test")) {
+ return runTaskDragTaskTest(pw);
+ } else if (op.equals("size-task-test")) {
+ return runTaskSizeTaskTest(pw);
+ } else {
+ getErrPrintWriter().println("Error: unknown command '" + op + "'");
+ return -1;
+ }
+ }
+
+ int runTaskLock(PrintWriter pw) throws RemoteException {
+ String taskIdStr = getNextArgRequired();
+ if (taskIdStr.equals("stop")) {
+ mInterface.stopLockTaskMode();
+ } else {
+ int taskId = Integer.parseInt(taskIdStr);
+ mInterface.startLockTaskMode(taskId);
}
+ pw.println("Activity manager is " + (mInterface.isInLockTaskMode() ? "" : "not ") +
+ "in lockTaskMode");
+ return 0;
+ }
+
+ int runTaskResizeable(PrintWriter pw) throws RemoteException {
+ final String taskIdStr = getNextArgRequired();
+ final int taskId = Integer.parseInt(taskIdStr);
+ final String resizeableStr = getNextArgRequired();
+ final int resizeableMode = Integer.parseInt(resizeableStr);
+ mInterface.setTaskResizeable(taskId, resizeableMode);
+ return 0;
+ }
+
+ int runTaskResize(PrintWriter pw) throws RemoteException {
+ final String taskIdStr = getNextArgRequired();
+ final int taskId = Integer.parseInt(taskIdStr);
+ final Rect bounds = getBounds();
+ if (bounds == null) {
+ getErrPrintWriter().println("Error: invalid input bounds");
+ return -1;
+ }
+ taskResize(taskId, bounds, 0, false);
+ return 0;
+ }
+
+ void taskResize(int taskId, Rect bounds, int delay_ms, boolean pretendUserResize)
+ throws RemoteException {
+ final int resizeMode = pretendUserResize ? RESIZE_MODE_USER : RESIZE_MODE_SYSTEM;
+ mInterface.resizeTask(taskId, bounds, resizeMode);
+ try {
+ Thread.sleep(delay_ms);
+ } catch (InterruptedException e) {
+ }
+ }
+
+ int runTaskDragTaskTest(PrintWriter pw) throws RemoteException {
+ final int taskId = Integer.parseInt(getNextArgRequired());
+ final int stepSize = Integer.parseInt(getNextArgRequired());
+ final String delayStr = getNextArg();
+ final int delay_ms = (delayStr != null) ? Integer.parseInt(delayStr) : 0;
+ final ActivityManager.StackInfo stackInfo;
+ Rect taskBounds;
+ stackInfo = mInterface.getStackInfo(mInterface.getFocusedStackId());
+ taskBounds = mInterface.getTaskBounds(taskId);
+ final Rect stackBounds = stackInfo.bounds;
+ int travelRight = stackBounds.width() - taskBounds.width();
+ int travelLeft = -travelRight;
+ int travelDown = stackBounds.height() - taskBounds.height();
+ int travelUp = -travelDown;
+ int passes = 0;
+
+ // We do 2 passes to get back to the original location of the task.
+ while (passes < 2) {
+ // Move right
+ pw.println("Moving right...");
+ pw.flush();
+ travelRight = moveTask(taskId, taskBounds, stackBounds, stepSize,
+ travelRight, MOVING_FORWARD, MOVING_HORIZONTALLY, delay_ms);
+ pw.println("Still need to travel right by " + travelRight);
+
+ // Move down
+ pw.println("Moving down...");
+ pw.flush();
+ travelDown = moveTask(taskId, taskBounds, stackBounds, stepSize,
+ travelDown, MOVING_FORWARD, !MOVING_HORIZONTALLY, delay_ms);
+ pw.println("Still need to travel down by " + travelDown);
+
+ // Move left
+ pw.println("Moving left...");
+ pw.flush();
+ travelLeft = moveTask(taskId, taskBounds, stackBounds, stepSize,
+ travelLeft, !MOVING_FORWARD, MOVING_HORIZONTALLY, delay_ms);
+ pw.println("Still need to travel left by " + travelLeft);
+
+ // Move up
+ pw.println("Moving up...");
+ pw.flush();
+ travelUp = moveTask(taskId, taskBounds, stackBounds, stepSize,
+ travelUp, !MOVING_FORWARD, !MOVING_HORIZONTALLY, delay_ms);
+ pw.println("Still need to travel up by " + travelUp);
+
+ taskBounds = mInterface.getTaskBounds(taskId);
+ passes++;
+ }
+ return 0;
+ }
+
+ int moveTask(int taskId, Rect taskRect, Rect stackRect, int stepSize,
+ int maxToTravel, boolean movingForward, boolean horizontal, int delay_ms)
+ throws RemoteException {
+ int maxMove;
+ if (movingForward) {
+ while (maxToTravel > 0
+ && ((horizontal && taskRect.right < stackRect.right)
+ ||(!horizontal && taskRect.bottom < stackRect.bottom))) {
+ if (horizontal) {
+ maxMove = Math.min(stepSize, stackRect.right - taskRect.right);
+ maxToTravel -= maxMove;
+ taskRect.right += maxMove;
+ taskRect.left += maxMove;
+ } else {
+ maxMove = Math.min(stepSize, stackRect.bottom - taskRect.bottom);
+ maxToTravel -= maxMove;
+ taskRect.top += maxMove;
+ taskRect.bottom += maxMove;
+ }
+ taskResize(taskId, taskRect, delay_ms, false);
+ }
+ } else {
+ while (maxToTravel < 0
+ && ((horizontal && taskRect.left > stackRect.left)
+ ||(!horizontal && taskRect.top > stackRect.top))) {
+ if (horizontal) {
+ maxMove = Math.min(stepSize, taskRect.left - stackRect.left);
+ maxToTravel -= maxMove;
+ taskRect.right -= maxMove;
+ taskRect.left -= maxMove;
+ } else {
+ maxMove = Math.min(stepSize, taskRect.top - stackRect.top);
+ maxToTravel -= maxMove;
+ taskRect.top -= maxMove;
+ taskRect.bottom -= maxMove;
+ }
+ taskResize(taskId, taskRect, delay_ms, false);
+ }
+ }
+ // Return the remaining distance we didn't travel because we reached the target location.
+ return maxToTravel;
+ }
+
+ int getStepSize(int current, int target, int inStepSize, boolean greaterThanTarget) {
+ int stepSize = 0;
+ if (greaterThanTarget && target < current) {
+ current -= inStepSize;
+ stepSize = inStepSize;
+ if (target > current) {
+ stepSize -= (target - current);
+ }
+ }
+ if (!greaterThanTarget && target > current) {
+ current += inStepSize;
+ stepSize = inStepSize;
+ if (target < current) {
+ stepSize += (current - target);
+ }
+ }
+ return stepSize;
+ }
+
+ int runTaskSizeTaskTest(PrintWriter pw) throws RemoteException {
+ final int taskId = Integer.parseInt(getNextArgRequired());
+ final int stepSize = Integer.parseInt(getNextArgRequired());
+ final String delayStr = getNextArg();
+ final int delay_ms = (delayStr != null) ? Integer.parseInt(delayStr) : 0;
+ final ActivityManager.StackInfo stackInfo;
+ final Rect initialTaskBounds;
+ stackInfo = mInterface.getStackInfo(mInterface.getFocusedStackId());
+ initialTaskBounds = mInterface.getTaskBounds(taskId);
+ final Rect stackBounds = stackInfo.bounds;
+ stackBounds.inset(STACK_BOUNDS_INSET, STACK_BOUNDS_INSET);
+ final Rect currentTaskBounds = new Rect(initialTaskBounds);
+
+ // Size by top-left
+ pw.println("Growing top-left");
+ pw.flush();
+ do {
+ currentTaskBounds.top -= getStepSize(
+ currentTaskBounds.top, stackBounds.top, stepSize, GREATER_THAN_TARGET);
+
+ currentTaskBounds.left -= getStepSize(
+ currentTaskBounds.left, stackBounds.left, stepSize, GREATER_THAN_TARGET);
+
+ taskResize(taskId, currentTaskBounds, delay_ms, true);
+ } while (stackBounds.top < currentTaskBounds.top
+ || stackBounds.left < currentTaskBounds.left);
+
+ // Back to original size
+ pw.println("Shrinking top-left");
+ pw.flush();
+ do {
+ currentTaskBounds.top += getStepSize(
+ currentTaskBounds.top, initialTaskBounds.top, stepSize, !GREATER_THAN_TARGET);
+
+ currentTaskBounds.left += getStepSize(
+ currentTaskBounds.left, initialTaskBounds.left, stepSize, !GREATER_THAN_TARGET);
+
+ taskResize(taskId, currentTaskBounds, delay_ms, true);
+ } while (initialTaskBounds.top > currentTaskBounds.top
+ || initialTaskBounds.left > currentTaskBounds.left);
+
+ // Size by top-right
+ pw.println("Growing top-right");
+ pw.flush();
+ do {
+ currentTaskBounds.top -= getStepSize(
+ currentTaskBounds.top, stackBounds.top, stepSize, GREATER_THAN_TARGET);
+
+ currentTaskBounds.right += getStepSize(
+ currentTaskBounds.right, stackBounds.right, stepSize, !GREATER_THAN_TARGET);
+
+ taskResize(taskId, currentTaskBounds, delay_ms, true);
+ } while (stackBounds.top < currentTaskBounds.top
+ || stackBounds.right > currentTaskBounds.right);
+
+ // Back to original size
+ pw.println("Shrinking top-right");
+ pw.flush();
+ do {
+ currentTaskBounds.top += getStepSize(
+ currentTaskBounds.top, initialTaskBounds.top, stepSize, !GREATER_THAN_TARGET);
+
+ currentTaskBounds.right -= getStepSize(currentTaskBounds.right, initialTaskBounds.right,
+ stepSize, GREATER_THAN_TARGET);
+
+ taskResize(taskId, currentTaskBounds, delay_ms, true);
+ } while (initialTaskBounds.top > currentTaskBounds.top
+ || initialTaskBounds.right < currentTaskBounds.right);
+
+ // Size by bottom-left
+ pw.println("Growing bottom-left");
+ pw.flush();
+ do {
+ currentTaskBounds.bottom += getStepSize(
+ currentTaskBounds.bottom, stackBounds.bottom, stepSize, !GREATER_THAN_TARGET);
+
+ currentTaskBounds.left -= getStepSize(
+ currentTaskBounds.left, stackBounds.left, stepSize, GREATER_THAN_TARGET);
+
+ taskResize(taskId, currentTaskBounds, delay_ms, true);
+ } while (stackBounds.bottom > currentTaskBounds.bottom
+ || stackBounds.left < currentTaskBounds.left);
+
+ // Back to original size
+ pw.println("Shrinking bottom-left");
+ pw.flush();
+ do {
+ currentTaskBounds.bottom -= getStepSize(currentTaskBounds.bottom,
+ initialTaskBounds.bottom, stepSize, GREATER_THAN_TARGET);
+
+ currentTaskBounds.left += getStepSize(
+ currentTaskBounds.left, initialTaskBounds.left, stepSize, !GREATER_THAN_TARGET);
+
+ taskResize(taskId, currentTaskBounds, delay_ms, true);
+ } while (initialTaskBounds.bottom < currentTaskBounds.bottom
+ || initialTaskBounds.left > currentTaskBounds.left);
+
+ // Size by bottom-right
+ pw.println("Growing bottom-right");
+ pw.flush();
+ do {
+ currentTaskBounds.bottom += getStepSize(
+ currentTaskBounds.bottom, stackBounds.bottom, stepSize, !GREATER_THAN_TARGET);
+
+ currentTaskBounds.right += getStepSize(
+ currentTaskBounds.right, stackBounds.right, stepSize, !GREATER_THAN_TARGET);
+
+ taskResize(taskId, currentTaskBounds, delay_ms, true);
+ } while (stackBounds.bottom > currentTaskBounds.bottom
+ || stackBounds.right > currentTaskBounds.right);
+
+ // Back to original size
+ pw.println("Shrinking bottom-right");
+ pw.flush();
+ do {
+ currentTaskBounds.bottom -= getStepSize(currentTaskBounds.bottom,
+ initialTaskBounds.bottom, stepSize, GREATER_THAN_TARGET);
+
+ currentTaskBounds.right -= getStepSize(currentTaskBounds.right, initialTaskBounds.right,
+ stepSize, GREATER_THAN_TARGET);
+
+ taskResize(taskId, currentTaskBounds, delay_ms, true);
+ } while (initialTaskBounds.bottom < currentTaskBounds.bottom
+ || initialTaskBounds.right < currentTaskBounds.right);
+ return 0;
+ }
+
+ int runWrite(PrintWriter pw) {
+ mInternal.enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
+ "registerUidObserver()");
+ mInternal.mRecentTasks.flush();
+ pw.println("All tasks persisted.");
return 0;
}
@@ -511,45 +2501,189 @@ class ActivityManagerShellCommand extends ShellCommand {
} else {
pw.println("Activity manager (activity) commands:");
pw.println(" help");
- pw.println(" Print this help text.");
+ pw.println(" Print this help text.");
pw.println(" start-activity [-D] [-N] [-W] [-P <FILE>] [--start-profiler <FILE>]");
pw.println(" [--sampling INTERVAL] [-R COUNT] [-S]");
pw.println(" [--track-allocation] [--user <USER_ID> | current] <INTENT>");
- pw.println(" Start an Activity. Options are:");
- pw.println(" -D: enable debugging");
- pw.println(" -N: enable native debugging");
- pw.println(" -W: wait for launch to complete");
- pw.println(" --start-profiler <FILE>: start profiler and send results to <FILE>");
- pw.println(" --sampling INTERVAL: use sample profiling with INTERVAL microseconds");
- pw.println(" between samples (use with --start-profiler)");
- pw.println(" -P <FILE>: like above, but profiling stops when app goes idle");
- pw.println(" -R: repeat the activity launch <COUNT> times. Prior to each repeat,");
- pw.println(" the top activity will be finished.");
- pw.println(" -S: force stop the target app before starting the activity");
- pw.println(" --track-allocation: enable tracking of object allocations");
- pw.println(" --user <USER_ID> | current: Specify which user to run as; if not");
- pw.println(" specified then run as the current user.");
- pw.println(" --stack <STACK_ID>: Specify into which stack should the activity be put.");
+ pw.println(" Start an Activity. Options are:");
+ pw.println(" -D: enable debugging");
+ pw.println(" -N: enable native debugging");
+ pw.println(" -W: wait for launch to complete");
+ pw.println(" --start-profiler <FILE>: start profiler and send results to <FILE>");
+ pw.println(" --sampling INTERVAL: use sample profiling with INTERVAL microseconds");
+ pw.println(" between samples (use with --start-profiler)");
+ pw.println(" -P <FILE>: like above, but profiling stops when app goes idle");
+ pw.println(" -R: repeat the activity launch <COUNT> times. Prior to each repeat,");
+ pw.println(" the top activity will be finished.");
+ pw.println(" -S: force stop the target app before starting the activity");
+ pw.println(" --track-allocation: enable tracking of object allocations");
+ pw.println(" --user <USER_ID> | current: Specify which user to run as; if not");
+ pw.println(" specified then run as the current user.");
+ pw.println(" --stack <STACK_ID>: Specify into which stack should the activity be put.");
+ pw.println(" start-service [--user <USER_ID> | current] <INTENT>");
+ pw.println(" Start a Service. Options are:");
+ pw.println(" --user <USER_ID> | current: Specify which user to run as; if not");
+ pw.println(" specified then run as the current user.");
+ pw.println(" stop-service [--user <USER_ID> | current] <INTENT>");
+ pw.println(" Stop a Service. Options are:");
+ pw.println(" --user <USER_ID> | current: Specify which user to run as; if not");
+ pw.println(" specified then run as the current user.");
+ pw.println(" broadcast [--user <USER_ID> | all | current] <INTENT>");
+ pw.println(" Send a broadcast Intent. Options are:");
+ pw.println(" --user <USER_ID> | all | current: Specify which user to send to; if not");
+ pw.println(" specified then send to all users.");
+ pw.println(" --receiver-permission <PERMISSION>: Require receiver to hold permission.");
+ pw.println(" trace-ipc [start|stop] [--dump-file <FILE>]");
+ pw.println(" Trace IPC transactions.");
+ pw.println(" start: start tracing IPC transactions.");
+ pw.println(" stop: stop tracing IPC transactions and dump the results to file.");
+ pw.println(" --dump-file <FILE>: Specify the file the trace should be dumped to.");
+ pw.println(" profile [start|stop] [--user <USER_ID> current] [--sampling INTERVAL]");
+ pw.println(" <PROCESS> <FILE>");
+ pw.println(" Start and stop profiler on a process. The given <PROCESS> argument");
+ pw.println(" may be either a process name or pid. Options are:");
+ pw.println(" --user <USER_ID> | current: When supplying a process name,");
+ pw.println(" specify user of process to profile; uses current user if not specified.");
+ pw.println(" dumpheap [--user <USER_ID> current] [-n] <PROCESS> <FILE>");
+ pw.println(" Dump the heap of a process. The given <PROCESS> argument may");
+ pw.println(" be either a process name or pid. Options are:");
+ pw.println(" -n: dump native heap instead of managed heap");
+ pw.println(" --user <USER_ID> | current: When supplying a process name,");
+ pw.println(" specify user of process to dump; uses current user if not specified.");
+ pw.println(" set-debug-app [-w] [--persistent] <PACKAGE>");
+ pw.println(" Set application <PACKAGE> to debug. Options are:");
+ pw.println(" -w: wait for debugger when application starts");
+ pw.println(" --persistent: retain this value");
+ pw.println(" clear-debug-app");
+ pw.println(" Clear the previously set-debug-app.");
+ pw.println(" set-watch-heap <PROCESS> <MEM-LIMIT>");
+ pw.println(" Start monitoring pss size of <PROCESS>, if it is at or");
+ pw.println(" above <HEAP-LIMIT> then a heap dump is collected for the user to report.");
+ pw.println(" clear-watch-heap");
+ pw.println(" Clear the previously set-watch-heap.");
+ pw.println(" bug-report [--progress]");
+ pw.println(" Request bug report generation; will launch a notification");
+ pw.println(" when done to select where it should be delivered. Options are:");
+ pw.println(" --progress: will launch a notification right away to show its progress.");
pw.println(" force-stop [--user <USER_ID> | all | current] <PACKAGE>");
- pw.println(" Completely stop the given application package.");
+ pw.println(" Completely stop the given application package.");
pw.println(" kill [--user <USER_ID> | all | current] <PACKAGE>");
- pw.println(" Kill all processes associated with the given application.");
+ pw.println(" Kill all processes associated with the given application.");
pw.println(" kill-all");
- pw.println(" Kill all processes that are safe to kill (cached, etc).");
- pw.println(" write");
- pw.println(" Write all pending state to storage.");
+ pw.println(" Kill all processes that are safe to kill (cached, etc).");
+ pw.println(" monitor [--gdb <port>]");
+ pw.println(" Start monitoring for crashes or ANRs.");
+ pw.println(" --gdb: start gdbserv on the given port at crash/ANR");
+ pw.println(" hang [--allow-restart]");
+ pw.println(" Hang the system.");
+ pw.println(" --allow-restart: allow watchdog to perform normal system restart");
+ pw.println(" restart");
+ pw.println(" Restart the user-space system.");
+ pw.println(" idle-maintenance");
+ pw.println(" Perform idle maintenance now.");
+ pw.println(" screen-compat [on|off] <PACKAGE>");
+ pw.println(" Control screen compatibility mode of <PACKAGE>.");
+ pw.println(" package-importance <PACKAGE>");
+ pw.println(" Print current importance of <PACKAGE>.");
+ pw.println(" to-uri [INTENT]");
+ pw.println(" Print the given Intent specification as a URI.");
+ pw.println(" to-intent-uri [INTENT]");
+ pw.println(" Print the given Intent specification as an intent: URI.");
+ pw.println(" to-app-uri [INTENT]");
+ pw.println(" Print the given Intent specification as an android-app: URI.");
+ pw.println(" switch-user <USER_ID>");
+ pw.println(" Switch to put USER_ID in the foreground, starting");
+ pw.println(" execution of that user if it is currently stopped.");
+ pw.println(" get-current-user");
+ pw.println(" Returns id of the current foreground user.");
+ pw.println(" start-user <USER_ID>");
+ pw.println(" Start USER_ID in background if it is currently stopped;");
+ pw.println(" use switch-user if you want to start the user in foreground");
+ pw.println(" unlock-user <USER_ID> [TOKEN_HEX]");
+ pw.println(" Attempt to unlock the given user using the given authorization token.");
+ pw.println(" stop-user [-w] [-f] <USER_ID>");
+ pw.println(" Stop execution of USER_ID, not allowing it to run any");
+ pw.println(" code until a later explicit start or switch to it.");
+ pw.println(" -w: wait for stop-user to complete.");
+ pw.println(" -f: force stop even if there are related users that cannot be stopped.");
+ pw.println(" is-user-stopped <USER_ID>");
+ pw.println(" Returns whether <USER_ID> has been stopped or not.");
+ pw.println(" get-started-user-state <USER_ID>");
+ pw.println(" Gets the current state of the given started user.");
pw.println(" track-associations");
- pw.println(" Enable association tracking.");
+ pw.println(" Enable association tracking.");
pw.println(" untrack-associations");
- pw.println(" Disable and clear association tracking.");
- pw.println(" is-user-stopped <USER_ID>");
- pw.println(" Returns whether <USER_ID> has been stopped or not.");
+ pw.println(" Disable and clear association tracking.");
pw.println(" lenient-background-check [<true|false>]");
- pw.println(" Optionally controls lenient background check mode, returns current mode.");
+ pw.println(" Optionally controls lenient background check mode, returns current mode.");
pw.println(" get-uid-state <UID>");
- pw.println(" Gets the process state of an app given its <UID>.");
- pw.println(" get-started-user-state <USER_ID>");
- pw.println(" Gets the current state of the given started user.");
+ pw.println(" Gets the process state of an app given its <UID>.");
+ pw.println(" get-config");
+ pw.println(" Rtrieve the configuration and any recent configurations of the device.");
+ pw.println(" suppress-resize-config-changes <true|false>");
+ pw.println(" Suppresses configuration changes due to user resizing an activity/task.");
+ pw.println(" set-inactive [--user <USER_ID>] <PACKAGE> true|false");
+ pw.println(" Sets the inactive state of an app.");
+ pw.println(" get-inactive [--user <USER_ID>] <PACKAGE>");
+ pw.println(" Returns the inactive state of an app.");
+ pw.println(" send-trim-memory [--user <USER_ID>] <PROCESS>");
+ pw.println(" [HIDDEN|RUNNING_MODERATE|BACKGROUND|RUNNING_LOW|MODERATE|RUNNING_CRITICAL|COMPLETE]");
+ pw.println(" Send a memory trim event to a <PROCESS>.");
+ pw.println(" stack [COMMAND] [...]: sub-commands for operating on activity stacks.");
+ pw.println(" start <DISPLAY_ID> <INTENT>");
+ pw.println(" Start a new activity on <DISPLAY_ID> using <INTENT>");
+ pw.println(" movetask <TASK_ID> <STACK_ID> [true|false]");
+ pw.println(" Move <TASK_ID> from its current stack to the top (true) or");
+ pw.println(" bottom (false) of <STACK_ID>.");
+ pw.println(" resize <STACK_ID> <LEFT,TOP,RIGHT,BOTTOM>");
+ pw.println(" Change <STACK_ID> size and position to <LEFT,TOP,RIGHT,BOTTOM>.");
+ pw.println(" resize-animated <STACK_ID> <LEFT,TOP,RIGHT,BOTTOM>");
+ pw.println(" Same as resize, but allow animation.");
+ pw.println(" resize-docked-stack <LEFT,TOP,RIGHT,BOTTOM> [<TASK_LEFT,TASK_TOP,TASK_RIGHT,TASK_BOTTOM>]");
+ pw.println(" Change docked stack to <LEFT,TOP,RIGHT,BOTTOM>");
+ pw.println(" and supplying temporary different task bounds indicated by");
+ pw.println(" <TASK_LEFT,TOP,RIGHT,BOTTOM>");
+ pw.println(" size-docked-stack-test: <STEP_SIZE> <l|t|r|b> [DELAY_MS]");
+ pw.println(" Test command for sizing docked stack by");
+ pw.println(" <STEP_SIZE> increments from the side <l>eft, <t>op, <r>ight, or <b>ottom");
+ pw.println(" applying the optional [DELAY_MS] between each step.");
+ pw.println(" move-top-activity-to-pinned-stack: <STACK_ID> <LEFT,TOP,RIGHT,BOTTOM>");
+ pw.println(" Moves the top activity from");
+ pw.println(" <STACK_ID> to the pinned stack using <LEFT,TOP,RIGHT,BOTTOM> for the");
+ pw.println(" bounds of the pinned stack.");
+ pw.println(" positiontask <TASK_ID> <STACK_ID> <POSITION>");
+ pw.println(" Place <TASK_ID> in <STACK_ID> at <POSITION>");
+ pw.println(" list");
+ pw.println(" List all of the activity stacks and their sizes.");
+ pw.println(" info <STACK_ID>");
+ pw.println(" Display the information about activity stack <STACK_ID>.");
+ pw.println(" remove <STACK_ID>");
+ pw.println(" Remove stack <STACK_ID>.");
+ pw.println(" task [COMMAND] [...]: sub-commands for operating on activity tasks.");
+ pw.println(" lock <TASK_ID>");
+ pw.println(" Bring <TASK_ID> to the front and don't allow other tasks to run.");
+ pw.println(" lock stop");
+ pw.println(" End the current task lock.");
+ pw.println(" resizeable <TASK_ID> [0|1|2|3]");
+ pw.println(" Change resizeable mode of <TASK_ID> to one of the following:");
+ pw.println(" 0: unresizeable");
+ pw.println(" 1: crop_windows");
+ pw.println(" 2: resizeable");
+ pw.println(" 3: resizeable_and_pipable");
+ pw.println(" resize <TASK_ID> <LEFT,TOP,RIGHT,BOTTOM>");
+ pw.println(" Makes sure <TASK_ID> is in a stack with the specified bounds.");
+ pw.println(" Forces the task to be resizeable and creates a stack if no existing stack");
+ pw.println(" has the specified bounds.");
+ pw.println(" drag-task-test <TASK_ID> <STEP_SIZE> [DELAY_MS]");
+ pw.println(" Test command for dragging/moving <TASK_ID> by");
+ pw.println(" <STEP_SIZE> increments around the screen applying the optional [DELAY_MS]");
+ pw.println(" between each step.");
+ pw.println(" size-task-test <TASK_ID> <STEP_SIZE> [DELAY_MS]");
+ pw.println(" Test command for sizing <TASK_ID> by <STEP_SIZE>");
+ pw.println(" increments within the screen applying the optional [DELAY_MS] between");
+ pw.println(" each step.");
+ pw.println(" write");
+ pw.println(" Write all pending state to storage.");
pw.println();
Intent.printIntentArgsHelp(pw, "");
}
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 8252775814b4..5c32f5086916 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -98,6 +98,7 @@ import android.content.pm.ResolveInfo;
import android.content.pm.UserInfo;
import android.content.res.Configuration;
import android.graphics.Rect;
+import android.hardware.power.V1_0.PowerHint;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
@@ -1003,7 +1004,7 @@ class ActivityStarter {
curTop.task != null && mStartActivity != null &&
curTop.task != mStartActivity.task )) &&
mService.mLocalPowerManager != null) {
- mService.mLocalPowerManager.powerHint(PowerManagerInternal.POWER_HINT_LAUNCH, 1);
+ mService.mLocalPowerManager.powerHint(PowerHint.LAUNCH, 1);
mPowerHintSent = true;
}
}
@@ -1011,7 +1012,7 @@ class ActivityStarter {
void sendPowerHintForLaunchEndIfNeeded() {
// Trigger launch power hint if activity is launched
if (mPowerHintSent && mService.mLocalPowerManager != null) {
- mService.mLocalPowerManager.powerHint(PowerManagerInternal.POWER_HINT_LAUNCH, 0);
+ mService.mLocalPowerManager.powerHint(PowerHint.LAUNCH, 0);
mPowerHintSent = false;
}
}
diff --git a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java
index e7198d3e7ee3..719cde271e84 100644
--- a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java
+++ b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java
@@ -134,7 +134,9 @@ public class NetdEventListenerService extends INetdEventListener.Stub {
@Override
// Called concurrently by multiple binder threads.
- public synchronized void onDnsEvent(int netId, int eventType, int returnCode, int latencyMs) {
+ // This method must not block or perform long-running operations.
+ public synchronized void onDnsEvent(int netId, int eventType, int returnCode, int latencyMs,
+ String hostname, String[] ipAddresses, int ipAddressesCount, int uid) {
maybeVerboseLog(String.format("onDnsEvent(%d, %d, %d, %d)",
netId, eventType, returnCode, latencyMs));
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 2d6bef4fb735..72feab7cd5c9 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -795,7 +795,17 @@ public class SyncManager {
* Use {@link AuthorityInfo#UNDEFINED} to sync all authorities.
*/
public void scheduleSync(Account requestedAccount, int userId, int reason,
- String requestedAuthority, Bundle extras, int targetSyncState) {
+ String requestedAuthority, Bundle extras, int targetSyncState) {
+ scheduleSync(requestedAccount, userId, reason, requestedAuthority, extras, targetSyncState,
+ 0 /* min delay */);
+ }
+
+ /**
+ * @param minDelayMillis The sync can't land before this delay expires.
+ */
+ private void scheduleSync(Account requestedAccount, int userId, int reason,
+ String requestedAuthority, Bundle extras, int targetSyncState,
+ final long minDelayMillis) {
final boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
if (extras == null) {
extras = new Bundle();
@@ -906,7 +916,7 @@ public class SyncManager {
if (result != null
&& result.getBoolean(AccountManager.KEY_BOOLEAN_RESULT)) {
scheduleSync(account.account, userId, reason, authority,
- finalExtras, targetSyncState);
+ finalExtras, targetSyncState, minDelayMillis);
}
}
));
@@ -967,7 +977,8 @@ public class SyncManager {
postScheduleSyncMessage(
new SyncOperation(account.account, account.userId,
owningUid, owningPackage, reason, source,
- authority, newExtras, allowParallelSyncs)
+ authority, newExtras, allowParallelSyncs),
+ minDelayMillis
);
} else if (targetSyncState == AuthorityInfo.UNDEFINED
|| targetSyncState == isSyncable) {
@@ -982,7 +993,8 @@ public class SyncManager {
postScheduleSyncMessage(
new SyncOperation(account.account, account.userId,
owningUid, owningPackage, reason, source,
- authority, extras, allowParallelSyncs)
+ authority, extras, allowParallelSyncs),
+ minDelayMillis
);
}
}
@@ -1088,14 +1100,14 @@ public class SyncManager {
}
/**
- * Schedule sync based on local changes to a provider. Occurs within interval
- * [LOCAL_SYNC_DELAY, 2*LOCAL_SYNC_DELAY].
+ * Schedule sync based on local changes to a provider. We wait for at least LOCAL_SYNC_DELAY
+ * ms to batch syncs.
*/
public void scheduleLocalSync(Account account, int userId, int reason, String authority) {
final Bundle extras = new Bundle();
extras.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true);
scheduleSync(account, userId, reason, authority, extras,
- AuthorityInfo.UNDEFINED);
+ AuthorityInfo.UNDEFINED, LOCAL_SYNC_DELAY);
}
public SyncAdapterType[] getSyncAdapterTypes(int userId) {
@@ -1152,9 +1164,10 @@ public class SyncManager {
mSyncHandler.sendMessageDelayed(monitorMessage, SYNC_MONITOR_WINDOW_LENGTH_MILLIS);
}
- private void postScheduleSyncMessage(SyncOperation syncOperation) {
- mSyncHandler.obtainMessage(mSyncHandler.MESSAGE_SCHEDULE_SYNC, syncOperation)
- .sendToTarget();
+ private void postScheduleSyncMessage(SyncOperation syncOperation, long minDelayMillis) {
+ ScheduleSyncMessagePayload payload =
+ new ScheduleSyncMessagePayload(syncOperation, minDelayMillis);
+ mSyncHandler.obtainMessage(mSyncHandler.MESSAGE_SCHEDULE_SYNC, payload).sendToTarget();
}
/**
@@ -1194,6 +1207,16 @@ public class SyncManager {
}
}
+ private static class ScheduleSyncMessagePayload {
+ final SyncOperation syncOperation;
+ final long minDelayMillis;
+
+ ScheduleSyncMessagePayload(SyncOperation syncOperation, long minDelayMillis) {
+ this.syncOperation = syncOperation;
+ this.minDelayMillis = minDelayMillis;
+ }
+ }
+
private void clearBackoffSetting(EndPoint target) {
Pair<Long, Long> backoff = mSyncStorageEngine.getBackoff(target);
if (backoff != null && backoff.first == SyncStorageEngine.NOT_IN_BACKOFF_MODE &&
@@ -1262,7 +1285,7 @@ public class SyncManager {
if (!op.isPeriodic && op.target.matchesSpec(target)) {
count++;
getJobScheduler().cancel(op.jobId);
- postScheduleSyncMessage(op);
+ postScheduleSyncMessage(op, 0 /* min delay */);
}
}
if (Log.isLoggable(TAG, Log.VERBOSE)) {
@@ -2417,8 +2440,10 @@ public class SyncManager {
mDataConnectionIsConnected = readDataConnectionState();
switch (msg.what) {
case MESSAGE_SCHEDULE_SYNC:
- SyncOperation op = (SyncOperation) msg.obj;
- scheduleSyncOperationH(op);
+ ScheduleSyncMessagePayload syncPayload =
+ (ScheduleSyncMessagePayload) msg.obj;
+ SyncOperation op = syncPayload.syncOperation;
+ scheduleSyncOperationH(op, syncPayload.minDelayMillis);
break;
case MESSAGE_START_SYNC:
@@ -3101,7 +3126,8 @@ public class SyncManager {
maybeRescheduleSync(syncResult, syncOperation);
} else {
// create a normal sync instance that will respect adapter backoffs
- postScheduleSyncMessage(syncOperation.createOneTimeSyncOperation());
+ postScheduleSyncMessage(syncOperation.createOneTimeSyncOperation(),
+ 0 /* min delay */);
}
historyMessage = ContentResolver.syncErrorToString(
syncResultToErrorNumber(syncResult));
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 0c7c8aa8a9b5..4d72d8e75df7 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -3641,7 +3641,7 @@ public class NotificationManagerService extends SystemService {
if (pkg != null && !r.sbn.getPackageName().equals(pkg)) {
continue;
}
- if (channelId == null || !channelId.equals(r.getChannel().getId())) {
+ if (channelId != null && !channelId.equals(r.getChannel().getId())) {
continue;
}
if (canceledNotifications == null) {
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 0b8a34799166..2ece99fde9ea 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -439,7 +439,13 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
if (!FileUtils.isValidExtFilename(name)) {
throw new IllegalArgumentException("Invalid name: " + name);
}
- final File target = new File(resolveStageDir(), name);
+ final File target;
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ target = new File(resolveStageDir(), name);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
// TODO: this should delegate to DCS so the system process avoids
// holding open FDs into containers.
@@ -1084,7 +1090,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
if (stageDir != null) {
prepareStageDir(stageDir);
} else if (stageCid != null) {
- prepareExternalStageCid(stageCid, params.sizeBytes);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ prepareExternalStageCid(stageCid, params.sizeBytes);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
// TODO: deliver more granular progress for ASEC allocation
mInternalProgress = 0.25f;
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index c9ef0d7d2524..c1dd24a87eeb 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -8430,7 +8430,7 @@ public class PackageManagerService extends IPackageManager.Stub {
}
} else {
// Modify state for the given package setting
- commitPackageSettings(pkg, pkgSetting, user, policyFlags,
+ commitPackageSettings(pkg, pkgSetting, user, scanFlags,
(policyFlags & PackageParser.PARSE_CHATTY) != 0 /*chatty*/);
}
return pkg;
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 1d3471a2d340..a24217e35087 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -30,6 +30,10 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
+import android.content.pm.PackageParser;
+import android.content.pm.PackageParser.ApkLite;
+import android.content.pm.PackageParser.PackageLite;
+import android.content.pm.PackageParser.PackageParserException;
import android.content.pm.ParceledListSlice;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
@@ -48,6 +52,7 @@ import android.os.SystemProperties;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.PrintWriterPrinter;
+import com.android.internal.content.PackageHelper;
import com.android.internal.util.SizedInputStream;
import dalvik.system.DexFile;
@@ -137,11 +142,26 @@ class PackageManagerShellCommand extends ShellCommand {
private int runInstall() throws RemoteException {
final PrintWriter pw = getOutPrintWriter();
final InstallParams params = makeInstallParams();
+ final String inPath = getNextArg();
+ if (params.sessionParams.sizeBytes < 0 && inPath != null) {
+ File file = new File(inPath);
+ if (file.isFile()) {
+ try {
+ ApkLite baseApk = PackageParser.parseApkLite(file, 0);
+ PackageLite pkgLite = new PackageLite(null, baseApk, null, null, null);
+ params.sessionParams.setSize(
+ PackageHelper.calculateInstalledSize(pkgLite,false, params.sessionParams.abiOverride));
+ } catch (PackageParserException | IOException e) {
+ pw.println("Error: Failed to parse APK file : " + e);
+ return 1;
+ }
+ }
+ }
+
final int sessionId = doCreateSession(params.sessionParams,
params.installerPackageName, params.userId);
boolean abandonSession = true;
try {
- final String inPath = getNextArg();
if (inPath == null && params.sessionParams.sizeBytes == 0) {
pw.println("Error: must either specify a package size or an APK file");
return 1;
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 9146bec2af49..c0de214c5833 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -97,6 +97,7 @@ import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.am.UserState;
import com.android.server.storage.DeviceStorageMonitorInternal;
+
import libcore.io.IoUtils;
import libcore.util.Objects;
@@ -2189,6 +2190,13 @@ public class UserManagerService extends IUserManager.Stub {
}
@Override
+ public UserInfo createProfileForUserEvenWhenDisallowed(String name, int flags, int userId,
+ String[] disallowedPackages) {
+ checkManageOrCreateUsersPermission(flags);
+ return createUserInternalUnchecked(name, flags, userId, disallowedPackages);
+ }
+
+ @Override
public UserInfo createUser(String name, int flags) {
checkManageOrCreateUsersPermission(flags);
return createUserInternal(name, flags, UserHandle.USER_NULL);
@@ -2204,17 +2212,17 @@ public class UserManagerService extends IUserManager.Stub {
Log.w(LOG_TAG, "Cannot add user. DISALLOW_ADD_USER is enabled.");
return null;
}
+ return createUserInternalUnchecked(name, flags, parentId, disallowedPackages);
+ }
+
+ private UserInfo createUserInternalUnchecked(String name, int flags, int parentId,
+ String[] disallowedPackages) {
DeviceStorageMonitorInternal dsm = LocalServices
.getService(DeviceStorageMonitorInternal.class);
if (dsm.isMemoryLow()) {
Log.w(LOG_TAG, "Cannot add user. Not enough space on disk.");
return null;
}
- return createUserInternalUnchecked(name, flags, parentId, disallowedPackages);
- }
-
- private UserInfo createUserInternalUnchecked(String name, int flags, int parentId,
- String[] disallowedPackages) {
if (ActivityManager.isLowRamDeviceStatic()) {
return null;
}
diff --git a/services/core/java/com/android/server/policy/BurnInProtectionHelper.java b/services/core/java/com/android/server/policy/BurnInProtectionHelper.java
index e6ec6a67fe3a..92729dc08b63 100644
--- a/services/core/java/com/android/server/policy/BurnInProtectionHelper.java
+++ b/services/core/java/com/android/server/policy/BurnInProtectionHelper.java
@@ -43,7 +43,10 @@ public class BurnInProtectionHelper implements DisplayManager.DisplayListener,
// Default value when max burnin radius is not set.
public static final int BURN_IN_MAX_RADIUS_DEFAULT = -1;
- private static final long BURNIN_PROTECTION_WAKEUP_INTERVAL_MS = TimeUnit.MINUTES.toMillis(1);
+ private static final long BURNIN_PROTECTION_FIRST_WAKEUP_INTERVAL_MS =
+ TimeUnit.MINUTES.toMillis(1);
+ private static final long BURNIN_PROTECTION_SUBSEQUENT_WAKEUP_INTERVAL_MS =
+ TimeUnit.MINUTES.toMillis(2);
private static final long BURNIN_PROTECTION_MINIMAL_INTERVAL_MS = TimeUnit.SECONDS.toMillis(10);
private static final boolean DEBUG = false;
@@ -138,6 +141,9 @@ public class BurnInProtectionHelper implements DisplayManager.DisplayListener,
// We don't want to adjust offsets immediately after the device goes into ambient mode.
// Instead, we want to wait until it's more likely that the user is not observing the
// screen anymore.
+ final long interval = mFirstUpdate
+ ? BURNIN_PROTECTION_FIRST_WAKEUP_INTERVAL_MS
+ : BURNIN_PROTECTION_SUBSEQUENT_WAKEUP_INTERVAL_MS;
if (mFirstUpdate) {
mFirstUpdate = false;
} else {
@@ -156,8 +162,7 @@ public class BurnInProtectionHelper implements DisplayManager.DisplayListener,
// Next adjustment at least ten seconds in the future.
long nextWall = nowWall + BURNIN_PROTECTION_MINIMAL_INTERVAL_MS;
// And aligned to the minute.
- nextWall = nextWall - nextWall % BURNIN_PROTECTION_WAKEUP_INTERVAL_MS
- + BURNIN_PROTECTION_WAKEUP_INTERVAL_MS;
+ nextWall = (nextWall - (nextWall % interval)) + interval;
// Use elapsed real time that is adjusted to full minute on wall clock.
final long nextElapsed = nowElapsed + (nextWall - nowWall);
if (DEBUG) {
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 30d065a19ba8..339325be32c7 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -72,6 +72,7 @@ import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiPlaybackClient;
import android.hardware.hdmi.HdmiPlaybackClient.OneTouchPlayCallback;
import android.hardware.input.InputManagerInternal;
+import android.hardware.power.V1_0.PowerHint;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.AudioSystem;
@@ -177,7 +178,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
static final boolean DEBUG_STARTING_WINDOW = false;
static final boolean DEBUG_WAKEUP = false;
static final boolean SHOW_STARTING_ANIMATIONS = true;
- static final boolean SHOW_PROCESSES_ON_ALT_MENU = false;
// Whether to allow dock apps with METADATA_DOCK_HOME to temporarily take over the Home key.
// No longer recommended for desk docks;
@@ -908,7 +908,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@Override
public void run() {
// send interaction hint to improve redraw performance
- mPowerManagerInternal.powerHint(PowerManagerInternal.POWER_HINT_INTERACTION, 0);
+ mPowerManagerInternal.powerHint(PowerHint.INTERACTION, 0);
updateRotation(false);
}
};
@@ -1839,7 +1839,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
public void onFling(int duration) {
if (mPowerManagerInternal != null) {
mPowerManagerInternal.powerHint(
- PowerManagerInternal.POWER_HINT_INTERACTION, duration);
+ PowerHint.INTERACTION, duration);
}
}
@Override
@@ -3277,21 +3277,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mContext.sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT,
null, null, null, 0, null, null);
return -1;
- } else if (SHOW_PROCESSES_ON_ALT_MENU &&
- (metaState & KeyEvent.META_ALT_ON) == KeyEvent.META_ALT_ON) {
- Intent service = new Intent();
- service.setClassName(mContext, "com.android.server.LoadAverageService");
- ContentResolver res = mContext.getContentResolver();
- boolean shown = Settings.Global.getInt(
- res, Settings.Global.SHOW_PROCESSES, 0) != 0;
- if (!shown) {
- mContext.startService(service);
- } else {
- mContext.stopService(service);
- }
- Settings.Global.putInt(
- res, Settings.Global.SHOW_PROCESSES, shown ? 0 : 1);
- return -1;
}
}
} else if (keyCode == KeyEvent.KEYCODE_SEARCH) {
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 7576cddad60c..706828bc2d21 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -31,6 +31,7 @@ import android.hardware.SensorManager;
import android.hardware.SystemSensorManager;
import android.hardware.display.DisplayManagerInternal;
import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
+import android.hardware.power.V1_0.PowerHint;
import android.net.Uri;
import android.os.BatteryManager;
import android.os.BatteryManagerInternal;
@@ -84,7 +85,6 @@ import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
-import static android.os.PowerManagerInternal.POWER_HINT_INTERACTION;
import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP;
import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE;
import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING;
@@ -163,10 +163,6 @@ public final class PowerManagerService extends SystemService
// How long a partial wake lock must be held until we consider it a long wake lock.
static final long MIN_LONG_WAKE_CHECK_INTERVAL = 60*1000;
- // Power hints defined in hardware/libhardware/include/hardware/power.h.
- private static final int POWER_HINT_LOW_POWER = 5;
- private static final int POWER_HINT_VR_MODE = 7;
-
// Power features defined in hardware/libhardware/include/hardware/power.h.
private static final int POWER_FEATURE_DOUBLE_TAP_TO_WAKE = 1;
@@ -826,7 +822,7 @@ public final class PowerManagerService extends SystemService
if (mLowPowerModeEnabled != lowPowerModeEnabled) {
mLowPowerModeEnabled = lowPowerModeEnabled;
- powerHintInternal(POWER_HINT_LOW_POWER, lowPowerModeEnabled ? 1 : 0);
+ powerHintInternal(PowerHint.LOW_POWER, lowPowerModeEnabled ? 1 : 0);
postAfterBootCompleted(new Runnable() {
@Override
public void run() {
@@ -1152,7 +1148,7 @@ public final class PowerManagerService extends SystemService
Trace.traceBegin(Trace.TRACE_TAG_POWER, "userActivity");
try {
if (eventTime > mLastInteractivePowerHintTime) {
- powerHintInternal(POWER_HINT_INTERACTION, 0);
+ powerHintInternal(PowerHint.INTERACTION, 0);
mLastInteractivePowerHintTime = eventTime;
}
@@ -3083,7 +3079,7 @@ public final class PowerManagerService extends SystemService
private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() {
@Override
public void onVrStateChanged(boolean enabled) {
- powerHintInternal(POWER_HINT_VR_MODE, enabled ? 1 : 0);
+ powerHintInternal(PowerHint.VR_MODE, enabled ? 1 : 0);
}
};
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 5514551e0f1a..9b22760329e8 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -480,6 +480,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
WallpaperData mLastWallpaper;
IWallpaperManagerCallback mKeyguardListener;
boolean mWaitingForUnlock;
+ boolean mShuttingDown;
/**
* ID of the current wallpaper, changed every time anything sets a wallpaper.
@@ -607,6 +608,14 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
private Runnable mResetRunnable = () -> {
synchronized (mLock) {
+ if (mShuttingDown) {
+ // Don't expect wallpaper services to relaunch during shutdown
+ if (DEBUG) {
+ Slog.i(TAG, "Ignoring relaunch timeout during shutdown");
+ }
+ return;
+ }
+
if (!mWallpaper.wallpaperUpdating
&& mWallpaper.userId == mCurrentUserId) {
Slog.w(TAG, "Wallpaper reconnect timed out, "
@@ -867,6 +876,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
public WallpaperManagerService(Context context) {
if (DEBUG) Slog.v(TAG, "WallpaperService startup");
mContext = context;
+ mShuttingDown = false;
mImageWallpaper = ComponentName.unflattenFromString(
context.getResources().getString(R.string.image_wallpaper_component));
mIWindowManager = IWindowManager.Stub.asInterface(
@@ -931,6 +941,21 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
}
}, userFilter);
+ final IntentFilter shutdownFilter = new IntentFilter(Intent.ACTION_SHUTDOWN);
+ mContext.registerReceiver(new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Intent.ACTION_SHUTDOWN.equals(intent.getAction())) {
+ if (DEBUG) {
+ Slog.i(TAG, "Shutting down");
+ }
+ synchronized (mLock) {
+ mShuttingDown = true;
+ }
+ }
+ }
+ }, shutdownFilter);
+
try {
ActivityManagerNative.getDefault().registerUserSwitchObserver(
new UserSwitchObserver() {
@@ -1012,6 +1037,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
for (String filename : sPerUserFiles) {
new File(wallpaperDir, filename).delete();
}
+ mUserRestorecon.remove(userId);
}
}
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 508cf24a7cab..454b025bbd7f 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -158,8 +158,10 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
ArrayDeque<Rect> mFrozenBounds = new ArrayDeque<>();
ArrayDeque<Configuration> mFrozenMergedConfig = new ArrayDeque<>();
- AppWindowToken(WindowManagerService service, IApplicationToken token, boolean _voiceInteraction) {
- super(service, token != null ? token.asBinder() : null, TYPE_APPLICATION, true);
+ AppWindowToken(WindowManagerService service, IApplicationToken token, boolean _voiceInteraction,
+ DisplayContent displayContent) {
+ super(service, token != null ? token.asBinder() : null, TYPE_APPLICATION, true,
+ displayContent);
appToken = token;
voiceInteraction = _voiceInteraction;
mInputApplicationHandle = new InputApplicationHandle(this);
@@ -897,7 +899,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
}
boolean transferStartingWindow(IBinder transferFrom) {
- final AppWindowToken fromToken = mService.findAppWindowToken(transferFrom);
+ final AppWindowToken fromToken = getDisplayContent().getAppWindowToken(transferFrom);
if (fromToken == null) {
return false;
}
@@ -1182,16 +1184,16 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
}
}
- int rebuildWindowListUnchecked(DisplayContent dc, int addIndex) {
- return super.rebuildWindowList(dc, addIndex);
+ int rebuildWindowListUnchecked(int addIndex) {
+ return super.rebuildWindowList(addIndex);
}
@Override
- int rebuildWindowList(DisplayContent dc, int addIndex) {
+ int rebuildWindowList(int addIndex) {
if (mIsExiting && !waitingForReplacement()) {
return addIndex;
}
- return rebuildWindowListUnchecked(dc, addIndex);
+ return rebuildWindowListUnchecked(addIndex);
}
@Override
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 42e9e2399f18..6f7f4a97ad00 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -53,6 +53,7 @@ import android.graphics.Region;
import android.graphics.Region.Op;
import android.hardware.display.DisplayManagerInternal;
import android.os.Debug;
+import android.os.IBinder;
import android.util.DisplayMetrics;
import android.util.Slog;
import android.view.Display;
@@ -66,6 +67,8 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
class DisplayContentList extends ArrayList<DisplayContent> {
@@ -87,6 +90,9 @@ class DisplayContent extends WindowContainer<TaskStack> {
* from mDisplayWindows; */
private final WindowList mWindows = new WindowList();
+ // Mapping from a token IBinder to a WindowToken object on this display.
+ private final HashMap<IBinder, WindowToken> mTokenMap = new HashMap();
+
int mInitialDisplayWidth = 0;
int mInitialDisplayHeight = 0;
int mInitialDisplayDensity = 0;
@@ -127,7 +133,7 @@ class DisplayContent extends WindowContainer<TaskStack> {
final WindowManagerService mService;
/** Remove this display when animation on it has completed. */
- boolean mDeferredRemoval;
+ private boolean mDeferredRemoval;
final DockedStackDividerController mDividerControllerLocked;
@@ -167,6 +173,35 @@ class DisplayContent extends WindowContainer<TaskStack> {
return mWindows;
}
+ WindowToken getWindowToken(IBinder binder) {
+ return mTokenMap.get(binder);
+ }
+
+ AppWindowToken getAppWindowToken(IBinder binder) {
+ final WindowToken token = getWindowToken(binder);
+ if (token == null) {
+ return null;
+ }
+ return token.asAppWindowToken();
+ }
+
+ void setWindowToken(IBinder binder, WindowToken token) {
+ final DisplayContent dc = mService.mRoot.getWindowTokenDisplay(token);
+ if (dc != null) {
+ // We currently don't support adding a window token to the display if the display
+ // already has the binder mapped to another token. If there is a use case for supporting
+ // this moving forward we will either need to merge the WindowTokens some how or have
+ // the binder map to a list of window tokens.
+ throw new IllegalArgumentException("Can't map token=" + token + " to display=" + this
+ + " already mapped to display=" + dc + " tokens=" + dc.mTokenMap);
+ }
+ mTokenMap.put(binder, token);
+ }
+
+ WindowToken removeWindowToken(IBinder binder) {
+ return mTokenMap.remove(binder);
+ }
+
Display getDisplay() {
return mDisplay;
}
@@ -342,6 +377,7 @@ class DisplayContent extends WindowContainer<TaskStack> {
mHomeStack = stack;
}
addChild(stack, onTop);
+ stack.onDisplayChanged(this);
}
void moveStack(TaskStack stack, boolean toTop) {
@@ -899,7 +935,7 @@ class DisplayContent extends WindowContainer<TaskStack> {
// position; else we need to look some more.
if (pos != null) {
// Move behind any windows attached to this one.
- final WindowToken atoken = mService.mTokenMap.get(pos.mClient.asBinder());
+ final WindowToken atoken = getWindowToken(pos.mClient.asBinder());
if (atoken != null) {
tokenWindowList = getTokenWindowsOnDisplay(atoken);
final int NC = tokenWindowList.size();
@@ -929,7 +965,7 @@ class DisplayContent extends WindowContainer<TaskStack> {
if (pos != null) {
// Move in front of any windows attached to this one.
- final WindowToken atoken = mService.mTokenMap.get(pos.mClient.asBinder());
+ final WindowToken atoken = getWindowToken(pos.mClient.asBinder());
if (atoken != null) {
final WindowState top = atoken.getTopWindow();
if (top != null && top.mSubLayer >= 0) {
@@ -1086,13 +1122,13 @@ class DisplayContent extends WindowContainer<TaskStack> {
AppTokenList exitingAppTokens = mChildren.get(stackNdx).mExitingAppTokens;
int NT = exitingAppTokens.size();
for (int j = 0; j < NT; j++) {
- i = exitingAppTokens.get(j).rebuildWindowListUnchecked(this, i);
+ i = exitingAppTokens.get(j).rebuildWindowListUnchecked(i);
}
}
// And add in the still active app tokens in Z order.
for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
- i = mChildren.get(stackNdx).rebuildWindowList(this, i);
+ i = mChildren.get(stackNdx).rebuildWindowList(i);
}
i -= lastBelow;
@@ -1238,6 +1274,25 @@ class DisplayContent extends WindowContainer<TaskStack> {
}
}
+ void dumpTokens(PrintWriter pw, boolean dumpAll) {
+ if (mTokenMap.isEmpty()) {
+ return;
+ }
+ pw.println(" Display #" + mDisplayId);
+ final Iterator<WindowToken> it = mTokenMap.values().iterator();
+ while (it.hasNext()) {
+ final WindowToken token = it.next();
+ pw.print(" ");
+ pw.print(token);
+ if (dumpAll) {
+ pw.println(':');
+ token.dump(pw, " ");
+ } else {
+ pw.println();
+ }
+ }
+ }
+
static final class GetWindowOnDisplaySearchResult {
boolean reachedToken;
WindowState foundWindow;
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 1700bca2e51b..3c13439b3084 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -19,8 +19,10 @@ package com.android.server.wm;
import android.app.AppOpsManager;
import android.content.res.Configuration;
import android.graphics.Rect;
+import android.hardware.power.V1_0.PowerHint;
import android.os.Binder;
import android.os.Debug;
+import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.PowerManager;
import android.os.RemoteException;
@@ -41,9 +43,11 @@ import com.android.server.input.InputWindowHandle;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.LinkedList;
import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
+import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
@@ -57,8 +61,11 @@ import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
+import static com.android.server.wm.AppTransition.TRANSIT_UNSET;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
+import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY;
+import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEEP_SCREEN_ON;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS;
@@ -78,6 +85,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.H.REPORT_LOSING_FOCUS;
import static com.android.server.wm.WindowManagerService.H.SEND_NEW_CONFIGURATION;
import static com.android.server.wm.WindowManagerService.LAYOUT_REPEAT_THRESHOLD;
+import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
import static com.android.server.wm.WindowManagerService.WINDOWS_FREEZING_SCREENS_NONE;
@@ -106,7 +114,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
private long mUserActivityTimeout = -1;
private boolean mUpdateRotation = false;
private boolean mObscured = false;
- boolean mSyswin = false;
+ private boolean mSyswin = false;
// Set to true when the display contains content to show the user.
// When false, the display manager may choose to mirror or blank the display.
private boolean mDisplayHasContent = false;
@@ -116,7 +124,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
// Last window that requires screen wakelock
WindowState mHoldScreenWindow = null;
// Last window that obscures all windows below
- WindowState mObsuringWindow = null;
+ WindowState mObscuringWindow = null;
// Only set while traversing the default display based on its content.
// Affects the behavior of mirroring on secondary displays.
private boolean mObscureApplicationContentOnSecondaryDisplays = false;
@@ -136,6 +144,15 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
private final LinkedList<AppWindowToken> mTmpUpdateAllDrawn = new LinkedList();
+ private final ArrayList<WindowToken> mTmpTokensList = new ArrayList();
+
+ // Collection of binder tokens mapped to their window type we are allowed to create window
+ // tokens for but that are not current attached to any display. We need to track this here
+ // because a binder token can be added through {@link WindowManagerService#addWindowToken},
+ // but we don't know what display windows for the token will be added to until
+ // {@link WindowManagerService#addWindow} is called.
+ private final HashMap<IBinder, Integer> mUnattachedBinderTokens = new HashMap();
+
// State for the RemoteSurfaceTrace system used in testing. If this is enabled SurfaceControl
// instances will be replaced with an instance that writes a binary representation of all
// commands to mSurfaceTraceFd.
@@ -178,7 +195,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
return dc;
}
- private DisplayContent getDisplayContent(int displayId) {
+ DisplayContent getDisplayContent(int displayId) {
for (int i = mChildren.size() - 1; i >= 0; --i) {
final DisplayContent current = mChildren.get(i);
if (current.getDisplayId() == displayId) {
@@ -252,7 +269,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
}
if (!attachedToDisplay) {
- stack.attachDisplayContent(dc);
dc.attachStack(stack, onTop);
}
@@ -337,6 +353,202 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
return null;
}
+ /** Return the window token associated with the input binder token on the input display */
+ WindowToken getWindowToken(IBinder binder, DisplayContent dc) {
+ final WindowToken token = dc.getWindowToken(binder);
+ if (token != null) {
+ return token;
+ }
+
+ // There is no window token mapped to the binder on the display. Create and map a window
+ // token if it is currently allowed.
+ if (!mUnattachedBinderTokens.containsKey(binder)) {
+ return null;
+ }
+
+ final int type = mUnattachedBinderTokens.get(binder);
+ return new WindowToken(mService, binder, type, true, dc);
+ }
+
+ /** Returns all window tokens mapped to the input binder. */
+ ArrayList<WindowToken> getWindowTokens(IBinder binder) {
+ mTmpTokensList.clear();
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ final DisplayContent dc = mChildren.get(i);
+ final WindowToken token = dc.getWindowToken(binder);
+ if (token != null) {
+ mTmpTokensList.add(token);
+ }
+ }
+ return mTmpTokensList;
+ }
+
+ /**
+ * Returns the app window token for the input binder if it exist in the system.
+ * NOTE: Only one AppWindowToken is allowed to exist in the system for a binder token, since
+ * AppWindowToken represents an activity which can only exist on one display.
+ */
+ AppWindowToken getAppWindowToken(IBinder binder) {
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ final DisplayContent dc = mChildren.get(i);
+ final AppWindowToken atoken = dc.getAppWindowToken(binder);
+ if (atoken != null) {
+ return atoken;
+ }
+ }
+ return null;
+ }
+
+ /** Returns the display object the input window token is currently mapped on. */
+ DisplayContent getWindowTokenDisplay(WindowToken token) {
+ if (token == null) {
+ return null;
+ }
+
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ final DisplayContent dc = mChildren.get(i);
+ final WindowToken current = dc.getWindowToken(token.token);
+ if (current == token) {
+ return dc;
+ }
+ }
+
+ return null;
+ }
+
+ void addWindowToken(IBinder binder, int type) {
+ if (mUnattachedBinderTokens.containsKey(binder)) {
+ Slog.w(TAG_WM, "addWindowToken: Attempted to add existing binder token: " + binder);
+ return;
+ }
+
+ final ArrayList<WindowToken> tokens = getWindowTokens(binder);
+
+ if (!tokens.isEmpty()) {
+ Slog.w(TAG_WM, "addWindowToken: Attempted to add binder token: " + binder
+ + " for already created window tokens: " + tokens);
+ return;
+ }
+
+ mUnattachedBinderTokens.put(binder, type);
+
+ // TODO(multi-display): By default we add this to the default display, but maybe we
+ // should provide an API for a token to be added to any display?
+ final WindowToken token = new WindowToken(mService, binder, type, true,
+ getDisplayContent(DEFAULT_DISPLAY));
+ if (type == TYPE_WALLPAPER) {
+ mService.mWallpaperControllerLocked.addWallpaperToken(token);
+ }
+ }
+
+ ArrayList<WindowToken> removeWindowToken(IBinder binder) {
+ mUnattachedBinderTokens.remove(binder);
+
+ mTmpTokensList.clear();
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ final DisplayContent dc = mChildren.get(i);
+ final WindowToken token = dc.removeWindowToken(binder);
+ if (token != null) {
+ mTmpTokensList.add(token);
+ }
+ }
+ return mTmpTokensList;
+ }
+
+ /**
+ * Removed the mapping to the input binder for the system if it no longer as a window token
+ * associated with it on any display.
+ */
+ void removeWindowTokenIfPossible(IBinder binder) {
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ final DisplayContent dc = mChildren.get(i);
+ final WindowToken token = dc.getWindowToken(binder);
+ if (token != null) {
+ return;
+ }
+ }
+
+ mUnattachedBinderTokens.remove(binder);
+ }
+
+ void removeAppToken(IBinder binder) {
+ final ArrayList<WindowToken> removedTokens = removeWindowToken(binder);
+ if (removedTokens == null || removedTokens.isEmpty()) {
+ Slog.w(TAG_WM, "removeAppToken: Attempted to remove non-existing token: " + binder);
+ return;
+ }
+
+ for (int i = removedTokens.size() - 1; i >= 0; --i) {
+ WindowToken wtoken = removedTokens.get(i);
+ AppWindowToken appToken = wtoken.asAppWindowToken();
+
+ if (appToken == null) {
+ Slog.w(TAG_WM,
+ "Attempted to remove non-App token: " + binder + " wtoken=" + wtoken);
+ continue;
+ }
+
+ AppWindowToken startingToken = null;
+
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "Removing app token: " + appToken);
+
+ boolean delayed = appToken.setVisibility(null, false, TRANSIT_UNSET, true,
+ appToken.voiceInteraction);
+
+ mService.mOpeningApps.remove(appToken);
+ appToken.waitingToShow = false;
+ if (mService.mClosingApps.contains(appToken)) {
+ delayed = true;
+ } else if (mService.mAppTransition.isTransitionSet()) {
+ mService.mClosingApps.add(appToken);
+ delayed = true;
+ }
+
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "Removing app " + appToken
+ + " delayed=" + delayed
+ + " animation=" + appToken.mAppAnimator.animation
+ + " animating=" + appToken.mAppAnimator.animating);
+
+ if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG_WM, "removeAppToken: "
+ + appToken + " delayed=" + delayed + " Callers=" + Debug.getCallers(4));
+
+ final TaskStack stack = appToken.mTask.mStack;
+ if (delayed && !appToken.isEmpty()) {
+ // set the token aside because it has an active animation to be finished
+ if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG_WM,
+ "removeAppToken make exiting: " + appToken);
+ stack.mExitingAppTokens.add(appToken);
+ appToken.mIsExiting = true;
+ } else {
+ // Make sure there is no animation running on this token, so any windows associated
+ // with it will be removed as soon as their animations are complete
+ appToken.mAppAnimator.clearAnimation();
+ appToken.mAppAnimator.animating = false;
+ appToken.removeIfPossible();
+ }
+
+ appToken.removed = true;
+ if (appToken.startingData != null) {
+ startingToken = appToken;
+ }
+ appToken.stopFreezingScreen(true, true);
+ if (mService.mFocusedApp == appToken) {
+ if (DEBUG_FOCUS_LIGHT) Slog.v(TAG_WM, "Removing focused app token:" + appToken);
+ mService.mFocusedApp = null;
+ mService.updateFocusedWindowLocked(
+ UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
+ mService.mInputMonitor.setFocusedAppLw(null);
+ }
+
+ if (!delayed) {
+ appToken.updateReportedVisibilityLocked();
+ }
+
+ // Will only remove if startingToken non null.
+ mService.scheduleRemoveStartingWindowLocked(startingToken);
+ }
+ }
+
// TODO: Users would have their own window containers under the display container?
void switchUser() {
final int count = mChildren.size();
@@ -368,7 +580,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
* Callback used to trigger bounds update after configuration change and get ids of stacks whose
* bounds were updated.
*/
- int[] updateStackBoundsAfterConfigChange() {
+ private int[] updateStackBoundsAfterConfigChange() {
mChangedStackList.clear();
final int numDisplays = mChildren.size();
@@ -890,7 +1102,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
if (mSustainedPerformanceModeCurrent != mSustainedPerformanceModeEnabled) {
mSustainedPerformanceModeEnabled = mSustainedPerformanceModeCurrent;
mService.mPowerManagerInternal.powerHint(
- mService.mPowerManagerInternal.POWER_HINT_SUSTAINED_PERFORMANCE_MODE,
+ PowerHint.SUSTAINED_PERFORMANCE,
(mSustainedPerformanceModeEnabled ? 1 : 0));
}
@@ -969,7 +1181,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
// TODO: Super crazy long method that should be broken down...
private void applySurfaceChangesTransaction(boolean recoveringMemory, int defaultDw, int defaultDh) {
mHoldScreenWindow = null;
- mObsuringWindow = null;
+ mObscuringWindow = null;
if (mService.mWatermark != null) {
mService.mWatermark.positionSurface(defaultDw, defaultDh);
@@ -1195,7 +1407,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
// so we want to leave all of them as undimmed (for
// performance reasons).
if (!mObscured) {
- mObsuringWindow = w;
+ mObscuringWindow = w;
}
mObscured = true;
@@ -1360,6 +1572,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
}
}
+ void dumpTokens(PrintWriter pw, boolean dumpAll) {
+ pw.println(" All tokens:");
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ mChildren.get(i).dumpTokens(pw, dumpAll);
+ }
+ }
+
@Override
String getName() {
return "ROOT";
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index e98fc393d404..56fdc33f36a4 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -94,16 +94,16 @@ public class TaskStack extends WindowContainer<Task> implements DimLayer.DimLaye
private boolean mFillsParent = true;
// Device rotation as of the last time {@link #mBounds} was set.
- int mRotation;
+ private int mRotation;
/** Density as of last time {@link #mBounds} was set. */
- int mDensity;
+ private int mDensity;
/** Support for non-zero {@link android.view.animation.Animation#getBackgroundColor()} */
- DimLayer mAnimationBackgroundSurface;
+ private DimLayer mAnimationBackgroundSurface;
/** The particular window with an Animation with non-zero background color. */
- WindowStateAnimator mAnimationBackgroundAnimator;
+ private WindowStateAnimator mAnimationBackgroundAnimator;
/** Application tokens that are exiting, but still on screen for animations. */
final AppTokenList mExitingAppTokens = new AppTokenList();
@@ -606,12 +606,12 @@ public class TaskStack extends WindowContainer<Task> implements DimLayer.DimLaye
}
}
- void attachDisplayContent(DisplayContent displayContent) {
+ void onDisplayChanged(DisplayContent dc) {
if (mDisplayContent != null) {
- throw new IllegalStateException("attachDisplayContent: Already attached");
+ throw new IllegalStateException("onDisplayChanged: Already attached");
}
- mDisplayContent = displayContent;
+ mDisplayContent = dc;
mAnimationBackgroundSurface = new DimLayer(mService, this, mDisplayContent.getDisplayId(),
"animation background stackId=" + mStackId);
@@ -625,7 +625,7 @@ public class TaskStack extends WindowContainer<Task> implements DimLayer.DimLaye
// not fullscreen. If it's fullscreen, it means that we are in the transition of
// dismissing it, so we must not resize this stack.
bounds = new Rect();
- displayContent.getLogicalDisplayRect(mTmpRect);
+ dc.getLogicalDisplayRect(mTmpRect);
mTmpRect2.setEmpty();
if (dockedStack != null) {
dockedStack.getRawBounds(mTmpRect2);
@@ -638,6 +638,8 @@ public class TaskStack extends WindowContainer<Task> implements DimLayer.DimLaye
}
updateDisplayInfo(bounds);
+
+ super.onDisplayChanged(dc);
}
void getStackDockedModeBoundsLocked(Rect outBounds, boolean ignoreVisibility) {
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 902f4ae671a4..981b813b6030 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -254,6 +254,17 @@ class WindowContainer<E extends WindowContainer> implements Comparable<WindowCon
}
}
+ /**
+ * Notify that the display this container is on has changed.
+ * @param dc The new display this container is on.
+ */
+ void onDisplayChanged(DisplayContent dc) {
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ final WindowContainer child = mChildren.get(i);
+ child.onDisplayChanged(dc);
+ }
+ }
+
void setWaitingForDrawnIfResizingChanged() {
for (int i = mChildren.size() - 1; i >= 0; --i) {
final WindowContainer wc = mChildren.get(i);
@@ -472,16 +483,15 @@ class WindowContainer<E extends WindowContainer> implements Comparable<WindowCon
/**
* Rebuilds the WindowList for the input display content.
- * @param dc The display content to rebuild the window list for.
* @param addIndex The index in the window list to add the next entry to.
* @return The next index in the window list to.
*/
// TODO: Hoping we can get rid of WindowList so this method wouldn't be needed.
- int rebuildWindowList(DisplayContent dc, int addIndex) {
+ int rebuildWindowList(int addIndex) {
final int count = mChildren.size();
for (int i = 0; i < count; i++) {
final WindowContainer wc = mChildren.get(i);
- addIndex = wc.rebuildWindowList(dc, addIndex);
+ addIndex = wc.rebuildWindowList(addIndex);
}
return addIndex;
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 9f8110503a25..c899490a0c8c 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -163,9 +163,9 @@ import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
+import static android.Manifest.permission.MANAGE_APP_TOKENS;
import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT;
import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
@@ -203,6 +203,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
import static android.view.WindowManagerGlobal.RELAYOUT_DEFER_SURFACE_DESTROY;
import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
+import static com.android.server.EventLogTags.WM_TASK_CREATED;
import static com.android.server.wm.AppTransition.TRANSIT_UNSET;
import static com.android.server.wm.AppWindowAnimator.PROLONG_ANIMATION_AT_END;
import static com.android.server.wm.AppWindowAnimator.PROLONG_ANIMATION_AT_START;
@@ -401,11 +402,6 @@ public class WindowManagerService extends IWindowManager.Stub
final HashMap<IBinder, WindowState> mWindowMap = new HashMap<>();
/**
- * Mapping from a token IBinder to a WindowToken object.
- */
- final HashMap<IBinder, WindowToken> mTokenMap = new HashMap<>();
-
- /**
* List of window tokens that have finished starting their application,
* and now need to have the policy remove their windows.
*/
@@ -910,7 +906,7 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void onAppTransitionFinishedLocked(IBinder token) {
mH.sendEmptyMessage(H.NOTIFY_APP_TRANSITION_FINISHED);
- AppWindowToken atoken = findAppWindowToken(token);
+ final AppWindowToken atoken = mRoot.getAppWindowToken(token);
if (atoken == null) {
return;
}
@@ -1261,7 +1257,8 @@ public class WindowManagerService extends IWindowManager.Stub
// excercise to find the appropriate input method target (used for animations
// and dialog adjustments), but for purposes of Z ordering we simply wish to
// place it above the docked divider. Unless it is already above the divider.
- WindowState dockedDivider = w.mDisplayContent.mDividerControllerLocked.getWindow();
+ final WindowState dockedDivider =
+ w.getDisplayContent().mDividerControllerLocked.getWindow();
if (dockedDivider != null && dockedDivider.isVisibleLw()) {
int dividerIndex = windows.indexOf(dockedDivider);
if (dividerIndex > 0 && dividerIndex > i) {
@@ -1279,7 +1276,7 @@ public class WindowManagerService extends IWindowManager.Stub
return -1;
}
- void addInputMethodWindowToListLocked(WindowState win) {
+ private void addInputMethodWindowToListLocked(WindowState win) {
int pos = findDesiredInputMethodWindowIndexLocked(true);
if (pos >= 0) {
if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
@@ -1533,7 +1530,8 @@ public class WindowManagerService extends IWindowManager.Stub
final boolean hasParent = parentWindow != null;
// Use existing parent window token for child windows since they go in the same token
// as there parent window so we can apply the same policy on them.
- WindowToken token = mTokenMap.get(hasParent ? parentWindow.mAttrs.token : attrs.token);
+ WindowToken token = mRoot.getWindowToken(
+ hasParent ? parentWindow.mAttrs.token : attrs.token, displayContent);
// If this is a child window, we want to apply the same type checking rules as the
// parent window type.
final int rootType = hasParent ? parentWindow.mAttrs.type : type;
@@ -1585,7 +1583,7 @@ public class WindowManagerService extends IWindowManager.Stub
return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
}
}
- token = new WindowToken(this, attrs.token, -1, false);
+ token = new WindowToken(this, attrs.token, -1, false, displayContent);
} else if (rootType >= FIRST_APPLICATION_WINDOW && rootType <= LAST_APPLICATION_WINDOW) {
atoken = token.asAppWindowToken();
if (atoken == null) {
@@ -1653,11 +1651,11 @@ public class WindowManagerService extends IWindowManager.Stub
// It is not valid to use an app token with other system types; we will
// instead make a new token for it (as if null had been passed in for the token).
attrs.token = null;
- token = new WindowToken(this, null, -1, false);
+ token = new WindowToken(this, null, -1, false, displayContent);
}
WindowState win = new WindowState(this, session, client, token, parentWindow,
- appOp[0], seq, attrs, viewVisibility, displayContent, session.mUid);
+ appOp[0], seq, attrs, viewVisibility, session.mUid);
if (win.mDeathRecipient == null) {
// Client has apparently died, so there is no reason to
// continue.
@@ -2023,7 +2021,7 @@ public class WindowManagerService extends IWindowManager.Stub
// Window will already be removed from token before this post clean-up method is called.
if (token.isEmpty()) {
if (!token.explicit) {
- mTokenMap.remove(token.token);
+ token.removeImmediately();
} else if (atoken != null) {
// TODO: Should this be moved into AppWindowToken.removeWindow? Might go away after
// re-factor.
@@ -2738,10 +2736,8 @@ public class WindowManagerService extends IWindowManager.Stub
== PackageManager.PERMISSION_GRANTED) {
return true;
}
- String msg = "Permission Denial: " + func + " from pid="
- + Binder.getCallingPid()
- + ", uid=" + Binder.getCallingUid()
- + " requires " + permission;
+ final String msg = "Permission Denial: " + func + " from pid=" + Binder.getCallingPid()
+ + ", uid=" + Binder.getCallingUid() + " requires " + permission;
Slog.w(TAG_WM, msg);
return false;
}
@@ -2750,56 +2746,46 @@ public class WindowManagerService extends IWindowManager.Stub
return !mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOn();
}
- AppWindowToken findAppWindowToken(IBinder token) {
- WindowToken wtoken = mTokenMap.get(token);
- if (wtoken == null) {
- return null;
- }
- return wtoken.asAppWindowToken();
- }
-
@Override
public void addWindowToken(IBinder token, int type) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "addWindowToken()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "addWindowToken()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
- WindowToken wtoken = mTokenMap.get(token);
- if (wtoken != null) {
- Slog.w(TAG_WM, "Attempted to add existing input method token: " + token);
- return;
- }
- wtoken = new WindowToken(this, token, type, true);
- if (type == TYPE_WALLPAPER) {
- mWallpaperControllerLocked.addWallpaperToken(wtoken);
- }
+ mRoot.addWindowToken(token, type);
}
}
@Override
public void removeWindowToken(IBinder token) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "removeWindowToken()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "removeWindowToken()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
final long origId = Binder.clearCallingIdentity();
- synchronized(mWindowMap) {
- final WindowToken wtoken = mTokenMap.remove(token);
- if (wtoken != null) {
- wtoken.setExiting();
- if (wtoken.windowType == TYPE_WALLPAPER) {
- mWallpaperControllerLocked.removeWallpaperToken(wtoken);
+ try {
+ synchronized (mWindowMap) {
+ final ArrayList<WindowToken> removedTokens = mRoot.removeWindowToken(token);
+ if (removedTokens == null || removedTokens.isEmpty()) {
+ Slog.w(TAG_WM,
+ "removeWindowToken: Attempted to remove non-existing token: " + token);
+ return;
}
- mInputMonitor.updateInputWindowsLw(true /*force*/);
- } else {
- Slog.w(TAG_WM, "Attempted to remove non-existing token: " + token);
+ for (int i = removedTokens.size() - 1; i >= 0; --i) {
+ final WindowToken wtoken = removedTokens.get(i);
+ wtoken.setExiting();
+ if (wtoken.windowType == TYPE_WALLPAPER) {
+ mWallpaperControllerLocked.removeWallpaperToken(wtoken);
+ }
+
+ mInputMonitor.updateInputWindowsLw(true /*force*/);
+ }
}
+ } finally {
+ Binder.restoreCallingIdentity(origId);
}
- Binder.restoreCallingIdentity(origId);
}
private Task createTaskLocked(int taskId, int stackId, int userId, AppWindowToken atoken,
@@ -2808,9 +2794,9 @@ public class WindowManagerService extends IWindowManager.Stub
+ " atoken=" + atoken + " bounds=" + bounds);
final TaskStack stack = mStackIdToStack.get(stackId);
if (stack == null) {
- throw new IllegalArgumentException("addAppToken: invalid stackId=" + stackId);
+ throw new IllegalArgumentException("createTaskLocked: invalid stackId=" + stackId);
}
- EventLog.writeEvent(EventLogTags.WM_TASK_CREATED, taskId, stackId);
+ EventLog.writeEvent(WM_TASK_CREATED, taskId, stackId);
Task task = new Task(taskId, stack, userId, this, bounds, overrideConfig, isOnTopLauncher);
mTaskIdToTask.put(taskId, task);
stack.addTask(task, !atoken.mLaunchTaskBehind /* toTop */, atoken.showForAllUsers);
@@ -2824,8 +2810,7 @@ public class WindowManagerService extends IWindowManager.Stub
Rect taskBounds, Configuration overrideConfig, int taskResizeMode,
boolean alwaysFocusable, boolean homeTask, int targetSdkVersion,
int rotationAnimationHint, boolean isOnTopLauncher) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "addAppToken()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "addAppToken()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
@@ -2844,12 +2829,18 @@ public class WindowManagerService extends IWindowManager.Stub
}
synchronized(mWindowMap) {
- AppWindowToken atoken = findAppWindowToken(token.asBinder());
+ AppWindowToken atoken = mRoot.getAppWindowToken(token.asBinder());
if (atoken != null) {
Slog.w(TAG_WM, "Attempted to add existing app token: " + token);
return;
}
- atoken = new AppWindowToken(this, token, voiceInteraction);
+
+ final TaskStack stack = mStackIdToStack.get(stackId);
+ if (stack == null) {
+ throw new IllegalArgumentException("addAppToken: invalid stackId=" + stackId);
+ }
+
+ atoken = new AppWindowToken(this, token, voiceInteraction, stack.getDisplayContent());
atoken.inputDispatchingTimeoutNanos = inputDispatchingTimeoutNanos;
atoken.setFillsParent(fullscreen);
atoken.showForAllUsers = showForAllUsers;
@@ -2880,13 +2871,12 @@ public class WindowManagerService extends IWindowManager.Stub
public void setAppTask(IBinder token, int taskId, int stackId, Rect taskBounds,
Configuration overrideConfig, int taskResizeMode, boolean homeTask,
boolean isOnTopLauncher) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "setAppTask()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "setAppTask()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
- final AppWindowToken atoken = findAppWindowToken(token);
+ final AppWindowToken atoken = mRoot.getAppWindowToken(token);
if (atoken == null) {
Slog.w(TAG_WM, "Attempted to set task id of non-existing app token: " + token);
return;
@@ -2978,8 +2968,7 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public Configuration updateOrientationFromAppTokens(
Configuration currentConfig, IBinder freezeThisOneIfNeeded) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "updateOrientationFromAppTokens()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "updateOrientationFromAppTokens()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
@@ -3003,12 +2992,10 @@ public class WindowManagerService extends IWindowManager.Stub
Configuration config = null;
if (updateOrientationFromAppTokensLocked(false)) {
- // If we changed the orientation but mOrientationChangeComplete is
- // already true, we used seamless rotation, and we don't need
- // to freeze the screen.
- if (freezeThisOneIfNeeded != null &&
- !mRoot.mOrientationChangeComplete) {
- final AppWindowToken atoken = findAppWindowToken(freezeThisOneIfNeeded);
+ // If we changed the orientation but mOrientationChangeComplete is already true,
+ // we used seamless rotation, and we don't need to freeze the screen.
+ if (freezeThisOneIfNeeded != null && !mRoot.mOrientationChangeComplete) {
+ final AppWindowToken atoken = mRoot.getAppWindowToken(freezeThisOneIfNeeded);
if (atoken != null) {
atoken.startFreezingScreen();
}
@@ -3092,8 +3079,7 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public int[] setNewConfiguration(Configuration config) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "setNewConfiguration()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "setNewConfiguration()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
@@ -3118,13 +3104,12 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void setAppOrientation(IApplicationToken token, int requestedOrientation) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "setAppOrientation()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "setAppOrientation()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
- final AppWindowToken atoken = findAppWindowToken(token.asBinder());
+ final AppWindowToken atoken = mRoot.getAppWindowToken(token.asBinder());
if (atoken == null) {
Slog.w(TAG_WM, "Attempted to set orientation of non-existing app token: " + token);
return;
@@ -3137,9 +3122,9 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public int getAppOrientation(IApplicationToken token) {
synchronized(mWindowMap) {
- AppWindowToken wtoken = findAppWindowToken(token.asBinder());
+ final AppWindowToken wtoken = mRoot.getAppWindowToken(token.asBinder());
if (wtoken == null) {
- return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
+ return SCREEN_ORIENTATION_UNSPECIFIED;
}
return wtoken.getOrientation();
@@ -3158,8 +3143,7 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void setFocusedApp(IBinder token, boolean moveFocusNow) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "setFocusedApp()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "setFocusedApp()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
@@ -3169,7 +3153,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (DEBUG_FOCUS_LIGHT) Slog.v(TAG_WM, "Clearing focused app, was " + mFocusedApp);
newFocus = null;
} else {
- newFocus = findAppWindowToken(token);
+ newFocus = mRoot.getAppWindowToken(token);
if (newFocus == null) {
Slog.w(TAG_WM, "Attempted to set focus to non-existing app token: " + token);
}
@@ -3200,8 +3184,7 @@ public class WindowManagerService extends IWindowManager.Stub
*/
@Override
public void prepareAppTransition(int transit, boolean alwaysKeepCurrent) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "prepareAppTransition()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "prepareAppTransition()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
@@ -3329,8 +3312,7 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void executeAppTransition() {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "executeAppTransition()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "executeAppTransition()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
@@ -3354,8 +3336,7 @@ public class WindowManagerService extends IWindowManager.Stub
int theme, CompatibilityInfo compatInfo,
CharSequence nonLocalizedLabel, int labelRes, int icon, int logo,
int windowFlags, IBinder transferFrom, boolean createIfNeeded) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "setAppStartingWindow()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "setAppStartingWindow()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
@@ -3364,7 +3345,7 @@ public class WindowManagerService extends IWindowManager.Stub
TAG_WM, "setAppStartingWindow: token=" + token + " pkg=" + pkg
+ " transferFrom=" + transferFrom);
- AppWindowToken wtoken = findAppWindowToken(token);
+ final AppWindowToken wtoken = mRoot.getAppWindowToken(token);
if (wtoken == null) {
Slog.w(TAG_WM, "Attempted to set icon of non-existing app token: " + token);
return false;
@@ -3426,7 +3407,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
- if (wtoken != null && wtoken.transferStartingWindow(transferFrom)) {
+ if (wtoken.transferStartingWindow(transferFrom)) {
return true;
}
@@ -3451,14 +3432,14 @@ public class WindowManagerService extends IWindowManager.Stub
public void removeAppStartingWindow(IBinder token) {
synchronized (mWindowMap) {
- final AppWindowToken wtoken = mTokenMap.get(token).asAppWindowToken();
+ final AppWindowToken wtoken = mRoot.getAppWindowToken(token);
scheduleRemoveStartingWindowLocked(wtoken);
}
}
public void setAppFullscreen(IBinder token, boolean toOpaque) {
synchronized (mWindowMap) {
- final AppWindowToken atoken = findAppWindowToken(token);
+ final AppWindowToken atoken = mRoot.getAppWindowToken(token);
if (atoken != null) {
atoken.setFillsParent(toOpaque);
setWindowOpaqueLocked(token, toOpaque);
@@ -3473,10 +3454,10 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
- public void setWindowOpaqueLocked(IBinder token, boolean isOpaque) {
- AppWindowToken wtoken = findAppWindowToken(token);
+ private void setWindowOpaqueLocked(IBinder token, boolean isOpaque) {
+ final AppWindowToken wtoken = mRoot.getAppWindowToken(token);
if (wtoken != null) {
- WindowState win = wtoken.findMainWindow();
+ final WindowState win = wtoken.findMainWindow();
if (win != null) {
win.mWinAnimator.setOpaqueLocked(isOpaque);
}
@@ -3494,14 +3475,12 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void notifyAppResumed(IBinder token, boolean wasStopped, boolean allowSavedSurface) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "notifyAppResumed()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "notifyAppResumed()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
- final AppWindowToken wtoken;
- wtoken = findAppWindowToken(token);
+ final AppWindowToken wtoken = mRoot.getAppWindowToken(token);
if (wtoken == null) {
Slog.w(TAG_WM, "Attempted to notify resumed of non-existing app token: " + token);
return;
@@ -3512,14 +3491,13 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void notifyAppStopped(IBinder token) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "notifyAppStopped()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "notifyAppStopped()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
final AppWindowToken wtoken;
- wtoken = findAppWindowToken(token);
+ wtoken = mRoot.getAppWindowToken(token);
if (wtoken == null) {
Slog.w(TAG_WM, "Attempted to notify stopped of non-existing app token: " + token);
return;
@@ -3530,15 +3508,14 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void setAppVisibility(IBinder token, boolean visible) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "setAppVisibility()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "setAppVisibility()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
AppWindowToken wtoken;
synchronized(mWindowMap) {
- wtoken = findAppWindowToken(token);
+ wtoken = mRoot.getAppWindowToken(token);
if (wtoken == null) {
Slog.w(TAG_WM, "Attempted to set visibility of non-existing app token: " + token);
return;
@@ -3648,8 +3625,7 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void startAppFreezingScreen(IBinder token, int configChanges) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "setAppFreezingScreen()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "setAppFreezingScreen()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
@@ -3659,7 +3635,7 @@ public class WindowManagerService extends IWindowManager.Stub
return;
}
- final AppWindowToken wtoken = findAppWindowToken(token);
+ final AppWindowToken wtoken = mRoot.getAppWindowToken(token);
if (wtoken == null || wtoken.appToken == null) {
Slog.w(TAG_WM, "Attempted to freeze screen with non-existing app token: " + wtoken);
return;
@@ -3672,19 +3648,18 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void stopAppFreezingScreen(IBinder token, boolean force) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "setAppFreezingScreen()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "setAppFreezingScreen()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized(mWindowMap) {
- AppWindowToken wtoken = findAppWindowToken(token);
+ final AppWindowToken wtoken = mRoot.getAppWindowToken(token);
if (wtoken == null || wtoken.appToken == null) {
return;
}
final long origId = Binder.clearCallingIdentity();
- if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Clear freezing of " + token
- + ": hidden=" + wtoken.hidden + " freezing=" + wtoken.mAppAnimator.freezingScreen);
+ if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Clear freezing of " + token + ": hidden="
+ + wtoken.hidden + " freezing=" + wtoken.mAppAnimator.freezingScreen);
wtoken.stopFreezingScreen(true, force);
Binder.restoreCallingIdentity(origId);
}
@@ -3692,76 +3667,18 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void removeAppToken(IBinder token) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "removeAppToken()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "removeAppToken()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
- AppWindowToken wtoken = null;
- AppWindowToken startingToken = null;
- boolean delayed = false;
-
final long origId = Binder.clearCallingIdentity();
- synchronized(mWindowMap) {
- WindowToken basewtoken = mTokenMap.remove(token);
- if (basewtoken != null && (wtoken = basewtoken.asAppWindowToken()) != null) {
- if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "Removing app token: " + wtoken);
- delayed = wtoken.setVisibility(null, false,
- TRANSIT_UNSET, true, wtoken.voiceInteraction);
- mOpeningApps.remove(wtoken);
- wtoken.waitingToShow = false;
- if (mClosingApps.contains(wtoken)) {
- delayed = true;
- } else if (mAppTransition.isTransitionSet()) {
- mClosingApps.add(wtoken);
- delayed = true;
- }
- if (DEBUG_APP_TRANSITIONS) Slog.v(
- TAG_WM, "Removing app " + wtoken + " delayed=" + delayed
- + " animation=" + wtoken.mAppAnimator.animation
- + " animating=" + wtoken.mAppAnimator.animating);
- if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG_WM, "removeAppToken: "
- + wtoken + " delayed=" + delayed + " Callers=" + Debug.getCallers(4));
- final TaskStack stack = wtoken.mTask.mStack;
- if (delayed && !wtoken.isEmpty()) {
- // set the token aside because it has an active animation to be finished
- if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG_WM,
- "removeAppToken make exiting: " + wtoken);
- stack.mExitingAppTokens.add(wtoken);
- wtoken.mIsExiting = true;
- } else {
- // Make sure there is no animation running on this token,
- // so any windows associated with it will be removed as
- // soon as their animations are complete
- wtoken.mAppAnimator.clearAnimation();
- wtoken.mAppAnimator.animating = false;
- wtoken.removeIfPossible();
- }
-
- wtoken.removed = true;
- if (wtoken.startingData != null) {
- startingToken = wtoken;
- }
- wtoken.stopFreezingScreen(true, true);
- if (mFocusedApp == wtoken) {
- if (DEBUG_FOCUS_LIGHT) Slog.v(TAG_WM, "Removing focused app token:" + wtoken);
- mFocusedApp = null;
- updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
- mInputMonitor.setFocusedAppLw(null);
- }
- } else {
- Slog.w(TAG_WM, "Attempted to remove non-existing app token: " + token);
- }
-
- if (!delayed && wtoken != null) {
- wtoken.updateReportedVisibilityLocked();
+ try {
+ synchronized(mWindowMap) {
+ mRoot.removeAppToken(token);
}
-
- // Will only remove if startingToken non null.
- scheduleRemoveStartingWindowLocked(startingToken);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
}
- Binder.restoreCallingIdentity(origId);
-
}
void scheduleRemoveStartingWindowLocked(AppWindowToken wtoken) {
@@ -5559,7 +5476,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (mRotation == rotation && mAltOrientation == altOrientation) {
// No change.
- return false;
+ return false;
}
if (DEBUG_ORIENTATION) {
@@ -6628,38 +6545,39 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void pauseKeyDispatching(IBinder _token) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "pauseKeyDispatching()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "pauseKeyDispatching()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized (mWindowMap) {
- WindowToken token = mTokenMap.get(_token);
- if (token != null) {
- mInputMonitor.pauseDispatchingLw(token);
+ final ArrayList<WindowToken> tokens = mRoot.getWindowTokens(_token);
+ if (tokens != null && !tokens.isEmpty()) {
+ for (int i = tokens.size() - 1; i >= 0; --i) {
+ mInputMonitor.pauseDispatchingLw(tokens.get(i));
+ }
}
}
}
@Override
public void resumeKeyDispatching(IBinder _token) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "resumeKeyDispatching()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "resumeKeyDispatching()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
synchronized (mWindowMap) {
- WindowToken token = mTokenMap.get(_token);
- if (token != null) {
- mInputMonitor.resumeDispatchingLw(token);
+ final ArrayList<WindowToken> tokens = mRoot.getWindowTokens(_token);
+ if (tokens != null && !tokens.isEmpty()) {
+ for (int i = tokens.size() - 1; i >= 0; --i) {
+ mInputMonitor.resumeDispatchingLw(tokens.get(i));
+ }
}
}
}
@Override
public void setEventDispatching(boolean enabled) {
- if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
- "setEventDispatching()")) {
+ if (!checkCallingPermission(MANAGE_APP_TOKENS, "setEventDispatching()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
@@ -8133,10 +8051,10 @@ public class WindowManagerService extends IWindowManager.Stub
} else {
if (DEBUG_KEEP_SCREEN_ON) {
Slog.d(TAG_KEEP_SCREEN_ON, "Releasing screen wakelock, obscured by "
- + mRoot.mObsuringWindow);
+ + mRoot.mObscuringWindow);
}
mLastWakeLockHoldingWindow = null;
- mLastWakeLockObscuringWindow = mRoot.mObsuringWindow;
+ mLastWakeLockObscuringWindow = mRoot.mObscuringWindow;
mPolicy.keepScreenOnStoppedLw();
mHoldingScreenWakeLock.release();
}
@@ -8681,7 +8599,7 @@ public class WindowManagerService extends IWindowManager.Stub
public void notifyAppRelaunching(IBinder token) {
synchronized (mWindowMap) {
- AppWindowToken appWindow = findAppWindowToken(token);
+ final AppWindowToken appWindow = mRoot.getAppWindowToken(token);
if (appWindow != null) {
appWindow.startRelaunching();
}
@@ -8690,7 +8608,7 @@ public class WindowManagerService extends IWindowManager.Stub
public void notifyAppRelaunchingFinished(IBinder token) {
synchronized (mWindowMap) {
- AppWindowToken appWindow = findAppWindowToken(token);
+ final AppWindowToken appWindow = mRoot.getAppWindowToken(token);
if (appWindow != null) {
appWindow.finishRelaunching();
}
@@ -8699,7 +8617,7 @@ public class WindowManagerService extends IWindowManager.Stub
public void notifyAppRelaunchesCleared(IBinder token) {
synchronized (mWindowMap) {
- final AppWindowToken appWindow = findAppWindowToken(token);
+ final AppWindowToken appWindow = mRoot.getAppWindowToken(token);
if (appWindow != null) {
appWindow.clearRelaunching();
}
@@ -8711,32 +8629,19 @@ public class WindowManagerService extends IWindowManager.Stub
return getDefaultDisplayContentLocked().getDockedDividerController().getContentInsets();
}
- void dumpPolicyLocked(PrintWriter pw, String[] args, boolean dumpAll) {
+ private void dumpPolicyLocked(PrintWriter pw, String[] args, boolean dumpAll) {
pw.println("WINDOW MANAGER POLICY STATE (dumpsys window policy)");
mPolicy.dump(" ", pw, args);
}
- void dumpAnimatorLocked(PrintWriter pw, String[] args, boolean dumpAll) {
+ private void dumpAnimatorLocked(PrintWriter pw, String[] args, boolean dumpAll) {
pw.println("WINDOW MANAGER ANIMATOR STATE (dumpsys window animator)");
mAnimator.dumpLocked(pw, " ", dumpAll);
}
- void dumpTokensLocked(PrintWriter pw, boolean dumpAll) {
+ private void dumpTokensLocked(PrintWriter pw, boolean dumpAll) {
pw.println("WINDOW MANAGER TOKENS (dumpsys window tokens)");
- if (!mTokenMap.isEmpty()) {
- pw.println(" All tokens:");
- Iterator<WindowToken> it = mTokenMap.values().iterator();
- while (it.hasNext()) {
- WindowToken token = it.next();
- pw.print(" "); pw.print(token);
- if (dumpAll) {
- pw.println(':');
- token.dump(pw, " ");
- } else {
- pw.println();
- }
- }
- }
+ mRoot.dumpTokens(pw, dumpAll);
mWallpaperControllerLocked.dumpTokens(pw, " ", dumpAll);
if (!mFinishedStarting.isEmpty()) {
pw.println();
@@ -8764,7 +8669,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
- void dumpSessionsLocked(PrintWriter pw, boolean dumpAll) {
+ private void dumpSessionsLocked(PrintWriter pw, boolean dumpAll) {
pw.println("WINDOW MANAGER SESSIONS (dumpsys window sessions)");
for (int i=0; i<mSessions.size(); i++) {
Session s = mSessions.valueAt(i);
@@ -8773,13 +8678,13 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
- void dumpWindowsLocked(PrintWriter pw, boolean dumpAll,
+ private void dumpWindowsLocked(PrintWriter pw, boolean dumpAll,
ArrayList<WindowState> windows) {
pw.println("WINDOW MANAGER WINDOWS (dumpsys window windows)");
dumpWindowsNoHeaderLocked(pw, dumpAll, windows);
}
- void dumpWindowsNoHeaderLocked(PrintWriter pw, boolean dumpAll,
+ private void dumpWindowsNoHeaderLocked(PrintWriter pw, boolean dumpAll,
ArrayList<WindowState> windows) {
mRoot.dumpWindowsNoHeader(pw, dumpAll, windows);
@@ -9268,7 +9173,7 @@ public class WindowManagerService extends IWindowManager.Stub
*/
public void setWillReplaceWindow(IBinder token, boolean animate) {
synchronized (mWindowMap) {
- final AppWindowToken appWindowToken = findAppWindowToken(token);
+ final AppWindowToken appWindowToken = mRoot.getAppWindowToken(token);
if (appWindowToken == null || !appWindowToken.hasContentToDisplay()) {
Slog.w(TAG_WM, "Attempted to set replacing window on non-existing app token "
+ token);
@@ -9290,9 +9195,9 @@ public class WindowManagerService extends IWindowManager.Stub
*/
// TODO: The s at the end of the method name is the only difference with the name of the method
// above. We should combine them or find better names.
- public void setWillReplaceWindows(IBinder token, boolean childrenOnly) {
+ void setWillReplaceWindows(IBinder token, boolean childrenOnly) {
synchronized (mWindowMap) {
- final AppWindowToken appWindowToken = findAppWindowToken(token);
+ final AppWindowToken appWindowToken = mRoot.getAppWindowToken(token);
if (appWindowToken == null || !appWindowToken.hasContentToDisplay()) {
Slog.w(TAG_WM, "Attempted to set replacing window on non-existing app token "
+ token);
@@ -9320,7 +9225,7 @@ public class WindowManagerService extends IWindowManager.Stub
*/
public void scheduleClearWillReplaceWindows(IBinder token, boolean replacing) {
synchronized (mWindowMap) {
- final AppWindowToken appWindowToken = findAppWindowToken(token);
+ final AppWindowToken appWindowToken = mRoot.getAppWindowToken(token);
if (appWindowToken == null) {
Slog.w(TAG_WM, "Attempted to reset replacing window on non-existing app token "
+ token);
@@ -9785,9 +9690,12 @@ public class WindowManagerService extends IWindowManager.Stub
public void removeWindowToken(IBinder token, boolean removeWindows) {
synchronized(mWindowMap) {
if (removeWindows) {
- final WindowToken wtoken = mTokenMap.remove(token);
- if (wtoken != null) {
- wtoken.removeAllWindows();
+ final ArrayList<WindowToken> removedTokens = mRoot.removeWindowToken(token);
+ if (removedTokens != null && !removedTokens.isEmpty()) {
+ for (int i = removedTokens.size() - 1; i >= 0; --i) {
+ final WindowToken wtoken = removedTokens.get(i);
+ wtoken.removeAllWindows();
+ }
}
}
WindowManagerService.this.removeWindowToken(token);
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 435b1d2c99d8..272bc9dc7984 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -71,6 +71,7 @@ import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_
import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION;
import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_VISIBLE;
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
+import static android.view.WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW;
import static android.view.WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND;
import static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
@@ -157,7 +158,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// to capture touch events in that area.
static final int RESIZE_HANDLE_WIDTH_IN_DP = 30;
- static final boolean DEBUG_DISABLE_SAVING_SURFACES = false;
+ private static final boolean DEBUG_DISABLE_SAVING_SURFACES = false;
final WindowManagerService mService;
final WindowManagerPolicy mPolicy;
@@ -182,7 +183,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
final boolean mLayoutAttached;
final boolean mIsImWindow;
final boolean mIsWallpaper;
- final boolean mIsFloatingLayer;
+ private final boolean mIsFloatingLayer;
int mSeq;
boolean mEnforceSizeCompat;
int mViewVisibility;
@@ -199,16 +200,16 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
* animation is done.
*/
boolean mPolicyVisibilityAfterAnim = true;
- boolean mAppOpVisibility = true;
+ private boolean mAppOpVisibility = true;
boolean mPermanentlyHidden; // the window should never be shown again
boolean mAppFreezing;
boolean mHidden; // Used to determine if to show child windows.
boolean mWallpaperVisible; // for wallpaper, what was last vis report?
- boolean mDragResizing;
- boolean mDragResizingChangeReported;
- int mResizeMode;
+ private boolean mDragResizing;
+ private boolean mDragResizingChangeReported;
+ private int mResizeMode;
- RemoteCallbackList<IWindowFocusObserver> mFocusCallbacks;
+ private RemoteCallbackList<IWindowFocusObserver> mFocusCallbacks;
/**
* The window size that was requested by the application. These are in
@@ -216,8 +217,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
*/
int mRequestedWidth;
int mRequestedHeight;
- int mLastRequestedWidth;
- int mLastRequestedHeight;
+ private int mLastRequestedWidth;
+ private int mLastRequestedHeight;
int mLayer;
boolean mHaveFrame;
@@ -244,8 +245,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
* coordinate space (without compatibility scale applied).
*/
final Rect mVisibleInsets = new Rect();
- final Rect mLastVisibleInsets = new Rect();
- boolean mVisibleInsetsChanged;
+ private final Rect mLastVisibleInsets = new Rect();
+ private boolean mVisibleInsetsChanged;
/**
* Insets that are covered by system windows (such as the status bar) and
@@ -254,31 +255,31 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
*/
final Rect mContentInsets = new Rect();
final Rect mLastContentInsets = new Rect();
- boolean mContentInsetsChanged;
+ private boolean mContentInsetsChanged;
/**
* Insets that determine the area covered by the display overscan region. These are in the
* application's coordinate space (without compatibility scale applied).
*/
final Rect mOverscanInsets = new Rect();
- final Rect mLastOverscanInsets = new Rect();
- boolean mOverscanInsetsChanged;
+ private final Rect mLastOverscanInsets = new Rect();
+ private boolean mOverscanInsetsChanged;
/**
* Insets that determine the area covered by the stable system windows. These are in the
* application's coordinate space (without compatibility scale applied).
*/
final Rect mStableInsets = new Rect();
- final Rect mLastStableInsets = new Rect();
- boolean mStableInsetsChanged;
+ private final Rect mLastStableInsets = new Rect();
+ private boolean mStableInsetsChanged;
/**
* Outsets determine the area outside of the surface where we want to pretend that it's possible
* to draw anyway.
*/
final Rect mOutsets = new Rect();
- final Rect mLastOutsets = new Rect();
- boolean mOutsetsChanged = false;
+ private final Rect mLastOutsets = new Rect();
+ private boolean mOutsetsChanged = false;
/**
* Set to true if we are waiting for this window to receive its
@@ -321,14 +322,14 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// "Real" frame that the application sees, in display coordinate space.
final Rect mFrame = new Rect();
final Rect mLastFrame = new Rect();
- boolean mFrameSizeChanged = false;
+ private boolean mFrameSizeChanged = false;
// Frame that is scaled to the application's coordinate space when in
// screen size compatibility mode.
final Rect mCompatFrame = new Rect();
final Rect mContainingFrame = new Rect();
- final Rect mParentFrame = new Rect();
+ private final Rect mParentFrame = new Rect();
// The entire screen area of the {@link TaskStack} this window is in. Usually equal to the
// screen area of the device.
@@ -338,11 +339,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// is mostly a special case for TV where some displays don’t have the entire display usable.
// {@link WindowManager.LayoutParams#FLAG_LAYOUT_IN_OVERSCAN} flag can be used to allow
// window display contents to extend into the overscan region.
- final Rect mOverscanFrame = new Rect();
+ private final Rect mOverscanFrame = new Rect();
// The display frame minus the stable insets. This value is always constant regardless of if
// the status bar or navigation bar is visible.
- final Rect mStableFrame = new Rect();
+ private final Rect mStableFrame = new Rect();
// The area not occupied by the status and navigation bars. So, if both status and navigation
// bars are visible, the decor frame is equal to the stable frame.
@@ -350,7 +351,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// Equal to the decor frame if the IME (e.g. keyboard) is not present. Equal to the decor frame
// minus the area occupied by the IME if the IME is present.
- final Rect mContentFrame = new Rect();
+ private final Rect mContentFrame = new Rect();
// Legacy stuff. Generally equal to the content frame expect when the IME for older apps
// displays hint text.
@@ -358,13 +359,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// Frame that includes dead area outside of the surface but where we want to pretend that it's
// possible to draw.
- final Rect mOutsetFrame = new Rect();
+ private final Rect mOutsetFrame = new Rect();
/**
* Usually empty. Set to the task's tempInsetFrame. See
*{@link android.app.IActivityManager#resizeDockedStack}.
*/
- final Rect mInsetFrame = new Rect();
+ private final Rect mInsetFrame = new Rect();
boolean mContentChanged;
@@ -446,7 +447,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
* or some other higher level component said so (e.g. activity manager).
* TODO: We should either have different booleans for the removal reason or use a bit-field.
*/
- boolean mWindowRemovalAllowed;
+ private boolean mWindowRemovalAllowed;
/**
* Temp for keeping track of windows that have been removed when
@@ -457,20 +458,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// Input channel and input window handle used by the input dispatcher.
final InputWindowHandle mInputWindowHandle;
InputChannel mInputChannel;
- InputChannel mClientChannel;
+ private InputChannel mClientChannel;
// Used to improve performance of toString()
- String mStringNameCache;
- CharSequence mLastTitle;
- boolean mWasExiting;
+ private String mStringNameCache;
+ private CharSequence mLastTitle;
+ private boolean mWasExiting;
final WindowStateAnimator mWinAnimator;
boolean mHasSurface = false;
- boolean mNotOnAppsDisplay = false;
- DisplayContent mDisplayContent;
-
/** When true this window can be displayed on screens owther than mOwnerUid's */
private boolean mShowToOwnerOnly;
@@ -486,26 +484,26 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// Whether the window was visible when we set the app to invisible last time. WM uses
// this as a hint to restore the surface (if available) for early animation next time
// the app is brought visible.
- boolean mWasVisibleBeforeClientHidden;
+ private boolean mWasVisibleBeforeClientHidden;
// This window will be replaced due to relaunch. This allows window manager
// to differentiate between simple removal of a window and replacement. In the latter case it
// will preserve the old window until the new one is drawn.
boolean mWillReplaceWindow = false;
// If true, the replaced window was already requested to be removed.
- boolean mReplacingRemoveRequested = false;
+ private boolean mReplacingRemoveRequested = false;
// Whether the replacement of the window should trigger app transition animation.
- boolean mAnimateReplacingWindow = false;
+ private boolean mAnimateReplacingWindow = false;
// If not null, the window that will be used to replace the old one. This is being set when
// the window is added and unset when this window reports its first draw.
- WindowState mReplacementWindow = null;
+ private WindowState mReplacementWindow = null;
// For the new window in the replacement transition, if we have
// requested to replace without animation, then we should
// make sure we also don't apply an enter animation for
// the new window.
boolean mSkipEnterAnimationForSeamlessReplacement = false;
// Whether this window is being moved via the resize API
- boolean mMovedByResize;
+ private boolean mMovedByResize;
/**
* Wake lock for drawing.
@@ -514,7 +512,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
* who is preventing the system from suspending.
* This lock is only acquired on first use.
*/
- PowerManager.WakeLock mDrawLock;
+ private PowerManager.WakeLock mDrawLock;
final private Rect mTmpRect = new Rect();
@@ -563,7 +561,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
WindowState parentWindow, int appOp, int seq, WindowManager.LayoutParams a,
- int viewVisibility, final DisplayContent displayContent, int ownerId) {
+ int viewVisibility, int ownerId) {
mService = service;
mSession = s;
mClient = c;
@@ -587,7 +585,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
};
mAttrs.copyFrom(a);
mViewVisibility = viewVisibility;
- mDisplayContent = displayContent;
mPolicy = mService.mPolicy;
mContext = mService.mContext;
DeathRecipient deathRecipient = new DeathRecipient();
@@ -643,15 +640,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
mIsFloatingLayer = mIsImWindow || mIsWallpaper;
- if (mAppToken != null) {
- final DisplayContent appDisplay = getDisplayContent();
- mNotOnAppsDisplay = displayContent != appDisplay;
-
- if (mAppToken.showForAllUsers) {
- // Windows for apps that can show for all users should also show when the
- // device is locked.
- mAttrs.flags |= FLAG_SHOW_WHEN_LOCKED;
- }
+ if (mAppToken != null && mAppToken.showForAllUsers) {
+ // Windows for apps that can show for all users should also show when the device is
+ // locked.
+ mAttrs.flags |= FLAG_SHOW_WHEN_LOCKED;
}
mWinAnimator = new WindowStateAnimator(this);
@@ -666,7 +658,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mLayer = 0;
mInputWindowHandle = new InputWindowHandle(
mAppToken != null ? mAppToken.mInputApplicationHandle : null, this,
- displayContent.getDisplayId());
+ getDisplayContent().getDisplayId());
}
void attach() {
@@ -714,6 +706,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
final Task task = getTask();
final boolean fullscreenTask = !isInMultiWindowMode();
final boolean windowsAreFloating = task != null && task.isFloating();
+ final DisplayContent dc = getDisplayContent();
// If the task has temp inset bounds set, we have to make sure all its windows uses
// the temp inset frame. Otherwise different display frames get applied to the main
@@ -779,8 +772,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
layoutXDiff = !mInsetFrame.isEmpty() ? mInsetFrame.left - mContainingFrame.left : 0;
layoutYDiff = !mInsetFrame.isEmpty() ? mInsetFrame.top - mContainingFrame.top : 0;
layoutContainingFrame = !mInsetFrame.isEmpty() ? mInsetFrame : mContainingFrame;
- mTmpRect.set(0, 0, mDisplayContent.getDisplayInfo().logicalWidth,
- mDisplayContent.getDisplayInfo().logicalHeight);
+ mTmpRect.set(0, 0, dc.getDisplayInfo().logicalWidth, dc.getDisplayInfo().logicalHeight);
subtractInsets(mDisplayFrame, layoutContainingFrame, df, mTmpRect);
if (!layoutInParentFrame()) {
subtractInsets(mContainingFrame, layoutContainingFrame, pf, mTmpRect);
@@ -852,7 +844,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mVisibleFrame.set(mContentFrame);
mStableFrame.set(mContentFrame);
} else if (mAttrs.type == TYPE_DOCK_DIVIDER) {
- mDisplayContent.getDockedDividerController().positionDockedStackedDivider(mFrame);
+ dc.getDockedDividerController().positionDockedStackedDivider(mFrame);
mContentFrame.set(mFrame);
if (!mFrame.equals(mLastFrame)) {
mMovedByResize = true;
@@ -1187,20 +1179,16 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
}
- public DisplayContent getDisplayContent() {
- if (mAppToken == null || mNotOnAppsDisplay) {
- return mDisplayContent;
- }
- final TaskStack stack = getStack();
- return stack == null ? mDisplayContent : stack.getDisplayContent();
+ DisplayContent getDisplayContent() {
+ return mToken.getDisplayContent();
}
- public DisplayInfo getDisplayInfo() {
+ DisplayInfo getDisplayInfo() {
final DisplayContent displayContent = getDisplayContent();
return displayContent != null ? displayContent.getDisplayInfo() : null;
}
- public int getDisplayId() {
+ int getDisplayId() {
final DisplayContent displayContent = getDisplayContent();
if (displayContent == null) {
return -1;
@@ -1221,8 +1209,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
// Some system windows (e.g. "Power off" dialog) don't have a task, but we would still
// associate them with some stack to enable dimming.
- return mAttrs.type >= WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW
- && mDisplayContent != null ? mDisplayContent.getHomeStack() : null;
+ final DisplayContent dc = getDisplayContent();
+ return mAttrs.type >= FIRST_SYSTEM_WINDOW && dc != null ? dc.getHomeStack() : null;
}
/**
@@ -2000,12 +1988,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
void scheduleAnimationIfDimming() {
- if (mDisplayContent == null) {
+ final DisplayContent dc = getDisplayContent();
+ if (dc == null) {
return;
}
final DimLayer.DimLayerUser dimLayerUser = getDimLayerUser();
- if (dimLayerUser != null && mDisplayContent.mDimLayerController.isDimming(
- dimLayerUser, mWinAnimator)) {
+ if (dimLayerUser != null && dc.mDimLayerController.isDimming(dimLayerUser, mWinAnimator)) {
// Force an animation pass just to update the mDimLayer layer.
mService.scheduleAnimationLocked();
}
@@ -2118,16 +2106,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
return;
}
+ final DisplayContent dc = getDisplayContent();
if (!mAnimatingExit && mAppDied) {
// If app died visible, apply a dim over the window to indicate that it's inactive
- mDisplayContent.mDimLayerController.applyDimAbove(getDimLayerUser(), mWinAnimator);
+ dc.mDimLayerController.applyDimAbove(getDimLayerUser(), mWinAnimator);
} else if ((mAttrs.flags & FLAG_DIM_BEHIND) != 0
- && mDisplayContent != null && !mAnimatingExit && isVisibleUnchecked()) {
- mDisplayContent.mDimLayerController.applyDimBehind(getDimLayerUser(), mWinAnimator);
+ && dc != null && !mAnimatingExit && isVisibleUnchecked()) {
+ dc.mDimLayerController.applyDimBehind(getDimLayerUser(), mWinAnimator);
}
}
- DimLayer.DimLayerUser getDimLayerUser() {
+ private DimLayer.DimLayerUser getDimLayerUser() {
Task task = getTask();
if (task != null) {
return task;
@@ -2186,8 +2175,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
void setDisplayLayoutNeeded() {
- if (mDisplayContent != null) {
- mDisplayContent.setLayoutNeeded();
+ final DisplayContent dc = getDisplayContent();
+ if (dc != null) {
+ dc.setLayoutNeeded();
}
}
@@ -2908,18 +2898,19 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
@Override
public boolean isDimming() {
final DimLayer.DimLayerUser dimLayerUser = getDimLayerUser();
- return dimLayerUser != null && mDisplayContent != null &&
- mDisplayContent.mDimLayerController.isDimming(dimLayerUser, mWinAnimator);
+ final DisplayContent dc = getDisplayContent();
+ return dimLayerUser != null && dc != null
+ && dc.mDimLayerController.isDimming(dimLayerUser, mWinAnimator);
}
- public void setShowToOwnerOnlyLocked(boolean showToOwnerOnly) {
+ void setShowToOwnerOnlyLocked(boolean showToOwnerOnly) {
mShowToOwnerOnly = showToOwnerOnly;
}
boolean isHiddenFromUserLocked() {
// Child windows are evaluated based on their parent window.
final WindowState win = getTopParentWindow();
- if (win.mAttrs.type < WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW
+ if (win.mAttrs.type < FIRST_SYSTEM_WINDOW
&& win.mAppToken != null && win.mAppToken.showForAllUsers) {
// All window frames that are fullscreen extend above status bar, but some don't extend
@@ -3214,7 +3205,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
* @return Whether we reported "resize while not drag resizing" to the application.
* @see #isResizedWhileNotDragResizing()
*/
- boolean isResizedWhileNotDragResizingReported() {
+ private boolean isResizedWhileNotDragResizingReported() {
return mResizedWhileNotDragResizingReported;
}
@@ -3222,7 +3213,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
return mResizeMode;
}
- boolean computeDragResizing() {
+ private boolean computeDragResizing() {
final Task task = getTask();
if (task == null) {
return false;
@@ -3240,7 +3231,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// and the bounds we clip this window to might be different. In order to avoid holes, we
// simulate that we are still resizing so the app fills the hole with the resizing
// background.
- return (mDisplayContent.mDividerControllerLocked.isResizing()
+ return (getDisplayContent().mDividerControllerLocked.isResizing()
|| mAppToken != null && !mAppToken.mFrozenBounds.isEmpty()) &&
!task.inFreeformWorkspace() && !isGoneForLayoutLw();
@@ -3256,7 +3247,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
if (task != null && task.isDragResizing()) {
mResizeMode = task.getDragResizeMode();
} else {
- mResizeMode = mDragResizing && mDisplayContent.mDividerControllerLocked.isResizing()
+ mResizeMode = mDragResizing && getDisplayContent().mDividerControllerLocked.isResizing()
? DRAG_RESIZE_MODE_DOCKED_DIVIDER
: DRAG_RESIZE_MODE_FREEFORM;
}
@@ -3276,9 +3267,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
if (stack != null) {
pw.print(" stackId="); pw.print(stack.mStackId);
}
- if (mNotOnAppsDisplay) {
- pw.print(" mNotOnAppsDisplay="); pw.print(mNotOnAppsDisplay);
- }
pw.print(" mSession="); pw.print(mSession);
pw.print(" mClient="); pw.println(mClient.asBinder());
pw.print(prefix); pw.print("mOwnerUid="); pw.print(mOwnerUid);
@@ -3664,9 +3652,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
void requestUpdateWallpaperIfNeeded() {
- if (mDisplayContent != null && (mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) {
- mDisplayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
- mDisplayContent.setLayoutNeeded();
+ final DisplayContent dc = getDisplayContent();
+ if (dc != null && (mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) {
+ dc.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
+ dc.setLayoutNeeded();
mService.mWindowPlacerLocked.requestTraversal();
}
@@ -3692,12 +3681,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
return winY;
}
- void transferDimToReplacement() {
+ private void transferDimToReplacement() {
final DimLayer.DimLayerUser dimLayerUser = getDimLayerUser();
- if (dimLayerUser != null && mDisplayContent != null) {
- mDisplayContent.mDimLayerController.applyDim(dimLayerUser,
- mReplacementWindow.mWinAnimator,
- (mAttrs.flags & FLAG_DIM_BEHIND) != 0 ? true : false);
+ final DisplayContent dc = getDisplayContent();
+ if (dimLayerUser != null && dc != null) {
+ dc.mDimLayerController.applyDim(dimLayerUser,
+ mReplacementWindow.mWinAnimator, (mAttrs.flags & FLAG_DIM_BEHIND) != 0);
}
}
@@ -3795,13 +3784,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
if (mAttrs.type == TYPE_INPUT_METHOD) {
- mDisplayContent.mDividerControllerLocked.resetImeHideRequested();
+ getDisplayContent().mDividerControllerLocked.resetImeHideRequested();
}
return true;
}
- void logPerformShow(String prefix) {
+ private void logPerformShow(String prefix) {
if (DEBUG_VISIBILITY
|| (DEBUG_STARTING_WINDOW && mAttrs.type == TYPE_APPLICATION_STARTING)) {
Slog.v(TAG, prefix + this
@@ -3811,11 +3800,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
+ " during animation: policyVis=" + mPolicyVisibility
+ " parentHidden=" + isParentWindowHidden()
+ " tok.hiddenRequested="
- + (mAppToken != null ? mAppToken.hiddenRequested : false)
- + " tok.hidden=" + (mAppToken != null ? mAppToken.hidden : false)
+ + (mAppToken != null && mAppToken.hiddenRequested)
+ + " tok.hidden=" + (mAppToken != null && mAppToken.hidden)
+ " animating=" + mWinAnimator.mAnimating
+ " tok animating="
- + (mWinAnimator.mAppAnimator != null ? mWinAnimator.mAppAnimator.animating : false)
+ + (mWinAnimator.mAppAnimator != null && mWinAnimator.mAppAnimator.animating)
+ " Callers=" + Debug.getCallers(4));
}
}
@@ -3873,13 +3862,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
@Override
- int rebuildWindowList(DisplayContent dc, int addIndex) {
- final DisplayContent winDisplayContent = getDisplayContent();
- if (winDisplayContent == dc || winDisplayContent == null) {
- mDisplayContent = dc;
- return reAddWindow(addIndex);
- }
- return addIndex;
+ int rebuildWindowList(int addIndex) {
+ return reAddWindow(addIndex);
}
// TODO: come-up with a better name for this method that represents what it does.
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 1fae77d46189..65bfbf462dbe 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -1750,7 +1750,7 @@ class WindowStateAnimator {
Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
if (mWin.mAttrs.type == TYPE_INPUT_METHOD) {
- mWin.mDisplayContent.adjustForImeIfNeeded();
+ mWin.getDisplayContent().adjustForImeIfNeeded();
if (isEntrance) {
mWin.setDisplayLayoutNeeded();
mService.mWindowPlacerLocked.requestTraversal();
diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
index f4d5c8e898f9..cbdd181ca986 100644
--- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
+++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
@@ -9,7 +9,6 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.TYPE_DREAM;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
-import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
import static com.android.server.wm.AppTransition.TRANSIT_ACTIVITY_CLOSE;
import static com.android.server.wm.AppTransition.TRANSIT_ACTIVITY_OPEN;
import static com.android.server.wm.AppTransition.TRANSIT_TASK_CLOSE;
@@ -897,6 +896,6 @@ class WindowSurfacePlacer {
public void dump(PrintWriter pw, String prefix) {
pw.println(prefix + "mTraversalScheduled=" + mTraversalScheduled);
pw.println(prefix + "mHoldScreenWindow=" + mService.mRoot.mHoldScreenWindow);
- pw.println(prefix + "mObsuringWindow=" + mService.mRoot.mObsuringWindow);
+ pw.println(prefix + "mObscuringWindow=" + mService.mRoot.mObscuringWindow);
}
}
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index 166107c2e71f..28c9e5ed6802 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -78,12 +78,16 @@ class WindowToken extends WindowContainer<WindowState> {
// windows will be put to the bottom of the list.
boolean sendingToBottom;
- WindowToken(WindowManagerService service, IBinder _token, int type, boolean _explicit) {
+ // The display this token is on.
+ private DisplayContent mDisplayContent;
+
+ WindowToken(WindowManagerService service, IBinder _token, int type, boolean _explicit,
+ DisplayContent dc) {
mService = service;
token = _token;
windowType = type;
explicit = _explicit;
- mService.mTokenMap.put(token, this);
+ onDisplayChanged(dc);
}
void removeAllWindows() {
@@ -400,6 +404,33 @@ class WindowToken extends WindowContainer<WindowState> {
return null;
}
+ DisplayContent getDisplayContent() {
+ return mDisplayContent;
+ }
+
+ @Override
+ void removeImmediately() {
+ super.removeImmediately();
+ if (mDisplayContent != null) {
+ mDisplayContent.removeWindowToken(token);
+ mService.mRoot.removeWindowTokenIfPossible(token);
+ }
+ }
+
+ void onDisplayChanged(DisplayContent dc) {
+ if (mDisplayContent == dc) {
+ return;
+ }
+
+ if (mDisplayContent != null) {
+ mDisplayContent.removeWindowToken(token);
+ }
+ mDisplayContent = dc;
+ mDisplayContent.setWindowToken(token, this);
+
+ super.onDisplayChanged(dc);
+ }
+
void dump(PrintWriter pw, String prefix) {
pw.print(prefix); pw.print("windows="); pw.println(mChildren);
pw.print(prefix); pw.print("windowType="); pw.print(windowType);
diff --git a/services/core/jni/Android.mk b/services/core/jni/Android.mk
index 9459517caed7..b3bfc16e6320 100644
--- a/services/core/jni/Android.mk
+++ b/services/core/jni/Android.mk
@@ -7,7 +7,6 @@ LOCAL_CFLAGS += -Wall -Werror -Wno-unused-parameter
LOCAL_SRC_FILES += \
$(LOCAL_REL_DIR)/com_android_server_AlarmManagerService.cpp \
$(LOCAL_REL_DIR)/com_android_server_am_BatteryStatsService.cpp \
- $(LOCAL_REL_DIR)/com_android_server_AssetAtlasService.cpp \
$(LOCAL_REL_DIR)/com_android_server_connectivity_Vpn.cpp \
$(LOCAL_REL_DIR)/com_android_server_ConsumerIrService.cpp \
$(LOCAL_REL_DIR)/com_android_server_HardwarePropertiesManagerService.cpp \
@@ -65,4 +64,11 @@ LOCAL_SHARED_LIBRARIES += \
libEGL \
libGLESv2 \
libnetutils \
+ libhidl \
+ libhwbinder \
+ libutils \
+ android.hardware.power@1.0 \
+
+LOCAL_SHARED_LIBRARIES += \
+ libhidl libhwbinder android.hardware.vibrator@1.0
diff --git a/services/core/jni/com_android_server_AssetAtlasService.cpp b/services/core/jni/com_android_server_AssetAtlasService.cpp
deleted file mode 100644
index d004e3022230..000000000000
--- a/services/core/jni/com_android_server_AssetAtlasService.cpp
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#define LOG_TAG "AssetAtlasService"
-
-#include "jni.h"
-#include "JNIHelp.h"
-#include "android/graphics/GraphicsJNI.h"
-
-#include <android_view_GraphicBuffer.h>
-#include <cutils/log.h>
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-
-// Disable warnings for Skia.
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#include <SkCanvas.h>
-#include <SkBitmap.h>
-#pragma GCC diagnostic pop
-
-namespace android {
-
-// ----------------------------------------------------------------------------
-// Defines
-// ----------------------------------------------------------------------------
-
-// Defines how long to wait for the GPU when uploading the atlas
-// This timeout is defined in nanoseconds (see EGL_KHR_fence_sync extension)
-#define FENCE_TIMEOUT 2000000000
-
-// ----------------------------------------------------------------------------
-// Canvas management
-// ----------------------------------------------------------------------------
-
-#define CLEANUP_GL_AND_RETURN(result) \
- if (fence != EGL_NO_SYNC_KHR) eglDestroySyncKHR(display, fence); \
- if (image) eglDestroyImageKHR(display, image); \
- if (texture) glDeleteTextures(1, &texture); \
- if (surface != EGL_NO_SURFACE) eglDestroySurface(display, surface); \
- if (context != EGL_NO_CONTEXT) eglDestroyContext(display, context); \
- eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); \
- eglReleaseThread(); \
- eglTerminate(display); \
- return result;
-
-static jboolean com_android_server_AssetAtlasService_upload(JNIEnv* env, jobject,
- jobject graphicBuffer, jobject bitmapHandle) {
-
- SkBitmap bitmap;
- GraphicsJNI::getSkBitmap(env, bitmapHandle, &bitmap);
- SkAutoLockPixels alp(bitmap);
-
- // The goal of this method is to copy the bitmap into the GraphicBuffer
- // using the GPU to swizzle the texture content
- sp<GraphicBuffer> buffer(graphicBufferForJavaObject(env, graphicBuffer));
-
- if (buffer != NULL) {
- EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- if (display == EGL_NO_DISPLAY) return JNI_FALSE;
-
- EGLint major;
- EGLint minor;
- if (!eglInitialize(display, &major, &minor)) {
- ALOGW("Could not initialize EGL");
- return JNI_FALSE;
- }
-
- // We're going to use a 1x1 pbuffer surface later on
- // The configuration doesn't really matter for what we're trying to do
- EGLint configAttrs[] = {
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_RED_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_BLUE_SIZE, 8,
- EGL_ALPHA_SIZE, 0,
- EGL_DEPTH_SIZE, 0,
- EGL_STENCIL_SIZE, 0,
- EGL_NONE
- };
- EGLConfig configs[1];
- EGLint configCount;
- if (!eglChooseConfig(display, configAttrs, configs, 1, &configCount)) {
- ALOGW("Could not select EGL configuration");
- eglReleaseThread();
- eglTerminate(display);
- return JNI_FALSE;
- }
- if (configCount <= 0) {
- ALOGW("Could not find EGL configuration");
- eglReleaseThread();
- eglTerminate(display);
- return JNI_FALSE;
- }
-
- // These objects are initialized below but the default "null"
- // values are used to cleanup properly at any point in the
- // initialization sequence
- GLuint texture = 0;
- EGLImageKHR image = EGL_NO_IMAGE_KHR;
- EGLSurface surface = EGL_NO_SURFACE;
- EGLSyncKHR fence = EGL_NO_SYNC_KHR;
-
- EGLint attrs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
- EGLContext context = eglCreateContext(display, configs[0], EGL_NO_CONTEXT, attrs);
- if (context == EGL_NO_CONTEXT) {
- ALOGW("Could not create EGL context");
- CLEANUP_GL_AND_RETURN(JNI_FALSE);
- }
-
- // Create the 1x1 pbuffer
- EGLint surfaceAttrs[] = { EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE };
- surface = eglCreatePbufferSurface(display, configs[0], surfaceAttrs);
- if (surface == EGL_NO_SURFACE) {
- ALOGW("Could not create EGL surface");
- CLEANUP_GL_AND_RETURN(JNI_FALSE);
- }
-
- if (!eglMakeCurrent(display, surface, surface, context)) {
- ALOGW("Could not change current EGL context");
- CLEANUP_GL_AND_RETURN(JNI_FALSE);
- }
-
- // We use an EGLImage to access the content of the GraphicBuffer
- // The EGL image is later bound to a 2D texture
- EGLClientBuffer clientBuffer = (EGLClientBuffer) buffer->getNativeBuffer();
- EGLint imageAttrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE };
- image = eglCreateImageKHR(display, EGL_NO_CONTEXT,
- EGL_NATIVE_BUFFER_ANDROID, clientBuffer, imageAttrs);
- if (image == EGL_NO_IMAGE_KHR) {
- ALOGW("Could not create EGL image");
- CLEANUP_GL_AND_RETURN(JNI_FALSE);
- }
-
- glGenTextures(1, &texture);
- glBindTexture(GL_TEXTURE_2D, texture);
- glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
- if (glGetError() != GL_NO_ERROR) {
- ALOGW("Could not create/bind texture");
- CLEANUP_GL_AND_RETURN(JNI_FALSE);
- }
-
- // Upload the content of the bitmap in the GraphicBuffer
- glPixelStorei(GL_UNPACK_ALIGNMENT, bitmap.bytesPerPixel());
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bitmap.width(), bitmap.height(),
- GL_RGBA, GL_UNSIGNED_BYTE, bitmap.getPixels());
- if (glGetError() != GL_NO_ERROR) {
- ALOGW("Could not upload to texture");
- CLEANUP_GL_AND_RETURN(JNI_FALSE);
- }
-
- // The fence is used to wait for the texture upload to finish
- // properly. We cannot rely on glFlush() and glFinish() as
- // some drivers completely ignore these API calls
- fence = eglCreateSyncKHR(display, EGL_SYNC_FENCE_KHR, NULL);
- if (fence == EGL_NO_SYNC_KHR) {
- ALOGW("Could not create sync fence %#x", eglGetError());
- CLEANUP_GL_AND_RETURN(JNI_FALSE);
- }
-
- // The flag EGL_SYNC_FLUSH_COMMANDS_BIT_KHR will trigger a
- // pipeline flush (similar to what a glFlush() would do.)
- EGLint waitStatus = eglClientWaitSyncKHR(display, fence,
- EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, FENCE_TIMEOUT);
- if (waitStatus != EGL_CONDITION_SATISFIED_KHR) {
- ALOGW("Failed to wait for the fence %#x", eglGetError());
- CLEANUP_GL_AND_RETURN(JNI_FALSE);
- }
-
- CLEANUP_GL_AND_RETURN(JNI_TRUE);
- }
-
- return JNI_FALSE;
-}
-
-// ----------------------------------------------------------------------------
-// JNI Glue
-// ----------------------------------------------------------------------------
-
-#define FIND_CLASS(var, className) \
- var = env->FindClass(className); \
- LOG_FATAL_IF(! (var), "Unable to find class " className);
-
-#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
- var = env->GetMethodID(clazz, methodName, methodDescriptor); \
- LOG_FATAL_IF(!(var), "Unable to find method " methodName);
-
-const char* const kClassPathName = "com/android/server/AssetAtlasService";
-
-static const JNINativeMethod gMethods[] = {
- { "nUploadAtlas", "(Landroid/view/GraphicBuffer;Landroid/graphics/Bitmap;)Z",
- (void*) com_android_server_AssetAtlasService_upload },
-};
-
-int register_android_server_AssetAtlasService(JNIEnv* env) {
- return jniRegisterNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
-}
-
-};
diff --git a/services/core/jni/com_android_server_VibratorService.cpp b/services/core/jni/com_android_server_VibratorService.cpp
index 03fbd19094ba..cc5226090fe2 100644
--- a/services/core/jni/com_android_server_VibratorService.cpp
+++ b/services/core/jni/com_android_server_VibratorService.cpp
@@ -16,6 +16,9 @@
#define LOG_TAG "VibratorService"
+#include <android/hardware/vibrator/1.0/IVibrator.h>
+#include <android/hardware/vibrator/1.0/types.h>
+
#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
@@ -26,32 +29,27 @@
#include <stdio.h>
+using android::hardware::getService;
+using android::hardware::vibrator::V1_0::IVibrator;
+using android::hardware::vibrator::V1_0::Status;
+
namespace android
{
-static hw_module_t *gVibraModule = NULL;
-static vibrator_device_t *gVibraDevice = NULL;
+static sp<IVibrator> mHal;
static void vibratorInit(JNIEnv /* env */, jobject /* clazz */)
{
- if (gVibraModule != NULL) {
+ /* TODO(b/31632518) */
+ if (mHal != nullptr) {
return;
}
-
- int err = hw_get_module(VIBRATOR_HARDWARE_MODULE_ID, (hw_module_t const**)&gVibraModule);
-
- if (err) {
- ALOGE("Couldn't load %s module (%s)", VIBRATOR_HARDWARE_MODULE_ID, strerror(-err));
- } else {
- if (gVibraModule) {
- vibrator_open(gVibraModule, &gVibraDevice);
- }
- }
+ mHal = IVibrator::getService("vibrator");
}
static jboolean vibratorExists(JNIEnv* /* env */, jobject /* clazz */)
{
- if (gVibraModule && gVibraDevice) {
+ if (mHal != nullptr) {
return JNI_TRUE;
} else {
return JNI_FALSE;
@@ -60,10 +58,10 @@ static jboolean vibratorExists(JNIEnv* /* env */, jobject /* clazz */)
static void vibratorOn(JNIEnv* /* env */, jobject /* clazz */, jlong timeout_ms)
{
- if (gVibraDevice) {
- int err = gVibraDevice->vibrator_on(gVibraDevice, timeout_ms);
- if (err != 0) {
- ALOGE("The hw module failed in vibrator_on: %s", strerror(-err));
+ if (mHal != nullptr) {
+ Status retStatus = mHal->on(timeout_ms);
+ if (retStatus == Status::ERR) {
+ ALOGE("vibratorOn command failed.");
}
} else {
ALOGW("Tried to vibrate but there is no vibrator device.");
@@ -72,10 +70,10 @@ static void vibratorOn(JNIEnv* /* env */, jobject /* clazz */, jlong timeout_ms)
static void vibratorOff(JNIEnv* /* env */, jobject /* clazz */)
{
- if (gVibraDevice) {
- int err = gVibraDevice->vibrator_off(gVibraDevice);
- if (err != 0) {
- ALOGE("The hw module failed in vibrator_off(): %s", strerror(-err));
+ if (mHal != nullptr) {
+ Status retStatus = mHal->off();
+ if (retStatus == Status::ERR) {
+ ALOGE("vibratorOff command failed.");
}
} else {
ALOGW("Tried to stop vibrating but there is no vibrator device.");
diff --git a/services/core/jni/com_android_server_am_BatteryStatsService.cpp b/services/core/jni/com_android_server_am_BatteryStatsService.cpp
index ecdc71e61270..b22d5e7bb7d8 100644
--- a/services/core/jni/com_android_server_am_BatteryStatsService.cpp
+++ b/services/core/jni/com_android_server_am_BatteryStatsService.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "BatteryStatsService"
//#define LOG_NDEBUG 0
+#include <android/hardware/power/1.0/IPower.h>
#include <android_runtime/AndroidRuntime.h>
#include <jni.h>
@@ -26,8 +27,6 @@
#include <cutils/log.h>
#include <utils/misc.h>
#include <utils/Log.h>
-#include <hardware/hardware.h>
-#include <hardware/power.h>
#include <suspend/autosuspend.h>
#include <inttypes.h>
@@ -41,6 +40,14 @@
#include <sys/types.h>
#include <unistd.h>
+using android::hardware::Return;
+using android::hardware::Void;
+using android::hardware::power::V1_0::IPower;
+using android::hardware::power::V1_0::PowerStatePlatformSleepState;
+using android::hardware::power::V1_0::PowerStateVoter;
+using android::hardware::power::V1_0::Status;
+using android::hardware::hidl_vec;
+
namespace android
{
@@ -49,7 +56,7 @@ namespace android
static bool wakeup_init = false;
static sem_t wakeup_sem;
-extern struct power_module* gPowerModule;
+extern sp<IPower> gPowerHal;
static void wakeup_callback(bool success)
{
@@ -174,86 +181,34 @@ static jint nativeWaitWakeup(JNIEnv *env, jobject clazz, jobject outBuf)
}
static jint getPlatformLowPowerStats(JNIEnv* env, jobject /* clazz */, jobject outBuf) {
- int num_modes = -1;
- char *output = (char*)env->GetDirectBufferAddress(outBuf), *offset = output;
+ char *output = (char*)env->GetDirectBufferAddress(outBuf);
+ char *offset = output;
int remaining = (int)env->GetDirectBufferCapacity(outBuf);
- power_state_platform_sleep_state_t *list;
- size_t *voter_list;
int total_added = -1;
if (outBuf == NULL) {
jniThrowException(env, "java/lang/NullPointerException", "null argument");
- goto error;
- }
-
- if (!gPowerModule) {
- ALOGE("%s: gPowerModule not loaded", POWER_HARDWARE_MODULE_ID);
- goto error;
- }
-
- if (! (gPowerModule->get_platform_low_power_stats && gPowerModule->get_number_of_platform_modes
- && gPowerModule->get_voter_list)) {
- ALOGE("%s: Missing API", POWER_HARDWARE_MODULE_ID);
- goto error;
- }
-
- if (gPowerModule->get_number_of_platform_modes) {
- num_modes = gPowerModule->get_number_of_platform_modes(gPowerModule);
- }
-
- if (num_modes < 1) {
- ALOGE("%s: Platform does not even have one low power mode", POWER_HARDWARE_MODULE_ID);
- goto error;
- }
-
- list = (power_state_platform_sleep_state_t *)calloc(num_modes,
- sizeof(power_state_platform_sleep_state_t));
- if (!list) {
- ALOGE("%s: power_state_platform_sleep_state_t allocation failed", POWER_HARDWARE_MODULE_ID);
- goto error;
- }
-
- voter_list = (size_t *)calloc(num_modes, sizeof(*voter_list));
- if (!voter_list) {
- ALOGE("%s: voter_list allocation failed", POWER_HARDWARE_MODULE_ID);
- goto err_free;
+ return -1;
}
- gPowerModule->get_voter_list(gPowerModule, voter_list);
-
- for (int i = 0; i < num_modes; i++) {
- list[i].voters = (power_state_voter_t *)calloc(voter_list[i],
- sizeof(power_state_voter_t));
- if (!list[i].voters) {
- ALOGE("%s: voter_t allocation failed", POWER_HARDWARE_MODULE_ID);
- goto err_free;
- }
+ if (gPowerHal == nullptr) {
+ ALOGE("gPowerHal not loaded");
+ return -1;
}
- if (!gPowerModule->get_platform_low_power_stats(gPowerModule, list)) {
- for (int i = 0; i < num_modes; i++) {
- int added;
-
- added = snprintf(offset, remaining,
- "state_%d name=%s time=%" PRIu64 " count=%" PRIu64 " ",
- i + 1, list[i].name, list[i].residency_in_msec_since_boot,
- list[i].total_transitions);
- if (added < 0) {
- break;
- }
- if (added > remaining) {
- added = remaining;
- }
- offset += added;
- remaining -= added;
- total_added += added;
+ gPowerHal->getPlatformLowPowerStats(
+ [&offset, &remaining, &total_added](hidl_vec<PowerStatePlatformSleepState> states,
+ Status status) {
+ if (status != Status::SUCCESS)
+ return;
+ for (size_t i = 0; i < states.size(); i++) {
+ int added;
+ const PowerStatePlatformSleepState& state = states[i];
- for (unsigned int j = 0; j < list[i].number_of_voters; j++) {
added = snprintf(offset, remaining,
- "voter_%d name=%s time=%" PRIu64 " count=%" PRIu64 " ",
- j + 1, list[i].voters[j].name,
- list[i].voters[j].total_time_in_msec_voted_for_since_boot,
- list[i].voters[j].total_number_of_times_voted_since_boot);
+ "state_%zu name=%s time=%" PRIu64 " count=%" PRIu64 " ",
+ i + 1, state.name.c_str(), state.residencyInMsecSinceBoot,
+ state.totalTransitions);
if (added < 0) {
break;
}
@@ -263,27 +218,37 @@ static jint getPlatformLowPowerStats(JNIEnv* env, jobject /* clazz */, jobject o
offset += added;
remaining -= added;
total_added += added;
- }
- if (remaining <= 0) {
- /* rewrite NULL character*/
- offset--;
- total_added--;
- ALOGE("%s module: buffer not enough", POWER_HARDWARE_MODULE_ID);
- break;
+ for (size_t j = 0; j < state.voters.size(); j++) {
+ const PowerStateVoter& voter = state.voters[j];
+ added = snprintf(offset, remaining,
+ "voter_%zu name=%s time=%" PRIu64 " count=%" PRIu64 " ",
+ j + 1, voter.name.c_str(),
+ voter.totalTimeInMsecVotedForSinceBoot,
+ voter.totalNumberOfTimesVotedSinceBoot);
+ if (added < 0) {
+ break;
+ }
+ if (added > remaining) {
+ added = remaining;
+ }
+ offset += added;
+ remaining -= added;
+ total_added += added;
+ }
+
+ if (remaining <= 0) {
+ /* rewrite NULL character*/
+ offset--;
+ total_added--;
+ ALOGE("PowerHal: buffer not enough");
+ break;
+ }
}
}
- }
+ );
*offset = 0;
total_added += 1;
-
-err_free:
- for (int i = 0; i < num_modes; i++) {
- free(list[i].voters);
- }
- free(list);
- free(voter_list);
-error:
return total_added;
}
diff --git a/services/core/jni/com_android_server_power_PowerManagerService.cpp b/services/core/jni/com_android_server_power_PowerManagerService.cpp
index 048ef76ed426..b2372a3eb84c 100644
--- a/services/core/jni/com_android_server_power_PowerManagerService.cpp
+++ b/services/core/jni/com_android_server_power_PowerManagerService.cpp
@@ -18,6 +18,7 @@
//#define LOG_NDEBUG 0
+#include <android/hardware/power/1.0/IPower.h>
#include "JNIHelp.h"
#include "jni.h"
@@ -37,6 +38,13 @@
#include "com_android_server_power_PowerManagerService.h"
+using android::hardware::Return;
+using android::hardware::Void;
+using android::hardware::power::V1_0::IPower;
+using android::hardware::power::V1_0::PowerHint;
+using android::hardware::power::V1_0::Feature;
+using android::hardware::hidl_vec;
+
namespace android {
// ----------------------------------------------------------------------------
@@ -48,8 +56,7 @@ static struct {
// ----------------------------------------------------------------------------
static jobject gPowerManagerServiceObj;
-struct power_module* gPowerModule;
-
+sp<IPower> gPowerHal;
static nsecs_t gLastEventTime[USER_ACTIVITY_EVENT_LAST + 1];
// Throttling interval for user activity calls.
@@ -69,8 +76,8 @@ static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodNa
void android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t eventType) {
// Tell the power HAL when user activity occurs.
- if (gPowerModule && gPowerModule->powerHint) {
- gPowerModule->powerHint(gPowerModule, POWER_HINT_INTERACTION, NULL);
+ if (gPowerHal != nullptr) {
+ gPowerHal->powerHint(PowerHint::INTERACTION, 0);
}
if (gPowerManagerServiceObj) {
@@ -99,16 +106,13 @@ void android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t
}
// ----------------------------------------------------------------------------
-
+//TODO(b/31632518)
static void nativeInit(JNIEnv* env, jobject obj) {
gPowerManagerServiceObj = env->NewGlobalRef(obj);
- status_t err = hw_get_module(POWER_HARDWARE_MODULE_ID,
- (hw_module_t const**)&gPowerModule);
- if (!err) {
- gPowerModule->init(gPowerModule);
- } else {
- ALOGE("Couldn't load %s module (%s)", POWER_HARDWARE_MODULE_ID, strerror(-err));
+ gPowerHal = IPower::getService("power");
+ if (gPowerHal == nullptr) {
+ ALOGE("Couldn't load PowerHAL module");
}
}
@@ -123,13 +127,13 @@ static void nativeReleaseSuspendBlocker(JNIEnv *env, jclass /* clazz */, jstring
}
static void nativeSetInteractive(JNIEnv* /* env */, jclass /* clazz */, jboolean enable) {
- if (gPowerModule) {
+ if (gPowerHal != nullptr) {
if (enable) {
ALOGD_IF_SLOW(20, "Excessive delay in setInteractive(true) while turning screen on");
- gPowerModule->setInteractive(gPowerModule, true);
+ gPowerHal->setInteractive(true);
} else {
ALOGD_IF_SLOW(20, "Excessive delay in setInteractive(false) while turning screen off");
- gPowerModule->setInteractive(gPowerModule, false);
+ gPowerHal->setInteractive(false);
}
}
}
@@ -145,13 +149,11 @@ static void nativeSetAutoSuspend(JNIEnv* /* env */, jclass /* clazz */, jboolean
}
static void nativeSendPowerHint(JNIEnv *env, jclass clazz, jint hintId, jint data) {
- int data_param = data;
-
- if (gPowerModule && gPowerModule->powerHint) {
+ if (gPowerHal != nullptr) {
if(data)
- gPowerModule->powerHint(gPowerModule, (power_hint_t)hintId, &data_param);
+ gPowerHal->powerHint((PowerHint)hintId, data);
else {
- gPowerModule->powerHint(gPowerModule, (power_hint_t)hintId, NULL);
+ gPowerHal->powerHint((PowerHint)hintId, 0);
}
}
}
@@ -159,8 +161,8 @@ static void nativeSendPowerHint(JNIEnv *env, jclass clazz, jint hintId, jint dat
static void nativeSetFeature(JNIEnv *env, jclass clazz, jint featureId, jint data) {
int data_param = data;
- if (gPowerModule && gPowerModule->setFeature) {
- gPowerModule->setFeature(gPowerModule, (feature_t)featureId, data_param);
+ if (gPowerHal != nullptr) {
+ gPowerHal->setFeature((Feature)featureId, data_param ? true : false);
}
}
@@ -215,7 +217,7 @@ int register_android_server_PowerManagerService(JNIEnv* env) {
gLastEventTime[i] = LLONG_MIN;
}
gPowerManagerServiceObj = NULL;
- gPowerModule = NULL;
+ gPowerHal = NULL;
return 0;
}
diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp
index 327019d6bbd5..d69c37f0afea 100644
--- a/services/core/jni/onload.cpp
+++ b/services/core/jni/onload.cpp
@@ -21,7 +21,6 @@
namespace android {
int register_android_server_AlarmManagerService(JNIEnv* env);
-int register_android_server_AssetAtlasService(JNIEnv* env);
int register_android_server_BatteryStatsService(JNIEnv* env);
int register_android_server_ConsumerIrService(JNIEnv *env);
int register_android_server_InputApplicationHandle(JNIEnv* env);
@@ -76,7 +75,6 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
register_android_server_location_GnssLocationProvider(env);
register_android_server_location_FlpHardwareProvider(env);
register_android_server_connectivity_Vpn(env);
- register_android_server_AssetAtlasService(env);
register_android_server_ConsumerIrService(env);
register_android_server_BatteryStatsService(env);
register_android_server_hdmi_HdmiCecController(env);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index e7772f339f7a..47efa0549101 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -617,7 +617,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
static final long DEF_MAXIMUM_TIME_TO_UNLOCK = 0;
long maximumTimeToUnlock = DEF_MAXIMUM_TIME_TO_UNLOCK;
- long strongAuthUnlockTimeout = DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS;
+ long strongAuthUnlockTimeout = 0; // admin doesn't participate by default
static final int DEF_MAXIMUM_FAILED_PASSWORDS_FOR_WIPE = 0;
int maximumFailedPasswordsForWipe = DEF_MAXIMUM_FAILED_PASSWORDS_FOR_WIPE;
@@ -4254,10 +4254,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
return;
}
Preconditions.checkNotNull(who, "ComponentName is null");
- Preconditions.checkArgument(timeoutMs >= MINIMUM_STRONG_AUTH_TIMEOUT_MS,
- "Timeout must not be lower than the minimum strong auth timeout.");
- Preconditions.checkArgument(timeoutMs <= DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS,
- "Timeout must not be higher than the default strong auth timeout.");
+ Preconditions.checkArgument(timeoutMs >= 0, "Timeout must not be a negative number.");
+ // timeoutMs with value 0 means that the admin doesn't participate
+ // timeoutMs is clamped to the interval in case the internal constants change in the future
+ if (timeoutMs != 0 && timeoutMs < MINIMUM_STRONG_AUTH_TIMEOUT_MS) {
+ timeoutMs = MINIMUM_STRONG_AUTH_TIMEOUT_MS;
+ }
+ if (timeoutMs > DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS) {
+ timeoutMs = DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS;
+ }
final int userHandle = mInjector.userHandleGetCallingUserId();
synchronized (this) {
@@ -4273,7 +4278,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
/**
* Return a single admin's strong auth unlock timeout or minimum value (strictest) of all
* admins if who is null.
- * Returns default timeout if not configured.
+ * Returns 0 if not configured for the provided admin.
*/
@Override
public long getRequiredStrongAuthTimeout(ComponentName who, int userId, boolean parent) {
@@ -4284,9 +4289,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
synchronized (this) {
if (who != null) {
ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userId, parent);
- return admin != null ? Math.max(admin.strongAuthUnlockTimeout,
- MINIMUM_STRONG_AUTH_TIMEOUT_MS)
- : DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS;
+ return admin != null ? admin.strongAuthUnlockTimeout : 0;
}
// Return the strictest policy across all participating admins.
@@ -4294,8 +4297,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
long strongAuthUnlockTimeout = DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS;
for (int i = 0; i < admins.size(); i++) {
- strongAuthUnlockTimeout = Math.min(admins.get(i).strongAuthUnlockTimeout,
- strongAuthUnlockTimeout);
+ final long timeout = admins.get(i).strongAuthUnlockTimeout;
+ if (timeout != 0) { // take only participating admins into account
+ strongAuthUnlockTimeout = Math.min(timeout, strongAuthUnlockTimeout);
+ }
}
return Math.max(strongAuthUnlockTimeout, MINIMUM_STRONG_AUTH_TIMEOUT_MS);
}
@@ -8621,19 +8626,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
}
synchronized (this) {
if (mOwners.hasDeviceOwner()) {
- if (!mInjector.userManagerIsSplitSystemUser()) {
- // Only split-system-user systems support managed-profiles in combination with
- // device-owner.
- return false;
- }
- if (mOwners.getDeviceOwnerUserId() != UserHandle.USER_SYSTEM) {
- // Only system device-owner supports managed-profiles. Non-system device-owner
- // doesn't.
- return false;
- }
- if (callingUserId == UserHandle.USER_SYSTEM) {
- // Managed-profiles cannot be setup on the system user, only regular users.
- return false;
+ // STOPSHIP Only allow creating a managed profile if allowed by the device
+ // owner. http://b/31952368
+ if (mInjector.userManagerIsSplitSystemUser()) {
+ if (callingUserId == UserHandle.USER_SYSTEM) {
+ // Managed-profiles cannot be setup on the system user.
+ return false;
+ }
}
}
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 769b5ee92997..deb52383fb6b 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -747,7 +747,6 @@ public final class SystemServer {
LocationManagerService location = null;
CountryDetectorService countryDetector = null;
ILockSettings lockSettings = null;
- AssetAtlasService atlas = null;
MediaRouterService mediaRouter = null;
// Bring up services needed for UI.
@@ -1235,17 +1234,6 @@ public final class SystemServer {
traceEnd();
}
- if (!disableNonCoreServices && ZygoteInit.PRELOAD_RESOURCES) {
- traceBeginAndSlog("StartAssetAtlasService");
- try {
- atlas = new AssetAtlasService(context);
- ServiceManager.addService(AssetAtlasService.ASSET_ATLAS_SERVICE, atlas);
- } catch (Throwable e) {
- reportWtf("starting AssetAtlasService", e);
- }
- traceEnd();
- }
-
if (!disableNonCoreServices) {
traceBeginAndSlog("AddGraphicsStatsService");
ServiceManager.addService(GraphicsStatsService.GRAPHICS_STATS_SERVICE,
@@ -1465,7 +1453,6 @@ public final class SystemServer {
final CountryDetectorService countryDetectorF = countryDetector;
final NetworkTimeUpdateService networkTimeUpdaterF = networkTimeUpdater;
final CommonTimeManagementService commonTimeMgmtServiceF = commonTimeMgmtService;
- final AssetAtlasService atlasF = atlas;
final InputManagerService inputManagerF = inputManager;
final TelephonyRegistry telephonyRegistryF = telephonyRegistry;
final MediaRouterService mediaRouterF = mediaRouter;
@@ -1583,13 +1570,6 @@ public final class SystemServer {
reportWtf("Notifying CommonTimeManagementService running", e);
}
traceEnd();
- traceBeginAndSlog("MakeAtlasServiceReady");
- try {
- if (atlasF != null) atlasF.systemRunning();
- } catch (Throwable e) {
- reportWtf("Notifying AssetAtlasService running", e);
- }
- traceEnd();
traceBeginAndSlog("MakeInputManagerServiceReady");
try {
// TODO(BT) Pass parameter to input manager
diff --git a/services/net/java/android/net/apf/ApfFilter.java b/services/net/java/android/net/apf/ApfFilter.java
index 4c7545240c23..957a8d30e2f8 100644
--- a/services/net/java/android/net/apf/ApfFilter.java
+++ b/services/net/java/android/net/apf/ApfFilter.java
@@ -289,8 +289,15 @@ public class ApfFilter {
return System.currentTimeMillis() / DateUtils.SECOND_IN_MILLIS;
}
+ public static class InvalidRaException extends Exception {
+ public InvalidRaException(String m) {
+ super(m);
+ }
+ }
+
// A class to hold information about an RA.
- private class Ra {
+ @VisibleForTesting
+ class Ra {
// From RFC4861:
private static final int ICMP6_RA_HEADER_LEN = 16;
private static final int ICMP6_RA_CHECKSUM_OFFSET =
@@ -362,7 +369,7 @@ public class ApfFilter {
} catch (UnsupportedOperationException e) {
// array() failed. Cannot happen, mPacket is array-backed and read-write.
return "???";
- } catch (ClassCastException | UnknownHostException e) {
+ } catch (ClassCastException|UnknownHostException e) {
// Cannot happen.
return "???";
}
@@ -403,7 +410,7 @@ public class ApfFilter {
rdnssOptionToString(sb, i);
}
return sb.toString();
- } catch (BufferUnderflowException | IndexOutOfBoundsException e) {
+ } catch (BufferUnderflowException|IndexOutOfBoundsException e) {
return "<Malformed RA>";
}
}
@@ -436,7 +443,11 @@ public class ApfFilter {
// Buffer.position(int) or due to an invalid-length option) or IndexOutOfBoundsException
// (from ByteBuffer.get(int) ) if parsing encounters something non-compliant with
// specifications.
- Ra(byte[] packet, int length) {
+ Ra(byte[] packet, int length) throws InvalidRaException {
+ if (length < ICMP6_RA_OPTION_OFFSET) {
+ throw new InvalidRaException("Not an ICMP6 router advertisement");
+ }
+
mPacket = ByteBuffer.wrap(Arrays.copyOf(packet, length));
mLastSeen = curTime();
@@ -445,7 +456,7 @@ public class ApfFilter {
if (getUint16(mPacket, ETH_ETHERTYPE_OFFSET) != ETH_P_IPV6 ||
uint8(mPacket.get(IPV6_NEXT_HEADER_OFFSET)) != IPPROTO_ICMPV6 ||
uint8(mPacket.get(ICMP6_TYPE_OFFSET)) != ICMP6_ROUTER_ADVERTISEMENT) {
- throw new IllegalArgumentException("Not an ICMP6 router advertisement");
+ throw new InvalidRaException("Not an ICMP6 router advertisement");
}
@@ -511,7 +522,7 @@ public class ApfFilter {
break;
}
if (optionLength <= 0) {
- throw new IllegalArgumentException(String.format(
+ throw new InvalidRaException(String.format(
"Invalid option length opt=%d len=%d", optionType, optionLength));
}
mPacket.position(position + optionLength);
@@ -925,8 +936,8 @@ public class ApfFilter {
// Execution will reach the end of the program if no filters match, which will pass the
// packet to the AP.
program = gen.generate();
- } catch (IllegalInstructionException e) {
- Log.e(TAG, "Program failed to generate: ", e);
+ } catch (IllegalInstructionException|IllegalStateException e) {
+ Log.e(TAG, "Failed to generate APF program.", e);
return;
}
mLastTimeInstalledProgram = curTime();
@@ -972,7 +983,8 @@ public class ApfFilter {
* if the current APF program should be updated.
* @return a ProcessRaResult enum describing what action was performed.
*/
- private synchronized ProcessRaResult processRa(byte[] packet, int length) {
+ @VisibleForTesting
+ synchronized ProcessRaResult processRa(byte[] packet, int length) {
if (VDBG) hexDump("Read packet = ", packet, length);
// Have we seen this RA before?
@@ -1011,7 +1023,7 @@ public class ApfFilter {
try {
ra = new Ra(packet, length);
} catch (Exception e) {
- Log.e(TAG, "Error parsing RA: " + e);
+ Log.e(TAG, "Error parsing RA", e);
return ProcessRaResult.PARSE_ERROR;
}
// Ignore 0 lifetime RAs.
diff --git a/services/print/java/com/android/server/print/PrintManagerService.java b/services/print/java/com/android/server/print/PrintManagerService.java
index 1feb81664e95..6558b6e2bbf5 100644
--- a/services/print/java/com/android/server/print/PrintManagerService.java
+++ b/services/print/java/com/android/server/print/PrintManagerService.java
@@ -728,7 +728,8 @@ public final class PrintManagerService extends SystemService {
@Override
public void onPackageModified(String packageName) {
if (!mUserManager.isUserUnlockingOrUnlocked(getChangingUserId())) return;
- UserState userState = getOrCreateUserStateLocked(getChangingUserId(), false);
+ UserState userState = getOrCreateUserStateLocked(getChangingUserId(), false,
+ false /* enforceUserUnlockingOrUnlocked */);
synchronized (mLock) {
if (hadPrintService(userState, packageName)
@@ -743,7 +744,8 @@ public final class PrintManagerService extends SystemService {
@Override
public void onPackageRemoved(String packageName, int uid) {
if (!mUserManager.isUserUnlockingOrUnlocked(getChangingUserId())) return;
- UserState userState = getOrCreateUserStateLocked(getChangingUserId(), false);
+ UserState userState = getOrCreateUserStateLocked(getChangingUserId(), false,
+ false /* enforceUserUnlockingOrUnlocked */);
synchronized (mLock) {
if (hadPrintService(userState, packageName)) {
@@ -762,8 +764,8 @@ public final class PrintManagerService extends SystemService {
// A background user/profile's print jobs are running but there is
// no UI shown. Hence, if the packages of such a user change we need
// to handle it as the change may affect ongoing print jobs.
- UserState userState = getOrCreateUserStateLocked(getChangingUserId(),
- false);
+ UserState userState = getOrCreateUserStateLocked(getChangingUserId(), false,
+ false /* enforceUserUnlockingOrUnlocked */);
boolean stoppedSomePackages = false;
List<PrintServiceInfo> enabledServices = userState
@@ -799,7 +801,7 @@ public final class PrintManagerService extends SystemService {
synchronized (mLock) {
if (hasPrintService(packageName)) {
UserState userState = getOrCreateUserStateLocked(getChangingUserId(),
- false);
+ false, false /* enforceUserUnlockingOrUnlocked */);
userState.updateIfNeededLocked();
}
}
@@ -810,9 +812,14 @@ public final class PrintManagerService extends SystemService {
monitor.register(mContext, BackgroundThread.getHandler().getLooper(),
UserHandle.ALL, true);
}
-
private UserState getOrCreateUserStateLocked(int userId, boolean lowPriority) {
- if (!mUserManager.isUserUnlockingOrUnlocked(userId)) {
+ return getOrCreateUserStateLocked(userId, lowPriority,
+ true /* enforceUserUnlockingOrUnlocked */);
+ }
+
+ private UserState getOrCreateUserStateLocked(int userId, boolean lowPriority,
+ boolean enforceUserUnlockingOrUnlocked) {
+ if (enforceUserUnlockingOrUnlocked && !mUserManager.isUserUnlockingOrUnlocked(userId)) {
throw new IllegalStateException(
"User " + userId + " must be unlocked for printing to be available");
}
@@ -840,7 +847,8 @@ public final class PrintManagerService extends SystemService {
UserState userState;
synchronized (mLock) {
- userState = getOrCreateUserStateLocked(userId, true);
+ userState = getOrCreateUserStateLocked(userId, true,
+ false /*enforceUserUnlockingOrUnlocked */);
userState.updateIfNeededLocked();
}
// This is the first time we switch to this user after boot, so
diff --git a/services/tests/servicestests/src/android/net/apf/ApfTest.java b/services/tests/servicestests/src/android/net/apf/ApfTest.java
index f7c61d15bb5f..37807b22264a 100644
--- a/services/tests/servicestests/src/android/net/apf/ApfTest.java
+++ b/services/tests/servicestests/src/android/net/apf/ApfTest.java
@@ -16,10 +16,6 @@
package android.net.apf;
-import static android.system.OsConstants.*;
-
-import com.android.frameworks.servicestests.R;
-
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.NetworkUtils;
@@ -37,6 +33,10 @@ import android.system.ErrnoException;
import android.system.Os;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.LargeTest;
+import static android.system.OsConstants.*;
+
+import com.android.frameworks.servicestests.R;
+import com.android.internal.util.HexDump;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
@@ -54,6 +54,7 @@ import java.net.InetAddress;
import java.net.NetworkInterface;
import java.nio.ByteBuffer;
import java.util.List;
+import java.util.Random;
import libcore.io.IoUtils;
import libcore.io.Streams;
@@ -1146,6 +1147,39 @@ public class ApfTest extends AndroidTestCase {
buffer.position(original);
}
+ public void testRaParsing() throws Exception {
+ final int maxRandomPacketSize = 512;
+ final Random r = new Random();
+ MockIpManagerCallback cb = new MockIpManagerCallback();
+ TestApfFilter apfFilter = new TestApfFilter(cb, DROP_MULTICAST, mLog);
+ for (int i = 0; i < 1000; i++) {
+ byte[] packet = new byte[r.nextInt(maxRandomPacketSize + 1)];
+ r.nextBytes(packet);
+ try {
+ apfFilter.new Ra(packet, packet.length);
+ } catch (ApfFilter.InvalidRaException e) {
+ } catch (Exception e) {
+ throw new Exception("bad packet: " + HexDump.toHexString(packet), e);
+ }
+ }
+ }
+
+ public void testRaProcessing() throws Exception {
+ final int maxRandomPacketSize = 512;
+ final Random r = new Random();
+ MockIpManagerCallback cb = new MockIpManagerCallback();
+ TestApfFilter apfFilter = new TestApfFilter(cb, DROP_MULTICAST, mLog);
+ for (int i = 0; i < 1000; i++) {
+ byte[] packet = new byte[r.nextInt(maxRandomPacketSize + 1)];
+ r.nextBytes(packet);
+ try {
+ apfFilter.processRa(packet, packet.length);
+ } catch (Exception e) {
+ throw new Exception("bad packet: " + HexDump.toHexString(packet), e);
+ }
+ }
+ }
+
/**
* Call the APF interpreter the run {@code program} on {@code packet} pretending the
* filter was installed {@code filter_age} seconds ago.
diff --git a/services/tests/servicestests/src/com/android/server/connectivity/NetdEventListenerServiceTest.java b/services/tests/servicestests/src/com/android/server/connectivity/NetdEventListenerServiceTest.java
index 63d5d9fbd919..9e2fd6231ba9 100644
--- a/services/tests/servicestests/src/com/android/server/connectivity/NetdEventListenerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/connectivity/NetdEventListenerServiceTest.java
@@ -158,7 +158,8 @@ public class NetdEventListenerServiceTest extends TestCase {
void log(int netId, int[] latencies) {
for (int l : latencies) {
- mNetdEventListenerService.onDnsEvent(netId, EVENT_TYPE, RETURN_CODE, l);
+ mNetdEventListenerService.onDnsEvent(netId, EVENT_TYPE, RETURN_CODE, l, null, null, 0,
+ 0);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index 01b2c3b3c0bf..56ff6214a908 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -1915,6 +1915,61 @@ public class DevicePolicyManagerTest extends DpmTestBase {
verifyScreenTimeoutCall(Integer.MAX_VALUE, false);
}
+ public void testSetRequiredStrongAuthTimeout_DeviceOwner() throws Exception {
+ mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
+ setupDeviceOwner();
+ mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
+
+ final long MINIMUM_STRONG_AUTH_TIMEOUT_MS = 1 * 60 * 60 * 1000; // 1h
+ final long ONE_MINUTE = 60 * 1000;
+
+ // aggregation should be the default if unset by any admin
+ assertEquals(dpm.getRequiredStrongAuthTimeout(null),
+ DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
+
+ // admin not participating by default
+ assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0);
+
+ //clamping from the top
+ dpm.setRequiredStrongAuthTimeout(admin1,
+ DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS + ONE_MINUTE);
+ assertEquals(dpm.getRequiredStrongAuthTimeout(admin1),
+ DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
+ assertEquals(dpm.getRequiredStrongAuthTimeout(null),
+ DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
+
+ // 0 means default
+ dpm.setRequiredStrongAuthTimeout(admin1, 0);
+ assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0);
+ assertEquals(dpm.getRequiredStrongAuthTimeout(null),
+ DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
+
+ // clamping from the bottom
+ dpm.setRequiredStrongAuthTimeout(admin1, MINIMUM_STRONG_AUTH_TIMEOUT_MS - ONE_MINUTE);
+ assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MINIMUM_STRONG_AUTH_TIMEOUT_MS);
+ assertEquals(dpm.getRequiredStrongAuthTimeout(null), MINIMUM_STRONG_AUTH_TIMEOUT_MS);
+
+ // value within range
+ dpm.setRequiredStrongAuthTimeout(admin1, MINIMUM_STRONG_AUTH_TIMEOUT_MS + ONE_MINUTE);
+ assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MINIMUM_STRONG_AUTH_TIMEOUT_MS
+ + ONE_MINUTE);
+ assertEquals(dpm.getRequiredStrongAuthTimeout(null), MINIMUM_STRONG_AUTH_TIMEOUT_MS
+ + ONE_MINUTE);
+
+ // reset to default
+ dpm.setRequiredStrongAuthTimeout(admin1, 0);
+ assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0);
+ assertEquals(dpm.getRequiredStrongAuthTimeout(null),
+ DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
+
+ // negative value
+ try {
+ dpm.setRequiredStrongAuthTimeout(admin1, -ONE_MINUTE);
+ fail("Didn't throw IllegalArgumentException");
+ } catch (IllegalArgumentException iae) {
+ }
+ }
+
private void verifyScreenTimeoutCall(Integer expectedTimeout,
boolean shouldStayOnWhilePluggedInBeCleared) {
if (expectedTimeout == null) {
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
index 0fb2c9fb28dc..1f0422b4ed50 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
@@ -237,6 +237,38 @@ public class UserManagerTest extends AndroidTestCase {
}
}
+ // Make sure createProfile would fail if we have DISALLOW_ADD_USER.
+ @MediumTest
+ public void testCreateProfileForUser_disallowAddUser() throws Exception {
+ final int primaryUserId = mUserManager.getPrimaryUser().id;
+ final UserHandle primaryUserHandle = new UserHandle(primaryUserId);
+ mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, true, primaryUserHandle);
+ try {
+ UserInfo userInfo = createProfileForUser("Managed",
+ UserInfo.FLAG_MANAGED_PROFILE, primaryUserId);
+ assertNull(userInfo);
+ } finally {
+ mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, false,
+ primaryUserHandle);
+ }
+ }
+
+ // Make sure createProfileEvenWhenDisallowedForUser bypass DISALLOW_ADD_USER.
+ @MediumTest
+ public void testCreateProfileForUserEvenWhenDisallowed() throws Exception {
+ final int primaryUserId = mUserManager.getPrimaryUser().id;
+ final UserHandle primaryUserHandle = new UserHandle(primaryUserId);
+ mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, true, primaryUserHandle);
+ try {
+ UserInfo userInfo = createProfileEvenWhenDisallowedForUser("Managed",
+ UserInfo.FLAG_MANAGED_PROFILE, primaryUserId);
+ assertNotNull(userInfo);
+ } finally {
+ mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, false,
+ primaryUserHandle);
+ }
+ }
+
@MediumTest
public void testAddRestrictedProfile() throws Exception {
UserInfo userInfo = createRestrictedProfile("Profile");
@@ -474,6 +506,16 @@ public class UserManagerTest extends AndroidTestCase {
return profile;
}
+ private UserInfo createProfileEvenWhenDisallowedForUser(String name, int flags,
+ int userHandle) {
+ UserInfo profile = mUserManager.createProfileForUserEvenWhenDisallowed(
+ name, flags, userHandle, null);
+ if (profile != null) {
+ usersToRemove.add(profile.id);
+ }
+ return profile;
+ }
+
private UserInfo createRestrictedProfile(String name) {
UserInfo profile = mUserManager.createRestrictedProfile(name);
if (profile != null) {
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
index 27d9d1039efe..74e8c9d52836 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
@@ -76,15 +76,14 @@ public class AppWindowTokenTests {
private WindowState createWindow(WindowState parent, int type, WindowToken token) {
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(type);
- return new WindowState(sWm, null, mIWindow, token, parent, 0, 0, attrs, 0,
- sWm.getDefaultDisplayContentLocked(), 0);
+ return new WindowState(sWm, null, mIWindow, token, parent, 0, 0, attrs, 0, 0);
}
/* Used so we can gain access to some protected members of the {@link AppWindowToken} class */
private class TestAppWindowToken extends AppWindowToken {
TestAppWindowToken() {
- super(sWm, null, false);
+ super(sWm, null, false, sWm.getDefaultDisplayContentLocked());
}
int getWindowsCount() {
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
index 1259e0f7f9ca..3df1df980a26 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
@@ -58,7 +58,8 @@ public class WindowStateTests {
public void setUp() throws Exception {
final Context context = InstrumentationRegistry.getTargetContext();
sWm = TestWindowManagerPolicy.getWindowManagerService(context);
- mWindowToken = new WindowToken(sWm, new Binder(), 0, false);
+ mWindowToken = new WindowToken(sWm, new Binder(), 0, false,
+ sWm.getDefaultDisplayContentLocked());
}
@Test
@@ -162,7 +163,6 @@ public class WindowStateTests {
private WindowState createWindow(WindowState parent, int type) {
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(type);
- return new WindowState(sWm, null, mIWindow, mWindowToken, parent, 0, 0, attrs, 0,
- sWm.getDefaultDisplayContentLocked(), 0);
+ return new WindowState(sWm, null, mIWindow, mWindowToken, parent, 0, 0, attrs, 0, 0);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java
index 327988662670..1a4dff9c0c07 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java
@@ -157,15 +157,14 @@ public class WindowTokenTests {
private WindowState createWindow(WindowState parent, int type, WindowToken token) {
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(type);
- return new WindowState(mWm, null, mIWindow, token, parent, 0, 0, attrs, 0,
- mWm.getDefaultDisplayContentLocked(), 0);
+ return new WindowState(mWm, null, mIWindow, token, parent, 0, 0, attrs, 0, 0);
}
/* Used so we can gain access to some protected members of the {@link WindowToken} class */
private class TestWindowToken extends WindowToken {
TestWindowToken() {
- super(mWm, null, 0, false);
+ super(mWm, null, 0, false, mWm.getDefaultDisplayContentLocked());
}
int getWindowsCount() {
diff --git a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
index cc0fb8d3e485..e03a14f41ce2 100644
--- a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
+++ b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
@@ -34,6 +34,7 @@ import android.hardware.usb.UsbAccessory;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
+import android.os.AsyncTask;
import android.os.Environment;
import android.os.UserHandle;
import android.os.UserManager;
@@ -42,6 +43,7 @@ import android.util.Log;
import android.util.Slog;
import android.util.Xml;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.Immutable;
import com.android.internal.content.PackageMonitor;
import com.android.internal.util.FastXmlSerializer;
@@ -60,7 +62,9 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import libcore.io.IoUtils;
@@ -87,14 +91,24 @@ class UsbProfileGroupSettingsManager {
private final UserManager mUserManager;
private final @NonNull UsbSettingsManager mSettingsManager;
- // Maps DeviceFilter to user preferred application package
+ /** Maps DeviceFilter to user preferred application package */
+ @GuardedBy("mLock")
private final HashMap<DeviceFilter, UserPackage> mDevicePreferenceMap = new HashMap<>();
- // Maps AccessoryFilter to user preferred application package
+
+ /** Maps AccessoryFilter to user preferred application package */
+ @GuardedBy("mLock")
private final HashMap<AccessoryFilter, UserPackage> mAccessoryPreferenceMap = new HashMap<>();
private final Object mLock = new Object();
/**
+ * If a async task to persist the mDevicePreferenceMap and mAccessoryPreferenceMap is currently
+ * scheduled.
+ */
+ @GuardedBy("mLock")
+ private boolean mIsWriteSettingsScheduled;
+
+ /**
* A package of a user.
*/
@Immutable
@@ -591,6 +605,42 @@ class UsbProfileGroupSettingsManager {
});
}
+ /**
+ * Remove all defaults for a user.
+ *
+ * @param userToRemove The user the defaults belong to.
+ */
+ void removeAllDefaultsForUser(@NonNull UserHandle userToRemove) {
+ synchronized (mLock) {
+ boolean needToPersist = false;
+ Iterator<Map.Entry<DeviceFilter, UserPackage>> devicePreferenceIt = mDevicePreferenceMap
+ .entrySet().iterator();
+ while (devicePreferenceIt.hasNext()) {
+ Map.Entry<DeviceFilter, UserPackage> entry = devicePreferenceIt.next();
+
+ if (entry.getValue().user.equals(userToRemove)) {
+ devicePreferenceIt.remove();
+ needToPersist = true;
+ }
+ }
+
+ Iterator<Map.Entry<AccessoryFilter, UserPackage>> accessoryPreferenceIt =
+ mAccessoryPreferenceMap.entrySet().iterator();
+ while (accessoryPreferenceIt.hasNext()) {
+ Map.Entry<AccessoryFilter, UserPackage> entry = accessoryPreferenceIt.next();
+
+ if (entry.getValue().user.equals(userToRemove)) {
+ accessoryPreferenceIt.remove();
+ needToPersist = true;
+ }
+ }
+
+ if (needToPersist) {
+ scheduleWriteSettingsLocked();
+ }
+ }
+ }
+
private void readPreference(XmlPullParser parser)
throws XmlPullParserException, IOException {
String packageName = null;
@@ -657,7 +707,7 @@ class UsbProfileGroupSettingsManager {
IoUtils.closeQuietly(fis);
}
- writeSettingsLocked();
+ scheduleWriteSettingsLocked();
// Success or failure, we delete single-user file
sSingleUserSettingsFile.delete();
@@ -695,48 +745,68 @@ class UsbProfileGroupSettingsManager {
}
}
- private void writeSettingsLocked() {
- if (DEBUG) Slog.v(TAG, "writeSettingsLocked()");
-
- FileOutputStream fos = null;
- try {
- fos = mSettingsFile.startWrite();
+ /**
+ * Schedule a async task to persist {@link #mDevicePreferenceMap} and
+ * {@link #mAccessoryPreferenceMap}. If a task is already scheduled but not completed, do
+ * nothing as the currently scheduled one will do the work.
+ * <p>Called with {@link #mLock} held.</p>
+ * <p>In the uncommon case that the system crashes in between the scheduling and the write the
+ * update is lost.</p>
+ */
+ private void scheduleWriteSettingsLocked() {
+ if (mIsWriteSettingsScheduled) {
+ return;
+ } else {
+ mIsWriteSettingsScheduled = true;
+ }
- FastXmlSerializer serializer = new FastXmlSerializer();
- serializer.setOutput(fos, StandardCharsets.UTF_8.name());
- serializer.startDocument(null, true);
- serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
- serializer.startTag(null, "settings");
+ AsyncTask.execute(() -> {
+ synchronized (mLock) {
+ FileOutputStream fos = null;
+ try {
+ fos = mSettingsFile.startWrite();
+
+ FastXmlSerializer serializer = new FastXmlSerializer();
+ serializer.setOutput(fos, StandardCharsets.UTF_8.name());
+ serializer.startDocument(null, true);
+ serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output",
+ true);
+ serializer.startTag(null, "settings");
+
+ for (DeviceFilter filter : mDevicePreferenceMap.keySet()) {
+ serializer.startTag(null, "preference");
+ serializer.attribute(null, "package",
+ mDevicePreferenceMap.get(filter).packageName);
+ serializer.attribute(null, "user",
+ String.valueOf(getSerial(mDevicePreferenceMap.get(filter).user)));
+ filter.write(serializer);
+ serializer.endTag(null, "preference");
+ }
- for (DeviceFilter filter : mDevicePreferenceMap.keySet()) {
- serializer.startTag(null, "preference");
- serializer.attribute(null, "package", mDevicePreferenceMap.get(filter).packageName);
- serializer.attribute(null, "user",
- String.valueOf(getSerial(mDevicePreferenceMap.get(filter).user)));
- filter.write(serializer);
- serializer.endTag(null, "preference");
- }
+ for (AccessoryFilter filter : mAccessoryPreferenceMap.keySet()) {
+ serializer.startTag(null, "preference");
+ serializer.attribute(null, "package",
+ mAccessoryPreferenceMap.get(filter).packageName);
+ serializer.attribute(null, "user", String.valueOf(
+ getSerial(mAccessoryPreferenceMap.get(filter).user)));
+ filter.write(serializer);
+ serializer.endTag(null, "preference");
+ }
- for (AccessoryFilter filter : mAccessoryPreferenceMap.keySet()) {
- serializer.startTag(null, "preference");
- serializer.attribute(null, "package",
- mAccessoryPreferenceMap.get(filter).packageName);
- serializer.attribute(null, "user",
- String.valueOf(getSerial(mAccessoryPreferenceMap.get(filter).user)));
- filter.write(serializer);
- serializer.endTag(null, "preference");
- }
+ serializer.endTag(null, "settings");
+ serializer.endDocument();
- serializer.endTag(null, "settings");
- serializer.endDocument();
+ mSettingsFile.finishWrite(fos);
+ } catch (IOException e) {
+ Slog.e(TAG, "Failed to write settings", e);
+ if (fos != null) {
+ mSettingsFile.failWrite(fos);
+ }
+ }
- mSettingsFile.finishWrite(fos);
- } catch (IOException e) {
- Slog.e(TAG, "Failed to write settings", e);
- if (fos != null) {
- mSettingsFile.failWrite(fos);
+ mIsWriteSettingsScheduled = false;
}
- }
+ });
}
// Checks to see if a package matches a device or accessory.
@@ -1141,7 +1211,7 @@ class UsbProfileGroupSettingsManager {
}
if (changed) {
- writeSettingsLocked();
+ scheduleWriteSettingsLocked();
}
}
}
@@ -1178,7 +1248,7 @@ class UsbProfileGroupSettingsManager {
}
}
if (changed) {
- writeSettingsLocked();
+ scheduleWriteSettingsLocked();
}
}
}
@@ -1204,7 +1274,7 @@ class UsbProfileGroupSettingsManager {
}
}
if (changed) {
- writeSettingsLocked();
+ scheduleWriteSettingsLocked();
}
}
}
@@ -1237,7 +1307,7 @@ class UsbProfileGroupSettingsManager {
synchronized (mLock) {
if (clearPackageDefaultsLocked(userPackage)) {
- writeSettingsLocked();
+ scheduleWriteSettingsLocked();
}
}
}
diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java
index 02c7214b2b19..c85b363494e8 100644
--- a/services/usb/java/com/android/server/usb/UsbService.java
+++ b/services/usb/java/com/android/server/usb/UsbService.java
@@ -16,6 +16,7 @@
package com.android.server.usb;
+import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.app.PendingIntent;
import android.app.admin.DevicePolicyManager;
@@ -83,7 +84,7 @@ public class UsbService extends IUsbManager.Stub {
@Override
public void onStopUser(int userHandle) {
- mUsbService.onStopUser(userHandle);
+ mUsbService.onStopUser(UserHandle.of(userHandle));
}
}
@@ -177,10 +178,10 @@ public class UsbService extends IUsbManager.Stub {
/**
* Execute operations when a user is stopped.
*
- * @param stoppedUserId The id of the used that is stopped
+ * @param stoppedUser The user that is stopped
*/
- private void onStopUser(@UserIdInt int stoppedUserId) {
- mSettingsManager.remove(stoppedUserId);
+ private void onStopUser(@NonNull UserHandle stoppedUser) {
+ mSettingsManager.remove(stoppedUser);
}
public void systemReady() {
diff --git a/services/usb/java/com/android/server/usb/UsbSettingsManager.java b/services/usb/java/com/android/server/usb/UsbSettingsManager.java
index b251d261eb53..24d5f0955e9a 100644
--- a/services/usb/java/com/android/server/usb/UsbSettingsManager.java
+++ b/services/usb/java/com/android/server/usb/UsbSettingsManager.java
@@ -108,11 +108,26 @@ class UsbSettingsManager {
/**
* Remove the settings for a user.
*
- * @param userIdToRemove The user o remove
+ * @param userToRemove The user to remove
*/
- void remove(@UserIdInt int userIdToRemove) {
+ void remove(@NonNull UserHandle userToRemove) {
synchronized (mSettingsByUser) {
- mSettingsByUser.remove(userIdToRemove);
+ mSettingsByUser.remove(userToRemove.getIdentifier());
+ }
+
+ synchronized (mSettingsByProfileGroup) {
+ if (mSettingsByProfileGroup.indexOfKey(userToRemove.getIdentifier()) >= 0) {
+ // The user to remove is the parent user of the group. The parent is the last user
+ // that gets removed. All state will be removed with the user
+ mSettingsByProfileGroup.remove(userToRemove.getIdentifier());
+ } else {
+ // We cannot find the parent user of the user that is removed, hence try to remove
+ // it from all profile groups.
+ int numProfileGroups = mSettingsByProfileGroup.size();
+ for (int i = 0; i < numProfileGroups; i++) {
+ mSettingsByProfileGroup.valueAt(i).removeAllDefaultsForUser(userToRemove);
+ }
+ }
}
}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index deed6d4fee78..ea8301b8e712 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -57,6 +57,13 @@ public class CarrierConfigManager {
// system image, that can be added in packages/apps/CarrierConfig.
/**
+ * This flag specifies whether VoLTE availability is based on provisioning. By default this is
+ * false.
+ */
+ public static final String
+ KEY_CARRIER_VOLTE_PROVISIONED_BOOL = "carrier_volte_provisioned_bool";
+
+ /**
* Flag indicating whether the Phone app should ignore EVENT_SIM_NETWORK_LOCKED
* events from the Sim.
* If true, this will prevent the IccNetworkDepersonalizationPanel from being shown, and
@@ -1081,6 +1088,8 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_HAS_IN_CALL_NOISE_SUPPRESSION_BOOL, false);
sDefaults.putBoolean(KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL, false);
sDefaults.putBoolean(KEY_HIDE_SIM_LOCK_SETTINGS_BOOL, false);
+
+ sDefaults.putBoolean(KEY_CARRIER_VOLTE_PROVISIONED_BOOL, false);
sDefaults.putBoolean(KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL, false);
sDefaults.putBoolean(KEY_OPERATOR_SELECTION_EXPAND_BOOL, true);
sDefaults.putBoolean(KEY_PREFER_2G_BOOL, true);
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index a91e9beb3143..891b8a1adb73 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -462,4 +462,5 @@ cat include/telephony/ril.h | \
int RIL_UNSOL_STK_CC_ALPHA_NOTIFY = 1044;
int RIL_UNSOL_LCEDATA_RECV = 1045;
int RIL_UNSOL_PCO_DATA = 1046;
+ int RIL_UNSOL_MODEM_RESTART = 1047;
}
diff --git a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
index a4aab7c268b0..da27ea916a18 100644
--- a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
+++ b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
@@ -87,6 +87,11 @@ public class NotificationTestList extends TestActivity
}
private Test[] mTests = new Test[] {
+ new Test("cancel all") {
+ public void run() {
+ mNM.cancelAll();
+ }
+ },
new Test("Phone call") {
public void run()
{
diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
index bcfe3bffae17..090cee81bf95 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
@@ -601,14 +601,6 @@ public final class Bitmap_Delegate {
return Arrays.equals(argb1, argb2);
}
- // Only used by AssetAtlasService, which we don't care about.
- @LayoutlibDelegate
- /*package*/ static long nativeRefPixelRef(long nativeBitmap) {
- // Hack: This is called by Bitmap.refSkPixelRef() and LayoutLib uses that method to get
- // the native pointer from a Bitmap. So, we return nativeBitmap here.
- return nativeBitmap;
- }
-
// ---- Private delegate/helper methods ----
private Bitmap_Delegate(BufferedImage image, Config config) {