Showing preview only (4,426K chars total). Download the full file or copy to clipboard to get everything.
Repository: 47deg/nine-cards-v2
Branch: master
Commit: 1cbab6cd94a3
Files: 950
Total size: 4.0 MB
Directory structure:
gitextract_ztr7dq7x/
├── .gitignore
├── .scalafmt.conf
├── .travis.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── ISSUE_TEMPLATE.md
├── LICENSE
├── PULL_REQUEST_TEMPLATE.md
├── README.md
├── README_old.md
├── codecov.yml
├── modules/
│ ├── api/
│ │ ├── build.sbt
│ │ └── src/
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── res/
│ │ │ │ └── values/
│ │ │ │ └── strings.xml
│ │ │ └── scala/
│ │ │ └── cards/
│ │ │ └── nine/
│ │ │ └── api/
│ │ │ ├── rest/
│ │ │ │ └── client/
│ │ │ │ ├── Exceptions.scala
│ │ │ │ ├── ServiceClient.scala
│ │ │ │ ├── http/
│ │ │ │ │ ├── Exceptions.scala
│ │ │ │ │ ├── HttpClient.scala
│ │ │ │ │ ├── HttpClientResponse.scala
│ │ │ │ │ └── OkHttpClient.scala
│ │ │ │ └── messages/
│ │ │ │ └── Messages.scala
│ │ │ ├── version1/
│ │ │ │ ├── ApiService.scala
│ │ │ │ ├── JsonImplicits.scala
│ │ │ │ └── Model.scala
│ │ │ └── version2/
│ │ │ ├── ApiService.scala
│ │ │ ├── JsonImplicits.scala
│ │ │ └── Model.scala
│ │ └── test/
│ │ └── scala/
│ │ ├── cards/
│ │ │ └── nine/
│ │ │ └── api/
│ │ │ ├── rest/
│ │ │ │ └── client/
│ │ │ │ ├── Messages.scala
│ │ │ │ ├── ServiceClientData.scala
│ │ │ │ ├── ServiceClientSpec.scala
│ │ │ │ └── http/
│ │ │ │ └── OkHttpClientSpec.scala
│ │ │ ├── version1/
│ │ │ │ ├── ApiServiceData.scala
│ │ │ │ └── ApiServiceSpec.scala
│ │ │ └── version2/
│ │ │ ├── ApiServiceData.scala
│ │ │ └── ApiServiceSpec.scala
│ │ └── com/
│ │ └── fortysevendeg/
│ │ └── BaseTestSupport.scala
│ ├── app/
│ │ ├── build.sbt
│ │ ├── crashlytics/
│ │ │ └── templates/
│ │ │ └── CrashlyticsManifest.xml
│ │ ├── project/
│ │ │ └── plugins.sbt
│ │ └── src/
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── java/
│ │ │ │ └── cards/
│ │ │ │ └── nine/
│ │ │ │ └── utils/
│ │ │ │ └── SystemBarTintManager.java
│ │ │ ├── res/
│ │ │ │ ├── anim/
│ │ │ │ │ ├── elevation_transition.xml
│ │ │ │ │ ├── grid_cards_layout_animation.xml
│ │ │ │ │ ├── list_slide_in_bottom_animation.xml
│ │ │ │ │ └── slide_in_bottom.xml
│ │ │ │ ├── color/
│ │ │ │ │ └── wizard_text_button.xml
│ │ │ │ ├── drawable/
│ │ │ │ │ ├── background_icon_collection_detail.xml
│ │ │ │ │ ├── background_title_fab_menu_item.xml
│ │ │ │ │ ├── background_title_fab_menu_item_default.xml
│ │ │ │ │ ├── background_title_fab_menu_item_pressed.xml
│ │ │ │ │ ├── drawer_pager.xml
│ │ │ │ │ ├── drawer_pager_current.xml
│ │ │ │ │ ├── drawer_pager_default.xml
│ │ │ │ │ ├── fastscroller_bar.xml
│ │ │ │ │ ├── fastscroller_signal.xml
│ │ │ │ │ ├── mark_widget_resizing.xml
│ │ │ │ │ ├── publish_collection_wizard_pager.xml
│ │ │ │ │ ├── publish_collection_wizard_pager_current.xml
│ │ │ │ │ ├── stroke_widget_selected.xml
│ │ │ │ │ ├── wizard_inline_pager.xml
│ │ │ │ │ ├── wizard_inline_pager_current.xml
│ │ │ │ │ ├── wizard_inline_pager_default.xml
│ │ │ │ │ ├── wizard_pager.xml
│ │ │ │ │ ├── wizard_pager_current.xml
│ │ │ │ │ ├── wizard_pager_default.xml
│ │ │ │ │ └── workspaces_pager.xml
│ │ │ │ ├── layout/
│ │ │ │ │ ├── about_header_preference.xml
│ │ │ │ │ ├── about_team_preference.xml
│ │ │ │ │ ├── add_moment_item.xml
│ │ │ │ │ ├── app_drawer_layout.xml
│ │ │ │ │ ├── app_drawer_panel.xml
│ │ │ │ │ ├── app_item.xml
│ │ │ │ │ ├── app_link_dialog_activity.xml
│ │ │ │ │ ├── app_select_item.xml
│ │ │ │ │ ├── apps_moment_layout.xml
│ │ │ │ │ ├── base_action_fragment.xml
│ │ │ │ │ ├── card_item.xml
│ │ │ │ │ ├── collection_bar_view_panel.xml
│ │ │ │ │ ├── collection_checkbox.xml
│ │ │ │ │ ├── collection_detail_fragment.xml
│ │ │ │ │ ├── collection_item.xml
│ │ │ │ │ ├── collections_actions_view_panel.xml
│ │ │ │ │ ├── collections_detail_activity.xml
│ │ │ │ │ ├── collections_detail_tab.xml
│ │ │ │ │ ├── collections_workspace_layout.xml
│ │ │ │ │ ├── color_info_item_dialog.xml
│ │ │ │ │ ├── contact_info_email_dialog.xml
│ │ │ │ │ ├── contact_info_general_dialog.xml
│ │ │ │ │ ├── contact_info_header.xml
│ │ │ │ │ ├── contact_info_phone_dialog.xml
│ │ │ │ │ ├── contact_item.xml
│ │ │ │ │ ├── dialog_edit_card.xml
│ │ │ │ │ ├── dialog_edit_text.xml
│ │ │ │ │ ├── edit_moment.xml
│ │ │ │ │ ├── edit_moment_hour_layout.xml
│ │ │ │ │ ├── edit_moment_wifi_layout.xml
│ │ │ │ │ ├── empty_profile_item.xml
│ │ │ │ │ ├── fab_item.xml
│ │ │ │ │ ├── fastscroller.xml
│ │ │ │ │ ├── header_list_item.xml
│ │ │ │ │ ├── icon_info_item_dialog.xml
│ │ │ │ │ ├── last_call_item.xml
│ │ │ │ │ ├── launcher_activity.xml
│ │ │ │ │ ├── list_action_apps_fragment.xml
│ │ │ │ │ ├── list_action_fragment.xml
│ │ │ │ │ ├── list_action_with_scroller_fragment.xml
│ │ │ │ │ ├── list_item_popup_menu.xml
│ │ │ │ │ ├── menu_header.xml
│ │ │ │ │ ├── moment_bar_view_panel.xml
│ │ │ │ │ ├── new_collection.xml
│ │ │ │ │ ├── private_collections_item.xml
│ │ │ │ │ ├── profile_account_item.xml
│ │ │ │ │ ├── profile_account_item_header.xml
│ │ │ │ │ ├── profile_activity.xml
│ │ │ │ │ ├── profile_subscription_item.xml
│ │ │ │ │ ├── public_collections_item.xml
│ │ │ │ │ ├── publish_collection_wizard.xml
│ │ │ │ │ ├── recommendations_item.xml
│ │ │ │ │ ├── search_box_panel.xml
│ │ │ │ │ ├── search_item.xml
│ │ │ │ │ ├── select_collection_dialog.xml
│ │ │ │ │ ├── select_collection_item.xml
│ │ │ │ │ ├── select_moment_dialog.xml
│ │ │ │ │ ├── select_moment_item.xml
│ │ │ │ │ ├── shortcut_item.xml
│ │ │ │ │ ├── swipe_animation_drawer_layout.xml
│ │ │ │ │ ├── tab_item.xml
│ │ │ │ │ ├── toolbar_dialog.xml
│ │ │ │ │ ├── widget_item.xml
│ │ │ │ │ ├── widgets_action_fragment.xml
│ │ │ │ │ ├── wizard_activity.xml
│ │ │ │ │ ├── wizard_checkbox.xml
│ │ │ │ │ ├── wizard_inline.xml
│ │ │ │ │ ├── wizard_inline_step.xml
│ │ │ │ │ ├── wizard_moment_checkbox.xml
│ │ │ │ │ ├── wizard_new_conf_step_0.xml
│ │ │ │ │ ├── wizard_new_conf_step_1.xml
│ │ │ │ │ ├── wizard_new_conf_step_2.xml
│ │ │ │ │ ├── wizard_new_conf_step_3.xml
│ │ │ │ │ ├── wizard_new_conf_step_4.xml
│ │ │ │ │ ├── wizard_new_conf_step_5.xml
│ │ │ │ │ ├── wizard_step.xml
│ │ │ │ │ ├── wizard_wifi_checkbox.xml
│ │ │ │ │ ├── workspace_button.xml
│ │ │ │ │ ├── workspace_item_menu.xml
│ │ │ │ │ └── workspace_menu_layout.xml
│ │ │ │ ├── menu/
│ │ │ │ │ ├── app_menu.xml
│ │ │ │ │ ├── collection_detail_menu.xml
│ │ │ │ │ ├── collection_edit_menu.xml
│ │ │ │ │ └── profile_menu.xml
│ │ │ │ ├── values/
│ │ │ │ │ ├── arrays.xml
│ │ │ │ │ ├── colors.xml
│ │ │ │ │ ├── config.xml
│ │ │ │ │ ├── dimens.xml
│ │ │ │ │ ├── ids.xml
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ ├── styles_actions.xml
│ │ │ │ │ ├── styles_cards.xml
│ │ │ │ │ ├── styles_collections.xml
│ │ │ │ │ ├── styles_dialogs.xml
│ │ │ │ │ ├── styles_drawer.xml
│ │ │ │ │ ├── styles_fast_scroller.xml
│ │ │ │ │ ├── styles_items.xml
│ │ │ │ │ ├── styles_launcher.xml
│ │ │ │ │ ├── styles_menu.xml
│ │ │ │ │ ├── styles_menu_items.xml
│ │ │ │ │ ├── styles_preferences.xml
│ │ │ │ │ ├── styles_profile.xml
│ │ │ │ │ ├── styles_pull_to_tabs.xml
│ │ │ │ │ ├── styles_wizard.xml
│ │ │ │ │ └── themes.xml
│ │ │ │ ├── values-es/
│ │ │ │ │ ├── arrays.xml
│ │ │ │ │ └── strings.xml
│ │ │ │ ├── values-sw400dp/
│ │ │ │ │ ├── dimens.xml
│ │ │ │ │ └── strings.xml
│ │ │ │ ├── values-sw600dp/
│ │ │ │ │ ├── dimens.xml
│ │ │ │ │ └── strings.xml
│ │ │ │ ├── values-v17/
│ │ │ │ │ └── dimens.xml
│ │ │ │ ├── values-v19/
│ │ │ │ │ └── themes.xml
│ │ │ │ ├── values-v21/
│ │ │ │ │ ├── colors.xml
│ │ │ │ │ ├── dimens.xml
│ │ │ │ │ ├── styles_actions.xml
│ │ │ │ │ ├── styles_collections.xml
│ │ │ │ │ ├── styles_fast_scroller.xml
│ │ │ │ │ ├── styles_profile.xml
│ │ │ │ │ └── themes.xml
│ │ │ │ └── xml/
│ │ │ │ ├── preferences_about.xml
│ │ │ │ ├── preferences_analytics.xml
│ │ │ │ ├── preferences_animations.xml
│ │ │ │ ├── preferences_app_drawer.xml
│ │ │ │ ├── preferences_apps_list.xml
│ │ │ │ ├── preferences_dev.xml
│ │ │ │ ├── preferences_devs_headers.xml
│ │ │ │ ├── preferences_headers.xml
│ │ │ │ ├── preferences_lookfeel.xml
│ │ │ │ └── preferences_moments.xml
│ │ │ └── scala/
│ │ │ └── cards/
│ │ │ └── nine/
│ │ │ ├── app/
│ │ │ │ ├── NineCardsApplication.scala
│ │ │ │ ├── commons/
│ │ │ │ │ ├── BroadcastDispatcher.scala
│ │ │ │ │ ├── ContextSupportPreferences.scala
│ │ │ │ │ ├── ContextSupportProvider.scala
│ │ │ │ │ └── Conversions.scala
│ │ │ │ ├── di/
│ │ │ │ │ └── Injector.scala
│ │ │ │ ├── observers/
│ │ │ │ │ ├── NineCardsObserver.scala
│ │ │ │ │ └── ObserverRegister.scala
│ │ │ │ ├── permissions/
│ │ │ │ │ ├── PermissionChecker.scala
│ │ │ │ │ └── PermissionCheckerException.scala
│ │ │ │ ├── receivers/
│ │ │ │ │ ├── apps/
│ │ │ │ │ │ ├── AppBroadcastJobs.scala
│ │ │ │ │ │ └── AppBroadcastReceiver.scala
│ │ │ │ │ ├── bluetooth/
│ │ │ │ │ │ ├── BluetoothJobs.scala
│ │ │ │ │ │ └── BluetoothReceiver.scala
│ │ │ │ │ ├── moments/
│ │ │ │ │ │ ├── ConnectionStatusChangedJobs.scala
│ │ │ │ │ │ └── MomentBroadcastReceiver.scala
│ │ │ │ │ └── shortcuts/
│ │ │ │ │ ├── ShortcutBroadcastJobs.scala
│ │ │ │ │ └── ShortcutBroadcastReceiver.scala
│ │ │ │ ├── services/
│ │ │ │ │ ├── NineCardsFirebaseInstanceIdService.scala
│ │ │ │ │ ├── NineCardsFirebaseJobs.scala
│ │ │ │ │ ├── NineCardsFirebaseMessagingService.scala
│ │ │ │ │ ├── sharedcollections/
│ │ │ │ │ │ ├── UpdateSharedCollectionJobs.scala
│ │ │ │ │ │ ├── UpdateSharedCollectionService.scala
│ │ │ │ │ │ └── UpdateSharedCollectionUiActions.scala
│ │ │ │ │ └── sync/
│ │ │ │ │ ├── SynchronizeDeviceService.scala
│ │ │ │ │ └── SynchronizeDeviceServiceJobs.scala
│ │ │ │ └── ui/
│ │ │ │ ├── applinks/
│ │ │ │ │ ├── AppLinksReceiverActivity.scala
│ │ │ │ │ ├── AppLinksReceiverJobs.scala
│ │ │ │ │ └── AppLinksReceiverUiActions.scala
│ │ │ │ ├── collections/
│ │ │ │ │ ├── CollectionAdapter.scala
│ │ │ │ │ ├── CollectionFragment.scala
│ │ │ │ │ ├── CollectionsDetailsActivity.scala
│ │ │ │ │ ├── CollectionsPagerAdapter.scala
│ │ │ │ │ ├── dialog/
│ │ │ │ │ │ ├── EditCardDialogFragment.scala
│ │ │ │ │ │ └── publishcollection/
│ │ │ │ │ │ ├── PublishCollectionActions.scala
│ │ │ │ │ │ ├── PublishCollectionDOM.scala
│ │ │ │ │ │ ├── PublishCollectionFragment.scala
│ │ │ │ │ │ ├── PublishCollectionJobs.scala
│ │ │ │ │ │ └── PublishCollectionStyles.scala
│ │ │ │ │ ├── jobs/
│ │ │ │ │ │ ├── GroupCollectionsJobs.scala
│ │ │ │ │ │ ├── NavigationJobs.scala
│ │ │ │ │ │ ├── SharedCollectionJobs.scala
│ │ │ │ │ │ ├── SingleCollectionJobs.scala
│ │ │ │ │ │ ├── ToolbarJobs.scala
│ │ │ │ │ │ └── uiactions/
│ │ │ │ │ │ ├── GroupCollectionsDOM.scala
│ │ │ │ │ │ ├── GroupCollectionsUiActions.scala
│ │ │ │ │ │ ├── NavigationUiActions.scala
│ │ │ │ │ │ ├── SharedCollectionUiActions.scala
│ │ │ │ │ │ ├── SingleCollectionDOM.scala
│ │ │ │ │ │ ├── SingleCollectionUiActions.scala
│ │ │ │ │ │ └── ToolbarUiActions.scala
│ │ │ │ │ ├── snails/
│ │ │ │ │ │ └── CollectionsSnails.scala
│ │ │ │ │ └── tasks/
│ │ │ │ │ └── CollectionJobs.scala
│ │ │ │ ├── commons/
│ │ │ │ │ ├── ActivityFindViews.scala
│ │ │ │ │ ├── AppLog.scala
│ │ │ │ │ ├── AsyncImageTweaks.scala
│ │ │ │ │ ├── Commons.scala
│ │ │ │ │ ├── CommonsExcerpt.scala
│ │ │ │ │ ├── CommonsTweak.scala
│ │ │ │ │ ├── Exceptions.scala
│ │ │ │ │ ├── Jobs.scala
│ │ │ │ │ ├── SnailsCommons.scala
│ │ │ │ │ ├── SystemBarsTint.scala
│ │ │ │ │ ├── UiContext.scala
│ │ │ │ │ ├── UiExtensions.scala
│ │ │ │ │ ├── action_filters/
│ │ │ │ │ │ ├── AppsActionFilter.scala
│ │ │ │ │ │ ├── CollectionsActionFilter.scala
│ │ │ │ │ │ ├── MomentsActionFilter.scala
│ │ │ │ │ │ └── SyncActionFilter.scala
│ │ │ │ │ ├── adapters/
│ │ │ │ │ │ ├── apps/
│ │ │ │ │ │ │ ├── AppsAdapter.scala
│ │ │ │ │ │ │ └── AppsSelectionAdapter.scala
│ │ │ │ │ │ ├── contacts/
│ │ │ │ │ │ │ ├── ContactsAdapter.scala
│ │ │ │ │ │ │ └── LastCallsAdapter.scala
│ │ │ │ │ │ ├── search/
│ │ │ │ │ │ │ └── SearchAdapter.scala
│ │ │ │ │ │ └── sharedcollections/
│ │ │ │ │ │ ├── SharedCollectionItem.scala
│ │ │ │ │ │ ├── SharedCollectionsAdapter.scala
│ │ │ │ │ │ └── ViewHolderSharedCollectionsLayoutAdapter.scala
│ │ │ │ │ ├── dialogs/
│ │ │ │ │ │ ├── BaseActionFragment.scala
│ │ │ │ │ │ ├── Styles.scala
│ │ │ │ │ │ ├── addmoment/
│ │ │ │ │ │ │ ├── AddMomentAdapter.scala
│ │ │ │ │ │ │ ├── AddMomentDOM.scala
│ │ │ │ │ │ │ ├── AddMomentFragment.scala
│ │ │ │ │ │ │ ├── AddMomentItemDecoration.scala
│ │ │ │ │ │ │ ├── AddMomentJobs.scala
│ │ │ │ │ │ │ └── AddMomentUiActions.scala
│ │ │ │ │ │ ├── apps/
│ │ │ │ │ │ │ ├── AppsDOM.scala
│ │ │ │ │ │ │ ├── AppsFragment.scala
│ │ │ │ │ │ │ ├── AppsJobs.scala
│ │ │ │ │ │ │ └── AppsUiActions.scala
│ │ │ │ │ │ ├── contacts/
│ │ │ │ │ │ │ ├── ContactsDOM.scala
│ │ │ │ │ │ │ ├── ContactsFragment.scala
│ │ │ │ │ │ │ ├── ContactsJobs.scala
│ │ │ │ │ │ │ ├── ContactsUiActions.scala
│ │ │ │ │ │ │ └── SelectInfoContactDialogFragment.scala
│ │ │ │ │ │ ├── createoreditcollection/
│ │ │ │ │ │ │ ├── ColorDialogFragment.scala
│ │ │ │ │ │ │ ├── CreateOrEditCollectionDOM.scala
│ │ │ │ │ │ │ ├── CreateOrEditCollectionFragment.scala
│ │ │ │ │ │ │ ├── CreateOrEditCollectionJobs.scala
│ │ │ │ │ │ │ ├── CreateOrEditCollectionUiActions.scala
│ │ │ │ │ │ │ └── IconDialogFragment.scala
│ │ │ │ │ │ ├── editmoment/
│ │ │ │ │ │ │ ├── EditMomentDOM.scala
│ │ │ │ │ │ │ ├── EditMomentFragment.scala
│ │ │ │ │ │ │ ├── EditMomentJobs.scala
│ │ │ │ │ │ │ └── EditMomentUiActions.scala
│ │ │ │ │ │ ├── privatecollections/
│ │ │ │ │ │ │ ├── PrivateCollectionsAdapter.scala
│ │ │ │ │ │ │ ├── PrivateCollectionsDOM.scala
│ │ │ │ │ │ │ ├── PrivateCollectionsFragment.scala
│ │ │ │ │ │ │ ├── PrivateCollectionsJobs.scala
│ │ │ │ │ │ │ └── PrivateCollectionsUiActions.scala
│ │ │ │ │ │ ├── publicollections/
│ │ │ │ │ │ │ ├── PublicCollectionsDOM.scala
│ │ │ │ │ │ │ ├── PublicCollectionsFragment.scala
│ │ │ │ │ │ │ ├── PublicCollectionsJobs.scala
│ │ │ │ │ │ │ └── PublicCollectionsUiActions.scala
│ │ │ │ │ │ ├── recommendations/
│ │ │ │ │ │ │ ├── RecommendationsAdapter.scala
│ │ │ │ │ │ │ ├── RecommendationsDOM.scala
│ │ │ │ │ │ │ ├── RecommendationsFragment.scala
│ │ │ │ │ │ │ ├── RecommendationsJobs.scala
│ │ │ │ │ │ │ └── RecommendationsUiActions.scala
│ │ │ │ │ │ ├── shortcuts/
│ │ │ │ │ │ │ ├── ShortcutDialogAdapter.scala
│ │ │ │ │ │ │ ├── ShortcutDialogDOM.scala
│ │ │ │ │ │ │ ├── ShortcutDialogFragment.scala
│ │ │ │ │ │ │ ├── ShortcutDialogJobs.scala
│ │ │ │ │ │ │ └── ShortcutDialogUiActions.scala
│ │ │ │ │ │ ├── widgets/
│ │ │ │ │ │ │ ├── WidgetsAdapter.scala
│ │ │ │ │ │ │ ├── WidgetsDialogDOM.scala
│ │ │ │ │ │ │ ├── WidgetsDialogJobs.scala
│ │ │ │ │ │ │ ├── WidgetsDialogUiActions.scala
│ │ │ │ │ │ │ └── WidgetsFragment.scala
│ │ │ │ │ │ └── wizard/
│ │ │ │ │ │ ├── WizardInlineDOM.scala
│ │ │ │ │ │ ├── WizardInlineFragment.scala
│ │ │ │ │ │ ├── WizardInlinePreferences.scala
│ │ │ │ │ │ ├── WizardInlineType.scala
│ │ │ │ │ │ └── WizardInlineUiActions.scala
│ │ │ │ │ ├── glide/
│ │ │ │ │ │ ├── AppIconLoader.scala
│ │ │ │ │ │ ├── ApplicationIconDecoder.scala
│ │ │ │ │ │ ├── IconFromPackageDecoder.scala
│ │ │ │ │ │ └── IconFromPackageLoader.scala
│ │ │ │ │ ├── google_api/
│ │ │ │ │ │ └── GoogleApiClientProvider.scala
│ │ │ │ │ ├── ops/
│ │ │ │ │ │ ├── CollectionOps.scala
│ │ │ │ │ │ ├── ConditionWeatherOps.scala
│ │ │ │ │ │ ├── DrawableOps.scala
│ │ │ │ │ │ ├── NineCardsCategoryOps.scala
│ │ │ │ │ │ ├── NineCardsMomentOps.scala
│ │ │ │ │ │ ├── ResourcesCollectionDataOps.scala
│ │ │ │ │ │ ├── SharedCollectionOps.scala
│ │ │ │ │ │ ├── SubscriptionOps.scala
│ │ │ │ │ │ ├── TaskServiceOps.scala
│ │ │ │ │ │ ├── TryOps.scala
│ │ │ │ │ │ ├── UiOps.scala
│ │ │ │ │ │ ├── ViewGroupOps.scala
│ │ │ │ │ │ ├── ViewOps.scala
│ │ │ │ │ │ └── WidgetsOps.scala
│ │ │ │ │ ├── states/
│ │ │ │ │ │ └── MomentState.scala
│ │ │ │ │ └── styles/
│ │ │ │ │ ├── CollectionCardsStyles.scala
│ │ │ │ │ └── CommonStyles.scala
│ │ │ │ ├── components/
│ │ │ │ │ ├── adapters/
│ │ │ │ │ │ └── ThemeArrayAdapter.scala
│ │ │ │ │ ├── commons/
│ │ │ │ │ │ ├── PaddingItemDecoration.scala
│ │ │ │ │ │ ├── ReorderItemTouchHelperCallback.scala
│ │ │ │ │ │ ├── SelectedItemDecoration.scala
│ │ │ │ │ │ ├── SwipeController.scala
│ │ │ │ │ │ ├── TranslationAnimator.scala
│ │ │ │ │ │ └── ViewState.scala
│ │ │ │ │ ├── dialogs/
│ │ │ │ │ │ ├── AlertDialogFragment.scala
│ │ │ │ │ │ ├── BluetoothDialogFragment.scala
│ │ │ │ │ │ ├── CollectionDialog.scala
│ │ │ │ │ │ ├── MomentDialog.scala
│ │ │ │ │ │ └── WifiDialogFragment.scala
│ │ │ │ │ ├── drawables/
│ │ │ │ │ │ ├── BackgroundSelectedDrawable.scala
│ │ │ │ │ │ ├── CharDrawable.scala
│ │ │ │ │ │ ├── DottedDrawable.scala
│ │ │ │ │ │ ├── DrawerAnimationBackgroundDrawable.scala
│ │ │ │ │ │ ├── DrawerBackgroundDrawable.scala
│ │ │ │ │ │ ├── DropBackgroundDrawable.scala
│ │ │ │ │ │ ├── EdgeWorkspaceDrawable.scala
│ │ │ │ │ │ ├── PathMorphDrawable.scala
│ │ │ │ │ │ ├── RippleCollectionDrawable.scala
│ │ │ │ │ │ ├── TopBarMomentBackgroundDrawable.scala
│ │ │ │ │ │ ├── TopBarMomentEdgeBackgroundDrawable.scala
│ │ │ │ │ │ └── tweaks/
│ │ │ │ │ │ └── PathMorphDrawableTweaks.scala
│ │ │ │ │ ├── layouts/
│ │ │ │ │ │ ├── AnimatedWorkSpaces.scala
│ │ │ │ │ │ ├── AppsMomentLayout.scala
│ │ │ │ │ │ ├── CollectionActionsPanelLayout.scala
│ │ │ │ │ │ ├── DialogToolbar.scala
│ │ │ │ │ │ ├── DockAppsPanelLayout.scala
│ │ │ │ │ │ ├── EditDeviceMomentLayout.scala
│ │ │ │ │ │ ├── EditHourMomentLayout.scala
│ │ │ │ │ │ ├── FabItemMenu.scala
│ │ │ │ │ │ ├── FastScrollerLayout.scala
│ │ │ │ │ │ ├── LauncherWorkSpaces.scala
│ │ │ │ │ │ ├── PullToCloseView.scala
│ │ │ │ │ │ ├── PullToDownView.scala
│ │ │ │ │ │ ├── PullToTabsView.scala
│ │ │ │ │ │ ├── SearchBoxView.scala
│ │ │ │ │ │ ├── SlidingTabLayout.scala
│ │ │ │ │ │ ├── StepsWorkspaces.scala
│ │ │ │ │ │ ├── TopBarLayout.scala
│ │ │ │ │ │ ├── WizardInlineWorkspaces.scala
│ │ │ │ │ │ ├── WorkSpaceButton.scala
│ │ │ │ │ │ ├── WorkspaceItemMenu.scala
│ │ │ │ │ │ ├── snails/
│ │ │ │ │ │ │ └── LayoutSnails.scala
│ │ │ │ │ │ └── tweaks/
│ │ │ │ │ │ └── LayoutsTweaks.scala
│ │ │ │ │ ├── models/
│ │ │ │ │ │ └── LauncherData.scala
│ │ │ │ │ ├── preferences/
│ │ │ │ │ │ ├── AboutHeaderPreference.scala
│ │ │ │ │ │ └── TeamPreference.scala
│ │ │ │ │ └── widgets/
│ │ │ │ │ ├── CollectionCheckBox.scala
│ │ │ │ │ ├── CollectionRecyclerView.scala
│ │ │ │ │ ├── DrawerRecyclerView.scala
│ │ │ │ │ ├── LauncherNoConfiguredWidgetView.scala
│ │ │ │ │ ├── LauncherWidgetResizeFrame.scala
│ │ │ │ │ ├── LauncherWidgetView.scala
│ │ │ │ │ ├── ScrollingLinearLayoutManager.scala
│ │ │ │ │ ├── TintableButton.scala
│ │ │ │ │ ├── TintableImageView.scala
│ │ │ │ │ ├── WizardCheckBox.scala
│ │ │ │ │ ├── WizardMomentCheckBox.scala
│ │ │ │ │ ├── WizardWifiCheckBox.scala
│ │ │ │ │ └── tweaks/
│ │ │ │ │ └── WidgetsTweaks.scala
│ │ │ │ ├── launcher/
│ │ │ │ │ ├── LauncherActivity.scala
│ │ │ │ │ ├── exceptions/
│ │ │ │ │ │ └── LauncherExceptions.scala
│ │ │ │ │ ├── holders/
│ │ │ │ │ │ ├── LauncherWorkSpaceCollectionsHolder.scala
│ │ │ │ │ │ └── LauncherWorkSpaceMomentsHolder.scala
│ │ │ │ │ ├── jobs/
│ │ │ │ │ │ ├── AppDrawerJobs.scala
│ │ │ │ │ │ ├── DragJobs.scala
│ │ │ │ │ │ ├── LauncherJobs.scala
│ │ │ │ │ │ ├── NavigationJobs.scala
│ │ │ │ │ │ ├── WidgetsJobs.scala
│ │ │ │ │ │ └── uiactions/
│ │ │ │ │ │ ├── AppDrawerUiActions.scala
│ │ │ │ │ │ ├── DockAppsUiActions.scala
│ │ │ │ │ │ ├── DragUiActions.scala
│ │ │ │ │ │ ├── LauncherDOM.scala
│ │ │ │ │ │ ├── LauncherUiActions.scala
│ │ │ │ │ │ ├── MenuDrawersUiActions.scala
│ │ │ │ │ │ ├── NavigationUiActions.scala
│ │ │ │ │ │ ├── TopBarUiActions.scala
│ │ │ │ │ │ ├── WidgetUiActions.scala
│ │ │ │ │ │ └── WorkspaceUiActions.scala
│ │ │ │ │ ├── snails/
│ │ │ │ │ │ ├── DrawerSnails.scala
│ │ │ │ │ │ └── LauncherSnails.scala
│ │ │ │ │ └── types/
│ │ │ │ │ ├── AppDrawerIconShadowBuilder.scala
│ │ │ │ │ ├── CollectionShadowBuilder.scala
│ │ │ │ │ ├── DragLauncherType.scala
│ │ │ │ │ ├── DragObject.scala
│ │ │ │ │ ├── MenuOptions.scala
│ │ │ │ │ └── WidgetShadowBuilder.scala
│ │ │ │ ├── preferences/
│ │ │ │ │ ├── NineCardsPreferencesActivity.scala
│ │ │ │ │ ├── PreferencesJobs.scala
│ │ │ │ │ ├── PreferencesUiActions.scala
│ │ │ │ │ ├── about/
│ │ │ │ │ │ └── AboutFragment.scala
│ │ │ │ │ ├── analytics/
│ │ │ │ │ │ └── AnalyticsFragment.scala
│ │ │ │ │ ├── animations/
│ │ │ │ │ │ └── AnimationsFragment.scala
│ │ │ │ │ ├── appdrawer/
│ │ │ │ │ │ ├── AppDrawerFragment.scala
│ │ │ │ │ │ ├── AppDrawerJobs.scala
│ │ │ │ │ │ └── AppDrawerUiActions.scala
│ │ │ │ │ ├── commons/
│ │ │ │ │ │ ├── FindPreferences.scala
│ │ │ │ │ │ ├── NineCardsPreferences.scala
│ │ │ │ │ │ ├── NineCardsPreferencesValues.scala
│ │ │ │ │ │ └── PreferenceChangeListenerFragment.scala
│ │ │ │ │ ├── developers/
│ │ │ │ │ │ ├── AppsListFragment.scala
│ │ │ │ │ │ ├── AppsListJobs.scala
│ │ │ │ │ │ ├── AppsListUiActions.scala
│ │ │ │ │ │ ├── DeveloperFragment.scala
│ │ │ │ │ │ ├── DeveloperJobs.scala
│ │ │ │ │ │ └── DeveloperUiActions.scala
│ │ │ │ │ ├── lookandfeel/
│ │ │ │ │ │ └── LookFeelFragment.scala
│ │ │ │ │ └── moments/
│ │ │ │ │ └── MomentsFragment.scala
│ │ │ │ ├── profile/
│ │ │ │ │ ├── ProfileActivity.scala
│ │ │ │ │ ├── adapters/
│ │ │ │ │ │ ├── AccountsAdapter.scala
│ │ │ │ │ │ ├── EmptyProfileAdapter.scala
│ │ │ │ │ │ └── SubscriptionsAdapter.scala
│ │ │ │ │ ├── dialog/
│ │ │ │ │ │ ├── EditAccountDeviceDialogFragment.scala
│ │ │ │ │ │ └── RemoveAccountDeviceDialogFragment.scala
│ │ │ │ │ ├── jobs/
│ │ │ │ │ │ ├── ProfileDOM.scala
│ │ │ │ │ │ ├── ProfileJobs.scala
│ │ │ │ │ │ └── ProfileUiActions.scala
│ │ │ │ │ └── models/
│ │ │ │ │ └── Model.scala
│ │ │ │ ├── share/
│ │ │ │ │ ├── SharedContentActivity.scala
│ │ │ │ │ ├── SharedContentJobs.scala
│ │ │ │ │ ├── SharedContentUiActions.scala
│ │ │ │ │ └── models/
│ │ │ │ │ └── Models.scala
│ │ │ │ └── wizard/
│ │ │ │ ├── WizardActivity.scala
│ │ │ │ ├── WizardExceptions.scala
│ │ │ │ ├── jobs/
│ │ │ │ │ ├── LoadConfigurationJobs.scala
│ │ │ │ │ ├── NewConfigurationJobs.scala
│ │ │ │ │ ├── WizardJobs.scala
│ │ │ │ │ └── uiactions/
│ │ │ │ │ ├── NewConfigurationUiActions.scala
│ │ │ │ │ ├── VisibilityUiActions.scala
│ │ │ │ │ ├── WizardDOM.scala
│ │ │ │ │ └── WizardUiActions.scala
│ │ │ │ └── models/
│ │ │ │ └── Models.scala
│ │ │ ├── process/
│ │ │ │ ├── cloud/
│ │ │ │ │ ├── CloudStorageProcess.scala
│ │ │ │ │ ├── Conversions.scala
│ │ │ │ │ ├── Exceptions.scala
│ │ │ │ │ ├── impl/
│ │ │ │ │ │ └── CloudStorageProcessImpl.scala
│ │ │ │ │ └── models/
│ │ │ │ │ └── CloudStorageImplicits.scala
│ │ │ │ ├── commons/
│ │ │ │ │ └── Models.scala
│ │ │ │ ├── social/
│ │ │ │ │ ├── Exceptions.scala
│ │ │ │ │ ├── SocialProfileProcess.scala
│ │ │ │ │ └── impl/
│ │ │ │ │ └── SocialProfileProcessImpl.scala
│ │ │ │ └── thirdparty/
│ │ │ │ ├── Exceptions.scala
│ │ │ │ └── ExternalServicesProcess.scala
│ │ │ └── services/
│ │ │ ├── analytics/
│ │ │ │ └── impl/
│ │ │ │ └── AnalyticsTrackServices.scala
│ │ │ ├── awareness/
│ │ │ │ └── impl/
│ │ │ │ ├── GoogleAwarenessServicesImpl.scala
│ │ │ │ └── Models.scala
│ │ │ ├── drive/
│ │ │ │ ├── Conversions.scala
│ │ │ │ ├── DriveServices.scala
│ │ │ │ ├── Exceptions.scala
│ │ │ │ ├── impl/
│ │ │ │ │ └── DriveServicesImpl.scala
│ │ │ │ └── models/
│ │ │ │ └── DriveServicesModels.scala
│ │ │ ├── permissions/
│ │ │ │ └── impl/
│ │ │ │ └── AndroidSupportPermissionsServices.scala
│ │ │ └── plus/
│ │ │ ├── Exceptions.scala
│ │ │ ├── GooglePlusServices.scala
│ │ │ ├── impl/
│ │ │ │ └── GooglePlusServicesImpl.scala
│ │ │ └── models/
│ │ │ └── Model.scala
│ │ └── test/
│ │ └── scala/
│ │ └── cards/
│ │ └── nine/
│ │ ├── app/
│ │ │ ├── observers/
│ │ │ │ └── ObserverRegisterSpecification.scala
│ │ │ ├── receivers/
│ │ │ │ └── bluetooth/
│ │ │ │ ├── BluetoothContextSupport.scala
│ │ │ │ └── BluetoothJobsSpecification.scala
│ │ │ └── ui/
│ │ │ ├── applinks/
│ │ │ │ └── AppLinksReceiverJobsSpec.scala
│ │ │ ├── collections/
│ │ │ │ └── jobs/
│ │ │ │ ├── GroupCollectionsJobsSpecification.scala
│ │ │ │ ├── NavigationJobsSpecification.scala
│ │ │ │ ├── ShareCollectionJobsSpecification.scala
│ │ │ │ ├── SingleCollectionJobsSpecification.scala
│ │ │ │ └── ToolbarJobsSpecification.scala
│ │ │ ├── commons/
│ │ │ │ ├── JobsSpec.scala
│ │ │ │ └── dialogs/
│ │ │ │ ├── addMoment/
│ │ │ │ │ └── AddMomentJobsSpec.scala
│ │ │ │ ├── apps/
│ │ │ │ │ └── AppsJobsSpec.scala
│ │ │ │ ├── contacts/
│ │ │ │ │ └── ContactsJobsSpec.scala
│ │ │ │ ├── editmoment/
│ │ │ │ │ └── EditMomentJobsSpec.scala
│ │ │ │ ├── privatecollections/
│ │ │ │ │ └── PrivateCollectionsJobsSpec.scala
│ │ │ │ ├── publicCollections/
│ │ │ │ │ └── PublicCollectionsJobsJobsSpec.scala
│ │ │ │ ├── recommendations/
│ │ │ │ │ └── RecommendationsJobsSpec.scala
│ │ │ │ ├── shortcuts/
│ │ │ │ │ └── ShortcutJobsSpec.scala
│ │ │ │ └── widgets/
│ │ │ │ └── WidgetsDialogJobsSpec.scala
│ │ │ ├── data/
│ │ │ │ └── IterableData.scala
│ │ │ ├── launcher/
│ │ │ │ └── jobs/
│ │ │ │ ├── AppDrawerJobsSpecification.scala
│ │ │ │ ├── DragJobsSpecification.scala
│ │ │ │ ├── LauncherJobsSpecification.scala
│ │ │ │ ├── LauncherTestData.scala
│ │ │ │ ├── NavigationJobsSpecification.scala
│ │ │ │ └── WidgetJobsSpecification.scala
│ │ │ ├── profile/
│ │ │ │ └── jobs/
│ │ │ │ └── ProfileJobsSpec.scala
│ │ │ └── wizard/
│ │ │ └── jobs/
│ │ │ ├── LoadConfigurationJobsSpec.scala
│ │ │ ├── NewConfigurationJobsSpecification.scala
│ │ │ └── WizardJobsSpecification.scala
│ │ └── process/
│ │ ├── cloud/
│ │ │ └── impl/
│ │ │ ├── CloudStorageProcessImplData.scala
│ │ │ └── CloudStorageProcessImplSpecification.scala
│ │ └── social/
│ │ └── impl/
│ │ ├── SocialProfileProcessImplData.scala
│ │ └── SocialProfileProcessImplSpecification.scala
│ ├── commons/
│ │ ├── build.sbt
│ │ └── src/
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── scala/
│ │ │ └── cards/
│ │ │ └── nine/
│ │ │ └── commons/
│ │ │ ├── CatchAll.scala
│ │ │ ├── NineCardExtensions.scala
│ │ │ ├── contentresolver/
│ │ │ │ ├── ContentResolverWrapper.scala
│ │ │ │ ├── Conversions.scala
│ │ │ │ ├── NotificationUri.scala
│ │ │ │ └── UriCreator.scala
│ │ │ ├── contexts/
│ │ │ │ └── ContextSupport.scala
│ │ │ ├── ops/
│ │ │ │ ├── ColorOps.scala
│ │ │ │ └── SeqOps.scala
│ │ │ ├── package.scala
│ │ │ ├── services/
│ │ │ │ └── package.scala
│ │ │ └── utils/
│ │ │ ├── Exceptions.scala
│ │ │ ├── FileUtils.scala
│ │ │ ├── StreamWrapper.scala
│ │ │ └── impl/
│ │ │ └── StreamWrapperImpl.scala
│ │ └── test/
│ │ └── scala/
│ │ └── cards/
│ │ └── nine/
│ │ └── commons/
│ │ └── utils/
│ │ ├── FileUtilsData.scala
│ │ ├── FileUtilsSpec.scala
│ │ └── impl/
│ │ └── StreamWrapperImplSpec.scala
│ ├── commons-tests/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── cards/
│ │ └── nine/
│ │ └── commons/
│ │ └── test/
│ │ ├── TaskServiceTestOps.scala
│ │ ├── data/
│ │ │ ├── ApiTestData.scala
│ │ │ ├── ApiV1TestData.scala
│ │ │ ├── AppWidgetTestData.scala
│ │ │ ├── ApplicationTestData.scala
│ │ │ ├── CardTestData.scala
│ │ │ ├── CloudStorageTestData.scala
│ │ │ ├── CollectionTestData.scala
│ │ │ ├── Constants.scala
│ │ │ ├── DeviceTestData.scala
│ │ │ ├── DockAppTestData.scala
│ │ │ ├── LauncherExecutorTestData.scala
│ │ │ ├── MomentTestData.scala
│ │ │ ├── SharedCollectionTestData.scala
│ │ │ ├── UserTestData.scala
│ │ │ ├── WidgetTestData.scala
│ │ │ └── trackevent/
│ │ │ ├── AppDrawerTrackEventTestData.scala
│ │ │ ├── CollectionDetailTrackEventTestData.scala
│ │ │ ├── HomeTrackEventTestData.scala
│ │ │ ├── LauncherTrackEventTestData.scala
│ │ │ ├── MomentsTrackEventTestData.scala
│ │ │ ├── ProfileTrackEventTestData.scala
│ │ │ ├── SliderMenuTrackEventTestData.scala
│ │ │ ├── WidgetTrackEventTestData.scala
│ │ │ └── WizardTrackEventTestData.scala
│ │ └── repository/
│ │ └── MockCursor.scala
│ ├── docs/
│ │ └── src/
│ │ └── main/
│ │ ├── resources/
│ │ │ └── microsite/
│ │ │ ├── css/
│ │ │ │ └── custom.css
│ │ │ ├── data/
│ │ │ │ └── menu.yml
│ │ │ ├── img/
│ │ │ │ ├── gallery1.webm
│ │ │ │ ├── gallery2.webm
│ │ │ │ └── gallery3.webm
│ │ │ ├── includes/
│ │ │ │ ├── ninecards-footer.html
│ │ │ │ └── ninecards-header.html
│ │ │ └── layouts/
│ │ │ └── ninecards-home.html
│ │ └── tut/
│ │ ├── CNAME
│ │ ├── docs/
│ │ │ ├── Client.md
│ │ │ ├── Libraries.md
│ │ │ ├── Server.md
│ │ │ ├── client/
│ │ │ │ ├── Architecture.md
│ │ │ │ ├── CloudStorage.md
│ │ │ │ ├── Database.md
│ │ │ │ └── Installation.md
│ │ │ ├── index.md
│ │ │ └── server/
│ │ │ ├── Architecture.md
│ │ │ ├── Authentication.md
│ │ │ ├── Cache.md
│ │ │ ├── Ednpoints.md
│ │ │ └── Installation.md
│ │ └── index.md
│ ├── mock-android/
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── android/
│ │ ├── accounts/
│ │ │ ├── Account.java
│ │ │ ├── AccountManager.java
│ │ │ ├── AccountsException.java
│ │ │ └── OperationCanceledException.java
│ │ ├── app/
│ │ │ └── Activity.java
│ │ ├── content/
│ │ │ ├── ComponentName.java
│ │ │ ├── ContentResolver.java
│ │ │ ├── Intent.java
│ │ │ └── res/
│ │ │ └── AssetManager.java
│ │ ├── database/
│ │ │ └── ContentObserver.java
│ │ ├── graphics/
│ │ │ ├── Bitmap.java
│ │ │ ├── Color.java
│ │ │ ├── Rect.java
│ │ │ └── drawable/
│ │ │ └── Drawable.java
│ │ ├── media/
│ │ │ └── ThumbnailUtils.java
│ │ ├── net/
│ │ │ └── wifi/
│ │ │ └── WifiConfiguration.java
│ │ ├── os/
│ │ │ ├── Bundle.java
│ │ │ ├── Handler.java
│ │ │ └── Looper.java
│ │ ├── util/
│ │ │ └── Log.java
│ │ └── view/
│ │ ├── SearchEvent.java
│ │ └── View.java
│ ├── models/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── cards/
│ │ └── nine/
│ │ └── models/
│ │ ├── Api.scala
│ │ ├── ApiV1.scala
│ │ ├── Application.scala
│ │ ├── Awareness.scala
│ │ ├── BitmapPath.scala
│ │ ├── Call.scala
│ │ ├── Card.scala
│ │ ├── CloudStorage.scala
│ │ ├── Collection.scala
│ │ ├── CollectionProcessConfig.scala
│ │ ├── Contact.scala
│ │ ├── Conversions.scala
│ │ ├── DockApp.scala
│ │ ├── IconResize.scala
│ │ ├── Intent.scala
│ │ ├── IterableCursor.scala
│ │ ├── Iterables.scala
│ │ ├── LauncherExecutorProcessConfig.scala
│ │ ├── Moment.scala
│ │ ├── NineCardsBluetoothDevice.scala
│ │ ├── NineCardsIntent.scala
│ │ ├── NineCardsIntentConversions.scala
│ │ ├── Rank.scala
│ │ ├── SharedCollection.scala
│ │ ├── ShortCut.scala
│ │ ├── TermCounter.scala
│ │ ├── Theme.scala
│ │ ├── TrackEvent.scala
│ │ ├── User.scala
│ │ ├── Widget.scala
│ │ ├── package.scala
│ │ ├── reads/
│ │ │ └── MomentImplicits.scala
│ │ └── types/
│ │ ├── Action.scala
│ │ ├── AppPermission.scala
│ │ ├── AwarenessFenceUpdate.scala
│ │ ├── BluetoothType.scala
│ │ ├── CallType.scala
│ │ ├── CardType.scala
│ │ ├── Category.scala
│ │ ├── CollectionType.scala
│ │ ├── ConditionWeather.scala
│ │ ├── ContactsFilter.scala
│ │ ├── DialogToolbarType.scala
│ │ ├── DockType.scala
│ │ ├── EmailCategory.scala
│ │ ├── FetchAppOrder.scala
│ │ ├── GetAppOrder.scala
│ │ ├── KindActivity.scala
│ │ ├── Label.scala
│ │ ├── NineCardsCategory.scala
│ │ ├── NineCardsMoment.scala
│ │ ├── Permission.scala
│ │ ├── PhoneCategory.scala
│ │ ├── PublicCollectionStatus.scala
│ │ ├── Screen.scala
│ │ ├── TypeSharedCollection.scala
│ │ ├── Value.scala
│ │ ├── WidgetResizeMode.scala
│ │ ├── WidgetType.scala
│ │ ├── json/
│ │ │ ├── CollectionTypeImplicits.scala
│ │ │ ├── DockTypeImplicits.scala
│ │ │ ├── NineCardCategoryImplicits.scala
│ │ │ ├── NineCardsMomentImplicits.scala
│ │ │ └── WidgetTypeImplicits.scala
│ │ └── theme/
│ │ ├── ThemeStyleType.scala
│ │ └── ThemeType.scala
│ ├── process/
│ │ ├── build.sbt
│ │ └── src/
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── assets/
│ │ │ │ ├── theme_dark.json
│ │ │ │ └── theme_light.json
│ │ │ └── scala/
│ │ │ └── cards/
│ │ │ └── nine/
│ │ │ └── process/
│ │ │ ├── accounts/
│ │ │ │ ├── Exceptions.scala
│ │ │ │ ├── UserAccountsProcess.scala
│ │ │ │ └── impl/
│ │ │ │ └── UserAccountsProcessImpl.scala
│ │ │ ├── collection/
│ │ │ │ ├── CollectionProcess.scala
│ │ │ │ ├── CollectionsExceptions.scala
│ │ │ │ └── impl/
│ │ │ │ ├── CardsProcessImpl.scala
│ │ │ │ ├── CollectionProcessDependencies.scala
│ │ │ │ ├── CollectionProcessImpl.scala
│ │ │ │ └── CollectionsProcessImpl.scala
│ │ │ ├── device/
│ │ │ │ ├── DeviceExceptions.scala
│ │ │ │ ├── DeviceProcess.scala
│ │ │ │ └── impl/
│ │ │ │ ├── AppsDeviceProcessImpl.scala
│ │ │ │ ├── ContactsDeviceProcessImpl.scala
│ │ │ │ ├── DeviceProcessDependencies.scala
│ │ │ │ ├── DeviceProcessImpl.scala
│ │ │ │ ├── DockAppsDeviceProcessImpl.scala
│ │ │ │ ├── LastCallsDeviceProcessImpl.scala
│ │ │ │ ├── ResetProcessImpl.scala
│ │ │ │ ├── ShortcutsDeviceProcessImpl.scala
│ │ │ │ └── WidgetsDeviceProcessImpl.scala
│ │ │ ├── intents/
│ │ │ │ ├── Exceptions.scala
│ │ │ │ ├── LauncherExecutorProcess.scala
│ │ │ │ └── impl/
│ │ │ │ └── LauncherExecutorProcessImpl.scala
│ │ │ ├── moment/
│ │ │ │ ├── MomentException.scala
│ │ │ │ ├── MomentProcess.scala
│ │ │ │ └── impl/
│ │ │ │ └── MomentProcessImpl.scala
│ │ │ ├── recognition/
│ │ │ │ ├── Exceptions.scala
│ │ │ │ ├── RecognitionProcess.scala
│ │ │ │ └── impl/
│ │ │ │ └── RecognitionProcessImpl.scala
│ │ │ ├── recommendations/
│ │ │ │ ├── RecommendationsExceptions.scala
│ │ │ │ ├── RecommendationsProcess.scala
│ │ │ │ └── impl/
│ │ │ │ └── RecommendationsProcessImpl.scala
│ │ │ ├── sharedcollections/
│ │ │ │ ├── Exceptions.scala
│ │ │ │ ├── SharedCollectionsProcess.scala
│ │ │ │ └── impl/
│ │ │ │ └── SharedCollectionsProcessImpl.scala
│ │ │ ├── theme/
│ │ │ │ ├── ThemeExceptions.scala
│ │ │ │ ├── ThemeProcess.scala
│ │ │ │ └── impl/
│ │ │ │ └── ThemeProcessImpl.scala
│ │ │ ├── trackevent/
│ │ │ │ ├── Exceptions.scala
│ │ │ │ ├── TrackEventProcess.scala
│ │ │ │ └── impl/
│ │ │ │ ├── AppDrawerEventProcessImpl.scala
│ │ │ │ ├── CollectionDetailTrackEventProcessImpl.scala
│ │ │ │ ├── HomeTrackEventProcessImpl.scala
│ │ │ │ ├── LauncherTrackEventProcessImpl.scala
│ │ │ │ ├── MomentsTrackEventProcessImpl.scala
│ │ │ │ ├── ProfileTrackEventProcessImpl.scala
│ │ │ │ ├── SliderMenuTrackEventProcessImpl.scala
│ │ │ │ ├── TrackEventDependencies.scala
│ │ │ │ ├── TrackEventProcessImpl.scala
│ │ │ │ ├── WidgetTrackEventProcessImpl.scala
│ │ │ │ └── WizardTrackEventProcessImpl.scala
│ │ │ ├── user/
│ │ │ │ ├── UserExceptions.scala
│ │ │ │ ├── UserProcess.scala
│ │ │ │ └── impl/
│ │ │ │ └── UserProcessImpl.scala
│ │ │ ├── userv1/
│ │ │ │ ├── UserV1Exceptions.scala
│ │ │ │ ├── UserV1Process.scala
│ │ │ │ └── impl/
│ │ │ │ └── UserV1ProcessImpl.scala
│ │ │ ├── utils/
│ │ │ │ └── ApiUtils.scala
│ │ │ └── widget/
│ │ │ ├── AppWidgetException.scala
│ │ │ ├── WidgetProcess.scala
│ │ │ └── impl/
│ │ │ └── WidgetProcessImpl.scala
│ │ └── test/
│ │ └── scala/
│ │ └── cards/
│ │ └── nine/
│ │ └── process/
│ │ ├── accounts/
│ │ │ └── impl/
│ │ │ ├── UserAccountsProcessImplData.scala
│ │ │ └── UserAccountsProcessImplSpecification.scala
│ │ ├── collection/
│ │ │ └── impl/
│ │ │ └── CollectionProcessImplSpec.scala
│ │ ├── device/
│ │ │ └── impl/
│ │ │ ├── DeviceProcessData.scala
│ │ │ └── DeviceProcessImplSpec.scala
│ │ ├── intents/
│ │ │ └── impl/
│ │ │ └── LauncherExecutorProcessImplSpec.scala
│ │ ├── moment/
│ │ │ └── impl/
│ │ │ ├── MomentProcessImplData.scala
│ │ │ └── MomentProcessImplSpec.scala
│ │ ├── recognition/
│ │ │ └── impl/
│ │ │ ├── RecognitionProcessData.scala
│ │ │ └── RecognitionProcessImplSpec.scala
│ │ ├── recommendations/
│ │ │ └── impl/
│ │ │ └── RecommendationsProcessSpec.scala
│ │ ├── sharedcollections/
│ │ │ └── impl/
│ │ │ └── SharedCollectionsProcessImplSpec.scala
│ │ ├── theme/
│ │ │ └── impl/
│ │ │ ├── ThemeProcessData.scala
│ │ │ └── ThemeProcessImplSpec.scala
│ │ ├── trackevent/
│ │ │ └── impl/
│ │ │ ├── AppDrawerTrackEventProcessImplSpec.scala
│ │ │ ├── CollectionDetailTrackEventProcessImplSpec.scala
│ │ │ ├── HomeTrackEventProcessImplSpec.scala
│ │ │ ├── LauncherTrackEventProcessImplSpec.scala
│ │ │ ├── MomentsTrackEventProcessImplSpec.scala
│ │ │ ├── ProfileTrackEventProcessImplSpec.scala
│ │ │ ├── SliderMenuTrackEventProcessImplSpec.scala
│ │ │ ├── WidgetTrackEventProcessImplSpec.scala
│ │ │ └── WizardTrackEventProcessImplSpec.scala
│ │ ├── user/
│ │ │ └── impl/
│ │ │ └── UserProcessImplSpec.scala
│ │ ├── userv1/
│ │ │ └── impl/
│ │ │ └── UserV1ProcessImplSpec.scala
│ │ ├── utils/
│ │ │ └── ApiUtilsSpec.scala
│ │ └── widget/
│ │ └── impl/
│ │ └── WidgetProcessImplSpec.scala
│ ├── repository/
│ │ ├── build.sbt
│ │ └── src/
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── scala/
│ │ │ └── cards/
│ │ │ └── nine/
│ │ │ └── repository/
│ │ │ ├── Conversions.scala
│ │ │ ├── Exceptions.scala
│ │ │ ├── model/
│ │ │ │ └── Model.scala
│ │ │ ├── provider/
│ │ │ │ ├── AppEntity.scala
│ │ │ │ ├── CardEntity.scala
│ │ │ │ ├── CollectionEntity.scala
│ │ │ │ ├── DockAppEntity.scala
│ │ │ │ ├── MomentEntity.scala
│ │ │ │ ├── NineCardsContentProvider.scala
│ │ │ │ ├── NineCardsSqlHelper.scala
│ │ │ │ ├── NineCardsUri.scala
│ │ │ │ ├── UserEntity.scala
│ │ │ │ └── WidgetEntity.scala
│ │ │ └── repositories/
│ │ │ ├── AppRepository.scala
│ │ │ ├── CardRepository.scala
│ │ │ ├── CollectionRepository.scala
│ │ │ ├── DockAppRepository.scala
│ │ │ ├── MomentRepository.scala
│ │ │ ├── RepositoryUtils.scala
│ │ │ ├── UserRepository.scala
│ │ │ └── WidgetRepository.scala
│ │ └── test/
│ │ └── scala/
│ │ └── cards/
│ │ └── nine/
│ │ └── repository/
│ │ ├── app/
│ │ │ ├── AppRepositorySpec.scala
│ │ │ └── AppRepositoryTestData.scala
│ │ ├── card/
│ │ │ ├── CardRepositorySpec.scala
│ │ │ └── CardRepositoryTestData.scala
│ │ ├── collection/
│ │ │ ├── CollectionRepositorySpec.scala
│ │ │ └── CollectionRepositoryTestData.scala
│ │ ├── dockapp/
│ │ │ ├── DockAppRepositorySpec.scala
│ │ │ └── DockAppRepositoryTestData.scala
│ │ ├── moment/
│ │ │ ├── MomentRepositorySpec.scala
│ │ │ └── MomentRepositoryTestData.scala
│ │ ├── user/
│ │ │ ├── UserRepositorySpec.scala
│ │ │ └── UserRepositoryTestData.scala
│ │ └── widget/
│ │ ├── WidgetRepositorySpec.scala
│ │ └── WidgetRepositoryTestData.scala
│ └── services/
│ ├── build.sbt
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── cards/
│ │ │ └── nine/
│ │ │ └── services/
│ │ │ └── contacts/
│ │ │ └── Fields.java
│ │ └── scala/
│ │ └── cards/
│ │ └── nine/
│ │ └── services/
│ │ ├── api/
│ │ │ ├── ApiServices.scala
│ │ │ ├── Conversions.scala
│ │ │ ├── Exceptions.scala
│ │ │ └── impl/
│ │ │ └── ApiServicesImpl.scala
│ │ ├── apps/
│ │ │ ├── AppsServices.scala
│ │ │ ├── Exceptions.scala
│ │ │ └── impl/
│ │ │ └── AppsServicesImpl.scala
│ │ ├── awareness/
│ │ │ ├── AwarenessServices.scala
│ │ │ └── Exceptions.scala
│ │ ├── calls/
│ │ │ ├── CallsContentProvider.scala
│ │ │ ├── CallsServices.scala
│ │ │ ├── Exceptions.scala
│ │ │ └── impl/
│ │ │ └── CallsServicesImpl.scala
│ │ ├── connectivity/
│ │ │ ├── ConnectivityServices.scala
│ │ │ ├── Exceptions.scala
│ │ │ └── impl/
│ │ │ └── ConnectivityServicesImpl.scala
│ │ ├── contacts/
│ │ │ ├── ContactsContentProvider.scala
│ │ │ ├── ContactsServices.scala
│ │ │ ├── Exceptions.scala
│ │ │ └── impl/
│ │ │ └── ContactsServicesImpl.scala
│ │ ├── image/
│ │ │ ├── Exceptions.scala
│ │ │ ├── ImageServices.scala
│ │ │ └── impl/
│ │ │ ├── ImageServicesImpl.scala
│ │ │ └── ImageServicesTasks.scala
│ │ ├── intents/
│ │ │ ├── Exceptions.scala
│ │ │ ├── LauncherIntentServices.scala
│ │ │ └── impl/
│ │ │ ├── IntentCreator.scala
│ │ │ └── LauncherIntentServicesImpl.scala
│ │ ├── permissions/
│ │ │ ├── Exceptions.scala
│ │ │ └── PermissionsServices.scala
│ │ ├── persistence/
│ │ │ ├── Exceptions.scala
│ │ │ ├── PersistenceServices.scala
│ │ │ ├── conversions/
│ │ │ │ ├── AppConversions.scala
│ │ │ │ ├── CardConversions.scala
│ │ │ │ ├── CollectionConversions.scala
│ │ │ │ ├── Conversions.scala
│ │ │ │ ├── DockAppConversions.scala
│ │ │ │ ├── MomentConversions.scala
│ │ │ │ ├── UserConversions.scala
│ │ │ │ └── WidgetConversions.scala
│ │ │ └── impl/
│ │ │ ├── AndroidPersistenceServicesImpl.scala
│ │ │ ├── AppPersistenceServicesImpl.scala
│ │ │ ├── CardPersistenceServicesImpl.scala
│ │ │ ├── CollectionPersistenceServicesImpl.scala
│ │ │ ├── DockAppPersistenceServicesImpl.scala
│ │ │ ├── MomentPersistenceServicesImpl.scala
│ │ │ ├── PersistenceDependencies.scala
│ │ │ ├── PersistenceServicesImpl.scala
│ │ │ ├── UserPersistenceServicesImpl.scala
│ │ │ └── WidgetPersistenceServicesImpl.scala
│ │ ├── shortcuts/
│ │ │ ├── Exceptions.scala
│ │ │ ├── ShortCutsServices.scala
│ │ │ └── impl/
│ │ │ └── ShortCutsServicesImpl.scala
│ │ ├── track/
│ │ │ ├── Exceptions.scala
│ │ │ ├── TrackServices.scala
│ │ │ └── impl/
│ │ │ ├── ConsoleTrackServices.scala
│ │ │ └── DisableTrackServices.scala
│ │ ├── utils/
│ │ │ └── ResourceUtils.scala
│ │ └── widgets/
│ │ ├── Exceptions.scala
│ │ ├── WidgetsServices.scala
│ │ ├── impl/
│ │ │ └── WidgetsServicesImpl.scala
│ │ └── utils/
│ │ ├── AppWidgetManagerCompat.scala
│ │ └── impl/
│ │ ├── AppWidgetManagerImplDefault.scala
│ │ └── AppWidgetManagerImplLollipop.scala
│ └── test/
│ └── scala/
│ └── cards/
│ └── nine/
│ └── services/
│ ├── api/
│ │ └── impl/
│ │ ├── ApiServicesImplData.scala
│ │ └── ApiServicesImplSpec.scala
│ ├── apps/
│ │ └── impl/
│ │ ├── AppsServicesImplData.scala
│ │ └── AppsServicesImplSpec.scala
│ ├── calls/
│ │ └── impl/
│ │ ├── CallsServicesImplData.scala
│ │ └── CallsServicesImplSpec.scala
│ ├── connectivity/
│ │ └── impl/
│ │ ├── ConnectivityServicesImplData.scala
│ │ └── ConnectivityServicesImplSpec.scala
│ ├── contacts/
│ │ └── impl/
│ │ ├── ContactsServicesImplData.scala
│ │ └── ContactsServicesImplSpec.scala
│ ├── image/
│ │ └── impl/
│ │ ├── ImageServicesImplData.scala
│ │ ├── ImageServicesImplSpec.scala
│ │ └── ImageServicesTasksSpec.scala
│ ├── intents/
│ │ └── impl/
│ │ ├── LauncherIntentServicesImplData.scala
│ │ └── LauncherIntentServicesImplSpec.scala
│ ├── persistence/
│ │ ├── data/
│ │ │ ├── AppPersistenceServicesData.scala
│ │ │ ├── CardPersistenceServicesData.scala
│ │ │ ├── CollectionPersistenceServicesData.scala
│ │ │ ├── DockAppPersistenceServicesData.scala
│ │ │ ├── MomentPersistenceServicesData.scala
│ │ │ ├── UserPersistenceServicesData.scala
│ │ │ └── WidgetPersistenceServicesData.scala
│ │ └── impl/
│ │ ├── AppPersistenceServicesImplSpec.scala
│ │ ├── CardPersistenceServicesImplSpec.scala
│ │ ├── CollectionPersistenceServicesImplSpec.scala
│ │ ├── DockAppPersistenceServicesImplSpec.scala
│ │ ├── MomentPersistenceServicesImplSpec.scala
│ │ ├── RepositoryServicesScope.scala
│ │ ├── UserPersistenceServicesImplSpec.scala
│ │ └── WidgetPersistenceServicesImplSpec.scala
│ ├── shortcuts/
│ │ └── impl/
│ │ ├── ShortCutsServicesImplData.scala
│ │ └── ShortCutsServicesImplSpec.scala
│ ├── utils/
│ │ ├── ResourceUtilsData.scala
│ │ └── ResourceUtilsSpec.scala
│ └── widgets/
│ └── impl/
│ ├── WidgetsServicesImplData.scala
│ ├── WidgetsServicesImplSpec.scala
│ └── utils/
│ └── impl/
│ ├── AppWidgetManagerData.scala
│ └── AppWidgetManagerImplDefaultSpec.scala
├── ninecards.debug.keystore
├── ninecards.properties.default
├── project/
│ ├── AppBuild.scala
│ ├── Crashlytics.scala
│ ├── Libraries.scala
│ ├── Proguard.scala
│ ├── ReplacePropertiesGenerator.scala
│ ├── S3.scala
│ ├── Settings.scala
│ ├── Versions.scala
│ ├── build.properties
│ ├── plugins.sbt
│ └── proguard.sbt
├── scripts/
│ ├── decrypt-keys.sh
│ └── publishMicrosite.sh
└── travis-deploy-key.enc
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
logs
target
tmp
.history
dist
/out
/RUNNING_PID
/.ivy*
# Keys
/debug.properties
/ninecards.properties
/debug.keystore
/local.properties
/modules/app/local.properties
# Crashlytics
/modules/app/crashlytics/fabric.properties
/modules/app/crashlytics/CrashlyticsManifest.xml
/modules/app/src/main/assets/crashlytics-build.properties
/modules/app/src/main/res/values/com_crashlytics_export_strings.xml
# sbt specific
/.sbt
.cache/
.history/
.lib/
dist/*
target/
lib_managed/
src_managed/
project/boot/
project/plugins/project/
project/project
project/target
/.activator
fabric.properties
# Scala-IDE specific
.scala_dependencies
.worksheet
#Eclipse specific
.classpath
.project
.cache
.settings/
#IntelliJ IDEA specific
.idea/
/.idea_modules
/.idea
/*.iml
#Proguard
proguard-sbt.txt
#Gen
modules/api/gen/
modules/repository/gen/
#Keys
travis-deploy-key
travis-deploy-key.pub
================================================
FILE: .scalafmt.conf
================================================
style = defaultWithAlign
maxColumn = 100
continuationIndent.callSite = 2
newlines {
sometimesBeforeColonInMethodReturnType = false
}
align {
arrowEnumeratorGenerator = false
ifWhileOpenParen = false
openParenCallSite = false
openParenDefnSite = false
}
docstrings = JavaDoc
rewrite {
rules = [SortImports, RedundantBraces]
redundantBraces.maxLines = 1
}
================================================
FILE: .travis.yml
================================================
sudo: false
language: scala
jdk:
- oraclejdk8
scala:
- 2.11.7
addons:
apt:
packages:
- libc6-i386
- lib32z1
- lib32stdc++6
before_install:
- if [ "$TRAVIS_BRANCH" = "master" -a "$TRAVIS_PULL_REQUEST" = "false" ]; then bash
scripts/decrypt-keys.sh; fi
- export PATH=${PATH}:./vendor/bundle
- wget http://dl.google.com/android/android-sdk_r24-linux.tgz
- tar xf android-sdk_r24-linux.tgz
- export ANDROID_HOME=$PWD/android-sdk-linux
- export ANDROID_SDK_HOME=$PWD/android-sdk-linux
- export PATH=${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools
- echo yes | android update sdk --all --filter platform-tools --no-ui
- echo yes | android update sdk --all --filter build-tools-25.0.0 --no-ui
- echo yes | android update sdk --all --filter android-24 --no-ui
- echo yes | android update sdk --all --filter extra-android-support --no-ui
- echo yes | android update sdk --all --filter extra-android-m2repository --no-ui
- echo yes | android update sdk --all --filter extra-google-m2repository --no-ui
install:
- rvm use 2.2.3 --install --fuzzy
- gem update --system
- gem install sass
- gem install jekyll -v 3.2.1
script:
- sbt ++$TRAVIS_SCALA_VERSION "project commons" coverage test
- sbt ++$TRAVIS_SCALA_VERSION "project api" coverage test
- sbt ++$TRAVIS_SCALA_VERSION "project repository" coverage test
- sbt ++$TRAVIS_SCALA_VERSION "project services" coverage test
- sbt ++$TRAVIS_SCALA_VERSION "project process" coverage test
- sbt ++$TRAVIS_SCALA_VERSION "project app" coverage test
after_success:
- sbt ++$TRAVIS_SCALA_VERSION "project tests" test:coverageAggregate
- bash <(curl -s https://codecov.io/bash) -t ${CODECOV_TOKEN}
- if [ "$TRAVIS_BRANCH" = "master" -a "$TRAVIS_PULL_REQUEST" = "false" ]; then bash
scripts/publishMicrosite.sh; fi
================================================
FILE: CHANGELOG.md
================================================
## 2017/02/06 - Version Name: 2.0.11-rc2 - Version Code: 68
* FlowUp have to be activated from Developer Options
## 2017/01/30 - Version Name: 2.0.10-rc1 - Version Code: 67
* Improved the experience when the user back to the launcher from App Drawer
* New technical documentation
* Changed URL for sharing collections
* Some bugs fixed in UI
## 2016/12/23 - Version Name: 2.0.9-beta - Version Code: 66
* The user can add Bluetooth devices to Moment
* Improved Widgets screen
* Added Apptentive
* The user can disable Google Analytics
* Added tests for jobs
* Some bugs fixed in UI
## 2016/12/16 - Version Name: 2.0.8-beta - Version Code: 65
* Drag&Drop for managing widgets
* Share from other apps have been improved
* Bugs fixed in shortcuts
* Bugs fixed in subscriptions
* Added tests for jobs
* Some bugs fixed in UI
## 2016/12/02 - Version Name: 2.0.7-beta - Version Code: 64
* New About screen with Scala libraries and Team
* Number of views in Public Collections is updated when the user adds it to his collections
* New actions to access to Google Play and Phone in AppDrawer
* Fixed some problems with AppDrawer in empty lists
* Fixed problems in Wizard when some steps launch an exception
* Added tests for jobs
* Some bugs fixed in UI
## 2016/11/28 - Version Name: 2.0.6-alpha - Version Code: 63
* Removed clock in Moment bar
* Added options to menu: wallpaper, settings and widgets
* Upgrade libraries: SBT-Android plugin, Cats and Monix
* Added tests for jobs
* Some bugs fixed in UI
## 2016/11/21 - Version Name: 2.0.5-alpha - Version Code: 62
* We have removed the collapse toolbar in Collections Screen
* Wallpaper is moved when the user swipe right/left in workspaces. You can be disabled this behavior in preferences
* Bug fixed related to the app opens Wizard recursively
* English texts reviewed
* New message in Car, Music and Out & About Moment for explaining the special conditions of this moments
* All events tracked in Google Analytics
* Added tests for jobs
## 2016/11/16 - Version Name: 2.0.4-alpha - Version Code: 61
* New Wizards Inline. 9Cards Team shows you how you can use the launcher
* The user can filter apps and contacts in the dialogs when he wants to add it to the collection
* FlowUp integrated. Thanks to Pedro of Karumi
* Now, the dialogs are using BottomSheetFragment in order to the app has the appearance like Nougat
* New header in Moment Dialog
* New events tracked in Google Analytics
* Libraries upgraded: Android API to 24, Android Support. Google Services and Macroid 2.0
* Added tests for jobs
* Some bugs fixed in UI
## 2016/11/09 - Version Name: 2.0.3-alpha - Version Code: 60
* Changes in the Wizard: new design for loading previous configuration and some changes in new configuration
* Now you can select several multiple apps in AppsDialog for adding to collection
* Bugs fixed in Dark Theme
* We have created the first version of microsite
* First revision of all text in the app
* New Developer Options (remember you have to do long-click in Settings button for activating Dev Ops)
* New events tracked in Google Analytics
* Added test for jobs in Launcher screen
* Some bugs fixed in UI
## 2016/10/31 - Version Name: 2.0.2-alpha - Version Code: 59
* New design of App Drawer. Now the tabs are Applications and Contacts and you can filter from the new option menu
* We have fixed the problems with the widgets. The widgets are updated when the user changes the size and loaded fine the first time
* Bugs fixed on right drawer where appears the apps list of the current collection
* New "Add Card" action in the options of the toolbar on the collections screen
* Improved the exit animation on collection screen
* Bugs fixed in the top bar on the launcher and others minor bugs fixed too
## 2016/10/25 - Version Name: 2.0.1-alpha - Version Code: 58
* New categorization: bugs fixed, new API models and improves the order
* The moments change automatically when the wifi is changed, plug in headphone or you drive your car
* New Moments Out and About and Sport
* You can add, edit or remove your moments
* You can pin and unpin your moment from the top bar
* You can drag applications from dock in order to reorder apps in the dock or remove
* New preferences for show/hide icons in the moment top bar
* New subscription screen design for fixing problem with Android 4.4 or lower
* Added two new developer options to:
* Change backend URL at runtime.
* Enable/disable Stetho.
* Refactorized all persistence models.
* Refactorized all api services models.
## 2016/10/14 - Version Name: 2.0-alpha - Version Code: 57
* First alpha version
================================================
FILE: CONTRIBUTING.md
================================================
## How Can I Contribute?
The issues have been integrated into all stages of the development process. This way, the work is coordinated through the so-called Agile Management following Scrum techniques. For this process, we used Projects in GitHub.
First, you should create a new issue with the bug or new behaviour that you want to implement in 9 Cards. You also can contribute implementing the [existing issues in 9 Cards](https://github.com/47deg/nine-cards-v2/issues).
When you create a new issue you have to add [the labels](https://github.com/47deg/nine-cards-v2/labels) so other developers can understand the problem or new behaviour.
The mandatory labels are:
- **Story Points:** Rate the relative work effort in a Fibonacci-like format: 1, 2, 3, 5, or 8. If we are referring to time, the correspondence for every SP is: 2 hours, 1 day, 2 or 3 days, 1 week and 2 weeks. If you want to put 8 SP on one issue, you should consider dividing the issue.
- **Server or Client:** You should add a new label if the issue is for the [server](https://github.com/47deg/nine-cards-backend) or [client](https://github.com/47deg/nine-cards-v2). In addition, if it's a client issue, you can add a `ui` label if you're only working on UI.
- **Expertise Level:** Add the label for `beginner`, `intermediate` or `advanced`.
You have more labels that you can use if you think they're relevent for other developers such as `bug`, `critical`, `test`, and so on.
When you have selected the issue that you want to work on, you must add the issue in [the board](https://github.com/47deg/nine-cards-v2/projects) (Server or Client) in the `In progess` column. After that, you should create a new `branch` where you'll implement the code. The name of the branch is important:
- [Github Name]-[Issue Number]-[Small Description]
For example, `47dev-1213-Fixing_Tests`
Every issue passes through four statuses:
- **Development:** you are resolving the issue. The issue is in `In Progress` column.
- **Code review:** another person is reviewing the style of the code. You can assign the issue to another developer. The issue is in the `Code review` column. You need a `LGTM!` or `Thumbs up` to pass on to the next step.
- **QA:** another person verifies that the code resolves the issue. The issue is in `QA` column. If the branch covers the description as expected, you can pass on to the next step.
- **Ready to Master:** The issue is in the `Ready to Master` column. You have to wait until we include the code in master.
If you finish the process, you'll be a contributor of 9 Cards and we'll be happy to have you!
================================================
FILE: ISSUE_TEMPLATE.md
================================================
### Description
[Description of the issue]
### Steps to Reproduce
1. [First Step]
2. [Second Step]
3. [and so on...]
**Expected behavior:** [What you expect to happen]
**Actual behavior:** [What actually happens]
================================================
FILE: LICENSE
================================================
Copyright 2016 47 Degrees, LLC. <http://www.47deg.com>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Regarding the use of a piece of code from the cards.nine.utils.SystemBarTintManager.java by readyState Software:
Copyright (C) 2013 readyState Software Ltd
And cards.nine.app.ui.components.layouts.SlidingTabLayout.scala by The Android Open Source Project
Copyright (C) 2013 The Android Open Source Project
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: PULL_REQUEST_TEMPLATE.md
================================================
# Pull Request Checklist
* [ ] Have you read through the [contributor guidelines](https://github.com/47deg/nine-cards-v2/blob/master/CONTRIBUTING.md)?
* [ ] Have you added copyright headers to new files?
* [ ] Have you updated the documentation?
* [ ] Have you added tests for any changed functionality?
## Fixes
Fixes #xxxx
## Purpose
What does this PR do?
================================================
FILE: README.md
================================================
[](https://gitter.im/47deg/nine-cards-v2)
# 9-Cards
9 Cards was an open source home launcher for Android, whose code was all written in Scala. It provided features for organizing apps into collections, giving quick and easy access to the apps more frequently used, at will.
Since January 2019, the 9-Cards project is now abandoned, and the App is no longer available in the Google Play store. The source code repo has been left here, for those wishing to study or to re-create it, published under the Apache License.
For a full list of changes please view:[Changelog](CHANGELOG.md). For instructions for building an using the app, see the [old README](README_old.md).
[](https://play.google.com/store/apps/details?id=com.fortysevendeg.ninecardslauncher)
<img src="https://cloud.githubusercontent.com/assets/456025/22655829/ab55e698-ec91-11e6-8858-ef25df5b5b46.png" width="280"/> <img src="https://cloud.githubusercontent.com/assets/456025/22655909/f87f5e36-ec91-11e6-80b9-5278a45784d5.png" width="280"/> <img src="https://cloud.githubusercontent.com/assets/456025/22655919/01be9cfa-ec92-11e6-869f-300d36bdf238.png" width="280"/>
<img src="https://cloud.githubusercontent.com/assets/456025/22655862/cb1411d0-ec91-11e6-91b4-0236701fcffd.png" width="420"/> <img src="https://cloud.githubusercontent.com/assets/456025/22655875/da8dd448-ec91-11e6-8813-b1a22518b46f.png" width="420"/>
<img src="https://cloud.githubusercontent.com/assets/456025/22655880/e5f6c77c-ec91-11e6-8bf1-670b691fc396.png" width="420"/> <img src="https://cloud.githubusercontent.com/assets/456025/22655895/f0408bbe-ec91-11e6-8650-20b3ef4de3a8.png" width="420"/>
================================================
FILE: README_old.md
================================================
[](https://travis-ci.com/47deg/nine-cards-v2) [](https://gitter.im/47deg/nine-cards-v2)
# 9 Cards v2
[](https://play.google.com/store/apps/details?id=com.fortysevendeg.ninecardslauncher)
<img src="https://cloud.githubusercontent.com/assets/456025/22655829/ab55e698-ec91-11e6-8858-ef25df5b5b46.png" width="280"/> <img src="https://cloud.githubusercontent.com/assets/456025/22655909/f87f5e36-ec91-11e6-80b9-5278a45784d5.png" width="280"/> <img src="https://cloud.githubusercontent.com/assets/456025/22655919/01be9cfa-ec92-11e6-869f-300d36bdf238.png" width="280"/>
<img src="https://cloud.githubusercontent.com/assets/456025/22655862/cb1411d0-ec91-11e6-91b4-0236701fcffd.png" width="420"/> <img src="https://cloud.githubusercontent.com/assets/456025/22655875/da8dd448-ec91-11e6-8813-b1a22518b46f.png" width="420"/>
<img src="https://cloud.githubusercontent.com/assets/456025/22655880/e5f6c77c-ec91-11e6-8bf1-670b691fc396.png" width="420"/> <img src="https://cloud.githubusercontent.com/assets/456025/22655895/f0408bbe-ec91-11e6-8650-20b3ef4de3a8.png" width="420"/>
9 Cards is an open source home launcher for Android written in Scala. This mobile application does the bulk of the work for you, organizing your apps into collections, giving you quick and easy access to the apps you need most, when you need them.
For a full list of changes please view:[Changelog](CHANGELOG.md)
# Table of Contents
1. [Prerequisites](#prerequisites)
2. [Compile and Run](#compile-and-run)
3. [Properties File](#properties-file)
4. [Troubleshooting](#troubleshooting)
## Prerequisites
### SBT
* [Download](http://www.scala-sbt.org/download.html) and install sbt.
### Android SDK
* [Download](https://developer.android.com/studio/index.html#downloads). You only need the command line tools.
* Set `ANDROID_HOME` environment variable pointing to the root folder.
### Android Device
You need an Android device and must [enable USB debugging](https://www.google.es/search?q=android+activate+developer+mode&oq=android+active+developer).
### Google Project
9 Cards needs the following Google APIs:
* Google Drive API for storing your devices in the cloud.
* Google Plus API for authenticating the user requests.
You need to create a project in the Google API Console with these two APIs enabled.
For that, you have 2 choices:
* Normal Mode (Recommended): You must create the keys in the Google Developers Console. You only need 10 minutes for that.
* Easy Mode: We give you the keys and you don't have to create the project in the Google Developers Console.
### Normal Mode: Google Project
1. Go to the [Google Developers Console](https://console.developers.google.com/apis/library?project=_).
2. From the project drop-down, select a [project](https://support.google.com/cloud/answer/6158853), or create a new one.
#### Google Drive API
1. Enable the Google Drive API service:
1. In the sidebar under "API Manager", select *Library*.
2. In the list of Google APIs, search for the Google Drive API service.
3. Select Google Drive API from the results list.
4. Press the Enable API button.
2. In the sidebar under "API Manager", select Credentials.
3. In the Credentials tab, select the *Create credentials* drop-down list, and choose OAuth client ID.
4. Select *Android* as *Application type*.
5. Enter a key Name.
6. [Find your certificate SHA1 fingerprint](https://developers.google.com/android/guides/client-auth) and paste it in the form where requested.
7. Enter `com.fortysevendeg.ninecardslauncher` in the package name field.
8. Click on "Create".
[More info](https://developers.google.com/drive/android/auth)
#### Google Plus API
1. Enable the Google Plus API service:
1. In the sidebar under "API Manager", select *Library*.
2. In the list of Google APIs, search for the Google+ API service.
3. Select Google+ API from the results list.
4. Press the Enable API button.
2. In the sidebar under "API Manager", select *Credentials*.
3. In the Credentials tab, select the *Create credentials* drop-down list, and choose OAuth client ID.
4. Select *Web application* as *Application type*.
5. Enter a key Name then select Create.
6. Then copy the *client ID* of the newly generated credential.
### Easy Mode: Google Project
You must add the following content to `ninecards.properties` file:
```
# Backend V2
backend.v2.url=https://nine-cards.herokuapp.com
backend.v2.clientid=411191100294-sjhinp1i2gkp46u36ii7m16v9hog64nn.apps.googleusercontent.com
```
and you must launch SBT with the following command:
```
$ sbt -mem 2048 -Ddebug
```
At the end of the compilation, previously for installing on a cellphone, you must put the password of the keystore:
```
Enter keystore password:
```
The password is `android`.
Note: If you plan on working on this project, please consider using the `Default Mode`
## Compile and Run
To compile the project:
* Clone this GitHub project to your computer:
```
$ git clone git@github.com:47deg/nine-cards-v2.git
```
* Add a `ninecards.properties` file (See [Add Debug Keys](#properties-file) section).
* You need to set the heap size to at least 2M:
```
$ sbt -mem 2048
```
* Verify that your device is attached:
```
> devices
```
The output should look like:
```
[info] Serial Model Battery % Android Version
[info] ---------------------- ---------------- --------- ---------------
[info] XXXXXXXXXX Nexus 6 66% 6.0.1 API 23
```
* Now you're ready to run the project, just execute:
```
> run
```
## Properties File
You need to add a `ninecards.properties` file in the project root folder.
This file provides some keys for different third party services. We'll see all these down below.
To begin with, you can use the template provided in the root folder:
```
$ cp ninecards.properties.default ninecards.properties
```
This is the content:
```
# Backend V2
backend.v2.url=
backend.v2.clientid=
# Third Parties
crashlytics.enabled=false
crashlytics.apikey=
crashlytics.apisecret=
strictmode.enabled=false
analytics.enabled=false
analytics.trackid=
# Firebase
firebase.enabled=false
firebase.url=
firebase.google.appid=
firebase.google.apikey=
firebase.gcm.senderid=
firebase.clientid=
# FlowUp
flowup.enabled=false
flowup.apikey=
```
### Backend V2 (Mandatory)
* `backend.v2.url`: Defines the URL for the Backend. Visit the [GitHub project](https://github.com/47deg/nine-cards-backend) for more information.
* `backend.v2.clientid`: This value is used for requesting a token id that will be used by the Backend to authenticate the user. It's the *client id* obtained in the [Google Plus API section](#google-plus-api).
### Third Parties (Optional)
**[Crashlytics](https://try.crashlytics.com/)**
* `crashlytics.enabled`: Enables or disables the Crashlytics service.
* `crashlytics.apikey` & `crashlytics.apisecret`: These values are fetched from your [Crashlytics organization page](https://www.fabric.io/settings/organizations).
**[Strict Mode](https://developer.android.com/reference/android/os/StrictMode.html)**
* `strictmode.enabled`: Enables or disables the Strict Mode.
**[Google Analytics](https://developers.google.com/analytics/)**
* `analytics.enabled`: Enables or disables the Google Analytics service.
* `analytics.trackid`: You can use your own tracking ID. See how to [find your tracking code, tracking ID, and property number](https://support.google.com/analytics/answer/1032385).
**[FlowUp](http://flowup.io)**
* `flowup.enabled`: Enables or disables the FlowUp service.
* `flowup.apikey`: These values are fetched from your [FlowUp account](http://flowup.io).
### Google Firebase (Optional)
Google Firebase is used for push notifications.
**[Google Firebase](https://firebase.google.com/)**
1. Create a Firebase project in the [Firebase console](https://firebase.google.com/console/), if you don't already have one. If you already have an existing Google project associated with your mobile app, click Import Google Project. Otherwise, click Create New Project.
2. Add a new app in *Project Settings* -> *General*
3. Select the newly created app and download the `google-services.json`
4. Open the file in a text editor. All bellow properties are taken from this file:
* `firebase.enabled`: Enables or disables the Google Firebase service
* `firebase.url`: Property `project_info.firebase_url`
* `firebase.google.appid`: Property `client[0].client_info.mobilesdk_app_id`
* `firebase.google.apikey`: Property `client[0].api_key[0].current_key`
* `firebase.gcm.senderid`: Property `project_info.project_number`
* `firebase.clientid`: Property `client[0].oauth_client[x].client_id` where x is the index of one element with `client_type` == 3
## Troubleshooting
This section contains information about possible problems that may occur compiling 9 Cards.
### Ubuntu: ProcessException
When you compile the project, it's possible that you will have this error:
`com.android.ide.common.process.ProcessException`
It's a problem in the 64-bit system and you need to install the `ia32-libs`. You should install the following next:
`sudo apt-get install lib32stdc++6 lib32z1`
More information can be found [here](http://stackoverflow.com/questions/22701405/aapt-ioexception-error-2-no-such-file-or-directory-why-cant-i-build-my-grad).
### Ubuntu: Launching IntelliJ from unity panel
If you are using IntelliJ from unity panel it's possible that the app isn't finding the `ANDROID_HOME` environment variable.
Unity launcher doesn't source the user's environment from `.bashrc` and you should include the `ANDROID_HOME` in `/etc/environment` and IntelliJ will work fine.
================================================
FILE: codecov.yml
================================================
codecov:
bot: 47degdev
comment:
layout: header, changes, diff
coverage:
ignore:
- modules/commons-tests/*
- modules/mock-android/*
status:
patch: false
================================================
FILE: modules/api/build.sbt
================================================
platformTarget in Android := "android-24"
================================================
FILE: modules/api/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cards.nine.api"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="24"/>
<application/>
</manifest>
================================================
FILE: modules/api/src/main/res/values/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<resources>
<string name="app_name">Multi-module Sample</string>
</resources>
================================================
FILE: modules/api/src/main/scala/cards/nine/api/rest/client/Exceptions.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.rest.client
import cards.nine.commons.services.TaskService.NineCardException
case class ServiceClientException(message: String, cause: Option[Throwable] = None)
extends RuntimeException(message)
with NineCardException {
cause map initCause
}
trait ImplicitsServiceClientExceptions {
implicit def accountsServicesExceptionConverter =
(t: Throwable) => ServiceClientException(t.getMessage, Option(t))
}
================================================
FILE: modules/api/src/main/scala/cards/nine/api/rest/client/ServiceClient.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.rest.client
import cards.nine.commons.NineCardExtensions._
import cards.nine.commons.services.TaskService
import cards.nine.commons.services.TaskService._
import cards.nine.api.rest.client.http.{HttpClient, HttpClientResponse}
import cards.nine.api.rest.client.messages.ServiceClientResponse
import monix.eval.Task
import play.api.libs.json.{Json, Reads, Writes}
import scala.util.{Failure, Success, Try}
class ServiceClient(httpClient: HttpClient, val baseUrl: String)
extends ImplicitsServiceClientExceptions {
def get[Res](
path: String,
headers: Seq[(String, String)] = Seq.empty,
reads: Option[Reads[Res]] = None,
emptyResponse: Boolean = false
): TaskService[ServiceClientResponse[Res]] =
for {
clientResponse <- httpClient
.doGet(baseUrl.concat(path), headers)
.resolve[ServiceClientException]
response <- readResponse(clientResponse, reads, emptyResponse)
} yield ServiceClientResponse(clientResponse.statusCode.intValue, response)
def emptyPost[Res](
path: String,
headers: Seq[(String, String)] = Seq.empty,
reads: Option[Reads[Res]] = None,
emptyResponse: Boolean = false
): TaskService[ServiceClientResponse[Res]] =
for {
clientResponse <- httpClient
.doPost(baseUrl.concat(path), headers)
.resolve[ServiceClientException]
response <- readResponse(clientResponse, reads, emptyResponse)
} yield ServiceClientResponse(clientResponse.statusCode, response)
def post[Req, Res](
path: String,
headers: Seq[(String, String)] = Seq.empty,
body: Req,
reads: Option[Reads[Res]] = None,
emptyResponse: Boolean = false
)(implicit writes: Writes[Req]): TaskService[ServiceClientResponse[Res]] =
for {
clientResponse <- httpClient
.doPost[Req](baseUrl.concat(path), headers, body)
.resolve[ServiceClientException]
response <- readResponse(clientResponse, reads, emptyResponse)
} yield ServiceClientResponse(clientResponse.statusCode, response)
def emptyPut[Res](
path: String,
headers: Seq[(String, String)] = Seq.empty,
reads: Option[Reads[Res]] = None,
emptyResponse: Boolean = false
): TaskService[ServiceClientResponse[Res]] =
for {
clientResponse <- httpClient
.doPut(baseUrl.concat(path), headers)
.resolve[ServiceClientException]
response <- readResponse(clientResponse, reads, emptyResponse)
} yield ServiceClientResponse(clientResponse.statusCode, response)
def put[Req, Res](
path: String,
headers: Seq[(String, String)] = Seq.empty,
body: Req,
reads: Option[Reads[Res]] = None,
emptyResponse: Boolean = false
)(implicit writes: Writes[Req]): TaskService[ServiceClientResponse[Res]] =
for {
httpResponse <- httpClient
.doPut[Req](baseUrl.concat(path), headers, body)
.resolve[ServiceClientException]
response <- readResponse(httpResponse, reads, emptyResponse)
} yield ServiceClientResponse(httpResponse.statusCode, response)
def delete[Res](
path: String,
headers: Seq[(String, String)] = Seq.empty,
reads: Option[Reads[Res]] = None,
emptyResponse: Boolean = false
): TaskService[ServiceClientResponse[Res]] =
for {
clientResponse <- httpClient
.doDelete(baseUrl.concat(path), headers)
.resolve[ServiceClientException]
response <- readResponse(clientResponse, reads, emptyResponse)
} yield ServiceClientResponse(clientResponse.statusCode, response)
private def readResponse[T](
clientResponse: HttpClientResponse,
maybeReads: Option[Reads[T]],
emptyResponse: Boolean
): TaskService[Option[T]] = {
def isError: Boolean =
clientResponse.statusCode >= 400 && clientResponse.statusCode < 600
TaskService {
Task {
if (isError) {
Left(
ServiceClientException(
s"Error making request. Status code ${clientResponse.statusCode}"))
} else {
(clientResponse.body, emptyResponse, maybeReads) match {
case (Some(d), false, Some(r)) => transformResponse[T](d, r)
case (None, false, _) => Left(ServiceClientException("No content"))
case (Some(d), false, None) =>
Left(ServiceClientException("No transformer found for type"))
case _ => Right(None)
}
}
}
}
}
private def transformResponse[T](
content: String,
reads: Reads[T]
): Either[ServiceClientException, Some[T]] =
Try(Json.parse(content).as[T](reads)) match {
case Success(s) => Right(Some(s))
case Failure(e) => Left(ServiceClientException(message = e.getMessage, cause = Some(e)))
}
}
================================================
FILE: modules/api/src/main/scala/cards/nine/api/rest/client/http/Exceptions.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.rest.client.http
import cards.nine.commons.services.TaskService.NineCardException
case class HttpClientException(message: String, cause: Option[Throwable] = None)
extends RuntimeException(message)
with NineCardException {
cause map initCause
}
trait ImplicitsHttpClientExceptions {
implicit def httpClientExceptionConverter =
(t: Throwable) => HttpClientException(t.getMessage, Option(t))
}
================================================
FILE: modules/api/src/main/scala/cards/nine/api/rest/client/http/HttpClient.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.rest.client.http
import cards.nine.commons.services.TaskService.TaskService
import play.api.libs.json.Writes
trait HttpClient {
def doGet(
url: String,
httpHeaders: Seq[(String, String)]
): TaskService[HttpClientResponse]
def doDelete(
url: String,
httpHeaders: Seq[(String, String)]
): TaskService[HttpClientResponse]
def doPost(
url: String,
httpHeaders: Seq[(String, String)]
): TaskService[HttpClientResponse]
def doPost[Req: Writes](
url: String,
httpHeaders: Seq[(String, String)],
body: Req
): TaskService[HttpClientResponse]
def doPut(
url: String,
httpHeaders: Seq[(String, String)]
): TaskService[HttpClientResponse]
def doPut[Req: Writes](
url: String,
httpHeaders: Seq[(String, String)],
body: Req
): TaskService[HttpClientResponse]
}
================================================
FILE: modules/api/src/main/scala/cards/nine/api/rest/client/http/HttpClientResponse.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.rest.client.http
case class HttpClientResponse(statusCode: Int, body: Option[String])
================================================
FILE: modules/api/src/main/scala/cards/nine/api/rest/client/http/OkHttpClient.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.rest.client.http
import cards.nine.commons.CatchAll
import cards.nine.commons.services.TaskService
import cards.nine.commons.services.TaskService._
import cards.nine.api.rest.client.http.Methods._
import play.api.libs.json.{Json, Writes}
import scala.collection.JavaConverters._
class OkHttpClient(okHttpClient: okhttp3.OkHttpClient = new okhttp3.OkHttpClient)
extends HttpClient
with ImplicitsHttpClientExceptions {
val jsonMediaType = okhttp3.MediaType.parse("application/json")
val textPlainMediaType = okhttp3.MediaType.parse("text/plain")
override def doGet(
url: String,
httpHeaders: Seq[(String, String)]
): TaskService[HttpClientResponse] =
doMethod(GET, url, httpHeaders)
override def doDelete(
url: String,
httpHeaders: Seq[(String, String)]
): TaskService[HttpClientResponse] =
doMethod(DELETE, url, httpHeaders)
override def doPost(
url: String,
httpHeaders: Seq[(String, String)]
): TaskService[HttpClientResponse] =
doMethod(POST, url, httpHeaders)
override def doPost[Req: Writes](
url: String,
httpHeaders: Seq[(String, String)],
body: Req
): TaskService[HttpClientResponse] =
doMethod(POST, url, httpHeaders, Some(Json.toJson(body).toString()))
override def doPut(
url: String,
httpHeaders: Seq[(String, String)]
): TaskService[HttpClientResponse] =
doMethod(PUT, url, httpHeaders)
override def doPut[Req: Writes](
url: String,
httpHeaders: Seq[(String, String)],
body: Req
): TaskService[HttpClientResponse] =
doMethod(PUT, url, httpHeaders, Some(Json.toJson(body).toString()))
private[this] def doMethod[T](
method: Method,
url: String,
httpHeaders: Seq[(String, String)],
body: Option[String] = None,
responseHandler: okhttp3.Response => T = defaultResponseHandler _): TaskService[T] =
TaskService {
CatchAll[HttpClientException] {
val builder = createBuilderRequest(url, httpHeaders)
val request = (method match {
case GET => builder.get()
case DELETE => builder.delete()
case POST => builder.post(createBody(body))
case PUT => builder.put(createBody(body))
}).build()
responseHandler(okHttpClient.newCall(request).execute())
}
}
private[this] def defaultResponseHandler(response: okhttp3.Response): HttpClientResponse =
HttpClientResponse(response.code(), Option(response.body()) map (_.string()))
private[this] def createBuilderRequest(
url: String,
httpHeaders: Seq[(String, String)]): okhttp3.Request.Builder =
new okhttp3.Request.Builder().url(url).headers(createHeaders(httpHeaders))
private[this] def createHeaders(httpHeaders: Seq[(String, String)]): okhttp3.Headers =
okhttp3.Headers.of(httpHeaders.map {
case (key, value) => key -> value
}.toMap.asJava)
private[this] def createBody(body: Option[String]) =
body match {
case Some(b) => okhttp3.RequestBody.create(jsonMediaType, b)
case _ => okhttp3.RequestBody.create(textPlainMediaType, "")
}
}
object Methods {
sealed trait Method
case object GET extends Method
case object DELETE extends Method
case object POST extends Method
case object PUT extends Method
}
================================================
FILE: modules/api/src/main/scala/cards/nine/api/rest/client/messages/Messages.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.rest.client.messages
case class ServiceClientResponse[T](statusCode: Int, data: Option[T])
class ServiceClientException(message: String) extends RuntimeException(message)
================================================
FILE: modules/api/src/main/scala/cards/nine/api/version1/ApiService.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.version1
import cards.nine.commons.services.TaskService.TaskService
import cards.nine.api.rest.client.ServiceClient
import cards.nine.api.rest.client.messages.ServiceClientResponse
import play.api.libs.json.{Reads, Writes}
class ApiService(serviceClient: ServiceClient) {
val prefixPathUser = "/users"
val prefixPathUserConfig = "/ninecards/userconfig"
def baseUrl: String = serviceClient.baseUrl
def login(user: User, headers: Seq[(String, String)])(
implicit reads: Reads[User],
writes: Writes[User]): TaskService[ServiceClientResponse[User]] =
serviceClient
.post[User, User](path = prefixPathUser, headers = headers, body = user, reads = Some(reads))
def getUserConfig(
headers: Seq[(String, String)]
)(implicit reads: Reads[UserConfig]): TaskService[ServiceClientResponse[UserConfig]] =
serviceClient
.get[UserConfig](path = prefixPathUserConfig, headers = headers, reads = Some(reads))
}
================================================
FILE: modules/api/src/main/scala/cards/nine/api/version1/JsonImplicits.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.version1
object JsonImplicits {
import play.api.libs.json._
implicit val authAnonymousReads = Json.reads[AuthAnonymous]
implicit val authFacebookReads = Json.reads[AuthFacebook]
implicit val authTwitterReads = Json.reads[AuthTwitter]
implicit val authGoogleDeviceReads = Json.reads[AuthGoogleDevice]
implicit val authGoogleReads = Json.reads[AuthGoogle]
implicit val authDataReads = Json.reads[AuthData]
implicit val userReads = Json.reads[User]
implicit val userConfigTimeSlotReads = Json.reads[UserConfigTimeSlot]
implicit val userConfigUserLocationReads = Json.reads[UserConfigUserLocation]
implicit val userConfigCollectionItemReads = Json.reads[UserConfigCollectionItem]
implicit val userConfigCollectionReads = Json.reads[UserConfigCollection]
implicit val userConfigProfileImageReads = Json.reads[UserConfigProfileImage]
implicit val userConfigStatusInfoReads = Json.reads[UserConfigStatusInfo]
implicit val userConfigGeoInfoReads = Json.reads[UserConfigGeoInfo]
implicit val userConfigDeviceReads = Json.reads[UserConfigDevice]
implicit val userConfigPlusProfileReads = Json.reads[UserConfigPlusProfile]
implicit val userConfigReads = Json.reads[UserConfig]
implicit val authAnonymousWrites = Json.writes[AuthAnonymous]
implicit val authFacebookWrites = Json.writes[AuthFacebook]
implicit val authTwitterWrites = Json.writes[AuthTwitter]
implicit val authGoogleDeviceWrites = Json.writes[AuthGoogleDevice]
implicit val authGoogleWrites = Json.writes[AuthGoogle]
implicit val authDataWrites = Json.writes[AuthData]
implicit val userWrites = Json.writes[User]
implicit val userConfigTimeSlotWrites = Json.writes[UserConfigTimeSlot]
implicit val userConfigUserLocationWrites = Json.writes[UserConfigUserLocation]
implicit val userConfigCollectionItemWrites = Json.writes[UserConfigCollectionItem]
implicit val userConfigCollectionWrites = Json.writes[UserConfigCollection]
implicit val userConfigProfileImageWrites = Json.writes[UserConfigProfileImage]
implicit val userConfigStatusInfoWrites = Json.writes[UserConfigStatusInfo]
implicit val userConfigGeoInfoWrites = Json.writes[UserConfigGeoInfo]
implicit val userConfigDeviceWrites = Json.writes[UserConfigDevice]
implicit val userConfigPlusProfileWrites = Json.writes[UserConfigPlusProfile]
implicit val userConfigWrites = Json.writes[UserConfig]
}
================================================
FILE: modules/api/src/main/scala/cards/nine/api/version1/Model.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.version1
import play.api.libs.json._
case class User(
_id: Option[String],
sessionToken: Option[String],
username: Option[String],
password: Option[String],
email: Option[String],
authData: Option[AuthData])
case class AuthData(
google: Option[AuthGoogle],
facebook: Option[AuthFacebook],
twitter: Option[AuthTwitter],
anonymous: Option[AuthAnonymous])
case class AuthGoogleDevice(
name: String,
deviceId: String,
secretToken: String,
permissions: Seq[String])
case class AuthGoogle(email: String, devices: Seq[AuthGoogleDevice])
case class AuthTwitter(
id: String,
screenName: String,
consumerKey: String,
consumerSecret: String,
authToken: String,
authTokenSecret: String,
key: String,
secretKey: String)
case class AuthFacebook(id: String, accessToken: String, expirationDate: Long)
case class AuthAnonymous(id: String)
case class UserConfig(
_id: String,
email: String,
plusProfile: UserConfigPlusProfile,
devices: Seq[UserConfigDevice],
geoInfo: UserConfigGeoInfo,
status: UserConfigStatusInfo)
case class UserConfigPlusProfile(displayName: String, profileImage: UserConfigProfileImage)
case class UserConfigDevice(
deviceId: String,
deviceName: String,
collections: Seq[UserConfigCollection])
case class UserConfigGeoInfo(
homeMorning: Option[UserConfigUserLocation],
homeNight: Option[UserConfigUserLocation],
work: Option[UserConfigUserLocation],
current: Option[UserConfigUserLocation])
case class UserConfigStatusInfo(
products: Seq[String],
friendsReferred: Int,
themesShared: Int,
collectionsShared: Int,
customCollections: Int,
earlyAdopter: Boolean,
communityMember: Boolean,
joinedThrough: Option[String],
tester: Boolean)
case class UserConfigProfileImage(imageType: Int, imageUrl: String, secureUrl: Option[String])
case class UserConfigCollection(
name: String,
originalSharedCollectionId: Option[String],
sharedCollectionId: Option[String],
sharedCollectionSubscribed: Option[Boolean],
items: Seq[UserConfigCollectionItem],
collectionType: String,
constrains: Seq[String],
wifi: Seq[String],
occurrence: Seq[String],
icon: String,
radius: Int,
lat: Double,
lng: Double,
alt: Double,
category: Option[String])
case class UserConfigCollectionItem(
itemType: String,
title: String,
metadata: JsValue,
categories: Option[Seq[String]])
case class UserConfigUserLocation(
wifi: String,
lat: Double,
lng: Double,
occurrence: Seq[UserConfigTimeSlot])
case class UserConfigTimeSlot(from: String, to: String, days: Seq[Int])
================================================
FILE: modules/api/src/main/scala/cards/nine/api/version2/ApiService.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.version2
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import cards.nine.commons.services.TaskService.TaskService
import cards.nine.api.rest.client.http.HttpClientException
import cards.nine.api.rest.client.messages.ServiceClientResponse
import cards.nine.api.rest.client.{ServiceClient, ServiceClientException}
import play.api.libs.json.{Reads, Writes}
class ApiService(serviceClient: ServiceClient) {
def baseUrl: String = serviceClient.baseUrl
type ApiException = HttpClientException with ServiceClientException
private[this] val headerContentType = "Content-Type"
private[this] val headerContentTypeValue = "application/json"
private[this] val headerAuthToken = "X-Auth-Token"
private[this] val headerSessionToken = "X-Session-Token"
private[this] val headerAndroidId = "X-Android-ID"
private[this] val headerMarketLocalization = "X-Android-Market-Localization"
private[this] val headerMarketLocalizationValue = "en-US"
private[this] val headerAndroidMarketToken = "X-Google-Play-Token"
private[this] val loginPath = "/login"
private[this] val installationsPath = "/installations"
private[this] val collectionsPath = "/collections"
private[this] val subscriptionsPath = s"$collectionsPath/subscriptions"
private[this] val latestCollectionsPath = s"$collectionsPath/latest"
private[this] val topCollectionsPath = s"$collectionsPath/top"
private[this] val viewsPath = s"/views"
private[this] val applicationsPath = "/applications"
private[this] val categorizePath = s"$applicationsPath/categorize"
private[this] val rankPath = s"$applicationsPath/rank"
private[this] val rankAppsByMomentPath = s"$applicationsPath/rank-by-moments"
private[this] val rankWidgetsByMomentPath = "/widgets/rank"
private[this] val categorizeDetailPath = s"$applicationsPath/details"
private[this] val recommendationsPath = "/recommendations"
private[this] val searchPath = s"$applicationsPath/search"
def login(request: ApiLoginRequest)(
implicit reads: Reads[ApiLoginResponse],
writes: Writes[ApiLoginRequest]): TaskService[ServiceClientResponse[ApiLoginResponse]] =
serviceClient.post[ApiLoginRequest, ApiLoginResponse](
path = loginPath,
headers = Seq((headerContentType, headerContentTypeValue)),
body = request,
reads = Some(reads))
def installations(request: InstallationRequest, header: ServiceHeader)(
implicit reads: Reads[InstallationResponse],
writes: Writes[InstallationRequest]): TaskService[
ServiceClientResponse[InstallationResponse]] =
serviceClient.put[InstallationRequest, InstallationResponse](
path = installationsPath,
headers = createHeaders(installationsPath, header),
body = request,
reads = Some(reads))
def latestCollections(category: String, offset: Int, limit: Int, header: ServiceMarketHeader)(
implicit reads: Reads[CollectionsResponse]): TaskService[
ServiceClientResponse[CollectionsResponse]] = {
val path = s"$latestCollectionsPath/$category/$offset/$limit"
serviceClient.get[CollectionsResponse](
path = path,
headers = createHeaders(path, header),
reads = Some(reads))
}
def topCollections(category: String, offset: Int, limit: Int, header: ServiceMarketHeader)(
implicit reads: Reads[CollectionsResponse]): TaskService[
ServiceClientResponse[CollectionsResponse]] = {
val path = s"$topCollectionsPath/$category/$offset/$limit"
serviceClient.get[CollectionsResponse](
path = path,
headers = createHeaders(path, header),
reads = Some(reads))
}
def createCollection(request: CreateCollectionRequest, header: ServiceHeader)(
implicit reads: Reads[CreateCollectionResponse],
writes: Writes[CreateCollectionRequest]): TaskService[
ServiceClientResponse[CreateCollectionResponse]] =
serviceClient.post[CreateCollectionRequest, CreateCollectionResponse](
path = collectionsPath,
headers = createHeaders(collectionsPath, header),
body = request,
reads = Some(reads))
def updateCollection(
publicIdentifier: String,
request: UpdateCollectionRequest,
header: ServiceHeader)(
implicit reads: Reads[UpdateCollectionResponse],
writes: Writes[UpdateCollectionRequest]): TaskService[
ServiceClientResponse[UpdateCollectionResponse]] = {
val path = s"$collectionsPath/$publicIdentifier"
serviceClient.put[UpdateCollectionRequest, UpdateCollectionResponse](
path = path,
headers = createHeaders(path, header),
body = request,
reads = Some(reads))
}
def getCollection(publicIdentifier: String, header: ServiceMarketHeader)(
implicit reads: Reads[Collection]): TaskService[ServiceClientResponse[Collection]] = {
val path = s"$collectionsPath/$publicIdentifier"
serviceClient
.get[Collection](path = path, headers = createHeaders(path, header), reads = Some(reads))
}
def getCollections(header: ServiceMarketHeader)(
implicit reads: Reads[CollectionsResponse]): TaskService[
ServiceClientResponse[CollectionsResponse]] =
serviceClient.get[CollectionsResponse](
path = collectionsPath,
headers = createHeaders(collectionsPath, header),
reads = Some(reads))
def categorize(request: CategorizeRequest, header: ServiceMarketHeader)(
implicit reads: Reads[CategorizeResponse],
writes: Writes[CategorizeRequest]): TaskService[ServiceClientResponse[CategorizeResponse]] =
serviceClient.post[CategorizeRequest, CategorizeResponse](
path = categorizePath,
headers = createHeaders(categorizePath, header),
body = request,
reads = Some(reads))
def categorizeDetail(request: CategorizeRequest, header: ServiceMarketHeader)(
implicit reads: Reads[CategorizeDetailResponse],
writes: Writes[CategorizeRequest]): TaskService[
ServiceClientResponse[CategorizeDetailResponse]] =
serviceClient.post[CategorizeRequest, CategorizeDetailResponse](
path = categorizeDetailPath,
headers = createHeaders(categorizeDetailPath, header),
body = request,
reads = Some(reads))
def recommendations(
category: String,
filter: Option[String],
request: RecommendationsRequest,
header: ServiceMarketHeader)(
implicit reads: Reads[RecommendationsResponse],
writes: Writes[RecommendationsRequest]): TaskService[
ServiceClientResponse[RecommendationsResponse]] = {
val path = filter match {
case Some(f) => s"$recommendationsPath/$category/$f"
case _ => s"$recommendationsPath/$category"
}
serviceClient.post[RecommendationsRequest, RecommendationsResponse](
path = path,
headers = createHeaders(path, header),
body = request,
reads = Some(reads))
}
def recommendationsByApps(request: RecommendationsByAppsRequest, header: ServiceMarketHeader)(
implicit reads: Reads[RecommendationsByAppsResponse],
writes: Writes[RecommendationsByAppsRequest]): TaskService[
ServiceClientResponse[RecommendationsByAppsResponse]] =
serviceClient.post[RecommendationsByAppsRequest, RecommendationsByAppsResponse](
path = recommendationsPath,
headers = createHeaders(recommendationsPath, header),
body = request,
reads = Some(reads))
def getSubscriptions(header: ServiceHeader)(
implicit reads: Reads[SubscriptionsResponse]): TaskService[
ServiceClientResponse[SubscriptionsResponse]] =
serviceClient.get[SubscriptionsResponse](
path = subscriptionsPath,
headers = createHeaders(subscriptionsPath, header),
reads = Some(reads))
def subscribe(
publicIdentifier: String,
header: ServiceHeader): TaskService[ServiceClientResponse[Unit]] = {
val path = s"$subscriptionsPath/$publicIdentifier"
serviceClient.emptyPut(
path = path,
headers = createHeaders(path, header),
reads = None,
emptyResponse = true)
}
def unsubscribe(
publicIdentifier: String,
header: ServiceHeader): TaskService[ServiceClientResponse[Unit]] = {
val path = s"$subscriptionsPath/$publicIdentifier"
serviceClient.delete(
path = path,
headers = createHeaders(path, header),
reads = None,
emptyResponse = true)
}
def updateViewShareCollection(
publicIdentifier: String,
header: ServiceHeader): TaskService[ServiceClientResponse[Unit]] = {
val path = s"$collectionsPath/$publicIdentifier$viewsPath"
serviceClient.emptyPost(
path = path,
headers = createHeaders(path, header),
reads = None,
emptyResponse = true
)
}
def rankApps(request: RankAppsRequest, header: ServiceHeader)(
implicit reads: Reads[RankAppsResponse],
writes: Writes[RankAppsRequest]): TaskService[ServiceClientResponse[RankAppsResponse]] =
serviceClient.post[RankAppsRequest, RankAppsResponse](
path = rankPath,
headers = createHeaders(rankPath, header),
body = request,
reads = Some(reads))
def rankAppsByMoment(request: RankAppsByMomentRequest, header: ServiceHeader)(
implicit reads: Reads[RankAppsByMomentResponse],
writes: Writes[RankAppsByMomentRequest]): TaskService[
ServiceClientResponse[RankAppsByMomentResponse]] =
serviceClient.post[RankAppsByMomentRequest, RankAppsByMomentResponse](
path = rankAppsByMomentPath,
headers = createHeaders(rankAppsByMomentPath, header),
body = request,
reads = Some(reads))
def rankWidgetsByMoment(request: RankWidgetsByMomentRequest, header: ServiceHeader)(
implicit reads: Reads[RankWidgetsByMomentResponse],
writes: Writes[RankWidgetsByMomentRequest]): TaskService[
ServiceClientResponse[RankWidgetsByMomentResponse]] =
serviceClient.post[RankWidgetsByMomentRequest, RankWidgetsByMomentResponse](
path = rankWidgetsByMomentPath,
headers = createHeaders(rankWidgetsByMomentPath, header),
body = request,
reads = Some(reads))
def search(request: SearchRequest, header: ServiceMarketHeader)(
implicit reads: Reads[SearchResponse],
writes: Writes[SearchRequest]): TaskService[ServiceClientResponse[SearchResponse]] =
serviceClient.post[SearchRequest, SearchResponse](
path = searchPath,
headers = createHeaders(searchPath, header),
body = request,
reads = Some(reads))
private[this] def createHeaders[T <: BaseServiceHeader](
path: String,
header: T): Seq[(String, String)] = {
def readAndroidMarketToken: Option[String] = header match {
case h: ServiceMarketHeader => h.androidMarketToken
case _ => None
}
val algorithm = "HmacSHA512"
val charset = "UTF-8"
def hashMac(apiKey: String, url: String): String = {
val mac = Mac.getInstance(algorithm)
val secret = new SecretKeySpec(apiKey.getBytes(charset), algorithm)
mac.init(secret)
val bytesResult = mac.doFinal(url.getBytes(charset))
bytesResult.map("%02x".format(_)).mkString
}
Seq(
(headerContentType, headerContentTypeValue),
(headerAuthToken, hashMac(header.apiKey, serviceClient.baseUrl.concat(path))),
(headerSessionToken, header.sessionToken),
(headerAndroidId, header.androidId),
(headerMarketLocalization, headerMarketLocalizationValue)) ++
(readAndroidMarketToken map ((headerAndroidMarketToken, _))).toSeq
}
}
================================================
FILE: modules/api/src/main/scala/cards/nine/api/version2/JsonImplicits.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.version2
object JsonImplicits {
import play.api.libs.json._
implicit val loginResponseReads = Json.reads[ApiLoginResponse]
implicit val installationResponseReads = Json.reads[InstallationResponse]
implicit val collectionAppReads = Json.reads[CollectionApp]
implicit val collectionReads = Json.reads[Collection]
implicit val collectionsResponseReads = Json.reads[CollectionsResponse]
implicit val packagesStatsReads = Json.reads[PackagesStats]
implicit val createCollectionResponseReads = Json.reads[CreateCollectionResponse]
implicit val updateCollectionResponseReads = Json.reads[UpdateCollectionResponse]
implicit val categorizedAppReads = Json.reads[CategorizedApp]
implicit val categorizedAppDetailReads = Json.reads[CategorizedAppDetail]
implicit val categorizeResponseReads = Json.reads[CategorizeResponse]
implicit val categorizeDetailResponseReads = Json.reads[CategorizeDetailResponse]
implicit val recommendationAppReads = Json.reads[NotCategorizedApp]
implicit val recommendationsResponseReads = Json.reads[RecommendationsResponse]
implicit val recommendationsByAppsResponseReads = Json.reads[RecommendationsByAppsResponse]
implicit val subscriptionsResponseReads = Json.reads[SubscriptionsResponse]
implicit val rankAppsCategoryResponseReads = Json.reads[RankAppsCategoryResponse]
implicit val rankAppsResponseReads = Json.reads[RankAppsResponse]
implicit val rankAppsByMomentResponseReads = Json.reads[RankAppsByMomentResponse]
implicit val rankWidgetsResponseReads = Json.reads[RankWidgetsResponse]
implicit val rankWidgetsWithMomentResponse = Json.reads[RankWidgetsWithMomentResponse]
implicit val rankWidgetsByMomentResponse = Json.reads[RankWidgetsByMomentResponse]
implicit val searchResponseReads = Json.reads[SearchResponse]
implicit val loginRequestWrites = Json.writes[ApiLoginRequest]
implicit val installationRequestWrites = Json.writes[InstallationRequest]
implicit val createCollectionRequestWrites = Json.writes[CreateCollectionRequest]
implicit val collectionUpdateInfoWrites = Json.writes[CollectionUpdateInfo]
implicit val updateCollectionRequestWrites = Json.writes[UpdateCollectionRequest]
implicit val categorizeRequestWrites = Json.writes[CategorizeRequest]
implicit val recommendationsRequestWrites = Json.writes[RecommendationsRequest]
implicit val recommendationsByAppsRequestWrites = Json.writes[RecommendationsByAppsRequest]
implicit val rankAppsRequestWrites = Json.writes[RankAppsRequest]
implicit val rankAppsByMomentRequestWrites = Json.writes[RankAppsByMomentRequest]
implicit val rankWidgetsByMomentRequest = Json.writes[RankWidgetsByMomentRequest]
implicit val searchRequestWrites = Json.writes[SearchRequest]
}
================================================
FILE: modules/api/src/main/scala/cards/nine/api/version2/Model.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.version2
trait BaseServiceHeader {
def apiKey: String
def sessionToken: String
def androidId: String
}
case class ServiceHeader(apiKey: String, sessionToken: String, androidId: String)
extends BaseServiceHeader
case class ServiceMarketHeader(
apiKey: String,
sessionToken: String,
androidId: String,
androidMarketToken: Option[String])
extends BaseServiceHeader
case class ApiLoginRequest(email: String, androidId: String, tokenId: String)
case class ApiLoginResponse(apiKey: String, sessionToken: String)
case class InstallationRequest(deviceToken: String)
case class InstallationResponse(androidId: String, deviceToken: String)
case class CollectionsResponse(collections: Seq[Collection])
case class CreateCollectionRequest(
name: String,
author: String,
icon: String,
category: String,
community: Boolean,
packages: Seq[String])
case class CreateCollectionResponse(publicIdentifier: String, packagesStats: PackagesStats)
case class UpdateCollectionRequest(
collectionInfo: Option[CollectionUpdateInfo],
packages: Option[Seq[String]])
case class UpdateCollectionResponse(publicIdentifier: String, packagesStats: PackagesStats)
case class CategorizeRequest(items: Seq[String])
case class CategorizeResponse(errors: Seq[String], items: Seq[CategorizedApp])
case class CategorizeDetailResponse(errors: Seq[String], items: Seq[CategorizedAppDetail])
case class RecommendationsRequest(excludePackages: Seq[String], limit: Int)
case class RecommendationsResponse(items: Seq[NotCategorizedApp])
case class RecommendationsByAppsRequest(
packages: Seq[String],
excludePackages: Seq[String],
limit: Int)
case class RecommendationsByAppsResponse(apps: Seq[NotCategorizedApp])
case class SubscriptionsResponse(subscriptions: Seq[String])
case class RankAppsRequest(items: Map[String, Seq[String]], location: Option[String])
case class RankAppsResponse(items: Seq[RankAppsCategoryResponse])
case class RankAppsCategoryResponse(category: String, packages: Seq[String])
case class SearchRequest(query: String, excludePackages: Seq[String], limit: Int)
case class SearchResponse(items: Seq[NotCategorizedApp])
case class RankAppsByMomentRequest(
items: Seq[String],
moments: Seq[String],
location: Option[String],
limit: Int)
case class RankAppsByMomentResponse(items: Seq[RankAppsCategoryResponse])
case class RankWidgetsResponse(packageName: String, className: String)
case class RankWidgetsByMomentRequest(
items: Seq[String],
moments: Seq[String],
location: Option[String],
limit: Int)
case class RankWidgetsWithMomentResponse(moment: String, widgets: Seq[RankWidgetsResponse])
case class RankWidgetsByMomentResponse(items: Seq[RankWidgetsWithMomentResponse])
case class PackagesStats(added: Int, removed: Option[Int] = None)
case class Collection(
name: String,
author: String,
owned: Boolean,
icon: String,
category: String,
community: Boolean,
publishedOn: String,
installations: Option[Int],
views: Option[Int],
subscriptions: Option[Int],
publicIdentifier: String,
appsInfo: Seq[CollectionApp],
packages: Seq[String])
case class CollectionApp(
stars: Double,
icon: String,
packageName: String,
downloads: String,
categories: Seq[String],
title: String,
free: Boolean)
case class CollectionUpdateInfo(title: String)
case class CategorizedApp(packageName: String, categories: Seq[String])
case class CategorizedAppDetail(
packageName: String,
title: String,
categories: Seq[String],
icon: String,
free: Boolean,
downloads: String,
stars: Double)
case class NotCategorizedApp(
packageName: String,
title: String,
downloads: String,
icon: String,
stars: Double,
free: Boolean,
screenshots: Seq[String])
================================================
FILE: modules/api/src/test/scala/cards/nine/api/rest/client/Messages.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.rest.client
case class SampleRequest(message: String)
case class SampleResponse(message: String)
================================================
FILE: modules/api/src/test/scala/cards/nine/api/rest/client/ServiceClientData.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.rest.client
import cards.nine.api.rest.client.http.{HttpClientException, HttpClientResponse}
import play.api.libs.json.Json
trait ServiceClientData {
case class SampleRequest(message: String)
case class SampleResponse(message: String)
val baseUrl = "http://sampleUrl"
val path = "/myPath"
val headers = Seq(("header1", "value1"), ("header2", "value2"))
implicit val readsResponse = Json.reads[SampleResponse]
implicit val writesRequest = Json.writes[SampleRequest]
val message = "Hello World!"
val json = s"""{ "message" : "$message" }"""
val invalidJson = s"""{ "unknownProperty" : false }"""
val sampleRequest = SampleRequest("sample-request")
val sampleResponse = Some(SampleResponse(message))
val statusCodeOk = 200
val statusCodeNotFound = 404
val validHttpClientResponse = HttpClientResponse(statusCodeOk, Some(json))
val validEmptyHttpClientResponse = HttpClientResponse(statusCodeOk, None)
val notFoundHttpClientResponse = HttpClientResponse(statusCodeNotFound, None)
val invalidHttpClientResponse = HttpClientResponse(statusCodeOk, Some(invalidJson))
val exception = HttpClientException("")
}
================================================
FILE: modules/api/src/test/scala/cards/nine/api/rest/client/ServiceClientSpec.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.rest.client
import cards.nine.commons.services.TaskService
import cards.nine.api.rest.client.http.{HttpClient, HttpClientException, HttpClientResponse}
import org.hamcrest.core.IsEqual
import org.specs2.mock.Mockito
import org.specs2.mutable.Specification
import org.specs2.specification.Scope
import play.api.libs.json.Json
import cards.nine.commons.test.TaskServiceTestOps._
import monix.eval.Task
import cats.syntax.either._
import cards.nine.commons.test.TaskServiceSpecification
trait ServiceClientSpecification
extends TaskServiceSpecification
with Mockito
with ServiceClientData {
trait ServiceClientScope extends Scope {
val httpClient = mock[HttpClient]
val serviceClient = new ServiceClient(httpClient, baseUrl)
}
}
case class Test(value: Int)
class ServiceClientSpec extends ServiceClientSpecification {
"get method from ServiceClient" should {
"return a valid response when service return a valid response" in
new ServiceClientScope {
httpClient.doGet(any, any) returns serviceRight(validHttpClientResponse)
serviceClient.get(path, headers, Some(readsResponse), emptyResponse = false) mustRight {
r =>
r.statusCode shouldEqual statusCodeOk
r.data shouldEqual sampleResponse
}
there was one(httpClient).doGet(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return None when the service return a valid empty response" in
new ServiceClientScope {
httpClient.doGet(any, any) returns serviceRight(validHttpClientResponse)
serviceClient.get[Unit](path, headers, None, emptyResponse = true) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beNone
}
there was one(httpClient).doGet(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return an exception" in
new ServiceClientScope {
httpClient.doGet(any, any) returns serviceLeft(exception)
serviceClient
.get(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doGet(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a status code of 'Not Found'" in
new ServiceClientScope {
httpClient.doGet(any, any) returns serviceRight(notFoundHttpClientResponse)
serviceClient
.get(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doGet(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a invalid JSON in the response" in
new ServiceClientScope {
httpClient.doGet(any, any) returns serviceRight(invalidHttpClientResponse)
serviceClient
.get(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doGet(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return an empty response but we're expecting some" in
new ServiceClientScope {
httpClient.doGet(any, any) returns serviceRight(validEmptyHttpClientResponse)
serviceClient
.get(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doGet(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a valid response but the JSON reads is not provided'" in
new ServiceClientScope {
httpClient.doGet(any, any) returns serviceRight(validHttpClientResponse)
serviceClient
.get(path, headers, None, emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doGet(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
}
"delete method from ServiceClient" should {
"return a valid response when service return a valid response" in
new ServiceClientScope {
httpClient.doDelete(any, any) returns serviceRight(validHttpClientResponse)
serviceClient.delete(path, headers, Some(readsResponse), emptyResponse = false) mustRight {
r =>
r.statusCode shouldEqual statusCodeOk
r.data shouldEqual sampleResponse
}
there was one(httpClient).doDelete(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return None when the service return a valid empty response" in
new ServiceClientScope {
httpClient.doDelete(any, any) returns serviceRight(validHttpClientResponse)
serviceClient.delete[Unit](path, headers, None, emptyResponse = true) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beNone
}
there was one(httpClient).doDelete(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return an exception" in
new ServiceClientScope {
httpClient.doDelete(any, any) returns serviceLeft(exception)
serviceClient
.delete(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doDelete(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a status code of 'Not Found'" in
new ServiceClientScope {
httpClient.doDelete(any, any) returns serviceRight(notFoundHttpClientResponse)
serviceClient
.delete(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doDelete(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a invalid JSON in the response" in
new ServiceClientScope {
httpClient.doDelete(any, any) returns serviceRight(invalidHttpClientResponse)
serviceClient
.delete(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doDelete(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return an empty response but we're expecting some" in
new ServiceClientScope {
httpClient.doDelete(any, any) returns serviceRight(validEmptyHttpClientResponse)
serviceClient
.delete(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doDelete(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a valid response but the JSON reads is not provided'" in
new ServiceClientScope {
httpClient.doDelete(any, any) returns serviceRight(validHttpClientResponse)
serviceClient
.delete(path, headers, None, emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doDelete(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
}
"emptyPost method from ServiceClient" should {
"return a valid response when service return a valid response" in
new ServiceClientScope {
httpClient.doPost(any, any) returns serviceRight(validHttpClientResponse)
serviceClient
.emptyPost(path, headers, Some(readsResponse), emptyResponse = false) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data shouldEqual sampleResponse
}
there was one(httpClient).doPost(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return None when the service return a valid empty response" in
new ServiceClientScope {
httpClient.doPost(any, any) returns serviceRight(validHttpClientResponse)
serviceClient.emptyPost[Unit](path, headers, None, emptyResponse = true) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beNone
}
there was one(httpClient).doPost(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return an exception" in
new ServiceClientScope {
httpClient.doPost(any, any) returns serviceLeft(exception)
serviceClient
.emptyPost(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPost(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a status code of 'Not Found'" in
new ServiceClientScope {
httpClient.doPost(any, any) returns serviceRight(notFoundHttpClientResponse)
serviceClient
.emptyPost(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPost(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a invalid JSON in the response" in
new ServiceClientScope {
httpClient.doPost(any, any) returns serviceRight(invalidHttpClientResponse)
serviceClient
.emptyPost(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPost(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return an empty response but we're expecting some" in
new ServiceClientScope {
httpClient.doPost(any, any) returns serviceRight(validEmptyHttpClientResponse)
serviceClient
.emptyPost(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPost(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a valid response but the JSON reads is not provided'" in
new ServiceClientScope {
httpClient.doPost(any, any) returns serviceRight(validHttpClientResponse)
serviceClient
.emptyPost(path, headers, None, emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPost(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
}
"post method from ServiceClient" should {
"return a valid response when service return a valid response" in
new ServiceClientScope {
httpClient.doPost(any, any, any)(any) returns serviceRight(validHttpClientResponse)
serviceClient.post(
path,
headers,
sampleRequest,
Some(readsResponse),
emptyResponse = false) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data shouldEqual sampleResponse
}
there was one(httpClient).doPost(s"$baseUrl$path", headers, sampleRequest)(writesRequest)
there was noMoreCallsTo(httpClient)
}
"return None when the service return a valid empty response" in
new ServiceClientScope {
httpClient.doPost(any, any, any)(any) returns serviceRight(validHttpClientResponse)
serviceClient.post[SampleRequest, Unit](
path,
headers,
sampleRequest,
None,
emptyResponse = true) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beNone
}
there was one(httpClient).doPost(s"$baseUrl$path", headers, sampleRequest)(writesRequest)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return an exception" in
new ServiceClientScope {
httpClient.doPost(any, any, any)(any) returns serviceLeft(exception)
serviceClient
.post(path, headers, sampleRequest, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPost(s"$baseUrl$path", headers, sampleRequest)(writesRequest)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a status code of 'Not Found'" in
new ServiceClientScope {
httpClient.doPost(any, any, any)(any) returns serviceRight(notFoundHttpClientResponse)
serviceClient
.post(path, headers, sampleRequest, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPost(s"$baseUrl$path", headers, sampleRequest)(writesRequest)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a invalid JSON in the response" in
new ServiceClientScope {
httpClient.doPost(any, any, any)(any) returns serviceRight(invalidHttpClientResponse)
serviceClient
.post(path, headers, sampleRequest, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPost(s"$baseUrl$path", headers, sampleRequest)(writesRequest)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return an empty response but we're expecting some" in
new ServiceClientScope {
httpClient.doPost(any, any, any)(any) returns serviceRight(validEmptyHttpClientResponse)
serviceClient
.post(path, headers, sampleRequest, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPost(s"$baseUrl$path", headers, sampleRequest)(writesRequest)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a valid response but the JSON reads is not provided'" in
new ServiceClientScope {
httpClient.doPost(any, any, any)(any) returns serviceRight(validHttpClientResponse)
serviceClient
.post(path, headers, sampleRequest, None, emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPost(s"$baseUrl$path", headers, sampleRequest)(writesRequest)
there was noMoreCallsTo(httpClient)
}
}
"emptyPut method from ServiceClient" should {
"return a valid response when service return a valid response" in
new ServiceClientScope {
httpClient.doPut(any, any) returns serviceRight(validHttpClientResponse)
serviceClient
.emptyPut(path, headers, Some(readsResponse), emptyResponse = false) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data shouldEqual sampleResponse
}
there was one(httpClient).doPut(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return None when the service return a valid empty response" in
new ServiceClientScope {
httpClient.doPut(any, any) returns serviceRight(validHttpClientResponse)
serviceClient.emptyPut[Unit](path, headers, None, emptyResponse = true) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beNone
}
there was one(httpClient).doPut(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return an exception" in
new ServiceClientScope {
httpClient.doPut(any, any) returns serviceLeft(exception)
serviceClient
.emptyPut(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPut(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a status code of 'Not Found'" in
new ServiceClientScope {
httpClient.doPut(any, any) returns serviceRight(notFoundHttpClientResponse)
serviceClient
.emptyPut(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPut(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a invalid JSON in the response" in
new ServiceClientScope {
httpClient.doPut(any, any) returns serviceRight(invalidHttpClientResponse)
serviceClient
.emptyPut(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPut(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return an empty response but we're expecting some" in
new ServiceClientScope {
httpClient.doPut(any, any) returns serviceRight(validEmptyHttpClientResponse)
serviceClient
.emptyPut(path, headers, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPut(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a valid response but the JSON reads is not provided'" in
new ServiceClientScope {
httpClient.doPut(any, any) returns serviceRight(validHttpClientResponse)
serviceClient
.emptyPut(path, headers, None, emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPut(s"$baseUrl$path", headers)
there was noMoreCallsTo(httpClient)
}
}
"put method from ServiceClient" should {
"return a valid response when service return a valid response" in
new ServiceClientScope {
httpClient.doPut(any, any, any)(any) returns serviceRight(validHttpClientResponse)
serviceClient
.put(path, headers, sampleRequest, Some(readsResponse), emptyResponse = false) mustRight {
r =>
r.statusCode shouldEqual statusCodeOk
r.data shouldEqual sampleResponse
}
there was one(httpClient).doPut(s"$baseUrl$path", headers, sampleRequest)(writesRequest)
there was noMoreCallsTo(httpClient)
}
"return None when the service return a valid empty response" in
new ServiceClientScope {
httpClient.doPut(any, any, any)(any) returns serviceRight(validHttpClientResponse)
serviceClient.put[SampleRequest, Unit](
path,
headers,
sampleRequest,
None,
emptyResponse = true) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beNone
}
there was one(httpClient).doPut(s"$baseUrl$path", headers, sampleRequest)(writesRequest)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return an exception" in
new ServiceClientScope {
httpClient.doPut(any, any, any)(any) returns serviceLeft(exception)
serviceClient
.put(path, headers, sampleRequest, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPut(s"$baseUrl$path", headers, sampleRequest)(writesRequest)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a status code of 'Not Found'" in
new ServiceClientScope {
httpClient.doPut(any, any, any)(any) returns serviceRight(notFoundHttpClientResponse)
serviceClient
.put(path, headers, sampleRequest, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPut(s"$baseUrl$path", headers, sampleRequest)(writesRequest)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a invalid JSON in the response" in
new ServiceClientScope {
httpClient.doPut(any, any, any)(any) returns serviceRight(invalidHttpClientResponse)
serviceClient
.put(path, headers, sampleRequest, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPut(s"$baseUrl$path", headers, sampleRequest)(writesRequest)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return an empty response but we're expecting some" in
new ServiceClientScope {
httpClient.doPut(any, any, any)(any) returns serviceRight(validEmptyHttpClientResponse)
serviceClient
.put(path, headers, sampleRequest, Some(readsResponse), emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPut(s"$baseUrl$path", headers, sampleRequest)(writesRequest)
there was noMoreCallsTo(httpClient)
}
"return ServiceClientException when the service return a valid response but the JSON reads is not provided'" in
new ServiceClientScope {
httpClient.doPut(any, any, any)(any) returns serviceRight(validHttpClientResponse)
serviceClient
.put(path, headers, sampleRequest, None, emptyResponse = false)
.mustLeft[ServiceClientException]
there was one(httpClient).doPut(s"$baseUrl$path", headers, sampleRequest)(writesRequest)
there was noMoreCallsTo(httpClient)
}
}
}
================================================
FILE: modules/api/src/test/scala/cards/nine/api/rest/client/http/OkHttpClientSpec.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.rest.client.http
import cards.nine.commons.test.TaskServiceSpecification
import cards.nine.api.rest.client.SampleRequest
import okhttp3.Request
import org.specs2.matcher.DisjunctionMatchers
import org.specs2.mock.Mockito
import org.specs2.specification.Scope
import play.api.libs.json.Json
trait OkHttpClientSpecification
extends TaskServiceSpecification
with DisjunctionMatchers
with Mockito {
trait OkHttpClientScope extends Scope {
val baseUrl = "http://sampleUrl"
implicit val readsRequest = Json.reads[SampleRequest]
implicit val writesRequest = Json.writes[SampleRequest]
val acceptedMethod: Option[String] = None
val acceptedBody: Option[SampleRequest] = None
val acceptedHeaders = Seq(("header1", "value1"), ("header2", "value2"))
val request = new okhttp3.Request.Builder().url(baseUrl).build()
val statusCode = 200
val message = "Hello World!"
val json = s"""{ "message" : "$message" }"""
val baseException = new IllegalArgumentException("")
val okHttpResponse = new okhttp3.Response.Builder()
.protocol(okhttp3.Protocol.HTTP_1_1)
.request(request)
.code(statusCode)
.message("Alright")
.body(okhttp3.ResponseBody.create(okhttp3.MediaType.parse("application/json"), json))
.build()
private def isValidMethod(req: okhttp3.Request): Boolean =
acceptedMethod.getOrElse(req.method) == req.method
private def isValidBody(req: okhttp3.Request): Boolean =
acceptedBody match {
case Some(r) =>
val buffer = new okio.Buffer()
req.body().writeTo(buffer)
Json.parse(buffer.readUtf8()).as[SampleRequest](readsRequest) == r
case _ => true
}
private def isValidHeaders(req: okhttp3.Request): Boolean = {
val headers = 0 until req.headers().size() map { index =>
val name = req.headers().name(index)
(name, req.header(name))
}
headers == acceptedHeaders
}
val okHttpClient = new OkHttpClient(new okhttp3.OkHttpClient() {
override def newCall(theRequest: okhttp3.Request): okhttp3.Call = {
new okhttp3.Call {
override def request(): Request = theRequest
override def cancel(): Unit = {}
override def isCanceled: Boolean = false
override def isExecuted: Boolean = false
override def enqueue(responseCallback: okhttp3.Callback): Unit = {}
override def execute(): okhttp3.Response = {
if (isValidMethod(theRequest) && isValidHeaders(theRequest) && isValidBody(theRequest))
okHttpResponse
else
throw baseException
}
}
}
})
}
}
class OkHttpClientSpec extends OkHttpClientSpecification {
"OkHttpClient component" should {
"return the response for a successfully get request" in new OkHttpClientScope {
override val acceptedMethod = Some(Methods.GET.toString)
val response = okHttpClient.doGet(baseUrl, acceptedHeaders).run
response shouldEqual Right(HttpClientResponse(statusCode, Some(json)))
}
"return the response for a successfully delete request" in new OkHttpClientScope {
override val acceptedMethod = Some(Methods.DELETE.toString)
val response = okHttpClient.doDelete(baseUrl, acceptedHeaders).run
response shouldEqual Right(HttpClientResponse(statusCode, Some(json)))
}
"return the response for a successfully empty post request" in new OkHttpClientScope {
override val acceptedMethod = Some(Methods.POST.toString)
val response = okHttpClient.doPost(baseUrl, acceptedHeaders).run
response shouldEqual Right(HttpClientResponse(statusCode, Some(json)))
}
"return the response for a successfully post request" in new OkHttpClientScope {
override val acceptedMethod = Some(Methods.POST.toString)
val sampleRequest = SampleRequest("request")
override val acceptedBody = Some(sampleRequest)
val response =
okHttpClient.doPost[SampleRequest](baseUrl, acceptedHeaders, sampleRequest).run
response shouldEqual Right(HttpClientResponse(statusCode, Some(json)))
}
"return the response for a successfully empty put request" in new OkHttpClientScope {
override val acceptedMethod = Some(Methods.PUT.toString)
val response = okHttpClient.doPut(baseUrl, acceptedHeaders).run
response shouldEqual Right(HttpClientResponse(statusCode, Some(json)))
}
"return the response for a successfully put request" in new OkHttpClientScope {
override val acceptedMethod = Some(Methods.PUT.toString)
val sampleRequest = SampleRequest("request")
override val acceptedBody = Some(sampleRequest)
val response = okHttpClient.doPut[SampleRequest](baseUrl, acceptedHeaders, sampleRequest).run
response shouldEqual Right(HttpClientResponse(statusCode, Some(json)))
}
"return an Exception for an unexpected method" in new OkHttpClientScope {
override val acceptedMethod = Some(Methods.GET.toString)
val response = okHttpClient.doDelete(baseUrl, Seq.empty).run
response must beAnInstanceOf[Left[IllegalArgumentException, _]]
}
"return an Exception for an unexpected request" in new OkHttpClientScope {
override val acceptedMethod = Some(Methods.POST.toString)
override val acceptedBody = Some(SampleRequest("request"))
val response =
okHttpClient.doPut[SampleRequest](baseUrl, Seq.empty, SampleRequest("bad_request")).run
response must beAnInstanceOf[Left[IllegalArgumentException, _]]
}
}
}
================================================
FILE: modules/api/src/test/scala/cards/nine/api/version1/ApiServiceData.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.version1
import play.api.libs.json.JsNull
trait ApiServiceData {
val baseUrl = "http://localhost:8080"
val statusCodeOk = 200
val userId = 10
val sessionToken = "session-token"
val username = "username"
val password = "password"
val email = "email"
val deviceId = "device-id"
val deviceName = "Nexus 47"
val secretToken = "secret-token"
val permission = "androidmarket"
val headers = Seq(
("header-1", "header-1-value"),
("header-2", "header-2-value"),
("header-3", "header-3-value"))
val authGoogleDevice = AuthGoogleDevice(
name = deviceName,
deviceId = deviceId,
secretToken = secretToken,
permissions = Seq(permission))
val authGoogle = AuthGoogle(email = email, devices = Seq(authGoogleDevice))
val authData =
AuthData(google = Some(authGoogle), facebook = None, twitter = None, anonymous = None)
val emptyUser = User(None, None, None, None, None, None)
val user = User(
Some(userId.toString),
Some(sessionToken),
Some(username),
Some(password),
Some(email),
authData = Some(authData))
val userConfigProfileImage =
UserConfigProfileImage(imageType = 0, imageUrl = "http://fakeUrl", secureUrl = None)
val userConfigPlusProfile = UserConfigPlusProfile(username, userConfigProfileImage)
val userConfigCollectionItem = UserConfigCollectionItem(
itemType = "item type",
title = "item title",
metadata = JsNull,
categories = None)
val userConfigCollection = UserConfigCollection(
name = "collection name",
originalSharedCollectionId = Some("original collection id"),
sharedCollectionId = Some("collection id"),
sharedCollectionSubscribed = Some(true),
items = Seq(userConfigCollectionItem),
collectionType = "collection type",
constrains = Seq.empty,
wifi = Seq.empty,
occurrence = Seq.empty,
icon = "social",
radius = 0,
lat = 0,
lng = 0,
alt = 0,
category = Some("SOCIAL"))
val userConfigDevice = UserConfigDevice(deviceId, deviceName, Seq(userConfigCollection))
val userConfigGeoInfo = UserConfigGeoInfo(None, None, None, None)
val userConfigStatusInfo = UserConfigStatusInfo(
products = Seq.empty,
friendsReferred = 10,
themesShared = 5,
collectionsShared = 5,
customCollections = 2,
earlyAdopter = false,
communityMember = true,
joinedThrough = None,
tester = false)
val userConfig = UserConfig(
userId.toString,
email,
userConfigPlusProfile,
Seq(userConfigDevice),
userConfigGeoInfo,
userConfigStatusInfo)
}
================================================
FILE: modules/api/src/test/scala/cards/nine/api/version1/ApiServiceSpec.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.version1
import cats.syntax.either._
import cards.nine.commons.services.TaskService
import cards.nine.commons.test.TaskServiceSpecification
import cards.nine.api.rest.client.ServiceClient
import cards.nine.api.rest.client.messages.ServiceClientResponse
import monix.eval.Task
import org.specs2.mock.Mockito
import org.specs2.specification.Scope
trait ApiServiceSpecification extends TaskServiceSpecification with Mockito with ApiServiceData {
trait ApiServiceScope extends Scope {
val mockedServiceClient = mock[ServiceClient]
mockedServiceClient.baseUrl returns baseUrl
val apiService = new ApiService(mockedServiceClient)
}
}
class ApiServiceSpec extends ApiServiceSpecification {
import JsonImplicits._
"login" should {
"return the status code and the response" in new ApiServiceScope {
mockedServiceClient.post[User, User](any, any, any, any, any)(any) returns
TaskService(Task(Either.right(ServiceClientResponse(statusCodeOk, Some(user)))))
apiService.login(emptyUser, headers) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(user)
}
there was one(mockedServiceClient).post(
path = "/users",
headers = headers,
body = emptyUser,
reads = Some(userReads),
emptyResponse = false)(userWrites)
}
}
"getUserConfig" should {
"return the status code and the response" in new ApiServiceScope {
mockedServiceClient.get[UserConfig](any, any, any, any) returns
TaskService(Task(Either.right(ServiceClientResponse(statusCodeOk, Some(userConfig)))))
apiService.getUserConfig(headers) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(userConfig)
}
there was one(mockedServiceClient).get(
path = "/ninecards/userconfig",
headers = headers,
reads = Some(userConfigReads),
emptyResponse = false)
}
}
}
================================================
FILE: modules/api/src/test/scala/cards/nine/api/version2/ApiServiceData.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.version2
import scala.util.Random
trait ApiServiceData {
val baseUrl = "http://localhost:8080"
val headerContentType = "Content-Type"
val headerContentTypeValue = "application/json"
val headerAuthToken = "X-Auth-Token"
val headerSessionToken = "X-Session-Token"
val headerAndroidId = "X-Android-ID"
val headerMarketLocalization = "X-Android-Market-Localization"
val headerMarketLocalizationValue = "en-US"
val headerAndroidMarketToken = "X-Google-Play-Token"
val statusCodeOk = 200
val email = "email@dot.com"
val loginId = "login-id"
val tokenId = "token-id"
val apiKey = "api-key"
val deviceToken = "device-token"
val sessionToken = "session-token"
val androidId = "android-id"
val marketToken = "market-token"
val installationAuthToken =
"f9dfeb34c16dae2715dc85b82f7d2a91ff3999212ed5235950d3328c0ab8e35886c98a788ed5fa35211be0a2b7829306b83c7cc4c954025d2b69786608666785"
val latestCollectionsAuthToken =
"eeec8eee60eba7e312cfc752396c0f05625bc372c95e1c6e70ea0e02b61f23e1f238b42c133fedcba2eb725c3e6a14542c2070d8db40e7ffa5a74eb8f50b8f60"
val topCollectionsAuthToken =
"7d7290b7c03da9cf5000b05c148ed430bb333c67a47d57085438481e05f683428b9ad662309fdb637f925bd1eb85b8eefcd522b206314977028f29724ca922d2"
val collectionsAuthToken =
"c5284c3a5ff576a984689bd13ff3e6144dc5ebfedcd14f4eb7ba5b8b8f5ff1211b677fdf12ff8fe93d226de1fb45c706578c4ee43d47dda5cde51c91a7c5bb06"
val collectionsIdAuthToken =
"5fdf0285acf5b1f0223c903553558a7512c92aabac6e6c2dd1daa794682966f954438645ce6cd139036ace029e38c609a23aaeabcdd453d25a5349d8b5cf178c"
val categorizeAuthToken =
"4f129e296588493aab55e0192894ed95867546674844479f8dce0f0f506eed80991a1f09d459d476335acdf27e3f178d16f8df94c45a0e77d4f10935f8199493"
val categorizeDetailAuthToken =
"f6ccbb142c90bb3b527ee2d27867daf4324403255fe90f4f5e0b4b25f992fa7b0c4635a7161fc104f664ea7bea337afe1fffc3e12c4c597eeee56557d089d23b"
val recommendationsAuthToken =
"915f6db594dd9be2bc9cfb2a232c52bccee633afe97086cca7f468690ad8ca7bb87747b5ee13a35af0103091bf9b0d5a38f0cccd5179ca98b399c65f7afae6a2"
val recommendationsByAppsAuthToken =
"ee388db874ece41e4a446bb8c36f0967944d71d87239ae5d629ee6db074508e318eb70c134572d9a3d10192e07b11135360a539a302ca347f3bbdeec6970129b"
val subscriptionsAuthToken =
"b45ad90c3d18f43b7b921c2aeec3258a8a1adf11ad75e4c68928ac89855c5c019b921bc268bc3072a2735718479809a71810e684b11051619ed564392d5be3dd"
val rankAppsAuthToken =
"b105db467bb6d9087471aeeba4337bb8c7b54a383ddbe711dd6b36536c053ec0520ab3fb99dbe03471dd5a6a09001b80dd784ee16684cb71ac6c063926e5d109"
val searchAuthToken =
"1f6f5235a235a4edd3bf7108d1d898a1df219219290c1409d231e6213f47180d9be85e299019434ee9339da83ae28eb7a83dcd95464bf0edbb20cbc1b86506c4"
val updateCollectionAuthToken =
"5fc154fa279c6cb9350d502289e737e3a568ab7ceec6f3b97628644406c100337c88387b47b5ed894582cc01b35bfba156a0d224a5edc392ef23e15811b53d79"
val serviceHeader = ServiceHeader(apiKey, sessionToken, androidId)
val serviceMarketHeader = ServiceMarketHeader(apiKey, sessionToken, androidId, Some(marketToken))
def createHeaders(authToken: String) =
Seq(
(headerContentType, headerContentTypeValue),
(headerAuthToken, authToken),
(headerSessionToken, sessionToken),
(headerAndroidId, androidId),
(headerMarketLocalization, headerMarketLocalizationValue))
def createMarketHeaders(authToken: String) =
createHeaders(authToken) :+ (headerAndroidMarketToken, marketToken)
val category = "SOCIAL"
val publicIdentifier = "collection-public-identifier"
val offset = 0
val limit = 100
val collectionName = "collection name"
val collectionAuthor = "collection author"
val collectionIcon = "collection icon"
val collectionApp = CollectionApp(
stars = 3.5,
icon = "app icon",
packageName = "com.package.app",
downloads = "500,000,000+",
categories = Seq(category),
title = "app title",
free = true)
val collection = Collection(
name = collectionName,
author = collectionAuthor,
owned = false,
icon = collectionIcon,
category = category,
community = true,
publishedOn = "2016-08-16T14:55:30.574000",
installations = Some(10),
views = Some(100),
subscriptions = Some(100),
publicIdentifier = publicIdentifier,
appsInfo = Seq(collectionApp),
packages = Seq(collectionApp.packageName))
val createCollectionRequest = CreateCollectionRequest(
name = collectionName,
author = collectionAuthor,
icon = collectionIcon,
category = category,
community = true,
packages = Seq(collectionApp.packageName))
val createCollectionResponse =
CreateCollectionResponse(publicIdentifier = publicIdentifier, packagesStats = PackagesStats(1))
val updateCollectionRequest = UpdateCollectionRequest(
collectionInfo = Some(CollectionUpdateInfo(title = collectionName)),
packages = Some(Seq(collectionApp.packageName)))
val updateCollectionResponse =
UpdateCollectionResponse(publicIdentifier = publicIdentifier, packagesStats = PackagesStats(1))
val categorizeRequest = CategorizeRequest(items = Seq(collectionApp.packageName))
val categorizeResponse = CategorizeResponse(
errors = Seq.empty,
items =
Seq(CategorizedApp(packageName = collectionApp.packageName, categories = Seq(category))))
val categorizeDetailResponse = CategorizeDetailResponse(
errors = Seq.empty,
items = Seq(
CategorizedAppDetail(
packageName = collectionApp.packageName,
title = collectionApp.title,
categories = Seq(category),
icon = collectionApp.icon,
free = collectionApp.free,
downloads = collectionApp.downloads,
stars = collectionApp.stars)))
val notCategorizedApp = NotCategorizedApp(
packageName = collectionApp.packageName,
title = collectionApp.title,
downloads = collectionApp.downloads,
icon = collectionApp.icon,
stars = collectionApp.stars,
free = collectionApp.free,
screenshots = Seq("screenshot1", "screenshot2", "screenshot3"))
val recommendationsRequest =
RecommendationsRequest(excludePackages = Seq("com.package.sample"), limit = 10)
val recommendationsByAppsRequest = RecommendationsByAppsRequest(
packages = Seq("com.fortysevendeg.ninecardslauncher"),
excludePackages = Seq("com.package.sample"),
limit = 10)
val recommendationsResponse = RecommendationsResponse(items = Seq(notCategorizedApp))
val recommendationsByAppsResponse = RecommendationsByAppsResponse(apps = Seq(notCategorizedApp))
val subscriptions = Seq(publicIdentifier)
val packages =
Seq("com.package.sample.second", "com.package.sample.third", "com.package.sample.first")
val packagesOrdered =
Seq("com.package.sample.first", "com.package.sample.second", "com.package.sample.third")
val items = Map(category -> packages)
val location = Random.nextBoolean match {
case false => None
case true => Some("ES")
}
val rankAppsRequest = RankAppsRequest(items = items, location = location)
val rankAppsResponse = RankAppsResponse(
Seq(RankAppsCategoryResponse(category = category, packages = packagesOrdered)))
val searchRequest =
SearchRequest(query = "sample query", excludePackages = Seq("com.package.sample"), limit = 10)
val searchResponse = SearchResponse(items = Seq(notCategorizedApp))
}
================================================
FILE: modules/api/src/test/scala/cards/nine/api/version2/ApiServiceSpec.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.api.version2
import cards.nine.commons.test.TaskServiceSpecification
import cards.nine.api.rest.client.ServiceClient
import cards.nine.api.rest.client.messages.ServiceClientResponse
import org.specs2.mock.Mockito
import org.specs2.specification.Scope
trait ApiServiceSpecification extends TaskServiceSpecification with Mockito with ApiServiceData {
trait ApiServiceScope extends Scope {
val mockedServiceClient = mock[ServiceClient]
mockedServiceClient.baseUrl returns baseUrl
val apiService = new ApiService(mockedServiceClient)
}
}
class ApiServiceSpec extends ApiServiceSpecification {
import JsonImplicits._
"login" should {
"return the status code and the response" in new ApiServiceScope {
val response = ApiLoginResponse(apiKey, sessionToken)
mockedServiceClient.post[ApiLoginRequest, ApiLoginResponse](any, any, any, any, any)(any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(response)))
val request = ApiLoginRequest(email, loginId, tokenId)
apiService.login(request) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(response)
}
there was one(mockedServiceClient).post(
path = "/login",
headers = Seq((headerContentType, headerContentTypeValue)),
body = request,
reads = Some(loginResponseReads),
emptyResponse = false)(loginRequestWrites)
}
}
"installations" should {
"return the status code and the response" in new ApiServiceScope {
val response = InstallationResponse(androidId, deviceToken)
mockedServiceClient.put[InstallationRequest, InstallationResponse](any, any, any, any, any)(
any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(response)))
val request = InstallationRequest(deviceToken)
apiService.installations(request, serviceHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(response)
}
there was one(mockedServiceClient).put(
path = "/installations",
headers = createHeaders(installationAuthToken),
body = request,
reads = Some(installationResponseReads),
emptyResponse = false)(installationRequestWrites)
}
"latest collections" should {
"return the status code and the response" in new ApiServiceScope {
val response = CollectionsResponse(Seq(collection))
mockedServiceClient.get[CollectionsResponse](any, any, any, any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(response)))
apiService.latestCollections(category, offset, limit, serviceMarketHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(response)
}
there was one(mockedServiceClient).get(
path = s"/collections/latest/$category/$offset/$limit",
headers = createMarketHeaders(latestCollectionsAuthToken),
reads = Some(collectionsResponseReads),
emptyResponse = false)
}
}
"top collections" should {
"return the status code and the response" in new ApiServiceScope {
val response = CollectionsResponse(Seq(collection))
mockedServiceClient.get[CollectionsResponse](any, any, any, any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(response)))
apiService.topCollections(category, offset, limit, serviceMarketHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(response)
}
there was one(mockedServiceClient).get(
path = s"/collections/top/$category/$offset/$limit",
headers = createMarketHeaders(topCollectionsAuthToken),
reads = Some(collectionsResponseReads),
emptyResponse = false)
}
}
"create collection" should {
"return the status code and the response" in new ApiServiceScope {
mockedServiceClient.post[CreateCollectionRequest, CreateCollectionResponse](
any,
any,
any,
any,
any)(any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(createCollectionResponse)))
apiService.createCollection(createCollectionRequest, serviceHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(createCollectionResponse)
}
there was one(mockedServiceClient).post(
path = "/collections",
headers = createHeaders(collectionsAuthToken),
body = createCollectionRequest,
reads = Some(createCollectionResponseReads),
emptyResponse = false)(createCollectionRequestWrites)
}
}
"update collection" should {
"return the status code and the response" in new ApiServiceScope {
mockedServiceClient.put[UpdateCollectionRequest, UpdateCollectionResponse](
any,
any,
any,
any,
any)(any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(updateCollectionResponse)))
apiService
.updateCollection(publicIdentifier, updateCollectionRequest, serviceHeader) mustRight {
r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(updateCollectionResponse)
}
there was one(mockedServiceClient).put(
path = s"/collections/$publicIdentifier",
headers = createHeaders(collectionsIdAuthToken),
body = updateCollectionRequest,
reads = Some(updateCollectionResponseReads),
emptyResponse = false)(updateCollectionRequestWrites)
}
}
"get collection" should {
"return the status code and the response" in new ApiServiceScope {
val response = collection
mockedServiceClient.get[Collection](any, any, any, any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(response)))
apiService.getCollection(publicIdentifier, serviceMarketHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(response)
}
there was one(mockedServiceClient).get(
path = s"/collections/$publicIdentifier",
headers = createMarketHeaders(collectionsIdAuthToken),
reads = Some(collectionReads),
emptyResponse = false)
}
}
"get collections" should {
"return the status code and the response" in new ApiServiceScope {
val response = CollectionsResponse(Seq(collection))
mockedServiceClient.get[CollectionsResponse](any, any, any, any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(response)))
apiService.getCollections(serviceMarketHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(response)
}
there was one(mockedServiceClient).get(
path = "/collections",
headers = createMarketHeaders(collectionsAuthToken),
reads = Some(collectionsResponseReads),
emptyResponse = false)
}
}
"categorize" should {
"return the status code and the response" in new ApiServiceScope {
mockedServiceClient.post[CategorizeRequest, CategorizeResponse](any, any, any, any, any)(
any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(categorizeResponse)))
apiService.categorize(categorizeRequest, serviceMarketHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(categorizeResponse)
}
there was one(mockedServiceClient).post(
path = "/applications/categorize",
headers = createMarketHeaders(categorizeAuthToken),
body = categorizeRequest,
reads = Some(categorizeResponseReads),
emptyResponse = false)(categorizeRequestWrites)
}
}
"categorizeDetail" should {
"return the status code and the response" in new ApiServiceScope {
mockedServiceClient
.post[CategorizeRequest, CategorizeDetailResponse](any, any, any, any, any)(any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(categorizeDetailResponse)))
apiService.categorizeDetail(categorizeRequest, serviceMarketHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(categorizeDetailResponse)
}
there was one(mockedServiceClient).post(
path = "/applications/details",
headers = createMarketHeaders(categorizeDetailAuthToken),
body = categorizeRequest,
reads = Some(categorizeDetailResponseReads),
emptyResponse = false)(categorizeRequestWrites)
}
}
"recommendations" should {
"return the status code and the response and call with the right category" in new ApiServiceScope {
val typePay = "FREE"
mockedServiceClient.post[RecommendationsRequest, RecommendationsResponse](
any,
any,
any,
any,
any)(any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(recommendationsResponse)))
apiService.recommendations(
category,
Option(typePay),
recommendationsRequest,
serviceMarketHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(recommendationsResponse)
}
there was one(mockedServiceClient).post(
path = s"/recommendations/$category/$typePay",
headers = createMarketHeaders(recommendationsAuthToken),
body = recommendationsRequest,
reads = Some(recommendationsResponseReads),
emptyResponse = false)(recommendationsRequestWrites)
}
}
"recommendations by apps" should {
"return the status code and the response" in new ApiServiceScope {
mockedServiceClient.post[RecommendationsByAppsRequest, RecommendationsByAppsResponse](
any,
any,
any,
any,
any)(any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(recommendationsByAppsResponse)))
apiService
.recommendationsByApps(recommendationsByAppsRequest, serviceMarketHeader) mustRight {
r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(recommendationsByAppsResponse)
}
there was one(mockedServiceClient).post(
path = s"/recommendations",
headers = createMarketHeaders(recommendationsByAppsAuthToken),
body = recommendationsByAppsRequest,
reads = Some(recommendationsByAppsResponseReads),
emptyResponse = false)(recommendationsByAppsRequestWrites)
}
}
"get subscriptions" should {
"return the status code and the response" in new ApiServiceScope {
val response = SubscriptionsResponse(subscriptions)
mockedServiceClient.get[SubscriptionsResponse](any, any, any, any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(response)))
apiService.getSubscriptions(serviceHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(response)
}
there was one(mockedServiceClient).get(
path = "/collections/subscriptions",
headers = createHeaders(subscriptionsAuthToken),
reads = Some(subscriptionsResponseReads))
}
}
"subscribe" should {
"return the status code" in new ApiServiceScope {
mockedServiceClient.emptyPut[Unit](any, any, any, any) returns
serviceRight(ServiceClientResponse(statusCodeOk, None))
apiService.subscribe(publicIdentifier, serviceHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beNone
}
there was one(mockedServiceClient).emptyPut(
path = s"/collections/subscriptions/$publicIdentifier",
headers = createHeaders(subscriptionsAuthToken),
reads = None,
emptyResponse = true)
}
}
"unsubscribe" should {
"return the status code" in new ApiServiceScope {
mockedServiceClient.delete[Unit](any, any, any, any) returns
serviceRight(ServiceClientResponse(statusCodeOk, None))
apiService.unsubscribe(publicIdentifier, serviceHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beNone
}
there was one(mockedServiceClient).delete(
path = s"/collections/subscriptions/$publicIdentifier",
headers = createHeaders(subscriptionsAuthToken),
reads = None,
emptyResponse = true)
}
}
"updateViewShareCollection" should {
"return the status code" in new ApiServiceScope {
mockedServiceClient.emptyPost[Unit](any, any, any, any) returns
serviceRight(ServiceClientResponse(statusCodeOk, None))
apiService.updateViewShareCollection(publicIdentifier, serviceHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beNone
}
there was one(mockedServiceClient).emptyPost(
path = s"/collections/$publicIdentifier/views",
headers = createHeaders(updateCollectionAuthToken),
reads = None,
emptyResponse = true)
}
}
"rank apps" should {
"return the status code and the response" in new ApiServiceScope {
mockedServiceClient.post[RankAppsRequest, RankAppsResponse](any, any, any, any, any)(any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(rankAppsResponse)))
apiService.rankApps(rankAppsRequest, serviceHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(rankAppsResponse)
}
there was one(mockedServiceClient).post(
path = "/applications/rank",
headers = createHeaders(rankAppsAuthToken),
body = rankAppsRequest,
reads = Some(rankAppsResponseReads),
emptyResponse = false)(rankAppsRequestWrites)
}
}
"search apps" should {
"return the status code and the response" in new ApiServiceScope {
mockedServiceClient.post[SearchRequest, SearchResponse](any, any, any, any, any)(any) returns
serviceRight(ServiceClientResponse(statusCodeOk, Some(searchResponse)))
apiService.search(searchRequest, serviceMarketHeader) mustRight { r =>
r.statusCode shouldEqual statusCodeOk
r.data must beSome(searchResponse)
}
there was one(mockedServiceClient).post(
path = "/applications/search",
headers = createMarketHeaders(searchAuthToken),
body = searchRequest,
reads = Some(searchResponseReads),
emptyResponse = false)(searchRequestWrites)
}
}
}
}
================================================
FILE: modules/api/src/test/scala/com/fortysevendeg/BaseTestSupport.scala
================================================
/*
* Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.fortysevendeg
import org.specs2.execute.{AsResult, Result}
import org.specs2.specification.{Around, Scope}
trait BaseTestSupport extends Around with Scope {
override def around[T: AsResult](t: => T): Result = AsResult.effectively(t)
}
================================================
FILE: modules/app/build.sbt
================================================
platformTarget in Android := "android-24"
================================================
FILE: modules/app/crashlytics/templates/CrashlyticsManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fortysevendeg.ninecardslauncher"
android:versionCode="1"
android:versionName="1.0">
<application
android:label="@string/app_name"
android:icon="@drawable/ic_launcher">
<meta-data
android:name="io.fabric.ApiKey"
android:value="${crashlytics.apikey}"/>
</application>
</manifest>
================================================
FILE: modules/app/project/plugins.sbt
================================================
addSbtPlugin("com.hanhuy.sbt" % "android-sdk-plugin" % "1.5.1")
================================================
FILE: modules/app/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fortysevendeg.ninecardslauncher">
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="24"/>
<application
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:name="cards.nine.app.NineCardsApplication">
<meta-data
android:name="com.google.android.awareness.API_KEY"
android:value="@string/google_api_key"/>
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_api_key" />
<meta-data android:name="io.fabric.ApiKey"
android:value="@string/crashlytics_api_key"/>
<activity
android:theme="@style/AppThemeWallpaper"
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
android:stateNotNeeded="true"
android:windowSoftInputMode="adjustPan"
android:screenOrientation="portrait"
android:name="cards.nine.app.ui.launcher.LauncherActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:theme="@style/AppTheme"
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
android:screenOrientation="portrait"
android:label=""
android:name="cards.nine.app.ui.collections.CollectionsDetailsActivity"/>
<activity
android:theme="@style/AppTheme"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:label=""
android:name="cards.nine.app.ui.wizard.WizardActivity" />
<activity
android:theme="@style/AppTheme"
android:screenOrientation="portrait"
android:label=""
android:name="cards.nine.app.ui.profile.ProfileActivity"/>
<activity
android:theme="@style/AppThemePreferences"
android:screenOrientation="portrait"
android:label="@string/nineCardsSettingsTitle"
android:name="cards.nine.app.ui.preferences.NineCardsPreferencesActivity"/>
<activity
android:theme="@style/AppThemeSharedContent"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:label="@string/sharedIntentLabel"
android:name="cards.nine.app.ui.share.SharedContentActivity" >
<intent-filter
android:label="@string/sharedIntentLabel">
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
<activity
android:theme="@style/AppCompatDialog"
android:launchMode="singleTask"
android:name="cards.nine.app.ui.applinks.AppLinksReceiverActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="9c.io" android:pathPrefix="/shared-collection" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="www.9c.io" android:pathPrefix="/shared-collection" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="www.9cards.io" android:pathPrefix="/shared-collection" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="nine.cards" android:pathPrefix="/shared-collection" />
</intent-filter>
</activity>
<service
android:name="cards.nine.app.services.sync.SynchronizeDeviceService"/>
<provider
android:authorities="com.fortysevendeg.ninecardslauncher"
android:name="cards.nine.repository.provider.NineCardsContentProvider"
android:exported="false"/>
<receiver android:name="cards.nine.app.receivers.apps.AppBroadcastReceiver">
<intent-filter android:priority="999">
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<action android:name="android.intent.action.PACKAGE_CHANGED"/>
<action android:name="android.intent.action.PACKAGE_REPLACED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
<receiver android:name="cards.nine.app.receivers.moments.MomentBroadcastReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
<!-- Gooogle Analytics Receivers and Services -->
<receiver android:name="com.google.android.gms.analytics.AnalyticsReceiver"
android:enabled="true">
<intent-filter>
<action android:name="com.google.android.gms.analytics.ANALYTICS_DISPATCH" />
</intent-filter>
</receiver>
<service android:name="com.google.android.gms.analytics.AnalyticsService"
android:enabled="true"
android:exported="false"/>
<receiver android:name="com.google.android.gms.analytics.CampaignTrackingReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
<receiver
android:name="cards.nine.app.receivers.shortcuts.ShortcutBroadcastReceiver"
android:permission="com.android.launcher.permission.INSTALL_SHORTCUT">
<intent-filter>
<action android:name="com.android.launcher.action.INSTALL_SHORTCUT"/>
</intent-filter>
</receiver>
<receiver
android:name="cards.nine.app.receivers.bluetooth.BluetoothReceiver"
android:enabled="true">
<intent-filter>
<action android:name="android.bluetooth.device.action.ACL_CONNECTED" />
<action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" />
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
</intent-filter>
</receiver>
<service
android:name="com.google.android.gms.analytics.CampaignTrackingService" />
<service
android:name="cards.nine.app.services.NineCardsFirebaseInstanceIdService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
<service
android:name="cards.nine.app.services.NineCardsFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name="cards.nine.app.services.sharedcollections.UpdateSharedCollectionService"
android:exported="false"/>
</application>
<!--
Normal Permissions - Automatically granted
https://developer.android.com/guide/topics/security/normal-permissions.html
-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.BLUETOOTH" />
<!-- Normal Permissions -->
<!-- Dangerous Permissions - Need user approve -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!-- Dangerous Permissions -->
<!-- Other permissions -->
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<!-- Other permissions -->
<!-- Old versions permissions -->
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<!-- Old versions permissions -->
</manifest>
================================================
FILE: modules/app/src/main/java/cards/nine/utils/SystemBarTintManager.java
================================================
/*
* Copyright (C) 2013 readyState Software Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cards.nine.utils;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.*;
import android.widget.FrameLayout.LayoutParams;
/**
* Class to manage status and navigation bar tint effects when using KitKat
* translucent system UI modes.
*
*/
public class SystemBarTintManager {
/**
* The default system bar tint color value.
*/
public static final int DEFAULT_TINT_COLOR = Color.parseColor("#99000000");
private SystemBarConfig mConfig;
private boolean mStatusBarAvailable;
private boolean mNavBarAvailable;
private boolean mStatusBarTintEnabled;
private boolean mNavBarTintEnabled;
private View mStatusBarTintView;
private View mNavBarTintView;
/**
* Constructor. Call this in the host activity onCreate method after its
* content view has been set. You should always create new instances when
* the host activity is recreated.
*
* @param activity The host activity.
*/
@TargetApi(19)
public SystemBarTintManager(Activity activity) {
Window win = activity.getWindow();
ViewGroup decorViewGroup = (ViewGroup) win.getDecorView();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// check theme attrs
int[] attrs = {android.R.attr.windowTranslucentStatus,
android.R.attr.windowTranslucentNavigation};
TypedArray a = activity.obtainStyledAttributes(attrs);
mStatusBarAvailable = a.getBoolean(0, false);
mNavBarAvailable = a.getBoolean(1, false);
// check window flags
WindowManager.LayoutParams winParams = win.getAttributes();
int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
if ((winParams.flags & bits) != 0) {
mStatusBarAvailable = true;
}
bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
if ((winParams.flags & bits) != 0) {
mNavBarAvailable = true;
}
}
mConfig = new SystemBarConfig(activity, mStatusBarAvailable, mNavBarAvailable);
// device might not have virtual navigation keys
if (!mConfig.hasNavigationBar()) {
mNavBarAvailable = false;
}
if (mStatusBarAvailable) {
setupStatusBarView(activity, decorViewGroup);
}
if (mNavBarAvailable) {
setupNavBarView(activity, decorViewGroup);
}
}
/**
* Enable tinting of the system status bar.
*
* If the platform is running Jelly Bean or earlier, or translucent system
* UI modes have not been enabled in either the theme or via window flags,
* then this method does nothing.
*
* @param enabled True to enable tinting, false to disable it (default).
*/
public void setStatusBarTintEnabled(boolean enabled) {
mStatusBarTintEnabled = enabled;
if (mStatusBarAvailable) {
mStatusBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);
}
}
/**
* Enable tinting of the system navigation bar.
*
* If the platform does not have soft navigation keys, is running Jelly Bean
* or earlier, or translucent system UI modes have not been enabled in either
* the theme or via window flags, then this method does nothing.
*
* @param enabled True to enable tinting, false to disable it (default).
*/
public void setNavigationBarTintEnabled(boolean enabled) {
mNavBarTintEnabled = enabled;
if (mNavBarAvailable) {
mNavBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);
}
}
/**
* Apply the specified color tint to all system UI bars.
*
* @param color The color of the background tint.
*/
public void setTintColor(int color) {
setStatusBarTintColor(color);
setNavigationBarTintColor(color);
}
/**
* Apply the specified drawable or color resource to all system UI bars.
*
* @param res The identifier of the resource.
*/
public void setTintResource(int res) {
setStatusBarTintResource(res);
setNavigationBarTintResource(res);
}
/**
* Apply the specified drawable to all system UI bars.
*
* @param drawable The drawable to use as the background, or null to remove it.
*/
public void setTintDrawable(Drawable drawable) {
setStatusBarTintDrawable(drawable);
setNavigationBarTintDrawable(drawable);
}
/**
* Apply the specified color tint to the system status bar.
*
* @param color The color of the background tint.
*/
public void setStatusBarTintColor(int color) {
if (mStatusBarAvailable) {
mStatusBarTintView.setBackgroundColor(color);
}
}
/**
* Apply the specified drawable or color resource to the system status bar.
*
* @param res The identifier of the resource.
*/
public void setStatusBarTintResource(int res) {
if (mStatusBarAvailable) {
mStatusBarTintView.setBackgroundResource(res);
}
}
/**
* Apply the specified drawable to the system status bar.
*
* @param drawable The drawable to use as the background, or null to remove it.
*/
@SuppressWarnings("deprecation")
public void setStatusBarTintDrawable(Drawable drawable) {
if (mStatusBarAvailable) {
mStatusBarTintView.setBackgroundDrawable(drawable);
}
}
/**
* Apply the specified color tint to the system navigation bar.
*
* @param color The color of the background tint.
*/
public void setNavigationBarTintColor(int color) {
if (mNavBarAvailable) {
mNavBarTintView.setBackgroundColor(color);
}
}
/**
* Apply the specified drawable or color resource to the system navigation bar.
*
* @param res The identifier of the resource.
*/
public void setNavigationBarTintResource(int res) {
if (mNavBarAvailable) {
mNavBarTintView.setBackgroundResource(res);
}
}
/**
* Apply the specified drawable to the system navigation bar.
*
* @param drawable The drawable to use as the background, or null to remove it.
*/
@SuppressWarnings("deprecation")
public void setNavigationBarTintDrawable(Drawable drawable) {
if (mNavBarAvailable) {
mNavBarTintView.setBackgroundDrawable(drawable);
}
}
/**
* Get the system bar configuration.
*
* @return The system bar configuration for the current device configuration.
*/
public SystemBarConfig getConfig() {
return mConfig;
}
/**
* Is tinting enabled for the system status bar?
*
* @return True if enabled, False otherwise.
*/
public boolean isStatusBarTintEnabled() {
return mStatusBarTintEnabled;
}
/**
* Is tinting enabled for the system navigation bar?
*
* @return True if enabled, False otherwise.
*/
public boolean isNavBarTintEnabled() {
return mNavBarTintEnabled;
}
private void setupStatusBarView(Context context, ViewGroup decorViewGroup) {
mStatusBarTintView = new View(context);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getStatusBarHeight());
params.gravity = Gravity.TOP;
if (mNavBarAvailable && !mConfig.isNavigationAtBottom()) {
params.rightMargin = mConfig.getNavigationBarWidth();
}
mStatusBarTintView.setLayoutParams(params);
mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
mStatusBarTintView.setVisibility(View.GONE);
decorViewGroup.addView(mStatusBarTintView);
}
private void setupNavBarView(Context context, ViewGroup decorViewGroup) {
mNavBarTintView = new View(context);
LayoutParams params;
if (mConfig.isNavigationAtBottom()) {
params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getNavigationBarHeight());
params.gravity = Gravity.BOTTOM;
} else {
params = new LayoutParams(mConfig.getNavigationBarWidth(), LayoutParams.MATCH_PARENT);
params.gravity = Gravity.RIGHT;
}
mNavBarTintView.setLayoutParams(params);
mNavBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
mNavBarTintView.setVisibility(View.GONE);
decorViewGroup.addView(mNavBarTintView);
}
/**
* Class which describes system bar sizing and other characteristics for the current
* device configuration.
*
*/
public class SystemBarConfig {
private static final String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height";
private static final String NAV_BAR_HEIGHT_RES_NAME = "navigation_bar_height";
private static final String NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME = "navigation_bar_height_landscape";
private static final String NAV_BAR_WIDTH_RES_NAME = "navigation_bar_width";
private boolean mTranslucentStatusBar;
private boolean mTranslucentNavBar;
private int mStatusBarHeight;
private int mActionBarHeight;
private boolean mHasNavigationBar;
private int mNavigationBarHeight;
private int mNavigationBarWidth;
private boolean mInPortrait;
private float mSmallestWidthDp;
private SystemBarConfig(Activity activity, boolean translucentStatusBar, boolean traslucentNavBar) {
Resources res = activity.getResources();
mInPortrait = (res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);
mSmallestWidthDp = getSmallestWidthDp(activity);
mStatusBarHeight = getInternalDimensionSize(res, STATUS_BAR_HEIGHT_RES_NAME);
mActionBarHeight = getActionBarHeight(activity);
mNavigationBarHeight = getNavigationBarHeight(activity);
mNavigationBarWidth = getNavigationBarWidth(activity);
mHasNavigationBar = (mNavigationBarHeight > 0);
mTranslucentStatusBar = translucentStatusBar;
mTranslucentNavBar = traslucentNavBar;
}
@TargetApi(14)
private int getActionBarHeight(Context context) {
int result = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
result = context.getResources().getDimensionPixelSize(tv.resourceId);
}
return result;
}
@TargetApi(14)
private int getNavigationBarHeight(Context context) {
Resources res = context.getResources();
int result = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
if (!ViewConfiguration.get(context).hasPermanentMenuKey()) {
String key;
if (mInPortrait) {
key = NAV_BAR_HEIGHT_RES_NAME;
} else {
key = NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME;
}
return getInternalDimensionSize(res, key);
}
}
return result;
}
@TargetApi(14)
private int getNavigationBarWidth(Context context) {
Resources res = context.getResources();
int result = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
if (!ViewConfiguration.get(context).hasPermanentMenuKey()) {
return getInternalDimensionSize(res, NAV_BAR_WIDTH_RES_NAME);
}
}
return result;
}
private int getInternalDimensionSize(Resources res, String key) {
int result = 0;
int resourceId = res.getIdentifier(key, "dimen", "android");
if (resourceId > 0) {
result = res.getDimensionPixelSize(resourceId);
}
return result;
}
@SuppressLint("NewApi")
private float getSmallestWidthDp(Activity activity) {
DisplayMetrics metrics = new DisplayMetrics();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
} else {
// TODO this is not correct, but we don't really care pre-kitkat
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
}
float widthDp = metrics.widthPixels / metrics.density;
float heightDp = metrics.heightPixels / metrics.density;
return Math.min(widthDp, heightDp);
}
/**
* Should a navigation bar appear at the bottom of the screen in the current
* device configuration? A navigation bar may appear on the right side of
* the screen in certain configurations.
*
* @return True if navigation should appear at the bottom of the screen, False otherwise.
*/
public boolean isNavigationAtBottom() {
return (mSmallestWidthDp > 600 || mInPortrait);
}
/**
* Get the height of the system status bar.
*
* @return The height of the status bar (in pixels).
*/
public int getStatusBarHeight() {
return mStatusBarHeight;
}
/**
* Get the height of the action bar.
*
* @return The height of the action bar (in pixels).
*/
public int getActionBarHeight() {
return mActionBarHeight;
}
/**
* Does this device have a system navigation bar?
*
* @return True if this device uses soft key navigation, False otherwise.
*/
public boolean hasNavigationBar() {
return mHasNavigationBar;
}
/**
* Get the height of the system navigation bar.
*
* @return The height of the navigation bar (in pixels). If the device does not have
* soft navigation keys, this will always return 0.
*/
public int getNavigationBarHeight() {
return mNavigationBarHeight;
}
/**
* Get the width of the system navigation bar when it is placed vertically on the screen.
*
* @return The width of the navigation bar (in pixels). If the device does not have
* soft navigation keys, this will always return 0.
*/
public int getNavigationBarWidth() {
return mNavigationBarWidth;
}
/**
* Get the layout inset for any system UI that appears at the top of the screen.
*
* @param withActionBar True to include the height of the action bar, False otherwise.
* @return The layout inset (in pixels).
*/
public int getPixelInsetTop(boolean withActionBar) {
return (mTranslucentStatusBar ? mStatusBarHeight : 0) + (withActionBar ? mActionBarHeight : 0);
}
/**
* Get the layout inset for any system UI that appears at the bottom of the screen.
*
* @return The layout inset (in pixels).
*/
public int getPixelInsetBottom() {
if (mTranslucentNavBar && isNavigationAtBottom()) {
return mNavigationBarHeight;
} else {
return 0;
}
}
/**
* Get the layout inset for any system UI that appears at the right of the screen.
*
* @return The layout inset (in pixels).
*/
public int getPixelInsetRight() {
if (mTranslucentNavBar && !isNavigationAtBottom()) {
return mNavigationBarWidth;
} else {
return 0;
}
}
}
}
================================================
FILE: modules/app/src/main/res/anim/elevation_transition.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:state_pressed="true">
<objectAnimator
android:duration="@android:integer/config_shortAnimTime"
android:propertyName="translationZ"
android:valueTo="@dimen/elevation_pressed"
android:valueType="floatType" />
</item>
<item>
<objectAnimator
android:duration="@android:integer/config_shortAnimTime"
android:propertyName="translationZ"
android:valueTo="@dimen/elevation_default"
android:valueType="floatType" />
</item>
</selector>
================================================
FILE: modules/app/src/main/res/anim/grid_cards_layout_animation.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<gridLayoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@integer/anim_duration_normal"
android:animation="@anim/slide_in_bottom"
android:animationOrder="normal"
android:columnDelay="15%"
android:rowDelay="15%"
android:direction="top_to_bottom|left_to_right"/>
================================================
FILE: modules/app/src/main/res/anim/list_slide_in_bottom_animation.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<gridLayoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@integer/anim_duration_normal"
android:animation="@anim/slide_in_bottom"
android:animationOrder="normal"
android:columnDelay="15%"
android:rowDelay="15%"
android:direction="top_to_bottom|left_to_right"/>
================================================
FILE: modules/app/src/main/res/anim/slide_in_bottom.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator"
android:fromYDelta="100%p" android:toYDelta="0"
android:duration="@integer/anim_duration_normal"/>
================================================
FILE: modules/app/src/main/res/color/wizard_text_button.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="@color/wizard_text_button_off"/>
<item android:color="@color/wizard_text_button_on"/>
</selector>
================================================
FILE: modules/app/src/main/res/drawable/background_icon_collection_detail.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/background_icon_collection_detail"/>
</shape>
================================================
FILE: modules/app/src/main/res/drawable/background_title_fab_menu_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/background_title_fab_menu_item_pressed"/>
<item android:drawable="@drawable/background_title_fab_menu_item_default"/>
</selector>
================================================
FILE: modules/app/src/main/res/drawable/background_title_fab_menu_item_default.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/radius_default" />
<solid android:color="@color/collection_fab_button_item_title_background_default"/>
</shape>
================================================
FILE: modules/app/src/main/res/drawable/background_title_fab_menu_item_pressed.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/radius_default" />
<solid android:color="@color/collection_fab_button_item_title_background_pressed"/>
</shape>
================================================
FILE: modules/app/src/main/res/drawable/drawer_pager.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true"
android:drawable="@drawable/drawer_pager_current"/>
<item android:drawable="@drawable/drawer_pager_default"/>
</selector>
================================================
FILE: modules/app/src/main/res/drawable/drawer_pager_current.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/drawer_pager_current" />
</shape>
================================================
FILE: modules/app/src/main/res/drawable/drawer_pager_default.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/drawer_pager_default" />
</shape>
================================================
FILE: modules/app/src/main/res/drawable/fastscroller_bar.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/primary" />
<size
android:height="@dimen/fastscroller_bar_height"
android:width="@dimen/fastscroller_bar_width" />
</shape>
================================================
FILE: modules/app/src/main/res/drawable/fastscroller_signal.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:topLeftRadius="@dimen/fastscroller_signal_size"
android:topRightRadius="@dimen/fastscroller_signal_size"
android:bottomLeftRadius="@dimen/fastscroller_signal_size"
android:bottomRightRadius="0dp" />
<solid android:color="@color/accent" />
<size
android:height="@dimen/fastscroller_signal_size"
android:width="@dimen/fastscroller_signal_size" />
</shape>
================================================
FILE: modules/app/src/main/res/drawable/mark_widget_resizing.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="@color/stroke_widget_selected"/>
</shape>
================================================
FILE: modules/app/src/main/res/drawable/publish_collection_wizard_pager.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/publish_collection_wizard_pager_current"/>
</selector>
================================================
FILE: modules/app/src/main/res/drawable/publish_collection_wizard_pager_current.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/publish_collection_wizard_pager_current" />
</shape>
================================================
FILE: modules/app/src/main/res/drawable/stroke_widget_selected.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:color="@color/stroke_widget_selected"
android:width="@dimen/stroke_thin"/>
</shape>
================================================
FILE: modules/app/src/main/res/drawable/wizard_inline_pager.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true"
android:drawable="@drawable/wizard_inline_pager_current"/>
<item android:drawable="@drawable/wizard_inline_pager_default"/>
</selector>
================================================
FILE: modules/app/src/main/res/drawable/wizard_inline_pager_current.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/wizard_inline_pager_current" />
</shape>
================================================
FILE: modules/app/src/main/res/drawable/wizard_inline_pager_default.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/wizard_inline_pager_default" />
</shape>
================================================
FILE: modules/app/src/main/res/drawable/wizard_pager.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true"
android:drawable="@drawable/wizard_pager_current"/>
<item android:drawable="@drawable/wizard_pager_default"/>
</selector>
================================================
FILE: modules/app/src/main/res/drawable/wizard_pager_current.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/wizard_pager_current" />
</shape>
================================================
FILE: modules/app/src/main/res/drawable/wizard_pager_default.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/wizard_pager_default" />
</shape>
================================================
FILE: modules/app/src/main/res/drawable/workspaces_pager.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true"
android:drawable="@drawable/ic_pageindicator_current"/>
<item android:drawable="@drawable/ic_pageindicator_default"/>
</selector>
================================================
FILE: modules/app/src/main/res/layout/about_header_preference.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/AboutHeaderPreferenceRoot">
<ImageView
style="@style/AboutHeaderPreferenceLogo"/>
<TextView
style="@style/AboutHeaderPreferenceName"/>
<TextView
android:id="@+id/preference_about_name"
style="@style/AboutHeaderPreferenceVersion"/>
<TextView
style="@style/AboutHeaderPreferenceText"/>
<TextView
android:id="@+id/preference_about_github"
style="@style/AboutHeaderPreferenceGitHub"/>
</LinearLayout>
================================================
FILE: modules/app/src/main/res/layout/about_team_preference.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/AboutTeamPreferenceRoot">
<LinearLayout
android:id="@+id/preference_about_team"
style="@style/AboutTeamPreferenceContent" />
</HorizontalScrollView>
================================================
FILE: modules/app/src/main/res/layout/add_moment_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/AddMomentRoot">
<cards.nine.app.ui.components.widgets.TintableImageView
android:id="@+id/add_moment_icon"
style="@style/AddMomentIcon"/>
<LinearLayout style="@style/AddMomentTextContent">
<TextView
android:id="@+id/add_moment_name"
style="@style/AddMomentName"/>
<TextView
android:id="@+id/add_moment_description"
style="@style/AddMomentDescription"/>
</LinearLayout>
</LinearLayout>
================================================
FILE: modules/app/src/main/res/layout/app_drawer_layout.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/launcher_drawer_content"
style="@style/LauncherDrawerParent">
<cards.nine.app.ui.components.layouts.SearchBoxView
style="@style/LauncherDrawerContent"
android:id="@+id/launcher_search_box_content" />
<cards.nine.app.ui.components.layouts.FastScrollerLayout
android:id="@+id/launcher_drawer_scroller_layout"
style="@style/LauncherDrawerInnerContent">
<TextView
android:id="@+id/launcher_drawer_message"
style="@style/LauncherDrawerMessage" />
<cards.nine.app.ui.components.layouts.PullToTabsView
android:id="@+id/launcher_drawer_pull_to_tabs"
style="@style/PullToTabsContent">
<cards.nine.app.ui.components.widgets.DrawerRecyclerView
android:id="@+id/launcher_drawer_recycler"
style="@style/PullToTabsRecycler"/>
</cards.nine.app.ui.components.layouts.PullToTabsView>
<LinearLayout
android:id="@+id/launcher_drawer_tabs"
style="@style/PullToTabsItem"/>
</cards.nine.app.ui.components.layouts.FastScrollerLayout>
</LinearLayout>
================================================
FILE: modules/app/src/main/res/layout/app_drawer_panel.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/LauncherDrawerRoot">
<FrameLayout
style="@style/LauncherDrawerContentItem">
<cards.nine.app.ui.components.widgets.TintableImageView
style="@style/LauncherDrawerItem"
android:id="@+id/launcher_page_1"/>
</FrameLayout>
<FrameLayout
style="@style/LauncherDrawerContentItem">
<cards.nine.app.ui.components.widgets.TintableImageView
style="@style/LauncherDrawerItem"
android:id="@+id/launcher_page_2"/>
</FrameLayout>
<FrameLayout
style="@style/LauncherDrawerContentItem">
<cards.nine.app.ui.components.widgets.TintableImageView
style="@style/LauncherDrawerAppsItem"
android:id="@+id/launcher_app_drawer"/>
</FrameLayout>
<FrameLayout
style="@style/LauncherDrawerContentItem">
<cards.nine.app.ui.components.widgets.TintableImageView
style="@style/LauncherDrawerItem"
android:id="@+id/launcher_page_3"/>
</FrameLayout>
<FrameLayout
style="@style/LauncherDrawerContentItem">
<cards.nine.app.ui.components.widgets.TintableImageView
style="@style/LauncherDrawerItem"
android:id="@+id/launcher_page_4"/>
</FrameLayout>
</LinearLayout>
================================================
FILE: modules/app/src/main/res/layout/app_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/AppItemRoot">
<ImageView
android:id="@+id/simple_item_icon"
style="@style/AppItemIcon"/>
<TextView
android:id="@+id/simple_item_name"
style="@style/AppItemName"/>
</LinearLayout>
================================================
FILE: modules/app/src/main/res/layout/app_link_dialog_activity.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/app_link_root"
style="@style/AppLinkDialogRoot">
<LinearLayout
android:id="@+id/app_link_loading_layout"
style="@style/AppLinkLoadingLayout">
<ProgressBar
android:id="@+id/app_link_loading"
style="@style/AppLinkLoading"/>
<TextView
android:id="@+id/app_link_loading_text"
style="@style/AppLinkLoadingText"/>
</LinearLayout>
<FrameLayout
android:id="@+id/app_link_collection"
style="@style/AppLinkCollectionLayout">
<include
layout="@layout/public_collections_item"/>
</FrameLayout>
</FrameLayout>
================================================
FILE: modules/app/src/main/res/layout/app_select_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/AppItemRoot">
<FrameLayout
android:id="@+id/app_item_background"
style="@style/AppItemBackground">
<LinearLayout
android:id="@+id/app_item_content"
style="@style/AppItemContent">
<ImageView
android:id="@+id/simple_item_icon"
style="@style/AppItemIcon"/>
<TextView
android:id="@+id/simple_item_name"
style="@style/AppItemName"/>
</LinearLayout>
</FrameLayout>
<FrameLayout
android:id="@+id/app_selected_content"
style="@style/AppSelectedContent">
<ImageView
android:id="@+id/app_selected"
style="@style/AppSelected" />
</FrameLayout>
</FrameLayout>
================================================
FILE: modules/app/src/main/res/layout/apps_moment_layout.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/MenuAppsMomentContent">
<FrameLayout
style="@style/MenuAppsMomentIconContent"
android:id="@+id/moment_bar_icon_content">
<ImageView
style="@style/MenuAppsMomentIcon"
android:id="@+id/moment_bar_icon"/>
</FrameLayout>
<ScrollView style="@style/MenuAppsMomentScroll">
<LinearLayout
style="@style/MenuAppsMomentApps"
android:id="@+id/moment_bar_apps"/>
</ScrollView>
</LinearLayout>
================================================
FILE: modules/app/src/main/res/layout/base_action_fragment.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/BaseActionsRoot">
<LinearLayout
android:id="@+id/action_content_root"
style="@style/BaseActionsContent">
<cards.nine.app.ui.components.layouts.DialogToolbar
android:id="@+id/actions_toolbar"
style="@style/BaseActionsToolbarDialog"/>
<FrameLayout
style="@style/BaseActionsContentRoot">
<LinearLayout
android:id="@+id/action_loading"
style="@style/BaseActionsLoadingContent">
<TextView
android:id="@+id/action_loading_text"
style="@style/BaseActionsLoadingText"/>
<ProgressBar
android:id="@+id/action_loading_bar"
style="@style/BaseActionsLoading"/>
</LinearLayout>
<FrameLayout
android:id="@+id/action_content_layout"
style="@style/BaseActionsContentLayout"/>
<LinearLayout
android:id="@+id/actions_content_error_layout"
style="@style/BaseActionsErrorContent">
<cards.nine.app.ui.components.widgets.TintableImageView
android:id="@+id/actions_content_error_icon"
style="@style/BaseActionsErrorIcon"/>
<TextView
android:id="@+id/actions_content_error_message"
style="@style/BaseActionsErrorMessage"/>
<android.support.v7.widget.AppCompatButton
android:id="@+id/actions_content_error_button"
style="@style/BaseActionsErrorButton"/>
</LinearLayout>
</FrameLayout>
</LinearLayout>
<android.support.design.widget.FloatingActionButton
style="@style/BaseActionsFabButton"
android:id="@+id/action_content_fab"/>
</FrameLayout>
================================================
FILE: modules/app/src/main/res/layout/card_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/CardRoot">
<LinearLayout
style="@style/CardContent">
<FrameLayout
android:id="@+id/card_icon_content"
style="@style/CardIconContent">
<cards.nine.app.ui.components.widgets.TintableImageView
android:id="@+id/card_icon"
style="@style/CardIcon"/>
</FrameLayout>
<TextView
android:id="@+id/card_text"
style="@style/CardText"/>
</LinearLayout>
<ImageView
android:id="@+id/card_selected"
style="@style/CardSelected"/>
<ImageView
android:id="@+id/card_badge"
style="@style/CardBadge"/>
</android.support.v7.widget.CardView>
================================================
FILE: modules/app/src/main/res/layout/collection_bar_view_panel.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/LauncherCollectionsContent">
<LinearLayout
style="@style/LauncherCollectionsPanel"
android:id="@+id/launcher_search_panel">
<ImageView
style="@style/LauncherCollectionsBurgerButton"
android:id="@+id/launcher_burger_icon"/>
<cards.nine.app.ui.components.widgets.TintableImageView
style="@style/LauncherCollectionsGoogleButton"
android:id="@+id/launcher_google_icon"/>
<cards.nine.app.ui.components.widgets.TintableImageView
style="@style/LauncherCollectionsMicButton"
android:id="@+id/launcher_mic_icon"/>
</LinearLayout>
</FrameLayout>
================================================
FILE: modules/app/src/main/res/layout/collection_checkbox.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/collection_check_content"
style="@style/SubscriptionsCollectionCheckBox">
<ImageView
android:id="@+id/collection_icon"
style="@style/SubscriptionsItemIcon"/>
<FrameLayout
android:id="@+id/subscriptions_item_content"
style="@style/SubscriptionsCollectionCheckBoxIconContent">
<ImageView
android:id="@+id/collection_checkbox_icon"
style="@style/SubscriptionsItemCheckboxIcon"/>
</FrameLayout>
</FrameLayout>
================================================
FILE: modules/app/src/main/res/layout/collection_detail_fragment.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/collection_detail_layout"
style="@style/CollectionDetailLayout">
<android.support.v7.widget.CardView
android:id="@+id/collection_detail_empty"
style="@style/CollectionDetailEmpty">
<LinearLayout
android:id="@+id/collection_detail_empty_content"
style="@style/CollectionDetailEmptyContent">
<TextView
android:id="@+id/collection_empty_message"
style="@style/CollectionEmptyMessage"/>
<cards.nine.app.ui.components.widgets.TintableImageView
android:id="@+id/collection_empty_image"
style="@style/CollectionEmptyImage"/>
</LinearLayout>
</android.support.v7.widget.CardView>
<cards.nine.app.ui.components.layouts.PullToCloseView
android:id="@+id/collection_detail_pull_to_close"
style="@style/CollectionDetailPullToClose">
<cards.nine.app.ui.components.widgets.CollectionRecyclerView
android:id="@+id/collection_detail_recycler"
style="@style/CollectionDetailView"/>
</cards.nine.app.ui.components.layouts.PullToCloseView>
</FrameLayout>
================================================
FILE: modules/app/src/main/res/layout/collection_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/LauncherCollectionItemRoot">
<LinearLayout
android:id="@+id/launcher_collection_item_layout"
style="@style/LauncherCollectionItemLayout">
<FrameLayout
android:id="@+id/launcher_collection_item_icon_root"
style="@style/LauncherCollectionItemIconRoot">
<ImageView
android:id="@+id/launcher_collection_item_icon"
style="@style/LauncherCollectionItemIcon"/>
</FrameLayout>
<TextView
android:id="@+id/launcher_collection_item_name"
style="@style/LauncherCollectionItemName"/>
</LinearLayout>
</FrameLayout>
================================================
FILE: modules/app/src/main/res/layout/collections_actions_view_panel.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/LauncherCollectionActionsRoot">
<FrameLayout
android:id="@+id/launcher_collections_content_1"
style="@style/LauncherCollectionActionLayout">
<cards.nine.app.ui.components.widgets.TintableButton
style="@style/LauncherCollectionAction"
android:id="@+id/launcher_collections_action_1"/>
</FrameLayout>
<FrameLayout
android:id="@+id/launcher_collections_content_2"
style="@style/LauncherCollectionActionLayout">
<cards.nine.app.ui.components.widgets.TintableButton
style="@style/LauncherCollectionAction"
android:id="@+id/launcher_collections_action_2"/>
</FrameLayout>
</LinearLayout>
================================================
FILE: modules/app/src/main/res/layout/collections_detail_activity.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/collections_root"
style="@style/CollectionsRoot">
<android.support.v4.view.ViewPager
style="@style/CollectionsPager"
android:id="@+id/collections_view_pager"/>
<android.support.v7.widget.Toolbar
android:id="@+id/collections_toolbar"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
style="@style/CollectionsToolbar">
<TextView
android:id="@+id/collections_toolbar_title"
style="@style/CollectionsToolbarTitle" />
</android.support.v7.widget.Toolbar>
<FrameLayout
android:id="@+id/collections_icon_content"
style="@style/CollectionsIconContent">
<ImageView
android:id="@+id/collections_icon"
style="@style/CollectionsIcon"/>
</FrameLayout>
<cards.nine.app.ui.components.layouts.SlidingTabLayout
android:id="@+id/collections_tabs"
style="@style/CollectionsTabs"/>
<FrameLayout
android:id="@+id/fab_menu_content"
style="@style/CollectionsFabMenuContent">
<LinearLayout
android:id="@+id/fab_menu"
style="@style/FabMenu">
<android.support.design.widget.FloatingActionButton
style="@style/CollectionsFabButton"
android:id="@+id/fab_button"/>
</LinearLayout>
</FrameLayout>
</FrameLayout>
================================================
FILE: modules/app/src/main/res/layout/collections_detail_tab.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<TextView style="@style/CollectionsTab" />
================================================
FILE: modules/app/src/main/res/layout/collections_workspace_layout.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/LauncherCollectionsRoot">
<GridLayout
android:id="@+id/launcher_collections_grid"
style="@style/LauncherCollectionsGrid"/>
</FrameLayout>
================================================
FILE: modules/app/src/main/res/layout/color_info_item_dialog.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/DialogColorInfoRoot">
<ImageView
android:id="@+id/color_info_image"
style="@style/DialogColorInfoImage"/>
</FrameLayout>
================================================
FILE: modules/app/src/main/res/layout/contact_info_email_dialog.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/DialogContactInfoRoot">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/DialogContactInfoEmailContent"
android:id="@+id/contact_dialog_email_content">
<cards.nine.app.ui.components.widgets.TintableImageView
style="@style/DialogContactInfoEmailIcon"
android:id="@+id/contact_dialog_email_icon"/>
<LinearLayout style="@style/DialogContactInfoEmailContentValues">
<TextView
style="@style/DialogContactInfoValue"
android:id="@+id/contact_dialog_email_address"/>
<TextView
style="@style/DialogContactInfoCategory"
android:id="@+id/contact_dialog_email_category"/>
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/contact_dialog_email_line"
style="@style/DialogContactInfoLineHorizontal"/>
</FrameLayout>
================================================
FILE: modules/app/src/main/res/layout/contact_info_general_dialog.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/DialogContactInfoRoot">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/DialogContactInfoGeneralContent"
android:id="@+id/contact_dialog_general_content">
<FrameLayout style="@style/DialogContactInfoContentGeneralIcon">
<ImageView
style="@style/DialogContactInfoGeneralIcon"
android:id="@+id/contact_dialog_general_icon"/>
</FrameLayout>
<LinearLayout style="@style/DialogContactInfoGeneralContentValues">
<TextView
style="@style/DialogContactInfoValue"
android:id="@+id/contact_dialog_general_info"/>
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/contact_dialog_general_line"
style="@style/DialogContactInfoLineHorizontal"/>
</FrameLayout>
================================================
FILE: modules/app/src/main/res/layout/contact_info_header.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/ContactInfoHeaderRoot">
<ImageView
android:id="@+id/contact_info_header_avatar"
style="@style/ContactInfoHeaderAvatar"/>
<LinearLayout
style="@style/ContactInfoHeaderContent"
android:id="@+id/contact_info_header">
<TextView
android:id="@+id/contact_info_header_name"
style="@style/ContactInfoHeaderName"/>
</LinearLayout>
</FrameLayout>
================================================
FILE: modules/app/src/main/res/layout/contact_info_phone_dialog.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/DialogContactInfoRoot">
<LinearLayout
style="@style/DialogContactInfoContentValues">
<LinearLayout
style="@style/DialogContactInfoPhoneContent"
android:id="@+id/contact_dialog_phone_content">
gitextract_ztr7dq7x/ ├── .gitignore ├── .scalafmt.conf ├── .travis.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE.md ├── LICENSE ├── PULL_REQUEST_TEMPLATE.md ├── README.md ├── README_old.md ├── codecov.yml ├── modules/ │ ├── api/ │ │ ├── build.sbt │ │ └── src/ │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── res/ │ │ │ │ └── values/ │ │ │ │ └── strings.xml │ │ │ └── scala/ │ │ │ └── cards/ │ │ │ └── nine/ │ │ │ └── api/ │ │ │ ├── rest/ │ │ │ │ └── client/ │ │ │ │ ├── Exceptions.scala │ │ │ │ ├── ServiceClient.scala │ │ │ │ ├── http/ │ │ │ │ │ ├── Exceptions.scala │ │ │ │ │ ├── HttpClient.scala │ │ │ │ │ ├── HttpClientResponse.scala │ │ │ │ │ └── OkHttpClient.scala │ │ │ │ └── messages/ │ │ │ │ └── Messages.scala │ │ │ ├── version1/ │ │ │ │ ├── ApiService.scala │ │ │ │ ├── JsonImplicits.scala │ │ │ │ └── Model.scala │ │ │ └── version2/ │ │ │ ├── ApiService.scala │ │ │ ├── JsonImplicits.scala │ │ │ └── Model.scala │ │ └── test/ │ │ └── scala/ │ │ ├── cards/ │ │ │ └── nine/ │ │ │ └── api/ │ │ │ ├── rest/ │ │ │ │ └── client/ │ │ │ │ ├── Messages.scala │ │ │ │ ├── ServiceClientData.scala │ │ │ │ ├── ServiceClientSpec.scala │ │ │ │ └── http/ │ │ │ │ └── OkHttpClientSpec.scala │ │ │ ├── version1/ │ │ │ │ ├── ApiServiceData.scala │ │ │ │ └── ApiServiceSpec.scala │ │ │ └── version2/ │ │ │ ├── ApiServiceData.scala │ │ │ └── ApiServiceSpec.scala │ │ └── com/ │ │ └── fortysevendeg/ │ │ └── BaseTestSupport.scala │ ├── app/ │ │ ├── build.sbt │ │ ├── crashlytics/ │ │ │ └── templates/ │ │ │ └── CrashlyticsManifest.xml │ │ ├── project/ │ │ │ └── plugins.sbt │ │ └── src/ │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── java/ │ │ │ │ └── cards/ │ │ │ │ └── nine/ │ │ │ │ └── utils/ │ │ │ │ └── SystemBarTintManager.java │ │ │ ├── res/ │ │ │ │ ├── anim/ │ │ │ │ │ ├── elevation_transition.xml │ │ │ │ │ ├── grid_cards_layout_animation.xml │ │ │ │ │ ├── list_slide_in_bottom_animation.xml │ │ │ │ │ └── slide_in_bottom.xml │ │ │ │ ├── color/ │ │ │ │ │ └── wizard_text_button.xml │ │ │ │ ├── drawable/ │ │ │ │ │ ├── background_icon_collection_detail.xml │ │ │ │ │ ├── background_title_fab_menu_item.xml │ │ │ │ │ ├── background_title_fab_menu_item_default.xml │ │ │ │ │ ├── background_title_fab_menu_item_pressed.xml │ │ │ │ │ ├── drawer_pager.xml │ │ │ │ │ ├── drawer_pager_current.xml │ │ │ │ │ ├── drawer_pager_default.xml │ │ │ │ │ ├── fastscroller_bar.xml │ │ │ │ │ ├── fastscroller_signal.xml │ │ │ │ │ ├── mark_widget_resizing.xml │ │ │ │ │ ├── publish_collection_wizard_pager.xml │ │ │ │ │ ├── publish_collection_wizard_pager_current.xml │ │ │ │ │ ├── stroke_widget_selected.xml │ │ │ │ │ ├── wizard_inline_pager.xml │ │ │ │ │ ├── wizard_inline_pager_current.xml │ │ │ │ │ ├── wizard_inline_pager_default.xml │ │ │ │ │ ├── wizard_pager.xml │ │ │ │ │ ├── wizard_pager_current.xml │ │ │ │ │ ├── wizard_pager_default.xml │ │ │ │ │ └── workspaces_pager.xml │ │ │ │ ├── layout/ │ │ │ │ │ ├── about_header_preference.xml │ │ │ │ │ ├── about_team_preference.xml │ │ │ │ │ ├── add_moment_item.xml │ │ │ │ │ ├── app_drawer_layout.xml │ │ │ │ │ ├── app_drawer_panel.xml │ │ │ │ │ ├── app_item.xml │ │ │ │ │ ├── app_link_dialog_activity.xml │ │ │ │ │ ├── app_select_item.xml │ │ │ │ │ ├── apps_moment_layout.xml │ │ │ │ │ ├── base_action_fragment.xml │ │ │ │ │ ├── card_item.xml │ │ │ │ │ ├── collection_bar_view_panel.xml │ │ │ │ │ ├── collection_checkbox.xml │ │ │ │ │ ├── collection_detail_fragment.xml │ │ │ │ │ ├── collection_item.xml │ │ │ │ │ ├── collections_actions_view_panel.xml │ │ │ │ │ ├── collections_detail_activity.xml │ │ │ │ │ ├── collections_detail_tab.xml │ │ │ │ │ ├── collections_workspace_layout.xml │ │ │ │ │ ├── color_info_item_dialog.xml │ │ │ │ │ ├── contact_info_email_dialog.xml │ │ │ │ │ ├── contact_info_general_dialog.xml │ │ │ │ │ ├── contact_info_header.xml │ │ │ │ │ ├── contact_info_phone_dialog.xml │ │ │ │ │ ├── contact_item.xml │ │ │ │ │ ├── dialog_edit_card.xml │ │ │ │ │ ├── dialog_edit_text.xml │ │ │ │ │ ├── edit_moment.xml │ │ │ │ │ ├── edit_moment_hour_layout.xml │ │ │ │ │ ├── edit_moment_wifi_layout.xml │ │ │ │ │ ├── empty_profile_item.xml │ │ │ │ │ ├── fab_item.xml │ │ │ │ │ ├── fastscroller.xml │ │ │ │ │ ├── header_list_item.xml │ │ │ │ │ ├── icon_info_item_dialog.xml │ │ │ │ │ ├── last_call_item.xml │ │ │ │ │ ├── launcher_activity.xml │ │ │ │ │ ├── list_action_apps_fragment.xml │ │ │ │ │ ├── list_action_fragment.xml │ │ │ │ │ ├── list_action_with_scroller_fragment.xml │ │ │ │ │ ├── list_item_popup_menu.xml │ │ │ │ │ ├── menu_header.xml │ │ │ │ │ ├── moment_bar_view_panel.xml │ │ │ │ │ ├── new_collection.xml │ │ │ │ │ ├── private_collections_item.xml │ │ │ │ │ ├── profile_account_item.xml │ │ │ │ │ ├── profile_account_item_header.xml │ │ │ │ │ ├── profile_activity.xml │ │ │ │ │ ├── profile_subscription_item.xml │ │ │ │ │ ├── public_collections_item.xml │ │ │ │ │ ├── publish_collection_wizard.xml │ │ │ │ │ ├── recommendations_item.xml │ │ │ │ │ ├── search_box_panel.xml │ │ │ │ │ ├── search_item.xml │ │ │ │ │ ├── select_collection_dialog.xml │ │ │ │ │ ├── select_collection_item.xml │ │ │ │ │ ├── select_moment_dialog.xml │ │ │ │ │ ├── select_moment_item.xml │ │ │ │ │ ├── shortcut_item.xml │ │ │ │ │ ├── swipe_animation_drawer_layout.xml │ │ │ │ │ ├── tab_item.xml │ │ │ │ │ ├── toolbar_dialog.xml │ │ │ │ │ ├── widget_item.xml │ │ │ │ │ ├── widgets_action_fragment.xml │ │ │ │ │ ├── wizard_activity.xml │ │ │ │ │ ├── wizard_checkbox.xml │ │ │ │ │ ├── wizard_inline.xml │ │ │ │ │ ├── wizard_inline_step.xml │ │ │ │ │ ├── wizard_moment_checkbox.xml │ │ │ │ │ ├── wizard_new_conf_step_0.xml │ │ │ │ │ ├── wizard_new_conf_step_1.xml │ │ │ │ │ ├── wizard_new_conf_step_2.xml │ │ │ │ │ ├── wizard_new_conf_step_3.xml │ │ │ │ │ ├── wizard_new_conf_step_4.xml │ │ │ │ │ ├── wizard_new_conf_step_5.xml │ │ │ │ │ ├── wizard_step.xml │ │ │ │ │ ├── wizard_wifi_checkbox.xml │ │ │ │ │ ├── workspace_button.xml │ │ │ │ │ ├── workspace_item_menu.xml │ │ │ │ │ └── workspace_menu_layout.xml │ │ │ │ ├── menu/ │ │ │ │ │ ├── app_menu.xml │ │ │ │ │ ├── collection_detail_menu.xml │ │ │ │ │ ├── collection_edit_menu.xml │ │ │ │ │ └── profile_menu.xml │ │ │ │ ├── values/ │ │ │ │ │ ├── arrays.xml │ │ │ │ │ ├── colors.xml │ │ │ │ │ ├── config.xml │ │ │ │ │ ├── dimens.xml │ │ │ │ │ ├── ids.xml │ │ │ │ │ ├── strings.xml │ │ │ │ │ ├── styles_actions.xml │ │ │ │ │ ├── styles_cards.xml │ │ │ │ │ ├── styles_collections.xml │ │ │ │ │ ├── styles_dialogs.xml │ │ │ │ │ ├── styles_drawer.xml │ │ │ │ │ ├── styles_fast_scroller.xml │ │ │ │ │ ├── styles_items.xml │ │ │ │ │ ├── styles_launcher.xml │ │ │ │ │ ├── styles_menu.xml │ │ │ │ │ ├── styles_menu_items.xml │ │ │ │ │ ├── styles_preferences.xml │ │ │ │ │ ├── styles_profile.xml │ │ │ │ │ ├── styles_pull_to_tabs.xml │ │ │ │ │ ├── styles_wizard.xml │ │ │ │ │ └── themes.xml │ │ │ │ ├── values-es/ │ │ │ │ │ ├── arrays.xml │ │ │ │ │ └── strings.xml │ │ │ │ ├── values-sw400dp/ │ │ │ │ │ ├── dimens.xml │ │ │ │ │ └── strings.xml │ │ │ │ ├── values-sw600dp/ │ │ │ │ │ ├── dimens.xml │ │ │ │ │ └── strings.xml │ │ │ │ ├── values-v17/ │ │ │ │ │ └── dimens.xml │ │ │ │ ├── values-v19/ │ │ │ │ │ └── themes.xml │ │ │ │ ├── values-v21/ │ │ │ │ │ ├── colors.xml │ │ │ │ │ ├── dimens.xml │ │ │ │ │ ├── styles_actions.xml │ │ │ │ │ ├── styles_collections.xml │ │ │ │ │ ├── styles_fast_scroller.xml │ │ │ │ │ ├── styles_profile.xml │ │ │ │ │ └── themes.xml │ │ │ │ └── xml/ │ │ │ │ ├── preferences_about.xml │ │ │ │ ├── preferences_analytics.xml │ │ │ │ ├── preferences_animations.xml │ │ │ │ ├── preferences_app_drawer.xml │ │ │ │ ├── preferences_apps_list.xml │ │ │ │ ├── preferences_dev.xml │ │ │ │ ├── preferences_devs_headers.xml │ │ │ │ ├── preferences_headers.xml │ │ │ │ ├── preferences_lookfeel.xml │ │ │ │ └── preferences_moments.xml │ │ │ └── scala/ │ │ │ └── cards/ │ │ │ └── nine/ │ │ │ ├── app/ │ │ │ │ ├── NineCardsApplication.scala │ │ │ │ ├── commons/ │ │ │ │ │ ├── BroadcastDispatcher.scala │ │ │ │ │ ├── ContextSupportPreferences.scala │ │ │ │ │ ├── ContextSupportProvider.scala │ │ │ │ │ └── Conversions.scala │ │ │ │ ├── di/ │ │ │ │ │ └── Injector.scala │ │ │ │ ├── observers/ │ │ │ │ │ ├── NineCardsObserver.scala │ │ │ │ │ └── ObserverRegister.scala │ │ │ │ ├── permissions/ │ │ │ │ │ ├── PermissionChecker.scala │ │ │ │ │ └── PermissionCheckerException.scala │ │ │ │ ├── receivers/ │ │ │ │ │ ├── apps/ │ │ │ │ │ │ ├── AppBroadcastJobs.scala │ │ │ │ │ │ └── AppBroadcastReceiver.scala │ │ │ │ │ ├── bluetooth/ │ │ │ │ │ │ ├── BluetoothJobs.scala │ │ │ │ │ │ └── BluetoothReceiver.scala │ │ │ │ │ ├── moments/ │ │ │ │ │ │ ├── ConnectionStatusChangedJobs.scala │ │ │ │ │ │ └── MomentBroadcastReceiver.scala │ │ │ │ │ └── shortcuts/ │ │ │ │ │ ├── ShortcutBroadcastJobs.scala │ │ │ │ │ └── ShortcutBroadcastReceiver.scala │ │ │ │ ├── services/ │ │ │ │ │ ├── NineCardsFirebaseInstanceIdService.scala │ │ │ │ │ ├── NineCardsFirebaseJobs.scala │ │ │ │ │ ├── NineCardsFirebaseMessagingService.scala │ │ │ │ │ ├── sharedcollections/ │ │ │ │ │ │ ├── UpdateSharedCollectionJobs.scala │ │ │ │ │ │ ├── UpdateSharedCollectionService.scala │ │ │ │ │ │ └── UpdateSharedCollectionUiActions.scala │ │ │ │ │ └── sync/ │ │ │ │ │ ├── SynchronizeDeviceService.scala │ │ │ │ │ └── SynchronizeDeviceServiceJobs.scala │ │ │ │ └── ui/ │ │ │ │ ├── applinks/ │ │ │ │ │ ├── AppLinksReceiverActivity.scala │ │ │ │ │ ├── AppLinksReceiverJobs.scala │ │ │ │ │ └── AppLinksReceiverUiActions.scala │ │ │ │ ├── collections/ │ │ │ │ │ ├── CollectionAdapter.scala │ │ │ │ │ ├── CollectionFragment.scala │ │ │ │ │ ├── CollectionsDetailsActivity.scala │ │ │ │ │ ├── CollectionsPagerAdapter.scala │ │ │ │ │ ├── dialog/ │ │ │ │ │ │ ├── EditCardDialogFragment.scala │ │ │ │ │ │ └── publishcollection/ │ │ │ │ │ │ ├── PublishCollectionActions.scala │ │ │ │ │ │ ├── PublishCollectionDOM.scala │ │ │ │ │ │ ├── PublishCollectionFragment.scala │ │ │ │ │ │ ├── PublishCollectionJobs.scala │ │ │ │ │ │ └── PublishCollectionStyles.scala │ │ │ │ │ ├── jobs/ │ │ │ │ │ │ ├── GroupCollectionsJobs.scala │ │ │ │ │ │ ├── NavigationJobs.scala │ │ │ │ │ │ ├── SharedCollectionJobs.scala │ │ │ │ │ │ ├── SingleCollectionJobs.scala │ │ │ │ │ │ ├── ToolbarJobs.scala │ │ │ │ │ │ └── uiactions/ │ │ │ │ │ │ ├── GroupCollectionsDOM.scala │ │ │ │ │ │ ├── GroupCollectionsUiActions.scala │ │ │ │ │ │ ├── NavigationUiActions.scala │ │ │ │ │ │ ├── SharedCollectionUiActions.scala │ │ │ │ │ │ ├── SingleCollectionDOM.scala │ │ │ │ │ │ ├── SingleCollectionUiActions.scala │ │ │ │ │ │ └── ToolbarUiActions.scala │ │ │ │ │ ├── snails/ │ │ │ │ │ │ └── CollectionsSnails.scala │ │ │ │ │ └── tasks/ │ │ │ │ │ └── CollectionJobs.scala │ │ │ │ ├── commons/ │ │ │ │ │ ├── ActivityFindViews.scala │ │ │ │ │ ├── AppLog.scala │ │ │ │ │ ├── AsyncImageTweaks.scala │ │ │ │ │ ├── Commons.scala │ │ │ │ │ ├── CommonsExcerpt.scala │ │ │ │ │ ├── CommonsTweak.scala │ │ │ │ │ ├── Exceptions.scala │ │ │ │ │ ├── Jobs.scala │ │ │ │ │ ├── SnailsCommons.scala │ │ │ │ │ ├── SystemBarsTint.scala │ │ │ │ │ ├── UiContext.scala │ │ │ │ │ ├── UiExtensions.scala │ │ │ │ │ ├── action_filters/ │ │ │ │ │ │ ├── AppsActionFilter.scala │ │ │ │ │ │ ├── CollectionsActionFilter.scala │ │ │ │ │ │ ├── MomentsActionFilter.scala │ │ │ │ │ │ └── SyncActionFilter.scala │ │ │ │ │ ├── adapters/ │ │ │ │ │ │ ├── apps/ │ │ │ │ │ │ │ ├── AppsAdapter.scala │ │ │ │ │ │ │ └── AppsSelectionAdapter.scala │ │ │ │ │ │ ├── contacts/ │ │ │ │ │ │ │ ├── ContactsAdapter.scala │ │ │ │ │ │ │ └── LastCallsAdapter.scala │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ └── SearchAdapter.scala │ │ │ │ │ │ └── sharedcollections/ │ │ │ │ │ │ ├── SharedCollectionItem.scala │ │ │ │ │ │ ├── SharedCollectionsAdapter.scala │ │ │ │ │ │ └── ViewHolderSharedCollectionsLayoutAdapter.scala │ │ │ │ │ ├── dialogs/ │ │ │ │ │ │ ├── BaseActionFragment.scala │ │ │ │ │ │ ├── Styles.scala │ │ │ │ │ │ ├── addmoment/ │ │ │ │ │ │ │ ├── AddMomentAdapter.scala │ │ │ │ │ │ │ ├── AddMomentDOM.scala │ │ │ │ │ │ │ ├── AddMomentFragment.scala │ │ │ │ │ │ │ ├── AddMomentItemDecoration.scala │ │ │ │ │ │ │ ├── AddMomentJobs.scala │ │ │ │ │ │ │ └── AddMomentUiActions.scala │ │ │ │ │ │ ├── apps/ │ │ │ │ │ │ │ ├── AppsDOM.scala │ │ │ │ │ │ │ ├── AppsFragment.scala │ │ │ │ │ │ │ ├── AppsJobs.scala │ │ │ │ │ │ │ └── AppsUiActions.scala │ │ │ │ │ │ ├── contacts/ │ │ │ │ │ │ │ ├── ContactsDOM.scala │ │ │ │ │ │ │ ├── ContactsFragment.scala │ │ │ │ │ │ │ ├── ContactsJobs.scala │ │ │ │ │ │ │ ├── ContactsUiActions.scala │ │ │ │ │ │ │ └── SelectInfoContactDialogFragment.scala │ │ │ │ │ │ ├── createoreditcollection/ │ │ │ │ │ │ │ ├── ColorDialogFragment.scala │ │ │ │ │ │ │ ├── CreateOrEditCollectionDOM.scala │ │ │ │ │ │ │ ├── CreateOrEditCollectionFragment.scala │ │ │ │ │ │ │ ├── CreateOrEditCollectionJobs.scala │ │ │ │ │ │ │ ├── CreateOrEditCollectionUiActions.scala │ │ │ │ │ │ │ └── IconDialogFragment.scala │ │ │ │ │ │ ├── editmoment/ │ │ │ │ │ │ │ ├── EditMomentDOM.scala │ │ │ │ │ │ │ ├── EditMomentFragment.scala │ │ │ │ │ │ │ ├── EditMomentJobs.scala │ │ │ │ │ │ │ └── EditMomentUiActions.scala │ │ │ │ │ │ ├── privatecollections/ │ │ │ │ │ │ │ ├── PrivateCollectionsAdapter.scala │ │ │ │ │ │ │ ├── PrivateCollectionsDOM.scala │ │ │ │ │ │ │ ├── PrivateCollectionsFragment.scala │ │ │ │ │ │ │ ├── PrivateCollectionsJobs.scala │ │ │ │ │ │ │ └── PrivateCollectionsUiActions.scala │ │ │ │ │ │ ├── publicollections/ │ │ │ │ │ │ │ ├── PublicCollectionsDOM.scala │ │ │ │ │ │ │ ├── PublicCollectionsFragment.scala │ │ │ │ │ │ │ ├── PublicCollectionsJobs.scala │ │ │ │ │ │ │ └── PublicCollectionsUiActions.scala │ │ │ │ │ │ ├── recommendations/ │ │ │ │ │ │ │ ├── RecommendationsAdapter.scala │ │ │ │ │ │ │ ├── RecommendationsDOM.scala │ │ │ │ │ │ │ ├── RecommendationsFragment.scala │ │ │ │ │ │ │ ├── RecommendationsJobs.scala │ │ │ │ │ │ │ └── RecommendationsUiActions.scala │ │ │ │ │ │ ├── shortcuts/ │ │ │ │ │ │ │ ├── ShortcutDialogAdapter.scala │ │ │ │ │ │ │ ├── ShortcutDialogDOM.scala │ │ │ │ │ │ │ ├── ShortcutDialogFragment.scala │ │ │ │ │ │ │ ├── ShortcutDialogJobs.scala │ │ │ │ │ │ │ └── ShortcutDialogUiActions.scala │ │ │ │ │ │ ├── widgets/ │ │ │ │ │ │ │ ├── WidgetsAdapter.scala │ │ │ │ │ │ │ ├── WidgetsDialogDOM.scala │ │ │ │ │ │ │ ├── WidgetsDialogJobs.scala │ │ │ │ │ │ │ ├── WidgetsDialogUiActions.scala │ │ │ │ │ │ │ └── WidgetsFragment.scala │ │ │ │ │ │ └── wizard/ │ │ │ │ │ │ ├── WizardInlineDOM.scala │ │ │ │ │ │ ├── WizardInlineFragment.scala │ │ │ │ │ │ ├── WizardInlinePreferences.scala │ │ │ │ │ │ ├── WizardInlineType.scala │ │ │ │ │ │ └── WizardInlineUiActions.scala │ │ │ │ │ ├── glide/ │ │ │ │ │ │ ├── AppIconLoader.scala │ │ │ │ │ │ ├── ApplicationIconDecoder.scala │ │ │ │ │ │ ├── IconFromPackageDecoder.scala │ │ │ │ │ │ └── IconFromPackageLoader.scala │ │ │ │ │ ├── google_api/ │ │ │ │ │ │ └── GoogleApiClientProvider.scala │ │ │ │ │ ├── ops/ │ │ │ │ │ │ ├── CollectionOps.scala │ │ │ │ │ │ ├── ConditionWeatherOps.scala │ │ │ │ │ │ ├── DrawableOps.scala │ │ │ │ │ │ ├── NineCardsCategoryOps.scala │ │ │ │ │ │ ├── NineCardsMomentOps.scala │ │ │ │ │ │ ├── ResourcesCollectionDataOps.scala │ │ │ │ │ │ ├── SharedCollectionOps.scala │ │ │ │ │ │ ├── SubscriptionOps.scala │ │ │ │ │ │ ├── TaskServiceOps.scala │ │ │ │ │ │ ├── TryOps.scala │ │ │ │ │ │ ├── UiOps.scala │ │ │ │ │ │ ├── ViewGroupOps.scala │ │ │ │ │ │ ├── ViewOps.scala │ │ │ │ │ │ └── WidgetsOps.scala │ │ │ │ │ ├── states/ │ │ │ │ │ │ └── MomentState.scala │ │ │ │ │ └── styles/ │ │ │ │ │ ├── CollectionCardsStyles.scala │ │ │ │ │ └── CommonStyles.scala │ │ │ │ ├── components/ │ │ │ │ │ ├── adapters/ │ │ │ │ │ │ └── ThemeArrayAdapter.scala │ │ │ │ │ ├── commons/ │ │ │ │ │ │ ├── PaddingItemDecoration.scala │ │ │ │ │ │ ├── ReorderItemTouchHelperCallback.scala │ │ │ │ │ │ ├── SelectedItemDecoration.scala │ │ │ │ │ │ ├── SwipeController.scala │ │ │ │ │ │ ├── TranslationAnimator.scala │ │ │ │ │ │ └── ViewState.scala │ │ │ │ │ ├── dialogs/ │ │ │ │ │ │ ├── AlertDialogFragment.scala │ │ │ │ │ │ ├── BluetoothDialogFragment.scala │ │ │ │ │ │ ├── CollectionDialog.scala │ │ │ │ │ │ ├── MomentDialog.scala │ │ │ │ │ │ └── WifiDialogFragment.scala │ │ │ │ │ ├── drawables/ │ │ │ │ │ │ ├── BackgroundSelectedDrawable.scala │ │ │ │ │ │ ├── CharDrawable.scala │ │ │ │ │ │ ├── DottedDrawable.scala │ │ │ │ │ │ ├── DrawerAnimationBackgroundDrawable.scala │ │ │ │ │ │ ├── DrawerBackgroundDrawable.scala │ │ │ │ │ │ ├── DropBackgroundDrawable.scala │ │ │ │ │ │ ├── EdgeWorkspaceDrawable.scala │ │ │ │ │ │ ├── PathMorphDrawable.scala │ │ │ │ │ │ ├── RippleCollectionDrawable.scala │ │ │ │ │ │ ├── TopBarMomentBackgroundDrawable.scala │ │ │ │ │ │ ├── TopBarMomentEdgeBackgroundDrawable.scala │ │ │ │ │ │ └── tweaks/ │ │ │ │ │ │ └── PathMorphDrawableTweaks.scala │ │ │ │ │ ├── layouts/ │ │ │ │ │ │ ├── AnimatedWorkSpaces.scala │ │ │ │ │ │ ├── AppsMomentLayout.scala │ │ │ │ │ │ ├── CollectionActionsPanelLayout.scala │ │ │ │ │ │ ├── DialogToolbar.scala │ │ │ │ │ │ ├── DockAppsPanelLayout.scala │ │ │ │ │ │ ├── EditDeviceMomentLayout.scala │ │ │ │ │ │ ├── EditHourMomentLayout.scala │ │ │ │ │ │ ├── FabItemMenu.scala │ │ │ │ │ │ ├── FastScrollerLayout.scala │ │ │ │ │ │ ├── LauncherWorkSpaces.scala │ │ │ │ │ │ ├── PullToCloseView.scala │ │ │ │ │ │ ├── PullToDownView.scala │ │ │ │ │ │ ├── PullToTabsView.scala │ │ │ │ │ │ ├── SearchBoxView.scala │ │ │ │ │ │ ├── SlidingTabLayout.scala │ │ │ │ │ │ ├── StepsWorkspaces.scala │ │ │ │ │ │ ├── TopBarLayout.scala │ │ │ │ │ │ ├── WizardInlineWorkspaces.scala │ │ │ │ │ │ ├── WorkSpaceButton.scala │ │ │ │ │ │ ├── WorkspaceItemMenu.scala │ │ │ │ │ │ ├── snails/ │ │ │ │ │ │ │ └── LayoutSnails.scala │ │ │ │ │ │ └── tweaks/ │ │ │ │ │ │ └── LayoutsTweaks.scala │ │ │ │ │ ├── models/ │ │ │ │ │ │ └── LauncherData.scala │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── AboutHeaderPreference.scala │ │ │ │ │ │ └── TeamPreference.scala │ │ │ │ │ └── widgets/ │ │ │ │ │ ├── CollectionCheckBox.scala │ │ │ │ │ ├── CollectionRecyclerView.scala │ │ │ │ │ ├── DrawerRecyclerView.scala │ │ │ │ │ ├── LauncherNoConfiguredWidgetView.scala │ │ │ │ │ ├── LauncherWidgetResizeFrame.scala │ │ │ │ │ ├── LauncherWidgetView.scala │ │ │ │ │ ├── ScrollingLinearLayoutManager.scala │ │ │ │ │ ├── TintableButton.scala │ │ │ │ │ ├── TintableImageView.scala │ │ │ │ │ ├── WizardCheckBox.scala │ │ │ │ │ ├── WizardMomentCheckBox.scala │ │ │ │ │ ├── WizardWifiCheckBox.scala │ │ │ │ │ └── tweaks/ │ │ │ │ │ └── WidgetsTweaks.scala │ │ │ │ ├── launcher/ │ │ │ │ │ ├── LauncherActivity.scala │ │ │ │ │ ├── exceptions/ │ │ │ │ │ │ └── LauncherExceptions.scala │ │ │ │ │ ├── holders/ │ │ │ │ │ │ ├── LauncherWorkSpaceCollectionsHolder.scala │ │ │ │ │ │ └── LauncherWorkSpaceMomentsHolder.scala │ │ │ │ │ ├── jobs/ │ │ │ │ │ │ ├── AppDrawerJobs.scala │ │ │ │ │ │ ├── DragJobs.scala │ │ │ │ │ │ ├── LauncherJobs.scala │ │ │ │ │ │ ├── NavigationJobs.scala │ │ │ │ │ │ ├── WidgetsJobs.scala │ │ │ │ │ │ └── uiactions/ │ │ │ │ │ │ ├── AppDrawerUiActions.scala │ │ │ │ │ │ ├── DockAppsUiActions.scala │ │ │ │ │ │ ├── DragUiActions.scala │ │ │ │ │ │ ├── LauncherDOM.scala │ │ │ │ │ │ ├── LauncherUiActions.scala │ │ │ │ │ │ ├── MenuDrawersUiActions.scala │ │ │ │ │ │ ├── NavigationUiActions.scala │ │ │ │ │ │ ├── TopBarUiActions.scala │ │ │ │ │ │ ├── WidgetUiActions.scala │ │ │ │ │ │ └── WorkspaceUiActions.scala │ │ │ │ │ ├── snails/ │ │ │ │ │ │ ├── DrawerSnails.scala │ │ │ │ │ │ └── LauncherSnails.scala │ │ │ │ │ └── types/ │ │ │ │ │ ├── AppDrawerIconShadowBuilder.scala │ │ │ │ │ ├── CollectionShadowBuilder.scala │ │ │ │ │ ├── DragLauncherType.scala │ │ │ │ │ ├── DragObject.scala │ │ │ │ │ ├── MenuOptions.scala │ │ │ │ │ └── WidgetShadowBuilder.scala │ │ │ │ ├── preferences/ │ │ │ │ │ ├── NineCardsPreferencesActivity.scala │ │ │ │ │ ├── PreferencesJobs.scala │ │ │ │ │ ├── PreferencesUiActions.scala │ │ │ │ │ ├── about/ │ │ │ │ │ │ └── AboutFragment.scala │ │ │ │ │ ├── analytics/ │ │ │ │ │ │ └── AnalyticsFragment.scala │ │ │ │ │ ├── animations/ │ │ │ │ │ │ └── AnimationsFragment.scala │ │ │ │ │ ├── appdrawer/ │ │ │ │ │ │ ├── AppDrawerFragment.scala │ │ │ │ │ │ ├── AppDrawerJobs.scala │ │ │ │ │ │ └── AppDrawerUiActions.scala │ │ │ │ │ ├── commons/ │ │ │ │ │ │ ├── FindPreferences.scala │ │ │ │ │ │ ├── NineCardsPreferences.scala │ │ │ │ │ │ ├── NineCardsPreferencesValues.scala │ │ │ │ │ │ └── PreferenceChangeListenerFragment.scala │ │ │ │ │ ├── developers/ │ │ │ │ │ │ ├── AppsListFragment.scala │ │ │ │ │ │ ├── AppsListJobs.scala │ │ │ │ │ │ ├── AppsListUiActions.scala │ │ │ │ │ │ ├── DeveloperFragment.scala │ │ │ │ │ │ ├── DeveloperJobs.scala │ │ │ │ │ │ └── DeveloperUiActions.scala │ │ │ │ │ ├── lookandfeel/ │ │ │ │ │ │ └── LookFeelFragment.scala │ │ │ │ │ └── moments/ │ │ │ │ │ └── MomentsFragment.scala │ │ │ │ ├── profile/ │ │ │ │ │ ├── ProfileActivity.scala │ │ │ │ │ ├── adapters/ │ │ │ │ │ │ ├── AccountsAdapter.scala │ │ │ │ │ │ ├── EmptyProfileAdapter.scala │ │ │ │ │ │ └── SubscriptionsAdapter.scala │ │ │ │ │ ├── dialog/ │ │ │ │ │ │ ├── EditAccountDeviceDialogFragment.scala │ │ │ │ │ │ └── RemoveAccountDeviceDialogFragment.scala │ │ │ │ │ ├── jobs/ │ │ │ │ │ │ ├── ProfileDOM.scala │ │ │ │ │ │ ├── ProfileJobs.scala │ │ │ │ │ │ └── ProfileUiActions.scala │ │ │ │ │ └── models/ │ │ │ │ │ └── Model.scala │ │ │ │ ├── share/ │ │ │ │ │ ├── SharedContentActivity.scala │ │ │ │ │ ├── SharedContentJobs.scala │ │ │ │ │ ├── SharedContentUiActions.scala │ │ │ │ │ └── models/ │ │ │ │ │ └── Models.scala │ │ │ │ └── wizard/ │ │ │ │ ├── WizardActivity.scala │ │ │ │ ├── WizardExceptions.scala │ │ │ │ ├── jobs/ │ │ │ │ │ ├── LoadConfigurationJobs.scala │ │ │ │ │ ├── NewConfigurationJobs.scala │ │ │ │ │ ├── WizardJobs.scala │ │ │ │ │ └── uiactions/ │ │ │ │ │ ├── NewConfigurationUiActions.scala │ │ │ │ │ ├── VisibilityUiActions.scala │ │ │ │ │ ├── WizardDOM.scala │ │ │ │ │ └── WizardUiActions.scala │ │ │ │ └── models/ │ │ │ │ └── Models.scala │ │ │ ├── process/ │ │ │ │ ├── cloud/ │ │ │ │ │ ├── CloudStorageProcess.scala │ │ │ │ │ ├── Conversions.scala │ │ │ │ │ ├── Exceptions.scala │ │ │ │ │ ├── impl/ │ │ │ │ │ │ └── CloudStorageProcessImpl.scala │ │ │ │ │ └── models/ │ │ │ │ │ └── CloudStorageImplicits.scala │ │ │ │ ├── commons/ │ │ │ │ │ └── Models.scala │ │ │ │ ├── social/ │ │ │ │ │ ├── Exceptions.scala │ │ │ │ │ ├── SocialProfileProcess.scala │ │ │ │ │ └── impl/ │ │ │ │ │ └── SocialProfileProcessImpl.scala │ │ │ │ └── thirdparty/ │ │ │ │ ├── Exceptions.scala │ │ │ │ └── ExternalServicesProcess.scala │ │ │ └── services/ │ │ │ ├── analytics/ │ │ │ │ └── impl/ │ │ │ │ └── AnalyticsTrackServices.scala │ │ │ ├── awareness/ │ │ │ │ └── impl/ │ │ │ │ ├── GoogleAwarenessServicesImpl.scala │ │ │ │ └── Models.scala │ │ │ ├── drive/ │ │ │ │ ├── Conversions.scala │ │ │ │ ├── DriveServices.scala │ │ │ │ ├── Exceptions.scala │ │ │ │ ├── impl/ │ │ │ │ │ └── DriveServicesImpl.scala │ │ │ │ └── models/ │ │ │ │ └── DriveServicesModels.scala │ │ │ ├── permissions/ │ │ │ │ └── impl/ │ │ │ │ └── AndroidSupportPermissionsServices.scala │ │ │ └── plus/ │ │ │ ├── Exceptions.scala │ │ │ ├── GooglePlusServices.scala │ │ │ ├── impl/ │ │ │ │ └── GooglePlusServicesImpl.scala │ │ │ └── models/ │ │ │ └── Model.scala │ │ └── test/ │ │ └── scala/ │ │ └── cards/ │ │ └── nine/ │ │ ├── app/ │ │ │ ├── observers/ │ │ │ │ └── ObserverRegisterSpecification.scala │ │ │ ├── receivers/ │ │ │ │ └── bluetooth/ │ │ │ │ ├── BluetoothContextSupport.scala │ │ │ │ └── BluetoothJobsSpecification.scala │ │ │ └── ui/ │ │ │ ├── applinks/ │ │ │ │ └── AppLinksReceiverJobsSpec.scala │ │ │ ├── collections/ │ │ │ │ └── jobs/ │ │ │ │ ├── GroupCollectionsJobsSpecification.scala │ │ │ │ ├── NavigationJobsSpecification.scala │ │ │ │ ├── ShareCollectionJobsSpecification.scala │ │ │ │ ├── SingleCollectionJobsSpecification.scala │ │ │ │ └── ToolbarJobsSpecification.scala │ │ │ ├── commons/ │ │ │ │ ├── JobsSpec.scala │ │ │ │ └── dialogs/ │ │ │ │ ├── addMoment/ │ │ │ │ │ └── AddMomentJobsSpec.scala │ │ │ │ ├── apps/ │ │ │ │ │ └── AppsJobsSpec.scala │ │ │ │ ├── contacts/ │ │ │ │ │ └── ContactsJobsSpec.scala │ │ │ │ ├── editmoment/ │ │ │ │ │ └── EditMomentJobsSpec.scala │ │ │ │ ├── privatecollections/ │ │ │ │ │ └── PrivateCollectionsJobsSpec.scala │ │ │ │ ├── publicCollections/ │ │ │ │ │ └── PublicCollectionsJobsJobsSpec.scala │ │ │ │ ├── recommendations/ │ │ │ │ │ └── RecommendationsJobsSpec.scala │ │ │ │ ├── shortcuts/ │ │ │ │ │ └── ShortcutJobsSpec.scala │ │ │ │ └── widgets/ │ │ │ │ └── WidgetsDialogJobsSpec.scala │ │ │ ├── data/ │ │ │ │ └── IterableData.scala │ │ │ ├── launcher/ │ │ │ │ └── jobs/ │ │ │ │ ├── AppDrawerJobsSpecification.scala │ │ │ │ ├── DragJobsSpecification.scala │ │ │ │ ├── LauncherJobsSpecification.scala │ │ │ │ ├── LauncherTestData.scala │ │ │ │ ├── NavigationJobsSpecification.scala │ │ │ │ └── WidgetJobsSpecification.scala │ │ │ ├── profile/ │ │ │ │ └── jobs/ │ │ │ │ └── ProfileJobsSpec.scala │ │ │ └── wizard/ │ │ │ └── jobs/ │ │ │ ├── LoadConfigurationJobsSpec.scala │ │ │ ├── NewConfigurationJobsSpecification.scala │ │ │ └── WizardJobsSpecification.scala │ │ └── process/ │ │ ├── cloud/ │ │ │ └── impl/ │ │ │ ├── CloudStorageProcessImplData.scala │ │ │ └── CloudStorageProcessImplSpecification.scala │ │ └── social/ │ │ └── impl/ │ │ ├── SocialProfileProcessImplData.scala │ │ └── SocialProfileProcessImplSpecification.scala │ ├── commons/ │ │ ├── build.sbt │ │ └── src/ │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── scala/ │ │ │ └── cards/ │ │ │ └── nine/ │ │ │ └── commons/ │ │ │ ├── CatchAll.scala │ │ │ ├── NineCardExtensions.scala │ │ │ ├── contentresolver/ │ │ │ │ ├── ContentResolverWrapper.scala │ │ │ │ ├── Conversions.scala │ │ │ │ ├── NotificationUri.scala │ │ │ │ └── UriCreator.scala │ │ │ ├── contexts/ │ │ │ │ └── ContextSupport.scala │ │ │ ├── ops/ │ │ │ │ ├── ColorOps.scala │ │ │ │ └── SeqOps.scala │ │ │ ├── package.scala │ │ │ ├── services/ │ │ │ │ └── package.scala │ │ │ └── utils/ │ │ │ ├── Exceptions.scala │ │ │ ├── FileUtils.scala │ │ │ ├── StreamWrapper.scala │ │ │ └── impl/ │ │ │ └── StreamWrapperImpl.scala │ │ └── test/ │ │ └── scala/ │ │ └── cards/ │ │ └── nine/ │ │ └── commons/ │ │ └── utils/ │ │ ├── FileUtilsData.scala │ │ ├── FileUtilsSpec.scala │ │ └── impl/ │ │ └── StreamWrapperImplSpec.scala │ ├── commons-tests/ │ │ └── src/ │ │ └── main/ │ │ └── scala/ │ │ └── cards/ │ │ └── nine/ │ │ └── commons/ │ │ └── test/ │ │ ├── TaskServiceTestOps.scala │ │ ├── data/ │ │ │ ├── ApiTestData.scala │ │ │ ├── ApiV1TestData.scala │ │ │ ├── AppWidgetTestData.scala │ │ │ ├── ApplicationTestData.scala │ │ │ ├── CardTestData.scala │ │ │ ├── CloudStorageTestData.scala │ │ │ ├── CollectionTestData.scala │ │ │ ├── Constants.scala │ │ │ ├── DeviceTestData.scala │ │ │ ├── DockAppTestData.scala │ │ │ ├── LauncherExecutorTestData.scala │ │ │ ├── MomentTestData.scala │ │ │ ├── SharedCollectionTestData.scala │ │ │ ├── UserTestData.scala │ │ │ ├── WidgetTestData.scala │ │ │ └── trackevent/ │ │ │ ├── AppDrawerTrackEventTestData.scala │ │ │ ├── CollectionDetailTrackEventTestData.scala │ │ │ ├── HomeTrackEventTestData.scala │ │ │ ├── LauncherTrackEventTestData.scala │ │ │ ├── MomentsTrackEventTestData.scala │ │ │ ├── ProfileTrackEventTestData.scala │ │ │ ├── SliderMenuTrackEventTestData.scala │ │ │ ├── WidgetTrackEventTestData.scala │ │ │ └── WizardTrackEventTestData.scala │ │ └── repository/ │ │ └── MockCursor.scala │ ├── docs/ │ │ └── src/ │ │ └── main/ │ │ ├── resources/ │ │ │ └── microsite/ │ │ │ ├── css/ │ │ │ │ └── custom.css │ │ │ ├── data/ │ │ │ │ └── menu.yml │ │ │ ├── img/ │ │ │ │ ├── gallery1.webm │ │ │ │ ├── gallery2.webm │ │ │ │ └── gallery3.webm │ │ │ ├── includes/ │ │ │ │ ├── ninecards-footer.html │ │ │ │ └── ninecards-header.html │ │ │ └── layouts/ │ │ │ └── ninecards-home.html │ │ └── tut/ │ │ ├── CNAME │ │ ├── docs/ │ │ │ ├── Client.md │ │ │ ├── Libraries.md │ │ │ ├── Server.md │ │ │ ├── client/ │ │ │ │ ├── Architecture.md │ │ │ │ ├── CloudStorage.md │ │ │ │ ├── Database.md │ │ │ │ └── Installation.md │ │ │ ├── index.md │ │ │ └── server/ │ │ │ ├── Architecture.md │ │ │ ├── Authentication.md │ │ │ ├── Cache.md │ │ │ ├── Ednpoints.md │ │ │ └── Installation.md │ │ └── index.md │ ├── mock-android/ │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── android/ │ │ ├── accounts/ │ │ │ ├── Account.java │ │ │ ├── AccountManager.java │ │ │ ├── AccountsException.java │ │ │ └── OperationCanceledException.java │ │ ├── app/ │ │ │ └── Activity.java │ │ ├── content/ │ │ │ ├── ComponentName.java │ │ │ ├── ContentResolver.java │ │ │ ├── Intent.java │ │ │ └── res/ │ │ │ └── AssetManager.java │ │ ├── database/ │ │ │ └── ContentObserver.java │ │ ├── graphics/ │ │ │ ├── Bitmap.java │ │ │ ├── Color.java │ │ │ ├── Rect.java │ │ │ └── drawable/ │ │ │ └── Drawable.java │ │ ├── media/ │ │ │ └── ThumbnailUtils.java │ │ ├── net/ │ │ │ └── wifi/ │ │ │ └── WifiConfiguration.java │ │ ├── os/ │ │ │ ├── Bundle.java │ │ │ ├── Handler.java │ │ │ └── Looper.java │ │ ├── util/ │ │ │ └── Log.java │ │ └── view/ │ │ ├── SearchEvent.java │ │ └── View.java │ ├── models/ │ │ └── src/ │ │ └── main/ │ │ └── scala/ │ │ └── cards/ │ │ └── nine/ │ │ └── models/ │ │ ├── Api.scala │ │ ├── ApiV1.scala │ │ ├── Application.scala │ │ ├── Awareness.scala │ │ ├── BitmapPath.scala │ │ ├── Call.scala │ │ ├── Card.scala │ │ ├── CloudStorage.scala │ │ ├── Collection.scala │ │ ├── CollectionProcessConfig.scala │ │ ├── Contact.scala │ │ ├── Conversions.scala │ │ ├── DockApp.scala │ │ ├── IconResize.scala │ │ ├── Intent.scala │ │ ├── IterableCursor.scala │ │ ├── Iterables.scala │ │ ├── LauncherExecutorProcessConfig.scala │ │ ├── Moment.scala │ │ ├── NineCardsBluetoothDevice.scala │ │ ├── NineCardsIntent.scala │ │ ├── NineCardsIntentConversions.scala │ │ ├── Rank.scala │ │ ├── SharedCollection.scala │ │ ├── ShortCut.scala │ │ ├── TermCounter.scala │ │ ├── Theme.scala │ │ ├── TrackEvent.scala │ │ ├── User.scala │ │ ├── Widget.scala │ │ ├── package.scala │ │ ├── reads/ │ │ │ └── MomentImplicits.scala │ │ └── types/ │ │ ├── Action.scala │ │ ├── AppPermission.scala │ │ ├── AwarenessFenceUpdate.scala │ │ ├── BluetoothType.scala │ │ ├── CallType.scala │ │ ├── CardType.scala │ │ ├── Category.scala │ │ ├── CollectionType.scala │ │ ├── ConditionWeather.scala │ │ ├── ContactsFilter.scala │ │ ├── DialogToolbarType.scala │ │ ├── DockType.scala │ │ ├── EmailCategory.scala │ │ ├── FetchAppOrder.scala │ │ ├── GetAppOrder.scala │ │ ├── KindActivity.scala │ │ ├── Label.scala │ │ ├── NineCardsCategory.scala │ │ ├── NineCardsMoment.scala │ │ ├── Permission.scala │ │ ├── PhoneCategory.scala │ │ ├── PublicCollectionStatus.scala │ │ ├── Screen.scala │ │ ├── TypeSharedCollection.scala │ │ ├── Value.scala │ │ ├── WidgetResizeMode.scala │ │ ├── WidgetType.scala │ │ ├── json/ │ │ │ ├── CollectionTypeImplicits.scala │ │ │ ├── DockTypeImplicits.scala │ │ │ ├── NineCardCategoryImplicits.scala │ │ │ ├── NineCardsMomentImplicits.scala │ │ │ └── WidgetTypeImplicits.scala │ │ └── theme/ │ │ ├── ThemeStyleType.scala │ │ └── ThemeType.scala │ ├── process/ │ │ ├── build.sbt │ │ └── src/ │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets/ │ │ │ │ ├── theme_dark.json │ │ │ │ └── theme_light.json │ │ │ └── scala/ │ │ │ └── cards/ │ │ │ └── nine/ │ │ │ └── process/ │ │ │ ├── accounts/ │ │ │ │ ├── Exceptions.scala │ │ │ │ ├── UserAccountsProcess.scala │ │ │ │ └── impl/ │ │ │ │ └── UserAccountsProcessImpl.scala │ │ │ ├── collection/ │ │ │ │ ├── CollectionProcess.scala │ │ │ │ ├── CollectionsExceptions.scala │ │ │ │ └── impl/ │ │ │ │ ├── CardsProcessImpl.scala │ │ │ │ ├── CollectionProcessDependencies.scala │ │ │ │ ├── CollectionProcessImpl.scala │ │ │ │ └── CollectionsProcessImpl.scala │ │ │ ├── device/ │ │ │ │ ├── DeviceExceptions.scala │ │ │ │ ├── DeviceProcess.scala │ │ │ │ └── impl/ │ │ │ │ ├── AppsDeviceProcessImpl.scala │ │ │ │ ├── ContactsDeviceProcessImpl.scala │ │ │ │ ├── DeviceProcessDependencies.scala │ │ │ │ ├── DeviceProcessImpl.scala │ │ │ │ ├── DockAppsDeviceProcessImpl.scala │ │ │ │ ├── LastCallsDeviceProcessImpl.scala │ │ │ │ ├── ResetProcessImpl.scala │ │ │ │ ├── ShortcutsDeviceProcessImpl.scala │ │ │ │ └── WidgetsDeviceProcessImpl.scala │ │ │ ├── intents/ │ │ │ │ ├── Exceptions.scala │ │ │ │ ├── LauncherExecutorProcess.scala │ │ │ │ └── impl/ │ │ │ │ └── LauncherExecutorProcessImpl.scala │ │ │ ├── moment/ │ │ │ │ ├── MomentException.scala │ │ │ │ ├── MomentProcess.scala │ │ │ │ └── impl/ │ │ │ │ └── MomentProcessImpl.scala │ │ │ ├── recognition/ │ │ │ │ ├── Exceptions.scala │ │ │ │ ├── RecognitionProcess.scala │ │ │ │ └── impl/ │ │ │ │ └── RecognitionProcessImpl.scala │ │ │ ├── recommendations/ │ │ │ │ ├── RecommendationsExceptions.scala │ │ │ │ ├── RecommendationsProcess.scala │ │ │ │ └── impl/ │ │ │ │ └── RecommendationsProcessImpl.scala │ │ │ ├── sharedcollections/ │ │ │ │ ├── Exceptions.scala │ │ │ │ ├── SharedCollectionsProcess.scala │ │ │ │ └── impl/ │ │ │ │ └── SharedCollectionsProcessImpl.scala │ │ │ ├── theme/ │ │ │ │ ├── ThemeExceptions.scala │ │ │ │ ├── ThemeProcess.scala │ │ │ │ └── impl/ │ │ │ │ └── ThemeProcessImpl.scala │ │ │ ├── trackevent/ │ │ │ │ ├── Exceptions.scala │ │ │ │ ├── TrackEventProcess.scala │ │ │ │ └── impl/ │ │ │ │ ├── AppDrawerEventProcessImpl.scala │ │ │ │ ├── CollectionDetailTrackEventProcessImpl.scala │ │ │ │ ├── HomeTrackEventProcessImpl.scala │ │ │ │ ├── LauncherTrackEventProcessImpl.scala │ │ │ │ ├── MomentsTrackEventProcessImpl.scala │ │ │ │ ├── ProfileTrackEventProcessImpl.scala │ │ │ │ ├── SliderMenuTrackEventProcessImpl.scala │ │ │ │ ├── TrackEventDependencies.scala │ │ │ │ ├── TrackEventProcessImpl.scala │ │ │ │ ├── WidgetTrackEventProcessImpl.scala │ │ │ │ └── WizardTrackEventProcessImpl.scala │ │ │ ├── user/ │ │ │ │ ├── UserExceptions.scala │ │ │ │ ├── UserProcess.scala │ │ │ │ └── impl/ │ │ │ │ └── UserProcessImpl.scala │ │ │ ├── userv1/ │ │ │ │ ├── UserV1Exceptions.scala │ │ │ │ ├── UserV1Process.scala │ │ │ │ └── impl/ │ │ │ │ └── UserV1ProcessImpl.scala │ │ │ ├── utils/ │ │ │ │ └── ApiUtils.scala │ │ │ └── widget/ │ │ │ ├── AppWidgetException.scala │ │ │ ├── WidgetProcess.scala │ │ │ └── impl/ │ │ │ └── WidgetProcessImpl.scala │ │ └── test/ │ │ └── scala/ │ │ └── cards/ │ │ └── nine/ │ │ └── process/ │ │ ├── accounts/ │ │ │ └── impl/ │ │ │ ├── UserAccountsProcessImplData.scala │ │ │ └── UserAccountsProcessImplSpecification.scala │ │ ├── collection/ │ │ │ └── impl/ │ │ │ └── CollectionProcessImplSpec.scala │ │ ├── device/ │ │ │ └── impl/ │ │ │ ├── DeviceProcessData.scala │ │ │ └── DeviceProcessImplSpec.scala │ │ ├── intents/ │ │ │ └── impl/ │ │ │ └── LauncherExecutorProcessImplSpec.scala │ │ ├── moment/ │ │ │ └── impl/ │ │ │ ├── MomentProcessImplData.scala │ │ │ └── MomentProcessImplSpec.scala │ │ ├── recognition/ │ │ │ └── impl/ │ │ │ ├── RecognitionProcessData.scala │ │ │ └── RecognitionProcessImplSpec.scala │ │ ├── recommendations/ │ │ │ └── impl/ │ │ │ └── RecommendationsProcessSpec.scala │ │ ├── sharedcollections/ │ │ │ └── impl/ │ │ │ └── SharedCollectionsProcessImplSpec.scala │ │ ├── theme/ │ │ │ └── impl/ │ │ │ ├── ThemeProcessData.scala │ │ │ └── ThemeProcessImplSpec.scala │ │ ├── trackevent/ │ │ │ └── impl/ │ │ │ ├── AppDrawerTrackEventProcessImplSpec.scala │ │ │ ├── CollectionDetailTrackEventProcessImplSpec.scala │ │ │ ├── HomeTrackEventProcessImplSpec.scala │ │ │ ├── LauncherTrackEventProcessImplSpec.scala │ │ │ ├── MomentsTrackEventProcessImplSpec.scala │ │ │ ├── ProfileTrackEventProcessImplSpec.scala │ │ │ ├── SliderMenuTrackEventProcessImplSpec.scala │ │ │ ├── WidgetTrackEventProcessImplSpec.scala │ │ │ └── WizardTrackEventProcessImplSpec.scala │ │ ├── user/ │ │ │ └── impl/ │ │ │ └── UserProcessImplSpec.scala │ │ ├── userv1/ │ │ │ └── impl/ │ │ │ └── UserV1ProcessImplSpec.scala │ │ ├── utils/ │ │ │ └── ApiUtilsSpec.scala │ │ └── widget/ │ │ └── impl/ │ │ └── WidgetProcessImplSpec.scala │ ├── repository/ │ │ ├── build.sbt │ │ └── src/ │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── scala/ │ │ │ └── cards/ │ │ │ └── nine/ │ │ │ └── repository/ │ │ │ ├── Conversions.scala │ │ │ ├── Exceptions.scala │ │ │ ├── model/ │ │ │ │ └── Model.scala │ │ │ ├── provider/ │ │ │ │ ├── AppEntity.scala │ │ │ │ ├── CardEntity.scala │ │ │ │ ├── CollectionEntity.scala │ │ │ │ ├── DockAppEntity.scala │ │ │ │ ├── MomentEntity.scala │ │ │ │ ├── NineCardsContentProvider.scala │ │ │ │ ├── NineCardsSqlHelper.scala │ │ │ │ ├── NineCardsUri.scala │ │ │ │ ├── UserEntity.scala │ │ │ │ └── WidgetEntity.scala │ │ │ └── repositories/ │ │ │ ├── AppRepository.scala │ │ │ ├── CardRepository.scala │ │ │ ├── CollectionRepository.scala │ │ │ ├── DockAppRepository.scala │ │ │ ├── MomentRepository.scala │ │ │ ├── RepositoryUtils.scala │ │ │ ├── UserRepository.scala │ │ │ └── WidgetRepository.scala │ │ └── test/ │ │ └── scala/ │ │ └── cards/ │ │ └── nine/ │ │ └── repository/ │ │ ├── app/ │ │ │ ├── AppRepositorySpec.scala │ │ │ └── AppRepositoryTestData.scala │ │ ├── card/ │ │ │ ├── CardRepositorySpec.scala │ │ │ └── CardRepositoryTestData.scala │ │ ├── collection/ │ │ │ ├── CollectionRepositorySpec.scala │ │ │ └── CollectionRepositoryTestData.scala │ │ ├── dockapp/ │ │ │ ├── DockAppRepositorySpec.scala │ │ │ └── DockAppRepositoryTestData.scala │ │ ├── moment/ │ │ │ ├── MomentRepositorySpec.scala │ │ │ └── MomentRepositoryTestData.scala │ │ ├── user/ │ │ │ ├── UserRepositorySpec.scala │ │ │ └── UserRepositoryTestData.scala │ │ └── widget/ │ │ ├── WidgetRepositorySpec.scala │ │ └── WidgetRepositoryTestData.scala │ └── services/ │ ├── build.sbt │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── cards/ │ │ │ └── nine/ │ │ │ └── services/ │ │ │ └── contacts/ │ │ │ └── Fields.java │ │ └── scala/ │ │ └── cards/ │ │ └── nine/ │ │ └── services/ │ │ ├── api/ │ │ │ ├── ApiServices.scala │ │ │ ├── Conversions.scala │ │ │ ├── Exceptions.scala │ │ │ └── impl/ │ │ │ └── ApiServicesImpl.scala │ │ ├── apps/ │ │ │ ├── AppsServices.scala │ │ │ ├── Exceptions.scala │ │ │ └── impl/ │ │ │ └── AppsServicesImpl.scala │ │ ├── awareness/ │ │ │ ├── AwarenessServices.scala │ │ │ └── Exceptions.scala │ │ ├── calls/ │ │ │ ├── CallsContentProvider.scala │ │ │ ├── CallsServices.scala │ │ │ ├── Exceptions.scala │ │ │ └── impl/ │ │ │ └── CallsServicesImpl.scala │ │ ├── connectivity/ │ │ │ ├── ConnectivityServices.scala │ │ │ ├── Exceptions.scala │ │ │ └── impl/ │ │ │ └── ConnectivityServicesImpl.scala │ │ ├── contacts/ │ │ │ ├── ContactsContentProvider.scala │ │ │ ├── ContactsServices.scala │ │ │ ├── Exceptions.scala │ │ │ └── impl/ │ │ │ └── ContactsServicesImpl.scala │ │ ├── image/ │ │ │ ├── Exceptions.scala │ │ │ ├── ImageServices.scala │ │ │ └── impl/ │ │ │ ├── ImageServicesImpl.scala │ │ │ └── ImageServicesTasks.scala │ │ ├── intents/ │ │ │ ├── Exceptions.scala │ │ │ ├── LauncherIntentServices.scala │ │ │ └── impl/ │ │ │ ├── IntentCreator.scala │ │ │ └── LauncherIntentServicesImpl.scala │ │ ├── permissions/ │ │ │ ├── Exceptions.scala │ │ │ └── PermissionsServices.scala │ │ ├── persistence/ │ │ │ ├── Exceptions.scala │ │ │ ├── PersistenceServices.scala │ │ │ ├── conversions/ │ │ │ │ ├── AppConversions.scala │ │ │ │ ├── CardConversions.scala │ │ │ │ ├── CollectionConversions.scala │ │ │ │ ├── Conversions.scala │ │ │ │ ├── DockAppConversions.scala │ │ │ │ ├── MomentConversions.scala │ │ │ │ ├── UserConversions.scala │ │ │ │ └── WidgetConversions.scala │ │ │ └── impl/ │ │ │ ├── AndroidPersistenceServicesImpl.scala │ │ │ ├── AppPersistenceServicesImpl.scala │ │ │ ├── CardPersistenceServicesImpl.scala │ │ │ ├── CollectionPersistenceServicesImpl.scala │ │ │ ├── DockAppPersistenceServicesImpl.scala │ │ │ ├── MomentPersistenceServicesImpl.scala │ │ │ ├── PersistenceDependencies.scala │ │ │ ├── PersistenceServicesImpl.scala │ │ │ ├── UserPersistenceServicesImpl.scala │ │ │ └── WidgetPersistenceServicesImpl.scala │ │ ├── shortcuts/ │ │ │ ├── Exceptions.scala │ │ │ ├── ShortCutsServices.scala │ │ │ └── impl/ │ │ │ └── ShortCutsServicesImpl.scala │ │ ├── track/ │ │ │ ├── Exceptions.scala │ │ │ ├── TrackServices.scala │ │ │ └── impl/ │ │ │ ├── ConsoleTrackServices.scala │ │ │ └── DisableTrackServices.scala │ │ ├── utils/ │ │ │ └── ResourceUtils.scala │ │ └── widgets/ │ │ ├── Exceptions.scala │ │ ├── WidgetsServices.scala │ │ ├── impl/ │ │ │ └── WidgetsServicesImpl.scala │ │ └── utils/ │ │ ├── AppWidgetManagerCompat.scala │ │ └── impl/ │ │ ├── AppWidgetManagerImplDefault.scala │ │ └── AppWidgetManagerImplLollipop.scala │ └── test/ │ └── scala/ │ └── cards/ │ └── nine/ │ └── services/ │ ├── api/ │ │ └── impl/ │ │ ├── ApiServicesImplData.scala │ │ └── ApiServicesImplSpec.scala │ ├── apps/ │ │ └── impl/ │ │ ├── AppsServicesImplData.scala │ │ └── AppsServicesImplSpec.scala │ ├── calls/ │ │ └── impl/ │ │ ├── CallsServicesImplData.scala │ │ └── CallsServicesImplSpec.scala │ ├── connectivity/ │ │ └── impl/ │ │ ├── ConnectivityServicesImplData.scala │ │ └── ConnectivityServicesImplSpec.scala │ ├── contacts/ │ │ └── impl/ │ │ ├── ContactsServicesImplData.scala │ │ └── ContactsServicesImplSpec.scala │ ├── image/ │ │ └── impl/ │ │ ├── ImageServicesImplData.scala │ │ ├── ImageServicesImplSpec.scala │ │ └── ImageServicesTasksSpec.scala │ ├── intents/ │ │ └── impl/ │ │ ├── LauncherIntentServicesImplData.scala │ │ └── LauncherIntentServicesImplSpec.scala │ ├── persistence/ │ │ ├── data/ │ │ │ ├── AppPersistenceServicesData.scala │ │ │ ├── CardPersistenceServicesData.scala │ │ │ ├── CollectionPersistenceServicesData.scala │ │ │ ├── DockAppPersistenceServicesData.scala │ │ │ ├── MomentPersistenceServicesData.scala │ │ │ ├── UserPersistenceServicesData.scala │ │ │ └── WidgetPersistenceServicesData.scala │ │ └── impl/ │ │ ├── AppPersistenceServicesImplSpec.scala │ │ ├── CardPersistenceServicesImplSpec.scala │ │ ├── CollectionPersistenceServicesImplSpec.scala │ │ ├── DockAppPersistenceServicesImplSpec.scala │ │ ├── MomentPersistenceServicesImplSpec.scala │ │ ├── RepositoryServicesScope.scala │ │ ├── UserPersistenceServicesImplSpec.scala │ │ └── WidgetPersistenceServicesImplSpec.scala │ ├── shortcuts/ │ │ └── impl/ │ │ ├── ShortCutsServicesImplData.scala │ │ └── ShortCutsServicesImplSpec.scala │ ├── utils/ │ │ ├── ResourceUtilsData.scala │ │ └── ResourceUtilsSpec.scala │ └── widgets/ │ └── impl/ │ ├── WidgetsServicesImplData.scala │ ├── WidgetsServicesImplSpec.scala │ └── utils/ │ └── impl/ │ ├── AppWidgetManagerData.scala │ └── AppWidgetManagerImplDefaultSpec.scala ├── ninecards.debug.keystore ├── ninecards.properties.default ├── project/ │ ├── AppBuild.scala │ ├── Crashlytics.scala │ ├── Libraries.scala │ ├── Proguard.scala │ ├── ReplacePropertiesGenerator.scala │ ├── S3.scala │ ├── Settings.scala │ ├── Versions.scala │ ├── build.properties │ ├── plugins.sbt │ └── proguard.sbt ├── scripts/ │ ├── decrypt-keys.sh │ └── publishMicrosite.sh └── travis-deploy-key.enc
SYMBOL INDEX (1284 symbols across 24 files)
FILE: modules/app/src/main/java/cards/nine/utils/SystemBarTintManager.java
class SystemBarTintManager (line 39) | public class SystemBarTintManager {
method SystemBarTintManager (line 61) | @TargetApi(19)
method setStatusBarTintEnabled (line 111) | public void setStatusBarTintEnabled(boolean enabled) {
method setNavigationBarTintEnabled (line 127) | public void setNavigationBarTintEnabled(boolean enabled) {
method setTintColor (line 139) | public void setTintColor(int color) {
method setTintResource (line 149) | public void setTintResource(int res) {
method setTintDrawable (line 159) | public void setTintDrawable(Drawable drawable) {
method setStatusBarTintColor (line 169) | public void setStatusBarTintColor(int color) {
method setStatusBarTintResource (line 180) | public void setStatusBarTintResource(int res) {
method setStatusBarTintDrawable (line 191) | @SuppressWarnings("deprecation")
method setNavigationBarTintColor (line 203) | public void setNavigationBarTintColor(int color) {
method setNavigationBarTintResource (line 214) | public void setNavigationBarTintResource(int res) {
method setNavigationBarTintDrawable (line 225) | @SuppressWarnings("deprecation")
method getConfig (line 237) | public SystemBarConfig getConfig() {
method isStatusBarTintEnabled (line 246) | public boolean isStatusBarTintEnabled() {
method isNavBarTintEnabled (line 255) | public boolean isNavBarTintEnabled() {
method setupStatusBarView (line 259) | private void setupStatusBarView(Context context, ViewGroup decorViewGr...
method setupNavBarView (line 272) | private void setupNavBarView(Context context, ViewGroup decorViewGroup) {
class SystemBarConfig (line 293) | public class SystemBarConfig {
method SystemBarConfig (line 310) | private SystemBarConfig(Activity activity, boolean translucentStatus...
method getActionBarHeight (line 323) | @TargetApi(14)
method getNavigationBarHeight (line 334) | @TargetApi(14)
method getNavigationBarWidth (line 352) | @TargetApi(14)
method getInternalDimensionSize (line 364) | private int getInternalDimensionSize(Resources res, String key) {
method getSmallestWidthDp (line 373) | @SuppressLint("NewApi")
method isNavigationAtBottom (line 394) | public boolean isNavigationAtBottom() {
method getStatusBarHeight (line 403) | public int getStatusBarHeight() {
method getActionBarHeight (line 412) | public int getActionBarHeight() {
method hasNavigationBar (line 421) | public boolean hasNavigationBar() {
method getNavigationBarHeight (line 431) | public int getNavigationBarHeight() {
method getNavigationBarWidth (line 441) | public int getNavigationBarWidth() {
method getPixelInsetTop (line 451) | public int getPixelInsetTop(boolean withActionBar) {
method getPixelInsetBottom (line 460) | public int getPixelInsetBottom() {
method getPixelInsetRight (line 473) | public int getPixelInsetRight() {
FILE: modules/mock-android/src/main/java/android/accounts/Account.java
class Account (line 6) | public class Account implements Parcelable {
method Account (line 11) | public Account(String name, String type) {
method Account (line 16) | public Account(Parcel in) {}
method equals (line 18) | public boolean equals(Object o) { return true; }
method hashCode (line 20) | public int hashCode() { return 0;}
method describeContents (line 22) | public int describeContents() { return 0;}
method writeToParcel (line 24) | public void writeToParcel(Parcel dest, int flags) {}
method toString (line 26) | public String toString() { return "";}
FILE: modules/mock-android/src/main/java/android/accounts/AccountManager.java
class AccountManager (line 19) | public class AccountManager {
method AccountManager (line 52) | AccountManager() {
method get (line 56) | public static AccountManager get(Context context) {
method getPassword (line 60) | public String getPassword(Account account) {
method getUserData (line 64) | public String getUserData(Account account, String key) {
method getAuthenticatorTypes (line 68) | public AuthenticatorDescription[] getAuthenticatorTypes() {
method getAccounts (line 72) | public Account[] getAccounts() {
method getAccountsByTypeForPackage (line 76) | public Account[] getAccountsByTypeForPackage(String type, String packa...
method getAccountsByType (line 80) | public Account[] getAccountsByType(String type) {
method hasFeatures (line 84) | public AccountManagerFuture<Boolean> hasFeatures(Account account, Stri...
method getAccountsByTypeAndFeatures (line 88) | public AccountManagerFuture<Account[]> getAccountsByTypeAndFeatures(St...
method addAccountExplicitly (line 92) | public boolean addAccountExplicitly(Account account, String password, ...
method notifyAccountAuthenticated (line 96) | public boolean notifyAccountAuthenticated(Account account) {
method renameAccount (line 100) | public AccountManagerFuture<Account> renameAccount(Account account, St...
method getPreviousName (line 104) | public String getPreviousName(Account account) {
method removeAccount (line 109) | @Deprecated
method removeAccount (line 114) | public AccountManagerFuture<Bundle> removeAccount(Account account, Act...
method removeAccountExplicitly (line 118) | public boolean removeAccountExplicitly(Account account) {
method invalidateAuthToken (line 122) | public void invalidateAuthToken(String accountType, String authToken) {
method peekAuthToken (line 126) | public String peekAuthToken(Account account, String authTokenType) {
method setPassword (line 130) | public void setPassword(Account account, String password) {
method clearPassword (line 134) | public void clearPassword(Account account) {
method setUserData (line 138) | public void setUserData(Account account, String key, String value) {
method setAuthToken (line 142) | public void setAuthToken(Account account, String authTokenType, String...
method blockingGetAuthToken (line 146) | public String blockingGetAuthToken(Account account, String authTokenTy...
method getAuthToken (line 150) | public AccountManagerFuture<Bundle> getAuthToken(Account account, Stri...
method getAuthToken (line 155) | @Deprecated
method getAuthToken (line 160) | public AccountManagerFuture<Bundle> getAuthToken(Account account, Stri...
method addAccount (line 164) | public AccountManagerFuture<Bundle> addAccount(String accountType, Str...
method confirmCredentials (line 168) | public AccountManagerFuture<Bundle> confirmCredentials(Account account...
method updateCredentials (line 172) | public AccountManagerFuture<Bundle> updateCredentials(Account account,...
method editProperties (line 176) | public AccountManagerFuture<Bundle> editProperties(String accountType,...
method getAuthTokenByFeatures (line 180) | public AccountManagerFuture<Bundle> getAuthTokenByFeatures(String acco...
method newChooseAccountIntent (line 185) | @Deprecated
method newChooseAccountIntent (line 190) | public static Intent newChooseAccountIntent(Account selectedAccount, L...
method addOnAccountsUpdatedListener (line 194) | public void addOnAccountsUpdatedListener(OnAccountsUpdateListener list...
method removeOnAccountsUpdatedListener (line 198) | public void removeOnAccountsUpdatedListener(OnAccountsUpdateListener l...
FILE: modules/mock-android/src/main/java/android/accounts/AccountsException.java
class AccountsException (line 3) | public class AccountsException extends Exception {
method AccountsException (line 4) | public AccountsException() {
method AccountsException (line 7) | public AccountsException(String message) {
method AccountsException (line 10) | public AccountsException(String message, Throwable cause) {
method AccountsException (line 13) | public AccountsException(Throwable cause) {
FILE: modules/mock-android/src/main/java/android/accounts/OperationCanceledException.java
class OperationCanceledException (line 3) | public class OperationCanceledException extends AccountsException {
method OperationCanceledException (line 4) | public OperationCanceledException() {
method OperationCanceledException (line 7) | public OperationCanceledException(String message) {
method OperationCanceledException (line 10) | public OperationCanceledException(String message, Throwable cause) {
method OperationCanceledException (line 13) | public OperationCanceledException(Throwable cause) {
FILE: modules/mock-android/src/main/java/android/app/Activity.java
class Activity (line 6) | public class Activity
method Activity (line 10) | public Activity() { throw new RuntimeException("Stub!"); }
method getIntent (line 11) | public android.content.Intent getIntent() { throw new RuntimeExceptio...
method setIntent (line 12) | public void setIntent(android.content.Intent newIntent) { throw new R...
method getApplication (line 13) | public final android.app.Application getApplication() { throw new Run...
method isChild (line 14) | public final boolean isChild() { throw new RuntimeException("Stub!"); }
method getParent (line 15) | public final android.app.Activity getParent() { throw new RuntimeExce...
method getWindowManager (line 16) | public android.view.WindowManager getWindowManager() { throw new Runt...
method getWindow (line 17) | public android.view.Window getWindow() { throw new RuntimeException("...
method getLoaderManager (line 18) | public android.app.LoaderManager getLoaderManager() { throw new Runti...
method getCurrentFocus (line 19) | public android.view.View getCurrentFocus() { throw new RuntimeExcepti...
method onCreate (line 20) | protected void onCreate(android.os.Bundle savedInstanceState) { throw...
method onRestoreInstanceState (line 21) | protected void onRestoreInstanceState(android.os.Bundle savedInstance...
method onPostCreate (line 22) | protected void onPostCreate(android.os.Bundle savedInstanceState) { t...
method onStart (line 23) | protected void onStart() { throw new RuntimeException("Stub!"); }
method onRestart (line 24) | protected void onRestart() { throw new RuntimeException("Stub!"); }
method onResume (line 25) | protected void onResume() { throw new RuntimeException("Stub!"); }
method onPostResume (line 26) | protected void onPostResume() { throw new RuntimeException("Stub!"); }
method onNewIntent (line 27) | protected void onNewIntent(android.content.Intent intent) { throw new...
method onSaveInstanceState (line 28) | protected void onSaveInstanceState(android.os.Bundle outState) { thro...
method onPause (line 29) | protected void onPause() { throw new RuntimeException("Stub!"); }
method onUserLeaveHint (line 30) | protected void onUserLeaveHint() { throw new RuntimeException("Stub!"...
method onCreateThumbnail (line 31) | public boolean onCreateThumbnail(android.graphics.Bitmap outBitmap, a...
method onCreateDescription (line 32) | public java.lang.CharSequence onCreateDescription() { throw new Runti...
method onStop (line 33) | protected void onStop() { throw new RuntimeException("Stub!"); }
method onDestroy (line 34) | protected void onDestroy() { throw new RuntimeException("Stub!"); }
method onConfigurationChanged (line 35) | public void onConfigurationChanged(android.content.res.Configuration ...
method getChangingConfigurations (line 36) | public int getChangingConfigurations() { throw new RuntimeException("...
method getLastNonConfigurationInstance (line 37) | @java.lang.Deprecated()
method onRetainNonConfigurationInstance (line 39) | @Deprecated
method onLowMemory (line 41) | public void onLowMemory() { throw new RuntimeException("Stub!"); }
method onTrimMemory (line 42) | public void onTrimMemory(int level) { throw new RuntimeException("Stu...
method getFragmentManager (line 43) | public android.app.FragmentManager getFragmentManager() { throw new R...
method onAttachFragment (line 44) | public void onAttachFragment(android.app.Fragment fragment) { throw n...
method managedQuery (line 45) | @java.lang.Deprecated()
method startManagingCursor (line 47) | @java.lang.Deprecated()
method stopManagingCursor (line 49) | @java.lang.Deprecated()
method findViewById (line 51) | public android.view.View findViewById(int id) { throw new RuntimeExce...
method getActionBar (line 52) | public android.app.ActionBar getActionBar() { throw new RuntimeExcept...
method setContentView (line 53) | public void setContentView(int layoutResID) { throw new RuntimeExcept...
method setContentView (line 54) | public void setContentView(android.view.View view) { throw new Runtim...
method setContentView (line 55) | public void setContentView(android.view.View view, android.view.ViewG...
method addContentView (line 56) | public void addContentView(android.view.View view, android.view.ViewG...
method setFinishOnTouchOutside (line 57) | public void setFinishOnTouchOutside(boolean finish) { throw new Runti...
method setDefaultKeyMode (line 58) | public final void setDefaultKeyMode(int mode) { throw new RuntimeExce...
method onKeyDown (line 59) | public boolean onKeyDown(int keyCode, android.view.KeyEvent event) { ...
method onKeyLongPress (line 60) | public boolean onKeyLongPress(int keyCode, android.view.KeyEvent even...
method onKeyUp (line 61) | public boolean onKeyUp(int keyCode, android.view.KeyEvent event) { th...
method onKeyMultiple (line 62) | public boolean onKeyMultiple(int keyCode, int repeatCount, android.vi...
method onBackPressed (line 63) | public void onBackPressed() { throw new RuntimeException("Stub!"); }
method onKeyShortcut (line 64) | public boolean onKeyShortcut(int keyCode, android.view.KeyEvent event...
method onTouchEvent (line 65) | public boolean onTouchEvent(android.view.MotionEvent event) { throw n...
method onTrackballEvent (line 66) | public boolean onTrackballEvent(android.view.MotionEvent event) { thr...
method onGenericMotionEvent (line 67) | public boolean onGenericMotionEvent(android.view.MotionEvent event) {...
method onUserInteraction (line 68) | public void onUserInteraction() { throw new RuntimeException("Stub!"); }
method onWindowAttributesChanged (line 69) | public void onWindowAttributesChanged(android.view.WindowManager.Layo...
method onContentChanged (line 70) | public void onContentChanged() { throw new RuntimeException("Stub!"); }
method onWindowFocusChanged (line 71) | public void onWindowFocusChanged(boolean hasFocus) { throw new Runtim...
method onAttachedToWindow (line 72) | public void onAttachedToWindow() { throw new RuntimeException("Stub!"...
method onDetachedFromWindow (line 73) | public void onDetachedFromWindow() { throw new RuntimeException("Stub...
method hasWindowFocus (line 74) | public boolean hasWindowFocus() { throw new RuntimeException("Stub!"); }
method dispatchKeyEvent (line 75) | public boolean dispatchKeyEvent(android.view.KeyEvent event) { throw ...
method dispatchKeyShortcutEvent (line 76) | public boolean dispatchKeyShortcutEvent(android.view.KeyEvent event) ...
method dispatchTouchEvent (line 77) | public boolean dispatchTouchEvent(android.view.MotionEvent ev) { thro...
method dispatchTrackballEvent (line 78) | public boolean dispatchTrackballEvent(android.view.MotionEvent ev) { ...
method dispatchGenericMotionEvent (line 79) | public boolean dispatchGenericMotionEvent(android.view.MotionEvent ev...
method dispatchPopulateAccessibilityEvent (line 80) | public boolean dispatchPopulateAccessibilityEvent(android.view.access...
method onCreatePanelView (line 81) | public android.view.View onCreatePanelView(int featureId) { throw new...
method onCreatePanelMenu (line 82) | public boolean onCreatePanelMenu(int featureId, android.view.Menu men...
method onPreparePanel (line 83) | public boolean onPreparePanel(int featureId, android.view.View view, ...
method onMenuOpened (line 84) | public boolean onMenuOpened(int featureId, android.view.Menu menu) { ...
method onMenuItemSelected (line 85) | public boolean onMenuItemSelected(int featureId, android.view.MenuIte...
method onPanelClosed (line 86) | public void onPanelClosed(int featureId, android.view.Menu menu) { th...
method invalidateOptionsMenu (line 87) | public void invalidateOptionsMenu() { throw new RuntimeException("Stu...
method onCreateOptionsMenu (line 88) | public boolean onCreateOptionsMenu(android.view.Menu menu) { throw ne...
method onPrepareOptionsMenu (line 89) | public boolean onPrepareOptionsMenu(android.view.Menu menu) { throw n...
method onOptionsItemSelected (line 90) | public boolean onOptionsItemSelected(android.view.MenuItem item) { th...
method onNavigateUp (line 91) | public boolean onNavigateUp() { throw new RuntimeException("Stub!"); }
method onNavigateUpFromChild (line 92) | public boolean onNavigateUpFromChild(android.app.Activity child) { th...
method onCreateNavigateUpTaskStack (line 93) | public void onCreateNavigateUpTaskStack(android.app.TaskStackBuilder ...
method onPrepareNavigateUpTaskStack (line 94) | public void onPrepareNavigateUpTaskStack(android.app.TaskStackBuilder...
method onOptionsMenuClosed (line 95) | public void onOptionsMenuClosed(android.view.Menu menu) { throw new R...
method openOptionsMenu (line 96) | public void openOptionsMenu() { throw new RuntimeException("Stub!"); }
method closeOptionsMenu (line 97) | public void closeOptionsMenu() { throw new RuntimeException("Stub!"); }
method onCreateContextMenu (line 98) | public void onCreateContextMenu(android.view.ContextMenu menu, androi...
method registerForContextMenu (line 99) | public void registerForContextMenu(android.view.View view) { throw ne...
method unregisterForContextMenu (line 100) | public void unregisterForContextMenu(android.view.View view) { throw ...
method openContextMenu (line 101) | public void openContextMenu(android.view.View view) { throw new Runti...
method closeContextMenu (line 102) | public void closeContextMenu() { throw new RuntimeException("Stub!"); }
method onContextItemSelected (line 103) | public boolean onContextItemSelected(android.view.MenuItem item) { th...
method onContextMenuClosed (line 104) | public void onContextMenuClosed(android.view.Menu menu) { throw new R...
method onCreateDialog (line 105) | @java.lang.Deprecated()
method onCreateDialog (line 107) | @java.lang.Deprecated()
method onPrepareDialog (line 109) | @java.lang.Deprecated()
method onPrepareDialog (line 111) | @java.lang.Deprecated()
method showDialog (line 113) | @java.lang.Deprecated()
method showDialog (line 115) | @java.lang.Deprecated()
method dismissDialog (line 117) | @java.lang.Deprecated()
method removeDialog (line 119) | @java.lang.Deprecated()
method onSearchRequested (line 121) | public boolean onSearchRequested() { throw new RuntimeException("Stub...
method onSearchRequested (line 122) | public boolean onSearchRequested(SearchEvent searchEvent) {throw new R...
method startSearch (line 123) | public void startSearch(java.lang.String initialQuery, boolean select...
method triggerSearch (line 124) | public void triggerSearch(java.lang.String query, android.os.Bundle a...
method takeKeyEvents (line 125) | public void takeKeyEvents(boolean get) { throw new RuntimeException("...
method requestWindowFeature (line 126) | public final boolean requestWindowFeature(int featureId) { throw new ...
method setFeatureDrawableResource (line 127) | public final void setFeatureDrawableResource(int featureId, int resId...
method setFeatureDrawableUri (line 128) | public final void setFeatureDrawableUri(int featureId, android.net.Ur...
method setFeatureDrawable (line 129) | public final void setFeatureDrawable(int featureId, android.graphics....
method setFeatureDrawableAlpha (line 130) | public final void setFeatureDrawableAlpha(int featureId, int alpha) {...
method getLayoutInflater (line 131) | public android.view.LayoutInflater getLayoutInflater() { throw new Ru...
method getMenuInflater (line 132) | public android.view.MenuInflater getMenuInflater() { throw new Runtim...
method onApplyThemeResource (line 133) | protected void onApplyThemeResource(android.content.res.Resources.The...
method startActivityForResult (line 134) | public void startActivityForResult(android.content.Intent intent, int...
method startActivityForResult (line 135) | public void startActivityForResult(android.content.Intent intent, int...
method startIntentSenderForResult (line 136) | public void startIntentSenderForResult(android.content.IntentSender i...
method startIntentSenderForResult (line 137) | public void startIntentSenderForResult(android.content.IntentSender i...
method startActivity (line 138) | public void startActivity(android.content.Intent intent) { throw new ...
method startActivity (line 139) | public void startActivity(android.content.Intent intent, android.os.B...
method startActivities (line 140) | public void startActivities(android.content.Intent[] intents) { throw...
method startActivities (line 141) | public void startActivities(android.content.Intent[] intents, android...
method startIntentSender (line 142) | public void startIntentSender(android.content.IntentSender intent, an...
method startIntentSender (line 143) | public void startIntentSender(android.content.IntentSender intent, an...
method startActivityIfNeeded (line 144) | public boolean startActivityIfNeeded(android.content.Intent intent, i...
method startActivityIfNeeded (line 145) | public boolean startActivityIfNeeded(android.content.Intent intent, i...
method startNextMatchingActivity (line 146) | public boolean startNextMatchingActivity(android.content.Intent inten...
method startNextMatchingActivity (line 147) | public boolean startNextMatchingActivity(android.content.Intent inten...
method startActivityFromChild (line 148) | public void startActivityFromChild(android.app.Activity child, androi...
method startActivityFromChild (line 149) | public void startActivityFromChild(android.app.Activity child, androi...
method startActivityFromFragment (line 150) | public void startActivityFromFragment(android.app.Fragment fragment, ...
method startActivityFromFragment (line 151) | public void startActivityFromFragment(android.app.Fragment fragment, ...
method startIntentSenderFromChild (line 152) | public void startIntentSenderFromChild(android.app.Activity child, an...
method startIntentSenderFromChild (line 153) | public void startIntentSenderFromChild(android.app.Activity child, an...
method overridePendingTransition (line 154) | public void overridePendingTransition(int enterAnim, int exitAnim) { ...
method setResult (line 155) | public void setResult(int resultCode) { }
method setResult (line 156) | public void setResult(int resultCode, android.content.Intent data) { }
method getCallingPackage (line 157) | public java.lang.String getCallingPackage() { throw new RuntimeExcept...
method getCallingActivity (line 158) | public android.content.ComponentName getCallingActivity() { throw new...
method setVisible (line 159) | public void setVisible(boolean visible) { throw new RuntimeException(...
method isFinishing (line 160) | public boolean isFinishing() { throw new RuntimeException("Stub!"); }
method isChangingConfigurations (line 161) | public boolean isChangingConfigurations() { throw new RuntimeExceptio...
method recreate (line 162) | public void recreate() { throw new RuntimeException("Stub!"); }
method finish (line 163) | public void finish() { }
method finishAffinity (line 164) | public void finishAffinity() { throw new RuntimeException("Stub!"); }
method finishFromChild (line 165) | public void finishFromChild(android.app.Activity child) { throw new R...
method finishActivity (line 166) | public void finishActivity(int requestCode) { throw new RuntimeExcept...
method finishActivityFromChild (line 167) | public void finishActivityFromChild(android.app.Activity child, int r...
method onActivityResult (line 168) | protected void onActivityResult(int requestCode, int resultCode, andr...
method createPendingResult (line 169) | public android.app.PendingIntent createPendingResult(int requestCode,...
method setRequestedOrientation (line 170) | public void setRequestedOrientation(int requestedOrientation) { throw...
method getRequestedOrientation (line 171) | public int getRequestedOrientation() { throw new RuntimeException("St...
method getTaskId (line 172) | public int getTaskId() { throw new RuntimeException("Stub!"); }
method isTaskRoot (line 173) | public boolean isTaskRoot() { throw new RuntimeException("Stub!"); }
method moveTaskToBack (line 174) | public boolean moveTaskToBack(boolean nonRoot) { throw new RuntimeExc...
method getLocalClassName (line 175) | public java.lang.String getLocalClassName() { throw new RuntimeExcept...
method getComponentName (line 176) | public android.content.ComponentName getComponentName() { throw new R...
method getPreferences (line 177) | public android.content.SharedPreferences getPreferences(int mode) { t...
method getSystemService (line 178) | public java.lang.Object getSystemService(java.lang.String name) { thr...
method setTitle (line 179) | public void setTitle(java.lang.CharSequence title) { throw new Runtim...
method setTitle (line 180) | public void setTitle(int titleId) { throw new RuntimeException("Stub!...
method setTitleColor (line 181) | public void setTitleColor(int textColor) { throw new RuntimeException...
method getTitle (line 182) | public final java.lang.CharSequence getTitle() { throw new RuntimeExc...
method getTitleColor (line 183) | public final int getTitleColor() { throw new RuntimeException("Stub!"...
method onTitleChanged (line 184) | protected void onTitleChanged(java.lang.CharSequence title, int color...
method onChildTitleChanged (line 185) | protected void onChildTitleChanged(android.app.Activity childActivity...
method setProgressBarVisibility (line 186) | public final void setProgressBarVisibility(boolean visible) { throw n...
method setProgressBarIndeterminateVisibility (line 187) | public final void setProgressBarIndeterminateVisibility(boolean visib...
method setProgressBarIndeterminate (line 188) | public final void setProgressBarIndeterminate(boolean indeterminate) ...
method setProgress (line 189) | public final void setProgress(int progress) { throw new RuntimeExcept...
method setSecondaryProgress (line 190) | public final void setSecondaryProgress(int secondaryProgress) { throw...
method setVolumeControlStream (line 191) | public final void setVolumeControlStream(int streamType) { throw new ...
method getVolumeControlStream (line 192) | public final int getVolumeControlStream() { throw new RuntimeExceptio...
method runOnUiThread (line 193) | public final void runOnUiThread(java.lang.Runnable action) { throw ne...
method onCreateView (line 194) | public android.view.View onCreateView(java.lang.String name, android....
method onCreateView (line 195) | public android.view.View onCreateView(android.view.View parent, java....
method dump (line 196) | public void dump(java.lang.String prefix, java.io.FileDescriptor fd, ...
method startActionMode (line 197) | public android.view.ActionMode startActionMode(android.view.ActionMod...
method onWindowStartingActionMode (line 198) | public android.view.ActionMode onWindowStartingActionMode(android.vie...
method onWindowStartingActionMode (line 199) | public ActionMode onWindowStartingActionMode(ActionMode.Callback callb...
method onActionModeStarted (line 202) | public void onActionModeStarted(android.view.ActionMode mode) { throw...
method onActionModeFinished (line 203) | public void onActionModeFinished(android.view.ActionMode mode) { thro...
method shouldUpRecreateTask (line 204) | public boolean shouldUpRecreateTask(android.content.Intent targetInte...
method navigateUpTo (line 205) | public boolean navigateUpTo(android.content.Intent upIntent) { throw ...
method navigateUpToFromChild (line 206) | public boolean navigateUpToFromChild(android.app.Activity child, andr...
method getParentActivityIntent (line 207) | public android.content.Intent getParentActivityIntent() { throw new R...
FILE: modules/mock-android/src/main/java/android/content/ComponentName.java
class ComponentName (line 4) | public class ComponentName {
method ComponentName (line 8) | public ComponentName(String pkg, String cls) {
method ComponentName (line 15) | public ComponentName(Context pkg, String cls) {
method ComponentName (line 21) | public ComponentName(Context pkg, Class<?> cls) {
method getPackageName (line 26) | public String getPackageName() {
method getClassName (line 30) | public String getClassName() {
FILE: modules/mock-android/src/main/java/android/content/ContentResolver.java
class ContentResolver (line 2) | public abstract class ContentResolver
method ContentResolver (line 4) | public ContentResolver(android.content.Context context) { throw new R...
method getType (line 5) | public java.lang.String getType(android.net.Uri url) { throw new Run...
method getStreamTypes (line 6) | public java.lang.String[] getStreamTypes(android.net.Uri url, java.la...
method query (line 7) | public android.database.Cursor query(android.net.Uri uri, java.lang....
method query (line 8) | public android.database.Cursor query(android.net.Uri uri, java.lang....
method openInputStream (line 9) | public java.io.InputStream openInputStream(android.net.Uri uri) thro...
method openOutputStream (line 10) | public java.io.OutputStream openOutputStream(android.net.Uri uri) th...
method openOutputStream (line 11) | public java.io.OutputStream openOutputStream(android.net.Uri uri, ja...
method openFileDescriptor (line 12) | public android.os.ParcelFileDescriptor openFileDescriptor(android.ne...
method openAssetFileDescriptor (line 13) | public android.content.res.AssetFileDescriptor openAssetFileDescript...
method openTypedAssetFileDescriptor (line 14) | public android.content.res.AssetFileDescriptor openTypedAssetFileDes...
method insert (line 15) | public android.net.Uri insert(android.net.Uri url, android.content.C...
method applyBatch (line 16) | public android.content.ContentProviderResult[] applyBatch(java.lang.S...
method bulkInsert (line 17) | public int bulkInsert(android.net.Uri url, android.content.ContentVa...
method delete (line 18) | public int delete(android.net.Uri url, java.lang.String where, java....
method update (line 19) | public int update(android.net.Uri uri, android.content.ContentValues...
method call (line 20) | public android.os.Bundle call(android.net.Uri uri, java.lang.String ...
method acquireContentProviderClient (line 21) | public android.content.ContentProviderClient acquireContentProviderC...
method acquireContentProviderClient (line 22) | public android.content.ContentProviderClient acquireContentProviderC...
method acquireUnstableContentProviderClient (line 23) | public android.content.ContentProviderClient acquireUnstableContentP...
method acquireUnstableContentProviderClient (line 24) | public android.content.ContentProviderClient acquireUnstableContentP...
method registerContentObserver (line 25) | public void registerContentObserver(android.net.Uri uri, boolean not...
method unregisterContentObserver (line 26) | public void unregisterContentObserver(android.database.ContentObserv...
method notifyChange (line 27) | public void notifyChange(android.net.Uri uri, android.database.Conten...
method notifyChange (line 28) | public void notifyChange(android.net.Uri uri, android.database.Conten...
method startSync (line 29) | @java.lang.Deprecated()
method requestSync (line 31) | public static void requestSync(android.accounts.Account account, java...
method validateSyncExtrasBundle (line 32) | public static void validateSyncExtrasBundle(android.os.Bundle extras)...
method cancelSync (line 33) | @java.lang.Deprecated()
method cancelSync (line 35) | public static void cancelSync(android.accounts.Account account, java....
method getSyncAdapterTypes (line 36) | public static android.content.SyncAdapterType[] getSyncAdapterTypes()...
method getSyncAutomatically (line 37) | public static boolean getSyncAutomatically(android.accounts.Account a...
method setSyncAutomatically (line 38) | public static void setSyncAutomatically(android.accounts.Account acco...
method addPeriodicSync (line 39) | public static void addPeriodicSync(android.accounts.Account account, ...
method removePeriodicSync (line 40) | public static void removePeriodicSync(android.accounts.Account accoun...
method getPeriodicSyncs (line 41) | public static java.util.List<android.content.PeriodicSync> getPeriodi...
method getIsSyncable (line 42) | public static int getIsSyncable(android.accounts.Account account, jav...
method setIsSyncable (line 43) | public static void setIsSyncable(android.accounts.Account account, ja...
method getMasterSyncAutomatically (line 44) | public static boolean getMasterSyncAutomatically() { throw new Runtim...
method setMasterSyncAutomatically (line 45) | public static void setMasterSyncAutomatically(boolean sync) { throw n...
method isSyncActive (line 46) | public static boolean isSyncActive(android.accounts.Account account, ...
method getCurrentSync (line 47) | @java.lang.Deprecated()
method getCurrentSyncs (line 49) | public static java.util.List<android.content.SyncInfo> getCurrentSync...
method isSyncPending (line 50) | public static boolean isSyncPending(android.accounts.Account account,...
method addStatusChangeListener (line 51) | public static java.lang.Object addStatusChangeListener(int mask, andr...
method removeStatusChangeListener (line 52) | public static void removeStatusChangeListener(java.lang.Object handle...
FILE: modules/mock-android/src/main/java/android/content/Intent.java
class Intent (line 8) | public class Intent implements android.os.Parcelable, Cloneable {
class ShortcutIconResource (line 13) | public static class ShortcutIconResource implements android.os.Parcela...
method ShortcutIconResource (line 14) | public ShortcutIconResource() { }
method fromContext (line 15) | public static Intent.ShortcutIconResource fromContext(android.conte...
method describeContents (line 16) | public int describeContents() { throw new RuntimeException("<Stub>!...
method writeToParcel (line 17) | public void writeToParcel(android.os.Parcel dest, int flags) { thro...
method toString (line 18) | public String toString() { throw new RuntimeException("<Stub>!"); }
class FilterComparison (line 24) | public static final class FilterComparison {
method FilterComparison (line 25) | public FilterComparison(Intent intent) { throw new RuntimeException...
method getIntent (line 26) | public Intent getIntent() { throw new RuntimeException("<Stub>!"); }
method equals (line 27) | public boolean equals(Object obj) { throw new RuntimeException("<St...
method hashCode (line 28) | public int hashCode() { throw new RuntimeException("<Stub>!"); }
method Intent (line 30) | public Intent() { }
method Intent (line 31) | public Intent(Intent o) { }
method Intent (line 32) | public Intent(String action) { this.action = action; }
method Intent (line 33) | public Intent(String action, Uri uri) { this.action = action; }
method Intent (line 34) | public Intent(android.content.Context packageContext, Class<?> cls) { }
method Intent (line 35) | public Intent(String action, Uri uri, android.content.Context package...
method createChooser (line 36) | public static Intent createChooser(Intent target, CharSequence title)...
method clone (line 37) | public Object clone() { throw new RuntimeException("<Stub>!"); }
method cloneFilter (line 38) | public Intent cloneFilter() { throw new RuntimeException("<Stub>!"); }
method makeMainActivity (line 39) | public static Intent makeMainActivity(android.content.ComponentName m...
method makeMainSelectorActivity (line 40) | public static Intent makeMainSelectorActivity(String selectorAction, ...
method makeRestartActivityTask (line 41) | public static Intent makeRestartActivityTask(android.content.Componen...
method getIntent (line 42) | @Deprecated()
method parseUri (line 44) | public static Intent parseUri(String uri, int flags) throws java.net....
method getIntentOld (line 45) | public static Intent getIntentOld(String uri) throws java.net.URISynt...
method getAction (line 46) | public String getAction() { return action; }
method getData (line 47) | public Uri getData() { return null; }
method getDataString (line 48) | public String getDataString() { throw new RuntimeException("<Stub>!"); }
method getScheme (line 49) | public String getScheme() { throw new RuntimeException("<Stub>!"); }
method getType (line 50) | public String getType() { return ""; }
method resolveType (line 51) | public String resolveType(android.content.Context context) { throw ne...
method resolveType (line 52) | public String resolveType(android.content.ContentResolver resolver) {...
method resolveTypeIfNeeded (line 53) | public String resolveTypeIfNeeded(android.content.ContentResolver res...
method hasCategory (line 54) | public boolean hasCategory(String category) { throw new RuntimeExcept...
method getCategories (line 55) | public java.util.Set<String> getCategories() { return new java.util.H...
method getSelector (line 56) | public Intent getSelector() { throw new RuntimeException("<Stub>!"); }
method getClipData (line 57) | public android.content.ClipData getClipData() { throw new RuntimeExce...
method setExtrasClassLoader (line 58) | public void setExtrasClassLoader(ClassLoader loader) { throw new Runt...
method hasExtra (line 59) | public boolean hasExtra(String name) {
method hasFileDescriptors (line 62) | public boolean hasFileDescriptors() { throw new RuntimeException("<St...
method getBooleanExtra (line 63) | public boolean getBooleanExtra(String name, boolean defaultValue) { r...
method getByteExtra (line 64) | public byte getByteExtra(String name, byte defaultValue) { throw new ...
method getShortExtra (line 65) | public short getShortExtra(String name, short defaultValue) { throw n...
method getCharExtra (line 66) | public char getCharExtra(String name, char defaultValue) { throw new ...
method getIntExtra (line 67) | public int getIntExtra(String name, int defaultValue) { return 0; }
method getLongExtra (line 68) | public long getLongExtra(String name, long defaultValue) { return 0; }
method getFloatExtra (line 69) | public float getFloatExtra(String name, float defaultValue) { return ...
method getDoubleExtra (line 70) | public double getDoubleExtra(String name, double defaultValue) { retu...
method getStringExtra (line 71) | public String getStringExtra(String name) {
method getCharSequenceExtra (line 74) | public CharSequence getCharSequenceExtra(String name) { throw new Run...
method getParcelableExtra (line 75) | public <T extends android.os.Parcelable> T getParcelableExtra(String n...
method getParcelableArrayExtra (line 76) | public android.os.Parcelable[] getParcelableArrayExtra(String name) {...
method getParcelableArrayListExtra (line 77) | public <T extends android.os.Parcelable> java.util.ArrayList<T> getPar...
method getSerializableExtra (line 78) | public java.io.Serializable getSerializableExtra(String name) { throw...
method getIntegerArrayListExtra (line 79) | public java.util.ArrayList<Integer> getIntegerArrayListExtra(String n...
method getStringArrayListExtra (line 80) | public java.util.ArrayList<String> getStringArrayListExtra(String nam...
method getCharSequenceArrayListExtra (line 81) | public java.util.ArrayList<CharSequence> getCharSequenceArrayListExtr...
method getBooleanArrayExtra (line 82) | public boolean[] getBooleanArrayExtra(String name) { throw new Runtim...
method getByteArrayExtra (line 83) | public byte[] getByteArrayExtra(String name) { throw new RuntimeExcep...
method getShortArrayExtra (line 84) | public short[] getShortArrayExtra(String name) { throw new RuntimeExc...
method getCharArrayExtra (line 85) | public char[] getCharArrayExtra(String name) { throw new RuntimeExcep...
method getIntArrayExtra (line 86) | public int[] getIntArrayExtra(String name) { throw new RuntimeExcepti...
method getLongArrayExtra (line 87) | public long[] getLongArrayExtra(String name) { throw new RuntimeExcep...
method getFloatArrayExtra (line 88) | public float[] getFloatArrayExtra(String name) { throw new RuntimeExc...
method getDoubleArrayExtra (line 89) | public double[] getDoubleArrayExtra(String name) { throw new RuntimeE...
method getStringArrayExtra (line 90) | public String[] getStringArrayExtra(String name) { throw new RuntimeE...
method getCharSequenceArrayExtra (line 91) | public CharSequence[] getCharSequenceArrayExtra(String name) { throw ...
method getBundleExtra (line 92) | public Bundle getBundleExtra(String name) { throw new RuntimeExceptio...
method getExtras (line 93) | public Bundle getExtras() { return null; }
method getFlags (line 94) | public int getFlags() { return 1; }
method getPackage (line 95) | public String getPackage() { throw new RuntimeException("<Stub>!"); }
method getComponent (line 96) | public android.content.ComponentName getComponent() { return new andr...
method getSourceBounds (line 97) | public android.graphics.Rect getSourceBounds() { throw new RuntimeExc...
method resolveActivity (line 98) | public android.content.ComponentName resolveActivity(android.content....
method resolveActivityInfo (line 99) | public android.content.pm.ActivityInfo resolveActivityInfo(android.co...
method setAction (line 100) | public Intent setAction(String action) {
method setData (line 104) | public Intent setData(Uri data) { return this; }
method setDataAndNormalize (line 105) | public Intent setDataAndNormalize(Uri data) { return this; }
method setType (line 106) | public Intent setType(String type) { return this; }
method setTypeAndNormalize (line 107) | public Intent setTypeAndNormalize(String type) { return this; }
method setDataAndType (line 108) | public Intent setDataAndType(Uri data, String type) { return this; }
method setDataAndTypeAndNormalize (line 109) | public Intent setDataAndTypeAndNormalize(Uri data, String type) { ret...
method addCategory (line 110) | public Intent addCategory(String category) { return this; }
method removeCategory (line 111) | public void removeCategory(String category) { throw new RuntimeExcept...
method setSelector (line 112) | public void setSelector(Intent selector) { throw new RuntimeException...
method setClipData (line 113) | public void setClipData(android.content.ClipData clip) { throw new Ru...
method putExtra (line 114) | public Intent putExtra(String name, boolean value) { return this; }
method putExtra (line 115) | public Intent putExtra(String name, byte value) { return this; }
method putExtra (line 116) | public Intent putExtra(String name, char value) { return this; }
method putExtra (line 117) | public Intent putExtra(String name, short value) { return this; }
method putExtra (line 118) | public Intent putExtra(String name, int value) { return this; }
method putExtra (line 119) | public Intent putExtra(String name, long value) { return this; }
method putExtra (line 120) | public Intent putExtra(String name, float value) { return this; }
method putExtra (line 121) | public Intent putExtra(String name, double value) { return this; }
method putExtra (line 122) | public Intent putExtra(String name, String value) {
method putExtra (line 126) | public Intent putExtra(String name, CharSequence value) { return this; }
method putExtra (line 127) | public Intent putExtra(String name, android.os.Parcelable value) { re...
method putExtra (line 128) | public Intent putExtra(String name, android.os.Parcelable[] value) { ...
method putParcelableArrayListExtra (line 129) | public Intent putParcelableArrayListExtra(String name, java.util.Arra...
method putIntegerArrayListExtra (line 130) | public Intent putIntegerArrayListExtra(String name, java.util.ArrayLi...
method putStringArrayListExtra (line 131) | public Intent putStringArrayListExtra(String name, java.util.ArrayLis...
method putCharSequenceArrayListExtra (line 132) | public Intent putCharSequenceArrayListExtra(String name, java.util.Ar...
method putExtra (line 133) | public Intent putExtra(String name, java.io.Serializable value) { ret...
method putExtra (line 134) | public Intent putExtra(String name, boolean[] value) { return this; }
method putExtra (line 135) | public Intent putExtra(String name, byte[] value) { return this; }
method putExtra (line 136) | public Intent putExtra(String name, short[] value) { return this; }
method putExtra (line 137) | public Intent putExtra(String name, char[] value) { return this; }
method putExtra (line 138) | public Intent putExtra(String name, int[] value) { return this; }
method putExtra (line 139) | public Intent putExtra(String name, long[] value) { return this; }
method putExtra (line 140) | public Intent putExtra(String name, float[] value) { return this; }
method putExtra (line 141) | public Intent putExtra(String name, double[] value) { return this; }
method putExtra (line 142) | public Intent putExtra(String name, String[] value) { return this; }
method putExtra (line 143) | public Intent putExtra(String name, CharSequence[] value) { return th...
method putExtra (line 144) | public Intent putExtra(String name, Bundle value) { return this; }
method putExtras (line 145) | public Intent putExtras(Intent src) { return this; }
method putExtras (line 146) | public Intent putExtras(Bundle extras) { return this; }
method replaceExtras (line 147) | public Intent replaceExtras(Intent src) { return this; }
method replaceExtras (line 148) | public Intent replaceExtras(Bundle extras) { return this; }
method removeExtra (line 149) | public void removeExtra(String name) { throw new RuntimeException("<S...
method setFlags (line 150) | public Intent setFlags(int flags) { return this; }
method addFlags (line 151) | public Intent addFlags(int flags) { throw new RuntimeException("<Stub...
method setPackage (line 152) | public Intent setPackage(String packageName) { throw new RuntimeExcep...
method setComponent (line 153) | public Intent setComponent(android.content.ComponentName component) {...
method setClassName (line 154) | public Intent setClassName(android.content.Context packageContext, St...
method setClassName (line 155) | public Intent setClassName(String packageName, String className) { re...
method setClass (line 156) | public Intent setClass(android.content.Context packageContext, Class<...
method setSourceBounds (line 157) | public void setSourceBounds(android.graphics.Rect r) { throw new Runt...
method fillIn (line 158) | public int fillIn(Intent other, int flags) { return 0; }
method filterEquals (line 159) | public boolean filterEquals(Intent other) { throw new RuntimeExceptio...
method filterHashCode (line 160) | public int filterHashCode() { throw new RuntimeException("<Stub>!"); }
method toString (line 161) | public String toString() {
method toURI (line 164) | @Deprecated()
method toUri (line 166) | public String toUri(int flags) { throw new RuntimeException("<Stub>!"...
method describeContents (line 167) | public int describeContents() { throw new RuntimeException("<Stub>!"); }
method writeToParcel (line 168) | public void writeToParcel(android.os.Parcel out, int flags) { throw n...
method readFromParcel (line 169) | public void readFromParcel(android.os.Parcel in) { throw new RuntimeE...
method parseIntent (line 170) | public static Intent parseIntent(android.content.res.Resources resour...
method normalizeMimeType (line 171) | public static String normalizeMimeType(String type) { throw new Runti...
FILE: modules/mock-android/src/main/java/android/content/res/AssetManager.java
class AssetManager (line 10) | public class AssetManager implements AutoCloseable {
method AssetManager (line 16) | AssetManager() {
method close (line 20) | public void close() {
method open (line 24) | public InputStream open(String fileName) throws IOException {
method open (line 28) | public final InputStream open(String fileName, int accessMode) throws ...
method openFd (line 32) | public final AssetFileDescriptor openFd(String fileName) throws IOExce...
method list (line 36) | public final native String[] list(String var1) throws IOException;
method openNonAssetFd (line 38) | public final AssetFileDescriptor openNonAssetFd(String fileName) throw...
method openNonAssetFd (line 42) | public final AssetFileDescriptor openNonAssetFd(int cookie, String fil...
method openXmlResourceParser (line 46) | public final XmlResourceParser openXmlResourceParser(String fileName) ...
method openXmlResourceParser (line 50) | public final XmlResourceParser openXmlResourceParser(int cookie, Strin...
method finalize (line 54) | protected void finalize() throws Throwable {
method getLocales (line 58) | public final native String[] getLocales();
class AssetInputStream (line 60) | public final class AssetInputStream extends InputStream {
method AssetInputStream (line 61) | AssetInputStream() {
method read (line 65) | public final int read() throws IOException {
method markSupported (line 69) | public final boolean markSupported() {
method available (line 73) | public final int available() throws IOException {
method close (line 77) | public final void close() throws IOException {
method mark (line 81) | public final void mark(int readlimit) {
method reset (line 85) | public final void reset() throws IOException {
method read (line 89) | public final int read(byte[] b) throws IOException {
method read (line 93) | public final int read(byte[] b, int off, int len) throws IOException {
method skip (line 97) | public final long skip(long n) throws IOException {
method finalize (line 101) | protected void finalize() throws Throwable {
FILE: modules/mock-android/src/main/java/android/database/ContentObserver.java
class ContentObserver (line 6) | public abstract class ContentObserver {
method ContentObserver (line 7) | public ContentObserver(Handler handler) { }
method deliverSelfNotifications (line 9) | public boolean deliverSelfNotifications() {
method onChange (line 13) | public void onChange(boolean selfChange) {
method onChange (line 17) | public void onChange(boolean selfChange, Uri uri) {
method dispatchChange (line 22) | @Deprecated
method dispatchChange (line 27) | public final void dispatchChange(boolean selfChange, Uri uri) {
FILE: modules/mock-android/src/main/java/android/graphics/Bitmap.java
class Bitmap (line 3) | public class Bitmap
type Config (line 5) | public static enum Config {
type CompressFormat (line 12) | public static enum CompressFormat {
method Bitmap (line 18) | Bitmap() {
method getDensity (line 22) | public int getDensity() {
method setDensity (line 26) | public void setDensity(int density) {
method recycle (line 30) | public void recycle() {
method isRecycled (line 34) | public final boolean isRecycled() {
method getGenerationId (line 38) | public int getGenerationId() {
method copyPixelsToBuffer (line 42) | public void copyPixelsToBuffer(java.nio.Buffer dst) {
method copyPixelsFromBuffer (line 46) | public void copyPixelsFromBuffer(java.nio.Buffer src) {
method copy (line 50) | public Bitmap copy(Config config, boolean isMutable) {
method createScaledBitmap (line 54) | public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, int ...
method createBitmap (line 58) | public static Bitmap createBitmap(Bitmap src) {
method createBitmap (line 62) | public static Bitmap createBitmap(Bitmap source, int x, int y, int wid...
method createBitmap (line 66) | public static Bitmap createBitmap(Bitmap source, int x, int y, int wid...
method createBitmap (line 70) | public static Bitmap createBitmap(int width, int height, Config config) {
method createBitmap (line 74) | public static Bitmap createBitmap(int[] colors, int offset, int stride...
method createBitmap (line 78) | public static Bitmap createBitmap(int[] colors, int width, int height,...
method getNinePatchChunk (line 82) | public byte[] getNinePatchChunk() {
method compress (line 86) | public boolean compress(CompressFormat format, int quality, java.io.Ou...
method isMutable (line 90) | public final boolean isMutable() {
method getWidth (line 94) | public final int getWidth() {
method getHeight (line 98) | public final int getHeight() {
method getScaledWidth (line 102) | public int getScaledWidth(Canvas canvas) {
method getScaledHeight (line 106) | public int getScaledHeight(Canvas canvas) {
method getScaledWidth (line 110) | public int getScaledWidth(android.util.DisplayMetrics metrics) {
method getScaledHeight (line 114) | public int getScaledHeight(android.util.DisplayMetrics metrics) {
method getScaledWidth (line 118) | public int getScaledWidth(int targetDensity) {
method getScaledHeight (line 122) | public int getScaledHeight(int targetDensity) {
method getRowBytes (line 126) | public final int getRowBytes() {
method getByteCount (line 130) | public final int getByteCount() {
method getConfig (line 134) | public final Config getConfig() {
method hasAlpha (line 138) | public final boolean hasAlpha() {
method setHasAlpha (line 142) | public void setHasAlpha(boolean hasAlpha) {
method eraseColor (line 146) | public void eraseColor(int c) {
method getPixel (line 150) | public int getPixel(int x, int y) {
method getPixels (line 154) | public void getPixels(int[] pixels, int offset, int stride, int x, int...
method setPixel (line 158) | public void setPixel(int x, int y, int color) {
method setPixels (line 162) | public void setPixels(int[] pixels, int offset, int stride, int x, int...
method describeContents (line 166) | public int describeContents() {
method writeToParcel (line 170) | public void writeToParcel(android.os.Parcel p, int flags) {
method extractAlpha (line 174) | public Bitmap extractAlpha() {
method extractAlpha (line 178) | public Bitmap extractAlpha(Paint paint, int[] offsetXY) {
method sameAs (line 182) | public boolean sameAs(Bitmap other) {
method prepareToDraw (line 186) | public void prepareToDraw() {
FILE: modules/mock-android/src/main/java/android/graphics/Color.java
class Color (line 5) | public class Color
method Color (line 7) | public Color() { throw new RuntimeException("Stub!"); }
method alpha (line 8) | public static int alpha(int color) { throw new RuntimeException("Stub...
method red (line 9) | public static int red(int color) { throw new RuntimeException("Stub!"...
method green (line 10) | public static int green(int color) { throw new RuntimeException("Stub...
method blue (line 11) | public static int blue(int color) { throw new RuntimeException("Stub!...
method rgb (line 12) | public static int rgb(int red, int green, int blue) { throw new Runti...
method argb (line 13) | public static int argb(int alpha, int red, int green, int blue) { thr...
method parseColor (line 14) | public static int parseColor(java.lang.String colorString) {
method RGBToHSV (line 29) | public static void RGBToHSV(int red, int green, int blue, float[] hsv...
method colorToHSV (line 30) | public static void colorToHSV(int color, float[] hsv) { throw new Run...
method HSVToColor (line 31) | public static int HSVToColor(float[] hsv) { throw new RuntimeExceptio...
method HSVToColor (line 32) | public static int HSVToColor(int alpha, float[] hsv) { throw new Runt...
FILE: modules/mock-android/src/main/java/android/graphics/Rect.java
class Rect (line 8) | public class Rect implements Parcelable {
method Rect (line 15) | public Rect() {
method Rect (line 19) | public Rect(int left, int top, int right, int bottom) {
method Rect (line 23) | public Rect(Rect r) {
method equals (line 27) | public boolean equals(Object o) {
method hashCode (line 31) | public int hashCode() {
method toString (line 35) | public String toString() {
method toShortString (line 39) | public String toShortString() {
method flattenToString (line 43) | public String flattenToString() {
method unflattenFromString (line 47) | public static Rect unflattenFromString(String str) {
method isEmpty (line 51) | public final boolean isEmpty() {
method width (line 55) | public final int width() {
method height (line 59) | public final int height() {
method centerX (line 63) | public final int centerX() {
method centerY (line 67) | public final int centerY() {
method exactCenterX (line 71) | public final float exactCenterX() {
method exactCenterY (line 75) | public final float exactCenterY() {
method setEmpty (line 79) | public void setEmpty() {
method set (line 83) | public void set(int left, int top, int right, int bottom) {
method set (line 87) | public void set(Rect src) {
method offset (line 91) | public void offset(int dx, int dy) {
method offsetTo (line 95) | public void offsetTo(int newLeft, int newTop) {
method inset (line 99) | public void inset(int dx, int dy) {
method contains (line 103) | public boolean contains(int x, int y) {
method contains (line 107) | public boolean contains(int left, int top, int right, int bottom) {
method contains (line 111) | public boolean contains(Rect r) {
method intersect (line 115) | public boolean intersect(int left, int top, int right, int bottom) {
method intersect (line 119) | public boolean intersect(Rect r) {
method setIntersect (line 123) | public boolean setIntersect(Rect a, Rect b) {
method intersects (line 127) | public boolean intersects(int left, int top, int right, int bottom) {
method intersects (line 131) | public static boolean intersects(Rect a, Rect b) {
method union (line 135) | public void union(int left, int top, int right, int bottom) {
method union (line 139) | public void union(Rect r) {
method union (line 143) | public void union(int x, int y) {
method sort (line 147) | public void sort() {
method describeContents (line 151) | public int describeContents() {
method writeToParcel (line 155) | public void writeToParcel(Parcel out, int flags) {
method readFromParcel (line 159) | public void readFromParcel(Parcel in) {
FILE: modules/mock-android/src/main/java/android/graphics/drawable/Drawable.java
class Drawable (line 18) | public abstract class Drawable {
method Drawable (line 19) | public Drawable() {
method draw (line 22) | public abstract void draw(Canvas var1);
method setBounds (line 24) | public void setBounds(int left, int top, int right, int bottom) {
method setBounds (line 28) | public void setBounds(Rect bounds) {
method copyBounds (line 32) | public final void copyBounds(Rect bounds) {
method copyBounds (line 36) | public final Rect copyBounds() {
method getBounds (line 40) | public final Rect getBounds() {
method setChangingConfigurations (line 44) | public void setChangingConfigurations(int configs) {
method getChangingConfigurations (line 48) | public int getChangingConfigurations() {
method setDither (line 52) | public void setDither(boolean dither) {
method setFilterBitmap (line 56) | public void setFilterBitmap(boolean filter) {
method setCallback (line 60) | public final void setCallback(Callback cb) {
method getCallback (line 64) | public Callback getCallback() {
method invalidateSelf (line 68) | public void invalidateSelf() {
method scheduleSelf (line 72) | public void scheduleSelf(Runnable what, long when) {
method unscheduleSelf (line 76) | public void unscheduleSelf(Runnable what) {
method setAlpha (line 80) | public abstract void setAlpha(int var1);
method setColorFilter (line 82) | public abstract void setColorFilter(ColorFilter var1);
method setColorFilter (line 84) | public void setColorFilter(int color, Mode mode) {
method clearColorFilter (line 88) | public void clearColorFilter() {
method isStateful (line 92) | public boolean isStateful() {
method setState (line 96) | public boolean setState(int[] stateSet) {
method getState (line 100) | public int[] getState() {
method jumpToCurrentState (line 104) | public void jumpToCurrentState() {
method getCurrent (line 108) | public Drawable getCurrent() {
method setLevel (line 112) | public final boolean setLevel(int level) {
method getLevel (line 116) | public final int getLevel() {
method setVisible (line 120) | public boolean setVisible(boolean visible, boolean restart) {
method isVisible (line 124) | public final boolean isVisible() {
method getOpacity (line 128) | public abstract int getOpacity();
method resolveOpacity (line 130) | public static int resolveOpacity(int op1, int op2) {
method getTransparentRegion (line 134) | public Region getTransparentRegion() {
method onStateChange (line 138) | protected boolean onStateChange(int[] state) {
method onLevelChange (line 142) | protected boolean onLevelChange(int level) {
method onBoundsChange (line 146) | protected void onBoundsChange(Rect bounds) {
method getIntrinsicWidth (line 150) | public int getIntrinsicWidth() {
method getIntrinsicHeight (line 154) | public int getIntrinsicHeight() {
method getMinimumWidth (line 158) | public int getMinimumWidth() {
method getMinimumHeight (line 162) | public int getMinimumHeight() {
method getPadding (line 166) | public boolean getPadding(Rect padding) {
method mutate (line 170) | public Drawable mutate() {
method createFromStream (line 174) | public static Drawable createFromStream(InputStream is, String srcName) {
method createFromResourceStream (line 178) | public static Drawable createFromResourceStream(Resources res, TypedVa...
method createFromResourceStream (line 182) | public static Drawable createFromResourceStream(Resources res, TypedVa...
method createFromXml (line 186) | public static Drawable createFromXml(Resources r, XmlPullParser parser...
method createFromXmlInner (line 190) | public static Drawable createFromXmlInner(Resources r, XmlPullParser p...
method createFromPath (line 194) | public static Drawable createFromPath(String pathName) {
method inflate (line 198) | public void inflate(Resources r, XmlPullParser parser, AttributeSet at...
method getConstantState (line 202) | public ConstantState getConstantState() {
class ConstantState (line 206) | public abstract static class ConstantState {
method ConstantState (line 207) | public ConstantState() {
method newDrawable (line 211) | public abstract Drawable newDrawable();
method newDrawable (line 213) | public Drawable newDrawable(Resources res) {
method getChangingConfigurations (line 217) | public abstract int getChangingConfigurations();
type Callback (line 220) | public interface Callback {
method invalidateDrawable (line 221) | void invalidateDrawable(Drawable var1);
method scheduleDrawable (line 223) | void scheduleDrawable(Drawable var1, Runnable var2, long var3);
method unscheduleDrawable (line 225) | void unscheduleDrawable(Drawable var1, Runnable var2);
FILE: modules/mock-android/src/main/java/android/media/ThumbnailUtils.java
class ThumbnailUtils (line 3) | public class ThumbnailUtils {
method ThumbnailUtils (line 4) | public ThumbnailUtils() {
method createVideoThumbnail (line 7) | public static android.graphics.Bitmap createVideoThumbnail(java.lang.S...
method extractThumbnail (line 11) | public static android.graphics.Bitmap extractThumbnail(android.graphic...
method extractThumbnail (line 15) | public static android.graphics.Bitmap extractThumbnail(android.graphic...
FILE: modules/mock-android/src/main/java/android/net/wifi/WifiConfiguration.java
class WifiConfiguration (line 3) | public class WifiConfiguration {
FILE: modules/mock-android/src/main/java/android/os/Bundle.java
class Bundle (line 7) | public class Bundle implements Parcelable, Cloneable {
method Bundle (line 10) | public Bundle() { }
method Bundle (line 11) | public Bundle(ClassLoader loader) { throw new RuntimeException("Stub!"...
method Bundle (line 12) | public Bundle(int capacity) { throw new RuntimeException("Stub!"); }
method Bundle (line 13) | public Bundle(Bundle b) { throw new RuntimeException("Stub!"); }
method setClassLoader (line 14) | public void setClassLoader(ClassLoader loader) { throw new RuntimeExce...
method getClassLoader (line 15) | public ClassLoader getClassLoader() { throw new RuntimeException("Stub...
method clone (line 16) | public Object clone() { throw new RuntimeException("Stub!"); }
method size (line 17) | public int size() { throw new RuntimeException("Stub!"); }
method isEmpty (line 18) | public boolean isEmpty() { throw new RuntimeException("Stub!"); }
method clear (line 19) | public void clear() { throw new RuntimeException("Stub!"); }
method containsKey (line 20) | public boolean containsKey(String key) { throw new RuntimeException("S...
method get (line 21) | public Object get(String key) { throw new RuntimeException("Stub!"); }
method remove (line 22) | public void remove(String key) { throw new RuntimeException("Stub!"); }
method putAll (line 23) | public void putAll(Bundle map) { throw new RuntimeException("Stub!"); }
method keySet (line 24) | public Set<String> keySet() { throw new RuntimeException("Stub!"); }
method hasFileDescriptors (line 25) | public boolean hasFileDescriptors() { throw new RuntimeException("Stub...
method putBoolean (line 26) | public void putBoolean(String key, boolean value) { throw new RuntimeE...
method putByte (line 27) | public void putByte(String key, byte value) { throw new RuntimeExcepti...
method putChar (line 28) | public void putChar(String key, char value) { throw new RuntimeExcepti...
method putShort (line 29) | public void putShort(String key, short value) { throw new RuntimeExcep...
method putInt (line 30) | public void putInt(String key, int value) { }
method putLong (line 31) | public void putLong(String key, long value) { throw new RuntimeExcepti...
method putFloat (line 32) | public void putFloat(String key, float value) { throw new RuntimeExcep...
method putDouble (line 33) | public void putDouble(String key, double value) { throw new RuntimeExc...
method putString (line 34) | public void putString(String key, String value) { }
method putCharSequence (line 35) | public void putCharSequence(String key, CharSequence value) { throw ne...
method putParcelable (line 36) | public void putParcelable(String key, Parcelable value) { throw new Ru...
method putParcelableArray (line 37) | public void putParcelableArray(String key, Parcelable[] value) { throw...
method putParcelableArrayList (line 38) | public void putParcelableArrayList(String key, ArrayList<? extends Par...
method putSparseParcelableArray (line 39) | public void putSparseParcelableArray(String key, SparseArray<? extends...
method putIntegerArrayList (line 40) | public void putIntegerArrayList(String key, ArrayList<Integer> value) ...
method putStringArrayList (line 41) | public void putStringArrayList(String key, ArrayList<String> value) { ...
method putCharSequenceArrayList (line 42) | public void putCharSequenceArrayList(String key, ArrayList<CharSequenc...
method putSerializable (line 43) | public void putSerializable(String key, Serializable value) { throw ne...
method putBooleanArray (line 44) | public void putBooleanArray(String key, boolean[] value) { throw new R...
method putByteArray (line 45) | public void putByteArray(String key, byte[] value) { throw new Runtime...
method putShortArray (line 46) | public void putShortArray(String key, short[] value) { throw new Runti...
method putCharArray (line 47) | public void putCharArray(String key, char[] value) { throw new Runtime...
method putIntArray (line 48) | public void putIntArray(String key, int[] value) { throw new RuntimeEx...
method putLongArray (line 49) | public void putLongArray(String key, long[] value) { throw new Runtime...
method putFloatArray (line 50) | public void putFloatArray(String key, float[] value) { throw new Runti...
method putDoubleArray (line 51) | public void putDoubleArray(String key, double[] value) { throw new Run...
method putStringArray (line 52) | public void putStringArray(String key, String[] value) { }
method putCharSequenceArray (line 53) | public void putCharSequenceArray(String key, CharSequence[] value) { t...
method putBundle (line 54) | public void putBundle(String key, Bundle value) { throw new RuntimeExc...
method getBoolean (line 55) | public boolean getBoolean(String key) { throw new RuntimeException("St...
method getBoolean (line 56) | public boolean getBoolean(String key, boolean defaultValue) { throw ne...
method getByte (line 57) | public byte getByte(String key) { throw new RuntimeException("Stub!"); }
method getByte (line 58) | public Byte getByte(String key, byte defaultValue) { throw new Runtime...
method getChar (line 59) | public char getChar(String key) { throw new RuntimeException("Stub!"); }
method getChar (line 60) | public char getChar(String key, char defaultValue) { throw new Runtime...
method getShort (line 61) | public short getShort(String key) { throw new RuntimeException("Stub!"...
method getShort (line 62) | public short getShort(String key, short defaultValue) { throw new Runt...
method getInt (line 63) | public int getInt(String key) { throw new RuntimeException("Stub!"); }
method getInt (line 64) | public int getInt(String key, int defaultValue) { throw new RuntimeExc...
method getLong (line 65) | public long getLong(String key) { throw new RuntimeException("Stub!"); }
method getLong (line 66) | public long getLong(String key, long defaultValue) { throw new Runtime...
method getFloat (line 67) | public float getFloat(String key) { throw new RuntimeException("Stub!"...
method getFloat (line 68) | public float getFloat(String key, float defaultValue) { throw new Runt...
method getDouble (line 69) | public double getDouble(String key) { throw new RuntimeException("Stub...
method getDouble (line 70) | public double getDouble(String key, double defaultValue) { throw new R...
method getString (line 71) | public String getString(String key) { throw new RuntimeException("Stub...
method getString (line 72) | public String getString(String key, String defaultValue) { throw new R...
method getCharSequence (line 73) | public CharSequence getCharSequence(String key) { throw new RuntimeExc...
method getCharSequence (line 74) | public CharSequence getCharSequence(String key, CharSequence defaultVa...
method getBundle (line 75) | public Bundle getBundle(String key) { throw new RuntimeException("Stub...
method getParcelable (line 76) | public <T extends Parcelable> T getParcelable(String key) { throw new ...
method getParcelableArray (line 77) | public Parcelable[] getParcelableArray(String key) { throw new Runtime...
method getParcelableArrayList (line 78) | public <T extends Parcelable> ArrayList<T> getParcelableArrayList(Stri...
method getSparseParcelableArray (line 79) | public <T extends Parcelable> SparseArray<T> getSparseParcelableArray(...
method getSerializable (line 80) | public Serializable getSerializable(String key) { throw new RuntimeExc...
method getIntegerArrayList (line 81) | public ArrayList<Integer> getIntegerArrayList(String key) { throw new ...
method getStringArrayList (line 82) | public ArrayList<String> getStringArrayList(String key) { throw new Ru...
method getCharSequenceArrayList (line 83) | public ArrayList<CharSequence> getCharSequenceArrayList(String key) { ...
method getBooleanArray (line 84) | public boolean[] getBooleanArray(String key) { throw new RuntimeExcept...
method getByteArray (line 85) | public byte[] getByteArray(String key) { throw new RuntimeException("S...
method getShortArray (line 86) | public short[] getShortArray(String key) { throw new RuntimeException(...
method getCharArray (line 87) | public char[] getCharArray(String key) { throw new RuntimeException("S...
method getIntArray (line 88) | public int[] getIntArray(String key) { throw new RuntimeException("Stu...
method getLongArray (line 89) | public long[] getLongArray(String key) { throw new RuntimeException("S...
method getFloatArray (line 90) | public float[] getFloatArray(String key) { throw new RuntimeException(...
method getDoubleArray (line 91) | public double[] getDoubleArray(String key) { throw new RuntimeExceptio...
method getStringArray (line 92) | public String[] getStringArray(String key) { throw new RuntimeExceptio...
method getCharSequenceArray (line 93) | public CharSequence[] getCharSequenceArray(String key) { throw new Run...
method describeContents (line 94) | public int describeContents() { throw new RuntimeException("Stub!"); }
method writeToParcel (line 95) | public void writeToParcel(Parcel parcel, int flags) { throw new Runtim...
method readFromParcel (line 96) | public void readFromParcel(Parcel parcel) { throw new RuntimeException...
method toString (line 97) | public synchronized String toString() { throw new RuntimeException("St...
FILE: modules/mock-android/src/main/java/android/os/Handler.java
class Handler (line 2) | public class Handler
type Callback (line 4) | public static interface Callback
method handleMessage (line 6) | public abstract boolean handleMessage(android.os.Message msg);
method Handler (line 8) | public Handler() { throw new RuntimeException("Stub!"); }
method Handler (line 9) | public Handler(android.os.Handler.Callback callback) { throw new Runt...
method Handler (line 10) | public Handler(android.os.Looper looper) { }
method Handler (line 11) | public Handler(android.os.Looper looper, android.os.Handler.Callback ...
method handleMessage (line 12) | public void handleMessage(android.os.Message msg) { throw new Runtime...
method dispatchMessage (line 13) | public void dispatchMessage(android.os.Message msg) { throw new Runti...
method getMessageName (line 14) | public java.lang.String getMessageName(android.os.Message message) { ...
method obtainMessage (line 15) | public final android.os.Message obtainMessage() { throw new RuntimeEx...
method obtainMessage (line 16) | public final android.os.Message obtainMessage(int what) { throw new R...
method obtainMessage (line 17) | public final android.os.Message obtainMessage(int what, java.lang.Obj...
method obtainMessage (line 18) | public final android.os.Message obtainMessage(int what, int arg1, int...
method obtainMessage (line 19) | public final android.os.Message obtainMessage(int what, int arg1, int...
method post (line 20) | public final boolean post(java.lang.Runnable r) { return true; }
method postAtTime (line 21) | public final boolean postAtTime(java.lang.Runnable r, long uptimeMill...
method postAtTime (line 22) | public final boolean postAtTime(java.lang.Runnable r, java.lang.Objec...
method postDelayed (line 23) | public final boolean postDelayed(java.lang.Runnable r, long delayMill...
method postAtFrontOfQueue (line 24) | public final boolean postAtFrontOfQueue(java.lang.Runnable r) { throw...
method removeCallbacks (line 25) | public final void removeCallbacks(java.lang.Runnable r) { throw new R...
method removeCallbacks (line 26) | public final void removeCallbacks(java.lang.Runnable r, java.lang.Obj...
method sendMessage (line 27) | public final boolean sendMessage(android.os.Message msg) { throw new ...
method sendEmptyMessage (line 28) | public final boolean sendEmptyMessage(int what) { throw new RuntimeEx...
method sendEmptyMessageDelayed (line 29) | public final boolean sendEmptyMessageDelayed(int what, long delayMill...
method sendEmptyMessageAtTime (line 30) | public final boolean sendEmptyMessageAtTime(int what, long uptimeMill...
method sendMessageDelayed (line 31) | public final boolean sendMessageDelayed(android.os.Message msg, long ...
method sendMessageAtTime (line 32) | public boolean sendMessageAtTime(android.os.Message msg, long uptimeM...
method sendMessageAtFrontOfQueue (line 33) | public final boolean sendMessageAtFrontOfQueue(android.os.Message msg...
method removeMessages (line 34) | public final void removeMessages(int what) { throw new RuntimeExcepti...
method removeMessages (line 35) | public final void removeMessages(int what, java.lang.Object object) {...
method removeCallbacksAndMessages (line 36) | public final void removeCallbacksAndMessages(java.lang.Object token) ...
method hasMessages (line 37) | public final boolean hasMessages(int what) { throw new RuntimeExcepti...
method hasMessages (line 38) | public final boolean hasMessages(int what, java.lang.Object object) {...
method getLooper (line 39) | public final android.os.Looper getLooper() { throw new RuntimeExcepti...
method dump (line 40) | public final void dump(android.util.Printer pw, java.lang.String pref...
method toString (line 41) | public java.lang.String toString() { throw new RuntimeException("Stub...
FILE: modules/mock-android/src/main/java/android/os/Looper.java
class Looper (line 3) | public class Looper
method Looper (line 5) | Looper() { }
method prepare (line 6) | public static void prepare() { }
method prepareMainLooper (line 7) | public static void prepareMainLooper() { }
method getMainLooper (line 8) | public static android.os.Looper getMainLooper() { return new Looper(); }
method loop (line 9) | public static void loop() { throw new RuntimeException("Stub!"); }
method myLooper (line 10) | public static android.os.Looper myLooper() { throw new RuntimeExcepti...
method setMessageLogging (line 11) | public void setMessageLogging(android.util.Printer printer) { throw n...
method myQueue (line 12) | public static android.os.MessageQueue myQueue() { throw new RuntimeEx...
method quit (line 13) | public void quit() { throw new RuntimeException("Stub!"); }
method getThread (line 14) | public java.lang.Thread getThread() { return new Thread(); }
method dump (line 15) | public void dump(android.util.Printer pw, java.lang.String prefix) { ...
method toString (line 16) | public java.lang.String toString() { throw new RuntimeException("Stub...
FILE: modules/mock-android/src/main/java/android/util/Log.java
class Log (line 2) | public final class Log
method Log (line 4) | Log() { throw new RuntimeException("Stub!"); }
method v (line 5) | public static int v(java.lang.String tag, java.lang.String msg) { thr...
method v (line 6) | public static int v(java.lang.String tag, java.lang.String msg, java....
method d (line 7) | public static int d(java.lang.String tag, java.lang.String msg) { thr...
method d (line 8) | public static int d(java.lang.String tag, java.lang.String msg, java....
method i (line 9) | public static int i(java.lang.String tag, java.lang.String msg) { ret...
method i (line 10) | public static int i(java.lang.String tag, java.lang.String msg, java....
method w (line 11) | public static int w(java.lang.String tag, java.lang.String msg) { thr...
method w (line 12) | public static int w(java.lang.String tag, java.lang.String msg, java....
method isLoggable (line 13) | public static native boolean isLoggable(java.lang.String tag, int lev...
method w (line 14) | public static int w(java.lang.String tag, java.lang.Throwable tr) { t...
method e (line 15) | public static int e(java.lang.String tag, java.lang.String msg) { thr...
method e (line 16) | public static int e(java.lang.String tag, java.lang.String msg, java....
method wtf (line 17) | public static int wtf(java.lang.String tag, java.lang.String msg) { t...
method wtf (line 18) | public static int wtf(java.lang.String tag, java.lang.Throwable tr) {...
method wtf (line 19) | public static int wtf(java.lang.String tag, java.lang.String msg, jav...
method getStackTraceString (line 20) | public static java.lang.String getStackTraceString(java.lang.Throwabl...
method println (line 21) | public static int println(int priority, java.lang.String tag, java.la...
FILE: modules/mock-android/src/main/java/android/view/SearchEvent.java
class SearchEvent (line 2) | public class SearchEvent {
method SearchEvent (line 3) | public SearchEvent(InputDevice inputDevice) { throw new RuntimeExcepti...
method getInputDevice (line 4) | public InputDevice getInputDevice() { throw new RuntimeException("Stub...
FILE: modules/mock-android/src/main/java/android/view/View.java
class View (line 2) | public class View
type OnLayoutChangeListener (line 5) | public static interface OnLayoutChangeListener
method onLayoutChange (line 7) | public abstract void onLayoutChange(android.view.View v, int left, ...
class DragShadowBuilder (line 9) | public static class DragShadowBuilder
method DragShadowBuilder (line 11) | public DragShadowBuilder(android.view.View view) { throw new Runtim...
method DragShadowBuilder (line 12) | public DragShadowBuilder() { throw new RuntimeException("Stub!"); }
method getView (line 13) | @java.lang.SuppressWarnings(value={"JavadocReference"})
method onProvideShadowMetrics (line 15) | public void onProvideShadowMetrics(android.graphics.Point shadowSiz...
method onDrawShadow (line 16) | public void onDrawShadow(android.graphics.Canvas canvas) { throw ne...
class MeasureSpec (line 18) | public static class MeasureSpec
method MeasureSpec (line 20) | public MeasureSpec() { throw new RuntimeException("Stub!"); }
method makeMeasureSpec (line 21) | public static int makeMeasureSpec(int size, int mode) { throw new R...
method getMode (line 22) | public static int getMode(int measureSpec) { throw new RuntimeExcep...
method getSize (line 23) | public static int getSize(int measureSpec) { throw new RuntimeExcep...
method toString (line 24) | public static java.lang.String toString(int measureSpec) { throw ne...
type OnKeyListener (line 29) | public static interface OnKeyListener
method onKey (line 31) | public abstract boolean onKey(android.view.View v, int keyCode, and...
type OnTouchListener (line 33) | public static interface OnTouchListener
method onTouch (line 35) | public abstract boolean onTouch(android.view.View v, android.view.M...
type OnHoverListener (line 37) | public static interface OnHoverListener
method onHover (line 39) | public abstract boolean onHover(android.view.View v, android.view.M...
type OnGenericMotionListener (line 41) | public static interface OnGenericMotionListener
method onGenericMotion (line 43) | public abstract boolean onGenericMotion(android.view.View v, androi...
type OnLongClickListener (line 45) | public static interface OnLongClickListener
method onLongClick (line 47) | public abstract boolean onLongClick(android.view.View v);
type OnDragListener (line 49) | public static interface OnDragListener
method onDrag (line 51) | public abstract boolean onDrag(android.view.View v, android.view.Dr...
type OnFocusChangeListener (line 53) | public static interface OnFocusChangeListener
method onFocusChange (line 55) | public abstract void onFocusChange(android.view.View v, boolean has...
type OnClickListener (line 57) | public static interface OnClickListener
method onClick (line 59) | public abstract void onClick(android.view.View v);
type OnCreateContextMenuListener (line 61) | public static interface OnCreateContextMenuListener
method onCreateContextMenu (line 63) | public abstract void onCreateContextMenu(android.view.ContextMenu m...
type OnSystemUiVisibilityChangeListener (line 65) | public static interface OnSystemUiVisibilityChangeListener
method onSystemUiVisibilityChange (line 67) | public abstract void onSystemUiVisibilityChange(int visibility);
type OnAttachStateChangeListener (line 69) | public static interface OnAttachStateChangeListener
method onViewAttachedToWindow (line 71) | public abstract void onViewAttachedToWindow(android.view.View v);
method onViewDetachedFromWindow (line 72) | public abstract void onViewDetachedFromWindow(android.view.View v);
class BaseSavedState (line 74) | public static class BaseSavedState
method BaseSavedState (line 77) | public BaseSavedState(android.os.Parcel source) { super((android.os...
method BaseSavedState (line 78) | public BaseSavedState(android.os.Parcelable superState) { super((an...
class AccessibilityDelegate (line 82) | public static class AccessibilityDelegate
method AccessibilityDelegate (line 84) | public AccessibilityDelegate() { throw new RuntimeException("Stub!"...
method sendAccessibilityEvent (line 85) | public void sendAccessibilityEvent(android.view.View host, int even...
method performAccessibilityAction (line 86) | public boolean performAccessibilityAction(android.view.View host, i...
method sendAccessibilityEventUnchecked (line 87) | public void sendAccessibilityEventUnchecked(android.view.View host,...
method dispatchPopulateAccessibilityEvent (line 88) | public boolean dispatchPopulateAccessibilityEvent(android.view.View...
method onPopulateAccessibilityEvent (line 89) | public void onPopulateAccessibilityEvent(android.view.View host, an...
method onInitializeAccessibilityEvent (line 90) | public void onInitializeAccessibilityEvent(android.view.View host, ...
method onInitializeAccessibilityNodeInfo (line 91) | public void onInitializeAccessibilityNodeInfo(android.view.View hos...
method onRequestSendAccessibilityEvent (line 92) | public boolean onRequestSendAccessibilityEvent(android.view.ViewGro...
method getAccessibilityNodeProvider (line 93) | public android.view.accessibility.AccessibilityNodeProvider getAcce...
method View (line 95) | public View(android.content.Context context) { throw new RuntimeExcep...
method View (line 96) | public View(android.content.Context context, android.util.AttributeSe...
method View (line 97) | public View(android.content.Context context, android.util.AttributeSe...
method initializeFadingEdge (line 98) | protected void initializeFadingEdge(android.content.res.TypedArray a)...
method getVerticalFadingEdgeLength (line 99) | public int getVerticalFadingEdgeLength() { throw new RuntimeException...
method setFadingEdgeLength (line 100) | public void setFadingEdgeLength(int length) { throw new RuntimeExcept...
method getHorizontalFadingEdgeLength (line 101) | public int getHorizontalFadingEdgeLength() { throw new RuntimeExcepti...
method getVerticalScrollbarWidth (line 102) | public int getVerticalScrollbarWidth() { throw new RuntimeException("...
method getHorizontalScrollbarHeight (line 103) | protected int getHorizontalScrollbarHeight() { throw new RuntimeExcep...
method initializeScrollbars (line 104) | protected void initializeScrollbars(android.content.res.TypedArray a)...
method setVerticalScrollbarPosition (line 105) | public void setVerticalScrollbarPosition(int position) { throw new Ru...
method getVerticalScrollbarPosition (line 106) | public int getVerticalScrollbarPosition() { throw new RuntimeExceptio...
method setOnFocusChangeListener (line 107) | public void setOnFocusChangeListener(android.view.View.OnFocusChangeL...
method addOnLayoutChangeListener (line 108) | public void addOnLayoutChangeListener(android.view.View.OnLayoutChang...
method removeOnLayoutChangeListener (line 109) | public void removeOnLayoutChangeListener(android.view.View.OnLayoutCh...
method addOnAttachStateChangeListener (line 110) | public void addOnAttachStateChangeListener(android.view.View.OnAttach...
method removeOnAttachStateChangeListener (line 111) | public void removeOnAttachStateChangeListener(android.view.View.OnAtt...
method getOnFocusChangeListener (line 112) | public android.view.View.OnFocusChangeListener getOnFocusChangeListen...
method setOnClickListener (line 113) | public void setOnClickListener(android.view.View.OnClickListener l) {...
method hasOnClickListeners (line 114) | public boolean hasOnClickListeners() { throw new RuntimeException("St...
method setOnLongClickListener (line 115) | public void setOnLongClickListener(android.view.View.OnLongClickListe...
method setOnCreateContextMenuListener (line 116) | public void setOnCreateContextMenuListener(android.view.View.OnCreate...
method performClick (line 117) | public boolean performClick() { throw new RuntimeException("Stub!"); }
method callOnClick (line 118) | public boolean callOnClick() { throw new RuntimeException("Stub!"); }
method performLongClick (line 119) | public boolean performLongClick() { throw new RuntimeException("Stub!...
method showContextMenu (line 120) | public boolean showContextMenu() { throw new RuntimeException("Stub!"...
method startActionMode (line 121) | public android.view.ActionMode startActionMode(android.view.ActionMod...
method setOnKeyListener (line 122) | public void setOnKeyListener(android.view.View.OnKeyListener l) { thr...
method setOnTouchListener (line 123) | public void setOnTouchListener(android.view.View.OnTouchListener l) {...
method setOnGenericMotionListener (line 124) | public void setOnGenericMotionListener(android.view.View.OnGenericMot...
method setOnHoverListener (line 125) | public void setOnHoverListener(android.view.View.OnHoverListener l) {...
method setOnDragListener (line 126) | public void setOnDragListener(android.view.View.OnDragListener l) { t...
method requestRectangleOnScreen (line 127) | public boolean requestRectangleOnScreen(android.graphics.Rect rectang...
method requestRectangleOnScreen (line 128) | public boolean requestRectangleOnScreen(android.graphics.Rect rectang...
method clearFocus (line 129) | public void clearFocus() { throw new RuntimeException("Stub!"); }
method hasFocus (line 130) | @android.view.ViewDebug.ExportedProperty(category="focus")
method hasFocusable (line 132) | public boolean hasFocusable() { throw new RuntimeException("Stub!"); }
method onFocusChanged (line 133) | protected void onFocusChanged(boolean gainFocus, int direction, andro...
method sendAccessibilityEvent (line 134) | public void sendAccessibilityEvent(int eventType) { throw new Runtime...
method announceForAccessibility (line 135) | public void announceForAccessibility(java.lang.CharSequence text) { t...
method sendAccessibilityEventUnchecked (line 136) | public void sendAccessibilityEventUnchecked(android.view.accessibilit...
method dispatchPopulateAccessibilityEvent (line 137) | public boolean dispatchPopulateAccessibilityEvent(android.view.access...
method onPopulateAccessibilityEvent (line 138) | public void onPopulateAccessibilityEvent(android.view.accessibility.A...
method onInitializeAccessibilityEvent (line 139) | public void onInitializeAccessibilityEvent(android.view.accessibility...
method createAccessibilityNodeInfo (line 140) | public android.view.accessibility.AccessibilityNodeInfo createAccessi...
method onInitializeAccessibilityNodeInfo (line 141) | public void onInitializeAccessibilityNodeInfo(android.view.accessibil...
method setAccessibilityDelegate (line 142) | public void setAccessibilityDelegate(android.view.View.AccessibilityD...
method getAccessibilityNodeProvider (line 143) | public android.view.accessibility.AccessibilityNodeProvider getAccess...
method getContentDescription (line 144) | @android.view.ViewDebug.ExportedProperty(category="accessibility")
method setContentDescription (line 146) | public void setContentDescription(java.lang.CharSequence contentDescr...
method isFocused (line 147) | @android.view.ViewDebug.ExportedProperty(category="focus")
method findFocus (line 149) | public android.view.View findFocus() { throw new RuntimeException("St...
method isScrollContainer (line 150) | public boolean isScrollContainer() { throw new RuntimeException("Stub...
method setScrollContainer (line 151) | public void setScrollContainer(boolean isScrollContainer) { throw new...
method getDrawingCacheQuality (line 152) | public int getDrawingCacheQuality() { throw new RuntimeException("Stu...
method setDrawingCacheQuality (line 153) | public void setDrawingCacheQuality(int quality) { throw new RuntimeEx...
method getKeepScreenOn (line 154) | public boolean getKeepScreenOn() { throw new RuntimeException("Stub!"...
method setKeepScreenOn (line 155) | public void setKeepScreenOn(boolean keepScreenOn) { throw new Runtime...
method getNextFocusLeftId (line 156) | public int getNextFocusLeftId() { throw new RuntimeException("Stub!"); }
method setNextFocusLeftId (line 157) | public void setNextFocusLeftId(int nextFocusLeftId) { throw new Runti...
method getNextFocusRightId (line 158) | public int getNextFocusRightId() { throw new RuntimeException("Stub!"...
method setNextFocusRightId (line 159) | public void setNextFocusRightId(int nextFocusRightId) { throw new Run...
method getNextFocusUpId (line 160) | public int getNextFocusUpId() { throw new RuntimeException("Stub!"); }
method setNextFocusUpId (line 161) | public void setNextFocusUpId(int nextFocusUpId) { throw new RuntimeEx...
method getNextFocusDownId (line 162) | public int getNextFocusDownId() { throw new RuntimeException("Stub!"); }
method setNextFocusDownId (line 163) | public void setNextFocusDownId(int nextFocusDownId) { throw new Runti...
method getNextFocusForwardId (line 164) | public int getNextFocusForwardId() { throw new RuntimeException("Stub...
method setNextFocusForwardId (line 165) | public void setNextFocusForwardId(int nextFocusForwardId) { throw new...
method isShown (line 166) | public boolean isShown() { throw new RuntimeException("Stub!"); }
method fitSystemWindows (line 167) | protected boolean fitSystemWindows(android.graphics.Rect insets) { th...
method setFitsSystemWindows (line 168) | public void setFitsSystemWindows(boolean fitSystemWindows) { throw ne...
method getFitsSystemWindows (line 169) | public boolean getFitsSystemWindows() { throw new RuntimeException("S...
method requestFitSystemWindows (line 170) | public void requestFitSystemWindows() { throw new RuntimeException("S...
method getVisibility (line 171) | @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDe...
method setVisibility (line 173) | public void setVisibility(int visibility) { throw new RuntimeExceptio...
method isEnabled (line 174) | @android.view.ViewDebug.ExportedProperty()
method setEnabled (line 176) | public void setEnabled(boolean enabled) { throw new RuntimeException(...
method setFocusable (line 177) | public void setFocusable(boolean focusable) { throw new RuntimeExcept...
method setFocusableInTouchMode (line 178) | public void setFocusableInTouchMode(boolean focusableInTouchMode) { t...
method setSoundEffectsEnabled (line 179) | public void setSoundEffectsEnabled(boolean soundEffectsEnabled) { thr...
method isSoundEffectsEnabled (line 180) | @android.view.ViewDebug.ExportedProperty()
method setHapticFeedbackEnabled (line 182) | public void setHapticFeedbackEnabled(boolean hapticFeedbackEnabled) {...
method isHapticFeedbackEnabled (line 183) | @android.view.ViewDebug.ExportedProperty()
method hasTransientState (line 185) | @android.view.ViewDebug.ExportedProperty(category="layout")
method setHasTransientState (line 187) | public void setHasTransientState(boolean hasTransientState) { throw n...
method setWillNotDraw (line 188) | public void setWillNotDraw(boolean willNotDraw) { throw new RuntimeEx...
method willNotDraw (line 189) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method setWillNotCacheDrawing (line 191) | public void setWillNotCacheDrawing(boolean willNotCacheDrawing) { thr...
method willNotCacheDrawing (line 192) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method isClickable (line 194) | @android.view.ViewDebug.ExportedProperty()
method setClickable (line 196) | public void setClickable(boolean clickable) { throw new RuntimeExcept...
method isLongClickable (line 197) | public boolean isLongClickable() { throw new RuntimeException("Stub!"...
method setLongClickable (line 198) | public void setLongClickable(boolean longClickable) { throw new Runti...
method setPressed (line 199) | public void setPressed(boolean pressed) { throw new RuntimeException(...
method dispatchSetPressed (line 200) | protected void dispatchSetPressed(boolean pressed) { throw new Runtim...
method isPressed (line 201) | public boolean isPressed() { throw new RuntimeException("Stub!"); }
method isSaveEnabled (line 202) | public boolean isSaveEnabled() { throw new RuntimeException("Stub!"); }
method setSaveEnabled (line 203) | public void setSaveEnabled(boolean enabled) { throw new RuntimeExcept...
method getFilterTouchesWhenObscured (line 204) | @android.view.ViewDebug.ExportedProperty()
method setFilterTouchesWhenObscured (line 206) | public void setFilterTouchesWhenObscured(boolean enabled) { throw new...
method isSaveFromParentEnabled (line 207) | public boolean isSaveFromParentEnabled() { throw new RuntimeException...
method setSaveFromParentEnabled (line 208) | public void setSaveFromParentEnabled(boolean enabled) { throw new Run...
method isFocusable (line 209) | @android.view.ViewDebug.ExportedProperty(category="focus")
method isFocusableInTouchMode (line 211) | @android.view.ViewDebug.ExportedProperty()
method focusSearch (line 213) | public android.view.View focusSearch(int direction) { throw new Runti...
method dispatchUnhandledMove (line 214) | public boolean dispatchUnhandledMove(android.view.View focused, int d...
method getFocusables (line 215) | public java.util.ArrayList<android.view.View> getFocusables(int direc...
method addFocusables (line 216) | public void addFocusables(java.util.ArrayList<android.view.View> view...
method addFocusables (line 217) | public void addFocusables(java.util.ArrayList<android.view.View> view...
method findViewsWithText (line 218) | public void findViewsWithText(java.util.ArrayList<android.view.View> ...
method getTouchables (line 219) | public java.util.ArrayList<android.view.View> getTouchables() { throw...
method addTouchables (line 220) | public void addTouchables(java.util.ArrayList<android.view.View> view...
method requestFocus (line 221) | public final boolean requestFocus() { throw new RuntimeException("Stu...
method requestFocus (line 222) | public final boolean requestFocus(int direction) { throw new RuntimeE...
method requestFocus (line 223) | public boolean requestFocus(int direction, android.graphics.Rect prev...
method requestFocusFromTouch (line 224) | public final boolean requestFocusFromTouch() { throw new RuntimeExcep...
method getImportantForAccessibility (line 225) | @android.view.ViewDebug.ExportedProperty(category="accessibility",mapp...
method setImportantForAccessibility (line 227) | public void setImportantForAccessibility(int mode) { throw new Runtim...
method getParentForAccessibility (line 228) | public android.view.ViewParent getParentForAccessibility() { throw ne...
method addChildrenForAccessibility (line 229) | public void addChildrenForAccessibility(java.util.ArrayList<android.v...
method performAccessibilityAction (line 230) | public boolean performAccessibilityAction(int action, android.os.Bund...
method onStartTemporaryDetach (line 231) | public void onStartTemporaryDetach() { throw new RuntimeException("St...
method onFinishTemporaryDetach (line 232) | public void onFinishTemporaryDetach() { throw new RuntimeException("S...
method getKeyDispatcherState (line 233) | public android.view.KeyEvent.DispatcherState getKeyDispatcherState() ...
method dispatchKeyEventPreIme (line 234) | public boolean dispatchKeyEventPreIme(android.view.KeyEvent event) { ...
method dispatchKeyEvent (line 235) | public boolean dispatchKeyEvent(android.view.KeyEvent event) { throw ...
method dispatchKeyShortcutEvent (line 236) | public boolean dispatchKeyShortcutEvent(android.view.KeyEvent event) ...
method dispatchTouchEvent (line 237) | public boolean dispatchTouchEvent(android.view.MotionEvent event) { t...
method onFilterTouchEventForSecurity (line 238) | public boolean onFilterTouchEventForSecurity(android.view.MotionEvent...
method dispatchTrackballEvent (line 239) | public boolean dispatchTrackballEvent(android.view.MotionEvent event)...
method dispatchGenericMotionEvent (line 240) | public boolean dispatchGenericMotionEvent(android.view.MotionEvent ev...
method dispatchHoverEvent (line 241) | protected boolean dispatchHoverEvent(android.view.MotionEvent event) ...
method dispatchGenericPointerEvent (line 242) | protected boolean dispatchGenericPointerEvent(android.view.MotionEven...
method dispatchGenericFocusedEvent (line 243) | protected boolean dispatchGenericFocusedEvent(android.view.MotionEven...
method dispatchWindowFocusChanged (line 244) | public void dispatchWindowFocusChanged(boolean hasFocus) { throw new ...
method onWindowFocusChanged (line 245) | public void onWindowFocusChanged(boolean hasWindowFocus) { throw new ...
method hasWindowFocus (line 246) | public boolean hasWindowFocus() { throw new RuntimeException("Stub!"); }
method dispatchVisibilityChanged (line 247) | protected void dispatchVisibilityChanged(android.view.View changedVie...
method onVisibilityChanged (line 248) | protected void onVisibilityChanged(android.view.View changedView, int...
method dispatchDisplayHint (line 249) | public void dispatchDisplayHint(int hint) { throw new RuntimeExceptio...
method onDisplayHint (line 250) | protected void onDisplayHint(int hint) { throw new RuntimeException("...
method dispatchWindowVisibilityChanged (line 251) | public void dispatchWindowVisibilityChanged(int visibility) { throw n...
method onWindowVisibilityChanged (line 252) | protected void onWindowVisibilityChanged(int visibility) { throw new ...
method getWindowVisibility (line 253) | public int getWindowVisibility() { throw new RuntimeException("Stub!"...
method getWindowVisibleDisplayFrame (line 254) | public void getWindowVisibleDisplayFrame(android.graphics.Rect outRec...
method dispatchConfigurationChanged (line 255) | public void dispatchConfigurationChanged(android.content.res.Configur...
method onConfigurationChanged (line 256) | protected void onConfigurationChanged(android.content.res.Configurati...
method isInTouchMode (line 257) | @android.view.ViewDebug.ExportedProperty()
method getContext (line 259) | @android.view.ViewDebug.CapturedViewProperty()
method onKeyPreIme (line 261) | public boolean onKeyPreIme(int keyCode, android.view.KeyEvent event) ...
method onKeyDown (line 262) | public boolean onKeyDown(int keyCode, android.view.KeyEvent event) { ...
method onKeyLongPress (line 263) | public boolean onKeyLongPress(int keyCode, android.view.KeyEvent even...
method onKeyUp (line 264) | public boolean onKeyUp(int keyCode, android.view.KeyEvent event) { th...
method onKeyMultiple (line 265) | public boolean onKeyMultiple(int keyCode, int repeatCount, android.vi...
method onKeyShortcut (line 266) | public boolean onKeyShortcut(int keyCode, android.view.KeyEvent event...
method onCheckIsTextEditor (line 267) | public boolean onCheckIsTextEditor() { throw new RuntimeException("St...
method onCreateInputConnection (line 268) | public android.view.inputmethod.InputConnection onCreateInputConnecti...
method checkInputConnectionProxy (line 269) | public boolean checkInputConnectionProxy(android.view.View view) { th...
method createContextMenu (line 270) | public void createContextMenu(android.view.ContextMenu menu) { throw ...
method getContextMenuInfo (line 271) | protected android.view.ContextMenu.ContextMenuInfo getContextMenuInfo...
method onCreateContextMenu (line 272) | protected void onCreateContextMenu(android.view.ContextMenu menu) { t...
method onTrackballEvent (line 273) | public boolean onTrackballEvent(android.view.MotionEvent event) { thr...
method onGenericMotionEvent (line 274) | public boolean onGenericMotionEvent(android.view.MotionEvent event) {...
method onHoverEvent (line 275) | public boolean onHoverEvent(android.view.MotionEvent event) { throw n...
method isHovered (line 276) | @android.view.ViewDebug.ExportedProperty()
method setHovered (line 278) | public void setHovered(boolean hovered) { throw new RuntimeException(...
method onHoverChanged (line 279) | public void onHoverChanged(boolean hovered) { throw new RuntimeExcept...
method onTouchEvent (line 280) | public boolean onTouchEvent(android.view.MotionEvent event) { throw n...
method cancelLongPress (line 281) | public void cancelLongPress() { throw new RuntimeException("Stub!"); }
method setTouchDelegate (line 282) | public void setTouchDelegate(android.view.TouchDelegate delegate) { t...
method getTouchDelegate (line 283) | public android.view.TouchDelegate getTouchDelegate() { throw new Runt...
method bringToFront (line 284) | public void bringToFront() { throw new RuntimeException("Stub!"); }
method onScrollChanged (line 285) | protected void onScrollChanged(int l, int t, int oldl, int oldt) { th...
method onSizeChanged (line 286) | protected void onSizeChanged(int w, int h, int oldw, int oldh) { thro...
method dispatchDraw (line 287) | protected void dispatchDraw(android.graphics.Canvas canvas) { throw n...
method getParent (line 288) | public final android.view.ViewParent getParent() { throw new RuntimeE...
method setScrollX (line 289) | public void setScrollX(int value) { throw new RuntimeException("Stub!...
method setScrollY (line 290) | public void setScrollY(int value) { throw new RuntimeException("Stub!...
method getScrollX (line 291) | public final int getScrollX() { throw new RuntimeException("Stub!"); }
method getScrollY (line 292) | public final int getScrollY() { throw new RuntimeException("Stub!"); }
method getWidth (line 293) | @android.view.ViewDebug.ExportedProperty(category="layout")
method getHeight (line 295) | @android.view.ViewDebug.ExportedProperty(category="layout")
method getDrawingRect (line 297) | public void getDrawingRect(android.graphics.Rect outRect) { throw new...
method getMeasuredWidth (line 298) | public final int getMeasuredWidth() { throw new RuntimeException("Stu...
method getMeasuredWidthAndState (line 299) | public final int getMeasuredWidthAndState() { throw new RuntimeExcept...
method getMeasuredHeight (line 300) | public final int getMeasuredHeight() { throw new RuntimeException("St...
method getMeasuredHeightAndState (line 301) | public final int getMeasuredHeightAndState() { throw new RuntimeExcep...
method getMeasuredState (line 302) | public final int getMeasuredState() { throw new RuntimeException("Stu...
method getMatrix (line 303) | public android.graphics.Matrix getMatrix() { throw new RuntimeExcepti...
method getCameraDistance (line 304) | public float getCameraDistance() { throw new RuntimeException("Stub!"...
method setCameraDistance (line 305) | public void setCameraDistance(float distance) { throw new RuntimeExce...
method getRotation (line 306) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method setRotation (line 308) | public void setRotation(float rotation) { throw new RuntimeException(...
method getRotationY (line 309) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method setRotationY (line 311) | public void setRotationY(float rotationY) { throw new RuntimeExceptio...
method getRotationX (line 312) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method setRotationX (line 314) | public void setRotationX(float rotationX) { throw new RuntimeExceptio...
method getScaleX (line 315) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method setScaleX (line 317) | public void setScaleX(float scaleX) { throw new RuntimeException("Stu...
method getScaleY (line 318) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method setScaleY (line 320) | public void setScaleY(float scaleY) { throw new RuntimeException("Stu...
method getPivotX (line 321) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method setPivotX (line 323) | public void setPivotX(float pivotX) { throw new RuntimeException("Stu...
method getPivotY (line 324) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method setPivotY (line 326) | public void setPivotY(float pivotY) { throw new RuntimeException("Stu...
method getAlpha (line 327) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method hasOverlappingRendering (line 329) | public boolean hasOverlappingRendering() { throw new RuntimeException...
method setAlpha (line 330) | public void setAlpha(float alpha) { throw new RuntimeException("Stub!...
method getTop (line 331) | @android.view.ViewDebug.CapturedViewProperty()
method setTop (line 333) | public final void setTop(int top) { throw new RuntimeException("Stub!...
method getBottom (line 334) | @android.view.ViewDebug.CapturedViewProperty()
method isDirty (line 336) | public boolean isDirty() { throw new RuntimeException("Stub!"); }
method setBottom (line 337) | public final void setBottom(int bottom) { throw new RuntimeException(...
method getLeft (line 338) | @android.view.ViewDebug.CapturedViewProperty()
method setLeft (line 340) | public final void setLeft(int left) { throw new RuntimeException("Stu...
method getRight (line 341) | @android.view.ViewDebug.CapturedViewProperty()
method setRight (line 343) | public final void setRight(int right) { throw new RuntimeException("S...
method getX (line 344) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method setX (line 346) | public void setX(float x) { throw new RuntimeException("Stub!"); }
method getY (line 347) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method setY (line 349) | public void setY(float y) { throw new RuntimeException("Stub!"); }
method getTranslationX (line 350) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method setTranslationX (line 352) | public void setTranslationX(float translationX) { throw new RuntimeEx...
method getTranslationY (line 353) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method setTranslationY (line 355) | public void setTranslationY(float translationY) { throw new RuntimeEx...
method getHitRect (line 356) | public void getHitRect(android.graphics.Rect outRect) { throw new Run...
method getFocusedRect (line 357) | public void getFocusedRect(android.graphics.Rect r) { throw new Runti...
method getGlobalVisibleRect (line 358) | public boolean getGlobalVisibleRect(android.graphics.Rect r, android....
method getGlobalVisibleRect (line 359) | public final boolean getGlobalVisibleRect(android.graphics.Rect r) { ...
method getLocalVisibleRect (line 360) | public final boolean getLocalVisibleRect(android.graphics.Rect r) { t...
method offsetTopAndBottom (line 361) | public void offsetTopAndBottom(int offset) { throw new RuntimeExcepti...
method offsetLeftAndRight (line 362) | public void offsetLeftAndRight(int offset) { throw new RuntimeExcepti...
method getLayoutParams (line 363) | @android.view.ViewDebug.ExportedProperty(deepExport=true,prefix="layou...
method setLayoutParams (line 365) | public void setLayoutParams(android.view.ViewGroup.LayoutParams param...
method scrollTo (line 366) | public void scrollTo(int x, int y) { throw new RuntimeException("Stub...
method scrollBy (line 367) | public void scrollBy(int x, int y) { throw new RuntimeException("Stub...
method awakenScrollBars (line 368) | protected boolean awakenScrollBars() { throw new RuntimeException("St...
method awakenScrollBars (line 369) | protected boolean awakenScrollBars(int startDelay) { throw new Runtim...
method awakenScrollBars (line 370) | protected boolean awakenScrollBars(int startDelay, boolean invalidate...
method invalidate (line 371) | public void invalidate(android.graphics.Rect dirty) { throw new Runti...
method invalidate (line 372) | public void invalidate(int l, int t, int r, int b) { throw new Runtim...
method invalidate (line 373) | public void invalidate() { throw new RuntimeException("Stub!"); }
method isOpaque (line 374) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method getHandler (line 376) | public android.os.Handler getHandler() { throw new RuntimeException("...
method post (line 377) | public boolean post(java.lang.Runnable action) { throw new RuntimeExc...
method postDelayed (line 378) | public boolean postDelayed(java.lang.Runnable action, long delayMilli...
method postOnAnimation (line 379) | public void postOnAnimation(java.lang.Runnable action) { throw new Ru...
method postOnAnimationDelayed (line 380) | public void postOnAnimationDelayed(java.lang.Runnable action, long de...
method removeCallbacks (line 381) | public boolean removeCallbacks(java.lang.Runnable action) { throw new...
method postInvalidate (line 382) | public void postInvalidate() { throw new RuntimeException("Stub!"); }
method postInvalidate (line 383) | public void postInvalidate(int left, int top, int right, int bottom) ...
method postInvalidateDelayed (line 384) | public void postInvalidateDelayed(long delayMilliseconds) { throw new...
method postInvalidateDelayed (line 385) | public void postInvalidateDelayed(long delayMilliseconds, int left, i...
method postInvalidateOnAnimation (line 386) | public void postInvalidateOnAnimation() { throw new RuntimeException(...
method postInvalidateOnAnimation (line 387) | public void postInvalidateOnAnimation(int left, int top, int right, i...
method computeScroll (line 388) | public void computeScroll() { throw new RuntimeException("Stub!"); }
method isHorizontalFadingEdgeEnabled (line 389) | public boolean isHorizontalFadingEdgeEnabled() { throw new RuntimeExc...
method setHorizontalFadingEdgeEnabled (line 390) | public void setHorizontalFadingEdgeEnabled(boolean horizontalFadingEd...
method isVerticalFadingEdgeEnabled (line 391) | public boolean isVerticalFadingEdgeEnabled() { throw new RuntimeExcep...
method setVerticalFadingEdgeEnabled (line 392) | public void setVerticalFadingEdgeEnabled(boolean verticalFadingEdgeEn...
method getTopFadingEdgeStrength (line 393) | protected float getTopFadingEdgeStrength() { throw new RuntimeExcepti...
method getBottomFadingEdgeStrength (line 394) | protected float getBottomFadingEdgeStrength() { throw new RuntimeExce...
method getLeftFadingEdgeStrength (line 395) | protected float getLeftFadingEdgeStrength() { throw new RuntimeExcept...
method getRightFadingEdgeStrength (line 396) | protected float getRightFadingEdgeStrength() { throw new RuntimeExcep...
method isHorizontalScrollBarEnabled (line 397) | public boolean isHorizontalScrollBarEnabled() { throw new RuntimeExce...
method setHorizontalScrollBarEnabled (line 398) | public void setHorizontalScrollBarEnabled(boolean horizontalScrollBar...
method isVerticalScrollBarEnabled (line 399) | public boolean isVerticalScrollBarEnabled() { throw new RuntimeExcept...
method setVerticalScrollBarEnabled (line 400) | public void setVerticalScrollBarEnabled(boolean verticalScrollBarEnab...
method setScrollbarFadingEnabled (line 401) | public void setScrollbarFadingEnabled(boolean fadeScrollbars) { throw...
method isScrollbarFadingEnabled (line 402) | public boolean isScrollbarFadingEnabled() { throw new RuntimeExceptio...
method getScrollBarDefaultDelayBeforeFade (line 403) | public int getScrollBarDefaultDelayBeforeFade() { throw new RuntimeEx...
method setScrollBarDefaultDelayBeforeFade (line 404) | public void setScrollBarDefaultDelayBeforeFade(int scrollBarDefaultDe...
method getScrollBarFadeDuration (line 405) | public int getScrollBarFadeDuration() { throw new RuntimeException("S...
method setScrollBarFadeDuration (line 406) | public void setScrollBarFadeDuration(int scrollBarFadeDuration) { thr...
method getScrollBarSize (line 407) | public int getScrollBarSize() { throw new RuntimeException("Stub!"); }
method setScrollBarSize (line 408) | public void setScrollBarSize(int scrollBarSize) { throw new RuntimeEx...
method setScrollBarStyle (line 409) | public void setScrollBarStyle(int style) { throw new RuntimeException...
method getScrollBarStyle (line 410) | @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDe...
method computeHorizontalScrollRange (line 412) | protected int computeHorizontalScrollRange() { throw new RuntimeExcep...
method computeHorizontalScrollOffset (line 413) | protected int computeHorizontalScrollOffset() { throw new RuntimeExce...
method computeHorizontalScrollExtent (line 414) | protected int computeHorizontalScrollExtent() { throw new RuntimeExce...
method computeVerticalScrollRange (line 415) | protected int computeVerticalScrollRange() { throw new RuntimeExcepti...
method computeVerticalScrollOffset (line 416) | protected int computeVerticalScrollOffset() { throw new RuntimeExcept...
method computeVerticalScrollExtent (line 417) | protected int computeVerticalScrollExtent() { throw new RuntimeExcept...
method canScrollHorizontally (line 418) | public boolean canScrollHorizontally(int direction) { throw new Runti...
method canScrollVertically (line 419) | public boolean canScrollVertically(int direction) { throw new Runtime...
method onDrawScrollBars (line 420) | protected final void onDrawScrollBars(android.graphics.Canvas canvas)...
method onDraw (line 421) | protected void onDraw(android.graphics.Canvas canvas) { throw new Run...
method onAttachedToWindow (line 422) | protected void onAttachedToWindow() { throw new RuntimeException("Stu...
method onScreenStateChanged (line 423) | public void onScreenStateChanged(int screenState) { throw new Runtime...
method onDetachedFromWindow (line 424) | protected void onDetachedFromWindow() { throw new RuntimeException("S...
method getWindowAttachCount (line 425) | protected int getWindowAttachCount() { throw new RuntimeException("St...
method getWindowToken (line 426) | public android.os.IBinder getWindowToken() { throw new RuntimeExcepti...
method getApplicationWindowToken (line 427) | public android.os.IBinder getApplicationWindowToken() { throw new Run...
method saveHierarchyState (line 428) | public void saveHierarchyState(android.util.SparseArray<android.os.Pa...
method dispatchSaveInstanceState (line 429) | protected void dispatchSaveInstanceState(android.util.SparseArray<and...
method onSaveInstanceState (line 430) | protected android.os.Parcelable onSaveInstanceState() { throw new Run...
method restoreHierarchyState (line 431) | public void restoreHierarchyState(android.util.SparseArray<android.os...
method dispatchRestoreInstanceState (line 432) | protected void dispatchRestoreInstanceState(android.util.SparseArray<...
method onRestoreInstanceState (line 433) | protected void onRestoreInstanceState(android.os.Parcelable state) { ...
method getDrawingTime (line 434) | public long getDrawingTime() { throw new RuntimeException("Stub!"); }
method setDuplicateParentStateEnabled (line 435) | public void setDuplicateParentStateEnabled(boolean enabled) { throw n...
method isDuplicateParentStateEnabled (line 436) | public boolean isDuplicateParentStateEnabled() { throw new RuntimeExc...
method setLayerType (line 437) | public void setLayerType(int layerType, android.graphics.Paint paint)...
method getLayerType (line 438) | public int getLayerType() { throw new RuntimeException("Stub!"); }
method buildLayer (line 439) | public void buildLayer() { throw new RuntimeException("Stub!"); }
method setDrawingCacheEnabled (line 440) | public void setDrawingCacheEnabled(boolean enabled) { throw new Runti...
method isDrawingCacheEnabled (line 441) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method getDrawingCache (line 443) | public android.graphics.Bitmap getDrawingCache() { throw new RuntimeE...
method getDrawingCache (line 444) | public android.graphics.Bitmap getDrawingCache(boolean autoScale) { t...
method destroyDrawingCache (line 445) | public void destroyDrawingCache() { throw new RuntimeException("Stub!...
method setDrawingCacheBackgroundColor (line 446) | public void setDrawingCacheBackgroundColor(int color) { throw new Run...
method getDrawingCacheBackgroundColor (line 447) | public int getDrawingCacheBackgroundColor() { throw new RuntimeExcept...
method buildDrawingCache (line 448) | public void buildDrawingCache() { throw new RuntimeException("Stub!"); }
method buildDrawingCache (line 449) | public void buildDrawingCache(boolean autoScale) { throw new RuntimeE...
method isInEditMode (line 450) | public boolean isInEditMode() { throw new RuntimeException("Stub!"); }
method isPaddingOffsetRequired (line 451) | protected boolean isPaddingOffsetRequired() { throw new RuntimeExcept...
method getLeftPaddingOffset (line 452) | protected int getLeftPaddingOffset() { throw new RuntimeException("St...
method getRightPaddingOffset (line 453) | protected int getRightPaddingOffset() { throw new RuntimeException("S...
method getTopPaddingOffset (line 454) | protected int getTopPaddingOffset() { throw new RuntimeException("Stu...
method getBottomPaddingOffset (line 455) | protected int getBottomPaddingOffset() { throw new RuntimeException("...
method isHardwareAccelerated (line 456) | public boolean isHardwareAccelerated() { throw new RuntimeException("...
method draw (line 457) | public void draw(android.graphics.Canvas canvas) { throw new RuntimeE...
method getSolidColor (line 458) | @android.view.ViewDebug.ExportedProperty(category="drawing")
method isLayoutRequested (line 460) | public boolean isLayoutRequested() { throw new RuntimeException("Stub...
method layout (line 461) | @java.lang.SuppressWarnings(value={"unchecked"})
method onLayout (line 463) | protected void onLayout(boolean changed, int left, int top, int right...
method onFinishInflate (line 464) | protected void onFinishInflate() { throw new RuntimeException("Stub!"...
method getResources (line 465) | public android.content.res.Resources getResources() { throw new Runti...
method invalidateDrawable (line 466) | public void invalidateDrawable(android.graphics.drawable.Drawable dra...
method scheduleDrawable (line 467) | public void scheduleDrawable(android.graphics.drawable.Drawable who, ...
method unscheduleDrawable (line 468) | public void unscheduleDrawable(android.graphics.drawable.Drawable who...
method unscheduleDrawable (line 469) | public void unscheduleDrawable(android.graphics.drawable.Drawable who...
method verifyDrawable (line 470) | protected boolean verifyDrawable(android.graphics.drawable.Drawable w...
method drawableStateChanged (line 471) | protected void drawableStateChanged() { throw new RuntimeException("S...
method refreshDrawableState (line 472) | public void refreshDrawableState() { throw new RuntimeException("Stub...
method getDrawableState (line 473) | public final int[] getDrawableState() { throw new RuntimeException("S...
method onCreateDrawableState (line 474) | protected int[] onCreateDrawableState(int extraSpace) { throw new Run...
method mergeDrawableStates (line 475) | protected static int[] mergeDrawableStates(int[] baseState, int[] add...
method jumpDrawablesToCurrentState (line 476) | public void jumpDrawablesToCurrentState() { throw new RuntimeExceptio...
method setBackgroundColor (line 477) | public void setBackgroundColor(int color) { throw new RuntimeExceptio...
method setBackgroundResource (line 478) | public void setBackgroundResource(int resid) { throw new RuntimeExcep...
method setBackground (line 479) | public void setBackground(android.graphics.drawable.Drawable backgrou...
method setBackgroundDrawable (line 480) | @java.lang.Deprecated()
method getBackground (line 482) | public android.graphics.drawable.Drawable getBackground() { throw new...
method setPadding (line 483) | public void setPadding(int left, int top, int right, int bottom) { th...
method getPaddingTop (line 484) | public int getPaddingTop() { throw new RuntimeException("Stub!"); }
method getPaddingBottom (line 485) | public int getPaddingBottom() { throw new RuntimeException("Stub!"); }
method getPaddingLeft (line 486) | public int getPaddingLeft() { throw new RuntimeException("Stub!"); }
method getPaddingRight (line 487) | public int getPaddingRight() { throw new RuntimeException("Stub!"); }
method setSelected (line 488) | public void setSelected(boolean selected) { throw new RuntimeExceptio...
method dispatchSetSelected (line 489) | protected void dispatchSetSelected(boolean selected) { throw new Runt...
method isSelected (line 490) | @android.view.ViewDebug.ExportedProperty()
method setActivated (line 492) | public void setActivated(boolean activated) { throw new RuntimeExcept...
method dispatchSetActivated (line 493) | protected void dispatchSetActivated(boolean activated) { throw new Ru...
method isActivated (line 494) | @android.view.ViewDebug.ExportedProperty()
method getViewTreeObserver (line 496) | public android.view.ViewTreeObserver getViewTreeObserver() { throw ne...
method getRootView (line 497) | public android.view.View getRootView() { throw new RuntimeException("...
method getLocationOnScreen (line 498) | public void getLocationOnScreen(int[] location) { throw new RuntimeEx...
method getLocationInWindow (line 499) | public void getLocationInWindow(int[] location) { throw new RuntimeEx...
method findViewById (line 500) | public final android.view.View findViewById(int id) { throw new Runti...
method findViewWithTag (line 501) | public final android.view.View findViewWithTag(java.lang.Object tag) ...
method setId (line 502) | public void setId(int id) { throw new RuntimeException("Stub!"); }
method getId (line 503) | @android.view.ViewDebug.CapturedViewProperty()
method getTag (line 505) | @android.view.ViewDebug.ExportedProperty()
method setTag (line 507) | public void setTag(java.lang.Object tag) { throw new RuntimeException...
method getTag (line 508) | public java.lang.Object getTag(int key) { throw new RuntimeException(...
method setTag (line 509) | public void setTag(int key, java.lang.Object tag) { throw new Runtime...
method getBaseline (line 510) | @android.view.ViewDebug.ExportedProperty(category="layout")
method requestLayout (line 512) | public void requestLayout() { throw new RuntimeException("Stub!"); }
method forceLayout (line 513) | public void forceLayout() { throw new RuntimeException("Stub!"); }
method measure (line 514) | public final void measure(int widthMeasureSpec, int heightMeasureSpec...
method onMeasure (line 515) | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)...
method setMeasuredDimension (line 516) | protected final void setMeasuredDimension(int measuredWidth, int meas...
method combineMeasuredStates (line 517) | public static int combineMeasuredStates(int curState, int newState) {...
method resolveSize (line 518) | public static int resolveSize(int size, int measureSpec) { throw new ...
method resolveSizeAndState (line 519) | public static int resolveSizeAndState(int size, int measureSpec, int ...
method getDefaultSize (line 520) | public static int getDefaultSize(int size, int measureSpec) { throw n...
method getSuggestedMinimumHeight (line 521) | protected int getSuggestedMinimumHeight() { throw new RuntimeExceptio...
method getSuggestedMinimumWidth (line 522) | protected int getSuggestedMinimumWidth() { throw new RuntimeException...
method getMinimumHeight (line 523) | public int getMinimumHeight() { throw new RuntimeException("Stub!"); }
method setMinimumHeight (line 524) | public void setMinimumHeight(int minHeight) { throw new RuntimeExcept...
method getMinimumWidth (line 525) | public int getMinimumWidth() { throw new RuntimeException("Stub!"); }
method setMinimumWidth (line 526) | public void setMinimumWidth(int minWidth) { throw new RuntimeExceptio...
method getAnimation (line 527) | public android.view.animation.Animation getAnimation() { throw new Ru...
method startAnimation (line 528) | public void startAnimation(android.view.animation.Animation animation...
method clearAnimation (line 529) | public void clearAnimation() { throw new RuntimeException("Stub!"); }
method setAnimation (line 530) | public void setAnimation(android.view.animation.Animation animation) ...
method onAnimationStart (line 531) | protected void onAnimationStart() { throw new RuntimeException("Stub!...
method onAnimationEnd (line 532) | protected void onAnimationEnd() { throw new RuntimeException("Stub!"); }
method onSetAlpha (line 533) | protected boolean onSetAlpha(int alpha) { throw new RuntimeException(...
method playSoundEffect (line 534) | public void playSoundEffect(int soundConstant) { throw new RuntimeExc...
method performHapticFeedback (line 535) | public boolean performHapticFeedback(int feedbackConstant) { throw ne...
method performHapticFeedback (line 536) | public boolean performHapticFeedback(int feedbackConstant, int flags)...
method setSystemUiVisibility (line 537) | public void setSystemUiVisibility(int visibility) { throw new Runtime...
method getSystemUiVisibility (line 538) | public int getSystemUiVisibility() { throw new RuntimeException("Stub...
method getWindowSystemUiVisibility (line 539) | public int getWindowSystemUiVisibility() { throw new RuntimeException...
method onWindowSystemUiVisibilityChanged (line 540) | public void onWindowSystemUiVisibilityChanged(int visible) { throw ne...
method dispatchWindowSystemUiVisiblityChanged (line 541) | public void dispatchWindowSystemUiVisiblityChanged(int visible) { thr...
method setOnSystemUiVisibilityChangeListener (line 542) | public void setOnSystemUiVisibilityChangeListener(android.view.View.O...
method dispatchSystemUiVisibilityChanged (line 543) | public void dispatchSystemUiVisibilityChanged(int visibility) { throw...
method startDrag (line 544) | public final boolean startDrag(android.content.ClipData data, android...
method onDragEvent (line 545) | public boolean onDragEvent(android.view.DragEvent event) { throw new ...
method dispatchDragEvent (line 546) | public boolean dispatchDragEvent(android.view.DragEvent event) { thro...
method inflate (line 547) | public static android.view.View inflate(android.content.Context conte...
method overScrollBy (line 548) | @java.lang.SuppressWarnings(value={"UnusedParameters"})
method onOverScrolled (line 550) | protected void onOverScrolled(int scrollX, int scrollY, boolean clamp...
method getOverScrollMode (line 551) | public int getOverScrollMode() { throw new RuntimeException("Stub!"); }
method setOverScrollMode (line 552) | public void setOverScrollMode(int overScrollMode) { throw new Runtime...
method animate (line 553) | public android.view.ViewPropertyAnimator animate() { throw new Runtim...
FILE: modules/services/src/main/java/cards/nine/services/contacts/Fields.java
type Fields (line 25) | @TargetApi(Build.VERSION_CODES.HONEYCOMB)
Condensed preview — 950 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,396K chars).
[
{
"path": ".gitignore",
"chars": 880,
"preview": "logs\ntarget\ntmp\n.history\ndist\n/out\n/RUNNING_PID\n/.ivy*\n\n# Keys\n/debug.properties\n/ninecards.properties\n/debug.keystore\n/"
},
{
"path": ".scalafmt.conf",
"chars": 372,
"preview": "style = defaultWithAlign\nmaxColumn = 100\n\ncontinuationIndent.callSite = 2\n\nnewlines {\n sometimesBeforeColonInMethodRetu"
},
{
"path": ".travis.yml",
"chars": 1845,
"preview": "sudo: false\nlanguage: scala\njdk:\n - oraclejdk8\nscala:\n - 2.11.7\naddons:\n apt:\n packages:\n - libc6-i386\n "
},
{
"path": "CHANGELOG.md",
"chars": 4630,
"preview": "## 2017/02/06 - Version Name: 2.0.11-rc2 - Version Code: 68\n\n* FlowUp have to be activated from Developer Options\n\n## 20"
},
{
"path": "CONTRIBUTING.md",
"chars": 2610,
"preview": "\n## How Can I Contribute?\n\nThe issues have been integrated into all stages of the development process. This way, the wor"
},
{
"path": "ISSUE_TEMPLATE.md",
"chars": 219,
"preview": "### Description\n\n[Description of the issue]\n\n### Steps to Reproduce\n\n1. [First Step]\n2. [Second Step]\n3. [and so on...]\n"
},
{
"path": "LICENSE",
"chars": 2118,
"preview": "Copyright 2016 47 Degrees, LLC. <http://www.47deg.com>\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n"
},
{
"path": "PULL_REQUEST_TEMPLATE.md",
"chars": 364,
"preview": "# Pull Request Checklist\n\n* [ ] Have you read through the [contributor guidelines](https://github.com/47deg/nine-cards-v"
},
{
"path": "README.md",
"chars": 1850,
"preview": "[](https://gitter.im/47deg"
},
{
"path": "README_old.md",
"chars": 9976,
"preview": "[](https://travis"
},
{
"path": "codecov.yml",
"chars": 171,
"preview": "codecov:\n bot: 47degdev\ncomment:\n layout: header, changes, diff\ncoverage:\n ignore:\n - modules/commons-tests/*\n "
},
{
"path": "modules/api/build.sbt",
"chars": 42,
"preview": "platformTarget in Android := \"android-24\"\n"
},
{
"path": "modules/api/src/main/AndroidManifest.xml",
"chars": 977,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n ~ Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n ~\n ~ Licensed "
},
{
"path": "modules/api/src/main/res/values/strings.xml",
"chars": 763,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n ~ Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n ~\n ~ Licensed "
},
{
"path": "modules/api/src/main/scala/cards/nine/api/rest/client/Exceptions.scala",
"chars": 1069,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/main/scala/cards/nine/api/rest/client/ServiceClient.scala",
"chars": 5438,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/main/scala/cards/nine/api/rest/client/http/Exceptions.scala",
"chars": 1057,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/main/scala/cards/nine/api/rest/client/http/HttpClient.scala",
"chars": 1511,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/main/scala/cards/nine/api/rest/client/http/HttpClientResponse.scala",
"chars": 734,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/main/scala/cards/nine/api/rest/client/http/OkHttpClient.scala",
"chars": 3968,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/main/scala/cards/nine/api/rest/client/messages/Messages.scala",
"chars": 820,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/main/scala/cards/nine/api/version1/ApiService.scala",
"chars": 1599,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/main/scala/cards/nine/api/version1/JsonImplicits.scala",
"chars": 3318,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/main/scala/cards/nine/api/version1/Model.scala",
"chars": 3367,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/main/scala/cards/nine/api/version2/ApiService.scala",
"chars": 12152,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/main/scala/cards/nine/api/version2/JsonImplicits.scala",
"chars": 3705,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/main/scala/cards/nine/api/version2/Model.scala",
"chars": 4523,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/test/scala/cards/nine/api/rest/client/Messages.scala",
"chars": 746,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/test/scala/cards/nine/api/rest/client/ServiceClientData.scala",
"chars": 1808,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/test/scala/cards/nine/api/rest/client/ServiceClientSpec.scala",
"chars": 22984,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/test/scala/cards/nine/api/rest/client/http/OkHttpClientSpec.scala",
"chars": 6308,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/test/scala/cards/nine/api/version1/ApiServiceData.scala",
"chars": 3237,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/test/scala/cards/nine/api/version1/ApiServiceSpec.scala",
"chars": 2621,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/test/scala/cards/nine/api/version2/ApiServiceData.scala",
"chars": 8171,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/test/scala/cards/nine/api/version2/ApiServiceSpec.scala",
"chars": 15822,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/api/src/test/scala/com/fortysevendeg/BaseTestSupport.scala",
"chars": 877,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/app/build.sbt",
"chars": 42,
"preview": "platformTarget in Android := \"android-24\"\n"
},
{
"path": "modules/app/crashlytics/templates/CrashlyticsManifest.xml",
"chars": 449,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"com.fortysevendeg.ninecardslaunc"
},
{
"path": "modules/app/project/plugins.sbt",
"chars": 64,
"preview": "addSbtPlugin(\"com.hanhuy.sbt\" % \"android-sdk-plugin\" % \"1.5.1\")\n"
},
{
"path": "modules/app/src/main/AndroidManifest.xml",
"chars": 10309,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"com.fortysevendeg.ninecardslaunc"
},
{
"path": "modules/app/src/main/java/cards/nine/utils/SystemBarTintManager.java",
"chars": 14823,
"preview": "/*\n * Copyright (C) 2013 readyState Software Ltd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n "
},
{
"path": "modules/app/src/main/res/anim/elevation_transition.xml",
"chars": 738,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "modules/app/src/main/res/anim/grid_cards_layout_animation.xml",
"chars": 368,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<gridLayoutAnimation\n xmlns:android=\"http://schemas.android.com/apk/res/androi"
},
{
"path": "modules/app/src/main/res/anim/list_slide_in_bottom_animation.xml",
"chars": 368,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<gridLayoutAnimation\n xmlns:android=\"http://schemas.android.com/apk/res/androi"
},
{
"path": "modules/app/src/main/res/anim/slide_in_bottom.xml",
"chars": 301,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/color/wizard_text_button.xml",
"chars": 267,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n <item "
},
{
"path": "modules/app/src/main/res/drawable/background_icon_collection_detail.xml",
"chars": 223,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/drawable/background_title_fab_menu_item.xml",
"chars": 319,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "modules/app/src/main/res/drawable/background_title_fab_menu_item_default.xml",
"chars": 302,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/drawable/background_title_fab_menu_item_pressed.xml",
"chars": 302,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/drawable/drawer_pager.xml",
"chars": 285,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "modules/app/src/main/res/drawable/drawer_pager_current.xml",
"chars": 200,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:"
},
{
"path": "modules/app/src/main/res/drawable/drawer_pager_default.xml",
"chars": 200,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:"
},
{
"path": "modules/app/src/main/res/drawable/fastscroller_bar.xml",
"chars": 317,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:"
},
{
"path": "modules/app/src/main/res/drawable/fastscroller_signal.xml",
"chars": 572,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:"
},
{
"path": "modules/app/src/main/res/drawable/mark_widget_resizing.xml",
"chars": 214,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android"
},
{
"path": "modules/app/src/main/res/drawable/publish_collection_wizard_pager.xml",
"chars": 201,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "modules/app/src/main/res/drawable/publish_collection_wizard_pager_current.xml",
"chars": 219,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:"
},
{
"path": "modules/app/src/main/res/drawable/stroke_widget_selected.xml",
"chars": 263,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android"
},
{
"path": "modules/app/src/main/res/drawable/wizard_inline_pager.xml",
"chars": 299,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "modules/app/src/main/res/drawable/wizard_inline_pager_current.xml",
"chars": 207,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:"
},
{
"path": "modules/app/src/main/res/drawable/wizard_inline_pager_default.xml",
"chars": 207,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:"
},
{
"path": "modules/app/src/main/res/drawable/wizard_pager.xml",
"chars": 285,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "modules/app/src/main/res/drawable/wizard_pager_current.xml",
"chars": 200,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:"
},
{
"path": "modules/app/src/main/res/drawable/wizard_pager_default.xml",
"chars": 200,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:"
},
{
"path": "modules/app/src/main/res/drawable/workspaces_pager.xml",
"chars": 293,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "modules/app/src/main/res/layout/about_header_preference.xml",
"chars": 618,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/about_team_preference.xml",
"chars": 318,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<HorizontalScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
},
{
"path": "modules/app/src/main/res/layout/add_moment_item.xml",
"chars": 621,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/app_drawer_layout.xml",
"chars": 1269,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/app_drawer_panel.xml",
"chars": 1409,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/app_item.xml",
"chars": 365,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/app_link_dialog_activity.xml",
"chars": 776,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n a"
},
{
"path": "modules/app/src/main/res/layout/app_select_item.xml",
"chars": 943,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/apps_moment_layout.xml",
"chars": 622,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/base_action_fragment.xml",
"chars": 2011,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/card_item.xml",
"chars": 853,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView\n xmlns:android=\"http://schemas.android.com"
},
{
"path": "modules/app/src/main/res/layout/collection_bar_view_panel.xml",
"chars": 794,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n s"
},
{
"path": "modules/app/src/main/res/layout/collection_checkbox.xml",
"chars": 665,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/collection_detail_fragment.xml",
"chars": 1353,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/collection_item.xml",
"chars": 782,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<FrameLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/collections_actions_view_panel.xml",
"chars": 834,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/collections_detail_activity.xml",
"chars": 1655,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/collections_detail_tab.xml",
"chars": 81,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView style=\"@style/CollectionsTab\" />"
},
{
"path": "modules/app/src/main/res/layout/collections_workspace_layout.xml",
"chars": 308,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/color_info_item_dialog.xml",
"chars": 277,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<FrameLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/contact_info_email_dialog.xml",
"chars": 1165,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/contact_info_general_dialog.xml",
"chars": 1082,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/contact_info_header.xml",
"chars": 558,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n s"
},
{
"path": "modules/app/src/main/res/layout/contact_info_phone_dialog.xml",
"chars": 1403,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/contact_item.xml",
"chars": 593,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/dialog_edit_card.xml",
"chars": 442,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n styl"
},
{
"path": "modules/app/src/main/res/layout/dialog_edit_text.xml",
"chars": 460,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n styl"
},
{
"path": "modules/app/src/main/res/layout/edit_moment.xml",
"chars": 5181,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n st"
},
{
"path": "modules/app/src/main/res/layout/edit_moment_hour_layout.xml",
"chars": 1449,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/edit_moment_wifi_layout.xml",
"chars": 542,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/empty_profile_item.xml",
"chars": 650,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/fab_item.xml",
"chars": 345,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n styl"
},
{
"path": "modules/app/src/main/res/layout/fastscroller.xml",
"chars": 818,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:"
},
{
"path": "modules/app/src/main/res/layout/header_list_item.xml",
"chars": 273,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/icon_info_item_dialog.xml",
"chars": 387,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/last_call_item.xml",
"chars": 822,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/launcher_activity.xml",
"chars": 2773,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<android.support.v4.widget.DrawerLayout\n xmlns:android=\"http://schemas.androi"
},
{
"path": "modules/app/src/main/res/layout/list_action_apps_fragment.xml",
"chars": 829,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/list_action_fragment.xml",
"chars": 218,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<android.support.v7.widget.RecyclerView\n xmlns:android=\"http://schemas.androi"
},
{
"path": "modules/app/src/main/res/layout/list_action_with_scroller_fragment.xml",
"chars": 751,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<cards.nine.app.ui.components.layouts.FastScrollerLayout\n xmlns:android=\"http:"
},
{
"path": "modules/app/src/main/res/layout/list_item_popup_menu.xml",
"chars": 84,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView style=\"@style/ListPopupMenuText\" />"
},
{
"path": "modules/app/src/main/res/layout/menu_header.xml",
"chars": 700,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n a"
},
{
"path": "modules/app/src/main/res/layout/moment_bar_view_panel.xml",
"chars": 1449,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/new_collection.xml",
"chars": 1420,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/private_collections_item.xml",
"chars": 1456,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<android.support.v7.widget.CardView\n xmlns:android=\"http://schemas.android.co"
},
{
"path": "modules/app/src/main/res/layout/profile_account_item.xml",
"chars": 848,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/profile_account_item_header.xml",
"chars": 186,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andr"
},
{
"path": "modules/app/src/main/res/layout/profile_activity.xml",
"chars": 2560,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n x"
},
{
"path": "modules/app/src/main/res/layout/profile_subscription_item.xml",
"chars": 1108,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
},
{
"path": "modules/app/src/main/res/layout/public_collections_item.xml",
"chars": 2347,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<android.support.v7.widget.CardView\n xmlns:android=\"http://schemas.android.co"
},
{
"path": "modules/app/src/main/res/layout/publish_collection_wizard.xml",
"chars": 8019,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n a"
},
{
"path": "modules/app/src/main/res/layout/recommendations_item.xml",
"chars": 2367,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<android.support.v7.widget.CardView\n xmlns:android=\"http://schemas.android.co"
},
{
"path": "modules/app/src/main/res/layout/search_box_panel.xml",
"chars": 822,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/search_item.xml",
"chars": 978,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/select_collection_dialog.xml",
"chars": 379,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v4.widget.NestedScrollView\n xmlns:android=\"http://schemas"
},
{
"path": "modules/app/src/main/res/layout/select_collection_item.xml",
"chars": 464,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/select_moment_dialog.xml",
"chars": 359,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v4.widget.NestedScrollView\n xmlns:android=\"http://schemas.and"
},
{
"path": "modules/app/src/main/res/layout/select_moment_item.xml",
"chars": 1173,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n s"
},
{
"path": "modules/app/src/main/res/layout/shortcut_item.xml",
"chars": 380,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/swipe_animation_drawer_layout.xml",
"chars": 503,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n a"
},
{
"path": "modules/app/src/main/res/layout/tab_item.xml",
"chars": 639,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n s"
},
{
"path": "modules/app/src/main/res/layout/toolbar_dialog.xml",
"chars": 920,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n x"
},
{
"path": "modules/app/src/main/res/layout/widget_item.xml",
"chars": 760,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<android.support.v7.widget.CardView\n xmlns:android=\"http://schemas.android.co"
},
{
"path": "modules/app/src/main/res/layout/widgets_action_fragment.xml",
"chars": 595,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/wizard_activity.xml",
"chars": 3876,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/wizard_checkbox.xml",
"chars": 384,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/wizard_inline.xml",
"chars": 811,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/wizard_inline_step.xml",
"chars": 517,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/wizard_moment_checkbox.xml",
"chars": 882,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/wizard_new_conf_step_0.xml",
"chars": 943,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/wizard_new_conf_step_1.xml",
"chars": 1341,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/wizard_new_conf_step_2.xml",
"chars": 1117,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/wizard_new_conf_step_3.xml",
"chars": 611,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/wizard_new_conf_step_4.xml",
"chars": 1009,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/wizard_new_conf_step_5.xml",
"chars": 1074,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/wizard_step.xml",
"chars": 604,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/wizard_wifi_checkbox.xml",
"chars": 883,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/workspace_button.xml",
"chars": 598,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/layout/workspace_item_menu.xml",
"chars": 375,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n styl"
},
{
"path": "modules/app/src/main/res/layout/workspace_menu_layout.xml",
"chars": 958,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "modules/app/src/main/res/menu/app_menu.xml",
"chars": 1262,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <group\n "
},
{
"path": "modules/app/src/main/res/menu/collection_detail_menu.xml",
"chars": 978,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:ap"
},
{
"path": "modules/app/src/main/res/menu/collection_edit_menu.xml",
"chars": 711,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:ap"
},
{
"path": "modules/app/src/main/res/menu/profile_menu.xml",
"chars": 335,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:app="
},
{
"path": "modules/app/src/main/res/values/arrays.xml",
"chars": 3235,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <string-array name=\"themes\">\n <item>@string/themesDark</i"
},
{
"path": "modules/app/src/main/res/values/colors.xml",
"chars": 7627,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <!-- Main colors -->\n <color name=\"background_app\">#fefefe</c"
},
{
"path": "modules/app/src/main/res/values/config.xml",
"chars": 3426,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <!-- Api -->\n <string name=\"api_base_url\">${backend.v1.url}</s"
},
{
"path": "modules/app/src/main/res/values/dimens.xml",
"chars": 10445,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <!-- Size by density -->\n\n <dimen name=\"text_xxxxlarge\">24sp<"
},
{
"path": "modules/app/src/main/res/values/ids.xml",
"chars": 458,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <item name=\"view_type\" type=\"id\" />\n <item name=\"position\" typ"
},
{
"path": "modules/app/src/main/res/values/strings.xml",
"chars": 42842,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources\n xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n\n <str"
},
{
"path": "modules/app/src/main/res/values/styles_actions.xml",
"chars": 22400,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <!-- Base -->\n\n <style name=\"BaseActionsRoot\">\n <item "
},
{
"path": "modules/app/src/main/res/values/styles_cards.xml",
"chars": 2149,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <style name=\"CardRoot\">\n <item name=\"android:layout_width"
},
{
"path": "modules/app/src/main/res/values/styles_collections.xml",
"chars": 7282,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <style name=\"CollectionsRoot\">\n <item name=\"android:layou"
},
{
"path": "modules/app/src/main/res/values/styles_dialogs.xml",
"chars": 29402,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <!-- Dialog Contact Info Header -->\n\n <style name=\"ContactInf"
},
{
"path": "modules/app/src/main/res/values/styles_drawer.xml",
"chars": 3651,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <style name=\"LauncherDrawerParent\">\n <item name=\"android:"
},
{
"path": "modules/app/src/main/res/values/styles_fast_scroller.xml",
"chars": 2271,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <style name=\"FastScrollerSignalParent\">\n <item name=\"andr"
},
{
"path": "modules/app/src/main/res/values/styles_items.xml",
"chars": 34686,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <!-- Header List Item -->\n\n <style name=\"HeaderListRoot\">\n "
},
{
"path": "modules/app/src/main/res/values/styles_launcher.xml",
"chars": 18577,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <style name=\"LauncherRoot\">\n <item name=\"android:layout_w"
},
{
"path": "modules/app/src/main/res/values/styles_menu.xml",
"chars": 3517,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <style name=\"MenuDrawerLayout\">\n <item name=\"android:layo"
},
{
"path": "modules/app/src/main/res/values/styles_menu_items.xml",
"chars": 4567,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <!-- Workspace Menu Item -->\n\n <style name=\"WorkspaceMenuItem"
},
{
"path": "modules/app/src/main/res/values/styles_preferences.xml",
"chars": 4442,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <style name=\"PreferencesActionBar\" parent=\"@android:style/Widget"
},
{
"path": "modules/app/src/main/res/values/styles_profile.xml",
"chars": 9599,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <style name=\"ProfileRoot\">\n <item name=\"android:layout_wid"
},
{
"path": "modules/app/src/main/res/values/styles_pull_to_tabs.xml",
"chars": 982,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <style name=\"PullToTabsContent\">\n <item name=\"android:lay"
},
{
"path": "modules/app/src/main/res/values/styles_wizard.xml",
"chars": 34658,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <style name=\"WizardRoot\">\n <item name=\"android:layout_wid"
},
{
"path": "modules/app/src/main/res/values/themes.xml",
"chars": 2967,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <style name=\"AppThemeBase\" parent=\"AppThemeCommons\" />\n\n <sty"
},
{
"path": "modules/app/src/main/res/values-es/arrays.xml",
"chars": 285,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <string-array name=\"days_letters\">\n <item>D</item>\n "
},
{
"path": "modules/app/src/main/res/values-es/strings.xml",
"chars": 43193,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <!-- General -->\n <string name=\"edit\">Editar</string>\n <st"
},
{
"path": "modules/app/src/main/res/values-sw400dp/dimens.xml",
"chars": 1510,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <!-- Size by density -->\n\n <dimen name=\"text_xxxxlarge\">26sp<"
},
{
"path": "modules/app/src/main/res/values-sw400dp/strings.xml",
"chars": 152,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <!-- Dimen -->\n <string name=\"dimen_name\" translatable=\"false"
},
{
"path": "modules/app/src/main/res/values-sw600dp/dimens.xml",
"chars": 1510,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <!-- Size by density -->\n\n <dimen name=\"text_xxxxlarge\">26sp<"
},
{
"path": "modules/app/src/main/res/values-sw600dp/strings.xml",
"chars": 152,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <!-- Dimen -->\n <string name=\"dimen_name\" translatable=\"false"
},
{
"path": "modules/app/src/main/res/values-v17/dimens.xml",
"chars": 110,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <dimen name=\"padding_checkbox\">8dp</dimen>\n</resources>"
},
{
"path": "modules/app/src/main/res/values-v19/themes.xml",
"chars": 702,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <style name=\"AppThemeWallpaper\" parent=\"AppThemeWallpaperBase\">\n"
},
{
"path": "modules/app/src/main/res/values-v21/colors.xml",
"chars": 112,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"shadow_default\">#364550</color>\n</resources>"
},
{
"path": "modules/app/src/main/res/values-v21/dimens.xml",
"chars": 166,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <dimen name=\"margin_fab_button\">16dp</dimen>\n\n <dimen name=\"ma"
},
{
"path": "modules/app/src/main/res/values-v21/styles_actions.xml",
"chars": 233,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <style name=\"BaseActionsToolbarDialog\" parent=\"BaseActionsToolba"
},
{
"path": "modules/app/src/main/res/values-v21/styles_collections.xml",
"chars": 711,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <style name=\"CollectionsFabMenuContent\" parent=\"CollectionsFabMe"
},
{
"path": "modules/app/src/main/res/values-v21/styles_fast_scroller.xml",
"chars": 220,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <style name=\"FastScrollerSignal\" parent=\"FastScrollerSignalParent"
},
{
"path": "modules/app/src/main/res/values-v21/styles_profile.xml",
"chars": 207,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <style name=\"ProfileAppBar\" parent=\"ProfileAppBarBase\">\n <"
},
{
"path": "modules/app/src/main/res/values-v21/themes.xml",
"chars": 754,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <style name=\"AppThemeWallpaper\" parent=\"AppThemeWallpaperBase\">\n"
},
{
"path": "modules/app/src/main/res/xml/preferences_about.xml",
"chars": 2171,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n "
},
{
"path": "modules/app/src/main/res/xml/preferences_analytics.xml",
"chars": 499,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n "
},
{
"path": "modules/app/src/main/res/xml/preferences_animations.xml",
"chars": 1477,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n "
},
{
"path": "modules/app/src/main/res/xml/preferences_app_drawer.xml",
"chars": 1360,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n "
},
{
"path": "modules/app/src/main/res/xml/preferences_apps_list.xml",
"chars": 271,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n "
},
{
"path": "modules/app/src/main/res/xml/preferences_dev.xml",
"chars": 3606,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n "
},
{
"path": "modules/app/src/main/res/xml/preferences_devs_headers.xml",
"chars": 2720,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n "
},
{
"path": "modules/app/src/main/res/xml/preferences_headers.xml",
"chars": 2473,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n "
},
{
"path": "modules/app/src/main/res/xml/preferences_lookfeel.xml",
"chars": 1762,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n "
},
{
"path": "modules/app/src/main/res/xml/preferences_moments.xml",
"chars": 689,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n "
},
{
"path": "modules/app/src/main/scala/cards/nine/app/NineCardsApplication.scala",
"chars": 756,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/app/src/main/scala/cards/nine/app/commons/BroadcastDispatcher.scala",
"chars": 1937,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/app/src/main/scala/cards/nine/app/commons/ContextSupportPreferences.scala",
"chars": 2752,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
},
{
"path": "modules/app/src/main/scala/cards/nine/app/commons/ContextSupportProvider.scala",
"chars": 2813,
"preview": "/*\n * Copyright 2017 47 Degrees, LLC. <http://www.47deg.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \""
}
]
// ... and 750 more files (download for full content)
About this extraction
This page contains the full source code of the 47deg/nine-cards-v2 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 950 files (4.0 MB), approximately 1.1M tokens, and a symbol index with 1284 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.