gametel 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.calabash_settings +1 -0
- data/.gitignore +25 -0
- data/.irbrc +16 -0
- data/.rspec +2 -0
- data/.rvmrc +1 -0
- data/.travis.yml +5 -0
- data/ApiDemos/.classpath +8 -0
- data/ApiDemos/.project +33 -0
- data/ApiDemos/.settings/org.eclipse.jdt.core.prefs +4 -0
- data/ApiDemos/AndroidManifest.xml +2715 -0
- data/ApiDemos/README.txt +19 -0
- data/ApiDemos/assets/HelloActivity.apk +0 -0
- data/ApiDemos/assets/fonts/samplefont.ttf +0 -0
- data/ApiDemos/assets/read_asset.txt +3 -0
- data/ApiDemos/bin/ApiDemos.apk +0 -0
- data/ApiDemos/build.xml +83 -0
- data/ApiDemos/local.properties +10 -0
- data/ApiDemos/proguard-project.txt +20 -0
- data/ApiDemos/project.properties +14 -0
- data/ApiDemos/res/anim/animator.xml +23 -0
- data/ApiDemos/res/anim/animator_set.xml +32 -0
- data/ApiDemos/res/anim/color_animator.xml +23 -0
- data/ApiDemos/res/anim/cycle_7.xml +17 -0
- data/ApiDemos/res/anim/fade.xml +20 -0
- data/ApiDemos/res/anim/hold.xml +20 -0
- data/ApiDemos/res/anim/hyperspace_in.xml +17 -0
- data/ApiDemos/res/anim/hyperspace_out.xml +61 -0
- data/ApiDemos/res/anim/layout_animation_row_left_slide.xml +19 -0
- data/ApiDemos/res/anim/layout_animation_row_right_slide.xml +20 -0
- data/ApiDemos/res/anim/layout_animation_table.xml +19 -0
- data/ApiDemos/res/anim/layout_bottom_to_top_slide.xml +20 -0
- data/ApiDemos/res/anim/layout_grid_fade.xml +20 -0
- data/ApiDemos/res/anim/layout_grid_inverse_fade.xml +21 -0
- data/ApiDemos/res/anim/layout_random_fade.xml +20 -0
- data/ApiDemos/res/anim/layout_wave_scale.xml +21 -0
- data/ApiDemos/res/anim/object_animator.xml +23 -0
- data/ApiDemos/res/anim/push_left_in.xml +20 -0
- data/ApiDemos/res/anim/push_left_out.xml +20 -0
- data/ApiDemos/res/anim/push_up_in.xml +20 -0
- data/ApiDemos/res/anim/push_up_out.xml +20 -0
- data/ApiDemos/res/anim/shake.xml +17 -0
- data/ApiDemos/res/anim/slide_left.xml +20 -0
- data/ApiDemos/res/anim/slide_right.xml +20 -0
- data/ApiDemos/res/anim/slide_top_to_bottom.xml +20 -0
- data/ApiDemos/res/anim/wave_scale.xml +33 -0
- data/ApiDemos/res/anim/zoom_enter.xml +28 -0
- data/ApiDemos/res/anim/zoom_exit.xml +33 -0
- data/ApiDemos/res/animator/fragment_slide_left_enter.xml +32 -0
- data/ApiDemos/res/animator/fragment_slide_left_exit.xml +32 -0
- data/ApiDemos/res/animator/fragment_slide_right_enter.xml +32 -0
- data/ApiDemos/res/animator/fragment_slide_right_exit.xml +32 -0
- data/ApiDemos/res/drawable-hdpi/alert_dialog_icon.png +0 -0
- data/ApiDemos/res/drawable-hdpi/apidemo_androidlogo.png +0 -0
- data/ApiDemos/res/drawable-hdpi/app_sample_code.png +0 -0
- data/ApiDemos/res/drawable-hdpi/arrow_down_float.png +0 -0
- data/ApiDemos/res/drawable-hdpi/arrow_up_float.png +0 -0
- data/ApiDemos/res/drawable-hdpi/btn_check_off.png +0 -0
- data/ApiDemos/res/drawable-hdpi/btn_check_on.png +0 -0
- data/ApiDemos/res/drawable-hdpi/btn_circle_normal.png +0 -0
- data/ApiDemos/res/drawable-hdpi/btn_default_normal.9.png +0 -0
- data/ApiDemos/res/drawable-hdpi/button.9.png +0 -0
- data/ApiDemos/res/drawable-hdpi/ic_contact_picture.png +0 -0
- data/ApiDemos/res/drawable-hdpi/ic_launcher_settings.png +0 -0
- data/ApiDemos/res/drawable-hdpi/ic_popup_reminder.png +0 -0
- data/ApiDemos/res/drawable-hdpi/icon48x48_2.png +0 -0
- data/ApiDemos/res/drawable-hdpi/logo240dpi.png +0 -0
- data/ApiDemos/res/drawable-hdpi/npatch240dpi.9.png +0 -0
- data/ApiDemos/res/drawable-hdpi/progress_circular_background.png +0 -0
- data/ApiDemos/res/drawable-hdpi/progress_particle.png +0 -0
- data/ApiDemos/res/drawable-hdpi/reslogo240dpi.png +0 -0
- data/ApiDemos/res/drawable-hdpi/scrollbar_state2.png +0 -0
- data/ApiDemos/res/drawable-hdpi/smlnpatch240dpi.9.png +0 -0
- data/ApiDemos/res/drawable-hdpi/star_big_on.png +0 -0
- data/ApiDemos/res/drawable-hdpi/stat_happy.png +0 -0
- data/ApiDemos/res/drawable-hdpi/stat_neutral.png +0 -0
- data/ApiDemos/res/drawable-hdpi/stat_sad.png +0 -0
- data/ApiDemos/res/drawable-hdpi/stat_sample.png +0 -0
- data/ApiDemos/res/drawable-hdpi/stylogo240dpi.png +0 -0
- data/ApiDemos/res/drawable-ldpi/logo120dpi.png +0 -0
- data/ApiDemos/res/drawable-ldpi/npatch120dpi.9.png +0 -0
- data/ApiDemos/res/drawable-ldpi/reslogo120dpi.png +0 -0
- data/ApiDemos/res/drawable-ldpi/smlnpatch120dpi.9.png +0 -0
- data/ApiDemos/res/drawable-ldpi/stylogo120dpi.png +0 -0
- data/ApiDemos/res/drawable-mdpi/alert_dialog_icon.png +0 -0
- data/ApiDemos/res/drawable-mdpi/apidemo_androidlogo.png +0 -0
- data/ApiDemos/res/drawable-mdpi/app_sample_code.png +0 -0
- data/ApiDemos/res/drawable-mdpi/arrow_down_float.png +0 -0
- data/ApiDemos/res/drawable-mdpi/arrow_up_float.png +0 -0
- data/ApiDemos/res/drawable-mdpi/btn_check_off.png +0 -0
- data/ApiDemos/res/drawable-mdpi/btn_check_on.png +0 -0
- data/ApiDemos/res/drawable-mdpi/btn_circle_normal.png +0 -0
- data/ApiDemos/res/drawable-mdpi/btn_default_normal.9.png +0 -0
- data/ApiDemos/res/drawable-mdpi/button.9.png +0 -0
- data/ApiDemos/res/drawable-mdpi/ic_contact_picture.png +0 -0
- data/ApiDemos/res/drawable-mdpi/ic_launcher_settings.png +0 -0
- data/ApiDemos/res/drawable-mdpi/ic_popup_reminder.png +0 -0
- data/ApiDemos/res/drawable-mdpi/ic_settings_applications.png +0 -0
- data/ApiDemos/res/drawable-mdpi/ic_settings_display.png +0 -0
- data/ApiDemos/res/drawable-mdpi/icon48x48_2.png +0 -0
- data/ApiDemos/res/drawable-mdpi/progress_circular_background.png +0 -0
- data/ApiDemos/res/drawable-mdpi/progress_particle.png +0 -0
- data/ApiDemos/res/drawable-mdpi/scrollbar_state2.png +0 -0
- data/ApiDemos/res/drawable-mdpi/star_big_on.png +0 -0
- data/ApiDemos/res/drawable-mdpi/stat_happy.png +0 -0
- data/ApiDemos/res/drawable-mdpi/stat_neutral.png +0 -0
- data/ApiDemos/res/drawable-mdpi/stat_sad.png +0 -0
- data/ApiDemos/res/drawable-mdpi/stat_sample.png +0 -0
- data/ApiDemos/res/drawable-nodpi/frantic.jpg +0 -0
- data/ApiDemos/res/drawable-nodpi/logonodpi120.png +0 -0
- data/ApiDemos/res/drawable-nodpi/logonodpi160.png +0 -0
- data/ApiDemos/res/drawable-nodpi/logonodpi240.png +0 -0
- data/ApiDemos/res/drawable-xhdpi/ic_launcher_settings.png +0 -0
- data/ApiDemos/res/drawable/animated_gif.gif +0 -0
- data/ApiDemos/res/drawable/balloons.jpg +0 -0
- data/ApiDemos/res/drawable/beach.jpg +0 -0
- data/ApiDemos/res/drawable/black_box.xml +21 -0
- data/ApiDemos/res/drawable/black_opaque_box.xml +21 -0
- data/ApiDemos/res/drawable/box.xml +24 -0
- data/ApiDemos/res/drawable/circular_progress.xml +29 -0
- data/ApiDemos/res/drawable/filled_box.xml +25 -0
- data/ApiDemos/res/drawable/frog.gif +0 -0
- data/ApiDemos/res/drawable/gallery_background_1.xml +20 -0
- data/ApiDemos/res/drawable/gallery_photo_1.jpg +0 -0
- data/ApiDemos/res/drawable/gallery_photo_2.jpg +0 -0
- data/ApiDemos/res/drawable/gallery_photo_3.jpg +0 -0
- data/ApiDemos/res/drawable/gallery_photo_4.jpg +0 -0
- data/ApiDemos/res/drawable/gallery_photo_5.jpg +0 -0
- data/ApiDemos/res/drawable/gallery_photo_6.jpg +0 -0
- data/ApiDemos/res/drawable/gallery_photo_7.jpg +0 -0
- data/ApiDemos/res/drawable/gallery_photo_8.jpg +0 -0
- data/ApiDemos/res/drawable/hover_background.xml +20 -0
- data/ApiDemos/res/drawable/hover_background_active.xml +23 -0
- data/ApiDemos/res/drawable/hover_background_inactive.xml +23 -0
- data/ApiDemos/res/drawable/icon48x48_1.png +0 -0
- data/ApiDemos/res/drawable/line.xml +21 -0
- data/ApiDemos/res/drawable/logo160dpi.png +0 -0
- data/ApiDemos/res/drawable/magnifying_glass.png +0 -0
- data/ApiDemos/res/drawable/npatch160dpi.9.png +0 -0
- data/ApiDemos/res/drawable/photo1.jpg +0 -0
- data/ApiDemos/res/drawable/photo2.jpg +0 -0
- data/ApiDemos/res/drawable/photo3.jpg +0 -0
- data/ApiDemos/res/drawable/photo4.jpg +0 -0
- data/ApiDemos/res/drawable/photo5.jpg +0 -0
- data/ApiDemos/res/drawable/photo6.jpg +0 -0
- data/ApiDemos/res/drawable/picture_frame.png +0 -0
- data/ApiDemos/res/drawable/reslogo160dpi.png +0 -0
- data/ApiDemos/res/drawable/sample_0.jpg +0 -0
- data/ApiDemos/res/drawable/sample_1.jpg +0 -0
- data/ApiDemos/res/drawable/sample_2.jpg +0 -0
- data/ApiDemos/res/drawable/sample_3.jpg +0 -0
- data/ApiDemos/res/drawable/sample_4.jpg +0 -0
- data/ApiDemos/res/drawable/sample_5.jpg +0 -0
- data/ApiDemos/res/drawable/sample_6.jpg +0 -0
- data/ApiDemos/res/drawable/sample_7.jpg +0 -0
- data/ApiDemos/res/drawable/sample_thumb_0.jpg +0 -0
- data/ApiDemos/res/drawable/sample_thumb_1.jpg +0 -0
- data/ApiDemos/res/drawable/sample_thumb_2.jpg +0 -0
- data/ApiDemos/res/drawable/sample_thumb_3.jpg +0 -0
- data/ApiDemos/res/drawable/sample_thumb_4.jpg +0 -0
- data/ApiDemos/res/drawable/sample_thumb_5.jpg +0 -0
- data/ApiDemos/res/drawable/sample_thumb_6.jpg +0 -0
- data/ApiDemos/res/drawable/sample_thumb_7.jpg +0 -0
- data/ApiDemos/res/drawable/scrollbar_vertical_thumb.xml +21 -0
- data/ApiDemos/res/drawable/scrollbar_vertical_track.xml +21 -0
- data/ApiDemos/res/drawable/shape_1.xml +22 -0
- data/ApiDemos/res/drawable/shape_2.xml +24 -0
- data/ApiDemos/res/drawable/shape_3.xml +24 -0
- data/ApiDemos/res/drawable/shape_4.xml +20 -0
- data/ApiDemos/res/drawable/shape_5.xml +23 -0
- data/ApiDemos/res/drawable/smlnpatch160dpi.9.png +0 -0
- data/ApiDemos/res/drawable/stylogo160dpi.png +0 -0
- data/ApiDemos/res/layout-h550dp/resources_height.xml +53 -0
- data/ApiDemos/res/layout-h670dp/resources_height.xml +63 -0
- data/ApiDemos/res/layout-h974dp/resources_height.xml +83 -0
- data/ApiDemos/res/layout-land/fragment_arguments.xml +57 -0
- data/ApiDemos/res/layout-land/fragment_layout.xml +34 -0
- data/ApiDemos/res/layout-sw480dp/resources_smallest_width_inner.xml +43 -0
- data/ApiDemos/res/layout-sw480dp/resources_smallest_width_row.xml +43 -0
- data/ApiDemos/res/layout-sw600dp/resources_smallest_width_inner.xml +53 -0
- data/ApiDemos/res/layout-sw600dp/resources_smallest_width_row.xml +53 -0
- data/ApiDemos/res/layout-sw720dp/resources_smallest_width_inner.xml +63 -0
- data/ApiDemos/res/layout-sw720dp/resources_smallest_width_row.xml +63 -0
- data/ApiDemos/res/layout-w1024dp/resources_width.xml +83 -0
- data/ApiDemos/res/layout-w600dp/resources_width.xml +53 -0
- data/ApiDemos/res/layout-w720dp/resources_width.xml +63 -0
- data/ApiDemos/res/layout/accessibility_service.xml +36 -0
- data/ApiDemos/res/layout/action_bar_display_options.xml +48 -0
- data/ApiDemos/res/layout/action_bar_display_options_custom.xml +17 -0
- data/ApiDemos/res/layout/action_bar_settings_action_provider.xml +34 -0
- data/ApiDemos/res/layout/action_bar_tab_content.xml +19 -0
- data/ApiDemos/res/layout/action_bar_tabs.xml +49 -0
- data/ApiDemos/res/layout/activity_animation.xml +42 -0
- data/ApiDemos/res/layout/activity_recreate.xml +37 -0
- data/ApiDemos/res/layout/alarm_controller.xml +45 -0
- data/ApiDemos/res/layout/alarm_service.xml +41 -0
- data/ApiDemos/res/layout/alert_dialog.xml +60 -0
- data/ApiDemos/res/layout/alert_dialog_text_entry.xml +67 -0
- data/ApiDemos/res/layout/animation_1.xml +44 -0
- data/ApiDemos/res/layout/animation_2.xml +67 -0
- data/ApiDemos/res/layout/animation_3.xml +44 -0
- data/ApiDemos/res/layout/animation_cloning.xml +28 -0
- data/ApiDemos/res/layout/animation_custom_evaluator.xml +28 -0
- data/ApiDemos/res/layout/animation_loading.xml +28 -0
- data/ApiDemos/res/layout/animation_multi_property.xml +28 -0
- data/ApiDemos/res/layout/animation_reversing.xml +40 -0
- data/ApiDemos/res/layout/animation_seeking.xml +40 -0
- data/ApiDemos/res/layout/animations_main_screen.xml +36 -0
- data/ApiDemos/res/layout/animator_custom_evaluator.xml +34 -0
- data/ApiDemos/res/layout/animator_events.xml +122 -0
- data/ApiDemos/res/layout/appwidget_configure.xml +42 -0
- data/ApiDemos/res/layout/appwidget_provider.xml +24 -0
- data/ApiDemos/res/layout/autocomplete_1.xml +48 -0
- data/ApiDemos/res/layout/autocomplete_2.xml +44 -0
- data/ApiDemos/res/layout/autocomplete_3.xml +165 -0
- data/ApiDemos/res/layout/autocomplete_4.xml +49 -0
- data/ApiDemos/res/layout/autocomplete_5.xml +45 -0
- data/ApiDemos/res/layout/autocomplete_6.xml +48 -0
- data/ApiDemos/res/layout/baseline_1.xml +40 -0
- data/ApiDemos/res/layout/baseline_2.xml +43 -0
- data/ApiDemos/res/layout/baseline_3.xml +56 -0
- data/ApiDemos/res/layout/baseline_4.xml +55 -0
- data/ApiDemos/res/layout/baseline_6.xml +34 -0
- data/ApiDemos/res/layout/baseline_7.xml +36 -0
- data/ApiDemos/res/layout/baseline_nested_1.xml +85 -0
- data/ApiDemos/res/layout/baseline_nested_2.xml +85 -0
- data/ApiDemos/res/layout/baseline_nested_3.xml +96 -0
- data/ApiDemos/res/layout/bouncing_balls.xml +22 -0
- data/ApiDemos/res/layout/buttons_1.xml +47 -0
- data/ApiDemos/res/layout/chronometer.xml +64 -0
- data/ApiDemos/res/layout/clipboard.xml +107 -0
- data/ApiDemos/res/layout/contacts_filter.xml +37 -0
- data/ApiDemos/res/layout/controls_1.xml +153 -0
- data/ApiDemos/res/layout/custom_dialog_activity.xml +24 -0
- data/ApiDemos/res/layout/custom_title.xml +57 -0
- data/ApiDemos/res/layout/custom_title_1.xml +33 -0
- data/ApiDemos/res/layout/custom_view_1.xml +44 -0
- data/ApiDemos/res/layout/custom_view_accessibility.xml +44 -0
- data/ApiDemos/res/layout/date_widgets_example_1.xml +40 -0
- data/ApiDemos/res/layout/date_widgets_example_2.xml +33 -0
- data/ApiDemos/res/layout/density_image_views.xml +37 -0
- data/ApiDemos/res/layout/density_styled_image_views.xml +26 -0
- data/ApiDemos/res/layout/dialog_activity.xml +53 -0
- data/ApiDemos/res/layout/drag_layout.xml +93 -0
- data/ApiDemos/res/layout/external_storage.xml +27 -0
- data/ApiDemos/res/layout/external_storage_item.xml +58 -0
- data/ApiDemos/res/layout/focus_1.xml +42 -0
- data/ApiDemos/res/layout/focus_2.xml +41 -0
- data/ApiDemos/res/layout/focus_3.xml +64 -0
- data/ApiDemos/res/layout/focus_5.xml +60 -0
- data/ApiDemos/res/layout/foreground_dispatch.xml +23 -0
- data/ApiDemos/res/layout/foreground_service_controller.xml +49 -0
- data/ApiDemos/res/layout/forward_target.xml +30 -0
- data/ApiDemos/res/layout/forwarding.xml +37 -0
- data/ApiDemos/res/layout/fragment_arguments.xml +54 -0
- data/ApiDemos/res/layout/fragment_context_menu.xml +38 -0
- data/ApiDemos/res/layout/fragment_dialog.xml +40 -0
- data/ApiDemos/res/layout/fragment_dialog_or_activity.xml +64 -0
- data/ApiDemos/res/layout/fragment_hide_show.xml +57 -0
- data/ApiDemos/res/layout/fragment_layout.xml +27 -0
- data/ApiDemos/res/layout/fragment_menu.xml +46 -0
- data/ApiDemos/res/layout/fragment_pager_support.xml +44 -0
- data/ApiDemos/res/layout/fragment_pager_support_list.xml +52 -0
- data/ApiDemos/res/layout/fragment_retain_instance.xml +46 -0
- data/ApiDemos/res/layout/fragment_stack.xml +38 -0
- data/ApiDemos/res/layout/gallery_1.xml +32 -0
- data/ApiDemos/res/layout/gallery_2.xml +38 -0
- data/ApiDemos/res/layout/game_controller_input.xml +52 -0
- data/ApiDemos/res/layout/game_controller_input_heading.xml +21 -0
- data/ApiDemos/res/layout/game_controller_input_text_column.xml +34 -0
- data/ApiDemos/res/layout/google_login.xml +60 -0
- data/ApiDemos/res/layout/grid_1.xml +29 -0
- data/ApiDemos/res/layout/grid_2.xml +30 -0
- data/ApiDemos/res/layout/grid_layout_1.xml +87 -0
- data/ApiDemos/res/layout/hello_world.xml +26 -0
- data/ApiDemos/res/layout/horizontal_scroll_view1.xml +26 -0
- data/ApiDemos/res/layout/hover.xml +64 -0
- data/ApiDemos/res/layout/image_button_1.xml +36 -0
- data/ApiDemos/res/layout/image_switcher_1.xml +40 -0
- data/ApiDemos/res/layout/image_view_1.xml +144 -0
- data/ApiDemos/res/layout/incoming_message.xml +50 -0
- data/ApiDemos/res/layout/incoming_message_info.xml +38 -0
- data/ApiDemos/res/layout/incoming_message_interstitial.xml +37 -0
- data/ApiDemos/res/layout/incoming_message_panel.xml +42 -0
- data/ApiDemos/res/layout/incoming_message_view.xml +80 -0
- data/ApiDemos/res/layout/install_apk.xml +56 -0
- data/ApiDemos/res/layout/intent_activity_flags.xml +43 -0
- data/ApiDemos/res/layout/intents.xml +37 -0
- data/ApiDemos/res/layout/labeled_text_edit.xml +38 -0
- data/ApiDemos/res/layout/launcher_shortcuts.xml +40 -0
- data/ApiDemos/res/layout/layout_animation_1.xml +30 -0
- data/ApiDemos/res/layout/layout_animation_3.xml +21 -0
- data/ApiDemos/res/layout/layout_animation_4.xml +30 -0
- data/ApiDemos/res/layout/layout_animation_5.xml +30 -0
- data/ApiDemos/res/layout/layout_animation_6.xml +29 -0
- data/ApiDemos/res/layout/layout_animation_7.xml +57 -0
- data/ApiDemos/res/layout/layout_animations.xml +80 -0
- data/ApiDemos/res/layout/layout_animations_by_default.xml +34 -0
- data/ApiDemos/res/layout/layout_animations_hideshow.xml +52 -0
- data/ApiDemos/res/layout/linear_layout_1.xml +46 -0
- data/ApiDemos/res/layout/linear_layout_10.xml +122 -0
- data/ApiDemos/res/layout/linear_layout_2.xml +47 -0
- data/ApiDemos/res/layout/linear_layout_3.xml +51 -0
- data/ApiDemos/res/layout/linear_layout_4.xml +50 -0
- data/ApiDemos/res/layout/linear_layout_5.xml +76 -0
- data/ApiDemos/res/layout/linear_layout_6.xml +53 -0
- data/ApiDemos/res/layout/linear_layout_7.xml +54 -0
- data/ApiDemos/res/layout/linear_layout_8.xml +53 -0
- data/ApiDemos/res/layout/linear_layout_9.xml +38 -0
- data/ApiDemos/res/layout/link.xml +68 -0
- data/ApiDemos/res/layout/list_12.xml +35 -0
- data/ApiDemos/res/layout/list_13.xml +34 -0
- data/ApiDemos/res/layout/list_7.xml +35 -0
- data/ApiDemos/res/layout/list_8.xml +61 -0
- data/ApiDemos/res/layout/list_item_checkbox.xml +22 -0
- data/ApiDemos/res/layout/list_item_icon_text.xml +32 -0
- data/ApiDemos/res/layout/list_position.xml +25 -0
- data/ApiDemos/res/layout/local_sample.xml +37 -0
- data/ApiDemos/res/layout/local_service_binding.xml +42 -0
- data/ApiDemos/res/layout/local_service_controller.xml +42 -0
- data/ApiDemos/res/layout/log_text_box_1.xml +42 -0
- data/ApiDemos/res/layout/mapview.xml +31 -0
- data/ApiDemos/res/layout/marquee.xml +46 -0
- data/ApiDemos/res/layout/mediaplayer_1.xml +31 -0
- data/ApiDemos/res/layout/mediaplayer_2.xml +13 -0
- data/ApiDemos/res/layout/messenger_service_binding.xml +47 -0
- data/ApiDemos/res/layout/morse_code.xml +37 -0
- data/ApiDemos/res/layout/notify_with_text.xml +34 -0
- data/ApiDemos/res/layout/notifying_controller.xml +41 -0
- data/ApiDemos/res/layout/overscan.xml +79 -0
- data/ApiDemos/res/layout/pick_contact.xml +48 -0
- data/ApiDemos/res/layout/popup_menu_1.xml +25 -0
- data/ApiDemos/res/layout/preference_widget_mypreference.xml +25 -0
- data/ApiDemos/res/layout/progressbar_1.xml +74 -0
- data/ApiDemos/res/layout/progressbar_2.xml +41 -0
- data/ApiDemos/res/layout/progressbar_3.xml +32 -0
- data/ApiDemos/res/layout/progressbar_4.xml +27 -0
- data/ApiDemos/res/layout/quick_contacts.xml +47 -0
- data/ApiDemos/res/layout/radio_group_1.xml +49 -0
- data/ApiDemos/res/layout/ratingbar_1.xml +60 -0
- data/ApiDemos/res/layout/read_asset.xml +29 -0
- data/ApiDemos/res/layout/receive_result.xml +50 -0
- data/ApiDemos/res/layout/redirect_enter.xml +36 -0
- data/ApiDemos/res/layout/redirect_getter.xml +42 -0
- data/ApiDemos/res/layout/redirect_main.xml +47 -0
- data/ApiDemos/res/layout/relative_layout_1.xml +54 -0
- data/ApiDemos/res/layout/relative_layout_2.xml +78 -0
- data/ApiDemos/res/layout/remote_binding_options.xml +82 -0
- data/ApiDemos/res/layout/remote_service_binding.xml +52 -0
- data/ApiDemos/res/layout/remote_service_controller.xml +42 -0
- data/ApiDemos/res/layout/reorder_four.xml +38 -0
- data/ApiDemos/res/layout/reorder_on_launch.xml +38 -0
- data/ApiDemos/res/layout/reorder_three.xml +38 -0
- data/ApiDemos/res/layout/reorder_two.xml +38 -0
- data/ApiDemos/res/layout/resources.xml +55 -0
- data/ApiDemos/res/layout/resources_height.xml +33 -0
- data/ApiDemos/res/layout/resources_layout_reference.xml +35 -0
- data/ApiDemos/res/layout/resources_layout_reference_tablet.xml +35 -0
- data/ApiDemos/res/layout/resources_smallest_width.xml +35 -0
- data/ApiDemos/res/layout/resources_smallest_width_inner.xml +33 -0
- data/ApiDemos/res/layout/resources_smallest_width_row.xml +33 -0
- data/ApiDemos/res/layout/resources_width.xml +33 -0
- data/ApiDemos/res/layout/resources_width_and_height.xml +35 -0
- data/ApiDemos/res/layout/rotating_list.xml +37 -0
- data/ApiDemos/res/layout/rotating_view.xml +160 -0
- data/ApiDemos/res/layout/save_restore_state.xml +58 -0
- data/ApiDemos/res/layout/screen_orientation.xml +37 -0
- data/ApiDemos/res/layout/scroll_view_1.xml +90 -0
- data/ApiDemos/res/layout/scroll_view_2.xml +41 -0
- data/ApiDemos/res/layout/scrollbar1.xml +169 -0
- data/ApiDemos/res/layout/scrollbar2.xml +172 -0
- data/ApiDemos/res/layout/scrollbar3.xml +136 -0
- data/ApiDemos/res/layout/search_invoke.xml +96 -0
- data/ApiDemos/res/layout/search_query_results.xml +76 -0
- data/ApiDemos/res/layout/search_view.xml +19 -0
- data/ApiDemos/res/layout/searchview_actionbar.xml +28 -0
- data/ApiDemos/res/layout/searchview_filter.xml +31 -0
- data/ApiDemos/res/layout/secure_view.xml +112 -0
- data/ApiDemos/res/layout/secure_view_overlay.xml +50 -0
- data/ApiDemos/res/layout/seekbar_1.xml +36 -0
- data/ApiDemos/res/layout/select_dialog.xml +29 -0
- data/ApiDemos/res/layout/send_result.xml +45 -0
- data/ApiDemos/res/layout/service_start_arguments_controller.xml +57 -0
- data/ApiDemos/res/layout/shape_drawable_1.xml +73 -0
- data/ApiDemos/res/layout/simple_list_item_checkable_1.xml +29 -0
- data/ApiDemos/res/layout/sms_demo.xml +67 -0
- data/ApiDemos/res/layout/soft_input_modes.xml +64 -0
- data/ApiDemos/res/layout/spinner_1.xml +51 -0
- data/ApiDemos/res/layout/split_touch_view.xml +42 -0
- data/ApiDemos/res/layout/status_bar_balloon.xml +32 -0
- data/ApiDemos/res/layout/status_bar_notifications.xml +157 -0
- data/ApiDemos/res/layout/styled_text.xml +52 -0
- data/ApiDemos/res/layout/surface_view_overlay.xml +84 -0
- data/ApiDemos/res/layout/switches.xml +82 -0
- data/ApiDemos/res/layout/table_layout_1.xml +56 -0
- data/ApiDemos/res/layout/table_layout_10.xml +58 -0
- data/ApiDemos/res/layout/table_layout_11.xml +93 -0
- data/ApiDemos/res/layout/table_layout_12.xml +85 -0
- data/ApiDemos/res/layout/table_layout_2.xml +40 -0
- data/ApiDemos/res/layout/table_layout_3.xml +62 -0
- data/ApiDemos/res/layout/table_layout_4.xml +42 -0
- data/ApiDemos/res/layout/table_layout_5.xml +82 -0
- data/ApiDemos/res/layout/table_layout_6.xml +92 -0
- data/ApiDemos/res/layout/table_layout_7.xml +106 -0
- data/ApiDemos/res/layout/table_layout_8.xml +87 -0
- data/ApiDemos/res/layout/table_layout_9.xml +92 -0
- data/ApiDemos/res/layout/tabs1.xml +39 -0
- data/ApiDemos/res/layout/tabs_right_gravity.xml +37 -0
- data/ApiDemos/res/layout/tabs_scroll.xml +41 -0
- data/ApiDemos/res/layout/tasklist_main.xml +47 -0
- data/ApiDemos/res/layout/tasklist_row.xml +38 -0
- data/ApiDemos/res/layout/text_switcher_1.xml +31 -0
- data/ApiDemos/res/layout/text_to_speech.xml +26 -0
- data/ApiDemos/res/layout/translucent_background.xml +24 -0
- data/ApiDemos/res/layout/videoview.xml +14 -0
- data/ApiDemos/res/layout/visibility_1.xml +71 -0
- data/ApiDemos/res/layout/voice_recognition.xml +61 -0
- data/ApiDemos/res/layout/wallpaper_2.xml +27 -0
- data/ApiDemos/res/layout/webview_1.xml +79 -0
- data/ApiDemos/res/menu/action_bar_settings_action_provider.xml +28 -0
- data/ApiDemos/res/menu/action_bar_share_action_provider.xml +28 -0
- data/ApiDemos/res/menu/actions.xml +48 -0
- data/ApiDemos/res/menu/camera_menu.xml +5 -0
- data/ApiDemos/res/menu/category_order.xml +57 -0
- data/ApiDemos/res/menu/checkable.xml +91 -0
- data/ApiDemos/res/menu/disabled.xml +55 -0
- data/ApiDemos/res/menu/display_options_actions.xml +19 -0
- data/ApiDemos/res/menu/groups.xml +45 -0
- data/ApiDemos/res/menu/list_select_menu.xml +22 -0
- data/ApiDemos/res/menu/order.xml +38 -0
- data/ApiDemos/res/menu/popup.xml +32 -0
- data/ApiDemos/res/menu/searchview_in_menu.xml +22 -0
- data/ApiDemos/res/menu/shortcuts.xml +60 -0
- data/ApiDemos/res/menu/submenu.xml +44 -0
- data/ApiDemos/res/menu/title_icon.xml +31 -0
- data/ApiDemos/res/menu/title_only.xml +25 -0
- data/ApiDemos/res/menu/visible.xml +37 -0
- data/ApiDemos/res/raw/androids.pkm +0 -0
- data/ApiDemos/res/raw/robot.png +0 -0
- data/ApiDemos/res/raw/skycubemap0.jpg +0 -0
- data/ApiDemos/res/raw/skycubemap1.jpg +0 -0
- data/ApiDemos/res/raw/skycubemap2.jpg +0 -0
- data/ApiDemos/res/raw/skycubemap3.jpg +0 -0
- data/ApiDemos/res/raw/skycubemap4.jpg +0 -0
- data/ApiDemos/res/raw/skycubemap5.jpg +0 -0
- data/ApiDemos/res/raw/sound_ringer_normal.ogg +0 -0
- data/ApiDemos/res/raw/sound_ringer_silent.ogg +0 -0
- data/ApiDemos/res/raw/sound_ringer_vibrate.ogg +0 -0
- data/ApiDemos/res/raw/sound_screen_off.ogg +0 -0
- data/ApiDemos/res/raw/sound_screen_on.ogg +0 -0
- data/ApiDemos/res/raw/sound_view_clicked.ogg +0 -0
- data/ApiDemos/res/raw/sound_view_focused_or_selected.ogg +0 -0
- data/ApiDemos/res/raw/sound_view_hover_enter.ogg +0 -0
- data/ApiDemos/res/raw/sound_window_state_changed.ogg +0 -0
- data/ApiDemos/res/raw/test_cbr.mp3 +0 -0
- data/ApiDemos/res/values-hdpi/strings.xml +19 -0
- data/ApiDemos/res/values-ldpi/strings.xml +19 -0
- data/ApiDemos/res/values-mdpi/strings.xml +19 -0
- data/ApiDemos/res/values-sw600dp/layout.xml +22 -0
- data/ApiDemos/res/values-v11/bools.xml +20 -0
- data/ApiDemos/res/values-v11/styles.xml +29 -0
- data/ApiDemos/res/values-v13/bools.xml +20 -0
- data/ApiDemos/res/values-v14/bools.xml +20 -0
- data/ApiDemos/res/values-xhdpi/strings.xml +19 -0
- data/ApiDemos/res/values-xlarge/layout.xml +22 -0
- data/ApiDemos/res/values/arrays.xml +149 -0
- data/ApiDemos/res/values/attrs.xml +55 -0
- data/ApiDemos/res/values/bools.xml +32 -0
- data/ApiDemos/res/values/colors.xml +32 -0
- data/ApiDemos/res/values/ids.xml +19 -0
- data/ApiDemos/res/values/strings.xml +1342 -0
- data/ApiDemos/res/values/styles.xml +124 -0
- data/ApiDemos/res/xml/advanced_preferences.xml +38 -0
- data/ApiDemos/res/xml/appwidget_provider.xml +28 -0
- data/ApiDemos/res/xml/default_values.xml +44 -0
- data/ApiDemos/res/xml/device_admin_encryption.xml +34 -0
- data/ApiDemos/res/xml/device_admin_expiration.xml +53 -0
- data/ApiDemos/res/xml/device_admin_general.xml +40 -0
- data/ApiDemos/res/xml/device_admin_headers.xml +41 -0
- data/ApiDemos/res/xml/device_admin_lock_wipe.xml +50 -0
- data/ApiDemos/res/xml/device_admin_quality.xml +79 -0
- data/ApiDemos/res/xml/device_admin_sample.xml +30 -0
- data/ApiDemos/res/xml/filter_nfc.xml +28 -0
- data/ApiDemos/res/xml/fragmented_preferences.xml +97 -0
- data/ApiDemos/res/xml/fragmented_preferences_inner.xml +26 -0
- data/ApiDemos/res/xml/preference_dependencies.xml +35 -0
- data/ApiDemos/res/xml/preference_headers.xml +44 -0
- data/ApiDemos/res/xml/preference_switch +46 -0
- data/ApiDemos/res/xml/preferences.xml +101 -0
- data/ApiDemos/res/xml/searchable.xml +30 -0
- data/ApiDemos/res/xml/taskbackconfig.xml +24 -0
- data/ApiDemos/src/com/example/android/apis/ApiDemos.java +149 -0
- data/ApiDemos/src/com/example/android/apis/ApiDemosApplication.java +36 -0
- data/ApiDemos/src/com/example/android/apis/Shakespeare.java +223 -0
- data/ApiDemos/src/com/example/android/apis/accessibility/ClockBackActivity.java +55 -0
- data/ApiDemos/src/com/example/android/apis/accessibility/ClockBackService.java +575 -0
- data/ApiDemos/src/com/example/android/apis/accessibility/CustomViewAccessibilityActivity.java +280 -0
- data/ApiDemos/src/com/example/android/apis/accessibility/TaskBackService.java +191 -0
- data/ApiDemos/src/com/example/android/apis/accessibility/TaskListActivity.java +59 -0
- data/ApiDemos/src/com/example/android/apis/accessibility/TaskListView.java +119 -0
- data/ApiDemos/src/com/example/android/apis/animation/AnimationCloning.java +148 -0
- data/ApiDemos/src/com/example/android/apis/animation/AnimationLoading.java +165 -0
- data/ApiDemos/src/com/example/android/apis/animation/AnimationSeeking.java +173 -0
- data/ApiDemos/src/com/example/android/apis/animation/AnimatorEvents.java +237 -0
- data/ApiDemos/src/com/example/android/apis/animation/BouncingBalls.java +184 -0
- data/ApiDemos/src/com/example/android/apis/animation/CustomEvaluator.java +174 -0
- data/ApiDemos/src/com/example/android/apis/animation/FixedGridLayout.java +108 -0
- data/ApiDemos/src/com/example/android/apis/animation/LayoutAnimations.java +210 -0
- data/ApiDemos/src/com/example/android/apis/animation/LayoutAnimationsByDefault.java +61 -0
- data/ApiDemos/src/com/example/android/apis/animation/LayoutAnimationsHideShow.java +178 -0
- data/ApiDemos/src/com/example/android/apis/animation/ListFlipper.java +126 -0
- data/ApiDemos/src/com/example/android/apis/animation/MultiPropertyAnimation.java +178 -0
- data/ApiDemos/src/com/example/android/apis/animation/ReversingAnimation.java +135 -0
- data/ApiDemos/src/com/example/android/apis/animation/Rotate3dAnimation.java +92 -0
- data/ApiDemos/src/com/example/android/apis/animation/ShapeHolder.java +100 -0
- data/ApiDemos/src/com/example/android/apis/animation/Transition3d.java +175 -0
- data/ApiDemos/src/com/example/android/apis/app/ActionBarDisplayOptions.java +124 -0
- data/ApiDemos/src/com/example/android/apis/app/ActionBarMechanics.java +73 -0
- data/ApiDemos/src/com/example/android/apis/app/ActionBarSettingsActionProviderActivity.java +112 -0
- data/ApiDemos/src/com/example/android/apis/app/ActionBarShareActionProviderActivity.java +125 -0
- data/ApiDemos/src/com/example/android/apis/app/ActionBarTabs.java +131 -0
- data/ApiDemos/src/com/example/android/apis/app/ActionBarUsage.java +93 -0
- data/ApiDemos/src/com/example/android/apis/app/ActivityRecreate.java +73 -0
- data/ApiDemos/src/com/example/android/apis/app/AlarmController.java +168 -0
- data/ApiDemos/src/com/example/android/apis/app/AlarmService.java +89 -0
- data/ApiDemos/src/com/example/android/apis/app/AlarmService_Service.java +131 -0
- data/ApiDemos/src/com/example/android/apis/app/AlertDialogSamples.java +423 -0
- data/ApiDemos/src/com/example/android/apis/app/Animation.java +74 -0
- data/ApiDemos/src/com/example/android/apis/app/AppUpdateReceiver.java +34 -0
- data/ApiDemos/src/com/example/android/apis/app/ContactsFilter.java +53 -0
- data/ApiDemos/src/com/example/android/apis/app/ContactsFilterInstrumentation.java +73 -0
- data/ApiDemos/src/com/example/android/apis/app/ContactsSelectInstrumentation.java +86 -0
- data/ApiDemos/src/com/example/android/apis/app/CustomDialogActivity.java +48 -0
- data/ApiDemos/src/com/example/android/apis/app/CustomTitle.java +85 -0
- data/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java +938 -0
- data/ApiDemos/src/com/example/android/apis/app/DialogActivity.java +86 -0
- data/ApiDemos/src/com/example/android/apis/app/ForegroundService.java +240 -0
- data/ApiDemos/src/com/example/android/apis/app/ForwardTarget.java +41 -0
- data/ApiDemos/src/com/example/android/apis/app/Forwarding.java +85 -0
- data/ApiDemos/src/com/example/android/apis/app/FragmentAlertDialog.java +109 -0
- data/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java +108 -0
- data/ApiDemos/src/com/example/android/apis/app/FragmentContextMenu.java +77 -0
- data/ApiDemos/src/com/example/android/apis/app/FragmentCustomAnimations.java +131 -0
- data/ApiDemos/src/com/example/android/apis/app/FragmentDialog.java +168 -0
- data/ApiDemos/src/com/example/android/apis/app/FragmentDialogOrActivity.java +82 -0
- data/ApiDemos/src/com/example/android/apis/app/FragmentHideShow.java +113 -0
- data/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java +220 -0
- data/ApiDemos/src/com/example/android/apis/app/FragmentListArray.java +60 -0
- data/ApiDemos/src/com/example/android/apis/app/FragmentMenu.java +132 -0
- data/ApiDemos/src/com/example/android/apis/app/FragmentReceiveResult.java +133 -0
- data/ApiDemos/src/com/example/android/apis/app/FragmentRetainInstance.java +232 -0
- data/ApiDemos/src/com/example/android/apis/app/FragmentStack.java +124 -0
- data/ApiDemos/src/com/example/android/apis/app/FragmentTabs.java +118 -0
- data/ApiDemos/src/com/example/android/apis/app/HelloWorld.java +66 -0
- data/ApiDemos/src/com/example/android/apis/app/IRemoteService.aidl +37 -0
- data/ApiDemos/src/com/example/android/apis/app/IRemoteServiceCallback.aidl +29 -0
- data/ApiDemos/src/com/example/android/apis/app/ISecondary.aidl +36 -0
- data/ApiDemos/src/com/example/android/apis/app/IncomingMessage.java +197 -0
- data/ApiDemos/src/com/example/android/apis/app/IncomingMessageInterstitial.java +64 -0
- data/ApiDemos/src/com/example/android/apis/app/IncomingMessageView.java +59 -0
- data/ApiDemos/src/com/example/android/apis/app/IntentActivityFlags.java +86 -0
- data/ApiDemos/src/com/example/android/apis/app/Intents.java +47 -0
- data/ApiDemos/src/com/example/android/apis/app/LauncherShortcuts.java +141 -0
- data/ApiDemos/src/com/example/android/apis/app/LoaderCursor.java +177 -0
- data/ApiDemos/src/com/example/android/apis/app/LoaderCustom.java +482 -0
- data/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.java +512 -0
- data/ApiDemos/src/com/example/android/apis/app/LocalSample.java +53 -0
- data/ApiDemos/src/com/example/android/apis/app/LocalSampleInstrumentation.java +92 -0
- data/ApiDemos/src/com/example/android/apis/app/LocalService.java +120 -0
- data/ApiDemos/src/com/example/android/apis/app/LocalServiceActivities.java +171 -0
- data/ApiDemos/src/com/example/android/apis/app/MenuInflateFromXml.java +174 -0
- data/ApiDemos/src/com/example/android/apis/app/MessengerService.java +169 -0
- data/ApiDemos/src/com/example/android/apis/app/MessengerServiceActivities.java +178 -0
- data/ApiDemos/src/com/example/android/apis/app/NotificationDisplay.java +82 -0
- data/ApiDemos/src/com/example/android/apis/app/NotifyWithText.java +80 -0
- data/ApiDemos/src/com/example/android/apis/app/NotifyingController.java +61 -0
- data/ApiDemos/src/com/example/android/apis/app/NotifyingService.java +128 -0
- data/ApiDemos/src/com/example/android/apis/app/OneShotAlarm.java +42 -0
- data/ApiDemos/src/com/example/android/apis/app/PersistentState.java +128 -0
- data/ApiDemos/src/com/example/android/apis/app/QuickContactsDemo.java +104 -0
- data/ApiDemos/src/com/example/android/apis/app/ReceiveResult.java +153 -0
- data/ApiDemos/src/com/example/android/apis/app/RedirectEnter.java +59 -0
- data/ApiDemos/src/com/example/android/apis/app/RedirectGetter.java +87 -0
- data/ApiDemos/src/com/example/android/apis/app/RedirectMain.java +122 -0
- data/ApiDemos/src/com/example/android/apis/app/RemoteService.java +652 -0
- data/ApiDemos/src/com/example/android/apis/app/ReorderFour.java +46 -0
- data/ApiDemos/src/com/example/android/apis/app/ReorderOnLaunch.java +44 -0
- data/ApiDemos/src/com/example/android/apis/app/ReorderThree.java +44 -0
- data/ApiDemos/src/com/example/android/apis/app/ReorderTwo.java +44 -0
- data/ApiDemos/src/com/example/android/apis/app/RepeatingAlarm.java +40 -0
- data/ApiDemos/src/com/example/android/apis/app/SaveRestoreState.java +98 -0
- data/ApiDemos/src/com/example/android/apis/app/ScreenOrientation.java +73 -0
- data/ApiDemos/src/com/example/android/apis/app/SearchInvoke.java +241 -0
- data/ApiDemos/src/com/example/android/apis/app/SearchQueryResults.java +118 -0
- data/ApiDemos/src/com/example/android/apis/app/SearchSuggestionSampleProvider.java +50 -0
- data/ApiDemos/src/com/example/android/apis/app/SendResult.java +81 -0
- data/ApiDemos/src/com/example/android/apis/app/ServiceStartArguments.java +272 -0
- data/ApiDemos/src/com/example/android/apis/app/SetWallpaperActivity.java +89 -0
- data/ApiDemos/src/com/example/android/apis/app/SoftInputModes.java +67 -0
- data/ApiDemos/src/com/example/android/apis/app/StatusBarNotifications.java +270 -0
- data/ApiDemos/src/com/example/android/apis/app/TextToSpeechActivity.java +136 -0
- data/ApiDemos/src/com/example/android/apis/app/TranslucentActivity.java +48 -0
- data/ApiDemos/src/com/example/android/apis/app/TranslucentBlurActivity.java +55 -0
- data/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.java +230 -0
- data/ApiDemos/src/com/example/android/apis/app/WallpaperActivity.java +48 -0
- data/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetConfigure.java +134 -0
- data/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetProvider.java +122 -0
- data/ApiDemos/src/com/example/android/apis/appwidget/ExampleBroadcastReceiver.java +56 -0
- data/ApiDemos/src/com/example/android/apis/content/ClipboardSample.java +144 -0
- data/ApiDemos/src/com/example/android/apis/content/ExternalStorage.java +376 -0
- data/ApiDemos/src/com/example/android/apis/content/FileProvider.java +115 -0
- data/ApiDemos/src/com/example/android/apis/content/InstallApk.java +179 -0
- data/ApiDemos/src/com/example/android/apis/content/PickContact.java +114 -0
- data/ApiDemos/src/com/example/android/apis/content/ReadAsset.java +73 -0
- data/ApiDemos/src/com/example/android/apis/content/ResourcesLayoutReference.java +33 -0
- data/ApiDemos/src/com/example/android/apis/content/ResourcesSample.java +90 -0
- data/ApiDemos/src/com/example/android/apis/content/ResourcesSmallestWidth.java +33 -0
- data/ApiDemos/src/com/example/android/apis/content/ResourcesWidthAndHeight.java +33 -0
- data/ApiDemos/src/com/example/android/apis/content/StyledText.java +51 -0
- data/ApiDemos/src/com/example/android/apis/graphics/AlphaBitmap.java +91 -0
- data/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawable.java +72 -0
- data/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawables.java +67 -0
- data/ApiDemos/src/com/example/android/apis/graphics/Arcs.java +118 -0
- data/ApiDemos/src/com/example/android/apis/graphics/BitmapDecode.java +144 -0
- data/ApiDemos/src/com/example/android/apis/graphics/BitmapMesh.java +130 -0
- data/ApiDemos/src/com/example/android/apis/graphics/BitmapPixels.java +161 -0
- data/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.java +311 -0
- data/ApiDemos/src/com/example/android/apis/graphics/Clipping.java +111 -0
- data/ApiDemos/src/com/example/android/apis/graphics/ColorFilters.java +180 -0
- data/ApiDemos/src/com/example/android/apis/graphics/ColorMatrixSample.java +122 -0
- data/ApiDemos/src/com/example/android/apis/graphics/ColorPickerDialog.java +233 -0
- data/ApiDemos/src/com/example/android/apis/graphics/Compass.java +130 -0
- data/ApiDemos/src/com/example/android/apis/graphics/CompressedTextureActivity.java +157 -0
- data/ApiDemos/src/com/example/android/apis/graphics/CreateBitmap.java +126 -0
- data/ApiDemos/src/com/example/android/apis/graphics/Cube.java +100 -0
- data/ApiDemos/src/com/example/android/apis/graphics/CubeMapActivity.java +416 -0
- data/ApiDemos/src/com/example/android/apis/graphics/CubeRenderer.java +108 -0
- data/ApiDemos/src/com/example/android/apis/graphics/DensityActivity.java +220 -0
- data/ApiDemos/src/com/example/android/apis/graphics/DrawPoints.java +79 -0
- data/ApiDemos/src/com/example/android/apis/graphics/FingerPaint.java +208 -0
- data/ApiDemos/src/com/example/android/apis/graphics/FrameBufferObjectActivity.java +282 -0
- data/ApiDemos/src/com/example/android/apis/graphics/GLES20Activity.java +72 -0
- data/ApiDemos/src/com/example/android/apis/graphics/GLES20TriangleRenderer.java +255 -0
- data/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceViewActivity.java +56 -0
- data/ApiDemos/src/com/example/android/apis/graphics/GradientDrawable1.java +31 -0
- data/ApiDemos/src/com/example/android/apis/graphics/GraphicsActivity.java +43 -0
- data/ApiDemos/src/com/example/android/apis/graphics/Layers.java +65 -0
- data/ApiDemos/src/com/example/android/apis/graphics/MatrixPaletteActivity.java +52 -0
- data/ApiDemos/src/com/example/android/apis/graphics/MatrixPaletteRenderer.java +408 -0
- data/ApiDemos/src/com/example/android/apis/graphics/MeasureText.java +112 -0
- data/ApiDemos/src/com/example/android/apis/graphics/PathEffects.java +121 -0
- data/ApiDemos/src/com/example/android/apis/graphics/PathFillTypes.java +77 -0
- data/ApiDemos/src/com/example/android/apis/graphics/Patterns.java +125 -0
- data/ApiDemos/src/com/example/android/apis/graphics/PictureLayout.java +161 -0
- data/ApiDemos/src/com/example/android/apis/graphics/Pictures.java +81 -0
- data/ApiDemos/src/com/example/android/apis/graphics/PolyToPoly.java +107 -0
- data/ApiDemos/src/com/example/android/apis/graphics/ProxyDrawable.java +102 -0
- data/ApiDemos/src/com/example/android/apis/graphics/PurgeableBitmap.java +118 -0
- data/ApiDemos/src/com/example/android/apis/graphics/PurgeableBitmapView.java +116 -0
- data/ApiDemos/src/com/example/android/apis/graphics/Regions.java +126 -0
- data/ApiDemos/src/com/example/android/apis/graphics/RoundRects.java +113 -0
- data/ApiDemos/src/com/example/android/apis/graphics/ScaleToFit.java +121 -0
- data/ApiDemos/src/com/example/android/apis/graphics/SensorTest.java +213 -0
- data/ApiDemos/src/com/example/android/apis/graphics/ShapeDrawable1.java +136 -0
- data/ApiDemos/src/com/example/android/apis/graphics/StaticTriangleRenderer.java +274 -0
- data/ApiDemos/src/com/example/android/apis/graphics/SurfaceViewOverlay.java +116 -0
- data/ApiDemos/src/com/example/android/apis/graphics/Sweep.java +97 -0
- data/ApiDemos/src/com/example/android/apis/graphics/TextAlign.java +161 -0
- data/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.java +528 -0
- data/ApiDemos/src/com/example/android/apis/graphics/TouchRotateActivity.java +184 -0
- data/ApiDemos/src/com/example/android/apis/graphics/TranslucentGLSurfaceViewActivity.java +63 -0
- data/ApiDemos/src/com/example/android/apis/graphics/TriangleActivity.java +49 -0
- data/ApiDemos/src/com/example/android/apis/graphics/TriangleRenderer.java +241 -0
- data/ApiDemos/src/com/example/android/apis/graphics/Typefaces.java +55 -0
- data/ApiDemos/src/com/example/android/apis/graphics/UnicodeChart.java +119 -0
- data/ApiDemos/src/com/example/android/apis/graphics/Vertices.java +103 -0
- data/ApiDemos/src/com/example/android/apis/graphics/WindowSurface.java +271 -0
- data/ApiDemos/src/com/example/android/apis/graphics/Xfermodes.java +171 -0
- data/ApiDemos/src/com/example/android/apis/graphics/kube/Cube.java +57 -0
- data/ApiDemos/src/com/example/android/apis/graphics/kube/GLColor.java +51 -0
- data/ApiDemos/src/com/example/android/apis/graphics/kube/GLFace.java +94 -0
- data/ApiDemos/src/com/example/android/apis/graphics/kube/GLShape.java +102 -0
- data/ApiDemos/src/com/example/android/apis/graphics/kube/GLVertex.java +89 -0
- data/ApiDemos/src/com/example/android/apis/graphics/kube/GLWorld.java +98 -0
- data/ApiDemos/src/com/example/android/apis/graphics/kube/Kube.java +342 -0
- data/ApiDemos/src/com/example/android/apis/graphics/kube/KubeRenderer.java +116 -0
- data/ApiDemos/src/com/example/android/apis/graphics/kube/Layer.java +101 -0
- data/ApiDemos/src/com/example/android/apis/graphics/kube/M4.java +80 -0
- data/ApiDemos/src/com/example/android/apis/graphics/spritetext/Grid.java +140 -0
- data/ApiDemos/src/com/example/android/apis/graphics/spritetext/LabelMaker.java +411 -0
- data/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixGrabber.java +63 -0
- data/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixStack.java +179 -0
- data/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixTrackingGL.java +1086 -0
- data/ApiDemos/src/com/example/android/apis/graphics/spritetext/NumericSprite.java +99 -0
- data/ApiDemos/src/com/example/android/apis/graphics/spritetext/Projector.java +84 -0
- data/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextActivity.java +52 -0
- data/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextRenderer.java +354 -0
- data/ApiDemos/src/com/example/android/apis/media/AudioFxDemo.java +252 -0
- data/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo.java +102 -0
- data/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Audio.java +102 -0
- data/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.java +219 -0
- data/ApiDemos/src/com/example/android/apis/media/VideoViewDemo.java +61 -0
- data/ApiDemos/src/com/example/android/apis/nfc/ForegroundDispatch.java +93 -0
- data/ApiDemos/src/com/example/android/apis/nfc/ForegroundNdefPush.java +86 -0
- data/ApiDemos/src/com/example/android/apis/nfc/TechFilter.java +51 -0
- data/ApiDemos/src/com/example/android/apis/os/MorseCode.java +93 -0
- data/ApiDemos/src/com/example/android/apis/os/MorseCodeConverter.java +141 -0
- data/ApiDemos/src/com/example/android/apis/os/RotationVectorDemo.java +216 -0
- data/ApiDemos/src/com/example/android/apis/os/Sensors.java +241 -0
- data/ApiDemos/src/com/example/android/apis/os/SmsMessageReceiver.java +78 -0
- data/ApiDemos/src/com/example/android/apis/os/SmsMessagingDemo.java +159 -0
- data/ApiDemos/src/com/example/android/apis/os/SmsReceivedDialog.java +115 -0
- data/ApiDemos/src/com/example/android/apis/preference/AdvancedPreferences.java +94 -0
- data/ApiDemos/src/com/example/android/apis/preference/DefaultValues.java +61 -0
- data/ApiDemos/src/com/example/android/apis/preference/FragmentPreferences.java +52 -0
- data/ApiDemos/src/com/example/android/apis/preference/LaunchingPreferences.java +100 -0
- data/ApiDemos/src/com/example/android/apis/preference/MyPreference.java +171 -0
- data/ApiDemos/src/com/example/android/apis/preference/PreferenceDependencies.java +33 -0
- data/ApiDemos/src/com/example/android/apis/preference/PreferenceWithHeaders.java +108 -0
- data/ApiDemos/src/com/example/android/apis/preference/PreferencesFromCode.java +151 -0
- data/ApiDemos/src/com/example/android/apis/preference/PreferencesFromXml.java +34 -0
- data/ApiDemos/src/com/example/android/apis/preference/SwitchPreference.java +38 -0
- data/ApiDemos/src/com/example/android/apis/text/Link.java +84 -0
- data/ApiDemos/src/com/example/android/apis/text/LogTextBox.java +64 -0
- data/ApiDemos/src/com/example/android/apis/text/LogTextBox1.java +50 -0
- data/ApiDemos/src/com/example/android/apis/text/Marquee.java +31 -0
- data/ApiDemos/src/com/example/android/apis/view/Animation1.java +45 -0
- data/ApiDemos/src/com/example/android/apis/view/Animation2.java +90 -0
- data/ApiDemos/src/com/example/android/apis/view/Animation3.java +101 -0
- data/ApiDemos/src/com/example/android/apis/view/AutoComplete1.java +82 -0
- data/ApiDemos/src/com/example/android/apis/view/AutoComplete2.java +41 -0
- data/ApiDemos/src/com/example/android/apis/view/AutoComplete3.java +43 -0
- data/ApiDemos/src/com/example/android/apis/view/AutoComplete4.java +103 -0
- data/ApiDemos/src/com/example/android/apis/view/AutoComplete5.java +44 -0
- data/ApiDemos/src/com/example/android/apis/view/AutoComplete6.java +83 -0
- data/ApiDemos/src/com/example/android/apis/view/Baseline1.java +35 -0
- data/ApiDemos/src/com/example/android/apis/view/Baseline2.java +35 -0
- data/ApiDemos/src/com/example/android/apis/view/Baseline3.java +36 -0
- data/ApiDemos/src/com/example/android/apis/view/Baseline4.java +35 -0
- data/ApiDemos/src/com/example/android/apis/view/Baseline6.java +35 -0
- data/ApiDemos/src/com/example/android/apis/view/Baseline7.java +35 -0
- data/ApiDemos/src/com/example/android/apis/view/BaselineNested1.java +36 -0
- data/ApiDemos/src/com/example/android/apis/view/BaselineNested2.java +36 -0
- data/ApiDemos/src/com/example/android/apis/view/BaselineNested3.java +36 -0
- data/ApiDemos/src/com/example/android/apis/view/Buttons1.java +36 -0
- data/ApiDemos/src/com/example/android/apis/view/CheckableFrameLayout.java +49 -0
- data/ApiDemos/src/com/example/android/apis/view/Cheeses.java +155 -0
- data/ApiDemos/src/com/example/android/apis/view/ChronometerDemo.java +90 -0
- data/ApiDemos/src/com/example/android/apis/view/Controls1.java +54 -0
- data/ApiDemos/src/com/example/android/apis/view/Controls2.java +19 -0
- data/ApiDemos/src/com/example/android/apis/view/Controls3.java +19 -0
- data/ApiDemos/src/com/example/android/apis/view/Controls4.java +19 -0
- data/ApiDemos/src/com/example/android/apis/view/Controls5.java +19 -0
- data/ApiDemos/src/com/example/android/apis/view/Controls6.java +19 -0
- data/ApiDemos/src/com/example/android/apis/view/CustomView1.java +40 -0
- data/ApiDemos/src/com/example/android/apis/view/DateWidgets1.java +156 -0
- data/ApiDemos/src/com/example/android/apis/view/DateWidgets2.java +68 -0
- data/ApiDemos/src/com/example/android/apis/view/DragAndDropDemo.java +72 -0
- data/ApiDemos/src/com/example/android/apis/view/DraggableDot.java +261 -0
- data/ApiDemos/src/com/example/android/apis/view/ExpandableList1.java +160 -0
- data/ApiDemos/src/com/example/android/apis/view/ExpandableList2.java +138 -0
- data/ApiDemos/src/com/example/android/apis/view/ExpandableList3.java +76 -0
- data/ApiDemos/src/com/example/android/apis/view/Focus1.java +47 -0
- data/ApiDemos/src/com/example/android/apis/view/Focus2.java +32 -0
- data/ApiDemos/src/com/example/android/apis/view/Focus3.java +45 -0
- data/ApiDemos/src/com/example/android/apis/view/Focus5.java +31 -0
- data/ApiDemos/src/com/example/android/apis/view/Gallery1.java +139 -0
- data/ApiDemos/src/com/example/android/apis/view/Gallery2.java +61 -0
- data/ApiDemos/src/com/example/android/apis/view/GameControllerInput.java +467 -0
- data/ApiDemos/src/com/example/android/apis/view/GameView.java +747 -0
- data/ApiDemos/src/com/example/android/apis/view/Grid1.java +95 -0
- data/ApiDemos/src/com/example/android/apis/view/Grid2.java +166 -0
- data/ApiDemos/src/com/example/android/apis/view/Grid3.java +164 -0
- data/ApiDemos/src/com/example/android/apis/view/GridLayout0.java +113 -0
- data/ApiDemos/src/com/example/android/apis/view/GridLayout1.java +32 -0
- data/ApiDemos/src/com/example/android/apis/view/HorizontalScrollView1.java +33 -0
- data/ApiDemos/src/com/example/android/apis/view/Hover.java +106 -0
- data/ApiDemos/src/com/example/android/apis/view/HoverInterceptorView.java +71 -0
- data/ApiDemos/src/com/example/android/apis/view/ImageButton1.java +33 -0
- data/ApiDemos/src/com/example/android/apis/view/ImageSwitcher1.java +120 -0
- data/ApiDemos/src/com/example/android/apis/view/ImageView1.java +36 -0
- data/ApiDemos/src/com/example/android/apis/view/InternalSelectionFocus.java +74 -0
- data/ApiDemos/src/com/example/android/apis/view/InternalSelectionScroll.java +64 -0
- data/ApiDemos/src/com/example/android/apis/view/InternalSelectionView.java +272 -0
- data/ApiDemos/src/com/example/android/apis/view/LabelView.java +194 -0
- data/ApiDemos/src/com/example/android/apis/view/LayoutAnimation1.java +81 -0
- data/ApiDemos/src/com/example/android/apis/view/LayoutAnimation2.java +64 -0
- data/ApiDemos/src/com/example/android/apis/view/LayoutAnimation3.java +44 -0
- data/ApiDemos/src/com/example/android/apis/view/LayoutAnimation4.java +81 -0
- data/ApiDemos/src/com/example/android/apis/view/LayoutAnimation5.java +81 -0
- data/ApiDemos/src/com/example/android/apis/view/LayoutAnimation6.java +81 -0
- data/ApiDemos/src/com/example/android/apis/view/LayoutAnimation7.java +31 -0
- data/ApiDemos/src/com/example/android/apis/view/LinearLayout1.java +37 -0
- data/ApiDemos/src/com/example/android/apis/view/LinearLayout10.java +37 -0
- data/ApiDemos/src/com/example/android/apis/view/LinearLayout2.java +37 -0
- data/ApiDemos/src/com/example/android/apis/view/LinearLayout3.java +37 -0
- data/ApiDemos/src/com/example/android/apis/view/LinearLayout4.java +38 -0
- data/ApiDemos/src/com/example/android/apis/view/LinearLayout5.java +38 -0
- data/ApiDemos/src/com/example/android/apis/view/LinearLayout6.java +38 -0
- data/ApiDemos/src/com/example/android/apis/view/LinearLayout7.java +38 -0
- data/ApiDemos/src/com/example/android/apis/view/LinearLayout8.java +106 -0
- data/ApiDemos/src/com/example/android/apis/view/LinearLayout9.java +41 -0
- data/ApiDemos/src/com/example/android/apis/view/List1.java +42 -0
- data/ApiDemos/src/com/example/android/apis/view/List10.java +49 -0
- data/ApiDemos/src/com/example/android/apis/view/List11.java +49 -0
- data/ApiDemos/src/com/example/android/apis/view/List12.java +83 -0
- data/ApiDemos/src/com/example/android/apis/view/List13.java +341 -0
- data/ApiDemos/src/com/example/android/apis/view/List14.java +141 -0
- data/ApiDemos/src/com/example/android/apis/view/List15.java +104 -0
- data/ApiDemos/src/com/example/android/apis/view/List16.java +100 -0
- data/ApiDemos/src/com/example/android/apis/view/List17.java +57 -0
- data/ApiDemos/src/com/example/android/apis/view/List2.java +57 -0
- data/ApiDemos/src/com/example/android/apis/view/List3.java +84 -0
- data/ApiDemos/src/com/example/android/apis/view/List4.java +154 -0
- data/ApiDemos/src/com/example/android/apis/view/List5.java +118 -0
- data/ApiDemos/src/com/example/android/apis/view/List6.java +410 -0
- data/ApiDemos/src/com/example/android/apis/view/List7.java +99 -0
- data/ApiDemos/src/com/example/android/apis/view/List8.java +133 -0
- data/ApiDemos/src/com/example/android/apis/view/List9.java +144 -0
- data/ApiDemos/src/com/example/android/apis/view/OverscanActivity.java +184 -0
- data/ApiDemos/src/com/example/android/apis/view/PopupMenu1.java +53 -0
- data/ApiDemos/src/com/example/android/apis/view/ProgressBar1.java +84 -0
- data/ApiDemos/src/com/example/android/apis/view/ProgressBar2.java +44 -0
- data/ApiDemos/src/com/example/android/apis/view/ProgressBar3.java +84 -0
- data/ApiDemos/src/com/example/android/apis/view/ProgressBar4.java +51 -0
- data/ApiDemos/src/com/example/android/apis/view/RadioGroup1.java +74 -0
- data/ApiDemos/src/com/example/android/apis/view/RatingBar1.java +74 -0
- data/ApiDemos/src/com/example/android/apis/view/RelativeLayout1.java +37 -0
- data/ApiDemos/src/com/example/android/apis/view/RelativeLayout2.java +38 -0
- data/ApiDemos/src/com/example/android/apis/view/RotatingButton.java +152 -0
- data/ApiDemos/src/com/example/android/apis/view/ScrollBar1.java +32 -0
- data/ApiDemos/src/com/example/android/apis/view/ScrollBar2.java +32 -0
- data/ApiDemos/src/com/example/android/apis/view/ScrollBar3.java +35 -0
- data/ApiDemos/src/com/example/android/apis/view/ScrollView1.java +37 -0
- data/ApiDemos/src/com/example/android/apis/view/ScrollView2.java +52 -0
- data/ApiDemos/src/com/example/android/apis/view/SearchViewActionBar.java +115 -0
- data/ApiDemos/src/com/example/android/apis/view/SearchViewAlwaysVisible.java +46 -0
- data/ApiDemos/src/com/example/android/apis/view/SearchViewFilterMode.java +78 -0
- data/ApiDemos/src/com/example/android/apis/view/SecureView.java +144 -0
- data/ApiDemos/src/com/example/android/apis/view/SecureViewOverlay.java +74 -0
- data/ApiDemos/src/com/example/android/apis/view/SeekBar1.java +60 -0
- data/ApiDemos/src/com/example/android/apis/view/Spinner1.java +78 -0
- data/ApiDemos/src/com/example/android/apis/view/SplitTouchView.java +66 -0
- data/ApiDemos/src/com/example/android/apis/view/Switches.java +48 -0
- data/ApiDemos/src/com/example/android/apis/view/TableLayout1.java +32 -0
- data/ApiDemos/src/com/example/android/apis/view/TableLayout10.java +31 -0
- data/ApiDemos/src/com/example/android/apis/view/TableLayout11.java +34 -0
- data/ApiDemos/src/com/example/android/apis/view/TableLayout12.java +34 -0
- data/ApiDemos/src/com/example/android/apis/view/TableLayout2.java +32 -0
- data/ApiDemos/src/com/example/android/apis/view/TableLayout3.java +32 -0
- data/ApiDemos/src/com/example/android/apis/view/TableLayout4.java +32 -0
- data/ApiDemos/src/com/example/android/apis/view/TableLayout5.java +32 -0
- data/ApiDemos/src/com/example/android/apis/view/TableLayout6.java +32 -0
- data/ApiDemos/src/com/example/android/apis/view/TableLayout7.java +80 -0
- data/ApiDemos/src/com/example/android/apis/view/TableLayout8.java +71 -0
- data/ApiDemos/src/com/example/android/apis/view/TableLayout9.java +48 -0
- data/ApiDemos/src/com/example/android/apis/view/Tabs1.java +50 -0
- data/ApiDemos/src/com/example/android/apis/view/Tabs2.java +57 -0
- data/ApiDemos/src/com/example/android/apis/view/Tabs3.java +50 -0
- data/ApiDemos/src/com/example/android/apis/view/Tabs4.java +23 -0
- data/ApiDemos/src/com/example/android/apis/view/Tabs5.java +54 -0
- data/ApiDemos/src/com/example/android/apis/view/Tabs6.java +55 -0
- data/ApiDemos/src/com/example/android/apis/view/TextSwitcher1.java +79 -0
- data/ApiDemos/src/com/example/android/apis/view/Visibility1.java +74 -0
- data/ApiDemos/src/com/example/android/apis/view/WebView1.java +71 -0
- data/ApiDemos/tests/AndroidManifest.xml +37 -0
- data/ApiDemos/tests/ant.properties +18 -0
- data/ApiDemos/tests/build.xml +83 -0
- data/ApiDemos/tests/local.properties +10 -0
- data/ApiDemos/tests/proguard-project.txt +20 -0
- data/ApiDemos/tests/project.properties +14 -0
- data/ApiDemos/tests/src/com/example/android/apis/AllTests.java +53 -0
- data/ApiDemos/tests/src/com/example/android/apis/ApiDemosApplicationTests.java +62 -0
- data/ApiDemos/tests/src/com/example/android/apis/ApiDemosTest.java +40 -0
- data/ApiDemos/tests/src/com/example/android/apis/app/ForwardingTest.java +129 -0
- data/ApiDemos/tests/src/com/example/android/apis/app/LocalServiceTest.java +80 -0
- data/ApiDemos/tests/src/com/example/android/apis/os/MorseCodeConverterTest.java +54 -0
- data/ApiDemos/tests/src/com/example/android/apis/view/Focus2ActivityTest.java +111 -0
- data/ApiDemos/tests/src/com/example/android/apis/view/Focus2AndroidTest.java +113 -0
- data/ChangeLog +2 -0
- data/Gemfile +12 -0
- data/Guardfile +17 -0
- data/LICENSE +22 -0
- data/README.md +59 -0
- data/Rakefile +24 -0
- data/cucumber.yml +6 -0
- data/features/button.feature +16 -0
- data/features/checkbox.feature +9 -0
- data/features/list_item.feature +13 -0
- data/features/main_screen.feature +18 -0
- data/features/radio_button.feature +6 -0
- data/features/step_definitions/button_steps.rb +22 -0
- data/features/step_definitions/calabash_steps.rb +1 -0
- data/features/step_definitions/checkbox_steps.rb +3 -0
- data/features/step_definitions/controls_steps.rb +19 -0
- data/features/step_definitions/list_item_steps.rb +7 -0
- data/features/step_definitions/main_screen_steps.rb +22 -0
- data/features/step_definitions/radio_button_steps.rb +3 -0
- data/features/support/app_installation_hooks.rb +31 -0
- data/features/support/app_life_cycle_hooks.rb +28 -0
- data/features/support/env.rb +8 -0
- data/features/support/hooks.rb +18 -0
- data/features/support/screens/buttons_screen.rb +9 -0
- data/features/support/screens/controls_menu_screen.rb +8 -0
- data/features/support/screens/controls_screen.rb +11 -0
- data/features/support/screens/main_menu_screen.rb +15 -0
- data/features/support/screens/views_menu_screen.rb +40 -0
- data/features/text.feature +7 -0
- data/gametel.gemspec +23 -0
- data/irb_android.sh +2 -0
- data/lib/gametel.rb +55 -0
- data/lib/gametel/accessors.rb +98 -0
- data/lib/gametel/navigation.rb +9 -0
- data/lib/gametel/platforms/calabash.rb +89 -0
- data/lib/gametel/version.rb +3 -0
- data/spec/lib/gametel/accessors_spec.rb +67 -0
- data/spec/lib/gametel_spec.rb +44 -0
- data/spec/spec_helper.rb +19 -0
- metadata +1043 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2011 The Android Open Source Project
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
|
17
|
+
package com.example.android.apis.app;
|
18
|
+
|
19
|
+
import com.example.android.apis.R;
|
20
|
+
|
21
|
+
import android.content.BroadcastReceiver;
|
22
|
+
import android.content.Context;
|
23
|
+
import android.content.Intent;
|
24
|
+
import android.widget.Toast;
|
25
|
+
|
26
|
+
/**
|
27
|
+
* Executed when a new version of the application is is installed.
|
28
|
+
*/
|
29
|
+
public class AppUpdateReceiver extends BroadcastReceiver {
|
30
|
+
@Override
|
31
|
+
public void onReceive(Context context, Intent intent) {
|
32
|
+
Toast.makeText(context, R.string.app_update_received, Toast.LENGTH_SHORT).show();
|
33
|
+
}
|
34
|
+
}
|
@@ -0,0 +1,53 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2007 The Android Open Source Project
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
|
17
|
+
package com.example.android.apis.app;
|
18
|
+
|
19
|
+
// Need the following import to get access to the app resources, since this
|
20
|
+
// class is in a sub-package.
|
21
|
+
import android.app.Activity;
|
22
|
+
import android.content.ComponentName;
|
23
|
+
import android.os.Bundle;
|
24
|
+
import android.view.View;
|
25
|
+
import android.view.View.OnClickListener;
|
26
|
+
import android.widget.Button;
|
27
|
+
|
28
|
+
import com.example.android.apis.R;
|
29
|
+
|
30
|
+
/**
|
31
|
+
* Front-end for launching {@link ContactsFilterInstrumentation} example
|
32
|
+
* instrumentation class.
|
33
|
+
*/
|
34
|
+
public class ContactsFilter extends Activity {
|
35
|
+
@Override
|
36
|
+
protected void onCreate(Bundle savedInstanceState) {
|
37
|
+
super.onCreate(savedInstanceState);
|
38
|
+
|
39
|
+
setContentView(R.layout.contacts_filter);
|
40
|
+
|
41
|
+
// Watch for button clicks.
|
42
|
+
Button button = (Button)findViewById(R.id.go);
|
43
|
+
button.setOnClickListener(mGoListener);
|
44
|
+
}
|
45
|
+
|
46
|
+
private OnClickListener mGoListener = new OnClickListener() {
|
47
|
+
public void onClick(View v) {
|
48
|
+
startInstrumentation(new ComponentName(ContactsFilter.this,
|
49
|
+
ContactsFilterInstrumentation.class), null, null);
|
50
|
+
}
|
51
|
+
};
|
52
|
+
}
|
53
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2007 The Android Open Source Project
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
|
17
|
+
package com.example.android.apis.app;
|
18
|
+
|
19
|
+
import android.app.Activity;
|
20
|
+
import android.app.Instrumentation;
|
21
|
+
import android.content.Intent;
|
22
|
+
import android.view.KeyEvent;
|
23
|
+
import android.os.Bundle;
|
24
|
+
import android.util.Log;
|
25
|
+
|
26
|
+
/**
|
27
|
+
* This is an example implementation of the {@link android.app.Instrumentation}
|
28
|
+
* class, allowing you to run tests against application code. The
|
29
|
+
* instrumentation implementation here is loaded into the application's
|
30
|
+
* process, for controlling and monitoring what it does.
|
31
|
+
*/
|
32
|
+
public class ContactsFilterInstrumentation extends Instrumentation {
|
33
|
+
@Override
|
34
|
+
public void onCreate(Bundle arguments) {
|
35
|
+
super.onCreate(arguments);
|
36
|
+
|
37
|
+
// When this instrumentation is created, we simply want to start
|
38
|
+
// its test code off in a separate thread, which will call back
|
39
|
+
// to us in onStart().
|
40
|
+
start();
|
41
|
+
}
|
42
|
+
|
43
|
+
@Override
|
44
|
+
public void onStart() {
|
45
|
+
super.onStart();
|
46
|
+
// First start the activity we are instrumenting -- the contacts
|
47
|
+
// list.
|
48
|
+
Intent intent = new Intent(Intent.ACTION_MAIN);
|
49
|
+
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
50
|
+
intent.setClassName(getTargetContext(),
|
51
|
+
"com.android.phone.Dialer");
|
52
|
+
Activity activity = startActivitySync(intent);
|
53
|
+
|
54
|
+
// This is the Activity object that was started, to do with as we want.
|
55
|
+
Log.i("ContactsFilterInstrumentation", "Started: " + activity);
|
56
|
+
|
57
|
+
// We are going to enqueue a couple key events to simulate the user
|
58
|
+
// filtering the list. This is the low-level API so we must send both
|
59
|
+
// down and up events.
|
60
|
+
sendKeySync(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_M));
|
61
|
+
sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_M));
|
62
|
+
sendKeySync(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A));
|
63
|
+
sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A));
|
64
|
+
|
65
|
+
// Wait for the activity to finish all of its processing.
|
66
|
+
waitForIdleSync();
|
67
|
+
|
68
|
+
// And we are done!
|
69
|
+
Log.i("ContactsFilterInstrumentation", "Done!");
|
70
|
+
finish(Activity.RESULT_OK, null);
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
@@ -0,0 +1,86 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2007 The Android Open Source Project
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
|
17
|
+
package com.example.android.apis.app;
|
18
|
+
|
19
|
+
import android.app.Activity;
|
20
|
+
import android.app.Instrumentation;
|
21
|
+
import android.content.Intent;
|
22
|
+
import android.content.IntentFilter;
|
23
|
+
import android.view.KeyEvent;
|
24
|
+
import android.provider.ContactsContract;
|
25
|
+
import android.os.Bundle;
|
26
|
+
import android.util.Log;
|
27
|
+
|
28
|
+
/**
|
29
|
+
* This is an example implementation of the {@link android.app.Instrumentation}
|
30
|
+
* class, allowing you to run tests against application code. The
|
31
|
+
* instrumentation implementation here is loaded into the application's
|
32
|
+
* process, for controlling and monitoring what it does.
|
33
|
+
*/
|
34
|
+
public class ContactsSelectInstrumentation extends Instrumentation {
|
35
|
+
@Override
|
36
|
+
public void onCreate(Bundle arguments) {
|
37
|
+
super.onCreate(arguments);
|
38
|
+
|
39
|
+
// When this instrumentation is created, we simply want to start
|
40
|
+
// its test code off in a separate thread, which will call back
|
41
|
+
// to us in onStart().
|
42
|
+
start();
|
43
|
+
}
|
44
|
+
|
45
|
+
@Override
|
46
|
+
public void onStart() {
|
47
|
+
super.onStart();
|
48
|
+
// First start the activity we are instrumenting -- the contacts
|
49
|
+
// list.
|
50
|
+
Intent intent = new Intent(Intent.ACTION_MAIN);
|
51
|
+
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
52
|
+
intent.setClassName(getTargetContext(),
|
53
|
+
"com.android.phone.Dialer");
|
54
|
+
Activity activity = startActivitySync(intent);
|
55
|
+
|
56
|
+
// This is the Activity object that was started, to do with as we want.
|
57
|
+
Log.i("ContactsSelectInstrumentation", "Started: " + activity);
|
58
|
+
|
59
|
+
// Monitor for the expected start activity call.
|
60
|
+
ActivityMonitor am = addMonitor(IntentFilter.create(
|
61
|
+
Intent.ACTION_VIEW, ContactsContract.Contacts.CONTENT_ITEM_TYPE), null, true);
|
62
|
+
|
63
|
+
// We are going to enqueue a couple key events to simulate the user
|
64
|
+
// selecting an item in the list.
|
65
|
+
sendKeySync(new KeyEvent(
|
66
|
+
KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN));
|
67
|
+
sendKeySync(new KeyEvent(
|
68
|
+
KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_DOWN));
|
69
|
+
sendKeySync(new KeyEvent(
|
70
|
+
KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER));
|
71
|
+
sendKeySync(new KeyEvent(
|
72
|
+
KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER));
|
73
|
+
|
74
|
+
// Was the expected activity started?
|
75
|
+
if (checkMonitorHit(am, 1)) {
|
76
|
+
Log.i("ContactsSelectInstrumentation", "Activity started!");
|
77
|
+
} else {
|
78
|
+
Log.i("ContactsSelectInstrumentation", "*** ACTIVITY NOT STARTED!");
|
79
|
+
}
|
80
|
+
|
81
|
+
// And we are done!
|
82
|
+
Log.i("ContactsSelectInstrumentation", "Done!");
|
83
|
+
finish(Activity.RESULT_OK, null);
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2008 The Android Open Source Project
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
|
17
|
+
package com.example.android.apis.app;
|
18
|
+
|
19
|
+
// Need the following import to get access to the app resources, since this
|
20
|
+
// class is in a sub-package.
|
21
|
+
import com.example.android.apis.R;
|
22
|
+
|
23
|
+
import android.app.Activity;
|
24
|
+
import android.os.Bundle;
|
25
|
+
|
26
|
+
/**
|
27
|
+
* <h3>Dialog Activity</h3>
|
28
|
+
*
|
29
|
+
* <p>This demonstrates the how to write an activity that looks like
|
30
|
+
* a pop-up dialog with a custom theme using a different text color.</p>
|
31
|
+
*/
|
32
|
+
public class CustomDialogActivity extends Activity {
|
33
|
+
/**
|
34
|
+
* Initialization of the Activity after it is first created. Must at least
|
35
|
+
* call {@link android.app.Activity#setContentView setContentView()} to
|
36
|
+
* describe what is to be displayed in the screen.
|
37
|
+
*/
|
38
|
+
@Override
|
39
|
+
protected void onCreate(Bundle savedInstanceState) {
|
40
|
+
// Be sure to call the super class.
|
41
|
+
super.onCreate(savedInstanceState);
|
42
|
+
|
43
|
+
// See assets/res/any/layout/dialog_activity.xml for this
|
44
|
+
// view layout definition, which is being set here as
|
45
|
+
// the content of our screen.
|
46
|
+
setContentView(R.layout.custom_dialog_activity);
|
47
|
+
}
|
48
|
+
}
|
@@ -0,0 +1,85 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2007 The Android Open Source Project
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
|
17
|
+
package com.example.android.apis.app;
|
18
|
+
|
19
|
+
import android.app.Activity;
|
20
|
+
import android.os.Bundle;
|
21
|
+
import android.view.View;
|
22
|
+
import android.view.Window;
|
23
|
+
import android.view.View.OnClickListener;
|
24
|
+
import android.widget.Button;
|
25
|
+
import android.widget.EditText;
|
26
|
+
import android.widget.TextView;
|
27
|
+
|
28
|
+
import com.example.android.apis.R;
|
29
|
+
|
30
|
+
|
31
|
+
/**
|
32
|
+
* Example of how to use a custom title {@link android.view.Window#FEATURE_CUSTOM_TITLE}.
|
33
|
+
* <h3>CustomTitle</h3>
|
34
|
+
|
35
|
+
<p>This demonstrates how a custom title can be used.</p>
|
36
|
+
|
37
|
+
<h4>Demo</h4>
|
38
|
+
App/Title/Custom Title
|
39
|
+
|
40
|
+
<h4>Source files</h4>
|
41
|
+
* <table class="LinkTable">
|
42
|
+
* <tr>
|
43
|
+
* <td >src/com.example.android.apis/app/CustomTitle.java</td>
|
44
|
+
* <td >The Custom Title implementation</td>
|
45
|
+
* </tr>
|
46
|
+
* <tr>
|
47
|
+
* <td >/res/any/layout/custom_title.xml</td>
|
48
|
+
* <td >Defines contents of the screen</td>
|
49
|
+
* </tr>
|
50
|
+
* </table>
|
51
|
+
*/
|
52
|
+
public class CustomTitle extends Activity {
|
53
|
+
|
54
|
+
/**
|
55
|
+
* Initialization of the Activity after it is first created. Must at least
|
56
|
+
* call {@link android.app.Activity#setContentView(int)} to
|
57
|
+
* describe what is to be displayed in the screen.
|
58
|
+
*/
|
59
|
+
@Override
|
60
|
+
protected void onCreate(Bundle savedInstanceState) {
|
61
|
+
super.onCreate(savedInstanceState);
|
62
|
+
|
63
|
+
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
|
64
|
+
setContentView(R.layout.custom_title);
|
65
|
+
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_1);
|
66
|
+
|
67
|
+
final TextView leftText = (TextView) findViewById(R.id.left_text);
|
68
|
+
final TextView rightText = (TextView) findViewById(R.id.right_text);
|
69
|
+
final EditText leftTextEdit = (EditText) findViewById(R.id.left_text_edit);
|
70
|
+
final EditText rightTextEdit = (EditText) findViewById(R.id.right_text_edit);
|
71
|
+
Button leftButton = (Button) findViewById(R.id.left_text_button);
|
72
|
+
Button rightButton = (Button) findViewById(R.id.right_text_button);
|
73
|
+
|
74
|
+
leftButton.setOnClickListener(new OnClickListener() {
|
75
|
+
public void onClick(View v) {
|
76
|
+
leftText.setText(leftTextEdit.getText());
|
77
|
+
}
|
78
|
+
});
|
79
|
+
rightButton.setOnClickListener(new OnClickListener() {
|
80
|
+
public void onClick(View v) {
|
81
|
+
rightText.setText(rightTextEdit.getText());
|
82
|
+
}
|
83
|
+
});
|
84
|
+
}
|
85
|
+
}
|
@@ -0,0 +1,938 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2010 The Android Open Source Project
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
|
17
|
+
package com.example.android.apis.app;
|
18
|
+
|
19
|
+
import com.example.android.apis.R;
|
20
|
+
|
21
|
+
import android.app.ActivityManager;
|
22
|
+
import android.app.AlertDialog;
|
23
|
+
import android.app.admin.DeviceAdminReceiver;
|
24
|
+
import android.app.admin.DevicePolicyManager;
|
25
|
+
import android.content.ComponentName;
|
26
|
+
import android.content.Context;
|
27
|
+
import android.content.DialogInterface;
|
28
|
+
import android.content.Intent;
|
29
|
+
import android.os.Bundle;
|
30
|
+
import android.preference.CheckBoxPreference;
|
31
|
+
import android.preference.EditTextPreference;
|
32
|
+
import android.preference.ListPreference;
|
33
|
+
import android.preference.Preference;
|
34
|
+
import android.preference.Preference.OnPreferenceChangeListener;
|
35
|
+
import android.preference.Preference.OnPreferenceClickListener;
|
36
|
+
import android.preference.PreferenceActivity;
|
37
|
+
import android.preference.PreferenceCategory;
|
38
|
+
import android.preference.PreferenceFragment;
|
39
|
+
import android.preference.PreferenceScreen;
|
40
|
+
import android.text.TextUtils;
|
41
|
+
import android.util.Log;
|
42
|
+
import android.widget.Toast;
|
43
|
+
|
44
|
+
import java.util.List;
|
45
|
+
|
46
|
+
/**
|
47
|
+
* This activity provides a comprehensive UI for exploring and operating the DevicePolicyManager
|
48
|
+
* api. It consists of two primary modules:
|
49
|
+
*
|
50
|
+
* 1: A device policy controller, implemented here as a series of preference fragments. Each
|
51
|
+
* one contains code to monitor and control a particular subset of device policies.
|
52
|
+
*
|
53
|
+
* 2: A DeviceAdminReceiver, to receive updates from the DevicePolicyManager when certain aspects
|
54
|
+
* of the device security status have changed.
|
55
|
+
*/
|
56
|
+
public class DeviceAdminSample extends PreferenceActivity {
|
57
|
+
|
58
|
+
// Miscellaneous utilities and definitions
|
59
|
+
private static final String TAG = "DeviceAdminSample";
|
60
|
+
|
61
|
+
private static final int REQUEST_CODE_ENABLE_ADMIN = 1;
|
62
|
+
private static final int REQUEST_CODE_START_ENCRYPTION = 2;
|
63
|
+
|
64
|
+
private static final long MS_PER_MINUTE = 60 * 1000;
|
65
|
+
private static final long MS_PER_HOUR = 60 * MS_PER_MINUTE;
|
66
|
+
private static final long MS_PER_DAY = 24 * MS_PER_HOUR;
|
67
|
+
|
68
|
+
// The following keys are used to find each preference item
|
69
|
+
private static final String KEY_ENABLE_ADMIN = "key_enable_admin";
|
70
|
+
private static final String KEY_DISABLE_CAMERA = "key_disable_camera";
|
71
|
+
|
72
|
+
private static final String KEY_CATEGORY_QUALITY = "key_category_quality";
|
73
|
+
private static final String KEY_SET_PASSWORD = "key_set_password";
|
74
|
+
private static final String KEY_RESET_PASSWORD = "key_reset_password";
|
75
|
+
private static final String KEY_QUALITY = "key_quality";
|
76
|
+
private static final String KEY_MIN_LENGTH = "key_minimum_length";
|
77
|
+
private static final String KEY_MIN_LETTERS = "key_minimum_letters";
|
78
|
+
private static final String KEY_MIN_NUMERIC = "key_minimum_numeric";
|
79
|
+
private static final String KEY_MIN_LOWER_CASE = "key_minimum_lower_case";
|
80
|
+
private static final String KEY_MIN_UPPER_CASE = "key_minimum_upper_case";
|
81
|
+
private static final String KEY_MIN_SYMBOLS = "key_minimum_symbols";
|
82
|
+
private static final String KEY_MIN_NON_LETTER = "key_minimum_non_letter";
|
83
|
+
|
84
|
+
private static final String KEY_CATEGORY_EXPIRATION = "key_category_expiration";
|
85
|
+
private static final String KEY_HISTORY = "key_history";
|
86
|
+
private static final String KEY_EXPIRATION_TIMEOUT = "key_expiration_timeout";
|
87
|
+
private static final String KEY_EXPIRATION_STATUS = "key_expiration_status";
|
88
|
+
|
89
|
+
private static final String KEY_CATEGORY_LOCK_WIPE = "key_category_lock_wipe";
|
90
|
+
private static final String KEY_MAX_TIME_SCREEN_LOCK = "key_max_time_screen_lock";
|
91
|
+
private static final String KEY_MAX_FAILS_BEFORE_WIPE = "key_max_fails_before_wipe";
|
92
|
+
private static final String KEY_LOCK_SCREEN = "key_lock_screen";
|
93
|
+
private static final String KEY_WIPE_DATA = "key_wipe_data";
|
94
|
+
private static final String KEY_WIP_DATA_ALL = "key_wipe_data_all";
|
95
|
+
|
96
|
+
private static final String KEY_CATEGORY_ENCRYPTION = "key_category_encryption";
|
97
|
+
private static final String KEY_REQUIRE_ENCRYPTION = "key_require_encryption";
|
98
|
+
private static final String KEY_ACTIVATE_ENCRYPTION = "key_activate_encryption";
|
99
|
+
|
100
|
+
// Interaction with the DevicePolicyManager
|
101
|
+
DevicePolicyManager mDPM;
|
102
|
+
ComponentName mDeviceAdminSample;
|
103
|
+
|
104
|
+
@Override
|
105
|
+
protected void onCreate(Bundle savedInstanceState) {
|
106
|
+
super.onCreate(savedInstanceState);
|
107
|
+
|
108
|
+
// Prepare to work with the DPM
|
109
|
+
mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
110
|
+
mDeviceAdminSample = new ComponentName(this, DeviceAdminSampleReceiver.class);
|
111
|
+
}
|
112
|
+
|
113
|
+
/**
|
114
|
+
* We override this method to provide PreferenceActivity with the top-level preference headers.
|
115
|
+
*/
|
116
|
+
@Override
|
117
|
+
public void onBuildHeaders(List<Header> target) {
|
118
|
+
loadHeadersFromResource(R.xml.device_admin_headers, target);
|
119
|
+
}
|
120
|
+
|
121
|
+
/**
|
122
|
+
* Helper to determine if we are an active admin
|
123
|
+
*/
|
124
|
+
private boolean isActiveAdmin() {
|
125
|
+
return mDPM.isAdminActive(mDeviceAdminSample);
|
126
|
+
}
|
127
|
+
|
128
|
+
/**
|
129
|
+
* Common fragment code for DevicePolicyManager access. Provides two shared elements:
|
130
|
+
*
|
131
|
+
* 1. Provides instance variables to access activity/context, DevicePolicyManager, etc.
|
132
|
+
* 2. Provides support for the "set password" button(s) shared by multiple fragments.
|
133
|
+
*/
|
134
|
+
public static class AdminSampleFragment extends PreferenceFragment
|
135
|
+
implements OnPreferenceChangeListener, OnPreferenceClickListener{
|
136
|
+
|
137
|
+
// Useful instance variables
|
138
|
+
protected DeviceAdminSample mActivity;
|
139
|
+
protected DevicePolicyManager mDPM;
|
140
|
+
protected ComponentName mDeviceAdminSample;
|
141
|
+
protected boolean mAdminActive;
|
142
|
+
|
143
|
+
// Optional shared UI
|
144
|
+
private PreferenceScreen mSetPassword;
|
145
|
+
private EditTextPreference mResetPassword;
|
146
|
+
|
147
|
+
@Override
|
148
|
+
public void onActivityCreated(Bundle savedInstanceState) {
|
149
|
+
super.onActivityCreated(savedInstanceState);
|
150
|
+
|
151
|
+
// Retrieve the useful instance variables
|
152
|
+
mActivity = (DeviceAdminSample) getActivity();
|
153
|
+
mDPM = mActivity.mDPM;
|
154
|
+
mDeviceAdminSample = mActivity.mDeviceAdminSample;
|
155
|
+
mAdminActive = mActivity.isActiveAdmin();
|
156
|
+
|
157
|
+
// Configure the shared UI elements (if they exist)
|
158
|
+
mResetPassword = (EditTextPreference) findPreference(KEY_RESET_PASSWORD);
|
159
|
+
mSetPassword = (PreferenceScreen) findPreference(KEY_SET_PASSWORD);
|
160
|
+
|
161
|
+
if (mResetPassword != null) {
|
162
|
+
mResetPassword.setOnPreferenceChangeListener(this);
|
163
|
+
}
|
164
|
+
if (mSetPassword != null) {
|
165
|
+
mSetPassword.setOnPreferenceClickListener(this);
|
166
|
+
}
|
167
|
+
}
|
168
|
+
|
169
|
+
@Override
|
170
|
+
public void onResume() {
|
171
|
+
super.onResume();
|
172
|
+
mAdminActive = mActivity.isActiveAdmin();
|
173
|
+
reloadSummaries();
|
174
|
+
// Resetting the password via API is available only to active admins
|
175
|
+
if (mResetPassword != null) {
|
176
|
+
mResetPassword.setEnabled(mAdminActive);
|
177
|
+
}
|
178
|
+
}
|
179
|
+
|
180
|
+
/**
|
181
|
+
* Called automatically at every onResume. Should also call explicitly any time a
|
182
|
+
* policy changes that may affect other policy values.
|
183
|
+
*/
|
184
|
+
protected void reloadSummaries() {
|
185
|
+
if (mSetPassword != null) {
|
186
|
+
if (mAdminActive) {
|
187
|
+
// Show password-sufficient status under Set Password button
|
188
|
+
boolean sufficient = mDPM.isActivePasswordSufficient();
|
189
|
+
mSetPassword.setSummary(sufficient ?
|
190
|
+
R.string.password_sufficient : R.string.password_insufficient);
|
191
|
+
} else {
|
192
|
+
mSetPassword.setSummary(null);
|
193
|
+
}
|
194
|
+
}
|
195
|
+
}
|
196
|
+
|
197
|
+
@Override
|
198
|
+
public boolean onPreferenceClick(Preference preference) {
|
199
|
+
if (mSetPassword != null && preference == mSetPassword) {
|
200
|
+
Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
|
201
|
+
startActivity(intent);
|
202
|
+
return true;
|
203
|
+
}
|
204
|
+
return false;
|
205
|
+
}
|
206
|
+
|
207
|
+
@Override
|
208
|
+
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
209
|
+
if (mResetPassword != null && preference == mResetPassword) {
|
210
|
+
doResetPassword((String)newValue);
|
211
|
+
return true;
|
212
|
+
}
|
213
|
+
return false;
|
214
|
+
}
|
215
|
+
|
216
|
+
/**
|
217
|
+
* This is dangerous, so we prevent automated tests from doing it, and we
|
218
|
+
* remind the user after we do it.
|
219
|
+
*/
|
220
|
+
private void doResetPassword(String newPassword) {
|
221
|
+
if (alertIfMonkey(mActivity, R.string.monkey_reset_password)) {
|
222
|
+
return;
|
223
|
+
}
|
224
|
+
mDPM.resetPassword(newPassword, DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY);
|
225
|
+
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
|
226
|
+
String message = mActivity.getString(R.string.reset_password_warning, newPassword);
|
227
|
+
builder.setMessage(message);
|
228
|
+
builder.setPositiveButton(R.string.reset_password_ok, null);
|
229
|
+
builder.show();
|
230
|
+
}
|
231
|
+
|
232
|
+
/**
|
233
|
+
* Simple helper for summaries showing local & global (aggregate) policy settings
|
234
|
+
*/
|
235
|
+
protected String localGlobalSummary(Object local, Object global) {
|
236
|
+
return getString(R.string.status_local_global, local, global);
|
237
|
+
}
|
238
|
+
}
|
239
|
+
|
240
|
+
/**
|
241
|
+
* PreferenceFragment for "general" preferences.
|
242
|
+
*/
|
243
|
+
public static class GeneralFragment extends AdminSampleFragment
|
244
|
+
implements OnPreferenceChangeListener {
|
245
|
+
// UI elements
|
246
|
+
private CheckBoxPreference mEnableCheckbox;
|
247
|
+
private CheckBoxPreference mDisableCameraCheckbox;
|
248
|
+
|
249
|
+
@Override
|
250
|
+
public void onCreate(Bundle savedInstanceState) {
|
251
|
+
super.onCreate(savedInstanceState);
|
252
|
+
addPreferencesFromResource(R.xml.device_admin_general);
|
253
|
+
mEnableCheckbox = (CheckBoxPreference) findPreference(KEY_ENABLE_ADMIN);
|
254
|
+
mEnableCheckbox.setOnPreferenceChangeListener(this);
|
255
|
+
mDisableCameraCheckbox = (CheckBoxPreference) findPreference(KEY_DISABLE_CAMERA);
|
256
|
+
mDisableCameraCheckbox.setOnPreferenceChangeListener(this);
|
257
|
+
}
|
258
|
+
|
259
|
+
// At onResume time, reload UI with current values as required
|
260
|
+
@Override
|
261
|
+
public void onResume() {
|
262
|
+
super.onResume();
|
263
|
+
mEnableCheckbox.setChecked(mAdminActive);
|
264
|
+
enableDeviceCapabilitiesArea(mAdminActive);
|
265
|
+
|
266
|
+
if (mAdminActive) {
|
267
|
+
mDPM.setCameraDisabled(mDeviceAdminSample, mDisableCameraCheckbox.isChecked());
|
268
|
+
reloadSummaries();
|
269
|
+
}
|
270
|
+
}
|
271
|
+
|
272
|
+
@Override
|
273
|
+
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
274
|
+
if (super.onPreferenceChange(preference, newValue)) {
|
275
|
+
return true;
|
276
|
+
}
|
277
|
+
boolean value = (Boolean) newValue;
|
278
|
+
if (preference == mEnableCheckbox) {
|
279
|
+
if (value != mAdminActive) {
|
280
|
+
if (value) {
|
281
|
+
// Launch the activity to have the user enable our admin.
|
282
|
+
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
|
283
|
+
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample);
|
284
|
+
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
|
285
|
+
mActivity.getString(R.string.add_admin_extra_app_text));
|
286
|
+
startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN);
|
287
|
+
// return false - don't update checkbox until we're really active
|
288
|
+
return false;
|
289
|
+
} else {
|
290
|
+
mDPM.removeActiveAdmin(mDeviceAdminSample);
|
291
|
+
enableDeviceCapabilitiesArea(false);
|
292
|
+
mAdminActive = false;
|
293
|
+
}
|
294
|
+
}
|
295
|
+
} else if (preference == mDisableCameraCheckbox) {
|
296
|
+
mDPM.setCameraDisabled(mDeviceAdminSample, value);
|
297
|
+
reloadSummaries();
|
298
|
+
}
|
299
|
+
return true;
|
300
|
+
}
|
301
|
+
|
302
|
+
@Override
|
303
|
+
protected void reloadSummaries() {
|
304
|
+
super.reloadSummaries();
|
305
|
+
String cameraSummary = getString(mDPM.getCameraDisabled(mDeviceAdminSample)
|
306
|
+
? R.string.camera_disabled : R.string.camera_enabled);
|
307
|
+
mDisableCameraCheckbox.setSummary(cameraSummary);
|
308
|
+
}
|
309
|
+
|
310
|
+
/** Updates the device capabilities area (dis/enabling) as the admin is (de)activated */
|
311
|
+
private void enableDeviceCapabilitiesArea(boolean enabled) {
|
312
|
+
mDisableCameraCheckbox.setEnabled(enabled);
|
313
|
+
}
|
314
|
+
}
|
315
|
+
|
316
|
+
/**
|
317
|
+
* PreferenceFragment for "password quality" preferences.
|
318
|
+
*/
|
319
|
+
public static class QualityFragment extends AdminSampleFragment
|
320
|
+
implements OnPreferenceChangeListener {
|
321
|
+
|
322
|
+
// Password quality values
|
323
|
+
// This list must match the list found in samples/ApiDemos/res/values/arrays.xml
|
324
|
+
final static int[] mPasswordQualityValues = new int[] {
|
325
|
+
DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED,
|
326
|
+
DevicePolicyManager.PASSWORD_QUALITY_SOMETHING,
|
327
|
+
DevicePolicyManager.PASSWORD_QUALITY_NUMERIC,
|
328
|
+
DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC,
|
329
|
+
DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC,
|
330
|
+
DevicePolicyManager.PASSWORD_QUALITY_COMPLEX
|
331
|
+
};
|
332
|
+
|
333
|
+
// Password quality values (as strings, for the ListPreference entryValues)
|
334
|
+
// This list must match the list found in samples/ApiDemos/res/values/arrays.xml
|
335
|
+
final static String[] mPasswordQualityValueStrings = new String[] {
|
336
|
+
String.valueOf(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED),
|
337
|
+
String.valueOf(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING),
|
338
|
+
String.valueOf(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC),
|
339
|
+
String.valueOf(DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC),
|
340
|
+
String.valueOf(DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC),
|
341
|
+
String.valueOf(DevicePolicyManager.PASSWORD_QUALITY_COMPLEX)
|
342
|
+
};
|
343
|
+
|
344
|
+
// UI elements
|
345
|
+
private PreferenceCategory mQualityCategory;
|
346
|
+
private ListPreference mPasswordQuality;
|
347
|
+
private EditTextPreference mMinLength;
|
348
|
+
private EditTextPreference mMinLetters;
|
349
|
+
private EditTextPreference mMinNumeric;
|
350
|
+
private EditTextPreference mMinLowerCase;
|
351
|
+
private EditTextPreference mMinUpperCase;
|
352
|
+
private EditTextPreference mMinSymbols;
|
353
|
+
private EditTextPreference mMinNonLetter;
|
354
|
+
|
355
|
+
@Override
|
356
|
+
public void onCreate(Bundle savedInstanceState) {
|
357
|
+
super.onCreate(savedInstanceState);
|
358
|
+
addPreferencesFromResource(R.xml.device_admin_quality);
|
359
|
+
|
360
|
+
mQualityCategory = (PreferenceCategory) findPreference(KEY_CATEGORY_QUALITY);
|
361
|
+
mPasswordQuality = (ListPreference) findPreference(KEY_QUALITY);
|
362
|
+
mMinLength = (EditTextPreference) findPreference(KEY_MIN_LENGTH);
|
363
|
+
mMinLetters = (EditTextPreference) findPreference(KEY_MIN_LETTERS);
|
364
|
+
mMinNumeric = (EditTextPreference) findPreference(KEY_MIN_NUMERIC);
|
365
|
+
mMinLowerCase = (EditTextPreference) findPreference(KEY_MIN_LOWER_CASE);
|
366
|
+
mMinUpperCase = (EditTextPreference) findPreference(KEY_MIN_UPPER_CASE);
|
367
|
+
mMinSymbols = (EditTextPreference) findPreference(KEY_MIN_SYMBOLS);
|
368
|
+
mMinNonLetter = (EditTextPreference) findPreference(KEY_MIN_NON_LETTER);
|
369
|
+
|
370
|
+
mPasswordQuality.setOnPreferenceChangeListener(this);
|
371
|
+
mMinLength.setOnPreferenceChangeListener(this);
|
372
|
+
mMinLetters.setOnPreferenceChangeListener(this);
|
373
|
+
mMinNumeric.setOnPreferenceChangeListener(this);
|
374
|
+
mMinLowerCase.setOnPreferenceChangeListener(this);
|
375
|
+
mMinUpperCase.setOnPreferenceChangeListener(this);
|
376
|
+
mMinSymbols.setOnPreferenceChangeListener(this);
|
377
|
+
mMinNonLetter.setOnPreferenceChangeListener(this);
|
378
|
+
|
379
|
+
// Finish setup of the quality dropdown
|
380
|
+
mPasswordQuality.setEntryValues(mPasswordQualityValueStrings);
|
381
|
+
}
|
382
|
+
|
383
|
+
@Override
|
384
|
+
public void onResume() {
|
385
|
+
super.onResume();
|
386
|
+
mQualityCategory.setEnabled(mAdminActive);
|
387
|
+
}
|
388
|
+
|
389
|
+
/**
|
390
|
+
* Update the summaries of each item to show the local setting and the global setting.
|
391
|
+
*/
|
392
|
+
@Override
|
393
|
+
protected void reloadSummaries() {
|
394
|
+
super.reloadSummaries();
|
395
|
+
// Show numeric settings for each policy API
|
396
|
+
int local, global;
|
397
|
+
local = mDPM.getPasswordQuality(mDeviceAdminSample);
|
398
|
+
global = mDPM.getPasswordQuality(null);
|
399
|
+
mPasswordQuality.setSummary(
|
400
|
+
localGlobalSummary(qualityValueToString(local), qualityValueToString(global)));
|
401
|
+
local = mDPM.getPasswordMinimumLength(mDeviceAdminSample);
|
402
|
+
global = mDPM.getPasswordMinimumLength(null);
|
403
|
+
mMinLength.setSummary(localGlobalSummary(local, global));
|
404
|
+
local = mDPM.getPasswordMinimumLetters(mDeviceAdminSample);
|
405
|
+
global = mDPM.getPasswordMinimumLetters(null);
|
406
|
+
mMinLetters.setSummary(localGlobalSummary(local, global));
|
407
|
+
local = mDPM.getPasswordMinimumNumeric(mDeviceAdminSample);
|
408
|
+
global = mDPM.getPasswordMinimumNumeric(null);
|
409
|
+
mMinNumeric.setSummary(localGlobalSummary(local, global));
|
410
|
+
local = mDPM.getPasswordMinimumLowerCase(mDeviceAdminSample);
|
411
|
+
global = mDPM.getPasswordMinimumLowerCase(null);
|
412
|
+
mMinLowerCase.setSummary(localGlobalSummary(local, global));
|
413
|
+
local = mDPM.getPasswordMinimumUpperCase(mDeviceAdminSample);
|
414
|
+
global = mDPM.getPasswordMinimumUpperCase(null);
|
415
|
+
mMinUpperCase.setSummary(localGlobalSummary(local, global));
|
416
|
+
local = mDPM.getPasswordMinimumSymbols(mDeviceAdminSample);
|
417
|
+
global = mDPM.getPasswordMinimumSymbols(null);
|
418
|
+
mMinSymbols.setSummary(localGlobalSummary(local, global));
|
419
|
+
local = mDPM.getPasswordMinimumNonLetter(mDeviceAdminSample);
|
420
|
+
global = mDPM.getPasswordMinimumNonLetter(null);
|
421
|
+
mMinNonLetter.setSummary(localGlobalSummary(local, global));
|
422
|
+
}
|
423
|
+
|
424
|
+
@Override
|
425
|
+
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
426
|
+
if (super.onPreferenceChange(preference, newValue)) {
|
427
|
+
return true;
|
428
|
+
}
|
429
|
+
String valueString = (String)newValue;
|
430
|
+
if (TextUtils.isEmpty(valueString)) {
|
431
|
+
return false;
|
432
|
+
}
|
433
|
+
int value = 0;
|
434
|
+
try {
|
435
|
+
value = Integer.parseInt(valueString);
|
436
|
+
} catch (NumberFormatException nfe) {
|
437
|
+
String warning = mActivity.getString(R.string.number_format_warning, valueString);
|
438
|
+
Toast.makeText(mActivity, warning, Toast.LENGTH_SHORT).show();
|
439
|
+
}
|
440
|
+
if (preference == mPasswordQuality) {
|
441
|
+
mDPM.setPasswordQuality(mDeviceAdminSample, value);
|
442
|
+
} else if (preference == mMinLength) {
|
443
|
+
mDPM.setPasswordMinimumLength(mDeviceAdminSample, value);
|
444
|
+
} else if (preference == mMinLetters) {
|
445
|
+
mDPM.setPasswordMinimumLetters(mDeviceAdminSample, value);
|
446
|
+
} else if (preference == mMinNumeric) {
|
447
|
+
mDPM.setPasswordMinimumNumeric(mDeviceAdminSample, value);
|
448
|
+
} else if (preference == mMinLowerCase) {
|
449
|
+
mDPM.setPasswordMinimumLowerCase(mDeviceAdminSample, value);
|
450
|
+
} else if (preference == mMinUpperCase) {
|
451
|
+
mDPM.setPasswordMinimumUpperCase(mDeviceAdminSample, value);
|
452
|
+
} else if (preference == mMinSymbols) {
|
453
|
+
mDPM.setPasswordMinimumSymbols(mDeviceAdminSample, value);
|
454
|
+
} else if (preference == mMinNonLetter) {
|
455
|
+
mDPM.setPasswordMinimumNonLetter(mDeviceAdminSample, value);
|
456
|
+
}
|
457
|
+
reloadSummaries();
|
458
|
+
return true;
|
459
|
+
}
|
460
|
+
|
461
|
+
private String qualityValueToString(int quality) {
|
462
|
+
for (int i= 0; i < mPasswordQualityValues.length; i++) {
|
463
|
+
if (mPasswordQualityValues[i] == quality) {
|
464
|
+
String[] qualities =
|
465
|
+
mActivity.getResources().getStringArray(R.array.password_qualities);
|
466
|
+
return qualities[i];
|
467
|
+
}
|
468
|
+
}
|
469
|
+
return "(0x" + Integer.toString(quality, 16) + ")";
|
470
|
+
}
|
471
|
+
}
|
472
|
+
|
473
|
+
/**
|
474
|
+
* PreferenceFragment for "password expiration" preferences.
|
475
|
+
*/
|
476
|
+
public static class ExpirationFragment extends AdminSampleFragment
|
477
|
+
implements OnPreferenceChangeListener, OnPreferenceClickListener {
|
478
|
+
private PreferenceCategory mExpirationCategory;
|
479
|
+
private EditTextPreference mHistory;
|
480
|
+
private EditTextPreference mExpirationTimeout;
|
481
|
+
private PreferenceScreen mExpirationStatus;
|
482
|
+
|
483
|
+
@Override
|
484
|
+
public void onCreate(Bundle savedInstanceState) {
|
485
|
+
super.onCreate(savedInstanceState);
|
486
|
+
addPreferencesFromResource(R.xml.device_admin_expiration);
|
487
|
+
|
488
|
+
mExpirationCategory = (PreferenceCategory) findPreference(KEY_CATEGORY_EXPIRATION);
|
489
|
+
mHistory = (EditTextPreference) findPreference(KEY_HISTORY);
|
490
|
+
mExpirationTimeout = (EditTextPreference) findPreference(KEY_EXPIRATION_TIMEOUT);
|
491
|
+
mExpirationStatus = (PreferenceScreen) findPreference(KEY_EXPIRATION_STATUS);
|
492
|
+
|
493
|
+
mHistory.setOnPreferenceChangeListener(this);
|
494
|
+
mExpirationTimeout.setOnPreferenceChangeListener(this);
|
495
|
+
mExpirationStatus.setOnPreferenceClickListener(this);
|
496
|
+
}
|
497
|
+
|
498
|
+
@Override
|
499
|
+
public void onResume() {
|
500
|
+
super.onResume();
|
501
|
+
mExpirationCategory.setEnabled(mAdminActive);
|
502
|
+
}
|
503
|
+
|
504
|
+
/**
|
505
|
+
* Update the summaries of each item to show the local setting and the global setting.
|
506
|
+
*/
|
507
|
+
@Override
|
508
|
+
protected void reloadSummaries() {
|
509
|
+
super.reloadSummaries();
|
510
|
+
|
511
|
+
int local, global;
|
512
|
+
local = mDPM.getPasswordHistoryLength(mDeviceAdminSample);
|
513
|
+
global = mDPM.getPasswordHistoryLength(null);
|
514
|
+
mHistory.setSummary(localGlobalSummary(local, global));
|
515
|
+
|
516
|
+
long localLong, globalLong;
|
517
|
+
localLong = mDPM.getPasswordExpirationTimeout(mDeviceAdminSample);
|
518
|
+
globalLong = mDPM.getPasswordExpirationTimeout(null);
|
519
|
+
mExpirationTimeout.setSummary(localGlobalSummary(
|
520
|
+
localLong / MS_PER_MINUTE, globalLong / MS_PER_MINUTE));
|
521
|
+
|
522
|
+
String expirationStatus = getExpirationStatus();
|
523
|
+
mExpirationStatus.setSummary(expirationStatus);
|
524
|
+
}
|
525
|
+
|
526
|
+
@Override
|
527
|
+
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
528
|
+
if (super.onPreferenceChange(preference, newValue)) {
|
529
|
+
return true;
|
530
|
+
}
|
531
|
+
String valueString = (String)newValue;
|
532
|
+
if (TextUtils.isEmpty(valueString)) {
|
533
|
+
return false;
|
534
|
+
}
|
535
|
+
int value = 0;
|
536
|
+
try {
|
537
|
+
value = Integer.parseInt(valueString);
|
538
|
+
} catch (NumberFormatException nfe) {
|
539
|
+
String warning = mActivity.getString(R.string.number_format_warning, valueString);
|
540
|
+
Toast.makeText(mActivity, warning, Toast.LENGTH_SHORT).show();
|
541
|
+
}
|
542
|
+
if (preference == mHistory) {
|
543
|
+
mDPM.setPasswordHistoryLength(mDeviceAdminSample, value);
|
544
|
+
} else if (preference == mExpirationTimeout) {
|
545
|
+
mDPM.setPasswordExpirationTimeout(mDeviceAdminSample, value * MS_PER_MINUTE);
|
546
|
+
}
|
547
|
+
reloadSummaries();
|
548
|
+
return true;
|
549
|
+
}
|
550
|
+
|
551
|
+
@Override
|
552
|
+
public boolean onPreferenceClick(Preference preference) {
|
553
|
+
if (super.onPreferenceClick(preference)) {
|
554
|
+
return true;
|
555
|
+
}
|
556
|
+
if (preference == mExpirationStatus) {
|
557
|
+
String expirationStatus = getExpirationStatus();
|
558
|
+
mExpirationStatus.setSummary(expirationStatus);
|
559
|
+
return true;
|
560
|
+
}
|
561
|
+
return false;
|
562
|
+
}
|
563
|
+
|
564
|
+
/**
|
565
|
+
* Create a summary string describing the expiration status for the sample app,
|
566
|
+
* as well as the global (aggregate) status.
|
567
|
+
*/
|
568
|
+
private String getExpirationStatus() {
|
569
|
+
// expirations are absolute; convert to relative for display
|
570
|
+
long localExpiration = mDPM.getPasswordExpiration(mDeviceAdminSample);
|
571
|
+
long globalExpiration = mDPM.getPasswordExpiration(null);
|
572
|
+
long now = System.currentTimeMillis();
|
573
|
+
|
574
|
+
// local expiration
|
575
|
+
String local;
|
576
|
+
if (localExpiration == 0) {
|
577
|
+
local = mActivity.getString(R.string.expiration_status_none);
|
578
|
+
} else {
|
579
|
+
localExpiration -= now;
|
580
|
+
String dms = timeToDaysMinutesSeconds(mActivity, Math.abs(localExpiration));
|
581
|
+
if (localExpiration >= 0) {
|
582
|
+
local = mActivity.getString(R.string.expiration_status_future, dms);
|
583
|
+
} else {
|
584
|
+
local = mActivity.getString(R.string.expiration_status_past, dms);
|
585
|
+
}
|
586
|
+
}
|
587
|
+
|
588
|
+
// global expiration
|
589
|
+
String global;
|
590
|
+
if (globalExpiration == 0) {
|
591
|
+
global = mActivity.getString(R.string.expiration_status_none);
|
592
|
+
} else {
|
593
|
+
globalExpiration -= now;
|
594
|
+
String dms = timeToDaysMinutesSeconds(mActivity, Math.abs(globalExpiration));
|
595
|
+
if (globalExpiration >= 0) {
|
596
|
+
global = mActivity.getString(R.string.expiration_status_future, dms);
|
597
|
+
} else {
|
598
|
+
global = mActivity.getString(R.string.expiration_status_past, dms);
|
599
|
+
}
|
600
|
+
}
|
601
|
+
return mActivity.getString(R.string.status_local_global, local, global);
|
602
|
+
}
|
603
|
+
}
|
604
|
+
|
605
|
+
/**
|
606
|
+
* PreferenceFragment for "lock screen & wipe" preferences.
|
607
|
+
*/
|
608
|
+
public static class LockWipeFragment extends AdminSampleFragment
|
609
|
+
implements OnPreferenceChangeListener, OnPreferenceClickListener {
|
610
|
+
private PreferenceCategory mLockWipeCategory;
|
611
|
+
private EditTextPreference mMaxTimeScreenLock;
|
612
|
+
private EditTextPreference mMaxFailures;
|
613
|
+
private PreferenceScreen mLockScreen;
|
614
|
+
private PreferenceScreen mWipeData;
|
615
|
+
private PreferenceScreen mWipeAppData;
|
616
|
+
|
617
|
+
@Override
|
618
|
+
public void onCreate(Bundle savedInstanceState) {
|
619
|
+
super.onCreate(savedInstanceState);
|
620
|
+
addPreferencesFromResource(R.xml.device_admin_lock_wipe);
|
621
|
+
|
622
|
+
mLockWipeCategory = (PreferenceCategory) findPreference(KEY_CATEGORY_LOCK_WIPE);
|
623
|
+
mMaxTimeScreenLock = (EditTextPreference) findPreference(KEY_MAX_TIME_SCREEN_LOCK);
|
624
|
+
mMaxFailures = (EditTextPreference) findPreference(KEY_MAX_FAILS_BEFORE_WIPE);
|
625
|
+
mLockScreen = (PreferenceScreen) findPreference(KEY_LOCK_SCREEN);
|
626
|
+
mWipeData = (PreferenceScreen) findPreference(KEY_WIPE_DATA);
|
627
|
+
mWipeAppData = (PreferenceScreen) findPreference(KEY_WIP_DATA_ALL);
|
628
|
+
|
629
|
+
mMaxTimeScreenLock.setOnPreferenceChangeListener(this);
|
630
|
+
mMaxFailures.setOnPreferenceChangeListener(this);
|
631
|
+
mLockScreen.setOnPreferenceClickListener(this);
|
632
|
+
mWipeData.setOnPreferenceClickListener(this);
|
633
|
+
mWipeAppData.setOnPreferenceClickListener(this);
|
634
|
+
}
|
635
|
+
|
636
|
+
@Override
|
637
|
+
public void onResume() {
|
638
|
+
super.onResume();
|
639
|
+
mLockWipeCategory.setEnabled(mAdminActive);
|
640
|
+
}
|
641
|
+
|
642
|
+
/**
|
643
|
+
* Update the summaries of each item to show the local setting and the global setting.
|
644
|
+
*/
|
645
|
+
@Override
|
646
|
+
protected void reloadSummaries() {
|
647
|
+
super.reloadSummaries();
|
648
|
+
|
649
|
+
long localLong, globalLong;
|
650
|
+
localLong = mDPM.getMaximumTimeToLock(mDeviceAdminSample);
|
651
|
+
globalLong = mDPM.getMaximumTimeToLock(null);
|
652
|
+
mMaxTimeScreenLock.setSummary(localGlobalSummary(
|
653
|
+
localLong / MS_PER_MINUTE, globalLong / MS_PER_MINUTE));
|
654
|
+
|
655
|
+
int local, global;
|
656
|
+
local = mDPM.getMaximumFailedPasswordsForWipe(mDeviceAdminSample);
|
657
|
+
global = mDPM.getMaximumFailedPasswordsForWipe(null);
|
658
|
+
mMaxFailures.setSummary(localGlobalSummary(local, global));
|
659
|
+
}
|
660
|
+
|
661
|
+
@Override
|
662
|
+
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
663
|
+
if (super.onPreferenceChange(preference, newValue)) {
|
664
|
+
return true;
|
665
|
+
}
|
666
|
+
String valueString = (String)newValue;
|
667
|
+
if (TextUtils.isEmpty(valueString)) {
|
668
|
+
return false;
|
669
|
+
}
|
670
|
+
int value = 0;
|
671
|
+
try {
|
672
|
+
value = Integer.parseInt(valueString);
|
673
|
+
} catch (NumberFormatException nfe) {
|
674
|
+
String warning = mActivity.getString(R.string.number_format_warning, valueString);
|
675
|
+
Toast.makeText(mActivity, warning, Toast.LENGTH_SHORT).show();
|
676
|
+
}
|
677
|
+
if (preference == mMaxTimeScreenLock) {
|
678
|
+
mDPM.setMaximumTimeToLock(mDeviceAdminSample, value * MS_PER_MINUTE);
|
679
|
+
} else if (preference == mMaxFailures) {
|
680
|
+
if (alertIfMonkey(mActivity, R.string.monkey_wipe_data)) {
|
681
|
+
return true;
|
682
|
+
}
|
683
|
+
mDPM.setMaximumFailedPasswordsForWipe(mDeviceAdminSample, value);
|
684
|
+
}
|
685
|
+
reloadSummaries();
|
686
|
+
return true;
|
687
|
+
}
|
688
|
+
|
689
|
+
@Override
|
690
|
+
public boolean onPreferenceClick(Preference preference) {
|
691
|
+
if (super.onPreferenceClick(preference)) {
|
692
|
+
return true;
|
693
|
+
}
|
694
|
+
if (preference == mLockScreen) {
|
695
|
+
if (alertIfMonkey(mActivity, R.string.monkey_lock_screen)) {
|
696
|
+
return true;
|
697
|
+
}
|
698
|
+
mDPM.lockNow();
|
699
|
+
return true;
|
700
|
+
} else if (preference == mWipeData || preference == mWipeAppData) {
|
701
|
+
if (alertIfMonkey(mActivity, R.string.monkey_wipe_data)) {
|
702
|
+
return true;
|
703
|
+
}
|
704
|
+
promptForRealDeviceWipe(preference == mWipeAppData);
|
705
|
+
return true;
|
706
|
+
}
|
707
|
+
return false;
|
708
|
+
}
|
709
|
+
|
710
|
+
/**
|
711
|
+
* Wiping data is real, so we don't want it to be easy. Show two alerts before wiping.
|
712
|
+
*/
|
713
|
+
private void promptForRealDeviceWipe(final boolean wipeAllData) {
|
714
|
+
final DeviceAdminSample activity = mActivity;
|
715
|
+
|
716
|
+
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
717
|
+
builder.setMessage(R.string.wipe_warning_first);
|
718
|
+
builder.setPositiveButton(R.string.wipe_warning_first_ok,
|
719
|
+
new DialogInterface.OnClickListener() {
|
720
|
+
@Override
|
721
|
+
public void onClick(DialogInterface dialog, int which) {
|
722
|
+
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
723
|
+
if (wipeAllData) {
|
724
|
+
builder.setMessage(R.string.wipe_warning_second_full);
|
725
|
+
} else {
|
726
|
+
builder.setMessage(R.string.wipe_warning_second);
|
727
|
+
}
|
728
|
+
builder.setPositiveButton(R.string.wipe_warning_second_ok,
|
729
|
+
new DialogInterface.OnClickListener() {
|
730
|
+
@Override
|
731
|
+
public void onClick(DialogInterface dialog, int which) {
|
732
|
+
boolean stillActive = mActivity.isActiveAdmin();
|
733
|
+
if (stillActive) {
|
734
|
+
mDPM.wipeData(wipeAllData
|
735
|
+
? DevicePolicyManager.WIPE_EXTERNAL_STORAGE : 0);
|
736
|
+
}
|
737
|
+
}
|
738
|
+
});
|
739
|
+
builder.setNegativeButton(R.string.wipe_warning_second_no, null);
|
740
|
+
builder.show();
|
741
|
+
}
|
742
|
+
});
|
743
|
+
builder.setNegativeButton(R.string.wipe_warning_first_no, null);
|
744
|
+
builder.show();
|
745
|
+
}
|
746
|
+
}
|
747
|
+
|
748
|
+
/**
|
749
|
+
* PreferenceFragment for "encryption" preferences.
|
750
|
+
*/
|
751
|
+
public static class EncryptionFragment extends AdminSampleFragment
|
752
|
+
implements OnPreferenceChangeListener, OnPreferenceClickListener {
|
753
|
+
private PreferenceCategory mEncryptionCategory;
|
754
|
+
private CheckBoxPreference mRequireEncryption;
|
755
|
+
private PreferenceScreen mActivateEncryption;
|
756
|
+
|
757
|
+
@Override
|
758
|
+
public void onCreate(Bundle savedInstanceState) {
|
759
|
+
super.onCreate(savedInstanceState);
|
760
|
+
addPreferencesFromResource(R.xml.device_admin_encryption);
|
761
|
+
|
762
|
+
mEncryptionCategory = (PreferenceCategory) findPreference(KEY_CATEGORY_ENCRYPTION);
|
763
|
+
mRequireEncryption = (CheckBoxPreference) findPreference(KEY_REQUIRE_ENCRYPTION);
|
764
|
+
mActivateEncryption = (PreferenceScreen) findPreference(KEY_ACTIVATE_ENCRYPTION);
|
765
|
+
|
766
|
+
mRequireEncryption.setOnPreferenceChangeListener(this);
|
767
|
+
mActivateEncryption.setOnPreferenceClickListener(this);
|
768
|
+
}
|
769
|
+
|
770
|
+
@Override
|
771
|
+
public void onResume() {
|
772
|
+
super.onResume();
|
773
|
+
mEncryptionCategory.setEnabled(mAdminActive);
|
774
|
+
mRequireEncryption.setChecked(mDPM.getStorageEncryption(mDeviceAdminSample));
|
775
|
+
}
|
776
|
+
|
777
|
+
/**
|
778
|
+
* Update the summaries of each item to show the local setting and the global setting.
|
779
|
+
*/
|
780
|
+
@Override
|
781
|
+
protected void reloadSummaries() {
|
782
|
+
super.reloadSummaries();
|
783
|
+
|
784
|
+
boolean local, global;
|
785
|
+
local = mDPM.getStorageEncryption(mDeviceAdminSample);
|
786
|
+
global = mDPM.getStorageEncryption(null);
|
787
|
+
mRequireEncryption.setSummary(localGlobalSummary(local, global));
|
788
|
+
|
789
|
+
int deviceStatusCode = mDPM.getStorageEncryptionStatus();
|
790
|
+
String deviceStatus = statusCodeToString(deviceStatusCode);
|
791
|
+
String status = mActivity.getString(R.string.status_device_encryption, deviceStatus);
|
792
|
+
mActivateEncryption.setSummary(status);
|
793
|
+
}
|
794
|
+
|
795
|
+
@Override
|
796
|
+
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
797
|
+
if (super.onPreferenceChange(preference, newValue)) {
|
798
|
+
return true;
|
799
|
+
}
|
800
|
+
if (preference == mRequireEncryption) {
|
801
|
+
boolean newActive = (Boolean) newValue;
|
802
|
+
mDPM.setStorageEncryption(mDeviceAdminSample, newActive);
|
803
|
+
reloadSummaries();
|
804
|
+
return true;
|
805
|
+
}
|
806
|
+
return true;
|
807
|
+
}
|
808
|
+
|
809
|
+
@Override
|
810
|
+
public boolean onPreferenceClick(Preference preference) {
|
811
|
+
if (super.onPreferenceClick(preference)) {
|
812
|
+
return true;
|
813
|
+
}
|
814
|
+
if (preference == mActivateEncryption) {
|
815
|
+
if (alertIfMonkey(mActivity, R.string.monkey_encryption)) {
|
816
|
+
return true;
|
817
|
+
}
|
818
|
+
// Check to see if encryption is even supported on this device (it's optional).
|
819
|
+
if (mDPM.getStorageEncryptionStatus() ==
|
820
|
+
DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED) {
|
821
|
+
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
|
822
|
+
builder.setMessage(R.string.encryption_not_supported);
|
823
|
+
builder.setPositiveButton(R.string.encryption_not_supported_ok, null);
|
824
|
+
builder.show();
|
825
|
+
return true;
|
826
|
+
}
|
827
|
+
// Launch the activity to activate encryption. May or may not return!
|
828
|
+
Intent intent = new Intent(DevicePolicyManager.ACTION_START_ENCRYPTION);
|
829
|
+
startActivityForResult(intent, REQUEST_CODE_START_ENCRYPTION);
|
830
|
+
return true;
|
831
|
+
}
|
832
|
+
return false;
|
833
|
+
}
|
834
|
+
|
835
|
+
private String statusCodeToString(int newStatusCode) {
|
836
|
+
int newStatus = R.string.encryption_status_unknown;
|
837
|
+
switch (newStatusCode) {
|
838
|
+
case DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED:
|
839
|
+
newStatus = R.string.encryption_status_unsupported;
|
840
|
+
break;
|
841
|
+
case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE:
|
842
|
+
newStatus = R.string.encryption_status_inactive;
|
843
|
+
break;
|
844
|
+
case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVATING:
|
845
|
+
newStatus = R.string.encryption_status_activating;
|
846
|
+
break;
|
847
|
+
case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE:
|
848
|
+
newStatus = R.string.encryption_status_active;
|
849
|
+
break;
|
850
|
+
}
|
851
|
+
return mActivity.getString(newStatus);
|
852
|
+
}
|
853
|
+
}
|
854
|
+
|
855
|
+
/**
|
856
|
+
* Simple converter used for long expiration times reported in mSec.
|
857
|
+
*/
|
858
|
+
private static String timeToDaysMinutesSeconds(Context context, long time) {
|
859
|
+
long days = time / MS_PER_DAY;
|
860
|
+
long hours = (time / MS_PER_HOUR) % 24;
|
861
|
+
long minutes = (time / MS_PER_MINUTE) % 60;
|
862
|
+
return context.getString(R.string.status_days_hours_minutes, days, hours, minutes);
|
863
|
+
}
|
864
|
+
|
865
|
+
/**
|
866
|
+
* If the "user" is a monkey, post an alert and notify the caller. This prevents automated
|
867
|
+
* test frameworks from stumbling into annoying or dangerous operations.
|
868
|
+
*/
|
869
|
+
private static boolean alertIfMonkey(Context context, int stringId) {
|
870
|
+
if (ActivityManager.isUserAMonkey()) {
|
871
|
+
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
872
|
+
builder.setMessage(stringId);
|
873
|
+
builder.setPositiveButton(R.string.monkey_ok, null);
|
874
|
+
builder.show();
|
875
|
+
return true;
|
876
|
+
} else {
|
877
|
+
return false;
|
878
|
+
}
|
879
|
+
}
|
880
|
+
|
881
|
+
/**
|
882
|
+
* Sample implementation of a DeviceAdminReceiver. Your controller must provide one,
|
883
|
+
* although you may or may not implement all of the methods shown here.
|
884
|
+
*
|
885
|
+
* All callbacks are on the UI thread and your implementations should not engage in any
|
886
|
+
* blocking operations, including disk I/O.
|
887
|
+
*/
|
888
|
+
public static class DeviceAdminSampleReceiver extends DeviceAdminReceiver {
|
889
|
+
void showToast(Context context, String msg) {
|
890
|
+
String status = context.getString(R.string.admin_receiver_status, msg);
|
891
|
+
Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
|
892
|
+
}
|
893
|
+
|
894
|
+
@Override
|
895
|
+
public void onEnabled(Context context, Intent intent) {
|
896
|
+
showToast(context, context.getString(R.string.admin_receiver_status_enabled));
|
897
|
+
}
|
898
|
+
|
899
|
+
@Override
|
900
|
+
public CharSequence onDisableRequested(Context context, Intent intent) {
|
901
|
+
return context.getString(R.string.admin_receiver_status_disable_warning);
|
902
|
+
}
|
903
|
+
|
904
|
+
@Override
|
905
|
+
public void onDisabled(Context context, Intent intent) {
|
906
|
+
showToast(context, context.getString(R.string.admin_receiver_status_disabled));
|
907
|
+
}
|
908
|
+
|
909
|
+
@Override
|
910
|
+
public void onPasswordChanged(Context context, Intent intent) {
|
911
|
+
showToast(context, context.getString(R.string.admin_receiver_status_pw_changed));
|
912
|
+
}
|
913
|
+
|
914
|
+
@Override
|
915
|
+
public void onPasswordFailed(Context context, Intent intent) {
|
916
|
+
showToast(context, context.getString(R.string.admin_receiver_status_pw_failed));
|
917
|
+
}
|
918
|
+
|
919
|
+
@Override
|
920
|
+
public void onPasswordSucceeded(Context context, Intent intent) {
|
921
|
+
showToast(context, context.getString(R.string.admin_receiver_status_pw_succeeded));
|
922
|
+
}
|
923
|
+
|
924
|
+
@Override
|
925
|
+
public void onPasswordExpiring(Context context, Intent intent) {
|
926
|
+
DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
|
927
|
+
Context.DEVICE_POLICY_SERVICE);
|
928
|
+
long expr = dpm.getPasswordExpiration(
|
929
|
+
new ComponentName(context, DeviceAdminSampleReceiver.class));
|
930
|
+
long delta = expr - System.currentTimeMillis();
|
931
|
+
boolean expired = delta < 0L;
|
932
|
+
String message = context.getString(expired ?
|
933
|
+
R.string.expiration_status_past : R.string.expiration_status_future);
|
934
|
+
showToast(context, message);
|
935
|
+
Log.v(TAG, message);
|
936
|
+
}
|
937
|
+
}
|
938
|
+
}
|