Full Code of 47deg/nine-cards-v2 for AI

master 1cbab6cd94a3 cached
950 files
4.0 MB
1.1M tokens
1284 symbols
1 requests
Download .txt
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
================================================
[![Join the conversation on Gitter](https://img.shields.io/gitter/room/47deg/nine-cards-v2.svg)](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). 


[![Google Play](https://cloud.githubusercontent.com/assets/456025/22688567/25acb99e-ed2d-11e6-87df-cda19849fa84.png)](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
================================================
[![Build Status](https://travis-ci.com/47deg/nine-cards-v2.svg?token=wpV9KDdSpewCkwVHdFCg&branch=master)](https://travis-ci.com/47deg/nine-cards-v2) [![Join the conversation on Gitter](https://img.shields.io/gitter/room/47deg/nine-cards-v2.svg)](https://gitter.im/47deg/nine-cards-v2)

# 9 Cards v2

[![Google Play](https://cloud.githubusercontent.com/assets/456025/22688567/25acb99e-ed2d-11e6-87df-cda19849fa84.png)](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">
Download .txt
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
Download .txt
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": "[![Join the conversation on Gitter](https://img.shields.io/gitter/room/47deg/nine-cards-v2.svg)](https://gitter.im/47deg"
  },
  {
    "path": "README_old.md",
    "chars": 9976,
    "preview": "[![Build Status](https://travis-ci.com/47deg/nine-cards-v2.svg?token=wpV9KDdSpewCkwVHdFCg&branch=master)](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.

Copied to clipboard!