gametel 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (918) hide show
  1. data/.calabash_settings +1 -0
  2. data/.gitignore +25 -0
  3. data/.irbrc +16 -0
  4. data/.rspec +2 -0
  5. data/.rvmrc +1 -0
  6. data/.travis.yml +5 -0
  7. data/ApiDemos/.classpath +8 -0
  8. data/ApiDemos/.project +33 -0
  9. data/ApiDemos/.settings/org.eclipse.jdt.core.prefs +4 -0
  10. data/ApiDemos/AndroidManifest.xml +2715 -0
  11. data/ApiDemos/README.txt +19 -0
  12. data/ApiDemos/assets/HelloActivity.apk +0 -0
  13. data/ApiDemos/assets/fonts/samplefont.ttf +0 -0
  14. data/ApiDemos/assets/read_asset.txt +3 -0
  15. data/ApiDemos/bin/ApiDemos.apk +0 -0
  16. data/ApiDemos/build.xml +83 -0
  17. data/ApiDemos/local.properties +10 -0
  18. data/ApiDemos/proguard-project.txt +20 -0
  19. data/ApiDemos/project.properties +14 -0
  20. data/ApiDemos/res/anim/animator.xml +23 -0
  21. data/ApiDemos/res/anim/animator_set.xml +32 -0
  22. data/ApiDemos/res/anim/color_animator.xml +23 -0
  23. data/ApiDemos/res/anim/cycle_7.xml +17 -0
  24. data/ApiDemos/res/anim/fade.xml +20 -0
  25. data/ApiDemos/res/anim/hold.xml +20 -0
  26. data/ApiDemos/res/anim/hyperspace_in.xml +17 -0
  27. data/ApiDemos/res/anim/hyperspace_out.xml +61 -0
  28. data/ApiDemos/res/anim/layout_animation_row_left_slide.xml +19 -0
  29. data/ApiDemos/res/anim/layout_animation_row_right_slide.xml +20 -0
  30. data/ApiDemos/res/anim/layout_animation_table.xml +19 -0
  31. data/ApiDemos/res/anim/layout_bottom_to_top_slide.xml +20 -0
  32. data/ApiDemos/res/anim/layout_grid_fade.xml +20 -0
  33. data/ApiDemos/res/anim/layout_grid_inverse_fade.xml +21 -0
  34. data/ApiDemos/res/anim/layout_random_fade.xml +20 -0
  35. data/ApiDemos/res/anim/layout_wave_scale.xml +21 -0
  36. data/ApiDemos/res/anim/object_animator.xml +23 -0
  37. data/ApiDemos/res/anim/push_left_in.xml +20 -0
  38. data/ApiDemos/res/anim/push_left_out.xml +20 -0
  39. data/ApiDemos/res/anim/push_up_in.xml +20 -0
  40. data/ApiDemos/res/anim/push_up_out.xml +20 -0
  41. data/ApiDemos/res/anim/shake.xml +17 -0
  42. data/ApiDemos/res/anim/slide_left.xml +20 -0
  43. data/ApiDemos/res/anim/slide_right.xml +20 -0
  44. data/ApiDemos/res/anim/slide_top_to_bottom.xml +20 -0
  45. data/ApiDemos/res/anim/wave_scale.xml +33 -0
  46. data/ApiDemos/res/anim/zoom_enter.xml +28 -0
  47. data/ApiDemos/res/anim/zoom_exit.xml +33 -0
  48. data/ApiDemos/res/animator/fragment_slide_left_enter.xml +32 -0
  49. data/ApiDemos/res/animator/fragment_slide_left_exit.xml +32 -0
  50. data/ApiDemos/res/animator/fragment_slide_right_enter.xml +32 -0
  51. data/ApiDemos/res/animator/fragment_slide_right_exit.xml +32 -0
  52. data/ApiDemos/res/drawable-hdpi/alert_dialog_icon.png +0 -0
  53. data/ApiDemos/res/drawable-hdpi/apidemo_androidlogo.png +0 -0
  54. data/ApiDemos/res/drawable-hdpi/app_sample_code.png +0 -0
  55. data/ApiDemos/res/drawable-hdpi/arrow_down_float.png +0 -0
  56. data/ApiDemos/res/drawable-hdpi/arrow_up_float.png +0 -0
  57. data/ApiDemos/res/drawable-hdpi/btn_check_off.png +0 -0
  58. data/ApiDemos/res/drawable-hdpi/btn_check_on.png +0 -0
  59. data/ApiDemos/res/drawable-hdpi/btn_circle_normal.png +0 -0
  60. data/ApiDemos/res/drawable-hdpi/btn_default_normal.9.png +0 -0
  61. data/ApiDemos/res/drawable-hdpi/button.9.png +0 -0
  62. data/ApiDemos/res/drawable-hdpi/ic_contact_picture.png +0 -0
  63. data/ApiDemos/res/drawable-hdpi/ic_launcher_settings.png +0 -0
  64. data/ApiDemos/res/drawable-hdpi/ic_popup_reminder.png +0 -0
  65. data/ApiDemos/res/drawable-hdpi/icon48x48_2.png +0 -0
  66. data/ApiDemos/res/drawable-hdpi/logo240dpi.png +0 -0
  67. data/ApiDemos/res/drawable-hdpi/npatch240dpi.9.png +0 -0
  68. data/ApiDemos/res/drawable-hdpi/progress_circular_background.png +0 -0
  69. data/ApiDemos/res/drawable-hdpi/progress_particle.png +0 -0
  70. data/ApiDemos/res/drawable-hdpi/reslogo240dpi.png +0 -0
  71. data/ApiDemos/res/drawable-hdpi/scrollbar_state2.png +0 -0
  72. data/ApiDemos/res/drawable-hdpi/smlnpatch240dpi.9.png +0 -0
  73. data/ApiDemos/res/drawable-hdpi/star_big_on.png +0 -0
  74. data/ApiDemos/res/drawable-hdpi/stat_happy.png +0 -0
  75. data/ApiDemos/res/drawable-hdpi/stat_neutral.png +0 -0
  76. data/ApiDemos/res/drawable-hdpi/stat_sad.png +0 -0
  77. data/ApiDemos/res/drawable-hdpi/stat_sample.png +0 -0
  78. data/ApiDemos/res/drawable-hdpi/stylogo240dpi.png +0 -0
  79. data/ApiDemos/res/drawable-ldpi/logo120dpi.png +0 -0
  80. data/ApiDemos/res/drawable-ldpi/npatch120dpi.9.png +0 -0
  81. data/ApiDemos/res/drawable-ldpi/reslogo120dpi.png +0 -0
  82. data/ApiDemos/res/drawable-ldpi/smlnpatch120dpi.9.png +0 -0
  83. data/ApiDemos/res/drawable-ldpi/stylogo120dpi.png +0 -0
  84. data/ApiDemos/res/drawable-mdpi/alert_dialog_icon.png +0 -0
  85. data/ApiDemos/res/drawable-mdpi/apidemo_androidlogo.png +0 -0
  86. data/ApiDemos/res/drawable-mdpi/app_sample_code.png +0 -0
  87. data/ApiDemos/res/drawable-mdpi/arrow_down_float.png +0 -0
  88. data/ApiDemos/res/drawable-mdpi/arrow_up_float.png +0 -0
  89. data/ApiDemos/res/drawable-mdpi/btn_check_off.png +0 -0
  90. data/ApiDemos/res/drawable-mdpi/btn_check_on.png +0 -0
  91. data/ApiDemos/res/drawable-mdpi/btn_circle_normal.png +0 -0
  92. data/ApiDemos/res/drawable-mdpi/btn_default_normal.9.png +0 -0
  93. data/ApiDemos/res/drawable-mdpi/button.9.png +0 -0
  94. data/ApiDemos/res/drawable-mdpi/ic_contact_picture.png +0 -0
  95. data/ApiDemos/res/drawable-mdpi/ic_launcher_settings.png +0 -0
  96. data/ApiDemos/res/drawable-mdpi/ic_popup_reminder.png +0 -0
  97. data/ApiDemos/res/drawable-mdpi/ic_settings_applications.png +0 -0
  98. data/ApiDemos/res/drawable-mdpi/ic_settings_display.png +0 -0
  99. data/ApiDemos/res/drawable-mdpi/icon48x48_2.png +0 -0
  100. data/ApiDemos/res/drawable-mdpi/progress_circular_background.png +0 -0
  101. data/ApiDemos/res/drawable-mdpi/progress_particle.png +0 -0
  102. data/ApiDemos/res/drawable-mdpi/scrollbar_state2.png +0 -0
  103. data/ApiDemos/res/drawable-mdpi/star_big_on.png +0 -0
  104. data/ApiDemos/res/drawable-mdpi/stat_happy.png +0 -0
  105. data/ApiDemos/res/drawable-mdpi/stat_neutral.png +0 -0
  106. data/ApiDemos/res/drawable-mdpi/stat_sad.png +0 -0
  107. data/ApiDemos/res/drawable-mdpi/stat_sample.png +0 -0
  108. data/ApiDemos/res/drawable-nodpi/frantic.jpg +0 -0
  109. data/ApiDemos/res/drawable-nodpi/logonodpi120.png +0 -0
  110. data/ApiDemos/res/drawable-nodpi/logonodpi160.png +0 -0
  111. data/ApiDemos/res/drawable-nodpi/logonodpi240.png +0 -0
  112. data/ApiDemos/res/drawable-xhdpi/ic_launcher_settings.png +0 -0
  113. data/ApiDemos/res/drawable/animated_gif.gif +0 -0
  114. data/ApiDemos/res/drawable/balloons.jpg +0 -0
  115. data/ApiDemos/res/drawable/beach.jpg +0 -0
  116. data/ApiDemos/res/drawable/black_box.xml +21 -0
  117. data/ApiDemos/res/drawable/black_opaque_box.xml +21 -0
  118. data/ApiDemos/res/drawable/box.xml +24 -0
  119. data/ApiDemos/res/drawable/circular_progress.xml +29 -0
  120. data/ApiDemos/res/drawable/filled_box.xml +25 -0
  121. data/ApiDemos/res/drawable/frog.gif +0 -0
  122. data/ApiDemos/res/drawable/gallery_background_1.xml +20 -0
  123. data/ApiDemos/res/drawable/gallery_photo_1.jpg +0 -0
  124. data/ApiDemos/res/drawable/gallery_photo_2.jpg +0 -0
  125. data/ApiDemos/res/drawable/gallery_photo_3.jpg +0 -0
  126. data/ApiDemos/res/drawable/gallery_photo_4.jpg +0 -0
  127. data/ApiDemos/res/drawable/gallery_photo_5.jpg +0 -0
  128. data/ApiDemos/res/drawable/gallery_photo_6.jpg +0 -0
  129. data/ApiDemos/res/drawable/gallery_photo_7.jpg +0 -0
  130. data/ApiDemos/res/drawable/gallery_photo_8.jpg +0 -0
  131. data/ApiDemos/res/drawable/hover_background.xml +20 -0
  132. data/ApiDemos/res/drawable/hover_background_active.xml +23 -0
  133. data/ApiDemos/res/drawable/hover_background_inactive.xml +23 -0
  134. data/ApiDemos/res/drawable/icon48x48_1.png +0 -0
  135. data/ApiDemos/res/drawable/line.xml +21 -0
  136. data/ApiDemos/res/drawable/logo160dpi.png +0 -0
  137. data/ApiDemos/res/drawable/magnifying_glass.png +0 -0
  138. data/ApiDemos/res/drawable/npatch160dpi.9.png +0 -0
  139. data/ApiDemos/res/drawable/photo1.jpg +0 -0
  140. data/ApiDemos/res/drawable/photo2.jpg +0 -0
  141. data/ApiDemos/res/drawable/photo3.jpg +0 -0
  142. data/ApiDemos/res/drawable/photo4.jpg +0 -0
  143. data/ApiDemos/res/drawable/photo5.jpg +0 -0
  144. data/ApiDemos/res/drawable/photo6.jpg +0 -0
  145. data/ApiDemos/res/drawable/picture_frame.png +0 -0
  146. data/ApiDemos/res/drawable/reslogo160dpi.png +0 -0
  147. data/ApiDemos/res/drawable/sample_0.jpg +0 -0
  148. data/ApiDemos/res/drawable/sample_1.jpg +0 -0
  149. data/ApiDemos/res/drawable/sample_2.jpg +0 -0
  150. data/ApiDemos/res/drawable/sample_3.jpg +0 -0
  151. data/ApiDemos/res/drawable/sample_4.jpg +0 -0
  152. data/ApiDemos/res/drawable/sample_5.jpg +0 -0
  153. data/ApiDemos/res/drawable/sample_6.jpg +0 -0
  154. data/ApiDemos/res/drawable/sample_7.jpg +0 -0
  155. data/ApiDemos/res/drawable/sample_thumb_0.jpg +0 -0
  156. data/ApiDemos/res/drawable/sample_thumb_1.jpg +0 -0
  157. data/ApiDemos/res/drawable/sample_thumb_2.jpg +0 -0
  158. data/ApiDemos/res/drawable/sample_thumb_3.jpg +0 -0
  159. data/ApiDemos/res/drawable/sample_thumb_4.jpg +0 -0
  160. data/ApiDemos/res/drawable/sample_thumb_5.jpg +0 -0
  161. data/ApiDemos/res/drawable/sample_thumb_6.jpg +0 -0
  162. data/ApiDemos/res/drawable/sample_thumb_7.jpg +0 -0
  163. data/ApiDemos/res/drawable/scrollbar_vertical_thumb.xml +21 -0
  164. data/ApiDemos/res/drawable/scrollbar_vertical_track.xml +21 -0
  165. data/ApiDemos/res/drawable/shape_1.xml +22 -0
  166. data/ApiDemos/res/drawable/shape_2.xml +24 -0
  167. data/ApiDemos/res/drawable/shape_3.xml +24 -0
  168. data/ApiDemos/res/drawable/shape_4.xml +20 -0
  169. data/ApiDemos/res/drawable/shape_5.xml +23 -0
  170. data/ApiDemos/res/drawable/smlnpatch160dpi.9.png +0 -0
  171. data/ApiDemos/res/drawable/stylogo160dpi.png +0 -0
  172. data/ApiDemos/res/layout-h550dp/resources_height.xml +53 -0
  173. data/ApiDemos/res/layout-h670dp/resources_height.xml +63 -0
  174. data/ApiDemos/res/layout-h974dp/resources_height.xml +83 -0
  175. data/ApiDemos/res/layout-land/fragment_arguments.xml +57 -0
  176. data/ApiDemos/res/layout-land/fragment_layout.xml +34 -0
  177. data/ApiDemos/res/layout-sw480dp/resources_smallest_width_inner.xml +43 -0
  178. data/ApiDemos/res/layout-sw480dp/resources_smallest_width_row.xml +43 -0
  179. data/ApiDemos/res/layout-sw600dp/resources_smallest_width_inner.xml +53 -0
  180. data/ApiDemos/res/layout-sw600dp/resources_smallest_width_row.xml +53 -0
  181. data/ApiDemos/res/layout-sw720dp/resources_smallest_width_inner.xml +63 -0
  182. data/ApiDemos/res/layout-sw720dp/resources_smallest_width_row.xml +63 -0
  183. data/ApiDemos/res/layout-w1024dp/resources_width.xml +83 -0
  184. data/ApiDemos/res/layout-w600dp/resources_width.xml +53 -0
  185. data/ApiDemos/res/layout-w720dp/resources_width.xml +63 -0
  186. data/ApiDemos/res/layout/accessibility_service.xml +36 -0
  187. data/ApiDemos/res/layout/action_bar_display_options.xml +48 -0
  188. data/ApiDemos/res/layout/action_bar_display_options_custom.xml +17 -0
  189. data/ApiDemos/res/layout/action_bar_settings_action_provider.xml +34 -0
  190. data/ApiDemos/res/layout/action_bar_tab_content.xml +19 -0
  191. data/ApiDemos/res/layout/action_bar_tabs.xml +49 -0
  192. data/ApiDemos/res/layout/activity_animation.xml +42 -0
  193. data/ApiDemos/res/layout/activity_recreate.xml +37 -0
  194. data/ApiDemos/res/layout/alarm_controller.xml +45 -0
  195. data/ApiDemos/res/layout/alarm_service.xml +41 -0
  196. data/ApiDemos/res/layout/alert_dialog.xml +60 -0
  197. data/ApiDemos/res/layout/alert_dialog_text_entry.xml +67 -0
  198. data/ApiDemos/res/layout/animation_1.xml +44 -0
  199. data/ApiDemos/res/layout/animation_2.xml +67 -0
  200. data/ApiDemos/res/layout/animation_3.xml +44 -0
  201. data/ApiDemos/res/layout/animation_cloning.xml +28 -0
  202. data/ApiDemos/res/layout/animation_custom_evaluator.xml +28 -0
  203. data/ApiDemos/res/layout/animation_loading.xml +28 -0
  204. data/ApiDemos/res/layout/animation_multi_property.xml +28 -0
  205. data/ApiDemos/res/layout/animation_reversing.xml +40 -0
  206. data/ApiDemos/res/layout/animation_seeking.xml +40 -0
  207. data/ApiDemos/res/layout/animations_main_screen.xml +36 -0
  208. data/ApiDemos/res/layout/animator_custom_evaluator.xml +34 -0
  209. data/ApiDemos/res/layout/animator_events.xml +122 -0
  210. data/ApiDemos/res/layout/appwidget_configure.xml +42 -0
  211. data/ApiDemos/res/layout/appwidget_provider.xml +24 -0
  212. data/ApiDemos/res/layout/autocomplete_1.xml +48 -0
  213. data/ApiDemos/res/layout/autocomplete_2.xml +44 -0
  214. data/ApiDemos/res/layout/autocomplete_3.xml +165 -0
  215. data/ApiDemos/res/layout/autocomplete_4.xml +49 -0
  216. data/ApiDemos/res/layout/autocomplete_5.xml +45 -0
  217. data/ApiDemos/res/layout/autocomplete_6.xml +48 -0
  218. data/ApiDemos/res/layout/baseline_1.xml +40 -0
  219. data/ApiDemos/res/layout/baseline_2.xml +43 -0
  220. data/ApiDemos/res/layout/baseline_3.xml +56 -0
  221. data/ApiDemos/res/layout/baseline_4.xml +55 -0
  222. data/ApiDemos/res/layout/baseline_6.xml +34 -0
  223. data/ApiDemos/res/layout/baseline_7.xml +36 -0
  224. data/ApiDemos/res/layout/baseline_nested_1.xml +85 -0
  225. data/ApiDemos/res/layout/baseline_nested_2.xml +85 -0
  226. data/ApiDemos/res/layout/baseline_nested_3.xml +96 -0
  227. data/ApiDemos/res/layout/bouncing_balls.xml +22 -0
  228. data/ApiDemos/res/layout/buttons_1.xml +47 -0
  229. data/ApiDemos/res/layout/chronometer.xml +64 -0
  230. data/ApiDemos/res/layout/clipboard.xml +107 -0
  231. data/ApiDemos/res/layout/contacts_filter.xml +37 -0
  232. data/ApiDemos/res/layout/controls_1.xml +153 -0
  233. data/ApiDemos/res/layout/custom_dialog_activity.xml +24 -0
  234. data/ApiDemos/res/layout/custom_title.xml +57 -0
  235. data/ApiDemos/res/layout/custom_title_1.xml +33 -0
  236. data/ApiDemos/res/layout/custom_view_1.xml +44 -0
  237. data/ApiDemos/res/layout/custom_view_accessibility.xml +44 -0
  238. data/ApiDemos/res/layout/date_widgets_example_1.xml +40 -0
  239. data/ApiDemos/res/layout/date_widgets_example_2.xml +33 -0
  240. data/ApiDemos/res/layout/density_image_views.xml +37 -0
  241. data/ApiDemos/res/layout/density_styled_image_views.xml +26 -0
  242. data/ApiDemos/res/layout/dialog_activity.xml +53 -0
  243. data/ApiDemos/res/layout/drag_layout.xml +93 -0
  244. data/ApiDemos/res/layout/external_storage.xml +27 -0
  245. data/ApiDemos/res/layout/external_storage_item.xml +58 -0
  246. data/ApiDemos/res/layout/focus_1.xml +42 -0
  247. data/ApiDemos/res/layout/focus_2.xml +41 -0
  248. data/ApiDemos/res/layout/focus_3.xml +64 -0
  249. data/ApiDemos/res/layout/focus_5.xml +60 -0
  250. data/ApiDemos/res/layout/foreground_dispatch.xml +23 -0
  251. data/ApiDemos/res/layout/foreground_service_controller.xml +49 -0
  252. data/ApiDemos/res/layout/forward_target.xml +30 -0
  253. data/ApiDemos/res/layout/forwarding.xml +37 -0
  254. data/ApiDemos/res/layout/fragment_arguments.xml +54 -0
  255. data/ApiDemos/res/layout/fragment_context_menu.xml +38 -0
  256. data/ApiDemos/res/layout/fragment_dialog.xml +40 -0
  257. data/ApiDemos/res/layout/fragment_dialog_or_activity.xml +64 -0
  258. data/ApiDemos/res/layout/fragment_hide_show.xml +57 -0
  259. data/ApiDemos/res/layout/fragment_layout.xml +27 -0
  260. data/ApiDemos/res/layout/fragment_menu.xml +46 -0
  261. data/ApiDemos/res/layout/fragment_pager_support.xml +44 -0
  262. data/ApiDemos/res/layout/fragment_pager_support_list.xml +52 -0
  263. data/ApiDemos/res/layout/fragment_retain_instance.xml +46 -0
  264. data/ApiDemos/res/layout/fragment_stack.xml +38 -0
  265. data/ApiDemos/res/layout/gallery_1.xml +32 -0
  266. data/ApiDemos/res/layout/gallery_2.xml +38 -0
  267. data/ApiDemos/res/layout/game_controller_input.xml +52 -0
  268. data/ApiDemos/res/layout/game_controller_input_heading.xml +21 -0
  269. data/ApiDemos/res/layout/game_controller_input_text_column.xml +34 -0
  270. data/ApiDemos/res/layout/google_login.xml +60 -0
  271. data/ApiDemos/res/layout/grid_1.xml +29 -0
  272. data/ApiDemos/res/layout/grid_2.xml +30 -0
  273. data/ApiDemos/res/layout/grid_layout_1.xml +87 -0
  274. data/ApiDemos/res/layout/hello_world.xml +26 -0
  275. data/ApiDemos/res/layout/horizontal_scroll_view1.xml +26 -0
  276. data/ApiDemos/res/layout/hover.xml +64 -0
  277. data/ApiDemos/res/layout/image_button_1.xml +36 -0
  278. data/ApiDemos/res/layout/image_switcher_1.xml +40 -0
  279. data/ApiDemos/res/layout/image_view_1.xml +144 -0
  280. data/ApiDemos/res/layout/incoming_message.xml +50 -0
  281. data/ApiDemos/res/layout/incoming_message_info.xml +38 -0
  282. data/ApiDemos/res/layout/incoming_message_interstitial.xml +37 -0
  283. data/ApiDemos/res/layout/incoming_message_panel.xml +42 -0
  284. data/ApiDemos/res/layout/incoming_message_view.xml +80 -0
  285. data/ApiDemos/res/layout/install_apk.xml +56 -0
  286. data/ApiDemos/res/layout/intent_activity_flags.xml +43 -0
  287. data/ApiDemos/res/layout/intents.xml +37 -0
  288. data/ApiDemos/res/layout/labeled_text_edit.xml +38 -0
  289. data/ApiDemos/res/layout/launcher_shortcuts.xml +40 -0
  290. data/ApiDemos/res/layout/layout_animation_1.xml +30 -0
  291. data/ApiDemos/res/layout/layout_animation_3.xml +21 -0
  292. data/ApiDemos/res/layout/layout_animation_4.xml +30 -0
  293. data/ApiDemos/res/layout/layout_animation_5.xml +30 -0
  294. data/ApiDemos/res/layout/layout_animation_6.xml +29 -0
  295. data/ApiDemos/res/layout/layout_animation_7.xml +57 -0
  296. data/ApiDemos/res/layout/layout_animations.xml +80 -0
  297. data/ApiDemos/res/layout/layout_animations_by_default.xml +34 -0
  298. data/ApiDemos/res/layout/layout_animations_hideshow.xml +52 -0
  299. data/ApiDemos/res/layout/linear_layout_1.xml +46 -0
  300. data/ApiDemos/res/layout/linear_layout_10.xml +122 -0
  301. data/ApiDemos/res/layout/linear_layout_2.xml +47 -0
  302. data/ApiDemos/res/layout/linear_layout_3.xml +51 -0
  303. data/ApiDemos/res/layout/linear_layout_4.xml +50 -0
  304. data/ApiDemos/res/layout/linear_layout_5.xml +76 -0
  305. data/ApiDemos/res/layout/linear_layout_6.xml +53 -0
  306. data/ApiDemos/res/layout/linear_layout_7.xml +54 -0
  307. data/ApiDemos/res/layout/linear_layout_8.xml +53 -0
  308. data/ApiDemos/res/layout/linear_layout_9.xml +38 -0
  309. data/ApiDemos/res/layout/link.xml +68 -0
  310. data/ApiDemos/res/layout/list_12.xml +35 -0
  311. data/ApiDemos/res/layout/list_13.xml +34 -0
  312. data/ApiDemos/res/layout/list_7.xml +35 -0
  313. data/ApiDemos/res/layout/list_8.xml +61 -0
  314. data/ApiDemos/res/layout/list_item_checkbox.xml +22 -0
  315. data/ApiDemos/res/layout/list_item_icon_text.xml +32 -0
  316. data/ApiDemos/res/layout/list_position.xml +25 -0
  317. data/ApiDemos/res/layout/local_sample.xml +37 -0
  318. data/ApiDemos/res/layout/local_service_binding.xml +42 -0
  319. data/ApiDemos/res/layout/local_service_controller.xml +42 -0
  320. data/ApiDemos/res/layout/log_text_box_1.xml +42 -0
  321. data/ApiDemos/res/layout/mapview.xml +31 -0
  322. data/ApiDemos/res/layout/marquee.xml +46 -0
  323. data/ApiDemos/res/layout/mediaplayer_1.xml +31 -0
  324. data/ApiDemos/res/layout/mediaplayer_2.xml +13 -0
  325. data/ApiDemos/res/layout/messenger_service_binding.xml +47 -0
  326. data/ApiDemos/res/layout/morse_code.xml +37 -0
  327. data/ApiDemos/res/layout/notify_with_text.xml +34 -0
  328. data/ApiDemos/res/layout/notifying_controller.xml +41 -0
  329. data/ApiDemos/res/layout/overscan.xml +79 -0
  330. data/ApiDemos/res/layout/pick_contact.xml +48 -0
  331. data/ApiDemos/res/layout/popup_menu_1.xml +25 -0
  332. data/ApiDemos/res/layout/preference_widget_mypreference.xml +25 -0
  333. data/ApiDemos/res/layout/progressbar_1.xml +74 -0
  334. data/ApiDemos/res/layout/progressbar_2.xml +41 -0
  335. data/ApiDemos/res/layout/progressbar_3.xml +32 -0
  336. data/ApiDemos/res/layout/progressbar_4.xml +27 -0
  337. data/ApiDemos/res/layout/quick_contacts.xml +47 -0
  338. data/ApiDemos/res/layout/radio_group_1.xml +49 -0
  339. data/ApiDemos/res/layout/ratingbar_1.xml +60 -0
  340. data/ApiDemos/res/layout/read_asset.xml +29 -0
  341. data/ApiDemos/res/layout/receive_result.xml +50 -0
  342. data/ApiDemos/res/layout/redirect_enter.xml +36 -0
  343. data/ApiDemos/res/layout/redirect_getter.xml +42 -0
  344. data/ApiDemos/res/layout/redirect_main.xml +47 -0
  345. data/ApiDemos/res/layout/relative_layout_1.xml +54 -0
  346. data/ApiDemos/res/layout/relative_layout_2.xml +78 -0
  347. data/ApiDemos/res/layout/remote_binding_options.xml +82 -0
  348. data/ApiDemos/res/layout/remote_service_binding.xml +52 -0
  349. data/ApiDemos/res/layout/remote_service_controller.xml +42 -0
  350. data/ApiDemos/res/layout/reorder_four.xml +38 -0
  351. data/ApiDemos/res/layout/reorder_on_launch.xml +38 -0
  352. data/ApiDemos/res/layout/reorder_three.xml +38 -0
  353. data/ApiDemos/res/layout/reorder_two.xml +38 -0
  354. data/ApiDemos/res/layout/resources.xml +55 -0
  355. data/ApiDemos/res/layout/resources_height.xml +33 -0
  356. data/ApiDemos/res/layout/resources_layout_reference.xml +35 -0
  357. data/ApiDemos/res/layout/resources_layout_reference_tablet.xml +35 -0
  358. data/ApiDemos/res/layout/resources_smallest_width.xml +35 -0
  359. data/ApiDemos/res/layout/resources_smallest_width_inner.xml +33 -0
  360. data/ApiDemos/res/layout/resources_smallest_width_row.xml +33 -0
  361. data/ApiDemos/res/layout/resources_width.xml +33 -0
  362. data/ApiDemos/res/layout/resources_width_and_height.xml +35 -0
  363. data/ApiDemos/res/layout/rotating_list.xml +37 -0
  364. data/ApiDemos/res/layout/rotating_view.xml +160 -0
  365. data/ApiDemos/res/layout/save_restore_state.xml +58 -0
  366. data/ApiDemos/res/layout/screen_orientation.xml +37 -0
  367. data/ApiDemos/res/layout/scroll_view_1.xml +90 -0
  368. data/ApiDemos/res/layout/scroll_view_2.xml +41 -0
  369. data/ApiDemos/res/layout/scrollbar1.xml +169 -0
  370. data/ApiDemos/res/layout/scrollbar2.xml +172 -0
  371. data/ApiDemos/res/layout/scrollbar3.xml +136 -0
  372. data/ApiDemos/res/layout/search_invoke.xml +96 -0
  373. data/ApiDemos/res/layout/search_query_results.xml +76 -0
  374. data/ApiDemos/res/layout/search_view.xml +19 -0
  375. data/ApiDemos/res/layout/searchview_actionbar.xml +28 -0
  376. data/ApiDemos/res/layout/searchview_filter.xml +31 -0
  377. data/ApiDemos/res/layout/secure_view.xml +112 -0
  378. data/ApiDemos/res/layout/secure_view_overlay.xml +50 -0
  379. data/ApiDemos/res/layout/seekbar_1.xml +36 -0
  380. data/ApiDemos/res/layout/select_dialog.xml +29 -0
  381. data/ApiDemos/res/layout/send_result.xml +45 -0
  382. data/ApiDemos/res/layout/service_start_arguments_controller.xml +57 -0
  383. data/ApiDemos/res/layout/shape_drawable_1.xml +73 -0
  384. data/ApiDemos/res/layout/simple_list_item_checkable_1.xml +29 -0
  385. data/ApiDemos/res/layout/sms_demo.xml +67 -0
  386. data/ApiDemos/res/layout/soft_input_modes.xml +64 -0
  387. data/ApiDemos/res/layout/spinner_1.xml +51 -0
  388. data/ApiDemos/res/layout/split_touch_view.xml +42 -0
  389. data/ApiDemos/res/layout/status_bar_balloon.xml +32 -0
  390. data/ApiDemos/res/layout/status_bar_notifications.xml +157 -0
  391. data/ApiDemos/res/layout/styled_text.xml +52 -0
  392. data/ApiDemos/res/layout/surface_view_overlay.xml +84 -0
  393. data/ApiDemos/res/layout/switches.xml +82 -0
  394. data/ApiDemos/res/layout/table_layout_1.xml +56 -0
  395. data/ApiDemos/res/layout/table_layout_10.xml +58 -0
  396. data/ApiDemos/res/layout/table_layout_11.xml +93 -0
  397. data/ApiDemos/res/layout/table_layout_12.xml +85 -0
  398. data/ApiDemos/res/layout/table_layout_2.xml +40 -0
  399. data/ApiDemos/res/layout/table_layout_3.xml +62 -0
  400. data/ApiDemos/res/layout/table_layout_4.xml +42 -0
  401. data/ApiDemos/res/layout/table_layout_5.xml +82 -0
  402. data/ApiDemos/res/layout/table_layout_6.xml +92 -0
  403. data/ApiDemos/res/layout/table_layout_7.xml +106 -0
  404. data/ApiDemos/res/layout/table_layout_8.xml +87 -0
  405. data/ApiDemos/res/layout/table_layout_9.xml +92 -0
  406. data/ApiDemos/res/layout/tabs1.xml +39 -0
  407. data/ApiDemos/res/layout/tabs_right_gravity.xml +37 -0
  408. data/ApiDemos/res/layout/tabs_scroll.xml +41 -0
  409. data/ApiDemos/res/layout/tasklist_main.xml +47 -0
  410. data/ApiDemos/res/layout/tasklist_row.xml +38 -0
  411. data/ApiDemos/res/layout/text_switcher_1.xml +31 -0
  412. data/ApiDemos/res/layout/text_to_speech.xml +26 -0
  413. data/ApiDemos/res/layout/translucent_background.xml +24 -0
  414. data/ApiDemos/res/layout/videoview.xml +14 -0
  415. data/ApiDemos/res/layout/visibility_1.xml +71 -0
  416. data/ApiDemos/res/layout/voice_recognition.xml +61 -0
  417. data/ApiDemos/res/layout/wallpaper_2.xml +27 -0
  418. data/ApiDemos/res/layout/webview_1.xml +79 -0
  419. data/ApiDemos/res/menu/action_bar_settings_action_provider.xml +28 -0
  420. data/ApiDemos/res/menu/action_bar_share_action_provider.xml +28 -0
  421. data/ApiDemos/res/menu/actions.xml +48 -0
  422. data/ApiDemos/res/menu/camera_menu.xml +5 -0
  423. data/ApiDemos/res/menu/category_order.xml +57 -0
  424. data/ApiDemos/res/menu/checkable.xml +91 -0
  425. data/ApiDemos/res/menu/disabled.xml +55 -0
  426. data/ApiDemos/res/menu/display_options_actions.xml +19 -0
  427. data/ApiDemos/res/menu/groups.xml +45 -0
  428. data/ApiDemos/res/menu/list_select_menu.xml +22 -0
  429. data/ApiDemos/res/menu/order.xml +38 -0
  430. data/ApiDemos/res/menu/popup.xml +32 -0
  431. data/ApiDemos/res/menu/searchview_in_menu.xml +22 -0
  432. data/ApiDemos/res/menu/shortcuts.xml +60 -0
  433. data/ApiDemos/res/menu/submenu.xml +44 -0
  434. data/ApiDemos/res/menu/title_icon.xml +31 -0
  435. data/ApiDemos/res/menu/title_only.xml +25 -0
  436. data/ApiDemos/res/menu/visible.xml +37 -0
  437. data/ApiDemos/res/raw/androids.pkm +0 -0
  438. data/ApiDemos/res/raw/robot.png +0 -0
  439. data/ApiDemos/res/raw/skycubemap0.jpg +0 -0
  440. data/ApiDemos/res/raw/skycubemap1.jpg +0 -0
  441. data/ApiDemos/res/raw/skycubemap2.jpg +0 -0
  442. data/ApiDemos/res/raw/skycubemap3.jpg +0 -0
  443. data/ApiDemos/res/raw/skycubemap4.jpg +0 -0
  444. data/ApiDemos/res/raw/skycubemap5.jpg +0 -0
  445. data/ApiDemos/res/raw/sound_ringer_normal.ogg +0 -0
  446. data/ApiDemos/res/raw/sound_ringer_silent.ogg +0 -0
  447. data/ApiDemos/res/raw/sound_ringer_vibrate.ogg +0 -0
  448. data/ApiDemos/res/raw/sound_screen_off.ogg +0 -0
  449. data/ApiDemos/res/raw/sound_screen_on.ogg +0 -0
  450. data/ApiDemos/res/raw/sound_view_clicked.ogg +0 -0
  451. data/ApiDemos/res/raw/sound_view_focused_or_selected.ogg +0 -0
  452. data/ApiDemos/res/raw/sound_view_hover_enter.ogg +0 -0
  453. data/ApiDemos/res/raw/sound_window_state_changed.ogg +0 -0
  454. data/ApiDemos/res/raw/test_cbr.mp3 +0 -0
  455. data/ApiDemos/res/values-hdpi/strings.xml +19 -0
  456. data/ApiDemos/res/values-ldpi/strings.xml +19 -0
  457. data/ApiDemos/res/values-mdpi/strings.xml +19 -0
  458. data/ApiDemos/res/values-sw600dp/layout.xml +22 -0
  459. data/ApiDemos/res/values-v11/bools.xml +20 -0
  460. data/ApiDemos/res/values-v11/styles.xml +29 -0
  461. data/ApiDemos/res/values-v13/bools.xml +20 -0
  462. data/ApiDemos/res/values-v14/bools.xml +20 -0
  463. data/ApiDemos/res/values-xhdpi/strings.xml +19 -0
  464. data/ApiDemos/res/values-xlarge/layout.xml +22 -0
  465. data/ApiDemos/res/values/arrays.xml +149 -0
  466. data/ApiDemos/res/values/attrs.xml +55 -0
  467. data/ApiDemos/res/values/bools.xml +32 -0
  468. data/ApiDemos/res/values/colors.xml +32 -0
  469. data/ApiDemos/res/values/ids.xml +19 -0
  470. data/ApiDemos/res/values/strings.xml +1342 -0
  471. data/ApiDemos/res/values/styles.xml +124 -0
  472. data/ApiDemos/res/xml/advanced_preferences.xml +38 -0
  473. data/ApiDemos/res/xml/appwidget_provider.xml +28 -0
  474. data/ApiDemos/res/xml/default_values.xml +44 -0
  475. data/ApiDemos/res/xml/device_admin_encryption.xml +34 -0
  476. data/ApiDemos/res/xml/device_admin_expiration.xml +53 -0
  477. data/ApiDemos/res/xml/device_admin_general.xml +40 -0
  478. data/ApiDemos/res/xml/device_admin_headers.xml +41 -0
  479. data/ApiDemos/res/xml/device_admin_lock_wipe.xml +50 -0
  480. data/ApiDemos/res/xml/device_admin_quality.xml +79 -0
  481. data/ApiDemos/res/xml/device_admin_sample.xml +30 -0
  482. data/ApiDemos/res/xml/filter_nfc.xml +28 -0
  483. data/ApiDemos/res/xml/fragmented_preferences.xml +97 -0
  484. data/ApiDemos/res/xml/fragmented_preferences_inner.xml +26 -0
  485. data/ApiDemos/res/xml/preference_dependencies.xml +35 -0
  486. data/ApiDemos/res/xml/preference_headers.xml +44 -0
  487. data/ApiDemos/res/xml/preference_switch +46 -0
  488. data/ApiDemos/res/xml/preferences.xml +101 -0
  489. data/ApiDemos/res/xml/searchable.xml +30 -0
  490. data/ApiDemos/res/xml/taskbackconfig.xml +24 -0
  491. data/ApiDemos/src/com/example/android/apis/ApiDemos.java +149 -0
  492. data/ApiDemos/src/com/example/android/apis/ApiDemosApplication.java +36 -0
  493. data/ApiDemos/src/com/example/android/apis/Shakespeare.java +223 -0
  494. data/ApiDemos/src/com/example/android/apis/accessibility/ClockBackActivity.java +55 -0
  495. data/ApiDemos/src/com/example/android/apis/accessibility/ClockBackService.java +575 -0
  496. data/ApiDemos/src/com/example/android/apis/accessibility/CustomViewAccessibilityActivity.java +280 -0
  497. data/ApiDemos/src/com/example/android/apis/accessibility/TaskBackService.java +191 -0
  498. data/ApiDemos/src/com/example/android/apis/accessibility/TaskListActivity.java +59 -0
  499. data/ApiDemos/src/com/example/android/apis/accessibility/TaskListView.java +119 -0
  500. data/ApiDemos/src/com/example/android/apis/animation/AnimationCloning.java +148 -0
  501. data/ApiDemos/src/com/example/android/apis/animation/AnimationLoading.java +165 -0
  502. data/ApiDemos/src/com/example/android/apis/animation/AnimationSeeking.java +173 -0
  503. data/ApiDemos/src/com/example/android/apis/animation/AnimatorEvents.java +237 -0
  504. data/ApiDemos/src/com/example/android/apis/animation/BouncingBalls.java +184 -0
  505. data/ApiDemos/src/com/example/android/apis/animation/CustomEvaluator.java +174 -0
  506. data/ApiDemos/src/com/example/android/apis/animation/FixedGridLayout.java +108 -0
  507. data/ApiDemos/src/com/example/android/apis/animation/LayoutAnimations.java +210 -0
  508. data/ApiDemos/src/com/example/android/apis/animation/LayoutAnimationsByDefault.java +61 -0
  509. data/ApiDemos/src/com/example/android/apis/animation/LayoutAnimationsHideShow.java +178 -0
  510. data/ApiDemos/src/com/example/android/apis/animation/ListFlipper.java +126 -0
  511. data/ApiDemos/src/com/example/android/apis/animation/MultiPropertyAnimation.java +178 -0
  512. data/ApiDemos/src/com/example/android/apis/animation/ReversingAnimation.java +135 -0
  513. data/ApiDemos/src/com/example/android/apis/animation/Rotate3dAnimation.java +92 -0
  514. data/ApiDemos/src/com/example/android/apis/animation/ShapeHolder.java +100 -0
  515. data/ApiDemos/src/com/example/android/apis/animation/Transition3d.java +175 -0
  516. data/ApiDemos/src/com/example/android/apis/app/ActionBarDisplayOptions.java +124 -0
  517. data/ApiDemos/src/com/example/android/apis/app/ActionBarMechanics.java +73 -0
  518. data/ApiDemos/src/com/example/android/apis/app/ActionBarSettingsActionProviderActivity.java +112 -0
  519. data/ApiDemos/src/com/example/android/apis/app/ActionBarShareActionProviderActivity.java +125 -0
  520. data/ApiDemos/src/com/example/android/apis/app/ActionBarTabs.java +131 -0
  521. data/ApiDemos/src/com/example/android/apis/app/ActionBarUsage.java +93 -0
  522. data/ApiDemos/src/com/example/android/apis/app/ActivityRecreate.java +73 -0
  523. data/ApiDemos/src/com/example/android/apis/app/AlarmController.java +168 -0
  524. data/ApiDemos/src/com/example/android/apis/app/AlarmService.java +89 -0
  525. data/ApiDemos/src/com/example/android/apis/app/AlarmService_Service.java +131 -0
  526. data/ApiDemos/src/com/example/android/apis/app/AlertDialogSamples.java +423 -0
  527. data/ApiDemos/src/com/example/android/apis/app/Animation.java +74 -0
  528. data/ApiDemos/src/com/example/android/apis/app/AppUpdateReceiver.java +34 -0
  529. data/ApiDemos/src/com/example/android/apis/app/ContactsFilter.java +53 -0
  530. data/ApiDemos/src/com/example/android/apis/app/ContactsFilterInstrumentation.java +73 -0
  531. data/ApiDemos/src/com/example/android/apis/app/ContactsSelectInstrumentation.java +86 -0
  532. data/ApiDemos/src/com/example/android/apis/app/CustomDialogActivity.java +48 -0
  533. data/ApiDemos/src/com/example/android/apis/app/CustomTitle.java +85 -0
  534. data/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java +938 -0
  535. data/ApiDemos/src/com/example/android/apis/app/DialogActivity.java +86 -0
  536. data/ApiDemos/src/com/example/android/apis/app/ForegroundService.java +240 -0
  537. data/ApiDemos/src/com/example/android/apis/app/ForwardTarget.java +41 -0
  538. data/ApiDemos/src/com/example/android/apis/app/Forwarding.java +85 -0
  539. data/ApiDemos/src/com/example/android/apis/app/FragmentAlertDialog.java +109 -0
  540. data/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java +108 -0
  541. data/ApiDemos/src/com/example/android/apis/app/FragmentContextMenu.java +77 -0
  542. data/ApiDemos/src/com/example/android/apis/app/FragmentCustomAnimations.java +131 -0
  543. data/ApiDemos/src/com/example/android/apis/app/FragmentDialog.java +168 -0
  544. data/ApiDemos/src/com/example/android/apis/app/FragmentDialogOrActivity.java +82 -0
  545. data/ApiDemos/src/com/example/android/apis/app/FragmentHideShow.java +113 -0
  546. data/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java +220 -0
  547. data/ApiDemos/src/com/example/android/apis/app/FragmentListArray.java +60 -0
  548. data/ApiDemos/src/com/example/android/apis/app/FragmentMenu.java +132 -0
  549. data/ApiDemos/src/com/example/android/apis/app/FragmentReceiveResult.java +133 -0
  550. data/ApiDemos/src/com/example/android/apis/app/FragmentRetainInstance.java +232 -0
  551. data/ApiDemos/src/com/example/android/apis/app/FragmentStack.java +124 -0
  552. data/ApiDemos/src/com/example/android/apis/app/FragmentTabs.java +118 -0
  553. data/ApiDemos/src/com/example/android/apis/app/HelloWorld.java +66 -0
  554. data/ApiDemos/src/com/example/android/apis/app/IRemoteService.aidl +37 -0
  555. data/ApiDemos/src/com/example/android/apis/app/IRemoteServiceCallback.aidl +29 -0
  556. data/ApiDemos/src/com/example/android/apis/app/ISecondary.aidl +36 -0
  557. data/ApiDemos/src/com/example/android/apis/app/IncomingMessage.java +197 -0
  558. data/ApiDemos/src/com/example/android/apis/app/IncomingMessageInterstitial.java +64 -0
  559. data/ApiDemos/src/com/example/android/apis/app/IncomingMessageView.java +59 -0
  560. data/ApiDemos/src/com/example/android/apis/app/IntentActivityFlags.java +86 -0
  561. data/ApiDemos/src/com/example/android/apis/app/Intents.java +47 -0
  562. data/ApiDemos/src/com/example/android/apis/app/LauncherShortcuts.java +141 -0
  563. data/ApiDemos/src/com/example/android/apis/app/LoaderCursor.java +177 -0
  564. data/ApiDemos/src/com/example/android/apis/app/LoaderCustom.java +482 -0
  565. data/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.java +512 -0
  566. data/ApiDemos/src/com/example/android/apis/app/LocalSample.java +53 -0
  567. data/ApiDemos/src/com/example/android/apis/app/LocalSampleInstrumentation.java +92 -0
  568. data/ApiDemos/src/com/example/android/apis/app/LocalService.java +120 -0
  569. data/ApiDemos/src/com/example/android/apis/app/LocalServiceActivities.java +171 -0
  570. data/ApiDemos/src/com/example/android/apis/app/MenuInflateFromXml.java +174 -0
  571. data/ApiDemos/src/com/example/android/apis/app/MessengerService.java +169 -0
  572. data/ApiDemos/src/com/example/android/apis/app/MessengerServiceActivities.java +178 -0
  573. data/ApiDemos/src/com/example/android/apis/app/NotificationDisplay.java +82 -0
  574. data/ApiDemos/src/com/example/android/apis/app/NotifyWithText.java +80 -0
  575. data/ApiDemos/src/com/example/android/apis/app/NotifyingController.java +61 -0
  576. data/ApiDemos/src/com/example/android/apis/app/NotifyingService.java +128 -0
  577. data/ApiDemos/src/com/example/android/apis/app/OneShotAlarm.java +42 -0
  578. data/ApiDemos/src/com/example/android/apis/app/PersistentState.java +128 -0
  579. data/ApiDemos/src/com/example/android/apis/app/QuickContactsDemo.java +104 -0
  580. data/ApiDemos/src/com/example/android/apis/app/ReceiveResult.java +153 -0
  581. data/ApiDemos/src/com/example/android/apis/app/RedirectEnter.java +59 -0
  582. data/ApiDemos/src/com/example/android/apis/app/RedirectGetter.java +87 -0
  583. data/ApiDemos/src/com/example/android/apis/app/RedirectMain.java +122 -0
  584. data/ApiDemos/src/com/example/android/apis/app/RemoteService.java +652 -0
  585. data/ApiDemos/src/com/example/android/apis/app/ReorderFour.java +46 -0
  586. data/ApiDemos/src/com/example/android/apis/app/ReorderOnLaunch.java +44 -0
  587. data/ApiDemos/src/com/example/android/apis/app/ReorderThree.java +44 -0
  588. data/ApiDemos/src/com/example/android/apis/app/ReorderTwo.java +44 -0
  589. data/ApiDemos/src/com/example/android/apis/app/RepeatingAlarm.java +40 -0
  590. data/ApiDemos/src/com/example/android/apis/app/SaveRestoreState.java +98 -0
  591. data/ApiDemos/src/com/example/android/apis/app/ScreenOrientation.java +73 -0
  592. data/ApiDemos/src/com/example/android/apis/app/SearchInvoke.java +241 -0
  593. data/ApiDemos/src/com/example/android/apis/app/SearchQueryResults.java +118 -0
  594. data/ApiDemos/src/com/example/android/apis/app/SearchSuggestionSampleProvider.java +50 -0
  595. data/ApiDemos/src/com/example/android/apis/app/SendResult.java +81 -0
  596. data/ApiDemos/src/com/example/android/apis/app/ServiceStartArguments.java +272 -0
  597. data/ApiDemos/src/com/example/android/apis/app/SetWallpaperActivity.java +89 -0
  598. data/ApiDemos/src/com/example/android/apis/app/SoftInputModes.java +67 -0
  599. data/ApiDemos/src/com/example/android/apis/app/StatusBarNotifications.java +270 -0
  600. data/ApiDemos/src/com/example/android/apis/app/TextToSpeechActivity.java +136 -0
  601. data/ApiDemos/src/com/example/android/apis/app/TranslucentActivity.java +48 -0
  602. data/ApiDemos/src/com/example/android/apis/app/TranslucentBlurActivity.java +55 -0
  603. data/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.java +230 -0
  604. data/ApiDemos/src/com/example/android/apis/app/WallpaperActivity.java +48 -0
  605. data/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetConfigure.java +134 -0
  606. data/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetProvider.java +122 -0
  607. data/ApiDemos/src/com/example/android/apis/appwidget/ExampleBroadcastReceiver.java +56 -0
  608. data/ApiDemos/src/com/example/android/apis/content/ClipboardSample.java +144 -0
  609. data/ApiDemos/src/com/example/android/apis/content/ExternalStorage.java +376 -0
  610. data/ApiDemos/src/com/example/android/apis/content/FileProvider.java +115 -0
  611. data/ApiDemos/src/com/example/android/apis/content/InstallApk.java +179 -0
  612. data/ApiDemos/src/com/example/android/apis/content/PickContact.java +114 -0
  613. data/ApiDemos/src/com/example/android/apis/content/ReadAsset.java +73 -0
  614. data/ApiDemos/src/com/example/android/apis/content/ResourcesLayoutReference.java +33 -0
  615. data/ApiDemos/src/com/example/android/apis/content/ResourcesSample.java +90 -0
  616. data/ApiDemos/src/com/example/android/apis/content/ResourcesSmallestWidth.java +33 -0
  617. data/ApiDemos/src/com/example/android/apis/content/ResourcesWidthAndHeight.java +33 -0
  618. data/ApiDemos/src/com/example/android/apis/content/StyledText.java +51 -0
  619. data/ApiDemos/src/com/example/android/apis/graphics/AlphaBitmap.java +91 -0
  620. data/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawable.java +72 -0
  621. data/ApiDemos/src/com/example/android/apis/graphics/AnimateDrawables.java +67 -0
  622. data/ApiDemos/src/com/example/android/apis/graphics/Arcs.java +118 -0
  623. data/ApiDemos/src/com/example/android/apis/graphics/BitmapDecode.java +144 -0
  624. data/ApiDemos/src/com/example/android/apis/graphics/BitmapMesh.java +130 -0
  625. data/ApiDemos/src/com/example/android/apis/graphics/BitmapPixels.java +161 -0
  626. data/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.java +311 -0
  627. data/ApiDemos/src/com/example/android/apis/graphics/Clipping.java +111 -0
  628. data/ApiDemos/src/com/example/android/apis/graphics/ColorFilters.java +180 -0
  629. data/ApiDemos/src/com/example/android/apis/graphics/ColorMatrixSample.java +122 -0
  630. data/ApiDemos/src/com/example/android/apis/graphics/ColorPickerDialog.java +233 -0
  631. data/ApiDemos/src/com/example/android/apis/graphics/Compass.java +130 -0
  632. data/ApiDemos/src/com/example/android/apis/graphics/CompressedTextureActivity.java +157 -0
  633. data/ApiDemos/src/com/example/android/apis/graphics/CreateBitmap.java +126 -0
  634. data/ApiDemos/src/com/example/android/apis/graphics/Cube.java +100 -0
  635. data/ApiDemos/src/com/example/android/apis/graphics/CubeMapActivity.java +416 -0
  636. data/ApiDemos/src/com/example/android/apis/graphics/CubeRenderer.java +108 -0
  637. data/ApiDemos/src/com/example/android/apis/graphics/DensityActivity.java +220 -0
  638. data/ApiDemos/src/com/example/android/apis/graphics/DrawPoints.java +79 -0
  639. data/ApiDemos/src/com/example/android/apis/graphics/FingerPaint.java +208 -0
  640. data/ApiDemos/src/com/example/android/apis/graphics/FrameBufferObjectActivity.java +282 -0
  641. data/ApiDemos/src/com/example/android/apis/graphics/GLES20Activity.java +72 -0
  642. data/ApiDemos/src/com/example/android/apis/graphics/GLES20TriangleRenderer.java +255 -0
  643. data/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceViewActivity.java +56 -0
  644. data/ApiDemos/src/com/example/android/apis/graphics/GradientDrawable1.java +31 -0
  645. data/ApiDemos/src/com/example/android/apis/graphics/GraphicsActivity.java +43 -0
  646. data/ApiDemos/src/com/example/android/apis/graphics/Layers.java +65 -0
  647. data/ApiDemos/src/com/example/android/apis/graphics/MatrixPaletteActivity.java +52 -0
  648. data/ApiDemos/src/com/example/android/apis/graphics/MatrixPaletteRenderer.java +408 -0
  649. data/ApiDemos/src/com/example/android/apis/graphics/MeasureText.java +112 -0
  650. data/ApiDemos/src/com/example/android/apis/graphics/PathEffects.java +121 -0
  651. data/ApiDemos/src/com/example/android/apis/graphics/PathFillTypes.java +77 -0
  652. data/ApiDemos/src/com/example/android/apis/graphics/Patterns.java +125 -0
  653. data/ApiDemos/src/com/example/android/apis/graphics/PictureLayout.java +161 -0
  654. data/ApiDemos/src/com/example/android/apis/graphics/Pictures.java +81 -0
  655. data/ApiDemos/src/com/example/android/apis/graphics/PolyToPoly.java +107 -0
  656. data/ApiDemos/src/com/example/android/apis/graphics/ProxyDrawable.java +102 -0
  657. data/ApiDemos/src/com/example/android/apis/graphics/PurgeableBitmap.java +118 -0
  658. data/ApiDemos/src/com/example/android/apis/graphics/PurgeableBitmapView.java +116 -0
  659. data/ApiDemos/src/com/example/android/apis/graphics/Regions.java +126 -0
  660. data/ApiDemos/src/com/example/android/apis/graphics/RoundRects.java +113 -0
  661. data/ApiDemos/src/com/example/android/apis/graphics/ScaleToFit.java +121 -0
  662. data/ApiDemos/src/com/example/android/apis/graphics/SensorTest.java +213 -0
  663. data/ApiDemos/src/com/example/android/apis/graphics/ShapeDrawable1.java +136 -0
  664. data/ApiDemos/src/com/example/android/apis/graphics/StaticTriangleRenderer.java +274 -0
  665. data/ApiDemos/src/com/example/android/apis/graphics/SurfaceViewOverlay.java +116 -0
  666. data/ApiDemos/src/com/example/android/apis/graphics/Sweep.java +97 -0
  667. data/ApiDemos/src/com/example/android/apis/graphics/TextAlign.java +161 -0
  668. data/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.java +528 -0
  669. data/ApiDemos/src/com/example/android/apis/graphics/TouchRotateActivity.java +184 -0
  670. data/ApiDemos/src/com/example/android/apis/graphics/TranslucentGLSurfaceViewActivity.java +63 -0
  671. data/ApiDemos/src/com/example/android/apis/graphics/TriangleActivity.java +49 -0
  672. data/ApiDemos/src/com/example/android/apis/graphics/TriangleRenderer.java +241 -0
  673. data/ApiDemos/src/com/example/android/apis/graphics/Typefaces.java +55 -0
  674. data/ApiDemos/src/com/example/android/apis/graphics/UnicodeChart.java +119 -0
  675. data/ApiDemos/src/com/example/android/apis/graphics/Vertices.java +103 -0
  676. data/ApiDemos/src/com/example/android/apis/graphics/WindowSurface.java +271 -0
  677. data/ApiDemos/src/com/example/android/apis/graphics/Xfermodes.java +171 -0
  678. data/ApiDemos/src/com/example/android/apis/graphics/kube/Cube.java +57 -0
  679. data/ApiDemos/src/com/example/android/apis/graphics/kube/GLColor.java +51 -0
  680. data/ApiDemos/src/com/example/android/apis/graphics/kube/GLFace.java +94 -0
  681. data/ApiDemos/src/com/example/android/apis/graphics/kube/GLShape.java +102 -0
  682. data/ApiDemos/src/com/example/android/apis/graphics/kube/GLVertex.java +89 -0
  683. data/ApiDemos/src/com/example/android/apis/graphics/kube/GLWorld.java +98 -0
  684. data/ApiDemos/src/com/example/android/apis/graphics/kube/Kube.java +342 -0
  685. data/ApiDemos/src/com/example/android/apis/graphics/kube/KubeRenderer.java +116 -0
  686. data/ApiDemos/src/com/example/android/apis/graphics/kube/Layer.java +101 -0
  687. data/ApiDemos/src/com/example/android/apis/graphics/kube/M4.java +80 -0
  688. data/ApiDemos/src/com/example/android/apis/graphics/spritetext/Grid.java +140 -0
  689. data/ApiDemos/src/com/example/android/apis/graphics/spritetext/LabelMaker.java +411 -0
  690. data/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixGrabber.java +63 -0
  691. data/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixStack.java +179 -0
  692. data/ApiDemos/src/com/example/android/apis/graphics/spritetext/MatrixTrackingGL.java +1086 -0
  693. data/ApiDemos/src/com/example/android/apis/graphics/spritetext/NumericSprite.java +99 -0
  694. data/ApiDemos/src/com/example/android/apis/graphics/spritetext/Projector.java +84 -0
  695. data/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextActivity.java +52 -0
  696. data/ApiDemos/src/com/example/android/apis/graphics/spritetext/SpriteTextRenderer.java +354 -0
  697. data/ApiDemos/src/com/example/android/apis/media/AudioFxDemo.java +252 -0
  698. data/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo.java +102 -0
  699. data/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Audio.java +102 -0
  700. data/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.java +219 -0
  701. data/ApiDemos/src/com/example/android/apis/media/VideoViewDemo.java +61 -0
  702. data/ApiDemos/src/com/example/android/apis/nfc/ForegroundDispatch.java +93 -0
  703. data/ApiDemos/src/com/example/android/apis/nfc/ForegroundNdefPush.java +86 -0
  704. data/ApiDemos/src/com/example/android/apis/nfc/TechFilter.java +51 -0
  705. data/ApiDemos/src/com/example/android/apis/os/MorseCode.java +93 -0
  706. data/ApiDemos/src/com/example/android/apis/os/MorseCodeConverter.java +141 -0
  707. data/ApiDemos/src/com/example/android/apis/os/RotationVectorDemo.java +216 -0
  708. data/ApiDemos/src/com/example/android/apis/os/Sensors.java +241 -0
  709. data/ApiDemos/src/com/example/android/apis/os/SmsMessageReceiver.java +78 -0
  710. data/ApiDemos/src/com/example/android/apis/os/SmsMessagingDemo.java +159 -0
  711. data/ApiDemos/src/com/example/android/apis/os/SmsReceivedDialog.java +115 -0
  712. data/ApiDemos/src/com/example/android/apis/preference/AdvancedPreferences.java +94 -0
  713. data/ApiDemos/src/com/example/android/apis/preference/DefaultValues.java +61 -0
  714. data/ApiDemos/src/com/example/android/apis/preference/FragmentPreferences.java +52 -0
  715. data/ApiDemos/src/com/example/android/apis/preference/LaunchingPreferences.java +100 -0
  716. data/ApiDemos/src/com/example/android/apis/preference/MyPreference.java +171 -0
  717. data/ApiDemos/src/com/example/android/apis/preference/PreferenceDependencies.java +33 -0
  718. data/ApiDemos/src/com/example/android/apis/preference/PreferenceWithHeaders.java +108 -0
  719. data/ApiDemos/src/com/example/android/apis/preference/PreferencesFromCode.java +151 -0
  720. data/ApiDemos/src/com/example/android/apis/preference/PreferencesFromXml.java +34 -0
  721. data/ApiDemos/src/com/example/android/apis/preference/SwitchPreference.java +38 -0
  722. data/ApiDemos/src/com/example/android/apis/text/Link.java +84 -0
  723. data/ApiDemos/src/com/example/android/apis/text/LogTextBox.java +64 -0
  724. data/ApiDemos/src/com/example/android/apis/text/LogTextBox1.java +50 -0
  725. data/ApiDemos/src/com/example/android/apis/text/Marquee.java +31 -0
  726. data/ApiDemos/src/com/example/android/apis/view/Animation1.java +45 -0
  727. data/ApiDemos/src/com/example/android/apis/view/Animation2.java +90 -0
  728. data/ApiDemos/src/com/example/android/apis/view/Animation3.java +101 -0
  729. data/ApiDemos/src/com/example/android/apis/view/AutoComplete1.java +82 -0
  730. data/ApiDemos/src/com/example/android/apis/view/AutoComplete2.java +41 -0
  731. data/ApiDemos/src/com/example/android/apis/view/AutoComplete3.java +43 -0
  732. data/ApiDemos/src/com/example/android/apis/view/AutoComplete4.java +103 -0
  733. data/ApiDemos/src/com/example/android/apis/view/AutoComplete5.java +44 -0
  734. data/ApiDemos/src/com/example/android/apis/view/AutoComplete6.java +83 -0
  735. data/ApiDemos/src/com/example/android/apis/view/Baseline1.java +35 -0
  736. data/ApiDemos/src/com/example/android/apis/view/Baseline2.java +35 -0
  737. data/ApiDemos/src/com/example/android/apis/view/Baseline3.java +36 -0
  738. data/ApiDemos/src/com/example/android/apis/view/Baseline4.java +35 -0
  739. data/ApiDemos/src/com/example/android/apis/view/Baseline6.java +35 -0
  740. data/ApiDemos/src/com/example/android/apis/view/Baseline7.java +35 -0
  741. data/ApiDemos/src/com/example/android/apis/view/BaselineNested1.java +36 -0
  742. data/ApiDemos/src/com/example/android/apis/view/BaselineNested2.java +36 -0
  743. data/ApiDemos/src/com/example/android/apis/view/BaselineNested3.java +36 -0
  744. data/ApiDemos/src/com/example/android/apis/view/Buttons1.java +36 -0
  745. data/ApiDemos/src/com/example/android/apis/view/CheckableFrameLayout.java +49 -0
  746. data/ApiDemos/src/com/example/android/apis/view/Cheeses.java +155 -0
  747. data/ApiDemos/src/com/example/android/apis/view/ChronometerDemo.java +90 -0
  748. data/ApiDemos/src/com/example/android/apis/view/Controls1.java +54 -0
  749. data/ApiDemos/src/com/example/android/apis/view/Controls2.java +19 -0
  750. data/ApiDemos/src/com/example/android/apis/view/Controls3.java +19 -0
  751. data/ApiDemos/src/com/example/android/apis/view/Controls4.java +19 -0
  752. data/ApiDemos/src/com/example/android/apis/view/Controls5.java +19 -0
  753. data/ApiDemos/src/com/example/android/apis/view/Controls6.java +19 -0
  754. data/ApiDemos/src/com/example/android/apis/view/CustomView1.java +40 -0
  755. data/ApiDemos/src/com/example/android/apis/view/DateWidgets1.java +156 -0
  756. data/ApiDemos/src/com/example/android/apis/view/DateWidgets2.java +68 -0
  757. data/ApiDemos/src/com/example/android/apis/view/DragAndDropDemo.java +72 -0
  758. data/ApiDemos/src/com/example/android/apis/view/DraggableDot.java +261 -0
  759. data/ApiDemos/src/com/example/android/apis/view/ExpandableList1.java +160 -0
  760. data/ApiDemos/src/com/example/android/apis/view/ExpandableList2.java +138 -0
  761. data/ApiDemos/src/com/example/android/apis/view/ExpandableList3.java +76 -0
  762. data/ApiDemos/src/com/example/android/apis/view/Focus1.java +47 -0
  763. data/ApiDemos/src/com/example/android/apis/view/Focus2.java +32 -0
  764. data/ApiDemos/src/com/example/android/apis/view/Focus3.java +45 -0
  765. data/ApiDemos/src/com/example/android/apis/view/Focus5.java +31 -0
  766. data/ApiDemos/src/com/example/android/apis/view/Gallery1.java +139 -0
  767. data/ApiDemos/src/com/example/android/apis/view/Gallery2.java +61 -0
  768. data/ApiDemos/src/com/example/android/apis/view/GameControllerInput.java +467 -0
  769. data/ApiDemos/src/com/example/android/apis/view/GameView.java +747 -0
  770. data/ApiDemos/src/com/example/android/apis/view/Grid1.java +95 -0
  771. data/ApiDemos/src/com/example/android/apis/view/Grid2.java +166 -0
  772. data/ApiDemos/src/com/example/android/apis/view/Grid3.java +164 -0
  773. data/ApiDemos/src/com/example/android/apis/view/GridLayout0.java +113 -0
  774. data/ApiDemos/src/com/example/android/apis/view/GridLayout1.java +32 -0
  775. data/ApiDemos/src/com/example/android/apis/view/HorizontalScrollView1.java +33 -0
  776. data/ApiDemos/src/com/example/android/apis/view/Hover.java +106 -0
  777. data/ApiDemos/src/com/example/android/apis/view/HoverInterceptorView.java +71 -0
  778. data/ApiDemos/src/com/example/android/apis/view/ImageButton1.java +33 -0
  779. data/ApiDemos/src/com/example/android/apis/view/ImageSwitcher1.java +120 -0
  780. data/ApiDemos/src/com/example/android/apis/view/ImageView1.java +36 -0
  781. data/ApiDemos/src/com/example/android/apis/view/InternalSelectionFocus.java +74 -0
  782. data/ApiDemos/src/com/example/android/apis/view/InternalSelectionScroll.java +64 -0
  783. data/ApiDemos/src/com/example/android/apis/view/InternalSelectionView.java +272 -0
  784. data/ApiDemos/src/com/example/android/apis/view/LabelView.java +194 -0
  785. data/ApiDemos/src/com/example/android/apis/view/LayoutAnimation1.java +81 -0
  786. data/ApiDemos/src/com/example/android/apis/view/LayoutAnimation2.java +64 -0
  787. data/ApiDemos/src/com/example/android/apis/view/LayoutAnimation3.java +44 -0
  788. data/ApiDemos/src/com/example/android/apis/view/LayoutAnimation4.java +81 -0
  789. data/ApiDemos/src/com/example/android/apis/view/LayoutAnimation5.java +81 -0
  790. data/ApiDemos/src/com/example/android/apis/view/LayoutAnimation6.java +81 -0
  791. data/ApiDemos/src/com/example/android/apis/view/LayoutAnimation7.java +31 -0
  792. data/ApiDemos/src/com/example/android/apis/view/LinearLayout1.java +37 -0
  793. data/ApiDemos/src/com/example/android/apis/view/LinearLayout10.java +37 -0
  794. data/ApiDemos/src/com/example/android/apis/view/LinearLayout2.java +37 -0
  795. data/ApiDemos/src/com/example/android/apis/view/LinearLayout3.java +37 -0
  796. data/ApiDemos/src/com/example/android/apis/view/LinearLayout4.java +38 -0
  797. data/ApiDemos/src/com/example/android/apis/view/LinearLayout5.java +38 -0
  798. data/ApiDemos/src/com/example/android/apis/view/LinearLayout6.java +38 -0
  799. data/ApiDemos/src/com/example/android/apis/view/LinearLayout7.java +38 -0
  800. data/ApiDemos/src/com/example/android/apis/view/LinearLayout8.java +106 -0
  801. data/ApiDemos/src/com/example/android/apis/view/LinearLayout9.java +41 -0
  802. data/ApiDemos/src/com/example/android/apis/view/List1.java +42 -0
  803. data/ApiDemos/src/com/example/android/apis/view/List10.java +49 -0
  804. data/ApiDemos/src/com/example/android/apis/view/List11.java +49 -0
  805. data/ApiDemos/src/com/example/android/apis/view/List12.java +83 -0
  806. data/ApiDemos/src/com/example/android/apis/view/List13.java +341 -0
  807. data/ApiDemos/src/com/example/android/apis/view/List14.java +141 -0
  808. data/ApiDemos/src/com/example/android/apis/view/List15.java +104 -0
  809. data/ApiDemos/src/com/example/android/apis/view/List16.java +100 -0
  810. data/ApiDemos/src/com/example/android/apis/view/List17.java +57 -0
  811. data/ApiDemos/src/com/example/android/apis/view/List2.java +57 -0
  812. data/ApiDemos/src/com/example/android/apis/view/List3.java +84 -0
  813. data/ApiDemos/src/com/example/android/apis/view/List4.java +154 -0
  814. data/ApiDemos/src/com/example/android/apis/view/List5.java +118 -0
  815. data/ApiDemos/src/com/example/android/apis/view/List6.java +410 -0
  816. data/ApiDemos/src/com/example/android/apis/view/List7.java +99 -0
  817. data/ApiDemos/src/com/example/android/apis/view/List8.java +133 -0
  818. data/ApiDemos/src/com/example/android/apis/view/List9.java +144 -0
  819. data/ApiDemos/src/com/example/android/apis/view/OverscanActivity.java +184 -0
  820. data/ApiDemos/src/com/example/android/apis/view/PopupMenu1.java +53 -0
  821. data/ApiDemos/src/com/example/android/apis/view/ProgressBar1.java +84 -0
  822. data/ApiDemos/src/com/example/android/apis/view/ProgressBar2.java +44 -0
  823. data/ApiDemos/src/com/example/android/apis/view/ProgressBar3.java +84 -0
  824. data/ApiDemos/src/com/example/android/apis/view/ProgressBar4.java +51 -0
  825. data/ApiDemos/src/com/example/android/apis/view/RadioGroup1.java +74 -0
  826. data/ApiDemos/src/com/example/android/apis/view/RatingBar1.java +74 -0
  827. data/ApiDemos/src/com/example/android/apis/view/RelativeLayout1.java +37 -0
  828. data/ApiDemos/src/com/example/android/apis/view/RelativeLayout2.java +38 -0
  829. data/ApiDemos/src/com/example/android/apis/view/RotatingButton.java +152 -0
  830. data/ApiDemos/src/com/example/android/apis/view/ScrollBar1.java +32 -0
  831. data/ApiDemos/src/com/example/android/apis/view/ScrollBar2.java +32 -0
  832. data/ApiDemos/src/com/example/android/apis/view/ScrollBar3.java +35 -0
  833. data/ApiDemos/src/com/example/android/apis/view/ScrollView1.java +37 -0
  834. data/ApiDemos/src/com/example/android/apis/view/ScrollView2.java +52 -0
  835. data/ApiDemos/src/com/example/android/apis/view/SearchViewActionBar.java +115 -0
  836. data/ApiDemos/src/com/example/android/apis/view/SearchViewAlwaysVisible.java +46 -0
  837. data/ApiDemos/src/com/example/android/apis/view/SearchViewFilterMode.java +78 -0
  838. data/ApiDemos/src/com/example/android/apis/view/SecureView.java +144 -0
  839. data/ApiDemos/src/com/example/android/apis/view/SecureViewOverlay.java +74 -0
  840. data/ApiDemos/src/com/example/android/apis/view/SeekBar1.java +60 -0
  841. data/ApiDemos/src/com/example/android/apis/view/Spinner1.java +78 -0
  842. data/ApiDemos/src/com/example/android/apis/view/SplitTouchView.java +66 -0
  843. data/ApiDemos/src/com/example/android/apis/view/Switches.java +48 -0
  844. data/ApiDemos/src/com/example/android/apis/view/TableLayout1.java +32 -0
  845. data/ApiDemos/src/com/example/android/apis/view/TableLayout10.java +31 -0
  846. data/ApiDemos/src/com/example/android/apis/view/TableLayout11.java +34 -0
  847. data/ApiDemos/src/com/example/android/apis/view/TableLayout12.java +34 -0
  848. data/ApiDemos/src/com/example/android/apis/view/TableLayout2.java +32 -0
  849. data/ApiDemos/src/com/example/android/apis/view/TableLayout3.java +32 -0
  850. data/ApiDemos/src/com/example/android/apis/view/TableLayout4.java +32 -0
  851. data/ApiDemos/src/com/example/android/apis/view/TableLayout5.java +32 -0
  852. data/ApiDemos/src/com/example/android/apis/view/TableLayout6.java +32 -0
  853. data/ApiDemos/src/com/example/android/apis/view/TableLayout7.java +80 -0
  854. data/ApiDemos/src/com/example/android/apis/view/TableLayout8.java +71 -0
  855. data/ApiDemos/src/com/example/android/apis/view/TableLayout9.java +48 -0
  856. data/ApiDemos/src/com/example/android/apis/view/Tabs1.java +50 -0
  857. data/ApiDemos/src/com/example/android/apis/view/Tabs2.java +57 -0
  858. data/ApiDemos/src/com/example/android/apis/view/Tabs3.java +50 -0
  859. data/ApiDemos/src/com/example/android/apis/view/Tabs4.java +23 -0
  860. data/ApiDemos/src/com/example/android/apis/view/Tabs5.java +54 -0
  861. data/ApiDemos/src/com/example/android/apis/view/Tabs6.java +55 -0
  862. data/ApiDemos/src/com/example/android/apis/view/TextSwitcher1.java +79 -0
  863. data/ApiDemos/src/com/example/android/apis/view/Visibility1.java +74 -0
  864. data/ApiDemos/src/com/example/android/apis/view/WebView1.java +71 -0
  865. data/ApiDemos/tests/AndroidManifest.xml +37 -0
  866. data/ApiDemos/tests/ant.properties +18 -0
  867. data/ApiDemos/tests/build.xml +83 -0
  868. data/ApiDemos/tests/local.properties +10 -0
  869. data/ApiDemos/tests/proguard-project.txt +20 -0
  870. data/ApiDemos/tests/project.properties +14 -0
  871. data/ApiDemos/tests/src/com/example/android/apis/AllTests.java +53 -0
  872. data/ApiDemos/tests/src/com/example/android/apis/ApiDemosApplicationTests.java +62 -0
  873. data/ApiDemos/tests/src/com/example/android/apis/ApiDemosTest.java +40 -0
  874. data/ApiDemos/tests/src/com/example/android/apis/app/ForwardingTest.java +129 -0
  875. data/ApiDemos/tests/src/com/example/android/apis/app/LocalServiceTest.java +80 -0
  876. data/ApiDemos/tests/src/com/example/android/apis/os/MorseCodeConverterTest.java +54 -0
  877. data/ApiDemos/tests/src/com/example/android/apis/view/Focus2ActivityTest.java +111 -0
  878. data/ApiDemos/tests/src/com/example/android/apis/view/Focus2AndroidTest.java +113 -0
  879. data/ChangeLog +2 -0
  880. data/Gemfile +12 -0
  881. data/Guardfile +17 -0
  882. data/LICENSE +22 -0
  883. data/README.md +59 -0
  884. data/Rakefile +24 -0
  885. data/cucumber.yml +6 -0
  886. data/features/button.feature +16 -0
  887. data/features/checkbox.feature +9 -0
  888. data/features/list_item.feature +13 -0
  889. data/features/main_screen.feature +18 -0
  890. data/features/radio_button.feature +6 -0
  891. data/features/step_definitions/button_steps.rb +22 -0
  892. data/features/step_definitions/calabash_steps.rb +1 -0
  893. data/features/step_definitions/checkbox_steps.rb +3 -0
  894. data/features/step_definitions/controls_steps.rb +19 -0
  895. data/features/step_definitions/list_item_steps.rb +7 -0
  896. data/features/step_definitions/main_screen_steps.rb +22 -0
  897. data/features/step_definitions/radio_button_steps.rb +3 -0
  898. data/features/support/app_installation_hooks.rb +31 -0
  899. data/features/support/app_life_cycle_hooks.rb +28 -0
  900. data/features/support/env.rb +8 -0
  901. data/features/support/hooks.rb +18 -0
  902. data/features/support/screens/buttons_screen.rb +9 -0
  903. data/features/support/screens/controls_menu_screen.rb +8 -0
  904. data/features/support/screens/controls_screen.rb +11 -0
  905. data/features/support/screens/main_menu_screen.rb +15 -0
  906. data/features/support/screens/views_menu_screen.rb +40 -0
  907. data/features/text.feature +7 -0
  908. data/gametel.gemspec +23 -0
  909. data/irb_android.sh +2 -0
  910. data/lib/gametel.rb +55 -0
  911. data/lib/gametel/accessors.rb +98 -0
  912. data/lib/gametel/navigation.rb +9 -0
  913. data/lib/gametel/platforms/calabash.rb +89 -0
  914. data/lib/gametel/version.rb +3 -0
  915. data/spec/lib/gametel/accessors_spec.rb +67 -0
  916. data/spec/lib/gametel_spec.rb +44 -0
  917. data/spec/spec_helper.rb +19 -0
  918. 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
+ }