├── .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 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
19 |
20 |
--------------------------------------------------------------------------------
/.idea/kotlinc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/migrations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
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 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/day_sentence_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/main_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/photo_view_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/web_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/word_book_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/word_list_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v29/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
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 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/backup_rules.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/data_extraction_rules.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
12 |
13 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/day_sentence_widget_info.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/file_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
11 |
12 |
15 |
16 |
19 |
20 |
23 |
24 |
27 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/quick_search_widget_info.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/test/java/com/qxtao/easydict/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.qxtao.easydict
2 |
3 | import org.junit.Test
4 |
5 | import org.junit.Assert.*
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * See [testing documentation](http://d.android.com/tools/testing).
11 | */
12 | class ExampleUnitTest {
13 | @Test
14 | fun addition_isCorrect() {
15 | assertEquals(4, 2 + 2)
16 | }
17 | }
--------------------------------------------------------------------------------
/build.gradle.kts:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 | plugins {
3 | alias(libs.plugins.android.application) apply false
4 | alias(libs.plugins.jetbrains.kotlin.android) apply false
5 | alias(libs.plugins.kotlin.kapt) apply false
6 | }
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Compiler Configuration
2 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
3 | android.useAndroidX=true
4 | android.nonTransitiveRClass=true
5 | kotlin.code.style=official
6 | kotlin.incremental.useClasspathSnapshot=true
7 | # Project Configuration
8 | project.name=EasyDict
9 | project.android.compileSdk=34
10 | project.android.minSdk=26
11 | project.android.targetSdk=34
12 | project.app.packageName=com.qxtao.easydict
13 | project.app.versionName=1.1.3
14 | project.app.versionCode=113
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QX-Tao/EasyDict/53d8e539af4f5827d9c7d9ac6d2db5a62f29d798/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun May 19 15:09:09 CST 2024
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
5 | zipStoreBase=GRADLE_USER_HOME
6 | zipStorePath=wrapper/dists
7 |
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | google {
4 | content {
5 | includeGroupByRegex("com\\.android.*")
6 | includeGroupByRegex("com\\.google.*")
7 | includeGroupByRegex("androidx.*")
8 | }
9 | }
10 | mavenCentral()
11 | gradlePluginPortal()
12 | }
13 | }
14 | dependencyResolutionManagement {
15 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
16 | repositories {
17 | google()
18 | mavenCentral()
19 | maven { url = uri("https://jitpack.io") }
20 | }
21 | }
22 |
23 | rootProject.name = "EasyDict"
24 | include(":app")
25 |
--------------------------------------------------------------------------------