├── .gitignore ├── .idea ├── .gitignore ├── compiler.xml ├── dbnavigator.xml ├── deploymentTargetDropDown.xml ├── deploymentTargetSelector.xml ├── gradle.xml ├── kotlinc.xml ├── migrations.xml ├── misc.xml └── vcs.xml ├── app ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro ├── release │ ├── app-release.apk │ ├── baselineProfiles │ │ ├── 0 │ │ │ └── app-release.dm │ │ └── 1 │ │ │ └── app-release.dm │ └── output-metadata.json └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── qxtao │ │ └── easydict │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ ├── dict │ │ │ └── simple_dict.zip │ │ ├── fonts │ │ │ ├── Georgia Italic.ttf │ │ │ └── Georgia Normal.ttf │ │ └── txt │ │ │ ├── cet4.txt │ │ │ ├── cet6.txt │ │ │ ├── chuzhong.txt │ │ │ ├── gaokao.txt │ │ │ ├── ielts.txt │ │ │ ├── kaoyan.txt │ │ │ ├── tem4.txt │ │ │ ├── tem8.txt │ │ │ ├── toefl.txt │ │ │ └── xiaoxue.txt │ ├── java │ │ └── com │ │ │ └── qxtao │ │ │ └── easydict │ │ │ ├── adapter │ │ │ ├── dict │ │ │ │ ├── DictAuthSentsAdapter.kt │ │ │ │ ├── DictBlngClassificationAdapter.kt │ │ │ │ ├── DictBlngSentsAdapter.kt │ │ │ │ ├── DictCollinsInnerAdapter.kt │ │ │ │ ├── DictCollinsOuterAdapter.kt │ │ │ │ ├── DictConstant.kt │ │ │ │ ├── DictEEDictInnerAdapter.kt │ │ │ │ ├── DictEEDictOuterAdapter.kt │ │ │ │ ├── DictEhHeaderExplainAdapter.kt │ │ │ │ ├── DictEhHeaderInflectionAdapter.kt │ │ │ │ ├── DictEtymAdapter.kt │ │ │ │ ├── DictExternalDictTransAdapter.kt │ │ │ │ ├── DictHeHeaderExplainAdapter.kt │ │ │ │ ├── DictPhraseAdapter.kt │ │ │ │ ├── DictRelWordAdapter.kt │ │ │ │ ├── DictSearchSugWordAdapter.kt │ │ │ │ ├── DictSelectWordBookAdapter.kt │ │ │ │ ├── DictSpecialInnerAdapter.kt │ │ │ │ ├── DictSpecialOuterAdapter.kt │ │ │ │ ├── DictSynoAntoAdapter.kt │ │ │ │ ├── DictThesurusInnerAdapter.kt │ │ │ │ ├── DictThesurusOuterAdapter.kt │ │ │ │ ├── DictTypoAdapter.kt │ │ │ │ ├── DictWebTransInnerAdapter.kt │ │ │ │ ├── DictWebTransOuterAdapter.kt │ │ │ │ └── DictWordLineAdapter.kt │ │ │ ├── grammarcheck │ │ │ │ └── GrammarCheckAdapter.kt │ │ │ ├── popupmenu │ │ │ │ ├── PopupMenuAdapter.kt │ │ │ │ └── PopupMenuItem.kt │ │ │ ├── quicksearch │ │ │ │ └── QuickSearchWordLineAdapter.kt │ │ │ ├── settings │ │ │ │ ├── AppUpdateDataAdapter.kt │ │ │ │ ├── AppUpdateDataItem.kt │ │ │ │ ├── OpenSourceAdapter.kt │ │ │ │ └── OpenSourceItem.kt │ │ │ ├── wordbook │ │ │ │ ├── WordBookClassificationAdapter.kt │ │ │ │ └── WordBookDetailAdapter.kt │ │ │ └── wordlist │ │ │ │ ├── WordListAdapter.kt │ │ │ │ └── WordListItem.kt │ │ │ ├── application │ │ │ └── EasyDictApplication.kt │ │ │ ├── database │ │ │ ├── DailySentenceData.kt │ │ │ ├── SearchHistoryData.kt │ │ │ ├── SimpleDictData.kt │ │ │ ├── WordBookData.kt │ │ │ └── WordListData.kt │ │ │ ├── ui │ │ │ ├── activity │ │ │ │ ├── bughandler │ │ │ │ │ └── BugHandlerActivity.kt │ │ │ │ ├── daysentence │ │ │ │ │ ├── DaySentenceActivity.kt │ │ │ │ │ ├── DaySentenceConstant.kt │ │ │ │ │ └── DaySentenceViewModel.kt │ │ │ │ ├── dict │ │ │ │ │ ├── DictActivity.kt │ │ │ │ │ ├── DictConstant.kt │ │ │ │ │ ├── DictData.kt │ │ │ │ │ ├── DictViewModel.kt │ │ │ │ │ └── RecognitionHelper.kt │ │ │ │ ├── grammarcheck │ │ │ │ │ ├── GrammarCheckActivity.kt │ │ │ │ │ └── GrammarCheckViewModel.kt │ │ │ │ ├── quicksearch │ │ │ │ │ ├── QuickSearchActivity.kt │ │ │ │ │ ├── QuickSearchReceiver.kt │ │ │ │ │ └── QuickSearchViewModel.kt │ │ │ │ ├── settings │ │ │ │ │ ├── SettingsActivity.kt │ │ │ │ │ ├── SettingsConstant.kt │ │ │ │ │ └── SettingsViewModel.kt │ │ │ │ ├── web │ │ │ │ │ ├── WebActivity.kt │ │ │ │ │ └── WebViewModel.kt │ │ │ │ ├── wordbook │ │ │ │ │ ├── WordBookActivity.kt │ │ │ │ │ ├── WordBookConstant.kt │ │ │ │ │ └── WordBookViewModel.kt │ │ │ │ └── wordlist │ │ │ │ │ ├── WordListActivity.kt │ │ │ │ │ └── WordListViewModel.kt │ │ │ ├── base │ │ │ │ ├── BaseActivity.kt │ │ │ │ └── BaseFragment.kt │ │ │ ├── fragment │ │ │ │ ├── daysentence │ │ │ │ │ └── DaySentenceFragment.kt │ │ │ │ ├── dict │ │ │ │ │ ├── DictDefinitionFragment.kt │ │ │ │ │ ├── DictDetailCOFragment.kt │ │ │ │ │ ├── DictDetailEEFragment.kt │ │ │ │ │ ├── DictDetailFragment.kt │ │ │ │ │ ├── DictDetailJMFragment.kt │ │ │ │ │ ├── DictExtraFragment.kt │ │ │ │ │ ├── DictHasFragment.kt │ │ │ │ │ ├── DictSearchFragment.kt │ │ │ │ │ └── DictWelcomeFragment.kt │ │ │ │ ├── settings │ │ │ │ │ ├── SettingsAboutFragment.kt │ │ │ │ │ ├── SettingsAppUpdateFragment.kt │ │ │ │ │ ├── SettingsDictCardFragment.kt │ │ │ │ │ ├── SettingsMainFragment.kt │ │ │ │ │ └── SettingsWelcomeScreenFragment.kt │ │ │ │ └── wordbook │ │ │ │ │ ├── WordBookClassificationFragment.kt │ │ │ │ │ └── WordBookDetailFragment.kt │ │ │ ├── view │ │ │ │ ├── CustomPopWindow.kt │ │ │ │ ├── ExpandableTextView.kt │ │ │ │ ├── LimitEditText.kt │ │ │ │ ├── LoadFailedView.kt │ │ │ │ ├── LoadingView.kt │ │ │ │ ├── MaxHeightRecyclerView.kt │ │ │ │ ├── MultiEditText.kt │ │ │ │ ├── PerformEdit.kt │ │ │ │ ├── ProgressView.kt │ │ │ │ ├── VerticalScrollTextView.kt │ │ │ │ ├── imageviewer │ │ │ │ │ ├── FixViewPager.kt │ │ │ │ │ ├── ImageLoader.kt │ │ │ │ │ ├── ImageViewLoader.kt │ │ │ │ │ ├── ImageViewer.kt │ │ │ │ │ ├── ImageViewerCover.kt │ │ │ │ │ ├── OnDragChangeListener.kt │ │ │ │ │ ├── PhotoView.kt │ │ │ │ │ ├── PhotoViewContainer.kt │ │ │ │ │ └── photoview │ │ │ │ │ │ ├── Compat.kt │ │ │ │ │ │ ├── CustomGestureDetector.kt │ │ │ │ │ │ ├── OnGestureListener.kt │ │ │ │ │ │ ├── OnMatrixChangedListener.kt │ │ │ │ │ │ ├── OnOutsidePhotoTapListener.kt │ │ │ │ │ │ ├── OnPhotoTapListener.kt │ │ │ │ │ │ ├── OnScaleChangedListener.kt │ │ │ │ │ │ ├── OnSingleFlingListener.kt │ │ │ │ │ │ ├── OnViewDragListener.kt │ │ │ │ │ │ ├── OnViewTapListener.kt │ │ │ │ │ │ ├── PhotoView.kt │ │ │ │ │ │ ├── PhotoViewAttacher.kt │ │ │ │ │ │ └── Util.kt │ │ │ │ └── ratingbar │ │ │ │ │ ├── AndRatingBar.kt │ │ │ │ │ ├── BaseDrawable.kt │ │ │ │ │ ├── RattingAttr.kt │ │ │ │ │ ├── StarDrawable.kt │ │ │ │ │ └── TileDrawable.kt │ │ │ └── widget │ │ │ │ ├── DaySentenceWidget.kt │ │ │ │ └── QuickSearchWidget.kt │ │ │ └── utils │ │ │ ├── CustomTypefaceSpan.kt │ │ │ ├── EasyPermissions.kt │ │ │ ├── LinkClickMovementMethod.kt │ │ │ ├── common │ │ │ ├── ActivityUtils.kt │ │ │ ├── AssetsUtils.kt │ │ │ ├── ClipboardUtils.kt │ │ │ ├── ColorUtils.kt │ │ │ ├── EncryptUtils.kt │ │ │ ├── FileIOUtils.kt │ │ │ ├── FileUtils.kt │ │ │ ├── HttpUtils.kt │ │ │ ├── ShareUtils.kt │ │ │ ├── SizeUtils.kt │ │ │ ├── ThemeUtils.kt │ │ │ └── TimeUtils.kt │ │ │ ├── constant │ │ │ ├── ActionConstant.kt │ │ │ ├── NetConstant.kt │ │ │ ├── PermissionConstant.kt │ │ │ └── ShareConstant.kt │ │ │ └── factory │ │ │ └── FunctionFactory.kt │ └── res │ │ ├── anim │ │ ├── anim_fade_in.xml │ │ ├── anim_fade_out.xml │ │ ├── anim_romove_anim_in.xml │ │ ├── anim_romove_anim_out.xml │ │ ├── anim_slide_in_above.xml │ │ ├── anim_slide_in_bottom.xml │ │ ├── anim_slide_in_left.xml │ │ ├── anim_slide_in_right.xml │ │ ├── anim_slide_out_above.xml │ │ ├── anim_slide_out_bottom.xml │ │ ├── anim_slide_out_left.xml │ │ └── anim_slide_out_right.xml │ │ ├── drawable │ │ ├── bg_ripple.xml │ │ ├── bg_ripple_r10.xml │ │ ├── bg_ripple_r12.xml │ │ ├── bg_ripple_r15.xml │ │ ├── bg_ripple_r18.xml │ │ ├── bg_ripple_r20.xml │ │ ├── bg_ripple_r8.xml │ │ ├── bg_shape_paragraph_space.xml │ │ ├── bg_shape_r16.xml │ │ ├── ic_about.xml │ │ ├── ic_add.xml │ │ ├── ic_add_folder.xml │ │ ├── ic_app_browser.xml │ │ ├── ic_app_icon.xml │ │ ├── ic_app_notify_icon.xml │ │ ├── ic_ash.xml │ │ ├── ic_auth_sents.xml │ │ ├── ic_back.xml │ │ ├── ic_back2.xml │ │ ├── ic_back_white.xml │ │ ├── ic_backspace.xml │ │ ├── ic_baike_digest.xml │ │ ├── ic_blng_sents.xml │ │ ├── ic_bullist_dot.xml │ │ ├── ic_clear.xml │ │ ├── ic_clear_cache.xml │ │ ├── ic_clear_history.xml │ │ ├── ic_clear_word_book.xml │ │ ├── ic_clear_word_list.xml │ │ ├── ic_collect.xml │ │ ├── ic_collect1.xml │ │ ├── ic_collected.xml │ │ ├── ic_copy.xml │ │ ├── ic_count_down.xml │ │ ├── ic_daily_sentence.xml │ │ ├── ic_dark_mode.xml │ │ ├── ic_def_voice.xml │ │ ├── ic_delete.xml │ │ ├── ic_dict_baidu.xml │ │ ├── ic_dict_biying.xml │ │ ├── ic_dict_card.xml │ │ ├── ic_dict_ciyuan.xml │ │ ├── ic_dict_deepl.xml │ │ ├── ic_dict_google.xml │ │ ├── ic_dict_haici.xml │ │ ├── ic_dict_handian.xml │ │ ├── ic_dict_jianqiao_ee.xml │ │ ├── ic_dict_jianqiao_he.xml │ │ ├── ic_dict_jinshan.xml │ │ ├── ic_dict_kelinsi.xml │ │ ├── ic_dict_langwen.xml │ │ ├── ic_dict_momo.xml │ │ ├── ic_dict_niujin.xml │ │ ├── ic_dict_tencent.xml │ │ ├── ic_dict_weishi.xml │ │ ├── ic_dict_youdao.xml │ │ ├── ic_down.xml │ │ ├── ic_download_white.xml │ │ ├── ic_edit.xml │ │ ├── ic_edit2.xml │ │ ├── ic_etym.xml │ │ ├── ic_external.xml │ │ ├── ic_fold_edit.xml │ │ ├── ic_folder.xml │ │ ├── ic_folder1.xml │ │ ├── ic_github.xml │ │ ├── ic_grammar_check.xml │ │ ├── ic_grammar_check2.xml │ │ ├── ic_history.xml │ │ ├── ic_iconfont.xml │ │ ├── ic_image_options.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_launcher_foreground.xml │ │ ├── ic_launcher_monochrome.xml │ │ ├── ic_load_failed.xml │ │ ├── ic_more_white.xml │ │ ├── ic_move.xml │ │ ├── ic_netdisk.xml │ │ ├── ic_no_data.xml │ │ ├── ic_paste.xml │ │ ├── ic_phrase.xml │ │ ├── ic_quick_search.xml │ │ ├── ic_recommended.xml │ │ ├── ic_redo.xml │ │ ├── ic_redo_off.xml │ │ ├── ic_redo_on.xml │ │ ├── ic_refresh.xml │ │ ├── ic_rel_word.xml │ │ ├── ic_rename.xml │ │ ├── ic_right.xml │ │ ├── ic_search.xml │ │ ├── ic_search_widget.xml │ │ ├── ic_select_all.xml │ │ ├── ic_settings.xml │ │ ├── ic_share_white.xml │ │ ├── ic_sound.xml │ │ ├── ic_sound_on.xml │ │ ├── ic_special.xml │ │ ├── ic_star_solid.xml │ │ ├── ic_suggest_search.xml │ │ ├── ic_suggest_search2.xml │ │ ├── ic_switch_list.xml │ │ ├── ic_system_theme_color.xml │ │ ├── ic_theme_color.xml │ │ ├── ic_thesaurus.xml │ │ ├── ic_tick.xml │ │ ├── ic_undo.xml │ │ ├── ic_undo_off.xml │ │ ├── ic_undo_on.xml │ │ ├── ic_unfold_up_and_down.xml │ │ ├── ic_unfold_white.xml │ │ ├── ic_unselect_all.xml │ │ ├── ic_voice.xml │ │ ├── ic_voice2.xml │ │ ├── ic_voice3.xml │ │ ├── ic_voice_on.xml │ │ ├── ic_web_trans.xml │ │ ├── ic_welcome_screen.xml │ │ ├── ic_word_book.xml │ │ ├── ic_word_book2.xml │ │ ├── ic_word_list.xml │ │ ├── ic_word_list2.xml │ │ ├── splash_animate_icon.xml │ │ ├── splash_animate_icon_1.xml │ │ ├── splash_animate_icon_2.xml │ │ ├── splash_animate_icon_3.xml │ │ ├── splash_animate_icon_4.xml │ │ └── splash_animate_icon_5.xml │ │ ├── layout │ │ ├── activity_bug_handler.xml │ │ ├── activity_day_sentence.xml │ │ ├── activity_dict.xml │ │ ├── activity_grammar_check.xml │ │ ├── activity_quick_search.xml │ │ ├── activity_settings.xml │ │ ├── activity_web.xml │ │ ├── activity_word_book.xml │ │ ├── activity_word_list.xml │ │ ├── dialog_count_down_input.xml │ │ ├── dialog_progress_bar.xml │ │ ├── dialog_speech_input.xml │ │ ├── dialog_word_book_input.xml │ │ ├── dialog_word_book_select.xml │ │ ├── fragment_day_sentence.xml │ │ ├── fragment_dict_definition.xml │ │ ├── fragment_dict_detail.xml │ │ ├── fragment_dict_detail_co.xml │ │ ├── fragment_dict_detail_ee.xml │ │ ├── fragment_dict_detail_jm.xml │ │ ├── fragment_dict_extra.xml │ │ ├── fragment_dict_has.xml │ │ ├── fragment_dict_search.xml │ │ ├── fragment_dict_welcome.xml │ │ ├── fragment_settings_about.xml │ │ ├── fragment_settings_app_update.xml │ │ ├── fragment_settings_dict_card.xml │ │ ├── fragment_settings_main.xml │ │ ├── fragment_settings_welcome_screen.xml │ │ ├── fragment_word_book_classification.xml │ │ ├── fragment_word_book_detail.xml │ │ ├── item_dict_auth_sents.xml │ │ ├── item_dict_blng_classification.xml │ │ ├── item_dict_blng_sents.xml │ │ ├── item_dict_collins_inner.xml │ │ ├── item_dict_collins_outer.xml │ │ ├── item_dict_ee_inner.xml │ │ ├── item_dict_ee_outer.xml │ │ ├── item_dict_eh_header_explain.xml │ │ ├── item_dict_eh_header_inflection.xml │ │ ├── item_dict_etym.xml │ │ ├── item_dict_external_dict_trans.xml │ │ ├── item_dict_he_header_explain.xml │ │ ├── item_dict_phrs.xml │ │ ├── item_dict_rel_word.xml │ │ ├── item_dict_search_wordline.xml │ │ ├── item_dict_select_word_book.xml │ │ ├── item_dict_special_inner.xml │ │ ├── item_dict_special_outer.xml │ │ ├── item_dict_suggestion_word.xml │ │ ├── item_dict_syno_anto.xml │ │ ├── item_dict_thesurus_inner.xml │ │ ├── item_dict_thesurus_outer.xml │ │ ├── item_dict_typo.xml │ │ ├── item_dict_web_trans_inner.xml │ │ ├── item_dict_web_trans_outer.xml │ │ ├── item_grammar_check.xml │ │ ├── item_popup_menu.xml │ │ ├── item_quick_search_wordline.xml │ │ ├── item_settings_app_update_data.xml │ │ ├── item_settings_open_source.xml │ │ ├── item_word_book_classification.xml │ │ ├── item_word_book_detail.xml │ │ ├── item_word_list.xml │ │ ├── layout_image_viewer_cover.xml │ │ ├── layout_load_failed.xml │ │ ├── layout_loading_view.xml │ │ ├── pop_menu_recycleview.xml │ │ ├── widget_day_sentence.xml │ │ └── widget_quick_search.xml │ │ ├── menu │ │ ├── bug_handler_menu.xml │ │ ├── day_sentence_menu.xml │ │ ├── main_menu.xml │ │ ├── photo_view_menu.xml │ │ ├── web_menu.xml │ │ ├── word_book_menu.xml │ │ └── word_list_menu.xml │ │ ├── mipmap-anydpi │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── values-night-v29 │ │ └── themes.xml │ │ ├── values-night-v31 │ │ └── themes.xml │ │ ├── values-night │ │ ├── colors.xml │ │ ├── themes.xml │ │ └── themes_overlay.xml │ │ ├── values-v29 │ │ └── themes.xml │ │ ├── values-v31 │ │ └── themes.xml │ │ ├── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ ├── styles.xml │ │ ├── themes.xml │ │ └── themes_overlay.xml │ │ └── xml │ │ ├── backup_rules.xml │ │ ├── data_extraction_rules.xml │ │ ├── day_sentence_widget_info.xml │ │ ├── file_paths.xml │ │ └── quick_search_widget_info.xml │ └── test │ └── java │ └── com │ └── qxtao │ └── easydict │ └── ExampleUnitTest.kt ├── build.gradle.kts ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle.kts /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/deploymentTargetDropDown.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /.idea/deploymentTargetSelector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 19 | 20 | -------------------------------------------------------------------------------- /.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /.idea/migrations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/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 -------------------------------------------------------------------------------- /app/release/app-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/release/app-release.apk -------------------------------------------------------------------------------- /app/release/baselineProfiles/0/app-release.dm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/release/baselineProfiles/0/app-release.dm -------------------------------------------------------------------------------- /app/release/baselineProfiles/1/app-release.dm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/release/baselineProfiles/1/app-release.dm -------------------------------------------------------------------------------- /app/release/output-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "artifactType": { 4 | "type": "APK", 5 | "kind": "Directory" 6 | }, 7 | "applicationId": "com.qxtao.easydict", 8 | "variantName": "release", 9 | "elements": [ 10 | { 11 | "type": "SINGLE", 12 | "filters": [], 13 | "attributes": [], 14 | "versionCode": 113, 15 | "versionName": "1.1.3", 16 | "outputFile": "app-release.apk" 17 | } 18 | ], 19 | "elementType": "File", 20 | "baselineProfiles": [ 21 | { 22 | "minApi": 28, 23 | "maxApi": 30, 24 | "baselineProfiles": [ 25 | "baselineProfiles/1/app-release.dm" 26 | ] 27 | }, 28 | { 29 | "minApi": 31, 30 | "maxApi": 2147483647, 31 | "baselineProfiles": [ 32 | "baselineProfiles/0/app-release.dm" 33 | ] 34 | } 35 | ], 36 | "minSdkVersionForDexing": 26 37 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/com/qxtao/easydict/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.qxtao.easydict", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/assets/dict/simple_dict.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/src/main/assets/dict/simple_dict.zip -------------------------------------------------------------------------------- /app/src/main/assets/fonts/Georgia Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/src/main/assets/fonts/Georgia Italic.ttf -------------------------------------------------------------------------------- /app/src/main/assets/fonts/Georgia Normal.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/src/main/assets/fonts/Georgia Normal.ttf -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/adapter/dict/DictConstant.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.adapter.dict 2 | 3 | const val TYPE_BLNG_CLASSIFICATION_SELECT = -1001 4 | const val TYPE_BLNG_CLASSIFICATION_NORMAL = -1000 5 | 6 | const val TYPE_THEASAURUS_HEADER = -1002 7 | const val TYPE_THEASAURUS_NORMAL = -1003 -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/adapter/dict/DictSelectWordBookAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.adapter.dict 2 | 3 | import android.annotation.SuppressLint 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import android.widget.TextView 8 | import androidx.recyclerview.widget.RecyclerView 9 | import com.qxtao.easydict.R 10 | 11 | @SuppressLint("NotifyDataSetChanged") 12 | class DictSelectWordBookAdapter(private val bookNameList: List) : RecyclerView.Adapter() { 13 | private var onItemClickListener: OnItemClickListener? = null 14 | 15 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 16 | val view: View = 17 | LayoutInflater.from(parent.context).inflate(R.layout.item_dict_select_word_book, parent, false) 18 | return ViewHolder(view) 19 | } 20 | 21 | override fun onBindViewHolder(holder: ViewHolder, position: Int) { 22 | val item = bookNameList[position] 23 | holder.textBookName.text = item 24 | holder.textBookName.setOnClickListener { 25 | onItemClickListener?.onItemClick(position) 26 | } 27 | } 28 | 29 | override fun getItemCount(): Int { 30 | return bookNameList.size 31 | } 32 | 33 | interface OnItemClickListener { 34 | fun onItemClick(position: Int) 35 | } 36 | 37 | fun setOnItemClickListener(listener: OnItemClickListener) { 38 | onItemClickListener = listener 39 | } 40 | 41 | fun getBookName(position: Int) = bookNameList[position] 42 | 43 | class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { 44 | val textBookName: TextView = itemView.findViewById(R.id.tv_book_name) 45 | } 46 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/adapter/popupmenu/PopupMenuItem.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.adapter.popupmenu 2 | 3 | class PopupMenuItem ( 4 | val position: Int, 5 | val menuItemText: String, 6 | var isMenuItemSelected: Boolean 7 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/adapter/settings/AppUpdateDataItem.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.adapter.settings 2 | 3 | class AppUpdateDataItem( 4 | val publishedAt: String, 5 | val htmlUrl: String, 6 | val name: String, 7 | val browserDownloadUrl: String, 8 | val body: String 9 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/adapter/settings/OpenSourceAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.adapter.settings 2 | 3 | import android.view.LayoutInflater 4 | import android.view.View 5 | import android.view.ViewGroup 6 | import android.widget.TextView 7 | import androidx.recyclerview.widget.RecyclerView 8 | import com.qxtao.easydict.R 9 | import com.qxtao.easydict.ui.activity.web.WebActivity 10 | 11 | 12 | class OpenSourceAdapter(private val openSourceItems: List) : 13 | RecyclerView.Adapter() { 14 | 15 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 16 | val view: View = 17 | LayoutInflater.from(parent.context).inflate(R.layout.item_settings_open_source, parent, false) 18 | return ViewHolder(view) 19 | } 20 | 21 | override fun onBindViewHolder(holder: ViewHolder, position: Int) { 22 | val item: OpenSourceItem = openSourceItems[position] 23 | holder.textTitle.text = item.title 24 | holder.textInfo.text = item.info 25 | holder.textLink.text = item.link 26 | holder.textLicense.text = item.license 27 | 28 | holder.itemView.setOnClickListener { 29 | val url = item.link 30 | WebActivity.start(holder.itemView.context, url) 31 | } 32 | } 33 | 34 | override fun getItemCount(): Int { 35 | return openSourceItems.size 36 | } 37 | 38 | class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { 39 | val textTitle: TextView = itemView.findViewById(R.id.tv_open_source_item_title) 40 | val textInfo: TextView = itemView.findViewById(R.id.tv_open_source_item_info) 41 | val textLink: TextView = itemView.findViewById(R.id.tv_open_source_item_link) 42 | val textLicense: TextView = itemView.findViewById(R.id.tv_open_source_item_license) 43 | } 44 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/adapter/settings/OpenSourceItem.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.adapter.settings 2 | 3 | class OpenSourceItem( 4 | val title: String, 5 | val info: String, 6 | val link: String, 7 | val license: String 8 | ){ 9 | override fun toString(): String { 10 | return """ 11 | "title": "$title", 12 | "info": "$info", 13 | "link": "$link", 14 | "license": "$license" 15 | """.trimIndent() 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/adapter/wordlist/WordListItem.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.adapter.wordlist 2 | 3 | class WordListItem( 4 | val wordName: String, 5 | val wordMean: String, 6 | var isOnClick: Boolean 7 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/activity/daysentence/DaySentenceConstant.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.activity.daysentence 2 | 3 | const val ORIGIN_DATE = "2020-01-01" -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/activity/settings/SettingsConstant.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.activity.settings 2 | 3 | 4 | const val SETTINGS_DICT_CARD = "dict_card" 5 | const val SETTINGS_WELCOME_SCREEN = "welcome_screen" 6 | const val SETTINGS_ABOUT = "about" 7 | const val SETTINGS_APP_UPDATE = "app_update" -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/activity/web/WebViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.activity.web 2 | 3 | import androidx.lifecycle.ViewModel 4 | 5 | class WebViewModel: ViewModel() { 6 | var currentUrl: String? = null 7 | set(url) { 8 | if (url.isNullOrBlank()) return 9 | else field = url 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/activity/wordbook/WordBookConstant.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.activity.wordbook 2 | 3 | 4 | const val WORD_BOOK_MY_COLLECT = "我的收藏" 5 | const val BOOK_WORD_MODE_NORMAL = 0 6 | const val BOOK_WORD_MODE_CONTROL = 1 -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/fragment/dict/DictDetailCOFragment.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.fragment.dict 2 | 3 | import androidx.recyclerview.widget.LinearLayoutManager 4 | import androidx.recyclerview.widget.RecyclerView 5 | import com.qxtao.easydict.adapter.dict.DictCollinsOuterAdapter 6 | import com.qxtao.easydict.databinding.FragmentDictDetailCoBinding 7 | import com.qxtao.easydict.ui.activity.dict.DictActivity 8 | import com.qxtao.easydict.ui.activity.dict.DictViewModel 9 | import com.qxtao.easydict.ui.base.BaseFragment 10 | 11 | 12 | class DictDetailCOFragment : BaseFragment(FragmentDictDetailCoBinding::inflate) { 13 | // define variable 14 | private lateinit var dictViewModel: DictViewModel 15 | private lateinit var rvDictCollinsOuterAdapter: DictCollinsOuterAdapter 16 | 17 | // define widget 18 | private lateinit var rvCollins: RecyclerView 19 | 20 | override fun bindViews() { 21 | rvCollins = binding.rvCollins 22 | } 23 | 24 | override fun initViews() { 25 | dictViewModel = (activity as DictActivity).getDictViewModel() 26 | 27 | rvDictCollinsOuterAdapter = DictCollinsOuterAdapter(ArrayList()) 28 | rvCollins.adapter = rvDictCollinsOuterAdapter 29 | rvCollins.layoutManager = LinearLayoutManager(requireActivity()) 30 | dictViewModel.collinsResponse.observe(this){ 31 | if ((it?.collins_entries?.size ?: 0) > 0){ 32 | rvDictCollinsOuterAdapter.setData(it?.collins_entries) 33 | } 34 | } 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/fragment/dict/DictDetailEEFragment.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.fragment.dict 2 | 3 | import androidx.recyclerview.widget.LinearLayoutManager 4 | import androidx.recyclerview.widget.RecyclerView 5 | import com.qxtao.easydict.adapter.dict.DictEEDictOuterAdapter 6 | import com.qxtao.easydict.databinding.FragmentDictDetailEeBinding 7 | import com.qxtao.easydict.ui.activity.dict.DictActivity 8 | import com.qxtao.easydict.ui.activity.dict.DictViewModel 9 | import com.qxtao.easydict.ui.base.BaseFragment 10 | 11 | 12 | class DictDetailEEFragment : BaseFragment(FragmentDictDetailEeBinding::inflate) { 13 | // define variable 14 | private lateinit var dictViewModel: DictViewModel 15 | private lateinit var rvDictEEDictOuterAdapter: DictEEDictOuterAdapter 16 | 17 | // define widget 18 | private lateinit var rvEEDict: RecyclerView 19 | 20 | override fun bindViews() { 21 | rvEEDict = binding.rvEeDict 22 | 23 | } 24 | 25 | override fun initViews() { 26 | dictViewModel = (activity as DictActivity).getDictViewModel() 27 | 28 | rvDictEEDictOuterAdapter = DictEEDictOuterAdapter(ArrayList()) 29 | rvEEDict.adapter = rvDictEEDictOuterAdapter 30 | rvEEDict.layoutManager = LinearLayoutManager(requireActivity()) 31 | dictViewModel.eeDictionaryResponse.observe(this){ 32 | if ((it?.word?.trs?.size ?: 0) > 0){ 33 | rvDictEEDictOuterAdapter.setData(it?.word?.trs) 34 | } 35 | } 36 | } 37 | 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/MaxHeightRecyclerView.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.qxtao.easydict.R 7 | 8 | 9 | class MaxHeightRecyclerView @JvmOverloads constructor( 10 | context: Context, 11 | attrs: AttributeSet? = null, 12 | defStyleAttr: Int = 0 13 | ) : RecyclerView(context, attrs, defStyleAttr) { 14 | 15 | private var mMaxHeight = 0 16 | 17 | init { 18 | val arr = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightRecyclerView) 19 | mMaxHeight = arr.getLayoutDimension(R.styleable.MaxHeightRecyclerView_maxHeight, mMaxHeight) 20 | arr.recycle() 21 | } 22 | 23 | override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { 24 | val h = if (mMaxHeight > 0) { 25 | MeasureSpec.makeMeasureSpec(mMaxHeight, MeasureSpec.AT_MOST) 26 | } else heightMeasureSpec 27 | super.onMeasure(widthMeasureSpec, h) 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/MultiEditText.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.view.inputmethod.EditorInfo 6 | import android.view.inputmethod.InputConnection 7 | import androidx.appcompat.widget.AppCompatEditText 8 | 9 | class MultiEditText @JvmOverloads constructor( 10 | context: Context, 11 | attrs: AttributeSet? = null, 12 | defStyleAttr: Int = 0 13 | ) : AppCompatEditText(context, attrs, defStyleAttr) { 14 | 15 | /** 16 | * 输入法 17 | * @param outAttrs 18 | * @return 19 | */ 20 | override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection? { 21 | val inputConnection = super.onCreateInputConnection(outAttrs) 22 | if (inputConnection != null) { 23 | outAttrs.imeOptions = outAttrs.imeOptions and EditorInfo.IME_FLAG_NO_ENTER_ACTION.inv() 24 | } 25 | return inputConnection 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/FixViewPager.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.view.MotionEvent 6 | import androidx.viewpager.widget.ViewPager 7 | 8 | class FixViewPager : ViewPager { 9 | 10 | constructor(context: Context) : super(context) 11 | 12 | constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) 13 | 14 | override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean = 15 | try { 16 | super.onInterceptTouchEvent(ev) 17 | } catch (e: IllegalArgumentException) { 18 | e.printStackTrace() 19 | false 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/ImageLoader.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer 2 | 3 | import android.graphics.drawable.Drawable 4 | import android.widget.ImageView 5 | 6 | interface ImageLoader { 7 | fun load(imageView: ImageView, url: String?, loaderListener: ImageLoaderListener?) 8 | 9 | fun stopLoad(imageView: ImageView) 10 | 11 | interface ImageLoaderListener { 12 | fun onLoadFailed(errorDrawable: Drawable?) 13 | 14 | fun onLoadSuccess(drawable: Drawable?) 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/ImageViewLoader.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer 2 | 3 | import android.graphics.drawable.Animatable 4 | import android.widget.ImageView 5 | import coil.dispose 6 | import coil.load 7 | 8 | object ImageViewLoader : ImageLoader { 9 | override fun load(imageView: ImageView, url: String?, loaderListener: ImageLoader.ImageLoaderListener?) { 10 | imageView.load(url){ 11 | target( 12 | onSuccess = { drawable -> 13 | loaderListener?.onLoadSuccess(drawable) 14 | imageView.post { 15 | imageView.setImageDrawable(drawable) 16 | if (drawable is Animatable && !drawable.isRunning) { 17 | drawable.start() 18 | } 19 | } 20 | }, 21 | onError = { drawable -> 22 | loaderListener?.onLoadFailed(drawable) 23 | } 24 | ) 25 | } 26 | } 27 | 28 | override fun stopLoad(imageView: ImageView) { 29 | imageView.dispose() 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/ImageViewerCover.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer 2 | 3 | import android.app.Activity 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import com.qxtao.easydict.R 8 | import com.qxtao.easydict.ui.view.LoadFailedView 9 | import com.qxtao.easydict.ui.view.LoadingView 10 | 11 | class ImageViewerCover(private val activity: Activity) { 12 | private var coverView: View? = null 13 | 14 | fun getLoadingView(): View { 15 | return LoadingView(activity) 16 | } 17 | 18 | 19 | fun getLoadFailedView(): View { 20 | return LoadFailedView(activity).apply { 21 | setHintText(activity.getString(R.string.failed_to_load_click_the_screen_to_try_again)) 22 | } 23 | } 24 | 25 | fun getCoverView(): View? { 26 | if (coverView == null) { 27 | val parentView = activity.findViewById(android.R.id.content) 28 | coverView = LayoutInflater.from(activity).inflate(R.layout.layout_image_viewer_cover, parentView, false) 29 | } 30 | return coverView!! 31 | } 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/OnDragChangeListener.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer 2 | 3 | interface OnDragChangeListener { 4 | fun onRelease() 5 | fun onDragChange(dy: Int, scale: Float, fraction: Float) 6 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/photoview/Compat.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer.photoview 2 | 3 | import android.view.View 4 | 5 | internal object Compat { 6 | fun postOnAnimation(view: View, runnable: Runnable) { 7 | postOnAnimationJellyBean(view, runnable) 8 | } 9 | 10 | private fun postOnAnimationJellyBean(view: View, runnable: Runnable) { 11 | view.postOnAnimation(runnable) 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/photoview/OnGestureListener.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer.photoview 2 | 3 | internal interface OnGestureListener { 4 | fun onDrag(dx: Float, dy: Float) 5 | 6 | fun onFling(startX: Float, startY: Float, velocityX: Float, velocityY: Float) 7 | 8 | fun onScale(scaleFactor: Float, focusX: Float, focusY: Float) 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/photoview/OnMatrixChangedListener.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer.photoview 2 | 3 | import android.graphics.RectF 4 | 5 | interface OnMatrixChangedListener { 6 | fun onMatrixChanged(rect: RectF?) 7 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/photoview/OnOutsidePhotoTapListener.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer.photoview 2 | 3 | import android.widget.ImageView 4 | 5 | interface OnOutsidePhotoTapListener { 6 | fun onOutsidePhotoTap(imageView: ImageView?) 7 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/photoview/OnPhotoTapListener.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer.photoview 2 | 3 | import android.widget.ImageView 4 | 5 | interface OnPhotoTapListener { 6 | fun onPhotoTap(view: ImageView?, x: Float, y: Float) 7 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/photoview/OnScaleChangedListener.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer.photoview 2 | 3 | interface OnScaleChangedListener { 4 | fun onScaleChange(scaleFactor: Float, focusX: Float, focusY: Float) 5 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/photoview/OnSingleFlingListener.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer.photoview 2 | 3 | import android.view.MotionEvent 4 | 5 | interface OnSingleFlingListener { 6 | fun onFling(e1: MotionEvent?, e2: MotionEvent?, velocityX: Float, velocityY: Float): Boolean 7 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/photoview/OnViewDragListener.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer.photoview 2 | 3 | interface OnViewDragListener { 4 | fun onDrag(dx: Float, dy: Float) 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/photoview/OnViewTapListener.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer.photoview 2 | 3 | import android.view.View 4 | 5 | interface OnViewTapListener { 6 | fun onViewTap(view: View?, x: Float, y: Float) 7 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/ui/view/imageviewer/photoview/Util.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.ui.view.imageviewer.photoview 2 | 3 | import android.view.MotionEvent 4 | import android.widget.ImageView 5 | import android.widget.ImageView.ScaleType 6 | 7 | internal object Util { 8 | fun checkZoomLevels(minZoom: Float, midZoom: Float, maxZoom: Float) { 9 | require(!(minZoom >= midZoom) || !(midZoom >= maxZoom)) { 10 | "Minimum zoom has to be less than Medium zoom. Call setMinimumZoom() with a more appropriate value" 11 | } 12 | } 13 | 14 | fun hasDrawable(imageView: ImageView): Boolean { 15 | return imageView.drawable != null 16 | } 17 | 18 | fun isSupportedScaleType(scaleType: ScaleType): Boolean { 19 | return scaleType != ScaleType.MATRIX 20 | } 21 | 22 | fun getPointerIndex(action: Int): Int { 23 | return (action and MotionEvent.ACTION_POINTER_INDEX_MASK) shr MotionEvent.ACTION_POINTER_INDEX_SHIFT 24 | } 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/utils/CustomTypefaceSpan.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.utils 2 | 3 | import android.graphics.Paint 4 | import android.graphics.Typeface 5 | import android.text.TextPaint 6 | import android.text.style.TypefaceSpan 7 | 8 | class CustomTypefaceSpan(family: String?, private val newType: Typeface) : 9 | TypefaceSpan(family) { 10 | override fun updateDrawState(ds: TextPaint) { 11 | applyCustomTypeFace(ds, newType) 12 | } 13 | 14 | override fun updateMeasureState(paint: TextPaint) { 15 | applyCustomTypeFace(paint, newType) 16 | } 17 | 18 | companion object { 19 | private fun applyCustomTypeFace(paint: Paint, tf: Typeface) { 20 | val oldStyle: Int 21 | val old = paint.typeface 22 | oldStyle = old?.style ?: 0 23 | 24 | val fake = oldStyle and tf.style.inv() 25 | if ((fake and Typeface.BOLD) != 0) { 26 | paint.isFakeBoldText = true 27 | } 28 | 29 | if ((fake and Typeface.ITALIC) != 0) { 30 | paint.textSkewX = -0.25f 31 | } 32 | 33 | paint.setTypeface(tf) 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/utils/LinkClickMovementMethod.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.utils 2 | 3 | import android.text.Spannable 4 | import android.text.method.LinkMovementMethod 5 | import android.text.style.ClickableSpan 6 | import android.view.MotionEvent 7 | import android.widget.TextView 8 | 9 | 10 | class LinkClickMovementMethod : LinkMovementMethod() { 11 | override fun onTouchEvent(widget: TextView, buffer: Spannable, event: MotionEvent): Boolean { 12 | val action = event.action 13 | if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { 14 | var x = event.x.toInt() 15 | var y = event.y.toInt() 16 | 17 | x -= widget.totalPaddingLeft 18 | y -= widget.totalPaddingTop 19 | 20 | x += widget.scrollX 21 | y += widget.scrollY 22 | 23 | val layout = widget.layout 24 | val line = layout.getLineForVertical(y) 25 | val off = layout.getOffsetForHorizontal(line, x.toFloat()) 26 | val links = buffer.getSpans(off, off, ClickableSpan::class.java) 27 | if (links.isNotEmpty() && off >= widget.text.length) { 28 | return true 29 | } 30 | } 31 | return super.onTouchEvent(widget, buffer, event) 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/utils/common/ActivityUtils.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.utils.common 2 | 3 | import com.qxtao.easydict.application.EasyDictApplication 4 | 5 | object ActivityUtils { 6 | fun finishAllActivitiesExceptNewest() { 7 | val activities = EasyDictApplication.instance.activities 8 | val newestActivity = activities.lastOrNull() 9 | activities.forEach { activity -> 10 | if (activity != newestActivity) { 11 | activity.finish() 12 | } 13 | } 14 | } 15 | 16 | fun restartAllActivities() { 17 | val activities = EasyDictApplication.instance.activities 18 | activities.forEach { activity -> 19 | activity.recreate() 20 | } 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/utils/common/EncryptUtils.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.utils.common 2 | 3 | import java.io.File 4 | import java.io.FileInputStream 5 | import java.security.MessageDigest 6 | 7 | object EncryptUtils { 8 | fun encryptMD5ToString(str: String): String { 9 | val md5Digest = MessageDigest.getInstance("MD5") 10 | val byteArray = md5Digest.digest(str.toByteArray()) 11 | return byteArrayToHexString(byteArray) 12 | } 13 | 14 | fun encryptMD5FileToString(filePath: String): String { 15 | val file = File(filePath) 16 | val md5Digest = MessageDigest.getInstance("MD5") 17 | val byteArray = ByteArray(8192) 18 | val inputStream = FileInputStream(file) 19 | var bytesRead: Int 20 | while (inputStream.read(byteArray).also { bytesRead = it } != -1) { 21 | md5Digest.update(byteArray, 0, bytesRead) 22 | } 23 | inputStream.close() 24 | return byteArrayToHexString(md5Digest.digest()) 25 | } 26 | 27 | 28 | 29 | private fun byteArrayToHexString(byteArray: ByteArray): String { 30 | val hexString = StringBuilder() 31 | for (byte in byteArray) { 32 | val hex = Integer.toHexString(0xFF and byte.toInt()) 33 | if (hex.length == 1) { 34 | hexString.append('0') 35 | } 36 | hexString.append(hex) 37 | } 38 | return hexString.toString() 39 | } 40 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/utils/common/FileIOUtils.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.utils.common 2 | 3 | import java.io.BufferedInputStream 4 | import java.io.BufferedReader 5 | import java.io.File 6 | import java.io.FileReader 7 | import java.io.IOException 8 | import java.io.InputStream 9 | 10 | object FileIOUtils { 11 | fun readFile2String(path: String): String { 12 | val file = File(path) 13 | val stringBuilder = StringBuilder() 14 | try { 15 | val bufferedReader = BufferedReader(FileReader(file)) 16 | var line: String? = bufferedReader.readLine() 17 | while (line != null) { 18 | stringBuilder.append(line) 19 | line = bufferedReader.readLine() 20 | } 21 | bufferedReader.close() 22 | } catch (e: IOException) { 23 | e.printStackTrace() 24 | } 25 | return stringBuilder.toString() 26 | } 27 | 28 | fun readFile2String(inputStream: InputStream) : String { 29 | val stringBuilder = StringBuilder() 30 | val bufferedInputStream = BufferedInputStream(inputStream) 31 | val buffer = ByteArray(1024) 32 | var len: Int 33 | while (bufferedInputStream.read(buffer).also { len = it } != -1) { 34 | stringBuilder.append(String(buffer, 0, len)) 35 | } 36 | bufferedInputStream.close() 37 | return stringBuilder.toString() 38 | } 39 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/utils/common/SizeUtils.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.utils.common 2 | 3 | import android.content.res.Resources 4 | import android.util.TypedValue 5 | 6 | object SizeUtils { 7 | /** 8 | * dp转px 9 | */ 10 | fun dp2px(dpVal: Float): Int { 11 | return TypedValue.applyDimension( 12 | TypedValue.COMPLEX_UNIT_DIP, 13 | dpVal, 14 | Resources.getSystem().displayMetrics 15 | ).toInt() 16 | } 17 | 18 | /** 19 | * sp转px 20 | */ 21 | fun sp2px(spVal: Float): Int { 22 | return TypedValue.applyDimension( 23 | TypedValue.COMPLEX_UNIT_SP, 24 | spVal, 25 | Resources.getSystem().displayMetrics 26 | ).toInt() 27 | } 28 | 29 | /** 30 | * px转dp 31 | */ 32 | fun px2dp(pxVal: Float): Float { 33 | val scale = Resources.getSystem().displayMetrics.density 34 | return (pxVal / scale) 35 | } 36 | 37 | /** 38 | * px转sp 39 | */ 40 | fun px2sp(pxVal: Float): Float { 41 | return (pxVal / Resources.getSystem().displayMetrics.density) 42 | } 43 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/utils/constant/ActionConstant.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.utils.constant 2 | 3 | object ActionConstant { 4 | // broadcast action 5 | const val ACTION_CLOSE_QUICK_SEARCH_NOTIFICATION = "com.qxtao.easydict.action.CLOSE_QUICK_SEARCH_NOTIFICATION" 6 | const val ACTION_CREATE_QUICK_SEARCH_NOTIFICATION = "com.qxtao.easydict.action.CREATE_QUICK_SEARCH_NOTIFICATION" 7 | } -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/utils/constant/NetConstant.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.utils.constant 2 | 3 | object NetConstant { 4 | // 网络请求基地址 5 | const val baseService = "https://dict.youdao.com" 6 | 7 | // 每日一句 8 | const val imgApi = "https://api.ee123.net/img/jump.php?day=" 9 | const val dailySentenceApi = "https://sentence.iciba.com/?c=dailysentence&m=getdetail&title=" 10 | 11 | // 语法检查 12 | const val grammarCheck = "https://inter.youdao.com/grammarCheck" 13 | 14 | // 在线词典 15 | const val dictBase = "https://inter.youdao.com/intersearch" 16 | const val dictMore = "https://dict.youdao.com/jsonapi" 17 | const val dictVoice = "https://dict.youdao.com/dictvoice" 18 | const val voiceUk = "https://dict.youdao.com/dictvoice?type=1&audio=" 19 | const val voiceUs = "https://dict.youdao.com/dictvoice?type=0&audio=" 20 | 21 | // 应用更新 22 | const val appUpdate = "https://api.github.com/repos/QX-Tao/EasyDict/releases" 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/qxtao/easydict/utils/constant/PermissionConstant.kt: -------------------------------------------------------------------------------- 1 | package com.qxtao.easydict.utils.constant 2 | 3 | object PermissionConstant { 4 | const val REQUEST_CODE_WRITE_EXTERNAL_STORAGE = 100 5 | const val REQUEST_CODE_RECORD_AUDIO = 101 6 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_fade_in.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_fade_out.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_romove_anim_in.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_romove_anim_out.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_slide_in_above.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_slide_in_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_slide_in_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_slide_in_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_slide_out_above.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_slide_out_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_slide_out_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_slide_out_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_ripple_r10.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_ripple_r12.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_ripple_r15.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_ripple_r18.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_ripple_r20.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_ripple_r8.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_shape_paragraph_space.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_shape_r16.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_about.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_folder.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_app_notify_icon.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_ash.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_auth_sents.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_back.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_back2.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_back_white.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backspace.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bullist_dot.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear_cache.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear_history.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear_word_book.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear_word_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_collect.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_collect1.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_collected.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_copy.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_count_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_daily_sentence.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dark_mode.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_def_voice.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dict_biying.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dict_card.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dict_google.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dict_haici.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dict_jinshan.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dict_youdao.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_download_white.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 7 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit2.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_etym.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_fold_edit.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_folder.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_folder1.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_grammar_check.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_grammar_check2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_history.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_image_options.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_load_failed.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_more_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_move.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_phrase.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_quick_search.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_redo.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_redo_off.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_redo_on.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_refresh.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rel_word.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rename.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_right.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search_widget.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_select_all.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_share_white.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sound.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_special.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_star_solid.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_suggest_search.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_suggest_search2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_switch_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_system_theme_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_theme_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_thesaurus.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tick.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_undo.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_undo_off.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_undo_on.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_unfold_up_and_down.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_unfold_white.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_unselect_all.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_voice.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_voice2.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_voice3.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_web_trans.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_welcome_screen.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_word_book.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_word_book2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_word_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/splash_animate_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/splash_animate_icon_1.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/splash_animate_icon_2.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/splash_animate_icon_3.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/splash_animate_icon_4.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_day_sentence.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 21 | 22 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_dict.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 17 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_word_book.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_progress_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 16 | 17 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_dict_definition.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 20 | 21 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_dict_has.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 19 | 20 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_word_book_classification.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 21 | 22 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_dict_blng_classification.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_dict_ee_outer.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_dict_eh_header_explain.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_dict_eh_header_inflection.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_dict_external_dict_trans.xml: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | 23 | 24 | 29 | 30 | 31 | 32 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_dict_phrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_dict_rel_word.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 19 | 20 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_dict_select_word_book.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_dict_suggestion_word.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_dict_thesurus_outer.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_dict_typo.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 20 | 21 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_word_book_classification.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 18 | 19 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_image_viewer_cover.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_load_failed.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_loading_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/pop_menu_recycleview.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/widget_day_sentence.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | 17 | 31 | 32 | 45 | 46 | -------------------------------------------------------------------------------- /app/src/main/res/layout/widget_quick_search.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 10 | 11 | 12 | 24 | 25 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/menu/bug_handler_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/menu/day_sentence_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/menu/main_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/photo_view_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/menu/web_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | 18 | 19 | 23 | 24 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/menu/word_book_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 14 | 15 | 20 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/menu/word_list_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/values-night-v29/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/values-night-v31/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | #FFFFFF 6 | #000000 7 | #FFCCCCCC 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes_overlay.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/values-v31/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | #000000 6 | #FFFFFF 7 | #FF333333 8 | #14000000 9 | 10 | 11 | #FF000000 12 | #FFFFFFFF 13 | #FF808080 14 | #00000000 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 64dp 4 | 24dp 5 | 16dp 6 | 8dp 7 | 24dp 8 | 9 | 10 | 68sp 11 | 34sp 12 | 20sp 13 | 18sp 14 | 16sp 15 | 14sp 16 | 12sp 17 | 10sp 18 | 6sp 19 | 4sp 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes_overlay.xml: -------------------------------------------------------------------------------- 1 | 2 |