From 8f6ca0eec07c077269d97edaf9c89f2eaf3fc115 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Fri, 17 Oct 2014 00:17:34 +0400 Subject: rename main module --- org.fox.ttrss/src/main/AndroidManifest.xml | 256 +++ ...sloaderWorkaroundFragmentStatePagerAdapter.java | 39 + .../src/main/java/org/fox/ttrss/ApiRequest.java | 351 ++++ .../main/java/org/fox/ttrss/ArticleFragment.java | 449 +++++ .../src/main/java/org/fox/ttrss/ArticlePager.java | 347 ++++ .../main/java/org/fox/ttrss/CommonActivity.java | 250 +++ .../src/main/java/org/fox/ttrss/DashClock.java | 107 ++ .../src/main/java/org/fox/ttrss/DummyFragment.java | 17 + .../java/org/fox/ttrss/FeedCategoriesFragment.java | 547 ++++++ .../src/main/java/org/fox/ttrss/FeedsActivity.java | 509 ++++++ .../src/main/java/org/fox/ttrss/FeedsFragment.java | 808 +++++++++ .../src/main/java/org/fox/ttrss/GlobalState.java | 63 + .../main/java/org/fox/ttrss/HeadlinesActivity.java | 281 ++++ .../java/org/fox/ttrss/HeadlinesEventListener.java | 11 + .../main/java/org/fox/ttrss/HeadlinesFragment.java | 1179 +++++++++++++ .../main/java/org/fox/ttrss/LoadingFragment.java | 18 + .../main/java/org/fox/ttrss/OnlineActivity.java | 1765 ++++++++++++++++++++ .../java/org/fox/ttrss/PreferencesActivity.java | 25 + .../org/fox/ttrss/offline/OfflineActivity.java | 881 ++++++++++ .../fox/ttrss/offline/OfflineArticleFragment.java | 439 +++++ .../org/fox/ttrss/offline/OfflineArticlePager.java | 298 ++++ .../fox/ttrss/offline/OfflineDownloadService.java | 500 ++++++ .../offline/OfflineFeedCategoriesFragment.java | 337 ++++ .../fox/ttrss/offline/OfflineFeedsActivity.java | 349 ++++ .../fox/ttrss/offline/OfflineFeedsFragment.java | 372 +++++ .../ttrss/offline/OfflineHeadlinesActivity.java | 167 ++ .../offline/OfflineHeadlinesEventListener.java | 7 + .../ttrss/offline/OfflineHeadlinesFragment.java | 774 +++++++++ .../fox/ttrss/offline/OfflineUploadService.java | 286 ++++ .../java/org/fox/ttrss/share/CommonActivity.java | 57 + .../org/fox/ttrss/share/CommonShareActivity.java | 136 ++ .../java/org/fox/ttrss/share/ShareActivity.java | 146 ++ .../org/fox/ttrss/share/SubscribeActivity.java | 321 ++++ .../java/org/fox/ttrss/tasker/TaskerReceiver.java | 93 ++ .../fox/ttrss/tasker/TaskerSettingsActivity.java | 96 ++ .../src/main/java/org/fox/ttrss/types/Article.java | 115 ++ .../main/java/org/fox/ttrss/types/ArticleList.java | 59 + .../main/java/org/fox/ttrss/types/Attachment.java | 75 + .../src/main/java/org/fox/ttrss/types/Feed.java | 90 + .../java/org/fox/ttrss/types/FeedCategory.java | 58 + .../java/org/fox/ttrss/types/FeedCategoryList.java | 43 + .../main/java/org/fox/ttrss/types/FeedList.java | 43 + .../src/main/java/org/fox/ttrss/types/Label.java | 13 + .../src/main/java/org/fox/ttrss/util/AppRater.java | 105 ++ .../java/org/fox/ttrss/util/DatabaseHelper.java | 89 + .../org/fox/ttrss/util/EnlargingImageView.java | 252 +++ .../fox/ttrss/util/FontSizeDialogPreference.java | 224 +++ .../java/org/fox/ttrss/util/HeadlinesRequest.java | 101 ++ .../java/org/fox/ttrss/util/ImageCacheService.java | 212 +++ .../java/org/fox/ttrss/util/LessBrokenWebView.java | 37 + .../org/fox/ttrss/util/NoChildFocusScrollView.java | 34 + .../java/org/fox/ttrss/util/PrefsBackupAgent.java | 19 + .../org/fox/ttrss/util/SimpleLoginManager.java | 105 ++ .../main/java/org/fox/ttrss/util/TitleWebView.java | 91 + .../java/org/fox/ttrss/util/TypefaceCache.java | 29 + .../org/fox/ttrss/widget/SmallWidgetProvider.java | 65 + .../org/fox/ttrss/widget/WidgetUpdateService.java | 141 ++ org.fox.ttrss/src/main/res/anim/feed_item.xml | 9 + org.fox.ttrss/src/main/res/anim/headline_item.xml | 14 + org.fox.ttrss/src/main/res/anim/layout_feeds.xml | 5 + .../src/main/res/anim/layout_headline.xml | 5 + org.fox.ttrss/src/main/res/anim/right_slide_in.xml | 9 + .../src/main/res/anim/right_slide_out.xml | 9 + .../src/main/res/drawable-hdpi/dashclock.png | Bin 0 -> 3054 bytes .../src/main/res/drawable-hdpi/ic_accept_light.png | Bin 0 -> 1335 bytes .../main/res/drawable-hdpi/ic_action_overflow.png | Bin 0 -> 2863 bytes .../src/main/res/drawable-hdpi/ic_cloud_light.png | Bin 0 -> 1405 bytes .../main/res/drawable-hdpi/ic_important_light.png | Bin 0 -> 1725 bytes .../src/main/res/drawable-hdpi/ic_labels_light.png | Bin 0 -> 1734 bytes .../src/main/res/drawable-hdpi/ic_list_light.png | Bin 0 -> 1386 bytes .../res/drawable-hdpi/ic_menu_attaches_light.png | Bin 0 -> 1461 bytes .../res/drawable-hdpi/ic_menu_published_light.png | Bin 0 -> 977 bytes .../drawable-hdpi/ic_menu_unpublished_light.png | Bin 0 -> 1169 bytes .../src/main/res/drawable-hdpi/ic_new_light.png | Bin 0 -> 1142 bytes .../src/main/res/drawable-hdpi/ic_published.png | Bin 0 -> 1248 bytes .../src/main/res/drawable-hdpi/ic_read_light.png | Bin 0 -> 1636 bytes .../main/res/drawable-hdpi/ic_refresh_light.png | Bin 0 -> 3138 bytes .../res/drawable-hdpi/ic_rotate_left_light.png | Bin 0 -> 1968 bytes .../src/main/res/drawable-hdpi/ic_search_light.png | Bin 0 -> 1764 bytes .../main/res/drawable-hdpi/ic_select_all_light.png | Bin 0 -> 1455 bytes .../src/main/res/drawable-hdpi/ic_share_light.png | Bin 0 -> 1606 bytes .../src/main/res/drawable-hdpi/ic_star_empty.png | Bin 0 -> 1103 bytes .../src/main/res/drawable-hdpi/ic_star_full.png | Bin 0 -> 744 bytes .../src/main/res/drawable-hdpi/ic_undo_light.png | Bin 0 -> 1642 bytes .../res/drawable-hdpi/ic_unimportant_light.png | Bin 0 -> 1768 bytes .../src/main/res/drawable-hdpi/ic_unpublished.png | Bin 0 -> 1069 bytes .../src/main/res/drawable-hdpi/ic_unread_light.png | Bin 0 -> 1599 bytes org.fox.ttrss/src/main/res/drawable-hdpi/icon.png | Bin 0 -> 5468 bytes .../drawable-hdpi/ics_divider_vertical_bitmap.png | Bin 0 -> 936 bytes .../main/res/drawable-hdpi/paper_sepia_bitmap.png | Bin 0 -> 35569 bytes .../src/main/res/drawable-hdpi/shadow_bitmap.png | Bin 0 -> 299 bytes .../src/main/res/drawable-xhdpi/dashclock.png | Bin 0 -> 3482 bytes .../main/res/drawable-xhdpi/ic_accept_light.png | Bin 0 -> 1599 bytes .../src/main/res/drawable-xhdpi/ic_cloud_light.png | Bin 0 -> 1593 bytes .../main/res/drawable-xhdpi/ic_important_light.png | Bin 0 -> 2045 bytes .../main/res/drawable-xhdpi/ic_labels_light.png | Bin 0 -> 2169 bytes .../src/main/res/drawable-xhdpi/ic_list_light.png | Bin 0 -> 1446 bytes .../res/drawable-xhdpi/ic_menu_attaches_light.png | Bin 0 -> 1873 bytes .../res/drawable-xhdpi/ic_menu_published_light.png | Bin 0 -> 1266 bytes .../drawable-xhdpi/ic_menu_unpublished_light.png | Bin 0 -> 1546 bytes .../src/main/res/drawable-xhdpi/ic_new_light.png | Bin 0 -> 1221 bytes .../src/main/res/drawable-xhdpi/ic_read_light.png | Bin 0 -> 1923 bytes .../main/res/drawable-xhdpi/ic_refresh_light.png | Bin 0 -> 3219 bytes .../res/drawable-xhdpi/ic_rotate_left_light.png | Bin 0 -> 2406 bytes .../main/res/drawable-xhdpi/ic_search_light.png | Bin 0 -> 2127 bytes .../res/drawable-xhdpi/ic_select_all_light.png | Bin 0 -> 1583 bytes .../src/main/res/drawable-xhdpi/ic_share_light.png | Bin 0 -> 1780 bytes .../src/main/res/drawable-xhdpi/ic_undo_light.png | Bin 0 -> 1914 bytes .../res/drawable-xhdpi/ic_unimportant_light.png | Bin 0 -> 2279 bytes .../main/res/drawable-xhdpi/ic_unread_light.png | Bin 0 -> 1809 bytes org.fox.ttrss/src/main/res/drawable-xhdpi/icon.png | Bin 0 -> 7729 bytes .../src/main/res/drawable-xxhdpi/icon.png | Bin 0 -> 12760 bytes .../src/main/res/drawable/counter_background.xml | 12 + .../main/res/drawable/counter_background_dark.xml | 12 + .../drawable/counter_background_selected_light.xml | 12 + .../main/res/drawable/counter_background_sepia.xml | 12 + .../src/main/res/drawable/flavor_image_border.xml | 11 + .../src/main/res/drawable/headline_row.xml | 19 + .../main/res/drawable/headline_row_selected.xml | 19 + .../res/drawable/headline_row_selected_sepia.xml | 19 + .../src/main/res/drawable/headline_row_sepia.xml | 19 + .../src/main/res/drawable/headline_row_unread.xml | 19 + .../res/drawable/headline_row_unread_sepia.xml | 19 + .../src/main/res/drawable/ics_divider_vertical.xml | 5 + .../res/drawable/ics_divider_vertical_gray.xml | 5 + .../src/main/res/drawable/paper_sepia.xml | 4 + .../src/main/res/drawable/s_dashclock.svg | 1071 ++++++++++++ .../src/main/res/drawable/s_headline_published.svg | 905 ++++++++++ .../main/res/drawable/s_headline_unpublished.svg | 193 +++ org.fox.ttrss/src/main/res/drawable/s_icon.svg | 789 +++++++++ org.fox.ttrss/src/main/res/drawable/s_marked.svg | 77 + .../src/main/res/drawable/s_marked_bw.svg | 93 ++ .../src/main/res/drawable/s_marked_bw_full.svg | 93 ++ .../main/res/drawable/s_menu_attaches_light.svg | 143 ++ .../src/main/res/drawable/s_menu_marked.svg | 93 ++ .../main/res/drawable/s_menu_published_light.svg | 189 +++ .../main/res/drawable/s_menu_unpublished_light.svg | 113 ++ .../src/main/res/drawable/s_prev_article.svg | 70 + org.fox.ttrss/src/main/res/drawable/shadow.xml | 5 + .../src/main/res/drawable/shadow_feeds.xml | 7 + .../src/main/res/drawable/shadow_feeds_gray.xml | 7 + .../src/main/res/drawable/shadow_feeds_sepia.xml | 7 + .../src/main/res/drawable/shadow_headlines.xml | 7 + .../main/res/drawable/shadow_headlines_gray.xml | 7 + .../main/res/drawable/shadow_headlines_sepia.xml | 7 + .../src/main/res/layout-sw600dp-land/headlines.xml | 55 + .../res/layout-sw600dp-land/headlines_articles.xml | 57 + .../src/main/res/layout-sw600dp-port/headlines.xml | 35 + .../res/layout-sw600dp-port/headlines_articles.xml | 56 + .../src/main/res/layout-sw700dp/headlines.xml | 55 + .../main/res/layout-sw700dp/headlines_articles.xml | 57 + .../src/main/res/layout/article_fragment.xml | 103 ++ .../main/res/layout/article_fragment_compat.xml | 79 + .../src/main/res/layout/article_pager.xml | 22 + .../src/main/res/layout/cats_fragment.xml | 44 + .../src/main/res/layout/dummy_fragment.xml | 7 + org.fox.ttrss/src/main/res/layout/feeds.xml | 29 + .../src/main/res/layout/feeds_fragment.xml | 44 + org.fox.ttrss/src/main/res/layout/feeds_row.xml | 64 + .../src/main/res/layout/feeds_row_selected.xml | 65 + org.fox.ttrss/src/main/res/layout/headlines.xml | 29 + .../src/main/res/layout/headlines_articles.xml | 50 + .../src/main/res/layout/headlines_fragment.xml | 47 + .../src/main/res/layout/headlines_row.xml | 162 ++ .../src/main/res/layout/headlines_row_loadmore.xml | 26 + .../src/main/res/layout/headlines_row_selected.xml | 160 ++ .../res/layout/headlines_row_selected_unread.xml | 161 ++ .../src/main/res/layout/headlines_row_unread.xml | 160 ++ .../src/main/res/layout/loading_fragment.xml | 14 + org.fox.ttrss/src/main/res/layout/login.xml | 15 + .../main/res/layout/select_font_size_dialog.xml | 22 + org.fox.ttrss/src/main/res/layout/share.xml | 55 + org.fox.ttrss/src/main/res/layout/subscribe.xml | 51 + .../src/main/res/layout/tasker_settings.xml | 36 + org.fox.ttrss/src/main/res/layout/widget_small.xml | 42 + .../res/menu/article_content_img_context_menu.xml | 27 + .../main/res/menu/article_link_context_menu.xml | 13 + org.fox.ttrss/src/main/res/menu/category_menu.xml | 22 + org.fox.ttrss/src/main/res/menu/feed_menu.xml | 27 + .../src/main/res/menu/headlines_action_menu.xml | 21 + .../src/main/res/menu/headlines_context_menu.xml | 42 + org.fox.ttrss/src/main/res/menu/main_menu.xml | 166 ++ org.fox.ttrss/src/main/res/menu/offline_menu.xml | 96 ++ org.fox.ttrss/src/main/res/menu/share_menu.xml | 9 + org.fox.ttrss/src/main/res/values-cs/strings.xml | 201 +++ org.fox.ttrss/src/main/res/values-de/strings.xml | 220 +++ org.fox.ttrss/src/main/res/values-es/strings.xml | 204 +++ org.fox.ttrss/src/main/res/values-fr/strings.xml | 221 +++ org.fox.ttrss/src/main/res/values-it/strings.xml | 201 +++ org.fox.ttrss/src/main/res/values-ja/strings.xml | 220 +++ org.fox.ttrss/src/main/res/values-pl/strings.xml | 219 +++ .../src/main/res/values-pt-rBR/strings.xml | 203 +++ org.fox.ttrss/src/main/res/values-v11/style.xml | 6 + org.fox.ttrss/src/main/res/values-v19/style.xml | 23 + org.fox.ttrss/src/main/res/values/arrays.xml | 30 + org.fox.ttrss/src/main/res/values/attrs.xml | 31 + org.fox.ttrss/src/main/res/values/resources.xml | 14 + org.fox.ttrss/src/main/res/values/strings.xml | 226 +++ org.fox.ttrss/src/main/res/values/style.xml | 137 ++ org.fox.ttrss/src/main/res/xml/preferences.xml | 196 +++ org.fox.ttrss/src/main/res/xml/widget_small.xml | 8 + 201 files changed, 22980 insertions(+) create mode 100644 org.fox.ttrss/src/main/AndroidManifest.xml create mode 100644 org.fox.ttrss/src/main/java/android/support/v4/app/ClassloaderWorkaroundFragmentStatePagerAdapter.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/CommonActivity.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/DashClock.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/DummyFragment.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/FeedCategoriesFragment.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsActivity.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/FeedsFragment.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/GlobalState.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesActivity.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesEventListener.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/LoadingFragment.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/PreferencesActivity.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineActivity.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticleFragment.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineArticlePager.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineDownloadService.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedCategoriesFragment.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedsActivity.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineFeedsFragment.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineHeadlinesActivity.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineHeadlinesEventListener.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineHeadlinesFragment.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/offline/OfflineUploadService.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/share/CommonActivity.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/share/CommonShareActivity.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/share/ShareActivity.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/share/SubscribeActivity.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/tasker/TaskerReceiver.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/tasker/TaskerSettingsActivity.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/types/Attachment.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/types/Feed.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/types/FeedCategory.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/types/FeedCategoryList.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/types/FeedList.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/types/Label.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/util/AppRater.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/util/DatabaseHelper.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/util/EnlargingImageView.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/util/FontSizeDialogPreference.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/util/ImageCacheService.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/util/LessBrokenWebView.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/util/NoChildFocusScrollView.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/util/PrefsBackupAgent.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/util/SimpleLoginManager.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/util/TitleWebView.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/util/TypefaceCache.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/widget/SmallWidgetProvider.java create mode 100644 org.fox.ttrss/src/main/java/org/fox/ttrss/widget/WidgetUpdateService.java create mode 100644 org.fox.ttrss/src/main/res/anim/feed_item.xml create mode 100644 org.fox.ttrss/src/main/res/anim/headline_item.xml create mode 100644 org.fox.ttrss/src/main/res/anim/layout_feeds.xml create mode 100644 org.fox.ttrss/src/main/res/anim/layout_headline.xml create mode 100644 org.fox.ttrss/src/main/res/anim/right_slide_in.xml create mode 100644 org.fox.ttrss/src/main/res/anim/right_slide_out.xml create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/dashclock.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_accept_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_action_overflow.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_cloud_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_important_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_labels_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_list_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_menu_attaches_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_menu_published_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_menu_unpublished_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_new_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_published.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_read_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_refresh_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_rotate_left_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_search_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_select_all_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_share_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_star_empty.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_star_full.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_undo_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_unimportant_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_unpublished.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ic_unread_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/icon.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/ics_divider_vertical_bitmap.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/paper_sepia_bitmap.png create mode 100644 org.fox.ttrss/src/main/res/drawable-hdpi/shadow_bitmap.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/dashclock.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_accept_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_cloud_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_important_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_labels_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_list_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_menu_attaches_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_menu_published_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_menu_unpublished_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_new_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_read_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_refresh_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_rotate_left_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_search_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_select_all_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_share_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_undo_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_unimportant_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/ic_unread_light.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xhdpi/icon.png create mode 100644 org.fox.ttrss/src/main/res/drawable-xxhdpi/icon.png create mode 100644 org.fox.ttrss/src/main/res/drawable/counter_background.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/counter_background_dark.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/counter_background_selected_light.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/counter_background_sepia.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/flavor_image_border.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/headline_row.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/headline_row_selected.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/headline_row_selected_sepia.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/headline_row_sepia.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/headline_row_unread.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/headline_row_unread_sepia.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/ics_divider_vertical.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/ics_divider_vertical_gray.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/paper_sepia.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/s_dashclock.svg create mode 100644 org.fox.ttrss/src/main/res/drawable/s_headline_published.svg create mode 100644 org.fox.ttrss/src/main/res/drawable/s_headline_unpublished.svg create mode 100644 org.fox.ttrss/src/main/res/drawable/s_icon.svg create mode 100644 org.fox.ttrss/src/main/res/drawable/s_marked.svg create mode 100644 org.fox.ttrss/src/main/res/drawable/s_marked_bw.svg create mode 100644 org.fox.ttrss/src/main/res/drawable/s_marked_bw_full.svg create mode 100644 org.fox.ttrss/src/main/res/drawable/s_menu_attaches_light.svg create mode 100644 org.fox.ttrss/src/main/res/drawable/s_menu_marked.svg create mode 100644 org.fox.ttrss/src/main/res/drawable/s_menu_published_light.svg create mode 100644 org.fox.ttrss/src/main/res/drawable/s_menu_unpublished_light.svg create mode 100644 org.fox.ttrss/src/main/res/drawable/s_prev_article.svg create mode 100644 org.fox.ttrss/src/main/res/drawable/shadow.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/shadow_feeds.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/shadow_feeds_gray.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/shadow_feeds_sepia.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/shadow_headlines.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/shadow_headlines_gray.xml create mode 100644 org.fox.ttrss/src/main/res/drawable/shadow_headlines_sepia.xml create mode 100644 org.fox.ttrss/src/main/res/layout-sw600dp-land/headlines.xml create mode 100644 org.fox.ttrss/src/main/res/layout-sw600dp-land/headlines_articles.xml create mode 100644 org.fox.ttrss/src/main/res/layout-sw600dp-port/headlines.xml create mode 100644 org.fox.ttrss/src/main/res/layout-sw600dp-port/headlines_articles.xml create mode 100644 org.fox.ttrss/src/main/res/layout-sw700dp/headlines.xml create mode 100644 org.fox.ttrss/src/main/res/layout-sw700dp/headlines_articles.xml create mode 100644 org.fox.ttrss/src/main/res/layout/article_fragment.xml create mode 100644 org.fox.ttrss/src/main/res/layout/article_fragment_compat.xml create mode 100644 org.fox.ttrss/src/main/res/layout/article_pager.xml create mode 100644 org.fox.ttrss/src/main/res/layout/cats_fragment.xml create mode 100644 org.fox.ttrss/src/main/res/layout/dummy_fragment.xml create mode 100644 org.fox.ttrss/src/main/res/layout/feeds.xml create mode 100644 org.fox.ttrss/src/main/res/layout/feeds_fragment.xml create mode 100644 org.fox.ttrss/src/main/res/layout/feeds_row.xml create mode 100644 org.fox.ttrss/src/main/res/layout/feeds_row_selected.xml create mode 100644 org.fox.ttrss/src/main/res/layout/headlines.xml create mode 100644 org.fox.ttrss/src/main/res/layout/headlines_articles.xml create mode 100644 org.fox.ttrss/src/main/res/layout/headlines_fragment.xml create mode 100644 org.fox.ttrss/src/main/res/layout/headlines_row.xml create mode 100644 org.fox.ttrss/src/main/res/layout/headlines_row_loadmore.xml create mode 100644 org.fox.ttrss/src/main/res/layout/headlines_row_selected.xml create mode 100644 org.fox.ttrss/src/main/res/layout/headlines_row_selected_unread.xml create mode 100644 org.fox.ttrss/src/main/res/layout/headlines_row_unread.xml create mode 100644 org.fox.ttrss/src/main/res/layout/loading_fragment.xml create mode 100644 org.fox.ttrss/src/main/res/layout/login.xml create mode 100644 org.fox.ttrss/src/main/res/layout/select_font_size_dialog.xml create mode 100644 org.fox.ttrss/src/main/res/layout/share.xml create mode 100644 org.fox.ttrss/src/main/res/layout/subscribe.xml create mode 100644 org.fox.ttrss/src/main/res/layout/tasker_settings.xml create mode 100644 org.fox.ttrss/src/main/res/layout/widget_small.xml create mode 100644 org.fox.ttrss/src/main/res/menu/article_content_img_context_menu.xml create mode 100644 org.fox.ttrss/src/main/res/menu/article_link_context_menu.xml create mode 100644 org.fox.ttrss/src/main/res/menu/category_menu.xml create mode 100644 org.fox.ttrss/src/main/res/menu/feed_menu.xml create mode 100644 org.fox.ttrss/src/main/res/menu/headlines_action_menu.xml create mode 100644 org.fox.ttrss/src/main/res/menu/headlines_context_menu.xml create mode 100644 org.fox.ttrss/src/main/res/menu/main_menu.xml create mode 100644 org.fox.ttrss/src/main/res/menu/offline_menu.xml create mode 100644 org.fox.ttrss/src/main/res/menu/share_menu.xml create mode 100644 org.fox.ttrss/src/main/res/values-cs/strings.xml create mode 100644 org.fox.ttrss/src/main/res/values-de/strings.xml create mode 100644 org.fox.ttrss/src/main/res/values-es/strings.xml create mode 100644 org.fox.ttrss/src/main/res/values-fr/strings.xml create mode 100644 org.fox.ttrss/src/main/res/values-it/strings.xml create mode 100644 org.fox.ttrss/src/main/res/values-ja/strings.xml create mode 100644 org.fox.ttrss/src/main/res/values-pl/strings.xml create mode 100644 org.fox.ttrss/src/main/res/values-pt-rBR/strings.xml create mode 100644 org.fox.ttrss/src/main/res/values-v11/style.xml create mode 100644 org.fox.ttrss/src/main/res/values-v19/style.xml create mode 100644 org.fox.ttrss/src/main/res/values/arrays.xml create mode 100644 org.fox.ttrss/src/main/res/values/attrs.xml create mode 100644 org.fox.ttrss/src/main/res/values/resources.xml create mode 100644 org.fox.ttrss/src/main/res/values/strings.xml create mode 100644 org.fox.ttrss/src/main/res/values/style.xml create mode 100644 org.fox.ttrss/src/main/res/xml/preferences.xml create mode 100644 org.fox.ttrss/src/main/res/xml/widget_small.xml (limited to 'org.fox.ttrss/src') diff --git a/org.fox.ttrss/src/main/AndroidManifest.xml b/org.fox.ttrss/src/main/AndroidManifest.xml new file mode 100644 index 00000000..684cc438 --- /dev/null +++ b/org.fox.ttrss/src/main/AndroidManifest.xml @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.fox.ttrss/src/main/java/android/support/v4/app/ClassloaderWorkaroundFragmentStatePagerAdapter.java b/org.fox.ttrss/src/main/java/android/support/v4/app/ClassloaderWorkaroundFragmentStatePagerAdapter.java new file mode 100644 index 00000000..dd67d599 --- /dev/null +++ b/org.fox.ttrss/src/main/java/android/support/v4/app/ClassloaderWorkaroundFragmentStatePagerAdapter.java @@ -0,0 +1,39 @@ +package android.support.v4.app; + +// http://code.google.com/p/android/issues/detail?id=37484 +// Thanks for your amazing code quality, Google. + +import android.os.Bundle; +import android.view.ViewGroup; + +public class ClassloaderWorkaroundFragmentStatePagerAdapter extends + FragmentStatePagerAdapter { + + public ClassloaderWorkaroundFragmentStatePagerAdapter(FragmentManager fm) { + super(fm); + // TODO Auto-generated constructor stub + } + + @Override + public Fragment getItem(int arg0) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object instantiateItem(ViewGroup container, int position) { + Fragment f = (Fragment) super.instantiateItem(container, position); + Bundle savedFragmentState = f.mSavedFragmentState; + if (savedFragmentState != null) { + savedFragmentState.setClassLoader(f.getClass().getClassLoader()); + } + return f; + } + + @Override + public int getCount() { + // TODO Auto-generated method stub + return 0; + } + +} diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java new file mode 100644 index 00000000..65e97e8e --- /dev/null +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java @@ -0,0 +1,351 @@ +package org.fox.ttrss; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.HashMap; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.SharedPreferences; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.AsyncTask; +import android.os.Build; +import android.preference.PreferenceManager; +import android.util.Base64; +import android.util.Log; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +public class ApiRequest extends AsyncTask, Integer, JsonElement> { + private final String TAG = this.getClass().getSimpleName(); + + public enum ApiError { NO_ERROR, HTTP_UNAUTHORIZED, HTTP_FORBIDDEN, HTTP_NOT_FOUND, + HTTP_SERVER_ERROR, HTTP_OTHER_ERROR, SSL_REJECTED, SSL_HOSTNAME_REJECTED, PARSE_ERROR, IO_ERROR, OTHER_ERROR, API_DISABLED, + API_UNKNOWN, LOGIN_FAILED, INVALID_URL, API_INCORRECT_USAGE, NETWORK_UNAVAILABLE, API_UNKNOWN_METHOD }; + + public static final int API_STATUS_OK = 0; + public static final int API_STATUS_ERR = 1; + + private String m_api; + private boolean m_transportDebugging = false; + protected int m_responseCode = 0; + protected String m_responseMessage; + protected int m_apiStatusCode = 0; + protected boolean m_canUseProgress = false; + protected Context m_context; + private SharedPreferences m_prefs; + + protected ApiError m_lastError; + + public ApiRequest(Context context) { + m_context = context; + + m_prefs = PreferenceManager.getDefaultSharedPreferences(m_context); + + m_api = m_prefs.getString("ttrss_url", "").trim(); + m_transportDebugging = m_prefs.getBoolean("transport_debugging", false); + m_lastError = ApiError.NO_ERROR; + + } + + @SuppressLint("NewApi") + @SuppressWarnings("unchecked") + public void execute(HashMap map) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) + super.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, map); + else + super.execute(map); + } + + public int getErrorMessage() { + switch (m_lastError) { + case NO_ERROR: + return R.string.error_unknown; + case HTTP_UNAUTHORIZED: + return R.string.error_http_unauthorized; + case HTTP_FORBIDDEN: + return R.string.error_http_forbidden; + case HTTP_NOT_FOUND: + return R.string.error_http_not_found; + case HTTP_SERVER_ERROR: + return R.string.error_http_server_error; + case HTTP_OTHER_ERROR: + return R.string.error_http_other_error; + case SSL_REJECTED: + return R.string.error_ssl_rejected; + case SSL_HOSTNAME_REJECTED: + return R.string.error_ssl_hostname_rejected; + case PARSE_ERROR: + return R.string.error_parse_error; + case IO_ERROR: + return R.string.error_io_error; + case OTHER_ERROR: + return R.string.error_other_error; + case API_DISABLED: + return R.string.error_api_disabled; + case API_UNKNOWN: + return R.string.error_api_unknown; + case API_UNKNOWN_METHOD: + return R.string.error_api_unknown_method; + case LOGIN_FAILED: + return R.string.error_login_failed; + case INVALID_URL: + return R.string.error_invalid_api_url; + case API_INCORRECT_USAGE: + return R.string.error_api_incorrect_usage; + case NETWORK_UNAVAILABLE: + return R.string.error_network_unavailable; + default: + Log.d(TAG, "getErrorMessage: unknown error code=" + m_lastError); + return R.string.error_unknown; + } + } + + @Override + protected JsonElement doInBackground(HashMap... params) { + + if (!isNetworkAvailable()) { + m_lastError = ApiError.NETWORK_UNAVAILABLE; + return null; + } + + Gson gson = new Gson(); + + String requestStr = gson.toJson(new HashMap(params[0])); + byte[] postData = null; + + try { + postData = requestStr.getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + m_lastError = ApiError.OTHER_ERROR; + e.printStackTrace(); + return null; + } + + /* disableConnectionReuseIfNecessary(); */ + + if (m_transportDebugging) Log.d(TAG, ">>> (" + requestStr + ") " + m_api); + + /* ApiRequest.trustAllHosts(m_prefs.getBoolean("ssl_trust_any", false), + m_prefs.getBoolean("ssl_trust_any_host", false)); */ + + URL url; + + try { + url = new URL(m_api + "/api/"); + } catch (Exception e) { + m_lastError = ApiError.INVALID_URL; + e.printStackTrace(); + return null; + } + + try { + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + + String httpLogin = m_prefs.getString("http_login", "").trim(); + String httpPassword = m_prefs.getString("http_password", "").trim(); + + if (httpLogin.length() > 0) { + if (m_transportDebugging) Log.d(TAG, "Using HTTP Basic authentication."); + + conn.setRequestProperty("Authorization", "Basic " + + Base64.encodeToString((httpLogin + ":" + httpPassword).getBytes("UTF-8"), Base64.NO_WRAP)); + } + + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Length", Integer.toString(postData.length)); + + OutputStream out = conn.getOutputStream(); + out.write(postData); + out.close(); + + m_responseCode = conn.getResponseCode(); + m_responseMessage = conn.getResponseMessage(); + + switch (m_responseCode) { + case HttpURLConnection.HTTP_OK: + StringBuffer response = new StringBuffer(); + InputStreamReader in = new InputStreamReader(conn.getInputStream(), "UTF-8"); + char[] buf = new char[256]; + int read = 0; + int total = 0; + + int contentLength = conn.getHeaderFieldInt("Api-Content-Length", -1); + + m_canUseProgress = (contentLength != -1); + + while ((read = in.read(buf)) >= 0) { + response.append(buf, 0, read); + total += read; + publishProgress(Integer.valueOf(total), Integer.valueOf(contentLength)); + } + + if (m_transportDebugging) Log.d(TAG, "<<< " + response); + + JsonParser parser = new JsonParser(); + + JsonElement result = parser.parse(response.toString()); + JsonObject resultObj = result.getAsJsonObject(); + + m_apiStatusCode = resultObj.get("status").getAsInt(); + + conn.disconnect(); + + switch (m_apiStatusCode) { + case API_STATUS_OK: + return result.getAsJsonObject().get("content"); + case API_STATUS_ERR: + JsonObject contentObj = resultObj.get("content").getAsJsonObject(); + String error = contentObj.get("error").getAsString(); + + if (error.equals("LOGIN_ERROR")) { + m_lastError = ApiError.LOGIN_FAILED; + } else if (error.equals("API_DISABLED")) { + m_lastError = ApiError.API_DISABLED; + } else if (error.equals("NOT_LOGGED_IN")) { + m_lastError = ApiError.LOGIN_FAILED; + } else if (error.equals("INCORRECT_USAGE")) { + m_lastError = ApiError.API_INCORRECT_USAGE; + } else if (error.equals("UNKNOWN_METHOD")) { + m_lastError = ApiError.API_UNKNOWN_METHOD; + } else { + Log.d(TAG, "Unknown API error: " + error); + m_lastError = ApiError.API_UNKNOWN; + } + } + + return null; + case HttpURLConnection.HTTP_UNAUTHORIZED: + m_lastError = ApiError.HTTP_UNAUTHORIZED; + break; + case HttpURLConnection.HTTP_FORBIDDEN: + m_lastError = ApiError.HTTP_FORBIDDEN; + break; + case HttpURLConnection.HTTP_NOT_FOUND: + m_lastError = ApiError.HTTP_NOT_FOUND; + break; + case HttpURLConnection.HTTP_INTERNAL_ERROR: + m_lastError = ApiError.HTTP_SERVER_ERROR; + break; + default: + Log.d(TAG, "HTTP response code: " + m_responseCode + "(" + m_responseMessage + ")"); + m_lastError = ApiError.HTTP_OTHER_ERROR; + break; + } + + conn.disconnect(); + return null; + } catch (javax.net.ssl.SSLPeerUnverifiedException e) { + m_lastError = ApiError.SSL_REJECTED; + e.printStackTrace(); + } catch (IOException e) { + m_lastError = ApiError.IO_ERROR; + + if (e.getMessage() != null) { + if (e.getMessage().matches("Hostname [^ ]+ was not verified")) { + m_lastError = ApiError.SSL_HOSTNAME_REJECTED; + } + } + + e.printStackTrace(); + } catch (com.google.gson.JsonSyntaxException e) { + m_lastError = ApiError.PARSE_ERROR; + e.printStackTrace(); + } catch (Exception e) { + m_lastError = ApiError.OTHER_ERROR; + e.printStackTrace(); + } + + return null; + } + + protected static void trustAllHosts(boolean trustAnyCert, boolean trustAnyHost) { + try { + if (trustAnyCert) { + X509TrustManager easyTrustManager = new X509TrustManager() { + + public void checkClientTrusted( + X509Certificate[] chain, + String authType) throws CertificateException { + // Oh, I am easy! + } + + public void checkServerTrusted( + X509Certificate[] chain, + String authType) throws CertificateException { + // Oh, I am easy! + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + }; + + // Create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[] {easyTrustManager}; + + // Install the all-trusting trust manager + + SSLContext sc = SSLContext.getInstance("TLS"); + + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + + if (trustAnyHost) { + HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + }); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + @SuppressWarnings("deprecation") + protected static void disableConnectionReuseIfNecessary() { + // HTTP connection reuse which was buggy pre-froyo + if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) { + System.setProperty("http.keepAlive", "false"); + } + } + + protected boolean isNetworkAvailable() { + ConnectivityManager cm = (ConnectivityManager) + m_context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo networkInfo = cm.getActiveNetworkInfo(); + + // if no network is available networkInfo will be null + // otherwise check if we are connected + if (networkInfo != null && networkInfo.isConnected()) { + return true; + } + return false; + } +} diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java new file mode 100644 index 00000000..4a568d3c --- /dev/null +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleFragment.java @@ -0,0 +1,449 @@ +package org.fox.ttrss; + +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.fox.ttrss.types.Article; +import org.fox.ttrss.types.Attachment; +import org.fox.ttrss.util.TypefaceCache; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.graphics.Typeface; +import android.net.Uri; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.v4.app.Fragment; +import android.text.Html; +import android.util.TypedValue; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebView.HitTestResult; +import android.widget.TextView; + +public class ArticleFragment extends Fragment { + private final String TAG = this.getClass().getSimpleName(); + + private SharedPreferences m_prefs; + private Article m_article; + private OnlineActivity m_activity; + + public void initialize(Article article) { + m_article = article; + } + + private View.OnTouchListener m_gestureListener; + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, + ContextMenuInfo menuInfo) { + + if (v.getId() == R.id.content) { + HitTestResult result = ((WebView)v).getHitTestResult(); + + if (result != null && (result.getType() == HitTestResult.IMAGE_TYPE || result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE)) { + menu.setHeaderTitle(result.getExtra()); + getActivity().getMenuInflater().inflate(R.menu.article_content_img_context_menu, menu); + + /* FIXME I have no idea how to do this correctly ;( */ + + m_activity.setLastContentImageHitTestUrl(result.getExtra()); + + } else { + menu.setHeaderTitle(m_article.title); + getActivity().getMenuInflater().inflate(R.menu.article_link_context_menu, menu); + } + } else { + menu.setHeaderTitle(m_article.title); + getActivity().getMenuInflater().inflate(R.menu.article_link_context_menu, menu); + } + + super.onCreateContextMenu(menu, v, menuInfo); + + } + + @SuppressLint("NewApi") + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + m_activity.setProgressBarVisibility(true); + + if (savedInstanceState != null) { + m_article = savedInstanceState.getParcelable("article"); + } + + boolean useTitleWebView = m_prefs.getBoolean("article_compat_view", false); + + View view = inflater.inflate(useTitleWebView ? R.layout.article_fragment_compat : R.layout.article_fragment, container, false); + + if (m_article != null) { + + if (!useTitleWebView) { + View scroll = view.findViewById(R.id.article_scrollview); + + if (scroll != null) { + final float scale = getResources().getDisplayMetrics().density; + + if (m_activity.isSmallScreen()) { + scroll.setPadding((int)(8 * scale + 0.5f), + (int)(5 * scale + 0.5f), + (int)(8 * scale + 0.5f), + 0); + } else { + scroll.setPadding((int)(25 * scale + 0.5f), + (int)(10 * scale + 0.5f), + (int)(25 * scale + 0.5f), + 0); + + } + + } + } + + int articleFontSize = Integer.parseInt(m_prefs.getString("article_font_size_sp", "16")); + int articleSmallFontSize = Math.max(10, Math.min(18, articleFontSize - 2)); + + TextView title = (TextView)view.findViewById(R.id.title); + + if (title != null) { + + if (m_prefs.getBoolean("enable_condensed_fonts", false)) { + Typeface tf = TypefaceCache.get(m_activity, "sans-serif-condensed", Typeface.NORMAL); + + if (tf != null && !tf.equals(title.getTypeface())) { + title.setTypeface(tf); + } + + title.setTextSize(TypedValue.COMPLEX_UNIT_SP, Math.min(21, articleFontSize + 5)); + } else { + title.setTextSize(TypedValue.COMPLEX_UNIT_SP, Math.min(21, articleFontSize + 3)); + } + + String titleStr; + + if (m_article.title.length() > 200) + titleStr = m_article.title.substring(0, 200) + "..."; + else + titleStr = m_article.title; + + title.setText(Html.fromHtml(titleStr)); + //title.setPaintFlags(title.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); + title.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + try { + URL url = new URL(m_article.link.trim()); + String uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), + url.getPort(), url.getPath(), url.getQuery(), url.getRef()).toString(); + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); + startActivity(intent); + } catch (Exception e) { + e.printStackTrace(); + m_activity.toast(R.string.error_other_error); + } + } + }); + + registerForContextMenu(title); + } + + TextView comments = (TextView)view.findViewById(R.id.comments); + + if (comments != null) { + if (m_activity.getApiLevel() >= 4 && m_article.comments_count > 0) { + comments.setTextSize(TypedValue.COMPLEX_UNIT_SP, articleSmallFontSize); + + String commentsTitle = getString(R.string.article_comments, m_article.comments_count); + comments.setText(commentsTitle); + //comments.setPaintFlags(title.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); + comments.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + try { + URL url = new URL((m_article.comments_link != null && m_article.comments_link.length() > 0) ? + m_article.comments_link : m_article.link); + String uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), + url.getPort(), url.getPath(), url.getQuery(), url.getRef()).toString(); + Intent intent = new Intent(Intent.ACTION_VIEW, + Uri.parse(uri)); + startActivity(intent); + } catch (Exception e) { + e.printStackTrace(); + m_activity.toast(R.string.error_other_error); + } + } + }); + + } else { + comments.setVisibility(View.GONE); + } + } + + TextView note = (TextView)view.findViewById(R.id.note); + + if (note != null) { + if (m_article.note != null && !"".equals(m_article.note)) { + note.setTextSize(TypedValue.COMPLEX_UNIT_SP, articleSmallFontSize); + note.setText(m_article.note); + } else { + note.setVisibility(View.GONE); + } + + } + + final WebView web = (WebView)view.findViewById(R.id.content); + + if (web != null) { + + web.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + HitTestResult result = ((WebView)v).getHitTestResult(); + + if (result != null && (result.getType() == HitTestResult.IMAGE_TYPE || result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE)) { + registerForContextMenu(web); + m_activity.openContextMenu(web); + unregisterForContextMenu(web); + return true; + } else { + if (m_activity.isCompatMode()) { + KeyEvent shiftPressEvent = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SHIFT_LEFT, 0, 0); + shiftPressEvent.dispatch(web); + } + + return false; + } + } + }); + + // prevent flicker in ics + if (!m_prefs.getBoolean("webview_hardware_accel", true) || useTitleWebView) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { + web.setLayerType(View.LAYER_TYPE_SOFTWARE, null); + } + } + + web.setWebChromeClient(new WebChromeClient() { + @Override + public void onProgressChanged(WebView view, int progress) { + m_activity.setProgress(Math.round(((float)progress / 100f) * 10000)); + if (progress == 100) { + m_activity.setProgressBarVisibility(false); + } + } + }); + + String content; + String cssOverride = ""; + + WebSettings ws = web.getSettings(); + ws.setSupportZoom(false); + + TypedValue tv = new TypedValue(); + getActivity().getTheme().resolveAttribute(R.attr.linkColor, tv, true); + + String theme = m_prefs.getString("theme", CommonActivity.THEME_DEFAULT); + + if (CommonActivity.THEME_HOLO.equals(theme)) { + cssOverride = "body { background : transparent; color : #e0e0e0}"; + } else if (CommonActivity.THEME_DARK.equals(theme)) { + cssOverride = "body { background : transparent; color : #e0e0e0}"; + } else { + cssOverride = "body { background : transparent; }"; + } + + if (useTitleWebView || android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { + web.setBackgroundColor(Color.TRANSPARENT); + } else { + // seriously? + web.setBackgroundColor(Color.argb(1, 0, 0, 0)); + } + + String hexColor = String.format("#%06X", (0xFFFFFF & tv.data)); + cssOverride += " a:link {color: "+hexColor+";} a:visited { color: "+hexColor+";}"; + + cssOverride += " table { width : 100%; }"; + + String articleContent = m_article.content != null ? m_article.content : ""; + + Document doc = Jsoup.parse(articleContent); + + if (doc != null) { + // thanks webview for crashing on