├── .github └── FUNDING.yml ├── .gitignore ├── LICENSE ├── README.md ├── _config.yml ├── app ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── jingbin │ │ └── cloudreader │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── ic_launcher-web.png │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── jingbin │ │ │ └── cloudreader │ │ │ ├── adapter │ │ │ ├── CategoryArticleAdapter.java │ │ │ ├── CoinAdapter.java │ │ │ ├── CollectUrlAdapter.java │ │ │ ├── DouBanTopAdapter.java │ │ │ ├── EverydayAdapter.java │ │ │ ├── FilmAdapter.kt │ │ │ ├── FilmComingAdapter.kt │ │ │ ├── FilmDetailActorAdapter.kt │ │ │ ├── FilmDetailImageAdapter.java │ │ │ ├── GankAndroidAdapter.java │ │ │ ├── GankAndroidSearchAdapter.java │ │ │ ├── JokeAdapter.kt │ │ │ ├── MovieDetailAdapter.kt │ │ │ ├── NavigationAdapter.java │ │ │ ├── NavigationContentAdapter.java │ │ │ ├── OneAdapter.java │ │ │ ├── TreeAdapter.java │ │ │ ├── WanAndroidAdapter.java │ │ │ └── WxArticleAdapter.java │ │ │ ├── app │ │ │ ├── Constants.kt │ │ │ ├── ConstantsImageUrl.kt │ │ │ ├── RxCodeConstants.kt │ │ │ └── app.kt │ │ │ ├── base │ │ │ └── BaseHeaderActivity.java │ │ │ ├── bean │ │ │ ├── AndroidBean.java │ │ │ ├── BannerItemBean.kt │ │ │ ├── CoinBean.kt │ │ │ ├── CoinLogBean.kt │ │ │ ├── CollectUrlBean.java │ │ │ ├── ComingFilmBean.java │ │ │ ├── FrontpageBean.java │ │ │ ├── GankIoDataBean.java │ │ │ ├── GankIoDayBean.java │ │ │ ├── HotMovieBean.java │ │ │ ├── ImageItemsBean.java │ │ │ ├── MovieDetailBean.java │ │ │ ├── MovieDetailBean.kt │ │ │ ├── MtimeFilmeBean.java │ │ │ ├── ShareArticleBean.kt │ │ │ ├── UpdateBean.kt │ │ │ ├── moviechild │ │ │ │ ├── FilmItemBean.java │ │ │ │ ├── ImagesBean.java │ │ │ │ ├── PersonBean.java │ │ │ │ ├── RatingBean.java │ │ │ │ └── SubjectsBean.java │ │ │ └── wanandroid │ │ │ │ ├── ArticlesBean.java │ │ │ │ ├── BaseResultBean.java │ │ │ │ ├── CoinUserInfoBean.java │ │ │ │ ├── DuanZiBean.java │ │ │ │ ├── HomeListBean.java │ │ │ │ ├── LoginBean.java │ │ │ │ ├── NaviJsonBean.java │ │ │ │ ├── QsbkListBean.java │ │ │ │ ├── SearchTagBean.java │ │ │ │ ├── TreeBean.java │ │ │ │ ├── TreeItemBean.java │ │ │ │ ├── WanAndroidBannerBean.java │ │ │ │ ├── WxarticleDetailItemBean.java │ │ │ │ └── WxarticleItemBean.java │ │ │ ├── data │ │ │ ├── OnUserInfoListener.kt │ │ │ ├── UserUtil.java │ │ │ └── model │ │ │ │ ├── CollectModel.java │ │ │ │ ├── EverydayModel.java │ │ │ │ ├── GankOtherModel.java │ │ │ │ ├── JokeModel.java │ │ │ │ ├── LoginModel.java │ │ │ │ └── OneRepository.java │ │ │ ├── http │ │ │ ├── HttpClient.java │ │ │ ├── RequestImpl.java │ │ │ └── cache │ │ │ │ └── ACache.java │ │ │ ├── ui │ │ │ ├── LoadingActivity.java │ │ │ ├── MainActivity.java │ │ │ ├── WebViewActivity.java │ │ │ ├── douban │ │ │ │ ├── DoubanTopActivity.java │ │ │ │ ├── OneFragment.java │ │ │ │ └── OneMovieDetailActivity.java │ │ │ ├── film │ │ │ │ ├── FilmFragment.java │ │ │ │ └── child │ │ │ │ │ ├── FilmComingFragment.java │ │ │ │ │ ├── FilmDetailActivity.java │ │ │ │ │ └── FilmShowingFragment.java │ │ │ ├── gank │ │ │ │ ├── GankFragment.java │ │ │ │ └── child │ │ │ │ │ ├── AndroidFragment.java │ │ │ │ │ ├── CustomFragment.java │ │ │ │ │ ├── EverydayFragment.java │ │ │ │ │ ├── GankHomeFragment.java │ │ │ │ │ └── WelfareFragment.java │ │ │ ├── menu │ │ │ │ ├── NavAboutActivity.java │ │ │ │ ├── NavAdmireActivity.java │ │ │ │ ├── NavDeedBackActivity.java │ │ │ │ ├── NavDownloadActivity.java │ │ │ │ ├── NavHomePageActivity.java │ │ │ │ ├── NavNightModeActivity.kt │ │ │ │ └── SearchActivity.java │ │ │ └── wan │ │ │ │ ├── WanCenterFragment.kt │ │ │ │ ├── WanFragment.java │ │ │ │ ├── WanProjectFragment.kt │ │ │ │ └── child │ │ │ │ ├── ArticleListActivity.java │ │ │ │ ├── CategoryArticleFragment.java │ │ │ │ ├── CategoryDetailActivity.java │ │ │ │ ├── CoinDetailFragment.java │ │ │ │ ├── CoinRankFragment.java │ │ │ │ ├── CollectArticleFragment.java │ │ │ │ ├── CollectLinkFragment.java │ │ │ │ ├── HomeFragment.java │ │ │ │ ├── JokeFragment.java │ │ │ │ ├── LoginActivity.java │ │ │ │ ├── MyCoinActivity.java │ │ │ │ ├── MyCollectActivity.java │ │ │ │ ├── MyShareActivity.kt │ │ │ │ ├── NavigationFragment.java │ │ │ │ ├── PublishActivity.kt │ │ │ │ ├── SquareFragment.kt │ │ │ │ ├── TreeFragment.java │ │ │ │ ├── WanFindFragment.java │ │ │ │ └── WendaFragment.kt │ │ │ ├── utils │ │ │ ├── BaseTools.java │ │ │ ├── DataUtil.java │ │ │ ├── DebugUtil.java │ │ │ ├── DensityUtil.java │ │ │ ├── DialogBuild.java │ │ │ ├── GlideUtil.java │ │ │ ├── NightModeUtil.java │ │ │ ├── PerfectClickListener.java │ │ │ ├── PermissionHandler.java │ │ │ ├── QRCodeUtil.java │ │ │ ├── RefreshHelper.java │ │ │ ├── RxSaveImage.java │ │ │ ├── SDCardDirUtil.java │ │ │ ├── SPUtils.java │ │ │ ├── ShareUtils.java │ │ │ ├── StatusBarUtil.java │ │ │ ├── StringFormatUtil.java │ │ │ ├── TimeUtil.java │ │ │ ├── ToastUtil.java │ │ │ ├── ToolbarHelper.java │ │ │ ├── UpdateUtil.kt │ │ │ └── WebUtil.java │ │ │ ├── view │ │ │ ├── CommonTabPagerAdapter.kt │ │ │ ├── CustomChangeBounds.java │ │ │ ├── Listener.kt │ │ │ ├── MyFragmentPagerAdapter.java │ │ │ ├── MyNestedScrollView.java │ │ │ ├── MyTextWatch.kt │ │ │ ├── OnMyPageChangeListener.java │ │ │ ├── ThinBoldSpan.java │ │ │ ├── ViewPagerFixed.kt │ │ │ ├── bigimage │ │ │ │ └── BigImagePagerActivity.java │ │ │ ├── byview │ │ │ │ ├── NeteaseLoadMoreView.java │ │ │ │ └── NeteaseRefreshHeaderView.java │ │ │ ├── sliding │ │ │ │ ├── Instrument.java │ │ │ │ └── SlidingLayout.java │ │ │ ├── statue │ │ │ │ └── StatusBarUtils.java │ │ │ └── viewbigimage │ │ │ │ ├── HackyViewPager.java │ │ │ │ └── ViewBigImageActivity.java │ │ │ └── viewmodel │ │ │ ├── gank │ │ │ ├── EverydayViewModel.java │ │ │ ├── GankHomeViewModel.java │ │ │ ├── GankViewModel.java │ │ │ └── WelfareViewModel.java │ │ │ ├── menu │ │ │ └── LoginViewModel.java │ │ │ ├── movie │ │ │ ├── DoubanTopViewModel.java │ │ │ ├── FilmViewModel.java │ │ │ ├── OnMovieLoadListener.java │ │ │ └── OneViewModel.java │ │ │ └── wan │ │ │ ├── ArticleListViewModel.java │ │ │ ├── CoinListViewModel.java │ │ │ ├── CollectLinkModel.java │ │ │ ├── JokeViewModel.java │ │ │ ├── MainViewModel.java │ │ │ ├── NavigationViewModel.java │ │ │ ├── PublishViewModel.kt │ │ │ ├── SearchViewModel.java │ │ │ ├── TreeViewModel.java │ │ │ ├── WanAndroidListViewModel.java │ │ │ ├── WanCenterViewModel.kt │ │ │ ├── WanFindViewModel.java │ │ │ └── WanNavigator.java │ └── res │ │ ├── anim │ │ ├── activity_down_in.xml │ │ ├── activity_down_out.xml │ │ ├── activity_up_in.xml │ │ ├── activity_up_out.xml │ │ ├── push_fade_in.xml │ │ ├── push_fade_out.xml │ │ ├── screen_zoom_in.xml │ │ ├── screen_zoom_out.xml │ │ └── transition_anim.xml │ │ ├── color │ │ ├── select_book_text.xml │ │ ├── select_gank_day.xml │ │ ├── select_home_text.xml │ │ └── select_navi_text.xml │ │ ├── drawable-hdpi │ │ ├── actionbar_more.png │ │ ├── actionbar_search.png │ │ ├── actionbar_share.png │ │ ├── ic_cloudreader.png │ │ └── loading_everyday.png │ │ ├── drawable-mdpi │ │ └── ic_cloudreader.png │ │ ├── drawable-night-xxhdpi │ │ ├── ic_uncollect.png │ │ ├── img_transition_default.png │ │ ├── titlebar_discover_normal.png │ │ ├── titlebar_discover_prs.png │ │ ├── titlebar_discover_selected.png │ │ ├── titlebar_friends_normal.png │ │ ├── titlebar_friends_prs.png │ │ ├── titlebar_friends_selected.png │ │ ├── titlebar_menu.png │ │ ├── titlebar_music_normal.png │ │ ├── titlebar_music_prs.png │ │ └── titlebar_music_selected.png │ │ ├── drawable-v21 │ │ ├── ic_menu_camera.xml │ │ ├── ic_menu_gallery.xml │ │ ├── ic_menu_manage.xml │ │ ├── ic_menu_send.xml │ │ ├── ic_menu_share.xml │ │ ├── ic_menu_slideshow.xml │ │ ├── ripple_category_back.xml │ │ ├── ripple_item_white_bg.xml │ │ ├── ripple_joke_item_bg.xml │ │ ├── ripple_one_item_bg.xml │ │ ├── ripple_tab_bg.xml │ │ ├── shape_bg_publish.xml │ │ └── shape_ripple_tag_bg.xml │ │ ├── drawable-xhdpi │ │ ├── actionbar_cha.png │ │ ├── ic_cloudreader.png │ │ └── ic_history_delete.png │ │ ├── drawable-xxhdpi │ │ ├── action_publish.png │ │ ├── actionbar_cha.png │ │ ├── actionbar_help.png │ │ ├── actionbar_more.png │ │ ├── actionbar_search.png │ │ ├── actionbar_share.png │ │ ├── actionbar_web.png │ │ ├── home_arrow_right.png │ │ ├── home_arrow_right_gray.png │ │ ├── home_icon_day.png │ │ ├── home_icon_day_prs.png │ │ ├── home_icon_fm.png │ │ ├── home_icon_fm_prs.png │ │ ├── home_icon_music.png │ │ ├── home_icon_music_prs.png │ │ ├── home_icon_rank.png │ │ ├── home_icon_rank_prs.png │ │ ├── home_title_all.png │ │ ├── home_title_android.png │ │ ├── home_title_app.png │ │ ├── home_title_backend.png │ │ ├── home_title_flutter.png │ │ ├── home_title_ios.png │ │ ├── home_title_meizi.png │ │ ├── home_title_movie.png │ │ ├── home_title_qian.png │ │ ├── home_title_source.png │ │ ├── home_title_xia.png │ │ ├── homepage_header.png │ │ ├── ic_avatar_default.png │ │ ├── ic_catalogue.png │ │ ├── ic_catalogue_bottom.png │ │ ├── ic_checked.png │ │ ├── ic_cloudreader.png │ │ ├── ic_cloudreader_mip.png │ │ ├── ic_collected.png │ │ ├── ic_cylinder.png │ │ ├── ic_nav_about.png │ │ ├── ic_nav_admire.png │ │ ├── ic_nav_admire_right.png │ │ ├── ic_nav_bg_drawerlayout.png │ │ ├── ic_nav_coin.png │ │ ├── ic_nav_collect.png │ │ ├── ic_nav_deedback.png │ │ ├── ic_nav_exit.png │ │ ├── ic_nav_homepage.png │ │ ├── ic_nav_login.png │ │ ├── ic_nav_scan.png │ │ ├── ic_shortcut_coin.png │ │ ├── ic_shortcut_search.png │ │ ├── ic_shortcut_send.png │ │ ├── ic_uncollect.png │ │ ├── icon_clear.png │ │ ├── icon_coin_rank.png │ │ ├── icon_film_play.png │ │ ├── icon_github.png │ │ ├── icon_nav_night.png │ │ ├── icon_new.png │ │ ├── icon_paste.png │ │ ├── icon_position.png │ │ ├── icon_share_article.png │ │ ├── icon_share_wan.png │ │ ├── icon_tag_checked.png │ │ ├── icon_tag_hot.png │ │ ├── icon_tag_normal.png │ │ ├── img_default_book.png │ │ ├── img_default_meizi.png │ │ ├── img_default_movie.png │ │ ├── img_four_bi_three.png │ │ ├── img_one_bi_one.png │ │ ├── img_transition_default.png │ │ ├── img_two_bi_one.png │ │ ├── loading_everyday.png │ │ ├── loading_everyday_red.png │ │ ├── loading_image.png │ │ ├── stackblur_default.png │ │ ├── titlebar_discover_normal.png │ │ ├── titlebar_discover_prs.png │ │ ├── titlebar_discover_selected.png │ │ ├── titlebar_friends_normal.png │ │ ├── titlebar_friends_prs.png │ │ ├── titlebar_friends_selected.png │ │ ├── titlebar_menu.png │ │ ├── titlebar_music_normal.png │ │ ├── titlebar_music_prs.png │ │ └── titlebar_music_selected.png │ │ ├── drawable │ │ ├── bg_frame_deep_gray.xml │ │ ├── bg_frame_gray.xml │ │ ├── bg_save_big_image.xml │ │ ├── home_adjust_background.xml │ │ ├── home_middle_day.xml │ │ ├── home_middle_fm.xml │ │ ├── home_middle_music.xml │ │ ├── home_middle_rank.xml │ │ ├── ic_launcher_background.xml │ │ ├── layer_splash.xml │ │ ├── process_bg.xml │ │ ├── process_bg_webview.xml │ │ ├── progress_cirle.xml │ │ ├── ripple_item_white_bg.xml │ │ ├── ripple_joke_item_bg.xml │ │ ├── ripple_one_item_bg.xml │ │ ├── ripple_tab_bg.xml │ │ ├── select_gank_custom.xml │ │ ├── select_navi_bg.xml │ │ ├── select_one_header.xml │ │ ├── selector_bg_tag.xml │ │ ├── selector_bg_tag_no_check.xml │ │ ├── selector_bg_tree_tag.xml │ │ ├── selector_collect_check.xml │ │ ├── shape_banner_select.xml │ │ ├── shape_banner_unselect.xml │ │ ├── shape_bg_level.xml │ │ ├── shape_bg_loading.xml │ │ ├── shape_bg_login.xml │ │ ├── shape_bg_publish.xml │ │ ├── shape_bg_tag_normal.xml │ │ ├── shape_bg_tag_selected.xml │ │ ├── shape_detail_mask.xml │ │ ├── shape_edit_cursor.xml │ │ ├── shape_edit_line.xml │ │ ├── shape_line.xml │ │ ├── shape_no_read.xml │ │ ├── shape_notclickbg.xml │ │ ├── shape_remove.xml │ │ ├── shape_ripple_tag_bg.xml │ │ ├── shape_tab_indicator.xml │ │ ├── shape_transparent.xml │ │ ├── shape_tree_tag.xml │ │ ├── titlebar_disco.xml │ │ ├── titlebar_friends.xml │ │ └── titlebar_music.xml │ │ ├── layout │ │ ├── activity_category_detail.xml │ │ ├── activity_douban_top.xml │ │ ├── activity_film_detail.xml │ │ ├── activity_header_base.xml │ │ ├── activity_login.xml │ │ ├── activity_main.xml │ │ ├── activity_movie_header.xml │ │ ├── activity_my_collect.xml │ │ ├── activity_nav_about.xml │ │ ├── activity_nav_admire.xml │ │ ├── activity_nav_deed_back.xml │ │ ├── activity_nav_download.xml │ │ ├── activity_nav_home_page.xml │ │ ├── activity_nav_night_mode.xml │ │ ├── activity_one_movie_detail.xml │ │ ├── activity_publish.xml │ │ ├── activity_search.xml │ │ ├── activity_transition.xml │ │ ├── activity_view_big_image.xml │ │ ├── activity_web_view.xml │ │ ├── app_bar_main.xml │ │ ├── base_header_title_bar.xml │ │ ├── content_base.xml │ │ ├── content_main.xml │ │ ├── content_scrolling.xml │ │ ├── dialog_eidt_url.xml │ │ ├── dialog_layout_private.xml │ │ ├── footer_item_everyday.xml │ │ ├── fragment_android.xml │ │ ├── fragment_category_article.xml │ │ ├── fragment_content.xml │ │ ├── fragment_everyday.xml │ │ ├── fragment_navi.xml │ │ ├── fragment_one.xml │ │ ├── fragment_square.xml │ │ ├── fragment_wan_android.xml │ │ ├── fragment_wan_find.xml │ │ ├── fragment_welfare.xml │ │ ├── header_coin_detail.xml │ │ ├── header_coin_rank.xml │ │ ├── header_film_detail.xml │ │ ├── header_item_everyday.xml │ │ ├── header_item_gank_custom.xml │ │ ├── header_item_one.xml │ │ ├── header_item_tree.xml │ │ ├── header_layout.xml │ │ ├── header_share_article.xml │ │ ├── header_slide_shape.xml │ │ ├── header_wan_android.xml │ │ ├── home_middle_layout.xml │ │ ├── item_android.xml │ │ ├── item_android_skeleton.xml │ │ ├── item_banner_wanandroid.xml │ │ ├── item_category_article.xml │ │ ├── item_collect_link.xml │ │ ├── item_douban_top.xml │ │ ├── item_everyday_one.xml │ │ ├── item_everyday_three.xml │ │ ├── item_everyday_title.xml │ │ ├── item_everyday_two.xml │ │ ├── item_film.xml │ │ ├── item_film_coming.xml │ │ ├── item_film_detail_actor.xml │ │ ├── item_film_detail_image.xml │ │ ├── item_joke.xml │ │ ├── item_movie_detail_person.xml │ │ ├── item_navigation.xml │ │ ├── item_navigation_content.xml │ │ ├── item_navigation_title.xml │ │ ├── item_one.xml │ │ ├── item_tree.xml │ │ ├── item_wan_android.xml │ │ ├── item_wan_android_skeleton.xml │ │ ├── item_wan_coin.xml │ │ ├── item_wan_coin_rank.xml │ │ ├── item_welfare.xml │ │ ├── item_wxarticle.xml │ │ ├── layout_knowledge_tag.xml │ │ ├── layout_navi_tag.xml │ │ ├── layout_tree_tag.xml │ │ ├── load_more_view_netease.xml │ │ ├── nav_header_main.xml │ │ ├── refresh_view_netease.xml │ │ ├── sliding_view_bg.xml │ │ ├── title_douban_top.xml │ │ ├── video_loading_progress.xml │ │ └── viewpager_very_image.xml │ │ ├── menu │ │ ├── activity_main_drawer.xml │ │ ├── base_header_menu.xml │ │ ├── gank_bottomsheet.xml │ │ ├── main.xml │ │ ├── menu_coin.xml │ │ ├── menu_night_mode.xml │ │ ├── menu_publish.xml │ │ ├── menu_web.xml │ │ ├── movie_detail.xml │ │ ├── slide.xml │ │ └── webview_menu.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── values-en │ │ └── strings.xml │ │ ├── values-night │ │ └── colors.xml │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-v28 │ │ └── styles.xml │ │ ├── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── drawables.xml │ │ ├── ids.xml │ │ ├── strings.xml │ │ ├── styles.xml │ │ └── transition.xml │ │ └── xml-v25 │ │ └── shortcuts.xml │ └── test │ └── java │ └── com │ └── example │ └── jingbin │ └── cloudreader │ └── ExampleUnitTest.java ├── build.gradle ├── bymvvm ├── build.gradle ├── consumer-rules.pro ├── libs │ └── commons-lang-2.6.jar ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── me │ │ └── jingbin │ │ └── bymvvm │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── me │ │ │ └── jingbin │ │ │ └── bymvvm │ │ │ ├── adapter │ │ │ ├── BaseBindingAdapter.java │ │ │ └── BaseBindingHolder.java │ │ │ ├── base │ │ │ ├── BaseActivity.java │ │ │ ├── BaseFragment.java │ │ │ ├── BaseListViewModel.java │ │ │ ├── BaseViewModel.java │ │ │ ├── NoViewModel.java │ │ │ └── RootApplication.java │ │ │ ├── http │ │ │ ├── HttpUtils.java │ │ │ ├── NullOnEmptyConverterFactory.java │ │ │ ├── ParamNames.java │ │ │ └── glide │ │ │ │ ├── OkHttpGlideModule.java │ │ │ │ ├── OkHttpStreamFetcher.java │ │ │ │ ├── OkHttpUrlLoader.java │ │ │ │ └── SSLSocketClient.java │ │ │ ├── room │ │ │ ├── AppExecutors.java │ │ │ ├── DiskIOThreadExecutor.java │ │ │ ├── Injection.java │ │ │ ├── User.java │ │ │ ├── UserDao.java │ │ │ ├── UserDataBase.java │ │ │ ├── UserDataBaseSource.java │ │ │ └── UserDataCallback.java │ │ │ ├── rxbus │ │ │ ├── RxBus.java │ │ │ └── RxBusBaseMessage.java │ │ │ └── utils │ │ │ ├── BuildFactory.java │ │ │ ├── CheckNetwork.java │ │ │ ├── ClassUtil.java │ │ │ ├── CommonUtils.java │ │ │ ├── StatusBarUtil.java │ │ │ └── StatusBarView.java │ └── res │ │ ├── drawable-xhdpi │ │ ├── app_loading0.png │ │ ├── app_loading1.png │ │ ├── app_loading2.png │ │ ├── app_loading3.png │ │ └── icon_back.png │ │ ├── drawable-xxhdpi │ │ ├── icon_back.png │ │ └── load_err.png │ │ ├── drawable │ │ └── yun_anim.xml │ │ ├── layout │ │ ├── activity_base.xml │ │ ├── fragment_base.xml │ │ ├── layout_loading_empty.xml │ │ ├── layout_loading_error.xml │ │ └── layout_loading_view.xml │ │ ├── values-en │ │ └── strings.xml │ │ ├── values-night │ │ └── colors.xml │ │ └── values │ │ ├── colors.xml │ │ ├── drawables.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── me │ └── jingbin │ └── bymvvm │ └── ExampleUnitTest.java ├── file ├── Wechat-admire.jpg ├── admire.md ├── alipay-admire.jpg ├── cloudreader.gif ├── download_200.png ├── images.png ├── images2.png └── title.png ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | # github: [youlookwhat] 4 | custom: https://github.com/youlookwhat/CloudReader/blob/master/file/admire.md 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | .idea/ 20 | 21 | # Local configuration file (sdk path, etc) 22 | local.properties 23 | 24 | # Proguard folder generated by Eclipse 25 | proguard/ 26 | 27 | # Log Files 28 | *.log 29 | 30 | # Android Studio Navigation editor temp files 31 | .navigation/ 32 | 33 | # Android Studio captures folder 34 | captures/ 35 | 36 | # Intellij 37 | *.iml 38 | .idea/workspace.xml 39 | .idea/tasks.xml 40 | .idea/gradle.xml 41 | .idea/dictionaries 42 | .idea/libraries 43 | 44 | # Keystore files 45 | *.jks 46 | 47 | # External native build folder generated in Android Studio 2.2 and later 48 | .externalNativeBuild 49 | 50 | # Google Services (e.g. APIs or Firebase) 51 | google-services.json 52 | 53 | # Freeline 54 | freeline.py 55 | freeline/ 56 | freeline_project_description.json 57 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /app/src/androidTest/java/com/example/jingbin/cloudreader/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader; 2 | 3 | import android.content.Context; 4 | import androidx.test.platform.app.InstrumentationRegistry; 5 | import androidx.test.ext.junit.runners.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.example.jingbin.yunyue", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/adapter/FilmAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.adapter 2 | 3 | import android.app.Activity 4 | import android.view.animation.OvershootInterpolator 5 | import com.example.jingbin.cloudreader.R 6 | import com.example.jingbin.cloudreader.bean.moviechild.FilmItemBean 7 | import com.example.jingbin.cloudreader.databinding.ItemFilmBinding 8 | import com.nineoldandroids.view.ViewHelper 9 | import com.nineoldandroids.view.ViewPropertyAnimator 10 | import me.jingbin.bymvvm.adapter.BaseBindingAdapter 11 | import me.jingbin.bymvvm.adapter.BaseBindingHolder 12 | 13 | /** 14 | * Created by jingbin on 2020/12/5. 15 | */ 16 | class FilmAdapter(private val activity: Activity) : BaseBindingAdapter<FilmItemBean, ItemFilmBinding>(R.layout.item_film) { 17 | 18 | override fun bindView(holder: BaseBindingHolder<*, *>?, bean: FilmItemBean?, binding: ItemFilmBinding, position: Int) { 19 | if (bean != null) { 20 | binding.subjectsBean = bean 21 | ViewHelper.setScaleX(binding.llOneItem, 0.8f) 22 | ViewHelper.setScaleY(binding.llOneItem, 0.8f) 23 | ViewPropertyAnimator.animate(binding.llOneItem).scaleX(1f).setDuration(350).setInterpolator(OvershootInterpolator()).start() 24 | ViewPropertyAnimator.animate(binding.llOneItem).scaleY(1f).setDuration(350).setInterpolator(OvershootInterpolator()).start() 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/adapter/FilmComingAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.adapter 2 | 3 | import android.content.Context 4 | import com.example.jingbin.cloudreader.R 5 | import com.example.jingbin.cloudreader.bean.ComingFilmBean 6 | import com.example.jingbin.cloudreader.databinding.ItemFilmComingBinding 7 | import com.example.jingbin.cloudreader.utils.DensityUtil 8 | import me.jingbin.bymvvm.adapter.BaseBindingAdapter 9 | import me.jingbin.bymvvm.adapter.BaseBindingHolder 10 | 11 | /** 12 | * Created by jingbin on 2020/12/5. 13 | */ 14 | class FilmComingAdapter(context: Context) : BaseBindingAdapter<ComingFilmBean.MoviecomingsBean, ItemFilmComingBinding>(R.layout.item_film_coming) { 15 | 16 | private val width: Int 17 | 18 | init { 19 | val px = DensityUtil.dip2px(context, 36f) 20 | width = (DensityUtil.getDisplayWidth() - px) / 3 21 | } 22 | 23 | override fun bindView(holder: BaseBindingHolder<*, *>?, bean: ComingFilmBean.MoviecomingsBean?, binding: ItemFilmComingBinding, position: Int) { 24 | binding.bean = bean 25 | DensityUtil.setWidthHeight(binding.ivTopPhoto, width, 0.758f) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/adapter/FilmDetailActorAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.adapter 2 | 3 | import com.example.jingbin.cloudreader.R 4 | import com.example.jingbin.cloudreader.bean.FilmDetailNewBean 5 | import com.example.jingbin.cloudreader.databinding.ItemFilmDetailActorBinding 6 | import me.jingbin.bymvvm.adapter.BaseBindingAdapter 7 | import me.jingbin.bymvvm.adapter.BaseBindingHolder 8 | 9 | /** 10 | * Created by jingbin on 2020/12/5. 11 | */ 12 | class FilmDetailActorAdapter : BaseBindingAdapter<FilmDetailNewBean.ActorBean, ItemFilmDetailActorBinding>(R.layout.item_film_detail_actor) { 13 | 14 | override fun bindView(holder: BaseBindingHolder<*, *>?, bean: FilmDetailNewBean.ActorBean?, binding: ItemFilmDetailActorBinding, position: Int) { 15 | binding.personBean = bean 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/adapter/JokeAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.adapter 2 | 3 | import com.example.jingbin.cloudreader.R 4 | import com.example.jingbin.cloudreader.bean.wanandroid.DuanZiBean 5 | import com.example.jingbin.cloudreader.databinding.ItemJokeBinding 6 | import com.example.jingbin.cloudreader.utils.TimeUtil 7 | import me.jingbin.bymvvm.adapter.BaseBindingAdapter 8 | import me.jingbin.bymvvm.adapter.BaseBindingHolder 9 | 10 | /** 11 | * Created by jingbin on 2016/11/25.update 2020/12/5 12 | */ 13 | class JokeAdapter : BaseBindingAdapter<DuanZiBean, ItemJokeBinding>(R.layout.item_joke) { 14 | 15 | override fun bindView(holder: BaseBindingHolder<*, *>?, bean: DuanZiBean, binding: ItemJokeBinding, position: Int) { 16 | binding.bean = bean 17 | binding.time = TimeUtil.formatDataTime((bean.createTime.toString() + "000").toLong()) 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/adapter/MovieDetailAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.adapter 2 | 3 | import com.example.jingbin.cloudreader.R 4 | import com.example.jingbin.cloudreader.bean.moviechild.PersonBean 5 | import com.example.jingbin.cloudreader.databinding.ItemMovieDetailPersonBinding 6 | import com.example.jingbin.cloudreader.ui.WebViewActivity 7 | import me.jingbin.bymvvm.adapter.BaseBindingAdapter 8 | import me.jingbin.bymvvm.adapter.BaseBindingHolder 9 | 10 | /** 11 | * Created by jingbin on 2020/12/5. 12 | */ 13 | class MovieDetailAdapter : BaseBindingAdapter<PersonBean, ItemMovieDetailPersonBinding>(R.layout.item_movie_detail_person) { 14 | 15 | override fun bindView(holder: BaseBindingHolder<*, *>?, bean: PersonBean?, binding: ItemMovieDetailPersonBinding, position: Int) { 16 | if (bean != null) { 17 | binding.personBean = bean 18 | binding.llItem.setOnClickListener { 19 | if (!bean.alt.isNullOrEmpty()) { 20 | WebViewActivity.loadUrl(it.context, bean.alt, bean.name) 21 | } 22 | } 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/adapter/NavigationAdapter.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.adapter; 2 | 3 | import com.example.jingbin.cloudreader.R; 4 | import com.example.jingbin.cloudreader.bean.wanandroid.NaviJsonBean; 5 | import com.example.jingbin.cloudreader.databinding.ItemNavigationBinding; 6 | 7 | import me.jingbin.bymvvm.adapter.BaseBindingAdapter; 8 | import me.jingbin.bymvvm.adapter.BaseBindingHolder; 9 | 10 | /** 11 | * Created by jingbin on 2018/10/13. 12 | */ 13 | 14 | public class NavigationAdapter extends BaseBindingAdapter<NaviJsonBean.DataBean, ItemNavigationBinding> { 15 | 16 | public NavigationAdapter() { 17 | super(R.layout.item_navigation); 18 | } 19 | 20 | @Override 21 | protected void bindView(BaseBindingHolder holder, NaviJsonBean.DataBean dataBean, ItemNavigationBinding binding, int position) { 22 | if (dataBean != null) { 23 | binding.tvTitle.setSelected(dataBean.isSelected()); 24 | binding.setBean(dataBean); 25 | binding.tvTitle.setOnClickListener(v -> { 26 | if (listener != null) { 27 | listener.onSelected(position); 28 | } 29 | }); 30 | } 31 | } 32 | 33 | private OnSelectListener listener; 34 | 35 | public void setOnSelectListener(OnSelectListener listener) { 36 | this.listener = listener; 37 | } 38 | 39 | public interface OnSelectListener { 40 | void onSelected(int position); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/app/Constants.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.app 2 | 3 | /** 4 | * Created by jingbin on 2016/11/26. 5 | * 固定参数 6 | */ 7 | open class Constants { 8 | 9 | companion object { 10 | // 下载的链接 11 | const val DOWNLOAD_URL = "https://www.coolapk.com/apk/127875" 12 | // 隐私政策 13 | const val PRIVATE_URL = "https://jingbin127.gitee.io/apiserver/privacy.html" 14 | 15 | // 深色模式 16 | const val KEY_MODE_NIGHT = "mode-night" 17 | // 跟随系统 18 | const val KEY_MODE_SYSTEM = "mode-system" 19 | // 是否打开过酷安应用市场 20 | const val SHOW_MARKET = "show_market" 21 | // 酷安包名 22 | const val COOLAPK_PACKAGE = "com.coolapk.market" 23 | // 热映缓存 24 | const val ONE_HOT_MOVIE = "one_hot_movie" 25 | // 保存每日推荐轮播图url 26 | const val BANNER_PIC = "gank_banner_pic" 27 | // 保存每日推荐轮播图的跳转数据 28 | const val BANNER_PIC_DATA = "gank_banner_data" 29 | // 保存每日推荐recyclerview内容 30 | const val EVERYDAY_CONTENT = "everyday_content" 31 | // 干货订制类别 32 | const val GANK_TYPE = "gank_type" 33 | // 是否登录 34 | const val IS_LOGIN = "is_login" 35 | // 是否第一次收藏网址 36 | const val IS_FIRST_COLLECTURL = "isFirstCollectUrl" 37 | // 问题反馈消息提示 38 | const val MESSAGE_READ_TIP = "message_read_tip" 39 | // 深色模式消息提示 40 | const val MESSAGE_READ_NIGHT_TIP = "message_read_night_tip" 41 | // 发现页内容角标 42 | const val FIND_POSITION = "find_position" 43 | // 是否同意隐私政策 44 | const val IS_AGREE_PRIVATE = "is_agree_private" 45 | } 46 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/app/RxCodeConstants.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.app 2 | 3 | /** 4 | * Created by jingbin on 2020/12/3. 5 | */ 6 | class RxCodeConstants { 7 | 8 | companion object { 9 | // 每日推荐跳转对应type下 10 | const val JUMP_TYPE = 0 11 | // 首页跳转到电影栏 12 | const val JUMP_TYPE_TO_ONE = 1 13 | // 滑动到当前图片的position 14 | const val JUMP_CURRENT_POSITION = 2 15 | // 登录状态处理 16 | const val LOGIN = 3 17 | // 发现页内容订制 18 | const val FIND_CUSTOM = 4 19 | // 刷新广场数据 20 | const val REFRESH_SQUARE_DATA = 5 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/app/app.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.app 2 | 3 | import com.example.jingbin.cloudreader.BuildConfig 4 | import com.example.jingbin.cloudreader.utils.NightModeUtil 5 | import com.tencent.bugly.crashreport.CrashReport 6 | import me.jingbin.bymvvm.base.RootApplication 7 | 8 | /** 9 | * Created by jingbin on 2016/11/22. 10 | * Update on 2020/12/02. 11 | */ 12 | open class App : RootApplication() { 13 | 14 | companion object { 15 | // 是否是快捷方式进来 16 | @JvmField 17 | var isShortcuts: Boolean = false 18 | 19 | private lateinit var app: App 20 | 21 | // @JvmStatic 加上后可以直接 getInstance(),不然需要加上Companion 22 | @JvmStatic 23 | fun getInstance(): App { 24 | return app 25 | } 26 | } 27 | 28 | override fun onCreate() { 29 | super.onCreate() 30 | app = this 31 | // HttpUtils.getInstance().init(this); 32 | NightModeUtil.initNightMode() 33 | CrashReport.initCrashReport(applicationContext, "3977b2d86f", BuildConfig.DEBUG) 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/bean/BannerItemBean.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.bean 2 | 3 | import java.io.Serializable 4 | 5 | /** 6 | * Created by jingbin on 2020/12/5. 7 | */ 8 | class BannerItemBean : Serializable { 9 | companion object { 10 | private const val serialVersionUID = 1L 11 | } 12 | 13 | val randpic: String? = null 14 | val code: String? = null 15 | val type = 0 16 | val randpic_desc: String? = null 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/bean/CoinBean.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.bean 2 | 3 | /** 4 | * Created by jingbin on 2020/12/3. 5 | */ 6 | class CoinBean { 7 | 8 | /** 9 | * curPage : 1 10 | * datas : [] 11 | * offset : 0 12 | * over : false 13 | * pageCount : 3 14 | * size : 20 15 | * total : 50 16 | */ 17 | val curPage = 0 18 | val over = false 19 | val pageCount = 0 20 | val size = 0 21 | val total = 0 22 | val datas: List<CoinLogBean>? = null 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/bean/CoinLogBean.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.bean 2 | 3 | /** 4 | * Created by jingbin on 2020/12/3. 5 | */ 6 | class CoinLogBean { 7 | /** 8 | * coinCount : 12 9 | * date : 1569468233000 10 | * desc : 2019-09-26 11:23:53 分享文章 , 积分:10 + 2 11 | * id : 53889 12 | * reason : 分享文章 13 | * type : 3 14 | * userId : 1534 15 | * userName : jingbin 16 | */ 17 | val coinCount = 0 18 | val date: Long = 0 19 | val desc: String? = null 20 | val id = 0 21 | val reason: String? = null 22 | val type = 0 23 | val userId = 0 24 | val username: String? = null 25 | val nickname: String? = null 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/bean/ImageItemsBean.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.bean; 2 | 3 | import java.io.Serializable; 4 | import java.util.ArrayList; 5 | 6 | public class ImageItemsBean implements Serializable { 7 | private static final long serialVersionUID = 1L; 8 | private ArrayList<String> imageList; 9 | private ArrayList<String> imageTitles; 10 | 11 | public ArrayList<String> getImageList() { 12 | return imageList; 13 | } 14 | 15 | public void setImageList(ArrayList<String> imageList) { 16 | this.imageList = imageList; 17 | } 18 | 19 | public ArrayList<String> getImageTitles() { 20 | return imageTitles; 21 | } 22 | 23 | public void setImageTitles(ArrayList<String> imageTitles) { 24 | this.imageTitles = imageTitles; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/bean/MovieDetailBean.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.bean 2 | 3 | class FilmDetailNewBean { 4 | 5 | val image: String? = null 6 | val titleCn: String? = null 7 | val titleEn: String? = null 8 | val rating: String? = null 9 | val scoreCount: String? = null 10 | val year: String? = null 11 | val content: String? = null 12 | val type: List<String>? = null 13 | val runTime: String? = null 14 | val url: String? = null 15 | val commonSpecial: String? = null 16 | val wapUrl: String? = null 17 | val director: DirectorBean? = null 18 | val actorList: List<ActorBean>? = null 19 | val directors: List<String>? = null 20 | val actors: List<String>? = null 21 | val release: ReleaseBean? = null 22 | val images: List<String>? = null 23 | val video: String? = null 24 | val videos: List<VideoBean>? = null 25 | 26 | class VideoBean { 27 | val url: String? = null 28 | val image: String? = null 29 | val title: String? = null 30 | val length: Int = 0 31 | } 32 | 33 | class ReleaseBean { 34 | val location: String? = null 35 | val date: String? = null 36 | } 37 | 38 | class DirectorBean { 39 | val directorName: String? = null 40 | val directorNameEn: String? = null 41 | val directorImg: String? = null 42 | 43 | } 44 | 45 | class ActorBean { 46 | var actor: String? = null 47 | var actorEn: String? = null 48 | var actorImg: String? = null 49 | var roleName: String? = null 50 | } 51 | } 52 | 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/bean/MtimeFilmeBean.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.bean; 2 | 3 | import com.example.jingbin.cloudreader.bean.moviechild.FilmItemBean; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @author jingbin 9 | */ 10 | public class MtimeFilmeBean { 11 | 12 | private List<FilmItemBean> ms; 13 | 14 | public List<FilmItemBean> getMs() { 15 | return ms; 16 | } 17 | 18 | public void setMs(List<FilmItemBean> ms) { 19 | this.ms = ms; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/bean/ShareArticleBean.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.bean 2 | 3 | import com.example.jingbin.cloudreader.bean.wanandroid.WxarticleDetailItemBean 4 | 5 | /** 6 | * Created by jingbin on 2021/1/22. 7 | */ 8 | class ShareArticleBean { 9 | 10 | var shareArticles: WxarticleDetailItemBean? = null 11 | var coinInfo: CoinInfoBean? = null 12 | 13 | class CoinInfoBean { 14 | val coinCount: Int = 0 15 | val userId: Int = 0 16 | val level: Int = 0 17 | val nickname: String = "" 18 | val rank: String = "" 19 | val username: String = "" 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/bean/UpdateBean.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.bean 2 | 3 | /** 4 | * Created by jingbin on 2020/12/3. 5 | */ 6 | open class UpdateBean { 7 | 8 | var name: String? = null 9 | // 版本号 10 | val version: String = "1" 11 | // 更新日志 12 | var changelog: String? = null 13 | // 1显示弹框,不然不显示 14 | var isShow: String? = "0" 15 | // 更新时间 16 | var updated_at: Long = 0 17 | // 版本名称 18 | var versionShort: String? = null 19 | var build: String? = null 20 | var installUrl: String? = "" 21 | var update_url: String? = null 22 | // 是否跳应用市场 23 | var isJumpMarket: Int = 1 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/bean/moviechild/ImagesBean.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.bean.moviechild; 2 | 3 | import androidx.databinding.BaseObservable; 4 | import androidx.databinding.Bindable; 5 | 6 | import com.example.jingbin.cloudreader.BR; 7 | 8 | import java.io.Serializable; 9 | 10 | import me.jingbin.bymvvm.http.ParamNames; 11 | 12 | /** 13 | * Created by jingbin on 2016/11/25. 14 | */ 15 | 16 | public class ImagesBean extends BaseObservable implements Serializable{ 17 | /** 18 | * small : https://img3.doubanio.com/view/movie_poster_cover/ipst/public/p2378133884.jpg 19 | * large : https://img3.doubanio.com/view/movie_poster_cover/lpst/public/p2378133884.jpg 20 | * medium : https://img3.doubanio.com/view/movie_poster_cover/spst/public/p2378133884.jpg 21 | */ 22 | @ParamNames("small") 23 | private String small; 24 | @ParamNames("large") 25 | private String large; 26 | @ParamNames("medium") 27 | private String medium; 28 | @Bindable 29 | public String getSmall() { 30 | return small; 31 | } 32 | @Bindable 33 | public String getLarge() { 34 | return large; 35 | } 36 | @Bindable 37 | public String getMedium() { 38 | return medium; 39 | } 40 | 41 | public void setSmall(String small) { 42 | this.small = small; 43 | notifyPropertyChanged(BR.small); 44 | } 45 | 46 | public void setLarge(String large) { 47 | this.large = large; 48 | notifyPropertyChanged(BR.large); 49 | } 50 | 51 | public void setMedium(String medium) { 52 | this.medium = medium; 53 | notifyPropertyChanged(BR.medium); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/bean/moviechild/RatingBean.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.bean.moviechild; 2 | 3 | import androidx.databinding.BaseObservable; 4 | import androidx.databinding.Bindable; 5 | 6 | import com.example.jingbin.cloudreader.BR; 7 | 8 | import java.io.Serializable; 9 | 10 | import me.jingbin.bymvvm.http.ParamNames; 11 | 12 | /** 13 | * Created by jingbin on 2016/11/25. 14 | */ 15 | 16 | public class RatingBean extends BaseObservable implements Serializable { 17 | /** 18 | * max : 10 19 | * average : 6.9 20 | * stars : 35 21 | * min : 0 22 | */ 23 | @ParamNames("max") 24 | private int max; 25 | @ParamNames("average") 26 | private double average; 27 | @ParamNames("stars") 28 | private String stars; 29 | @ParamNames("min") 30 | private int min; 31 | 32 | @Bindable 33 | public int getMax() { 34 | return max; 35 | } 36 | 37 | @Bindable 38 | public double getAverage() { 39 | return average; 40 | } 41 | 42 | @Bindable 43 | public String getStars() { 44 | return stars; 45 | } 46 | 47 | @Bindable 48 | public int getMin() { 49 | return min; 50 | } 51 | 52 | public void setMax(int max) { 53 | this.max = max; 54 | notifyPropertyChanged(BR.max); 55 | } 56 | 57 | public void setAverage(double average) { 58 | this.average = average; 59 | notifyPropertyChanged(BR.average); 60 | } 61 | 62 | public void setStars(String stars) { 63 | this.stars = stars; 64 | notifyPropertyChanged(BR.stars); 65 | } 66 | 67 | public void setMin(int min) { 68 | this.min = min; 69 | notifyPropertyChanged(BR.min); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/bean/wanandroid/BaseResultBean.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.bean.wanandroid; 2 | 3 | import androidx.databinding.BaseObservable; 4 | import androidx.databinding.Bindable; 5 | 6 | import com.example.jingbin.cloudreader.BR; 7 | 8 | public class BaseResultBean<T> extends BaseObservable { 9 | 10 | private T data; 11 | private int errorCode; 12 | private String errorMsg; 13 | 14 | @Bindable 15 | public T getData() { 16 | return data; 17 | } 18 | 19 | public void setData(T data) { 20 | this.data = data; 21 | notifyPropertyChanged(BR.data); 22 | } 23 | 24 | @Bindable 25 | public int getErrorCode() { 26 | return errorCode; 27 | } 28 | 29 | public void setErrorCode(int errorCode) { 30 | this.errorCode = errorCode; 31 | notifyPropertyChanged(BR.errorCode); 32 | } 33 | 34 | @Bindable 35 | public String getErrorMsg() { 36 | return errorMsg; 37 | } 38 | 39 | public void setErrorMsg(String errorMsg) { 40 | this.errorMsg = errorMsg; 41 | notifyPropertyChanged(BR.errorMsg); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/bean/wanandroid/CoinUserInfoBean.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.bean.wanandroid; 2 | 3 | import androidx.databinding.BaseObservable; 4 | import androidx.databinding.Bindable; 5 | 6 | import com.example.jingbin.cloudreader.BR; 7 | 8 | public class CoinUserInfoBean extends BaseObservable { 9 | 10 | /** 11 | * coinCount : 451 12 | * rank : 7 13 | * userId : 2 14 | * username : x**oyang 15 | */ 16 | 17 | private int coinCount; 18 | private int rank; 19 | private int userId; 20 | // 有 ** 21 | private String username; 22 | 23 | @Bindable 24 | public int getCoinCount() { 25 | return coinCount; 26 | } 27 | 28 | public void setCoinCount(int coinCount) { 29 | this.coinCount = coinCount; 30 | notifyPropertyChanged(BR.coinCount); 31 | } 32 | 33 | @Bindable 34 | public int getRank() { 35 | return rank; 36 | } 37 | 38 | public void setRank(int rank) { 39 | this.rank = rank; 40 | notifyPropertyChanged(BR.rank); 41 | } 42 | 43 | @Bindable 44 | public int getUserId() { 45 | return userId; 46 | } 47 | 48 | public void setUserId(int userId) { 49 | this.userId = userId; 50 | notifyPropertyChanged(BR.userId); 51 | } 52 | 53 | @Bindable 54 | public String getUsername() { 55 | return username; 56 | } 57 | 58 | public void setUsername(String username) { 59 | this.username = username; 60 | notifyPropertyChanged(BR.username); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/bean/wanandroid/TreeBean.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.bean.wanandroid; 2 | 3 | import androidx.databinding.BaseObservable; 4 | import androidx.databinding.Bindable; 5 | 6 | import com.example.jingbin.cloudreader.BR; 7 | 8 | import java.io.Serializable; 9 | import java.util.List; 10 | 11 | /** 12 | * @author jingbin 13 | * @data 2018/9/15 14 | * @description 15 | */ 16 | 17 | public class TreeBean extends BaseObservable implements Serializable { 18 | 19 | private static final long serialVersionUID = 1L; 20 | private int errorCode; 21 | private String errorMsg; 22 | private List<TreeItemBean> data; 23 | 24 | @Bindable 25 | public int getErrorCode() { 26 | return errorCode; 27 | } 28 | 29 | public void setErrorCode(int errorCode) { 30 | this.errorCode = errorCode; 31 | notifyPropertyChanged(BR.errorCode); 32 | } 33 | 34 | @Bindable 35 | public String getErrorMsg() { 36 | return errorMsg; 37 | } 38 | 39 | public void setErrorMsg(String errorMsg) { 40 | this.errorMsg = errorMsg; 41 | notifyPropertyChanged(BR.errorMsg); 42 | } 43 | 44 | @Bindable 45 | public List<TreeItemBean> getData() { 46 | return data; 47 | } 48 | 49 | public void setData(List<TreeItemBean> data) { 50 | this.data = data; 51 | notifyPropertyChanged(BR.data); 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/bean/wanandroid/WxarticleDetailItemBean.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.bean.wanandroid; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author jingbin 7 | * @data 2019-09-29 8 | * @description 9 | */ 10 | public class WxarticleDetailItemBean { 11 | private int total; 12 | private List<ArticlesBean> datas; 13 | 14 | public int getTotal() { 15 | return total; 16 | } 17 | 18 | public void setTotal(int total) { 19 | this.total = total; 20 | } 21 | 22 | public List<ArticlesBean> getDatas() { 23 | return datas; 24 | } 25 | 26 | public void setDatas(List<ArticlesBean> datas) { 27 | this.datas = datas; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/data/OnUserInfoListener.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.data 2 | 3 | import me.jingbin.bymvvm.room.User 4 | 5 | /** 6 | * Created by jingbin on 2020/12/5. 7 | */ 8 | interface OnUserInfoListener { 9 | 10 | fun onSuccess(user: User?) 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/http/RequestImpl.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.http; 2 | 3 | import io.reactivex.disposables.Disposable; 4 | 5 | /** 6 | * Created by jingbin on 2017/1/17. 7 | * 用于数据请求的回调 8 | */ 9 | 10 | public interface RequestImpl { 11 | void loadSuccess(Object object); 12 | 13 | void loadFailed(); 14 | 15 | void addSubscription(Disposable subscription); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/ui/menu/NavDownloadActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.ui.menu; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | 8 | import com.example.jingbin.cloudreader.R; 9 | import com.example.jingbin.cloudreader.app.Constants; 10 | import me.jingbin.bymvvm.base.BaseActivity; 11 | import com.example.jingbin.cloudreader.databinding.ActivityNavDownloadBinding; 12 | import com.example.jingbin.cloudreader.utils.PerfectClickListener; 13 | import com.example.jingbin.cloudreader.utils.QRCodeUtil; 14 | import com.example.jingbin.cloudreader.utils.ShareUtils; 15 | import me.jingbin.bymvvm.base.NoViewModel; 16 | 17 | public class NavDownloadActivity extends BaseActivity<NoViewModel, ActivityNavDownloadBinding> { 18 | 19 | @Override 20 | protected void onCreate(Bundle savedInstanceState) { 21 | super.onCreate(savedInstanceState); 22 | setContentView(R.layout.activity_nav_download); 23 | showContentView(); 24 | 25 | setTitle("扫码下载"); 26 | QRCodeUtil.showThreadImage(this, Constants.DOWNLOAD_URL, bindingView.ivErweima, R.drawable.ic_cloudreader_mip); 27 | bindingView.tvShare.setOnClickListener(new PerfectClickListener() { 28 | @Override 29 | protected void onNoDoubleClick(View v) { 30 | ShareUtils.share(v.getContext(), R.string.string_share_text); 31 | } 32 | }); 33 | } 34 | 35 | public static void start(Context mContext) { 36 | Intent intent = new Intent(mContext, NavDownloadActivity.class); 37 | mContext.startActivity(intent); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/ui/wan/child/LoginActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.ui.wan.child; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | 8 | import com.example.jingbin.cloudreader.R; 9 | import com.example.jingbin.cloudreader.app.RxCodeConstants; 10 | import com.example.jingbin.cloudreader.databinding.ActivityLoginBinding; 11 | import com.example.jingbin.cloudreader.viewmodel.menu.LoginViewModel; 12 | 13 | import me.jingbin.bymvvm.base.BaseActivity; 14 | import me.jingbin.bymvvm.rxbus.RxBus; 15 | 16 | /** 17 | * 玩安卓登录 18 | * 19 | * @author jingbin 20 | */ 21 | public class LoginActivity extends BaseActivity<LoginViewModel, ActivityLoginBinding> { 22 | 23 | @Override 24 | protected void onCreate(Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | setContentView(R.layout.activity_login); 27 | setTitle("玩安卓登录"); 28 | showContentView(); 29 | bindingView.setViewModel(viewModel); 30 | } 31 | 32 | public void register(View view) { 33 | viewModel.register().observe(this, this::loadSuccess); 34 | } 35 | 36 | public void login(View view) { 37 | viewModel.login().observe(this, this::loadSuccess); 38 | } 39 | 40 | /** 41 | * 注册或登录成功 42 | */ 43 | public void loadSuccess(Boolean aBoolean) { 44 | if (aBoolean != null && aBoolean) { 45 | RxBus.getDefault().post(RxCodeConstants.LOGIN, true); 46 | finish(); 47 | } 48 | } 49 | 50 | public static void start(Context mContext) { 51 | Intent intent = new Intent(mContext, LoginActivity.class); 52 | mContext.startActivity(intent); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/utils/DebugUtil.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.utils; 2 | 3 | import android.content.Context; 4 | import android.os.Looper; 5 | import android.util.Log; 6 | import android.widget.Toast; 7 | 8 | /** 9 | * @author jingbin 10 | * @Description 在代码中要打印log, 就直接DebugUtil.debug(....). 11 | * 然后如果发布的时候,就直接把这个类的DEBUG 改成false,这样所有的log就不会再打印在控制台. 12 | */ 13 | public class DebugUtil { 14 | 15 | public static final String TAG = "jingbin"; 16 | public static final boolean DEBUG = true; 17 | 18 | public static void toast(Context context, String content) { 19 | Toast.makeText(context, content, Toast.LENGTH_SHORT).show(); 20 | } 21 | 22 | public static void debug(String tag, String msg) { 23 | if (DEBUG) { 24 | Log.d(tag, msg); 25 | } 26 | } 27 | 28 | public static void debug(String msg) { 29 | if (DEBUG) { 30 | Log.d(TAG, msg); 31 | } 32 | } 33 | 34 | public static void error(String tag, String error) { 35 | 36 | if (DEBUG) { 37 | 38 | Log.e(tag, error); 39 | } 40 | } 41 | 42 | public static void error(String error) { 43 | 44 | if (DEBUG) { 45 | 46 | Log.e(TAG, error); 47 | } 48 | } 49 | 50 | public static void isMainThread() { 51 | if (DEBUG) { 52 | Log.e(TAG, "---是否在主线程:" + (Thread.currentThread() == Looper.getMainLooper().getThread())); 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/utils/PerfectClickListener.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.utils; 2 | 3 | import android.view.View; 4 | import android.view.View.OnClickListener; 5 | 6 | import java.util.Calendar; 7 | 8 | /** 9 | * 避免在1秒内出发多次点击 10 | */ 11 | public abstract class PerfectClickListener implements OnClickListener { 12 | public static final int MIN_CLICK_DELAY_TIME = 1000; 13 | private long lastClickTime = 0; 14 | private int id = -1; 15 | 16 | @Override 17 | public void onClick(View v) { 18 | long currentTime = Calendar.getInstance().getTimeInMillis(); 19 | int mId = v.getId(); 20 | if (id != mId) { 21 | id = mId; 22 | lastClickTime = currentTime; 23 | onNoDoubleClick(v); 24 | return; 25 | } 26 | if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) { 27 | lastClickTime = currentTime; 28 | onNoDoubleClick(v); 29 | } 30 | } 31 | 32 | protected abstract void onNoDoubleClick(View v); 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/view/CommonTabPagerAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.view 2 | 3 | import androidx.fragment.app.Fragment 4 | import androidx.fragment.app.FragmentManager 5 | import androidx.fragment.app.FragmentPagerAdapter 6 | import com.example.jingbin.cloudreader.utils.DataUtil 7 | 8 | class CommonTabPagerAdapter : FragmentPagerAdapter { 9 | 10 | private var pageCount = 0 11 | private var mList: List<String>? = null 12 | var listener: TabPagerListener? = null 13 | 14 | constructor(fm: FragmentManager, list: List<String>?) : super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { 15 | initData(list) 16 | } 17 | 18 | private fun initData(list: List<String>?) { 19 | if (list == null || list.isEmpty()) { 20 | throw ExceptionInInitializerError("list can't be null or empty") 21 | } 22 | mList = list 23 | this.pageCount = list.size 24 | } 25 | 26 | override fun getItem(position: Int): Fragment = listener?.getFragment(position)!! 27 | 28 | override fun getCount(): Int = pageCount 29 | 30 | override fun getPageTitle(position: Int): CharSequence? = DataUtil.getHtmlString(mList?.get(position))!! 31 | 32 | interface TabPagerListener { 33 | fun getFragment(position: Int): Fragment? 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/view/Listener.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.view 2 | 3 | import android.content.Context 4 | import android.util.Log 5 | import android.webkit.JavascriptInterface 6 | 7 | /** 8 | * 登录监听 9 | */ 10 | interface OnLoginListener { 11 | 12 | fun loginWanAndroid() 13 | 14 | fun loginGitHub() 15 | } 16 | 17 | interface OnShareDialogListener { 18 | fun look() 19 | fun delete() 20 | } 21 | 22 | /** 23 | * js通信接口 24 | */ 25 | class ImageClickInterface(context: Context?) { 26 | 27 | @JavascriptInterface 28 | fun imageClick(imgUrl: String, hasLink: String?) { 29 | Log.e("----点击了图片 url: ", "$imgUrl- hasLink:$hasLink") 30 | } 31 | 32 | @JavascriptInterface 33 | fun textClick(type: String?, item_pk: String?) { 34 | if (!type.isNullOrEmpty() && !item_pk.isNullOrEmpty()) { 35 | Log.e("----点击了文字", "") 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/view/MyNestedScrollView.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.view; 2 | 3 | import android.content.Context; 4 | import androidx.core.widget.NestedScrollView; 5 | import android.util.AttributeSet; 6 | 7 | /** 8 | * Created by jingbin on 2016/12/6. 9 | * 系统的滚动监听只能api23以上用,这为了兼容 10 | */ 11 | 12 | public class MyNestedScrollView extends NestedScrollView { 13 | 14 | private ScrollInterface scrollInterface; 15 | 16 | /** 17 | * 定义滑动接口 18 | */ 19 | public interface ScrollInterface { 20 | void onScrollChange(int scrollX, int scrollY, int oldScrollX, int oldScrollY); 21 | } 22 | 23 | public MyNestedScrollView(Context context) { 24 | super(context); 25 | } 26 | 27 | public MyNestedScrollView(Context context, AttributeSet attrs) { 28 | super(context, attrs); 29 | } 30 | 31 | public MyNestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) { 32 | super(context, attrs, defStyleAttr); 33 | } 34 | 35 | @Override 36 | protected void onScrollChanged(int l, int t, int oldl, int oldt) { 37 | if (scrollInterface != null) { 38 | scrollInterface.onScrollChange(l, t, oldl, oldt); 39 | } 40 | super.onScrollChanged(l, t, oldl, oldt); 41 | } 42 | 43 | public void setOnScrollChangeListener(ScrollInterface t) { 44 | this.scrollInterface = t; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/view/MyTextWatch.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.view 2 | 3 | import android.text.Editable 4 | import android.text.TextWatcher 5 | 6 | /** 7 | * Created by jingbin on 2021/1/17. 8 | */ 9 | abstract class MyTextWatch : TextWatcher { 10 | 11 | override fun afterTextChanged(s: Editable?) { 12 | } 13 | 14 | override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { 15 | 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/view/OnMyPageChangeListener.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.view; 2 | 3 | import androidx.viewpager.widget.ViewPager; 4 | 5 | public class OnMyPageChangeListener implements ViewPager.OnPageChangeListener { 6 | 7 | @Override 8 | public void onPageScrolled(int i, float v, int i1) { 9 | 10 | } 11 | 12 | @Override 13 | public void onPageSelected(int i) { 14 | 15 | } 16 | 17 | @Override 18 | public void onPageScrollStateChanged(int i) { 19 | 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/view/ViewPagerFixed.kt: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.view 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.view.MotionEvent 6 | import androidx.viewpager.widget.ViewPager 7 | 8 | /** 9 | * @author jingbin 10 | * fix IllegalArgumentException (pointerIndex out of range) 11 | */ 12 | class ViewPagerFixed : ViewPager { 13 | constructor(context: Context?) : super(context!!) 14 | constructor(context: Context?, attrs: AttributeSet?) : super( 15 | context!!, attrs 16 | ) 17 | 18 | override fun onTouchEvent(ev: MotionEvent): Boolean { 19 | try { 20 | return super.onTouchEvent(ev) 21 | } catch (ex: IllegalArgumentException) { 22 | ex.printStackTrace() 23 | } 24 | return false 25 | } 26 | 27 | override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { 28 | try { 29 | return super.onInterceptTouchEvent(ev) 30 | } catch (ex: IllegalArgumentException) { 31 | ex.printStackTrace() 32 | } 33 | return false 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/view/viewbigimage/HackyViewPager.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.view.viewbigimage; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.MotionEvent; 6 | 7 | import androidx.viewpager.widget.ViewPager; 8 | 9 | /** 10 | * Hacky fix for Issue #4 and 11 | * http://code.google.com/p/android/issues/detail?id=18990 12 | * 13 | * ScaleGestureDetector seems to mess up the touch events, which means that 14 | * ViewGroups which make use of onInterceptTouchEvent throw a lot of 15 | * IllegalArgumentException: pointerIndex out of range. 16 | * 17 | * There's not much I can do in my code for now, but we can mask the result by 18 | * just catching the problem and ignoring it. 19 | * 20 | * @author Chris Banes 21 | */ 22 | public class HackyViewPager extends ViewPager { 23 | 24 | // public HackyViewPager(Context context) { 25 | // super(context); 26 | // } 27 | 28 | public HackyViewPager(Context context, AttributeSet attributeSet){ 29 | super(context, attributeSet); 30 | } 31 | 32 | @Override 33 | public boolean onInterceptTouchEvent(MotionEvent ev) { 34 | try { 35 | return super.onInterceptTouchEvent(ev); 36 | } catch (IllegalArgumentException e) { 37 | e.printStackTrace(); 38 | return false; 39 | } 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/viewmodel/movie/DoubanTopViewModel.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.viewmodel.movie; 2 | 3 | import android.app.Application; 4 | import androidx.lifecycle.MutableLiveData; 5 | import androidx.annotation.NonNull; 6 | 7 | import me.jingbin.bymvvm.base.BaseViewModel; 8 | import com.example.jingbin.cloudreader.bean.HotMovieBean; 9 | import com.example.jingbin.cloudreader.data.model.OneRepository; 10 | 11 | /** 12 | * @author jingbin 13 | * @data 2017/12/15 14 | * @Description 依赖注入:依赖注入允许类在不构造它们的情况下定义它们的依赖关系。在运行时,另一个类负责提供这些依赖关系。 15 | * 我们推荐Google的Dagger 2库在Android应用程序中实现依赖注入。Dagger 2通过遍历依赖关系树来自动构造对象,并为依赖关系提供编译时间保证。 16 | */ 17 | 18 | public class DoubanTopViewModel extends BaseViewModel { 19 | 20 | private int mStart = 0; 21 | private int mCount = 21; 22 | private OneRepository oneRepo; 23 | 24 | public DoubanTopViewModel(@NonNull Application application) { 25 | super(application); 26 | this.oneRepo = new OneRepository(); 27 | } 28 | 29 | public MutableLiveData<HotMovieBean> getHotMovie() { 30 | final MutableLiveData<HotMovieBean> data = new MutableLiveData<>(); 31 | oneRepo.getMovieTop250(mStart, mCount, new OnMovieLoadListener() { 32 | @Override 33 | public void onSuccess(HotMovieBean hotMovieBean) { 34 | data.setValue(hotMovieBean); 35 | } 36 | 37 | @Override 38 | public void onFailure() { 39 | data.setValue(null); 40 | } 41 | }); 42 | return data; 43 | } 44 | 45 | public int getStart() { 46 | return mStart; 47 | } 48 | 49 | public void handleNextStart() { 50 | mStart += mCount; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/viewmodel/movie/OnMovieLoadListener.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.viewmodel.movie; 2 | 3 | import com.example.jingbin.cloudreader.bean.HotMovieBean; 4 | 5 | /** 6 | * @author jingbin 7 | * @data 2017/12/26 8 | * @Description 9 | */ 10 | 11 | public interface OnMovieLoadListener { 12 | 13 | void onSuccess(HotMovieBean bean); 14 | 15 | void onFailure(); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/jingbin/cloudreader/viewmodel/wan/WanNavigator.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader.viewmodel.wan; 2 | 3 | import com.example.jingbin.cloudreader.bean.wanandroid.DuanZiBean; 4 | 5 | import java.util.List; 6 | 7 | import io.reactivex.disposables.Disposable; 8 | 9 | /** 10 | * @author jingbin 11 | * @data 2018/2/8 12 | * @Description 13 | */ 14 | 15 | public interface WanNavigator { 16 | 17 | 18 | interface JokeModelNavigator { 19 | void loadSuccess(List<DuanZiBean> lists); 20 | 21 | void loadFailed(); 22 | 23 | void addSubscription(Disposable disposable); 24 | 25 | } 26 | 27 | /** 28 | * 收藏或取消收藏 29 | */ 30 | interface OnCollectNavigator { 31 | void onSuccess(); 32 | 33 | void onFailure(); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/res/anim/activity_down_in.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <set xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <alpha 4 | android:duration="200" 5 | android:interpolator="@android:anim/decelerate_interpolator" 6 | android:fromAlpha="1.0" 7 | android:toAlpha="1.0" /> 8 | </set> -------------------------------------------------------------------------------- /app/src/main/res/anim/activity_down_out.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <set xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <translate 4 | android:duration="200" 5 | android:fromYDelta="0" 6 | android:interpolator="@android:anim/decelerate_interpolator" 7 | android:toYDelta="12%p" /> 8 | <alpha 9 | android:duration="200" 10 | android:fromAlpha="1.0" 11 | android:interpolator="@android:anim/decelerate_interpolator" 12 | android:toAlpha="0.0" /> 13 | </set> -------------------------------------------------------------------------------- /app/src/main/res/anim/activity_up_in.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <set xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <translate 4 | android:duration="200" 5 | android:fromYDelta="12%p" 6 | android:interpolator="@android:anim/decelerate_interpolator" 7 | android:toYDelta="0" /> 8 | <alpha 9 | android:duration="200" 10 | android:fromAlpha="0.0" 11 | android:interpolator="@android:anim/decelerate_interpolator" 12 | android:toAlpha="1.0" /> 13 | 14 | </set> -------------------------------------------------------------------------------- /app/src/main/res/anim/activity_up_out.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <set xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <alpha 4 | android:duration="200" 5 | android:fromAlpha="1.0" 6 | android:interpolator="@android:anim/decelerate_interpolator" 7 | android:toAlpha="1.0" /> 8 | </set> -------------------------------------------------------------------------------- /app/src/main/res/anim/push_fade_in.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <set xmlns:android="http://schemas.android.com/apk/res/android" > 3 | 4 | <alpha 5 | android:fromAlpha="1.0" 6 | android:toAlpha="0.0" 7 | android:duration="350" 8 | /> 9 | 10 | </set> -------------------------------------------------------------------------------- /app/src/main/res/anim/push_fade_out.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <set xmlns:android="http://schemas.android.com/apk/res/android" > 3 | 4 | <alpha 5 | android:fromAlpha="0" 6 | android:toAlpha="1.0" 7 | android:duration="350" 8 | /> 9 | 10 | </set> -------------------------------------------------------------------------------- /app/src/main/res/anim/screen_zoom_in.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <set xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:interpolator="@android:anim/accelerate_interpolator"> 4 | <scale 5 | android:duration="@android:integer/config_mediumAnimTime" 6 | android:fromXScale="2.0" 7 | android:fromYScale="2.0" 8 | android:pivotX="50%p" 9 | android:pivotY="50%p" 10 | android:toXScale="1.0" 11 | android:toYScale="1.0" /> 12 | 13 | <alpha 14 | android:duration="@android:integer/config_mediumAnimTime" 15 | android:fromAlpha="0" 16 | android:toAlpha="1.0" /> 17 | 18 | </set> -------------------------------------------------------------------------------- /app/src/main/res/anim/screen_zoom_out.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <set xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:interpolator="@android:anim/accelerate_interpolator"> 4 | <scale 5 | android:duration="@android:integer/config_mediumAnimTime" 6 | android:fromXScale="1.0" 7 | android:fromYScale="1.0" 8 | android:pivotX="50%p" 9 | android:pivotY="50%p" 10 | android:toXScale=".5" 11 | android:toYScale=".5" /> 12 | <alpha 13 | android:duration="@android:integer/config_mediumAnimTime" 14 | android:fromAlpha="1.0" 15 | android:toAlpha="0" /> 16 | 17 | </set> -------------------------------------------------------------------------------- /app/src/main/res/anim/transition_anim.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <alpha xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:duration="2000" 4 | android:fromAlpha="0" 5 | android:interpolator="@android:anim/accelerate_interpolator" 6 | android:toAlpha="1"> 7 | </alpha> -------------------------------------------------------------------------------- /app/src/main/res/color/select_book_text.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <item android:color="@color/text_common" android:state_checked="true" /> 5 | <item android:color="@color/colorSubtitle" /> 6 | 7 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/color/select_gank_day.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <item android:color="@color/colorWhite" android:state_pressed="true" /> 5 | <item android:color="@color/colorTheme" /> 6 | 7 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/color/select_home_text.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <item android:color="@color/colorTheme" android:state_checked="true" /> 5 | <item android:color="@color/colorSubtitle" /> 6 | 7 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/color/select_navi_text.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <item android:color="@color/colorWhite" android:state_checked="true" /> 5 | <item android:color="@color/colorWhite" android:state_selected="true" /> 6 | <item android:color="@color/colorContent" /> 7 | 8 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/actionbar_more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-hdpi/actionbar_more.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/actionbar_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-hdpi/actionbar_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/actionbar_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-hdpi/actionbar_share.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_cloudreader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-hdpi/ic_cloudreader.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/loading_everyday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-hdpi/loading_everyday.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_cloudreader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-mdpi/ic_cloudreader.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-xxhdpi/ic_uncollect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-night-xxhdpi/ic_uncollect.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-xxhdpi/img_transition_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-night-xxhdpi/img_transition_default.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-xxhdpi/titlebar_discover_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-night-xxhdpi/titlebar_discover_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-xxhdpi/titlebar_discover_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-night-xxhdpi/titlebar_discover_prs.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-xxhdpi/titlebar_discover_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-night-xxhdpi/titlebar_discover_selected.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-xxhdpi/titlebar_friends_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-night-xxhdpi/titlebar_friends_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-xxhdpi/titlebar_friends_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-night-xxhdpi/titlebar_friends_prs.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-xxhdpi/titlebar_friends_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-night-xxhdpi/titlebar_friends_selected.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-xxhdpi/titlebar_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-night-xxhdpi/titlebar_menu.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-xxhdpi/titlebar_music_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-night-xxhdpi/titlebar_music_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-xxhdpi/titlebar_music_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-night-xxhdpi/titlebar_music_prs.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-xxhdpi/titlebar_music_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-night-xxhdpi/titlebar_music_selected.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_camera.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0"/> 9 | <path 10 | android:fillColor="#FF000000" 11 | android:pathData="M9,2L7.17,4H4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2H9zm3,15c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z"/> 12 | </vector> 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_gallery.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M22,16V4c0,-1.1 -0.9,-2 -2,-2H8c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2zm-11,-4l2.03,2.71L16,11l4,5H8l3,-4zM2,6v14c0,1.1 0.9,2 2,2h14v-2H4V6H2z"/> 9 | </vector> 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_manage.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M22.7,19l-9.1,-9.1c0.9,-2.3 0.4,-5 -1.5,-6.9 -2,-2 -5,-2.4 -7.4,-1.3L9,6 6,9 1.6,4.7C0.4,7.1 0.9,10.1 2.9,12.1c1.9,1.9 4.6,2.4 6.9,1.5l9.1,9.1c0.4,0.4 1,0.4 1.4,0l2.3,-2.3c0.5,-0.4 0.5,-1.1 0.1,-1.4z"/> 9 | </vector> -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_send.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z"/> 9 | </vector> 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_share.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"/> 9 | </vector> 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_slideshow.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M4,6H2v14c0,1.1 0.9,2 2,2h14v-2H4V6zm16,-4H8c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2zm-8,12.5v-9l6,4.5 -6,4.5z"/> 9 | </vector> 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ripple_category_back.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <ripple xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:color="@color/colorWhite" 4 | android:radius="30dp"/> -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ripple_item_white_bg.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <ripple xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:color="@color/itemBackground"> 4 | <item> 5 | <color android:color="@color/color_sheet_bg" /> 6 | </item> 7 | </ripple> -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ripple_joke_item_bg.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <ripple xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:color="@color/itemBackground"> 4 | <item android:id="@android:id/mask"> 5 | <color android:color="@android:color/white" /> 6 | </item> 7 | </ripple> -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ripple_one_item_bg.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <ripple xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:color="@color/itemBackground"> 4 | <item> 5 | <color android:color="@color/color_page_bg" /> 6 | </item> 7 | </ripple> -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ripple_tab_bg.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <ripple xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:color="@color/tabBackground"> 4 | <item> 5 | <color android:color="@color/colorTabBgDefault" /> 6 | </item> 7 | </ripple> -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/shape_bg_publish.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <ripple xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:color="@color/colorBanTransparent"> 4 | 5 | <!--背景透明色 android:id="@android:id/mask"--> 6 | <item> 7 | <shape android:shape="rectangle"> 8 | <solid android:color="@color/colorTheme" /> 9 | <corners android:radius="60dp" /> 10 | </shape> 11 | </item> 12 | 13 | </ripple> -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/shape_ripple_tag_bg.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <ripple xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:color="@color/colorTheme"> 4 | 5 | <!--背景透明色 android:id="@android:id/mask"--> 6 | <item> 7 | <shape android:shape="rectangle"> 8 | <padding 9 | android:bottom="5dp" 10 | android:left="15dp" 11 | android:right="15dp" 12 | android:top="5dp" /> 13 | <solid android:color="@color/color_tree_tab_bg" /> 14 | <corners android:radius="100dp" /> 15 | </shape> 16 | </item> 17 | 18 | </ripple> -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/actionbar_cha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xhdpi/actionbar_cha.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_cloudreader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xhdpi/ic_cloudreader.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_history_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xhdpi/ic_history_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/action_publish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/action_publish.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/actionbar_cha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/actionbar_cha.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/actionbar_help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/actionbar_help.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/actionbar_more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/actionbar_more.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/actionbar_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/actionbar_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/actionbar_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/actionbar_share.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/actionbar_web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/actionbar_web.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_arrow_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_arrow_right.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_arrow_right_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_arrow_right_gray.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_icon_day.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_icon_day.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_icon_day_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_icon_day_prs.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_icon_fm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_icon_fm.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_icon_fm_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_icon_fm_prs.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_icon_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_icon_music.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_icon_music_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_icon_music_prs.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_icon_rank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_icon_rank.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_icon_rank_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_icon_rank_prs.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_title_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_title_all.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_title_android.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_title_android.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_title_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_title_app.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_title_backend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_title_backend.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_title_flutter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_title_flutter.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_title_ios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_title_ios.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_title_meizi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_title_meizi.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_title_movie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_title_movie.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_title_qian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_title_qian.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_title_source.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_title_source.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/home_title_xia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/home_title_xia.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/homepage_header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/homepage_header.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_avatar_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_avatar_default.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_catalogue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_catalogue.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_catalogue_bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_catalogue_bottom.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_checked.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_cloudreader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_cloudreader.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_cloudreader_mip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_cloudreader_mip.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_collected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_collected.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_cylinder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_cylinder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_nav_about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_nav_about.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_nav_admire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_nav_admire.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_nav_admire_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_nav_admire_right.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_nav_bg_drawerlayout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_nav_bg_drawerlayout.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_nav_coin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_nav_coin.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_nav_collect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_nav_collect.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_nav_deedback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_nav_deedback.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_nav_exit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_nav_exit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_nav_homepage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_nav_homepage.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_nav_login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_nav_login.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_nav_scan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_nav_scan.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_shortcut_coin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_shortcut_coin.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_shortcut_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_shortcut_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_shortcut_send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_shortcut_send.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_uncollect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/ic_uncollect.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/icon_clear.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_coin_rank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/icon_coin_rank.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_film_play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/icon_film_play.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/icon_github.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_nav_night.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/icon_nav_night.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/icon_new.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_paste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/icon_paste.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_position.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/icon_position.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_share_article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/icon_share_article.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_share_wan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/icon_share_wan.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_tag_checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/icon_tag_checked.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_tag_hot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/icon_tag_hot.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_tag_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/icon_tag_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/img_default_book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/img_default_book.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/img_default_meizi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/img_default_meizi.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/img_default_movie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/img_default_movie.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/img_four_bi_three.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/img_four_bi_three.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/img_one_bi_one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/img_one_bi_one.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/img_transition_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/img_transition_default.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/img_two_bi_one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/img_two_bi_one.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/loading_everyday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/loading_everyday.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/loading_everyday_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/loading_everyday_red.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/loading_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/loading_image.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/stackblur_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/stackblur_default.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/titlebar_discover_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/titlebar_discover_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/titlebar_discover_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/titlebar_discover_prs.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/titlebar_discover_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/titlebar_discover_selected.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/titlebar_friends_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/titlebar_friends_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/titlebar_friends_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/titlebar_friends_prs.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/titlebar_friends_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/titlebar_friends_selected.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/titlebar_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/titlebar_menu.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/titlebar_music_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/titlebar_music_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/titlebar_music_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/titlebar_music_prs.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/titlebar_music_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/drawable-xxhdpi/titlebar_music_selected.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_frame_deep_gray.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <solid android:color="@color/colorChoosePress" /> 5 | <corners android:radius="2dp" /> 6 | <stroke 7 | android:width="1px" 8 | android:color="@color/colorSubtitle" /> 9 | 10 | 11 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_frame_gray.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <solid android:color="@color/color_page_bg" /> 5 | <corners android:radius="2dp" /> 6 | <stroke 7 | android:width="1px" 8 | android:color="@color/colorSubtitle" /> 9 | 10 | 11 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_save_big_image.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <solid android:color="#4c000000" /> 5 | 6 | <corners android:radius="3dp" /> 7 | 8 | <stroke 9 | android:width="1dp" 10 | android:color="#4cffffff" /> 11 | 12 | <padding 13 | android:bottom="7dp" 14 | android:left="20dp" 15 | android:right="20dp" 16 | android:top="7dp" /> 17 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/home_adjust_background.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <item android:state_pressed="false"> 4 | <shape> 5 | <stroke android:width="1dp" android:color="@color/colorTheme" /> 6 | 7 | <corners android:bottomLeftRadius="3dp" android:bottomRightRadius="3dp" android:topLeftRadius="3dp" android:topRightRadius="3dp" /> 8 | <padding android:bottom="6dp" android:left="12dp" android:right="12dp" android:top="6dp" /> 9 | </shape> 10 | </item> 11 | <item android:state_pressed="true"> 12 | <shape> 13 | <stroke android:width="1dp" android:color="@color/colorTheme" /> 14 | 15 | <corners android:bottomLeftRadius="3dp" android:bottomRightRadius="3dp" android:topLeftRadius="3dp" android:topRightRadius="3dp" /> 16 | <padding android:bottom="6dp" android:left="12dp" android:right="12dp" android:top="6dp" /> 17 | <solid android:color="@color/colorSmallRed" /> 18 | </shape> 19 | </item> 20 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/home_middle_day.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <item android:drawable="@drawable/home_icon_day" android:state_pressed="false" /> 4 | <item android:drawable="@drawable/home_icon_day_prs" android:state_pressed="true" /> 5 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/home_middle_fm.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <item android:drawable="@drawable/home_icon_fm" android:state_pressed="false" /> 4 | <item android:drawable="@drawable/home_icon_fm_prs" android:state_pressed="true" /> 5 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/home_middle_music.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <item android:drawable="@drawable/home_icon_music" android:state_pressed="false" /> 4 | <item android:drawable="@drawable/home_icon_music_prs" android:state_pressed="true" /> 5 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/home_middle_rank.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <item android:drawable="@drawable/home_icon_rank" android:state_pressed="false" /> 4 | <item android:drawable="@drawable/home_icon_rank_prs" android:state_pressed="true" /> 5 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/layer_splash.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <!-- 背景颜色 --> 4 | <item android:drawable="@color/colorTabBgDefault" /> 5 | 6 | <!-- <item android:bottom="50dp">--> 7 | <item> 8 | <!-- 图片 clip_horizontal 如果尺寸不一致,那么周围的填充色就是背景色--> 9 | <bitmap 10 | android:gravity="bottom" 11 | android:src="@drawable/img_transition_default" /> 12 | </item> 13 | </layer-list> -------------------------------------------------------------------------------- /app/src/main/res/drawable/process_bg.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 3 | 4 | <!-- 背景 gradient是渐变,corners定义的是圆角 --> 5 | <item android:id="@android:id/background"> 6 | <shape> 7 | <corners android:radius="10dp" /> 8 | 9 | <solid android:color="#00ffffff" /> 10 | </shape> 11 | </item> 12 | <!-- 第二条进度条颜色 --> 13 | <item android:id="@android:id/secondaryProgress"> 14 | <clip> 15 | <shape> 16 | <corners android:radius="10dip" /> 17 | 18 | <solid android:color="#00ffffff" /> 19 | </shape> 20 | </clip> 21 | </item> 22 | <!-- 进度条 --> 23 | <item android:id="@android:id/progress"> 24 | <clip> 25 | <shape> 26 | <corners android:radius="10dip" /> 27 | <gradient 28 | android:angle="180" 29 | android:endColor="#FFFFFF" 30 | android:startColor="#f00" /> 31 | </shape> 32 | </clip> 33 | </item> 34 | 35 | </layer-list> -------------------------------------------------------------------------------- /app/src/main/res/drawable/process_bg_webview.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 3 | 4 | <!-- 背景 gradient是渐变,corners定义的是圆角 --> 5 | <item android:id="@android:id/background"> 6 | <shape> 7 | <corners android:radius="10dp" /> 8 | 9 | <solid android:color="#00ffffff" /> 10 | </shape> 11 | </item> 12 | <!-- 第二条进度条颜色 --> 13 | <item android:id="@android:id/secondaryProgress"> 14 | <clip> 15 | <shape> 16 | <corners android:radius="10dip" /> 17 | 18 | <solid android:color="#00ffffff" /> 19 | </shape> 20 | </clip> 21 | </item> 22 | <!-- 进度条 --> 23 | <item android:id="@android:id/progress"> 24 | <clip> 25 | <shape> 26 | <corners android:radius="10dip" /> 27 | <gradient 28 | android:angle="180" 29 | android:endColor="#FFFFFF" 30 | android:startColor="@color/colorAccent" /> 31 | </shape> 32 | </clip> 33 | </item> 34 | 35 | </layer-list> -------------------------------------------------------------------------------- /app/src/main/res/drawable/progress_cirle.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <rotate xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:drawable="@drawable/loading_image" 4 | android:fromDegrees="0" 5 | android:pivotX="50%" 6 | android:pivotY="50%" 7 | android:toDegrees="360"> 8 | 9 | </rotate> -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_item_white_bg.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <item android:state_enabled="false"> 5 | <shape> 6 | <solid android:color="@color/color_sheet_bg" /> 7 | </shape> 8 | </item> 9 | <item android:state_pressed="true"> 10 | <shape> 11 | <solid android:color="@color/itemLowBackground" /> 12 | </shape> 13 | </item> 14 | <item android:state_pressed="false"> 15 | <shape> 16 | <solid android:color="@color/color_sheet_bg" /> 17 | </shape> 18 | </item> 19 | 20 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_joke_item_bg.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <item android:state_pressed="true"> 5 | <shape> 6 | <solid android:color="@color/itemLowBackground" /> 7 | </shape> 8 | </item> 9 | <item android:state_pressed="false"> 10 | <shape> 11 | <solid android:color="@color/colorWhite" /> 12 | </shape> 13 | </item> 14 | 15 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_one_item_bg.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <item android:state_enabled="false"> 5 | <shape> 6 | <solid android:color="@color/color_page_bg" /> 7 | </shape> 8 | </item> 9 | <item android:state_pressed="true"> 10 | <shape> 11 | <solid android:color="@color/itemLowBackground" /> 12 | </shape> 13 | </item> 14 | <item android:state_pressed="false"> 15 | <shape> 16 | <solid android:color="@color/color_page_bg" /> 17 | </shape> 18 | </item> 19 | 20 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_tab_bg.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <!--<item android:color="@color/colorWhite" android:state_selected="true" />--> 5 | 6 | <item android:state_enabled="false"> 7 | <shape> 8 | <solid android:color="@color/colorTabBgDefault" /> 9 | </shape> 10 | </item> 11 | <item android:state_pressed="true"> 12 | <shape> 13 | <solid android:color="@color/itemLowBackground" /> 14 | </shape> 15 | </item> 16 | <item android:state_pressed="false"> 17 | <shape> 18 | <solid android:color="@color/colorTabBgDefault" /> 19 | </shape> 20 | </item> 21 | 22 | 23 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/select_gank_custom.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <item android:drawable="@drawable/bg_frame_deep_gray" android:state_pressed="true" /> 5 | <item android:drawable="@drawable/bg_frame_gray" /> 6 | 7 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/select_navi_bg.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <item android:drawable="@color/colorTransparent" android:state_selected="true" /> 5 | <item android:drawable="@color/colorNaviBg" /> 6 | 7 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/select_one_header.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <item android:drawable="@color/colorItemBackground" android:state_pressed="true" /> 5 | <item android:drawable="@color/colorWhite" /> 6 | 7 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_bg_tag.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <item android:drawable="@drawable/shape_bg_tag_selected" android:state_checked="true" /> 5 | <item android:drawable="@drawable/shape_bg_tag_selected" android:state_selected="true" /> 6 | <item android:drawable="@drawable/shape_bg_tag_selected" android:state_pressed="true" /> 7 | <item android:drawable="@drawable/shape_bg_tag_normal" /> 8 | 9 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_bg_tag_no_check.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <item android:drawable="@drawable/shape_bg_tag_selected" android:state_pressed="true" /> 5 | <item android:drawable="@drawable/shape_bg_tag_normal" /> 6 | 7 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_bg_tree_tag.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <item android:state_pressed="false"> 4 | <shape android:shape="rectangle"> 5 | <solid android:color="@color/color_page_bg" /> 6 | <corners android:radius="15dp" /> 7 | <padding android:bottom="7dp" android:left="16dp" android:right="16dp" android:top="7dp" /> 8 | </shape> 9 | </item> 10 | <item android:state_pressed="true"> 11 | <shape> 12 | <corners android:radius="15dp" /> 13 | <padding android:bottom="7dp" android:left="16dp" android:right="16dp" android:top="7dp" /> 14 | <solid android:color="@color/colorSmallRed" /> 15 | </shape> 16 | </item> 17 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_collect_check.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <item android:drawable="@drawable/ic_collected" android:state_checked="true" /> 5 | <item android:drawable="@drawable/ic_uncollect" /> 6 | 7 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_banner_select.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:shape="rectangle"> 4 | <solid android:color="@color/colorBannerSelect" /> 5 | <corners android:radius="20dp" /> 6 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_banner_unselect.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:shape="rectangle"> 4 | <solid android:color="@color/colorBannerUnSelect" /> 5 | <corners android:radius="20dp" /> 6 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_bg_level.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <solid android:color="@color/colorTransparent" /> 5 | <stroke 6 | android:width="1dp" 7 | android:color="#bfff" /> 8 | <corners android:radius="22dp" /> 9 | 10 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_bg_loading.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <solid android:color="@color/colorLine" /> 5 | 6 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_bg_login.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <solid android:color="@color/colorTransparent" /> 5 | <stroke 6 | android:width="1dp" 7 | android:color="#bfff" /> 8 | <corners android:radius="2dp" /> 9 | 10 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_bg_publish.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:shape="rectangle"> 4 | 5 | <corners android:radius="60dp" /> 6 | 7 | <gradient 8 | android:endColor="#ccce3d3a" 9 | android:startColor="#ccce3d3a" /> 10 | 11 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_bg_tag_normal.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:shape="rectangle"> 4 | 5 | <solid android:color="@color/color_page_bg" /> 6 | <corners android:radius="15dp" /> 7 | <padding android:bottom="7dp" android:left="16dp" android:right="16dp" android:top="7dp" /> 8 | 9 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_bg_tag_selected.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:shape="rectangle"> 4 | 5 | <corners android:radius="15dp" /> 6 | <gradient 7 | android:endColor="#eece3d3a" 8 | android:startColor="#77ce3d3a" /> 9 | <padding 10 | android:bottom="7dp" 11 | android:left="16dp" 12 | android:right="16dp" 13 | android:top="7dp" /> 14 | 15 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_detail_mask.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <gradient 4 | android:angle="270" 5 | android:endColor="#80000000" 6 | android:startColor="#0eeeeeee" /> 7 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_edit_cursor.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 3 | <size android:width="1dp" /> 4 | <solid android:color="@color/colorWhiteHalf" /> 5 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_edit_line.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <item 4 | android:id="@+id/shape" 5 | android:bottom="1dp" 6 | android:left="-10dp" 7 | android:right="-10dp" 8 | android:top="-10dp"> 9 | <shape> 10 | <solid android:color="@android:color/transparent" /> 11 | <stroke 12 | android:width="1dp" 13 | android:color="#aaffffff" /> 14 | </shape> 15 | </item> 16 | </layer-list> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_line.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <size android:height="1px"/> 4 | <solid android:color="@color/colorHomeLine"/> 5 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_no_read.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:shape="oval"> 4 | 5 | <solid android:color="@color/colorTheme" /> 6 | 7 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_notclickbg.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape android:shape="rectangle" 3 | xmlns:android="http://schemas.android.com/apk/res/android"> 4 | <solid android:color="@color/text_deed_bg" /> 5 | <stroke android:width="1.0px" android:color="#ffb1b1b1" /> 6 | <corners android:radius="4.0dip" /> 7 | </shape> 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_remove.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <size android:height="1px"/> 4 | <solid android:color="@color/colorTransparent"/> 5 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_ripple_tag_bg.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:shape="rectangle" > 4 | 5 | <corners android:radius="100dp" /> 6 | 7 | <solid android:color="@color/color_tree_tab_bg" /> 8 | 9 | 10 | <padding 11 | android:bottom="5dp" 12 | android:left="15dp" 13 | android:right="15dp" 14 | android:top="5dp" /> 15 | 16 | 17 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_tab_indicator.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layer-list xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:shape="rectangle"> 4 | 5 | <item android:gravity="center"> 6 | <shape> 7 | 8 | <size 9 | android:width="30dp" 10 | android:height="2dp" /> 11 | 12 | <corners android:radius="1dp" /> 13 | 14 | <solid android:color="@color/colorTheme" /> 15 | 16 | </shape> 17 | </item> 18 | 19 | </layer-list> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_transparent.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <size android:height="1px"/> 4 | <solid android:color="#00ffffff"/> 5 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_tree_tag.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:shape="rectangle" > 4 | 5 | <corners android:radius="3dp" /> 6 | 7 | <solid android:color="#F5F5F5" /> 8 | 9 | 10 | <padding 11 | android:bottom="5dp" 12 | android:left="10dp" 13 | android:right="10dp" 14 | android:top="5dp" /> 15 | 16 | 17 | <stroke 18 | android:width="1dp" 19 | android:color="@color/colorTheme" /> 20 | 21 | </shape> -------------------------------------------------------------------------------- /app/src/main/res/drawable/titlebar_disco.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <item android:drawable="@drawable/titlebar_discover_selected" android:state_selected="true" /> 4 | <item android:drawable="@drawable/titlebar_discover_normal" android:state_selected="false" /> 5 | <item android:drawable="@drawable/titlebar_discover_normal" android:state_pressed="false" /> 6 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/titlebar_friends.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <item android:drawable="@drawable/titlebar_friends_selected" android:state_selected="true"/> 4 | <item android:drawable="@drawable/titlebar_friends_normal" android:state_selected="false"/> 5 | <item android:drawable="@drawable/titlebar_friends_normal" android:state_pressed="false"/> 6 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/drawable/titlebar_music.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <item android:drawable="@drawable/titlebar_music_selected" android:state_selected="true"/> 4 | <item android:drawable="@drawable/titlebar_music_normal" android:state_selected="false"/> 5 | <item android:drawable="@drawable/titlebar_music_normal" android:state_pressed="false"/> 6 | </selector> -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_douban_top.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <me.jingbin.library.ByRecyclerView 5 | android:id="@+id/xrv_top" 6 | android:layout_width="match_parent" 7 | android:layout_height="wrap_content" 8 | android:scrollbarSize="4dp" 9 | android:scrollbarThumbVertical="@color/tabBackground" 10 | android:scrollbars="vertical" /> 11 | 12 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <androidx.drawerlayout.widget.DrawerLayout xmlns:app="http://schemas.android.com/apk/res-auto" 5 | xmlns:tools="http://schemas.android.com/tools" 6 | android:id="@+id/drawer_layout" 7 | android:layout_width="match_parent" 8 | android:layout_height="match_parent" 9 | android:fitsSystemWindows="true" 10 | tools:context=".ui.MainActivity"> 11 | 12 | <include 13 | android:id="@+id/include" 14 | layout="@layout/app_bar_main" 15 | android:layout_width="match_parent" 16 | android:layout_height="match_parent" /> 17 | 18 | <!--去掉background,会影响4.4系统的状态栏--> 19 | <com.google.android.material.navigation.NavigationView 20 | android:id="@+id/nav_view" 21 | android:layout_width="match_parent" 22 | android:layout_height="match_parent" 23 | android:layout_gravity="start" 24 | android:background="@color/color_page_bg" 25 | android:fitsSystemWindows="true" /> 26 | 27 | <!--app:headerLayout="@layout/nav_header_main"--> 28 | <!--app:menu="@menu/activity_main_drawer"--> 29 | </androidx.drawerlayout.widget.DrawerLayout> 30 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_my_collect.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto" 5 | android:layout_width="match_parent" 6 | android:layout_height="match_parent" 7 | android:orientation="vertical"> 8 | 9 | <com.google.android.material.tabs.TabLayout 10 | android:id="@+id/tab_my_collect" 11 | android:layout_width="match_parent" 12 | android:layout_height="38dp" 13 | android:background="@color/color_sheet_bg" 14 | app:layout_constraintStart_toStartOf="parent" 15 | app:layout_constraintTop_toTopOf="parent" 16 | app:tabBackground="?android:attr/selectableItemBackground" 17 | app:tabIndicatorColor="@color/colorTheme" 18 | app:tabMode="scrollable" 19 | app:tabSelectedTextColor="@color/colorTheme" 20 | app:tabTextColor="@color/colorTabText" /> 21 | 22 | <View 23 | android:id="@+id/view_line" 24 | android:layout_width="match_parent" 25 | android:layout_height="1px" 26 | android:background="@color/colorHomeLine" 27 | app:layout_constraintTop_toBottomOf="@+id/tab_my_collect" /> 28 | 29 | <com.example.jingbin.cloudreader.view.ViewPagerFixed 30 | android:id="@+id/vp_my_collect" 31 | android:layout_width="match_parent" 32 | android:layout_height="0dp" 33 | app:layout_constraintBottom_toBottomOf="parent" 34 | app:layout_constraintTop_toBottomOf="@+id/view_line" /> 35 | 36 | </androidx.constraintlayout.widget.ConstraintLayout> 37 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_view_big_image.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:layout_width="match_parent" 4 | android:layout_height="match_parent" 5 | android:background="#000000"> 6 | 7 | <com.example.jingbin.cloudreader.view.viewbigimage.HackyViewPager 8 | android:id="@+id/very_image_viewpager" 9 | android:layout_width="match_parent" 10 | android:layout_height="match_parent" /> 11 | 12 | <TextView 13 | android:id="@+id/very_image_viewpager_text" 14 | android:layout_width="wrap_content" 15 | android:layout_height="wrap_content" 16 | android:layout_alignParentBottom="true" 17 | android:layout_centerHorizontal="true" 18 | android:layout_marginBottom="25dp" 19 | android:textColor="#fff" 20 | android:textSize="14sp" /> 21 | 22 | <TextView 23 | android:id="@+id/tv_save_big_image" 24 | android:layout_width="wrap_content" 25 | android:layout_height="wrap_content" 26 | android:layout_alignParentBottom="true" 27 | android:layout_alignParentRight="true" 28 | android:layout_marginBottom="17dp" 29 | android:layout_marginRight="13dp" 30 | android:background="@drawable/bg_save_big_image" 31 | android:text="保存" 32 | android:textColor="#fff" 33 | android:textSize="13sp" /> 34 | 35 | </RelativeLayout> -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_web_view.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:tools="http://schemas.android.com/tools" 4 | android:layout_width="match_parent" 5 | android:layout_height="match_parent" 6 | android:id="@+id/ll_webview" 7 | android:orientation="vertical" 8 | tools:context="com.example.jingbin.cloudreader.ui.WebViewActivity"> 9 | 10 | <androidx.appcompat.widget.Toolbar xmlns:app="http://schemas.android.com/apk/res-auto" 11 | android:id="@+id/title_tool_bar" 12 | android:layout_width="match_parent" 13 | android:layout_height="?attr/actionBarSize" 14 | android:background="@color/colorToolBar" 15 | app:contentInsetStartWithNavigation="0dp" 16 | app:layout_scrollFlags="enterAlways|scroll" 17 | app:navigationContentDescription="返回" 18 | app:navigationIcon="@drawable/icon_back" 19 | app:popupTheme="@style/ThemeOverlay.AppCompat.ActionBar" 20 | app:theme="@style/ToolbarStyle" 21 | app:titleMarginStart="0dp"> 22 | 23 | <TextView 24 | android:id="@+id/tv_gun_title" 25 | android:layout_width="match_parent" 26 | android:layout_height="wrap_content" 27 | android:ellipsize="marquee" 28 | android:singleLine="true" 29 | android:textColor="@color/colorWhite" 30 | android:textSize="18sp" 31 | android:visibility="visible" 32 | tools:text="@string/app_name" /> 33 | 34 | </androidx.appcompat.widget.Toolbar> 35 | 36 | </LinearLayout> 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/base_header_title_bar.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto" 5 | android:id="@+id/rl_base_titlebar" 6 | android:layout_width="match_parent" 7 | android:layout_height="wrap_content" 8 | android:background="@android:color/transparent"> 9 | 10 | <ImageView 11 | android:id="@+id/iv_base_titlebar_bg" 12 | android:layout_width="match_parent" 13 | android:layout_height="310dp" 14 | android:scaleType="fitXY" /> 15 | 16 | <androidx.appcompat.widget.Toolbar 17 | android:id="@+id/tb_base_title" 18 | android:layout_width="match_parent" 19 | android:layout_height="?attr/actionBarSize" 20 | android:background="@color/colorTransparent" 21 | app:contentInsetStart="0.0dp" 22 | app:contentInsetStartWithNavigation="0dp" 23 | app:layout_scrollFlags="enterAlways|scroll" 24 | app:popupTheme="@style/ThemeOverlay.AppCompat.ActionBar" 25 | app:subtitleTextAppearance="@style/Toolbar.SubTitle" 26 | app:theme="@style/ToolbarStyle" 27 | app:titleMarginStart="0dp" 28 | app:titleTextAppearance="@style/ToolBar.Title"> 29 | 30 | </androidx.appcompat.widget.Toolbar> 31 | 32 | </RelativeLayout> 33 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/content_base.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto" 4 | xmlns:tools="http://schemas.android.com/tools" 5 | android:id="@+id/content_base" 6 | android:layout_width="match_parent" 7 | android:layout_height="match_parent" 8 | android:paddingBottom="@dimen/activity_vertical_margin" 9 | android:paddingLeft="@dimen/activity_horizontal_margin" 10 | android:paddingRight="@dimen/activity_horizontal_margin" 11 | android:paddingTop="@dimen/activity_vertical_margin" 12 | app:layout_behavior="@string/appbar_scrolling_view_behavior" 13 | tools:context="me.jingbin.bymvvm.base.BaseActivity" 14 | tools:showIn="@layout/activity_base"> 15 | 16 | </RelativeLayout> 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_main.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <RelativeLayout 3 | xmlns:android="http://schemas.android.com/apk/res/android" 4 | xmlns:tools="http://schemas.android.com/tools" 5 | xmlns:app="http://schemas.android.com/apk/res-auto" 6 | android:id="@+id/content_main" 7 | android:layout_width="match_parent" 8 | android:layout_height="match_parent" 9 | android:paddingLeft="@dimen/activity_horizontal_margin" 10 | android:paddingRight="@dimen/activity_horizontal_margin" 11 | android:paddingTop="@dimen/activity_vertical_margin" 12 | android:paddingBottom="@dimen/activity_vertical_margin" 13 | app:layout_behavior="@string/appbar_scrolling_view_behavior" 14 | tools:showIn="@layout/app_bar_main" 15 | tools:context="com.example.jingbin.cloudreader.ui.MainActivity"> 16 | 17 | <TextView 18 | android:layout_width="wrap_content" 19 | android:layout_height="wrap_content" 20 | android:text="Hello World!" /> 21 | </RelativeLayout> 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_eidt_url.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:layout_width="match_parent" 4 | android:layout_height="match_parent" 5 | android:orientation="vertical"> 6 | 7 | <androidx.appcompat.widget.AppCompatEditText 8 | android:id="@+id/et_name" 9 | android:layout_width="match_parent" 10 | android:layout_height="wrap_content" 11 | android:layout_marginLeft="20dp" 12 | android:layout_marginRight="20dp" 13 | android:hint="请输入标题" 14 | android:textSize="14sp" /> 15 | 16 | <androidx.appcompat.widget.AppCompatEditText 17 | android:id="@+id/et_link" 18 | android:layout_width="match_parent" 19 | android:layout_height="wrap_content" 20 | android:layout_marginLeft="20dp" 21 | android:layout_marginRight="20dp" 22 | android:hint="请输入链接" 23 | android:textSize="14sp" /> 24 | </LinearLayout> -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_android.xml: -------------------------------------------------------------------------------- 1 | <layout xmlns:android="http://schemas.android.com/apk/res/android"> 2 | 3 | <FrameLayout xmlns:tools="http://schemas.android.com/tools" 4 | android:layout_width="match_parent" 5 | android:layout_height="match_parent" 6 | tools:context="com.example.jingbin.cloudreader.ui.gank.child.AndroidFragment"> 7 | 8 | <me.jingbin.library.ByRecyclerView 9 | android:id="@+id/xrv_android" 10 | android:layout_width="match_parent" 11 | android:layout_height="match_parent" 12 | android:scrollbars="vertical" 13 | tools:itemCount="5" 14 | tools:layoutManager="LinearLayoutManager" 15 | tools:listitem="@layout/item_android" /> 16 | 17 | </FrameLayout> 18 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_category_article.xml: -------------------------------------------------------------------------------- 1 | <layout xmlns:android="http://schemas.android.com/apk/res/android" 2 | xmlns:app="http://schemas.android.com/apk/res-auto" 3 | xmlns:tools="http://schemas.android.com/tools"> 4 | 5 | <me.jingbin.library.ByRecyclerView 6 | android:id="@+id/recyclerView" 7 | android:layout_width="match_parent" 8 | android:layout_height="match_parent" 9 | android:scrollbarSize="4dp" 10 | android:scrollbarThumbVertical="@color/tabBackground" 11 | android:scrollbars="vertical" 12 | tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" 13 | tools:listitem="@layout/item_category_article" 14 | tools:orientation="vertical" /> 15 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto" 5 | android:layout_width="match_parent" 6 | android:layout_height="match_parent" 7 | android:orientation="vertical"> 8 | 9 | <com.google.android.material.tabs.TabLayout 10 | android:id="@+id/tab_gank" 11 | style="@style/tabLayoutStyle" 12 | app:layout_constraintStart_toStartOf="parent" 13 | app:layout_constraintTop_toTopOf="parent" 14 | app:tabGravity="fill" 15 | app:tabMaxWidth="0dp" /> 16 | 17 | <View 18 | android:id="@+id/line" 19 | android:layout_width="match_parent" 20 | android:layout_height="1px" 21 | android:background="@color/colorHomeLine" 22 | app:layout_constraintTop_toBottomOf="@+id/tab_gank" /> 23 | 24 | <com.example.jingbin.cloudreader.view.ViewPagerFixed 25 | android:id="@+id/vp_gank" 26 | android:layout_width="match_parent" 27 | android:layout_height="wrap_content" 28 | app:layout_constrainedHeight="true" 29 | app:layout_constraintBottom_toBottomOf="parent" 30 | app:layout_constraintTop_toBottomOf="@+id/line" /> 31 | 32 | </androidx.constraintlayout.widget.ConstraintLayout> 33 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_navi.xml: -------------------------------------------------------------------------------- 1 | <layout xmlns:android="http://schemas.android.com/apk/res/android" 2 | xmlns:app="http://schemas.android.com/apk/res-auto" 3 | xmlns:tools="http://schemas.android.com/tools"> 4 | 5 | <androidx.constraintlayout.widget.ConstraintLayout 6 | android:layout_width="match_parent" 7 | android:layout_height="match_parent" 8 | android:orientation="horizontal"> 9 | 10 | <!--滑动置顶边距只支持paddingLeft,不然会显示屏幕等宽--> 11 | <me.jingbin.library.ByRecyclerView 12 | android:id="@+id/xrv_navi_detail" 13 | android:layout_width="match_parent" 14 | android:layout_height="match_parent" 15 | android:paddingLeft="100dp" 16 | android:scrollbars="vertical" 17 | app:layoutManager="GridLayoutManager" 18 | app:layout_constraintEnd_toEndOf="parent" 19 | app:layout_constraintStart_toStartOf="parent" 20 | app:spanCount="3" 21 | tools:listitem="@layout/item_navigation_content" /> 22 | 23 | <androidx.recyclerview.widget.RecyclerView 24 | android:id="@+id/xrv_navi" 25 | android:layout_width="100dp" 26 | android:layout_height="match_parent" 27 | android:scrollbars="none" 28 | app:layout_constraintStart_toStartOf="parent" 29 | app:layout_constraintTop_toTopOf="parent" 30 | tools:listitem="@layout/item_navigation" /> 31 | 32 | </androidx.constraintlayout.widget.ConstraintLayout> 33 | 34 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_one.xml: -------------------------------------------------------------------------------- 1 | <layout xmlns:android="http://schemas.android.com/apk/res/android" 2 | xmlns:app="http://schemas.android.com/apk/res-auto"> 3 | 4 | <data> 5 | 6 | <variable 7 | name="recyclerAdapter" 8 | type="com.example.jingbin.cloudreader.adapter.OneAdapter" /> 9 | 10 | <variable 11 | name="viewmodel" 12 | type="com.example.jingbin.cloudreader.viewmodel.movie.OneViewModel" /> 13 | </data> 14 | 15 | <!--为了出现下拉阴影效果(加了上面的控件后就没有了)--> 16 | <FrameLayout 17 | android:id="@+id/frameLayout" 18 | android:layout_width="match_parent" 19 | android:layout_height="match_parent" 20 | android:scrollbarSize="4dp" 21 | android:scrollbarThumbVertical="@color/tabBackground" 22 | android:scrollbars="vertical" 23 | app:layout_behavior="@string/appbar_scrolling_view_behavior"> 24 | 25 | <me.jingbin.library.ByRecyclerView 26 | android:id="@+id/list_one" 27 | android:layout_width="match_parent" 28 | android:layout_height="wrap_content" 29 | android:orientation="vertical" /> 30 | </FrameLayout> 31 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_wan_android.xml: -------------------------------------------------------------------------------- 1 | <layout xmlns:android="http://schemas.android.com/apk/res/android" 2 | xmlns:app="http://schemas.android.com/apk/res-auto"> 3 | 4 | <androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:tools="http://schemas.android.com/tools" 5 | android:id="@+id/srl_wan" 6 | android:layout_width="match_parent" 7 | android:layout_height="match_parent"> 8 | 9 | <me.jingbin.library.ByRecyclerView 10 | android:id="@+id/xrv_wan" 11 | android:layout_width="match_parent" 12 | android:layout_height="match_parent" 13 | android:scrollbars="vertical" 14 | tools:itemCount="5" 15 | tools:layoutManager="LinearLayoutManager" 16 | tools:listitem="@layout/item_wan_android" /> 17 | 18 | </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> 19 | 20 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_wan_find.xml: -------------------------------------------------------------------------------- 1 | <layout xmlns:android="http://schemas.android.com/apk/res/android" 2 | xmlns:app="http://schemas.android.com/apk/res-auto" 3 | xmlns:tools="http://schemas.android.com/tools"> 4 | 5 | <androidx.constraintlayout.widget.ConstraintLayout 6 | android:layout_width="match_parent" 7 | android:layout_height="match_parent" 8 | android:orientation="horizontal"> 9 | 10 | <androidx.recyclerview.widget.RecyclerView 11 | android:id="@+id/rv_wxarticle" 12 | android:layout_width="80dp" 13 | android:layout_height="match_parent" 14 | android:layout_marginStart="10dp" 15 | android:layout_marginEnd="10dp" 16 | android:scrollbars="none" 17 | app:layout_constraintStart_toStartOf="parent" 18 | app:layout_constraintTop_toTopOf="parent" /> 19 | 20 | <me.jingbin.library.ByRecyclerView 21 | android:id="@+id/recyclerView" 22 | android:layout_width="0dp" 23 | android:layout_height="0dp" 24 | android:layout_marginStart="10dp" 25 | android:scrollbars="vertical" 26 | app:layout_constraintBottom_toBottomOf="parent" 27 | app:layout_constraintLeft_toRightOf="@+id/rv_wxarticle" 28 | app:layout_constraintRight_toRightOf="parent" 29 | app:layout_constraintTop_toTopOf="parent" 30 | tools:layoutManager="LinearLayoutManager" 31 | tools:listitem="@layout/item_wan_android" /> 32 | 33 | </androidx.constraintlayout.widget.ConstraintLayout> 34 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_welfare.xml: -------------------------------------------------------------------------------- 1 | <layout xmlns:android="http://schemas.android.com/apk/res/android" 2 | xmlns:app="http://schemas.android.com/apk/res-auto"> 3 | 4 | <FrameLayout xmlns:tools="http://schemas.android.com/tools" 5 | android:layout_width="match_parent" 6 | android:layout_height="match_parent" 7 | tools:context="com.example.jingbin.cloudreader.ui.gank.child.WelfareFragment"> 8 | 9 | <me.jingbin.library.ByRecyclerView 10 | android:id="@+id/xrv_welfare" 11 | android:layout_width="match_parent" 12 | android:layout_height="wrap_content" 13 | android:scrollbarSize="4dp" 14 | android:scrollbarThumbVertical="@color/tabBackground" 15 | android:scrollbars="vertical" 16 | tools:itemCount="6" 17 | tools:layoutManager="StaggeredGridLayoutManager" 18 | tools:listitem="@layout/item_welfare" 19 | tools:spanCount="2" /> 20 | 21 | </FrameLayout> 22 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/header_coin_detail.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto" 4 | xmlns:tools="http://schemas.android.com/tools"> 5 | 6 | <TextView 7 | android:id="@+id/tv_header_coin" 8 | android:layout_width="match_parent" 9 | android:layout_height="100dp" 10 | android:gravity="center" 11 | android:textColor="@color/colorTheme" 12 | android:textSize="@dimen/sp_30" 13 | app:layout_constraintStart_toStartOf="parent" 14 | app:layout_constraintTop_toTopOf="parent" 15 | tools:text="1120" /> 16 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/header_item_everyday.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:tools="http://schemas.android.com/tools"> 4 | 5 | <LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto" 6 | android:layout_width="match_parent" 7 | android:layout_height="wrap_content" 8 | android:orientation="vertical"> 9 | 10 | <me.jingbin.banner.ByBannerView 11 | android:id="@+id/banner" 12 | android:layout_width="match_parent" 13 | android:layout_height="145dp" 14 | app:delay_time="4000" 15 | app:indicator_drawable_selected="@drawable/shape_banner_select" 16 | app:indicator_drawable_unselected="@drawable/shape_banner_unselect" 17 | app:indicator_height="2dp" 18 | app:indicator_margin="6dp" 19 | app:indicator_padding="2dp" 20 | app:indicator_width="8dp" 21 | app:is_auto_play="true" 22 | app:is_back_loop="false" 23 | tools:background="@color/colorNaviBg" /> 24 | 25 | <include 26 | android:id="@+id/include_everyday" 27 | layout="@layout/home_middle_layout" /> 28 | 29 | </LinearLayout> 30 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/header_item_tree.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <RelativeLayout 5 | android:layout_width="match_parent" 6 | android:layout_height="wrap_content" 7 | android:orientation="vertical"> 8 | 9 | <TextView 10 | android:id="@+id/tv_position" 11 | android:layout_width="wrap_content" 12 | android:layout_height="wrap_content" 13 | android:layout_alignParentRight="true" 14 | android:layout_marginTop="8dp" 15 | android:layout_marginRight="8dp" 16 | android:background="?android:attr/selectableItemBackground" 17 | android:drawableLeft="@drawable/icon_position" 18 | android:drawablePadding="3dp" 19 | android:gravity="center_vertical" 20 | android:paddingLeft="3dp" 21 | android:paddingTop="7dp" 22 | android:paddingRight="3dp" 23 | android:paddingBottom="7dp" 24 | android:text="发现页内容订制" 25 | android:textSize="13sp" /> 26 | 27 | </RelativeLayout> 28 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/header_layout.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:orientation="vertical" 4 | android:layout_width="match_parent" 5 | android:layout_height="match_parent"> 6 | <ImageView 7 | android:src="@drawable/homepage_header" 8 | android:layout_width="match_parent" 9 | android:layout_height="wrap_content" 10 | android:scaleType="centerCrop" 11 | android:visibility="visible" 12 | /> 13 | </LinearLayout> -------------------------------------------------------------------------------- /app/src/main/res/layout/item_banner_wanandroid.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:tools="http://schemas.android.com/tools" 4 | android:layout_width="match_parent" 5 | android:layout_height="match_parent"> 6 | 7 | <ImageView 8 | android:id="@+id/iv_banner" 9 | android:layout_width="match_parent" 10 | android:layout_height="200dp" 11 | android:gravity="center" 12 | android:scaleType="centerCrop" 13 | tools:background="@color/color_page_bg" /> 14 | 15 | <View 16 | android:id="@+id/view_mask" 17 | android:layout_width="match_parent" 18 | android:layout_height="200dp" 19 | android:background="@color/colorBannerMask" /> 20 | </RelativeLayout> -------------------------------------------------------------------------------- /app/src/main/res/layout/item_collect_link.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto" 4 | xmlns:tools="http://schemas.android.com/tools"> 5 | 6 | <data> 7 | 8 | <variable 9 | name="adapter" 10 | type="com.example.jingbin.cloudreader.adapter.CollectUrlAdapter" /> 11 | 12 | <variable 13 | name="bean" 14 | type="com.example.jingbin.cloudreader.bean.CollectUrlBean.DataBean" /> 15 | 16 | <import type="android.text.Html" /> 17 | 18 | <import type="android.text.TextUtils" /> 19 | 20 | <import type="android.view.View" /> 21 | </data> 22 | 23 | <androidx.constraintlayout.widget.ConstraintLayout 24 | android:id="@+id/rl_item_link" 25 | android:layout_width="match_parent" 26 | android:layout_height="wrap_content" 27 | android:background="?attr/selectableItemBackground" 28 | android:onClick="@{()->adapter.openDetail(bean)}" 29 | android:padding="10dp"> 30 | 31 | <TextView 32 | android:id="@+id/tv_title" 33 | android:layout_width="wrap_content" 34 | android:layout_height="wrap_content" 35 | android:ellipsize="end" 36 | android:lineSpacingExtra="1.6dp" 37 | android:maxLines="2" 38 | android:text="@{Html.fromHtml(bean.name)}" 39 | android:textColor="@color/colorContent" 40 | app:layout_constraintStart_toStartOf="parent" 41 | app:layout_constraintTop_toTopOf="parent" 42 | tools:text="MMKV——基于 mmap 的高性能通用 key-value 组件MMKV——基于 mmap 的高性能通用 key-value 组件" /> 43 | 44 | </androidx.constraintlayout.widget.ConstraintLayout> 45 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/item_everyday_one.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <LinearLayout 5 | android:id="@+id/ll_one_photo" 6 | android:layout_width="match_parent" 7 | android:layout_height="wrap_content" 8 | android:layout_marginBottom="10dp" 9 | android:orientation="vertical"> 10 | 11 | <View 12 | android:id="@+id/ll_one_photo_line" 13 | android:layout_width="match_parent" 14 | android:layout_height="12dp" 15 | android:visibility="gone" /> 16 | 17 | <ImageView 18 | android:id="@+id/iv_one_photo" 19 | android:layout_width="match_parent" 20 | android:layout_height="127dp" 21 | android:scaleType="fitXY" /> 22 | 23 | <TextView 24 | android:id="@+id/tv_one_photo_title" 25 | android:layout_width="match_parent" 26 | android:layout_height="wrap_content" 27 | android:layout_marginTop="3dp" 28 | android:ellipsize="end" 29 | android:maxLines="2" 30 | android:paddingLeft="4dp" 31 | android:paddingRight="4dp" 32 | android:text="" 33 | android:textColor="@color/colorContent" 34 | android:textSize="12sp" /> 35 | 36 | </LinearLayout> 37 | 38 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/item_film_detail_image.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:bind="http://schemas.android.com/apk/res-auto"> 4 | 5 | 6 | <data> 7 | 8 | <variable 9 | name="bean" 10 | type="java.lang.String" /> 11 | </data> 12 | 13 | <RelativeLayout 14 | android:layout_width="wrap_content" 15 | android:layout_height="wrap_content"> 16 | 17 | <ImageView 18 | android:id="@+id/iv_image" 19 | android:layout_width="140dp" 20 | android:layout_height="100dp" 21 | android:layout_marginRight="10dp" 22 | android:imageWidthDp="@{140}" 23 | android:imageHeightDp="@{100}" 24 | android:imageUrl='@{bean}' 25 | android:scaleType="centerCrop" /> 26 | 27 | </RelativeLayout> 28 | </layout> 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_navigation_content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto" 4 | xmlns:tools="http://schemas.android.com/tools"> 5 | 6 | <data> 7 | 8 | <variable 9 | name="bean" 10 | type="com.example.jingbin.cloudreader.bean.wanandroid.ArticlesBean" /> 11 | 12 | <import type="android.text.Html" /> 13 | </data> 14 | 15 | <TextView 16 | android:id="@+id/tv_navi_tag" 17 | android:layout_width="match_parent" 18 | android:layout_height="wrap_content" 19 | android:background="?attr/selectableItemBackground" 20 | android:gravity="center" 21 | android:paddingLeft="12dp" 22 | android:paddingTop="@dimen/dp_10" 23 | android:paddingRight="12dp" 24 | android:paddingBottom="@dimen/dp_10" 25 | android:text="@{Html.fromHtml(bean.title)}" 26 | android:textSize="13sp" 27 | tools:text="title" /> 28 | 29 | 30 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/item_welfare.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:tools="http://schemas.android.com/tools"> 4 | 5 | <data> 6 | 7 | <import type="android.view.View" /> 8 | 9 | <variable 10 | name="bean" 11 | type="com.example.jingbin.cloudreader.bean.GankIoDataBean.ResultBean" /> 12 | 13 | </data> 14 | 15 | <RelativeLayout 16 | android:layout_width="match_parent" 17 | android:layout_height="wrap_content"> 18 | 19 | <ImageView 20 | android:id="@+id/iv_welfare" 21 | android:layout_width="match_parent" 22 | android:layout_height="250dp" 23 | android:defaultPicType="@{1}" 24 | android:displayFadeImage="@{bean.url}" 25 | android:scaleType="centerCrop" 26 | tools:background="@color/tabBackground" 27 | tools:layout_margin="5dp" /> 28 | 29 | <View 30 | android:id="@+id/view_mask" 31 | android:layout_width="match_parent" 32 | android:layout_height="250dp" 33 | android:background="@color/colorBannerMask" /> 34 | </RelativeLayout> 35 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_knowledge_tag.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <TextView xmlns:tools="http://schemas.android.com/tools" 5 | android:id="@+id/tv_tag" 6 | android:layout_width="wrap_content" 7 | android:layout_height="wrap_content" 8 | android:background="@drawable/selector_bg_tag" 9 | android:textColor="@color/select_navi_text" 10 | android:textSize="13sp" 11 | tools:text="title" /> 12 | 13 | </layout> -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_navi_tag.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | 3 | <TextView xmlns:android="http://schemas.android.com/apk/res/android" 4 | xmlns:tools="http://schemas.android.com/tools" 5 | android:id="@+id/tv_navi_tag" 6 | android:layout_width="wrap_content" 7 | android:layout_height="wrap_content" 8 | android:background="@drawable/shape_ripple_tag_bg" 9 | android:textSize="13sp" 10 | tools:text="title" /> -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_tree_tag.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <TextView xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:tools="http://schemas.android.com/tools" 4 | android:id="@+id/tv_tag" 5 | android:layout_width="wrap_content" 6 | android:layout_height="wrap_content" 7 | android:layout_margin="4dp" 8 | android:background="@drawable/shape_ripple_tag_bg" 9 | android:textSize="13sp" 10 | tools:text="title" /> -------------------------------------------------------------------------------- /app/src/main/res/layout/sliding_view_bg.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:layout_width="match_parent" 4 | android:layout_height="match_parent" 5 | android:background="@color/color_page_bg" 6 | android:orientation="vertical"> 7 | 8 | <TextView 9 | android:layout_width="match_parent" 10 | android:layout_height="wrap_content" 11 | android:gravity="center" 12 | android:padding="12dp" 13 | android:text="豆瓣api请求限制 40次/分" 14 | android:textColor="@color/colorContent" 15 | android:textSize="12sp" /> 16 | 17 | <TextView 18 | android:layout_width="match_parent" 19 | android:layout_height="wrap_content" 20 | android:gravity="center" 21 | android:padding="2dp" 22 | android:text="给您带来的不便深感抱歉" 23 | android:textColor="@color/colorContent" 24 | android:textSize="12sp" /> 25 | 26 | <!--本项目由景彬开发--> 27 | </LinearLayout> -------------------------------------------------------------------------------- /app/src/main/res/layout/title_douban_top.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:tools="http://schemas.android.com/tools" 4 | android:layout_width="match_parent" 5 | android:layout_height="wrap_content" 6 | android:orientation="vertical" 7 | android:paddingLeft="20dp" 8 | android:paddingRight="20dp" 9 | android:paddingTop="20dp"> 10 | 11 | <TextView 12 | android:id="@+id/title_top" 13 | android:layout_width="wrap_content" 14 | android:layout_height="wrap_content" 15 | android:textColor="?android:attr/textColorPrimary" 16 | android:textSize="14sp" 17 | tools:text="Android:《云阅》- 一款看Android技术资讯的App,不只是用来看安卓~" /> 18 | 19 | </LinearLayout> 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/video_loading_progress.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2009 The Android Open Source Project 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | --> 15 | 16 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 17 | android:id="@+id/progress_indicator" 18 | android:layout_width="wrap_content" 19 | android:layout_height="wrap_content" 20 | android:layout_centerInParent="true" 21 | android:orientation="vertical"> 22 | 23 | <ProgressBar 24 | android:id="@android:id/progress" 25 | style="?android:attr/progressBarStyleLarge" 26 | android:layout_width="wrap_content" 27 | android:layout_height="wrap_content" 28 | android:layout_gravity="center" /> 29 | 30 | <TextView 31 | android:layout_width="wrap_content" 32 | android:layout_height="wrap_content" 33 | android:layout_gravity="center" 34 | android:paddingTop="5dip" 35 | android:text="加载中..." 36 | android:textColor="?android:attr/textColorPrimary" 37 | android:textSize="14sp" /> 38 | </LinearLayout> -------------------------------------------------------------------------------- /app/src/main/res/layout/viewpager_very_image.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:layout_width="fill_parent" 4 | android:layout_height="fill_parent" 5 | android:background="#ff000000"> 6 | 7 | <com.github.chrisbanes.photoview.PhotoView 8 | android:id="@+id/zoom_image_view" 9 | android:layout_width="match_parent" 10 | android:layout_height="match_parent" /> 11 | 12 | <View 13 | android:id="@+id/view_mask" 14 | android:layout_width="match_parent" 15 | android:layout_height="match_parent" 16 | android:background="@color/colorBannerMask" 17 | android:visibility="visible" /> 18 | 19 | <ProgressBar 20 | android:id="@+id/loading" 21 | android:layout_width="30dp" 22 | android:layout_height="30dp" 23 | android:layout_gravity="center" /> 24 | 25 | </FrameLayout> -------------------------------------------------------------------------------- /app/src/main/res/menu/activity_main_drawer.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <!--android:checkableBehavior="single"--> 4 | <group> 5 | <item 6 | android:id="@+id/nav_camera" 7 | android:icon="@drawable/ic_menu_camera" 8 | android:title="摄影" /> 9 | <item 10 | android:id="@+id/nav_gallery" 11 | android:icon="@drawable/ic_menu_gallery" 12 | android:title="照片" /> 13 | <item 14 | android:id="@+id/nav_slideshow" 15 | android:icon="@drawable/ic_menu_slideshow" 16 | android:title="视频" /> 17 | <item 18 | android:id="@+id/nav_manage" 19 | android:icon="@drawable/ic_menu_manage" 20 | android:title="工具" /> 21 | </group> 22 | 23 | <item android:title="Communicate"> 24 | <menu> 25 | <item 26 | android:id="@+id/nav_share" 27 | android:icon="@drawable/ic_menu_share" 28 | android:title="分享" /> 29 | <item 30 | android:id="@+id/nav_send" 31 | android:icon="@drawable/ic_menu_send" 32 | android:title="关于" /> 33 | </menu> 34 | </item> 35 | 36 | </menu> 37 | -------------------------------------------------------------------------------- /app/src/main/res/menu/base_header_menu.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | 5 | <!--orderInCategory 优先级--> 6 | <!--android:icon="@drawable/actionbar_more"--> 7 | <item 8 | android:id="@+id/actionbar_more" 9 | android:orderInCategory="100" 10 | android:title="@string/actionbar_image" 11 | app:showAsAction="never" /> 12 | </menu> -------------------------------------------------------------------------------- /app/src/main/res/menu/gank_bottomsheet.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | <item 5 | android:id="@+id/gank_all" 6 | android:icon="@drawable/home_title_all" 7 | android:title="全部" /> 8 | <item 9 | android:id="@+id/gank_flutter" 10 | android:icon="@drawable/home_title_flutter" 11 | android:title="Flutter" /> 12 | <item 13 | android:id="@+id/gank_ios" 14 | android:icon="@drawable/home_title_ios" 15 | android:title="iOS" /> 16 | <item 17 | android:id="@+id/gank_app" 18 | android:icon="@drawable/home_title_app" 19 | android:title="App" /> 20 | <item 21 | android:id="@+id/gank_qian" 22 | android:icon="@drawable/home_title_qian" 23 | android:title="前端" /> 24 | <item 25 | android:id="@+id/gank_backend" 26 | android:icon="@drawable/home_title_backend" 27 | android:title="后端" /> 28 | <item 29 | android:id="@+id/gank_resouce" 30 | android:icon="@drawable/home_title_source" 31 | android:title="推荐" /> 32 | </menu> -------------------------------------------------------------------------------- /app/src/main/res/menu/main.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | <item 5 | android:id="@+id/action_search" 6 | android:icon="@drawable/actionbar_search" 7 | android:orderInCategory="100" 8 | android:title="@string/actionbar_search" 9 | app:showAsAction="always" /> 10 | </menu> -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_coin.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | 5 | <item 6 | android:id="@+id/actionbar_help" 7 | android:icon="@drawable/actionbar_help" 8 | android:orderInCategory="100" 9 | android:title="@string/actionbar_help_coin" 10 | app:showAsAction="always" /> 11 | 12 | </menu> -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_night_mode.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | 5 | <item 6 | android:id="@+id/actionbar_ok" 7 | android:orderInCategory="100" 8 | android:title="@string/actionbar_night_ok" 9 | app:showAsAction="always" /> 10 | 11 | </menu> -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_publish.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | 5 | <item 6 | android:id="@+id/actionbar_publish" 7 | android:icon="@drawable/action_publish" 8 | android:orderInCategory="100" 9 | android:title="@string/actionbar_publish" 10 | app:showAsAction="always" /> 11 | 12 | </menu> -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_web.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | 5 | <item 6 | android:id="@+id/actionbar_web" 7 | android:icon="@drawable/actionbar_web" 8 | android:orderInCategory="100" 9 | android:title="@string/actionbar_web" 10 | app:showAsAction="always" /> 11 | 12 | </menu> -------------------------------------------------------------------------------- /app/src/main/res/menu/movie_detail.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | 5 | <!--orderInCategory 优先级--> 6 | <item 7 | android:id="@+id/actionbar_more" 8 | android:icon="@drawable/actionbar_more" 9 | android:orderInCategory="100" 10 | android:title="@string/actionbar_more" 11 | app:showAsAction="never" /> 12 | </menu> -------------------------------------------------------------------------------- /app/src/main/res/menu/slide.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | <item 5 | android:id="@+id/action_search" 6 | android:icon="@drawable/actionbar_search" 7 | android:orderInCategory="100" 8 | android:title="@string/actionbar_search" 9 | app:showAsAction="always" /> 10 | </menu> -------------------------------------------------------------------------------- /app/src/main/res/menu/webview_menu.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | 5 | <item 6 | android:id="@+id/actionbar_share" 7 | android:orderInCategory="100" 8 | android:title="@string/actionbar_webview_share" 9 | app:showAsAction="never" /> 10 | 11 | <item 12 | android:id="@+id/actionbar_webview_refresh" 13 | android:orderInCategory="100" 14 | android:title="@string/actionbar_webview_refresh" 15 | app:showAsAction="never" /> 16 | 17 | <item 18 | android:id="@+id/actionbar_copy_title" 19 | android:orderInCategory="100" 20 | android:title="@string/actionbar_webview_copy_title" 21 | app:showAsAction="never" /> 22 | 23 | <item 24 | android:id="@+id/actionbar_copy_link" 25 | android:orderInCategory="100" 26 | android:title="@string/actionbar_webview_copy_link" 27 | app:showAsAction="never" /> 28 | 29 | <item 30 | android:id="@+id/actionbar_open" 31 | android:orderInCategory="100" 32 | android:title="@string/actionbar_webview_open" 33 | app:showAsAction="never" /> 34 | 35 | <item 36 | android:id="@+id/actionbar_collect" 37 | android:orderInCategory="100" 38 | android:title="@string/actionbar_webview_collect" 39 | app:showAsAction="never" /> 40 | </menu> -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/ic_launcher_background"/> 4 | <foreground android:drawable="@mipmap/ic_launcher_foreground"/> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@drawable/ic_launcher_background"/> 4 | <foreground android:drawable="@mipmap/ic_launcher_foreground"/> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values-v28/styles.xml: -------------------------------------------------------------------------------- 1 | <resources xmlns:tools="http://schemas.android.com/tools"> 2 | 3 | 4 | <style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar"> 5 | <item name="android:windowBackground">@drawable/layer_splash</item> 6 | <item name="android:windowFullscreen">true</item> 7 | <!--不让windowBackground延申到navigation bar区域--> 8 | <item name="android:windowDrawsSystemBarBackgrounds">false</item> 9 | <!--适配Android P刘海屏--> 10 | <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> 11 | </style> 12 | 13 | </resources> 14 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | 4 | <!--SlidingLayout--> 5 | <declare-styleable name="SlidingLayout"> 6 | <attr name="background_view" format="reference"/> 7 | <attr name="sliding_mode" format="enum"> 8 | <enum name="both" value="0"/> 9 | <enum name="top" value="1"/> 10 | <enum name="bottom" value="2"/> 11 | </attr> 12 | <attr name="sliding_pointer_mode" format="enum"> 13 | <enum name="one" value="0"/> 14 | <enum name="more" value="1"/> 15 | </attr> 16 | <attr name="top_max" format="dimension"/> 17 | </declare-styleable> 18 | </resources> 19 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <!-- Default screen margins, per the Android Design guidelines. --> 3 | <dimen name="nav_header_vertical_spacing">16dp</dimen> 4 | <dimen name="nav_header_height">173dp</dimen> 5 | <!-- Default screen margins, per the Android Design guidelines. --> 6 | <dimen name="activity_horizontal_margin">16dp</dimen> 7 | <dimen name="activity_vertical_margin">16dp</dimen> 8 | <dimen name="fab_margin">16dp</dimen> 9 | <dimen name="titlebar_height">56dp</dimen> 10 | 11 | <!--渐变时还没到布局全部就已经不透明了,距离 45dp--> 12 | <dimen name="base_header_activity_slide_more">45dp</dimen> 13 | 14 | <dimen name="home_header_size">291dp</dimen> 15 | 16 | <dimen name="nav_bar_height">56dp</dimen> 17 | <dimen name="nav_bar_height_more">58dp</dimen> 18 | 19 | <!--用来测电影详情页--> 20 | <dimen name="new_home_header_size">325dp</dimen> 21 | 22 | 23 | <dimen name="slide_shape_title_ng">310dp</dimen> 24 | 25 | <!--电影详情图片的宽高--> 26 | <dimen name="movie_detail_width">125dp</dimen> 27 | <dimen name="movie_detail_height">165dp</dimen> 28 | <!--书籍详情图片的宽高--> 29 | <dimen name="book_detail_width">120dp</dimen> 30 | <dimen name="book_detail_height">165dp</dimen> 31 | <dimen name="size_16dp">16dp</dimen> 32 | <dimen name="size_8dp">8dp</dimen> 33 | <dimen name="size_7dp">7dp</dimen> 34 | <dimen name="size_5dp">5dp</dimen> 35 | <dimen name="size_30dp">30dp</dimen> 36 | <dimen name="sp_30">30sp</dimen> 37 | <dimen name="dp_10">10dp</dimen> 38 | <dimen name="dp_4">4dp</dimen> 39 | 40 | </resources> 41 | -------------------------------------------------------------------------------- /app/src/main/res/values/drawables.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <item name="toolbarItemBackground" type="drawable">@drawable/abc_item_background_holo_light 4 | </item> 5 | 6 | </resources> -------------------------------------------------------------------------------- /app/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <item type="id" name="id_by_sticky_item"/> 3 | </resources> 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/transition.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <string name="transition_movie_img">transition_movie_img</string> 4 | <string name="transition_news_img">transition_news_img</string> 5 | <string name="transition_book_img">transition_book_img</string> 6 | <string name="transition_publish_bt">transition_publish_bt</string> 7 | 8 | </resources> -------------------------------------------------------------------------------- /app/src/test/java/com/example/jingbin/cloudreader/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.example.jingbin.cloudreader; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | 5 | // kotlin 版本 6 | ext.kotlin_version = '1.6.20' 7 | 8 | repositories { 9 | google() 10 | mavenCentral() 11 | } 12 | dependencies { 13 | classpath 'com.android.tools.build:gradle:8.0.2' 14 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 15 | // NOTE: Do not place your application dependencies here; they belong 16 | // in the individual module build.gradle files 17 | } 18 | } 19 | 20 | allprojects { 21 | repositories { 22 | google() 23 | mavenCentral() 24 | maven { url "https://jitpack.io" } 25 | maven { 26 | url "https://dl.google.com/dl/android/maven2/" 27 | } 28 | } 29 | } 30 | 31 | task clean(type: Delete) { 32 | delete rootProject.buildDir 33 | } 34 | 35 | // Define versions in a single place 36 | ext { 37 | // Support library and architecture components support minSdk 21 and above. 38 | minSdkVersion = 21 39 | targetSdkVersion = 34 40 | compileSdkVersion = 34 41 | buildToolsVersion = '34.0.0' 42 | 43 | // App dependencies 44 | supportLibraryVersion = '28.0.0' 45 | junitVersion = '4.13.2' 46 | } -------------------------------------------------------------------------------- /bymvvm/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/bymvvm/consumer-rules.pro -------------------------------------------------------------------------------- /bymvvm/libs/commons-lang-2.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/bymvvm/libs/commons-lang-2.6.jar -------------------------------------------------------------------------------- /bymvvm/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /bymvvm/src/androidTest/java/me/jingbin/bymvvm/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | 25 | assertEquals("me.jingbin.bymvvm.test", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /bymvvm/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 | package="me.jingbin.bymvvm" /> 3 | -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/base/BaseListViewModel.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.base; 2 | 3 | import android.app.Application; 4 | 5 | import androidx.annotation.NonNull; 6 | 7 | /** 8 | * @author jingbin 9 | * @data 2018/5/12 10 | * @Description 有列表的页面 11 | */ 12 | 13 | public class BaseListViewModel extends BaseViewModel { 14 | 15 | public int mPage = 0; 16 | 17 | public BaseListViewModel(@NonNull Application application) { 18 | super(application); 19 | } 20 | 21 | public int getPage() { 22 | return mPage; 23 | } 24 | 25 | public void setPage(int mPage) { 26 | this.mPage = mPage; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/base/BaseViewModel.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.base; 2 | 3 | import android.app.Application; 4 | 5 | import androidx.annotation.NonNull; 6 | import androidx.lifecycle.AndroidViewModel; 7 | 8 | import java.util.concurrent.TimeUnit; 9 | 10 | import io.reactivex.Observable; 11 | import io.reactivex.Observer; 12 | import io.reactivex.android.schedulers.AndroidSchedulers; 13 | import io.reactivex.disposables.CompositeDisposable; 14 | import io.reactivex.disposables.Disposable; 15 | import io.reactivex.schedulers.Schedulers; 16 | 17 | /** 18 | * @author jingbin 19 | * @data 2018/5/28 20 | */ 21 | public class BaseViewModel extends AndroidViewModel { 22 | 23 | private CompositeDisposable mCompositeDisposable; 24 | 25 | public BaseViewModel(@NonNull Application application) { 26 | super(application); 27 | } 28 | 29 | 30 | protected <T> void execute(Observable<T> observable, Observer<T> observer) { 31 | observable 32 | .throttleFirst(500, TimeUnit.MILLISECONDS) 33 | .subscribeOn(Schedulers.io()) 34 | .observeOn(AndroidSchedulers.mainThread()) 35 | .subscribe(observer); 36 | } 37 | 38 | protected void addDisposable(Disposable disposable) { 39 | if (this.mCompositeDisposable == null) { 40 | this.mCompositeDisposable = new CompositeDisposable(); 41 | } 42 | this.mCompositeDisposable.add(disposable); 43 | } 44 | 45 | @Override 46 | protected void onCleared() { 47 | super.onCleared(); 48 | if (this.mCompositeDisposable != null && !mCompositeDisposable.isDisposed()) { 49 | this.mCompositeDisposable.clear(); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/base/NoViewModel.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.base; 2 | 3 | import android.app.Application; 4 | 5 | import androidx.annotation.NonNull; 6 | import androidx.lifecycle.AndroidViewModel; 7 | 8 | /** 9 | * @author jingbin 10 | * @data 2018/12/22 11 | * @Description 没有viewModel的情况 12 | */ 13 | 14 | public class NoViewModel extends AndroidViewModel { 15 | 16 | public NoViewModel(@NonNull Application application) { 17 | super(application); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/base/RootApplication.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.base; 2 | 3 | 4 | import android.app.Application; 5 | import android.content.Context; 6 | import android.os.Build; 7 | import android.webkit.WebView; 8 | 9 | import androidx.multidex.MultiDex; 10 | 11 | import me.jingbin.bymvvm.http.HttpUtils; 12 | 13 | 14 | public class RootApplication extends Application { 15 | 16 | private static Context mContext; 17 | 18 | @Override 19 | public void onCreate() { 20 | super.onCreate(); 21 | mContext = this; 22 | HttpUtils.getInstance().init(this); 23 | } 24 | 25 | public static Context getContext() { 26 | return mContext; 27 | } 28 | 29 | /** 30 | * 方法数超64k 解决 https://developer.android.com/studio/build/multidex?hl=zh-cn 31 | * 继承 MultiDexApplication 或 实现此方法。 32 | */ 33 | @Override 34 | protected void attachBaseContext(Context base) { 35 | super.attachBaseContext(base); 36 | initWebView(); 37 | MultiDex.install(this); 38 | } 39 | 40 | /** 41 | * Android P针对 WebView在不同进程下无法访问非自己进程中的webview目录 42 | * fix Using WebView from more than one process at once with the same data directory is not supported 43 | */ 44 | private void initWebView() { 45 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { 46 | String processName = getProcessName(); 47 | String packageName = this.getPackageName(); 48 | if (!packageName.equals(processName)) { 49 | WebView.setDataDirectorySuffix(processName); 50 | } 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/http/NullOnEmptyConverterFactory.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.http; 2 | 3 | import java.io.IOException; 4 | import java.lang.annotation.Annotation; 5 | import java.lang.reflect.Type; 6 | 7 | import okhttp3.ResponseBody; 8 | import retrofit2.Converter; 9 | import retrofit2.Retrofit; 10 | 11 | /** 12 | * Created by jingbin on 2017/2/14. 13 | */ 14 | 15 | public class NullOnEmptyConverterFactory extends Converter.Factory { 16 | 17 | @Override 18 | public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { 19 | final Converter<ResponseBody, ?> delegate = retrofit.nextResponseBodyConverter(this, type, annotations); 20 | 21 | return new Converter<ResponseBody, Object>() { 22 | 23 | @Override 24 | public Object convert(ResponseBody value) throws IOException { 25 | if (value.contentLength() == 0) 26 | return null; 27 | return delegate.convert(value); 28 | } 29 | }; 30 | } 31 | } -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/http/ParamNames.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.http; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * Created by jingbin on 2015/6/24. 11 | */ 12 | @Documented 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Target(ElementType.FIELD) 15 | public @interface ParamNames { 16 | String value(); 17 | } 18 | -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/http/glide/OkHttpGlideModule.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.http.glide; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.annotation.NonNull; 6 | 7 | import com.bumptech.glide.Glide; 8 | import com.bumptech.glide.Registry; 9 | import com.bumptech.glide.annotation.GlideModule; 10 | import com.bumptech.glide.load.model.GlideUrl; 11 | import com.bumptech.glide.module.AppGlideModule; 12 | 13 | import java.io.InputStream; 14 | 15 | import okhttp3.Call; 16 | import okhttp3.OkHttpClient; 17 | 18 | /** 19 | * Created by jingbin on 10/19/21. 20 | * 直接将Glide.with替换为GlideApp.with即可 21 | */ 22 | @GlideModule 23 | public class OkHttpGlideModule extends AppGlideModule { 24 | 25 | @Override 26 | public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) { 27 | // 忽略证书 28 | OkHttpClient mHttpClient = new OkHttpClient().newBuilder() 29 | .sslSocketFactory(SSLSocketClient.getSSLSocketFactory(),SSLSocketClient.X509TrustManager()) 30 | .hostnameVerifier(SSLSocketClient.getHostnameVerifier()) 31 | .build(); 32 | registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory((Call.Factory) mHttpClient)); 33 | } 34 | } 35 | 36 | -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/room/DiskIOThreadExecutor.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.room; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import java.util.concurrent.Executor; 6 | import java.util.concurrent.Executors; 7 | 8 | /** 9 | * Executor that runs a task on a new background thread. 10 | * 只开启一个核心线程,依次执行,不存在并发问题 11 | */ 12 | public class DiskIOThreadExecutor implements Executor { 13 | 14 | private final Executor mDiskIO; 15 | 16 | public DiskIOThreadExecutor() { 17 | mDiskIO = Executors.newSingleThreadExecutor(); 18 | } 19 | 20 | @Override 21 | public void execute(@NonNull Runnable command) { 22 | mDiskIO.execute(command); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/room/Injection.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.room; 2 | 3 | /** 4 | * @author jingbin 5 | * @data 2018/4/19 6 | * @Description 7 | */ 8 | 9 | public class Injection { 10 | 11 | public static UserDataBaseSource get() { 12 | UserDataBase database = UserDataBase.getDatabase(); 13 | return UserDataBaseSource.getInstance(new AppExecutors(), database.waitDao()); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/room/UserDataCallback.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.room; 2 | 3 | /** 4 | * @author jingbin 5 | * @data 2018/4/19 6 | * @Description 7 | */ 8 | 9 | public interface UserDataCallback { 10 | 11 | /** 12 | * 返回数据为null 13 | */ 14 | void onDataNotAvailable(); 15 | 16 | /** 17 | * @param bean 返回数据 18 | */ 19 | void getData(User bean); 20 | } 21 | -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/rxbus/RxBusBaseMessage.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.rxbus; 2 | 3 | /** 4 | * Created by jingbin on 16/5/17. 5 | */ 6 | public class RxBusBaseMessage { 7 | 8 | private int code; 9 | private Object object; 10 | 11 | public RxBusBaseMessage(int code, Object object) { 12 | this.code = code; 13 | this.object = object; 14 | } 15 | 16 | public RxBusBaseMessage() { 17 | } 18 | 19 | public int getCode() { 20 | return code; 21 | } 22 | 23 | public Object getObject() { 24 | return object; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/utils/CheckNetwork.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.utils; 2 | 3 | import android.content.Context; 4 | import android.net.ConnectivityManager; 5 | import android.net.NetworkInfo; 6 | 7 | /** 8 | * 用于判断是不是联网状态 9 | * 10 | * @author Dzy 11 | */ 12 | public class CheckNetwork { 13 | 14 | /** 15 | * 判断网络是否连通 16 | */ 17 | public static boolean isNetworkConnected(Context context) { 18 | try { 19 | if(context!=null){ 20 | @SuppressWarnings("static-access") 21 | ConnectivityManager cm = (ConnectivityManager) context 22 | .getSystemService(context.CONNECTIVITY_SERVICE); 23 | NetworkInfo info = cm.getActiveNetworkInfo(); 24 | return info != null && info.isConnected(); 25 | }else{ 26 | /**如果context为空,就返回false,表示网络未连接*/ 27 | return false; 28 | } 29 | }catch (Exception e){ 30 | e.printStackTrace(); 31 | return false; 32 | } 33 | 34 | 35 | } 36 | 37 | public static boolean isWifiConnected(Context context) { 38 | if (context != null) { 39 | ConnectivityManager cm = (ConnectivityManager) context 40 | .getSystemService(context.CONNECTIVITY_SERVICE); 41 | NetworkInfo info = cm.getActiveNetworkInfo(); 42 | return info != null && (info.getType() == ConnectivityManager.TYPE_WIFI); 43 | } else { 44 | /**如果context为null就表示为未连接*/ 45 | return false; 46 | } 47 | 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/utils/ClassUtil.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.utils; 2 | 3 | import androidx.lifecycle.AndroidViewModel; 4 | 5 | import java.lang.reflect.ParameterizedType; 6 | import java.lang.reflect.Type; 7 | 8 | import me.jingbin.bymvvm.base.NoViewModel; 9 | 10 | /** 11 | * Created by jingbin on 2018/12/26. 12 | */ 13 | 14 | public class ClassUtil { 15 | 16 | /** 17 | * 获取泛型ViewModel的class对象 18 | */ 19 | public static <T> Class<T> getViewModel(Object obj) { 20 | Class<?> currentClass = obj.getClass(); 21 | Class<T> tClass = getGenericClass(currentClass, AndroidViewModel.class); 22 | if (tClass == null || tClass == AndroidViewModel.class || tClass == NoViewModel.class) { 23 | return null; 24 | } 25 | return tClass; 26 | } 27 | 28 | private static <T> Class<T> getGenericClass(Class<?> klass, Class<?> filterClass) { 29 | Type type = klass.getGenericSuperclass(); 30 | if (type == null || !(type instanceof ParameterizedType)) return null; 31 | ParameterizedType parameterizedType = (ParameterizedType) type; 32 | Type[] types = parameterizedType.getActualTypeArguments(); 33 | for (Type t : types) { 34 | Class<T> tClass = (Class<T>) t; 35 | if (filterClass.isAssignableFrom(tClass)) { 36 | return tClass; 37 | } 38 | } 39 | return null; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/utils/CommonUtils.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.utils; 2 | 3 | import android.content.Context; 4 | import android.content.res.Resources; 5 | import android.graphics.Color; 6 | import android.graphics.drawable.Drawable; 7 | 8 | import androidx.core.content.ContextCompat; 9 | 10 | import java.util.Random; 11 | 12 | import me.jingbin.bymvvm.base.RootApplication; 13 | 14 | /** 15 | * Created by jingbin on 2016/11/22. 16 | * 获取原生资源 17 | */ 18 | public class CommonUtils { 19 | 20 | /** 21 | * 随机颜色 22 | */ 23 | public static int randomColor() { 24 | Random random = new Random(); 25 | int red = random.nextInt(150) + 50;//50-199 26 | int green = random.nextInt(150) + 50;//50-199 27 | int blue = random.nextInt(150) + 50;//50-199 28 | return Color.rgb(red, green, blue); 29 | } 30 | 31 | public static Drawable getDrawable(Context context, int resId) { 32 | return ContextCompat.getDrawable(context, resId); 33 | } 34 | 35 | public static int getColor(Context context, int resId) { 36 | return ContextCompat.getColor(context, resId); 37 | } 38 | 39 | public static Resources getResources() { 40 | return RootApplication.getContext().getResources(); 41 | } 42 | 43 | public static String getString(int resId) { 44 | return getResources().getString(resId); 45 | } 46 | 47 | public static String getString(Context context, int resId) { 48 | return context.getResources().getString(resId); 49 | } 50 | 51 | public static float getDimens(int resId) { 52 | return getResources().getDimension(resId); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /bymvvm/src/main/java/me/jingbin/bymvvm/utils/StatusBarView.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm.utils; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.View; 6 | 7 | /** 8 | * Created by Jaeger on 16/6/8. 9 | * 10 | * Email: chjie.jaeger@gmail.com 11 | * GitHub: https://github.com/laobie 12 | */ 13 | public class StatusBarView extends View { 14 | public StatusBarView(Context context, AttributeSet attrs) { 15 | super(context, attrs); 16 | } 17 | 18 | public StatusBarView(Context context) { 19 | super(context); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /bymvvm/src/main/res/drawable-xhdpi/app_loading0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/bymvvm/src/main/res/drawable-xhdpi/app_loading0.png -------------------------------------------------------------------------------- /bymvvm/src/main/res/drawable-xhdpi/app_loading1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/bymvvm/src/main/res/drawable-xhdpi/app_loading1.png -------------------------------------------------------------------------------- /bymvvm/src/main/res/drawable-xhdpi/app_loading2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/bymvvm/src/main/res/drawable-xhdpi/app_loading2.png -------------------------------------------------------------------------------- /bymvvm/src/main/res/drawable-xhdpi/app_loading3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/bymvvm/src/main/res/drawable-xhdpi/app_loading3.png -------------------------------------------------------------------------------- /bymvvm/src/main/res/drawable-xhdpi/icon_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/bymvvm/src/main/res/drawable-xhdpi/icon_back.png -------------------------------------------------------------------------------- /bymvvm/src/main/res/drawable-xxhdpi/icon_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/bymvvm/src/main/res/drawable-xxhdpi/icon_back.png -------------------------------------------------------------------------------- /bymvvm/src/main/res/drawable-xxhdpi/load_err.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/bymvvm/src/main/res/drawable-xxhdpi/load_err.png -------------------------------------------------------------------------------- /bymvvm/src/main/res/drawable/yun_anim.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <animation-list xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:oneshot="false"> 4 | 5 | <item 6 | android:drawable="@drawable/app_loading0" 7 | android:duration="150" /> 8 | <item 9 | android:drawable="@drawable/app_loading1" 10 | android:duration="150" /> 11 | <item 12 | android:drawable="@drawable/app_loading2" 13 | android:duration="150" /> 14 | <item 15 | android:drawable="@drawable/app_loading3" 16 | android:duration="150" /> 17 | 18 | </animation-list> -------------------------------------------------------------------------------- /bymvvm/src/main/res/layout/fragment_base.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <RelativeLayout 5 | android:id="@+id/container" 6 | android:layout_width="match_parent" 7 | android:layout_height="match_parent"> 8 | 9 | <!--加载失败--> 10 | <ViewStub 11 | android:id="@+id/vs_error_refresh" 12 | android:layout_width="match_parent" 13 | android:layout_height="match_parent" 14 | android:layout_centerHorizontal="true" 15 | android:layout="@layout/layout_loading_error" /> 16 | 17 | <!--加载中..--> 18 | <ViewStub 19 | android:id="@+id/vs_loading" 20 | android:layout_width="wrap_content" 21 | android:layout_height="wrap_content" 22 | android:layout_centerHorizontal="true" 23 | android:layout="@layout/layout_loading_view" /> 24 | 25 | <!--数据为空--> 26 | <ViewStub 27 | android:id="@+id/vs_empty" 28 | android:layout_width="wrap_content" 29 | android:layout_height="wrap_content" 30 | android:layout_centerHorizontal="true" 31 | android:layout="@layout/layout_loading_empty" /> 32 | 33 | </RelativeLayout> 34 | </layout> -------------------------------------------------------------------------------- /bymvvm/src/main/res/layout/layout_loading_empty.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <layout xmlns:android="http://schemas.android.com/apk/res/android"> 3 | 4 | <androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto" 5 | xmlns:tools="http://schemas.android.com/tools" 6 | android:id="@+id/ll_progress_bar" 7 | android:layout_width="match_parent" 8 | android:layout_height="wrap_content" 9 | android:gravity="center"> 10 | 11 | <TextView 12 | android:id="@+id/tv_tip_empty" 13 | android:layout_width="wrap_content" 14 | android:layout_height="wrap_content" 15 | android:gravity="center" 16 | android:lineSpacingExtra="4dp" 17 | android:layout_marginTop="100dp" 18 | android:text="@string/by_string_empty" 19 | android:textSize="14sp" 20 | app:layout_constraintLeft_toLeftOf="parent" 21 | app:layout_constraintRight_toRightOf="parent" 22 | app:layout_constraintTop_toTopOf="parent" /> 23 | 24 | </androidx.constraintlayout.widget.ConstraintLayout> 25 | </layout> 26 | -------------------------------------------------------------------------------- /bymvvm/src/main/res/layout/layout_loading_error.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto" 4 | android:id="@+id/ll_progress_bar" 5 | android:layout_width="match_parent" 6 | android:layout_height="match_parent" 7 | android:gravity="center"> 8 | 9 | <ImageView 10 | android:id="@+id/img_err" 11 | android:layout_width="wrap_content" 12 | android:layout_height="wrap_content" 13 | android:layout_marginBottom="15dp" 14 | android:src="@drawable/load_err" 15 | app:layout_constraintBottom_toTopOf="@+id/text_tip" 16 | app:layout_constraintLeft_toLeftOf="parent" 17 | app:layout_constraintRight_toRightOf="parent" /> 18 | 19 | <TextView 20 | android:id="@+id/text_tip" 21 | android:layout_width="wrap_content" 22 | android:layout_height="wrap_content" 23 | android:layout_below="@+id/img_err" 24 | android:text="@string/by_string_try_load" 25 | android:textSize="14sp" 26 | app:layout_constraintBottom_toBottomOf="parent" 27 | app:layout_constraintLeft_toLeftOf="parent" 28 | app:layout_constraintRight_toRightOf="parent" 29 | app:layout_constraintTop_toTopOf="parent" /> 30 | 31 | </androidx.constraintlayout.widget.ConstraintLayout> 32 | -------------------------------------------------------------------------------- /bymvvm/src/main/res/layout/layout_loading_view.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto" 4 | android:id="@+id/ll_progress_bar" 5 | android:layout_width="wrap_content" 6 | android:layout_height="wrap_content"> 7 | 8 | <ImageView 9 | android:id="@+id/img_progress" 10 | android:layout_width="wrap_content" 11 | android:layout_height="wrap_content" 12 | android:layout_marginTop="50dp" 13 | android:src="@drawable/yun_anim" 14 | app:layout_constraintStart_toStartOf="parent" 15 | app:layout_constraintTop_toTopOf="parent" /> 16 | 17 | <TextView 18 | android:id="@+id/text_tip" 19 | android:layout_width="wrap_content" 20 | android:layout_height="wrap_content" 21 | android:layout_marginStart="10dp" 22 | android:layout_marginTop="50dp" 23 | android:text="@string/by_string_loading" 24 | android:textColor="@color/colorTabText" 25 | android:textSize="14sp" 26 | app:layout_constraintLeft_toRightOf="@+id/img_progress" 27 | app:layout_constraintTop_toTopOf="parent" /> 28 | 29 | </androidx.constraintlayout.widget.ConstraintLayout> 30 | -------------------------------------------------------------------------------- /bymvvm/src/main/res/values-en/strings.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <string name="by_string_try_load">Failed to load, click retry</string> 3 | <string name="by_string_loading">Loading…</string> 4 | <string name="by_string_empty">No content was found</string> 5 | </resources> 6 | -------------------------------------------------------------------------------- /bymvvm/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <color name="colorTheme">#ffce3d3a</color> 4 | <color name="colorToolBar">#181818</color> 5 | <color name="colorWhite">#ffffffff</color> 6 | <color name="colorTabText">#585858</color> 7 | </resources> 8 | -------------------------------------------------------------------------------- /bymvvm/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <color name="colorTheme">#ffce3d3a</color> 4 | <color name="colorToolBar">#ffce3d3a</color> 5 | <color name="colorWhite">#ffffffff</color> 6 | <color name="colorTabText">#585858</color> 7 | </resources> 8 | -------------------------------------------------------------------------------- /bymvvm/src/main/res/values/drawables.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <item name="toolbarItemBackground" type="drawable">@drawable/abc_item_background_holo_light 4 | </item> 5 | 6 | </resources> -------------------------------------------------------------------------------- /bymvvm/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | <string name="by_string_try_load">加载失败,点击重试</string> 3 | <string name="by_string_loading">努力加载中…</string> 4 | <string name="by_string_empty">未找到相关内容</string> 5 | </resources> 6 | -------------------------------------------------------------------------------- /bymvvm/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | <resources xmlns:tools="http://schemas.android.com/tools"> 2 | 3 | 4 | <!--ToolBar 样式--> 5 | <style name="ToolbarStyle" parent="@style/ThemeOverlay.AppCompat.ActionBar"> 6 | <item name="actionBarItemBackground">@drawable/toolbarItemBackground</item> 7 | <item name="selectableItemBackground">@drawable/toolbarItemBackground</item> 8 | <item name="titleTextAppearance">@style/ToolBar.Title</item> 9 | <item name="subtitleTextAppearance">@style/Toolbar.SubTitle</item> 10 | <item name="android:windowNoTitle">true</item> 11 | </style> 12 | 13 | <!--ToolBar 标题--> 14 | <style name="ToolBar.Title" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title"> 15 | <item name="android:textSize">17sp</item> 16 | <item name="android:textColor">@color/colorWhite</item> 17 | </style> 18 | 19 | <!--ToolBar 副标题--> 20 | <style name="Toolbar.SubTitle" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Subtitle"> 21 | <item name="android:textSize">9sp</item> 22 | <item name="android:textColor">#99ffffff</item> 23 | </style> 24 | 25 | </resources> 26 | -------------------------------------------------------------------------------- /bymvvm/src/test/java/me/jingbin/bymvvm/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package me.jingbin.bymvvm; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /file/Wechat-admire.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/file/Wechat-admire.jpg -------------------------------------------------------------------------------- /file/admire.md: -------------------------------------------------------------------------------- 1 | <img src="https://raw.githubusercontent.com/youlookwhat/CloudReader/master/file/Wechat-admire.jpg" width="250" height="250" /><img src="https://raw.githubusercontent.com/youlookwhat/CloudReader/master/file/alipay-admire.jpg" width="250" height="250"/> 2 | 3 | ### 捐赠列表 4 | 非常感谢列表中的朋友,你们的肯定和支持是我前进的最大动力! 5 | 6 | |昵称|日期|留言| 7 | |:--:|:--:|:--:| 8 | |Cheung|2018-11-14|👍| 9 | |腾飞的明天|2018-05-31|GitHub推荐:[fly803/BaseProject](https://github.com/fly803/BaseProject)| 10 | |未留名|2018-05-10|多谢前辈关于云阅的解答| 11 | |未留名|2018-04-17|博主云阅很赞,希望博主能继续更新| 12 | |未留名|2018-04-01|大神啊| 13 | |未留名|2018-03-13|666| 14 | |未留名|2018-03-08|| 15 | |凌云|2018-12-31|感谢作者,参考搭项目很不错<!--50元 感谢老铁-->| 16 | |Nordpol|2019-01-31|非常棒,希望有更多更好地开源项目| 17 | |Eren丶耶格尔|2019-03-03|| 18 | |༺࿈༻|2019-03-22|感谢大佬<!--50元 感谢老铁-->| 19 | 20 | 21 | 注:因为之前的赞赏并未归纳,微信记录里看不到对应昵称,所以均显示为“未留名”,见谅。 22 | 23 | -------------------------------------------------------------------------------- /file/alipay-admire.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/file/alipay-admire.jpg -------------------------------------------------------------------------------- /file/cloudreader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/file/cloudreader.gif -------------------------------------------------------------------------------- /file/download_200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/file/download_200.png -------------------------------------------------------------------------------- /file/images.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/file/images.png -------------------------------------------------------------------------------- /file/images2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/file/images2.png -------------------------------------------------------------------------------- /file/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/file/title.png -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx4096m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | 19 | # vivo手机打包处理(不能打test) 20 | android.injected.testOnly = false 21 | 22 | android.useAndroidX=true 23 | android.enableJetifier=true 24 | 25 | # BuildConfig & swith 26 | android.defaults.buildfeatures.buildconfig=true 27 | android.nonTransitiveRClass=true 28 | android.nonFinalResIds=false -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/youlookwhat/CloudReader/f5b9e67eef10225d15d3f256da23719b769a8c34/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Mar 06 15:15:46 CST 2024 2 | distributionBase=GRADLE_USER_HOME 3 | #distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip 4 | distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.0-bin.zip 5 | distributionPath=wrapper/dists 6 | zipStorePath=wrapper/dists 7 | zipStoreBase=GRADLE_USER_HOME 8 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | include ':bymvvm' 3 | --------------------------------------------------------------------------------