├── .editorconfig ├── .gitattributes ├── .github ├── renovate.json └── workflows │ └── android.yml ├── .gitignore ├── CHANGELOG ├── LICENSE ├── README.md ├── app ├── .gitignore ├── CMakeLists.txt ├── aapt2-resources.cfg ├── build.gradle.kts ├── libs │ ├── IceBox-SDK-1.0.6.aar │ ├── arm64-v8a │ │ └── libizuko.so │ └── armeabi-v7a │ │ └── libizuko.so ├── proguard-rules.pro ├── proguardMapping.txt └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── absinthe │ │ └── anywhere_ │ │ └── ExampleInstrumentedTest.java │ ├── debug │ └── res │ │ └── values │ │ └── strings.xml │ ├── main │ ├── AndroidManifest.xml │ ├── aidl │ │ └── com │ │ │ └── absinthe │ │ │ └── anywhere_ │ │ │ ├── model │ │ │ └── database │ │ │ │ └── AnywhereEntity.aidl │ │ │ └── services │ │ │ └── overlay │ │ │ ├── ICollectorListener.aidl │ │ │ ├── ICollectorService.aidl │ │ │ └── IOverlayService.aidl │ ├── assets │ │ ├── renge.webp │ │ └── renge_no_koe.aac │ ├── cpp │ │ ├── include │ │ │ └── izuko.h │ │ └── izuko.cpp │ ├── ic_launcher-web.png │ ├── java │ │ ├── cn │ │ │ └── vove7 │ │ │ │ └── andro_accessibility_api │ │ │ │ ├── AccessibilityApi.kt │ │ │ │ ├── AppScope.kt │ │ │ │ ├── api │ │ │ │ ├── BaseServiceApi.kt │ │ │ │ ├── gesture_api.kt │ │ │ │ ├── nav_api.kt │ │ │ │ └── view_finder_api.kt │ │ │ │ ├── ext │ │ │ │ └── ScreenTextFinder.kt │ │ │ │ ├── utils │ │ │ │ ├── ResultBox.kt │ │ │ │ ├── ScreenAdapter.kt │ │ │ │ ├── exceptions.kt │ │ │ │ └── utils.kt │ │ │ │ ├── viewfinder │ │ │ │ ├── CustomViewFinder.kt │ │ │ │ ├── FindBuilderWithOperation.kt │ │ │ │ ├── ViewFindBuilder.kt │ │ │ │ ├── ViewFinder.kt │ │ │ │ └── ViewFinderWithMultiCondition.kt │ │ │ │ └── viewnode │ │ │ │ ├── ViewInfo.kt │ │ │ │ ├── ViewNode.kt │ │ │ │ └── ViewOperation.kt │ │ └── com │ │ │ └── absinthe │ │ │ └── anywhere_ │ │ │ ├── AnywhereApplication.kt │ │ │ ├── AppBarActivity.kt │ │ │ ├── AwContextWrapper.kt │ │ │ ├── BaseActivity.kt │ │ │ ├── Global.kt │ │ │ ├── a11y │ │ │ ├── A11yActionBean.kt │ │ │ ├── A11yEntity.kt │ │ │ └── A11yType.kt │ │ │ ├── adapter │ │ │ ├── ItemTouchCallBack.kt │ │ │ ├── SpacesItemDecoration.kt │ │ │ ├── a11y │ │ │ │ ├── A11yAdapter.kt │ │ │ │ ├── bean │ │ │ │ │ ├── A11yBaseBean.kt │ │ │ │ │ ├── A11yCoordBean.kt │ │ │ │ │ ├── A11yTextBean.kt │ │ │ │ │ └── A11yViewIdBean.kt │ │ │ │ └── provider │ │ │ │ │ ├── A11yCoordProvider.kt │ │ │ │ │ ├── A11yTextProvider.kt │ │ │ │ │ └── A11yViewIdProvider.kt │ │ │ ├── applist │ │ │ │ ├── AppListAdapter.kt │ │ │ │ └── AppListDiffCallback.kt │ │ │ ├── backup │ │ │ │ └── WebdavRestoreAdapter.kt │ │ │ ├── card │ │ │ │ ├── AdvancedCardItem.kt │ │ │ │ ├── AdvancedCardListAdapter.kt │ │ │ │ ├── BaseCardAdapter.kt │ │ │ │ ├── DiffListCallback.kt │ │ │ │ └── ExtrasAdapter.kt │ │ │ ├── cloud │ │ │ │ └── CloudRulesAdapter.kt │ │ │ ├── defrost │ │ │ │ ├── DefrostAdapter.kt │ │ │ │ └── DefrostItem.kt │ │ │ ├── log │ │ │ │ ├── LogAdapter.kt │ │ │ │ └── LogDiffCallback.kt │ │ │ ├── manager │ │ │ │ ├── WrapContentLinearLayoutManager.kt │ │ │ │ └── WrapContentStaggeredGridLayoutManager.kt │ │ │ ├── page │ │ │ │ ├── ChipAdapter.kt │ │ │ │ ├── PageListAdapter.kt │ │ │ │ ├── PageNode.kt │ │ │ │ ├── PageProvider.kt │ │ │ │ ├── PageTitleNode.kt │ │ │ │ └── PageTitleProvider.kt │ │ │ ├── shortcut │ │ │ │ └── ThirdAppsShortcutAdapter.kt │ │ │ ├── tile │ │ │ │ └── TileCardAdapter.kt │ │ │ └── workflow │ │ │ │ └── FlowStepAdapter.kt │ │ │ ├── api │ │ │ ├── ApiManager.kt │ │ │ └── RuleApi.kt │ │ │ ├── compat │ │ │ ├── SafeToastContext.java │ │ │ └── ToastCompat.java │ │ │ ├── constants │ │ │ ├── AnywhereType.kt │ │ │ ├── CommandResult.kt │ │ │ ├── Const.kt │ │ │ ├── EventTag.kt │ │ │ ├── GlobalValues.kt │ │ │ └── OnceTag.kt │ │ │ ├── database │ │ │ ├── AnywhereDao.kt │ │ │ ├── AnywhereRepository.kt │ │ │ └── AnywhereRoomDatabase.kt │ │ │ ├── extension │ │ │ └── ViewKtx.kt │ │ │ ├── listener │ │ │ ├── OnAppDefrostListener.kt │ │ │ └── OnQRLaunchedListener.kt │ │ │ ├── model │ │ │ ├── BackupBean.kt │ │ │ ├── ExtraBean.kt │ │ │ ├── QREntity.kt │ │ │ ├── Settings.kt │ │ │ ├── ShizukuProcess.kt │ │ │ ├── cloud │ │ │ │ ├── GiteeApiContentBean.kt │ │ │ │ └── RuleEntity.kt │ │ │ ├── database │ │ │ │ ├── AnywhereEntity.kt │ │ │ │ └── PageEntity.kt │ │ │ ├── manager │ │ │ │ ├── CollectorWindowManager.kt │ │ │ │ ├── CoordinatorWindowManager.kt │ │ │ │ ├── OverlayWindowManager.kt │ │ │ │ └── QRCollection.kt │ │ │ └── viewholder │ │ │ │ ├── AppListBean.kt │ │ │ │ ├── FlowStepBean.kt │ │ │ │ └── LogModel.kt │ │ │ ├── provider │ │ │ └── CoreProvider.kt │ │ │ ├── receiver │ │ │ ├── AdminReceiver.kt │ │ │ ├── HomeWidgetProvider.kt │ │ │ └── NotificationClickReceiver.kt │ │ │ ├── services │ │ │ ├── BackupIntentService.kt │ │ │ ├── IzukoService.kt │ │ │ ├── WorkflowIntentService.kt │ │ │ ├── overlay │ │ │ │ ├── CollectorService.kt │ │ │ │ └── OverlayService.kt │ │ │ ├── tile │ │ │ │ ├── BaseTileService.kt │ │ │ │ ├── CollectorTileService.kt │ │ │ │ ├── TileService1.kt │ │ │ │ ├── TileService2.kt │ │ │ │ ├── TileService3.kt │ │ │ │ ├── TileService4.kt │ │ │ │ ├── TileService5.kt │ │ │ │ ├── TileService6.kt │ │ │ │ └── TileService7.kt │ │ │ └── widget │ │ │ │ ├── AppRemoteViewsService.kt │ │ │ │ └── AwControlsProviderService.kt │ │ │ ├── ui │ │ │ ├── about │ │ │ │ └── AboutActivity.kt │ │ │ ├── backup │ │ │ │ ├── BackupActivity.kt │ │ │ │ ├── RestoreApplyFragmentDialog.kt │ │ │ │ └── WebdavFilesListDialogFragment.kt │ │ │ ├── cloud │ │ │ │ └── CloudRulesActivity.kt │ │ │ ├── dialog │ │ │ │ ├── AdvancedCardSelectDialogFragment.kt │ │ │ │ ├── CardSharingDialogFragment.kt │ │ │ │ ├── CloudRuleDetailDialogFragment.kt │ │ │ │ ├── DynamicParamsDialogFragment.kt │ │ │ │ ├── IceBoxGrantDialogFragment.kt │ │ │ │ ├── ImageDialogFragment.kt │ │ │ │ ├── RenameDialogFragment.kt │ │ │ │ └── ShellResultBottomSheetDialogFragment.kt │ │ │ ├── editor │ │ │ │ ├── BaseEditorFragment.kt │ │ │ │ ├── EditorActivity.kt │ │ │ │ ├── EditorFactory.kt │ │ │ │ ├── IEditor.kt │ │ │ │ └── impl │ │ │ │ │ ├── A11yEditorFragment.kt │ │ │ │ │ ├── AnywhereEditorFragment.kt │ │ │ │ │ ├── BroadcastEditorFragment.kt │ │ │ │ │ ├── FileEditorFragment.kt │ │ │ │ │ ├── ImageEditorFragment.kt │ │ │ │ │ ├── QRCodeEditorFragment.kt │ │ │ │ │ ├── SchemeEditorFragment.kt │ │ │ │ │ ├── ShellEditorFragment.kt │ │ │ │ │ ├── SwitchShellEditorFragment.kt │ │ │ │ │ └── WorkflowEditorFragment.kt │ │ │ ├── list │ │ │ │ ├── AppDetailActivity.kt │ │ │ │ ├── AppListActivity.kt │ │ │ │ └── CardListDialogFragment.kt │ │ │ ├── main │ │ │ │ ├── CategoryCardFragment.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ └── WebviewFragment.kt │ │ │ ├── qrcode │ │ │ │ └── QRCodeCollectionActivity.kt │ │ │ ├── settings │ │ │ │ ├── DefrostActivity.kt │ │ │ │ ├── IconPackDialogFragment.kt │ │ │ │ ├── IntervalDialogFragment.kt │ │ │ │ ├── LabActivity.kt │ │ │ │ ├── LogcatActivity.kt │ │ │ │ ├── SettingsActivity.kt │ │ │ │ ├── TileSettingsActivity.kt │ │ │ │ └── TimePickerDialogFragment.kt │ │ │ ├── setup │ │ │ │ ├── InitializeFragment.kt │ │ │ │ ├── SetupActivity.kt │ │ │ │ └── WelcomeFragment.kt │ │ │ └── shortcuts │ │ │ │ ├── CreateShortcutDialogFragment.kt │ │ │ │ ├── ShortcutsActivity.kt │ │ │ │ └── ThirdAppsShortcutActivity.kt │ │ │ ├── utils │ │ │ ├── AppTextUtils.kt │ │ │ ├── AppUtils.kt │ │ │ ├── CipherUtils.kt │ │ │ ├── ClipboardUtil.kt │ │ │ ├── CommandUtils.kt │ │ │ ├── FlagDelegate.kt │ │ │ ├── NotifyUtils.kt │ │ │ ├── QRCodeUtil.kt │ │ │ ├── ShortcutsUtils.kt │ │ │ ├── StorageUtils.kt │ │ │ ├── ToastUtil.kt │ │ │ ├── UxUtils.kt │ │ │ ├── handler │ │ │ │ ├── DefrostHandler.java │ │ │ │ ├── Opener.kt │ │ │ │ └── URLSchemeHandler.kt │ │ │ ├── manager │ │ │ │ ├── ActivityStackManager.kt │ │ │ │ ├── CardTypeIconGenerator.kt │ │ │ │ ├── DialogManager.kt │ │ │ │ ├── DialogStack.kt │ │ │ │ ├── IconPackManager.java │ │ │ │ ├── IzukoHelper.kt │ │ │ │ ├── LogRecorder.java │ │ │ │ ├── PoliceMan.kt │ │ │ │ ├── ShellManager.kt │ │ │ │ ├── ShizukuHelper.kt │ │ │ │ └── URLManager.kt │ │ │ └── timber │ │ │ │ ├── ReleaseTree.kt │ │ │ │ └── ThreadAwareDebugTree.kt │ │ │ ├── view │ │ │ ├── AViewGroup.kt │ │ │ ├── app │ │ │ │ ├── AlwaysMarqueeTextView.kt │ │ │ │ ├── AnywhereBottomSheetDialog.kt │ │ │ │ ├── AnywhereDialogBuilder.kt │ │ │ │ ├── AnywhereDialogFragment.kt │ │ │ │ ├── IHeaderView.kt │ │ │ │ └── ToastView.kt │ │ │ ├── card │ │ │ │ ├── CardItemView.kt │ │ │ │ ├── FlowRecyclerView.kt │ │ │ │ ├── MinimumItemView.kt │ │ │ │ ├── NormalItemView.kt │ │ │ │ ├── ShellResultContentView.kt │ │ │ │ ├── StreamItemView.kt │ │ │ │ └── StreamSingleLineItemView.kt │ │ │ ├── home │ │ │ │ ├── CollectorView.kt │ │ │ │ ├── ColorPickerDialogBuilder.java │ │ │ │ ├── CoordinatorView.kt │ │ │ │ ├── CustomFullDraggableContainer.java │ │ │ │ ├── DrawerRecyclerView.kt │ │ │ │ ├── FabBuilder.kt │ │ │ │ ├── FadingEdgeRecyclerView.kt │ │ │ │ ├── MySpeedDialView.kt │ │ │ │ ├── OverlayView.kt │ │ │ │ ├── PageRecyclerView.kt │ │ │ │ └── TextSwitcher.kt │ │ │ └── settings │ │ │ │ ├── CustomCardLayoutView.kt │ │ │ │ └── ObservableTimePickerDialog.kt │ │ │ ├── viewbuilder │ │ │ ├── IViewBuilder.kt │ │ │ ├── ViewBuilder.kt │ │ │ └── entity │ │ │ │ ├── AdvancedCardSelectDialogBuilder.kt │ │ │ │ ├── CardListDialogBuilder.kt │ │ │ │ ├── CardSharingBuilder.kt │ │ │ │ ├── CollectorBuilder.kt │ │ │ │ ├── CreateShortcutDialogBuilder.kt │ │ │ │ ├── DynamicParamsDialogBuilder.kt │ │ │ │ ├── IconPackDialogBuilder.kt │ │ │ │ ├── ImageDialogBuilder.kt │ │ │ │ ├── IntervalDialogBuilder.kt │ │ │ │ ├── OverlayBuilder.kt │ │ │ │ ├── RenameDialogBuilder.kt │ │ │ │ └── TimePickerBuilder.kt │ │ │ └── viewmodel │ │ │ └── AnywhereViewModel.kt │ └── res │ │ ├── anim │ │ ├── anim_fade_in.xml │ │ ├── anim_fade_out.xml │ │ ├── anim_slide_down.xml │ │ ├── anim_slide_up.xml │ │ ├── anim_text_switcher_in.xml │ │ ├── anim_text_switcher_out.xml │ │ ├── rd_dialog_enter.xml │ │ └── rd_dialog_exit.xml │ │ ├── animator │ │ └── alpha_animator.xml │ │ ├── drawable-hdpi │ │ └── btn_collector.png │ │ ├── drawable-mdpi │ │ └── btn_collector.png │ │ ├── drawable-night-xxxhdpi │ │ └── bg_widget.9.png │ │ ├── drawable-nodpi │ │ └── pic_widget_preview.png │ │ ├── drawable-xhdpi │ │ └── btn_collector.png │ │ ├── drawable-xxhdpi │ │ └── btn_collector.png │ │ ├── drawable-xxxhdpi │ │ ├── bg_widget.9.png │ │ ├── btn_collector.png │ │ └── pic_splash.webp │ │ ├── drawable │ │ ├── bg_circle.xml │ │ ├── bg_collector_info.xml │ │ ├── bg_color_dashboard.xml │ │ ├── bg_home_widget.xml │ │ ├── bg_shell.xml │ │ ├── bg_shell_cursor.xml │ │ ├── bg_toast.xml │ │ ├── bg_widget_list_divider.xml │ │ ├── ic_activity_list.xml │ │ ├── ic_add.xml │ │ ├── ic_add_home_shortcuts.xml │ │ ├── ic_add_shortcut.xml │ │ ├── ic_add_shortcut_tint.xml │ │ ├── ic_advanced_card.xml │ │ ├── ic_alert.xml │ │ ├── ic_android.xml │ │ ├── ic_animation.xml │ │ ├── ic_apply_restore.xml │ │ ├── ic_backup.xml │ │ ├── ic_backup_and_restore.xml │ │ ├── ic_baseline_close_24.xml │ │ ├── ic_brush.xml │ │ ├── ic_card_accessibility.xml │ │ ├── ic_card_activity.xml │ │ ├── ic_card_broadcast.xml │ │ ├── ic_card_file.xml │ │ ├── ic_card_image.xml │ │ ├── ic_card_layout.xml │ │ ├── ic_card_no.xml │ │ ├── ic_card_shell.xml │ │ ├── ic_card_switch.xml │ │ ├── ic_card_workflow.xml │ │ ├── ic_cat.xml │ │ ├── ic_change_bg.xml │ │ ├── ic_clear_shortcuts.xml │ │ ├── ic_cloud_backup.xml │ │ ├── ic_code_setting.xml │ │ ├── ic_color.xml │ │ ├── ic_color_lens.xml │ │ ├── ic_content.xml │ │ ├── ic_copy.xml │ │ ├── ic_dark_mode.xml │ │ ├── ic_dehaze.xml │ │ ├── ic_delete.xml │ │ ├── ic_delete_forever.xml │ │ ├── ic_delete_toolbar.xml │ │ ├── ic_deprecate_icon.xml │ │ ├── ic_done.xml │ │ ├── ic_done_solid.xml │ │ ├── ic_edit.xml │ │ ├── ic_filter_list.xml │ │ ├── ic_float.xml │ │ ├── ic_full_class_switch.xml │ │ ├── ic_green_android.xml │ │ ├── ic_green_dot.xml │ │ ├── ic_heart.xml │ │ ├── ic_help_outline.xml │ │ ├── ic_icon_pack.xml │ │ ├── ic_image_placeholder.xml │ │ ├── ic_keyboard_arrow_right.xml │ │ ├── ic_lab.xml │ │ ├── ic_logo.xml │ │ ├── ic_logo_24dp.xml │ │ ├── ic_manual_sort.xml │ │ ├── ic_menu.xml │ │ ├── ic_move.xml │ │ ├── ic_outline_info_24.xml │ │ ├── ic_pages.xml │ │ ├── ic_play.xml │ │ ├── ic_plus_circle.xml │ │ ├── ic_qr_code.xml │ │ ├── ic_red_dot.xml │ │ ├── ic_reset.xml │ │ ├── ic_restore.xml │ │ ├── ic_rocket.xml │ │ ├── ic_search.xml │ │ ├── ic_select_all.xml │ │ ├── ic_send_log.xml │ │ ├── ic_settings_outline.xml │ │ ├── ic_share.xml │ │ ├── ic_sharp.xml │ │ ├── ic_shortcut_start_collector.xml │ │ ├── ic_snowflake.xml │ │ ├── ic_sort.xml │ │ ├── ic_stream_card.xml │ │ ├── ic_target.xml │ │ ├── ic_transparent_icon.xml │ │ ├── ic_url_scheme.xml │ │ ├── ic_user.xml │ │ ├── ic_visibility_off.xml │ │ ├── ic_working_mode.xml │ │ ├── launcher_icon_monochrome.xml │ │ ├── ripple_page_item.xml │ │ ├── ripple_view_group.xml │ │ ├── splash_anim_vector.xml │ │ ├── splash_drawable.xml │ │ └── transparent.xml │ │ ├── font │ │ └── jetbrains_mono_regular.ttf │ │ ├── layout │ │ ├── activity_app_detail.xml │ │ ├── activity_app_list.xml │ │ ├── activity_backup.xml │ │ ├── activity_cloud_rules.xml │ │ ├── activity_defrost.xml │ │ ├── activity_editor.xml │ │ ├── activity_lab.xml │ │ ├── activity_logcat.xml │ │ ├── activity_main.xml │ │ ├── activity_qrcode_collection.xml │ │ ├── activity_settings.xml │ │ ├── activity_setup.xml │ │ ├── activity_third_apps_shortcut.xml │ │ ├── activity_tile_settings.xml │ │ ├── card_acquire_overlay_permission.xml │ │ ├── card_acquire_popup_permission.xml │ │ ├── card_acquire_root_permission.xml │ │ ├── card_acquire_shizuku_permission.xml │ │ ├── card_qr_collection_tip.xml │ │ ├── card_select_working_mode.xml │ │ ├── card_tile.xml │ │ ├── dialog_fragment_restore_apply.xml │ │ ├── editor_a11y.xml │ │ ├── editor_anywhere.xml │ │ ├── editor_broadcast.xml │ │ ├── editor_file.xml │ │ ├── editor_image.xml │ │ ├── editor_qr_code.xml │ │ ├── editor_shell.xml │ │ ├── editor_switch_shell.xml │ │ ├── editor_url_scheme.xml │ │ ├── editor_workflow.xml │ │ ├── fragment_category_card.xml │ │ ├── fragment_initialize.xml │ │ ├── fragment_webview.xml │ │ ├── fragment_welcome.xml │ │ ├── item_a11y_coord.xml │ │ ├── item_a11y_text.xml │ │ ├── item_a11y_view_id.xml │ │ ├── item_advanced_card.xml │ │ ├── item_app_list.xml │ │ ├── item_card_logcat.xml │ │ ├── item_chip.xml │ │ ├── item_cloud_rules.xml │ │ ├── item_defrost_mode.xml │ │ ├── item_extra.xml │ │ ├── item_page.xml │ │ ├── item_page_title.xml │ │ ├── item_webdav_restore.xml │ │ ├── item_widget_list.xml │ │ ├── item_workflow.xml │ │ ├── layout_cloud_rule_detail.xml │ │ ├── layout_header_extras.xml │ │ ├── layout_nav_header.xml │ │ ├── layout_webdav_restore.xml │ │ ├── preference_recyclerview.xml │ │ ├── toolbar.xml │ │ └── widget_home.xml │ │ ├── menu │ │ ├── about_menu.xml │ │ ├── app_detail_menu.xml │ │ ├── app_list_menu.xml │ │ ├── cloud_rules_menu.xml │ │ ├── editor_added_shortcut_menu.xml │ │ ├── editor_bottom_bar_edit_mode_menu.xml │ │ ├── editor_bottom_bar_menu.xml │ │ ├── editor_menu.xml │ │ ├── initialize_menu.xml │ │ ├── main_menu.xml │ │ ├── page_menu.xml │ │ ├── sort_menu.xml │ │ └── web_menu.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_beta.png │ │ ├── ic_launcher_foreground.png │ │ ├── ic_launcher_round.png │ │ ├── pic_android_links.webp │ │ └── pic_rabbit.webp │ │ ├── values-night │ │ ├── colors.xml │ │ ├── styles.xml │ │ └── themes.xml │ │ ├── values-v26 │ │ └── themes.xml │ │ ├── values-v27 │ │ └── themes.xml │ │ ├── values-v28 │ │ ├── arrays.xml │ │ └── dimens.xml │ │ ├── values-v29 │ │ ├── arrays.xml │ │ └── themes.xml │ │ ├── values-v31 │ │ ├── themes.xml │ │ └── themes_overlay.xml │ │ ├── values-zh-rCN │ │ └── strings.xml │ │ ├── values-zh-rHK │ │ └── strings.xml │ │ ├── values-zh-rTW │ │ └── strings.xml │ │ ├── values │ │ ├── arrays.xml │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── colors_material.xml │ │ ├── dimens.xml │ │ ├── ic_launcher_background.xml │ │ ├── ids.xml │ │ ├── strings.xml │ │ ├── styles.xml │ │ ├── themes.xml │ │ ├── themes_overlay.xml │ │ └── transition.xml │ │ ├── xml-v25 │ │ └── shortcuts.xml │ │ └── xml │ │ ├── accessibility_service_config.xml │ │ ├── app_delegation.xml │ │ ├── backup_rules.xml │ │ ├── data_extraction_rules.xml │ │ ├── file_paths.xml │ │ ├── locales_config.xml │ │ ├── searchable.xml │ │ ├── settings.xml │ │ ├── settings_backup.xml │ │ ├── settings_lab.xml │ │ └── widget_home_provider_info.xml │ └── test │ └── java │ └── com │ └── absinthe │ └── anywhere_ │ └── ExampleUnitTest.java ├── build.gradle.kts ├── color-picker ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── java │ └── com │ │ └── flask │ │ └── colorpicker │ │ ├── ColorCircle.java │ │ ├── ColorCircleDrawable.java │ │ ├── ColorPickerPreference.java │ │ ├── ColorPickerView.java │ │ ├── OnColorChangedListener.java │ │ ├── OnColorSelectedListener.java │ │ ├── Utils.java │ │ ├── builder │ │ ├── ColorPickerClickListener.java │ │ ├── ColorPickerDialogBuilder.java │ │ ├── ColorWheelRendererBuilder.java │ │ └── PaintBuilder.java │ │ ├── renderer │ │ ├── AbsColorWheelRenderer.java │ │ ├── ColorWheelRenderOption.java │ │ ├── ColorWheelRenderer.java │ │ ├── FlowerColorWheelRenderer.java │ │ └── SimpleColorWheelRenderer.java │ │ └── slider │ │ ├── AbsCustomSlider.java │ │ ├── AlphaSlider.java │ │ ├── LightnessSlider.java │ │ └── OnValueChangedListener.java │ └── res │ ├── layout │ ├── color_edit.xml │ ├── color_preview.xml │ ├── color_selector.xml │ └── color_widget.xml │ └── values │ ├── attrs.xml │ ├── dimens.xml │ └── styles.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── icons ├── beta │ ├── LICENSE │ │ ├── LICENSE.CC_BY_NC_3.txt │ │ └── LICENSE.txt │ ├── icon.svg │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ └── playstore │ │ └── icon.png └── ic_logo.svg └── settings.gradle.kts /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | charset = utf-8 3 | indent_size = 2 4 | indent_style = space 5 | insert_final_newline = true 6 | trim_trailing_whitespace = true 7 | ij_java_use_single_class_imports = true 8 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text eol=lf 2 | 3 | *.bat text eol=crlf 4 | 5 | *.jar binary 6 | *.png binary 7 | *.jpg binary 8 | *.jpeg binary 9 | *.webp binary 10 | *.so binary 11 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "labels": [ 3 | "dependencies" 4 | ], 5 | "extends": [ 6 | "config:base" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Anywhere- 2 | An Activity folder. 3 | 4 | ![Android CI](https://github.com/zhaobozhen/Anywhere-/workflows/Android%20CI/badge.svg) 5 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Sets the minimum version of CMake required to build your native library. 2 | # This ensures that a certain set of CMake features is available to 3 | # your build. 4 | 5 | cmake_minimum_required(VERSION 3.4.1) 6 | 7 | # Specifies a library name, specifies whether the library is STATIC or 8 | # SHARED, and provides relative paths to the source code. You can 9 | # define multiple libraries by adding multiple add_library() commands, 10 | # and CMake builds them for you. When you build your app, Gradle 11 | # automatically packages shared libraries with your APK. 12 | 13 | add_library( # Specifies the name of the library. 14 | izuko 15 | 16 | # Sets the library as a shared library. 17 | SHARED 18 | 19 | # Provides a relative path to your source file(s). 20 | src/main/cpp/izuko.cpp) 21 | 22 | # Specifies a path to native header files. 23 | include_directories(src/main/cpp/include/) -------------------------------------------------------------------------------- /app/aapt2-resources.cfg: -------------------------------------------------------------------------------- 1 | color/material_orange_50#no_obfuscate 2 | color/material_indigo_50#no_obfuscate 3 | color/material_blue_grey_50#no_obfuscate 4 | color/material_teal_50#no_obfuscate 5 | color/material_cyan_50#no_obfuscate 6 | color/material_blue_50#no_obfuscate 7 | color/material_blue_grey_50#no_obfuscate 8 | color/material_deep_purple_50#no_obfuscate 9 | 10 | color/material_orange_100#no_obfuscate 11 | color/material_indigo_100#no_obfuscate 12 | color/material_blue_grey_100#no_obfuscate 13 | color/material_teal_100#no_obfuscate 14 | color/material_cyan_100#no_obfuscate 15 | color/material_blue_100#no_obfuscate 16 | color/material_blue_grey_100#no_obfuscate 17 | color/material_deep_purple_100#no_obfuscate 18 | 19 | color/material_orange_600#no_obfuscate 20 | color/material_indigo_600#no_obfuscate 21 | color/material_blue_grey_600#no_obfuscate 22 | color/material_teal_600#no_obfuscate 23 | color/material_cyan_600#no_obfuscate 24 | color/material_blue_600#no_obfuscate 25 | color/material_blue_grey_600#no_obfuscate 26 | color/material_deep_purple_600#no_obfuscate -------------------------------------------------------------------------------- /app/libs/IceBox-SDK-1.0.6.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/libs/IceBox-SDK-1.0.6.aar -------------------------------------------------------------------------------- /app/libs/arm64-v8a/libizuko.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/libs/arm64-v8a/libizuko.so -------------------------------------------------------------------------------- /app/libs/armeabi-v7a/libizuko.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/libs/armeabi-v7a/libizuko.so -------------------------------------------------------------------------------- /app/src/androidTest/java/com/absinthe/anywhere_/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | 5 | import android.content.Context; 6 | 7 | import androidx.test.InstrumentationRegistry; 8 | import androidx.test.runner.AndroidJUnit4; 9 | 10 | import org.junit.Test; 11 | import org.junit.runner.RunWith; 12 | 13 | /** 14 | * Instrumentation test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() throws Exception { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getTargetContext(); 24 | 25 | assertEquals("com.mewlxy.qqlevelbar", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/debug/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | com.absinthe.anywhere_.debug 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/aidl/com/absinthe/anywhere_/model/database/AnywhereEntity.aidl: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.model.database; 2 | 3 | parcelable AnywhereEntity; -------------------------------------------------------------------------------- /app/src/main/aidl/com/absinthe/anywhere_/services/overlay/ICollectorListener.aidl: -------------------------------------------------------------------------------- 1 | // ICollectorListener.aidl 2 | package com.absinthe.anywhere_.services.overlay; 3 | 4 | interface ICollectorListener { 5 | void onCoordinatorSelected(int x, int y); 6 | } -------------------------------------------------------------------------------- /app/src/main/aidl/com/absinthe/anywhere_/services/overlay/ICollectorService.aidl: -------------------------------------------------------------------------------- 1 | // ICollectorService.aidl 2 | package com.absinthe.anywhere_.services.overlay; 3 | import com.absinthe.anywhere_.services.overlay.ICollectorListener; 4 | 5 | // Declare any non-default types here with import statements 6 | 7 | interface ICollectorService { 8 | void startCollector(); 9 | void stopCollector(); 10 | void startCoordinator(); 11 | void stopCoordinator(in int x, in int y); 12 | String[] getCurrentActivity(); 13 | void registerCollectorListener(in ICollectorListener listener); 14 | void unregisterCollectorListener(in ICollectorListener listener); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/aidl/com/absinthe/anywhere_/services/overlay/IOverlayService.aidl: -------------------------------------------------------------------------------- 1 | // IOverlayService.aidl 2 | package com.absinthe.anywhere_.services.overlay; 3 | import com.absinthe.anywhere_.model.database.AnywhereEntity; 4 | 5 | // Declare any non-default types here with import statements 6 | 7 | interface IOverlayService { 8 | void addOverlay(in AnywhereEntity entity); 9 | void closeOverlay(in AnywhereEntity entity); 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/assets/renge.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/assets/renge.webp -------------------------------------------------------------------------------- /app/src/main/assets/renge_no_koe.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/assets/renge_no_koe.aac -------------------------------------------------------------------------------- /app/src/main/cpp/include/izuko.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Absinthe on 2019/11/23. 3 | // 4 | 5 | #include 6 | #ifndef ANYWHERE_NATIVE_LIB_H 7 | #define ANYWHERE_NATIVE_LIB_H 8 | 9 | #ifdef __cplusplus 10 | extern "C" { 11 | #endif 12 | 13 | JNIEXPORT void JNICALL 14 | Java_com_absinthe_anywhere_1_utils_manager_IzukoHelper_checkSignature(JNIEnv *env, jclass clazz); 15 | 16 | JNIEXPORT jstring JNICALL 17 | Java_com_absinthe_anywhere_1_utils_manager_IzukoHelper_getCipherKey(JNIEnv *env, jclass clazz); 18 | 19 | JNIEXPORT jboolean JNICALL 20 | Java_com_absinthe_anywhere_1_utils_manager_IzukoHelper_isHitagi(JNIEnv *env, jobject clazz, jstring token); 21 | 22 | #ifdef __cplusplus 23 | } 24 | #endif 25 | 26 | #endif //ANYWHERE_NATIVE_LIB_H 27 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/cn/vove7/andro_accessibility_api/AppScope.kt: -------------------------------------------------------------------------------- 1 | package cn.vove7.andro_accessibility_api 2 | 3 | /** 4 | * # AppScope 5 | * 6 | * @property packageName String app pkg 7 | * @property pageName String class name of Activity or Dialog 8 | * @constructor 9 | */ 10 | data class AppScope( 11 | var packageName: String, 12 | var pageName: String 13 | ) { 14 | override fun equals(that: Any?): Boolean { 15 | if (that == null || that !is AppScope) return false 16 | 17 | return packageName.startsWith(that.packageName) && 18 | pageName.isEmpty() || that.pageName.isEmpty() || 19 | pageName.endsWith("." + that.pageName) || 20 | pageName.endsWith("$" + that.pageName) || 21 | that.pageName.endsWith(".$pageName") || 22 | that.pageName.endsWith("$$pageName") || 23 | (packageName == that.packageName && pageName == that.pageName) 24 | 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/cn/vove7/andro_accessibility_api/ext/ScreenTextFinder.kt: -------------------------------------------------------------------------------- 1 | package cn.vove7.andro_accessibility_api.ext 2 | 3 | import android.view.accessibility.AccessibilityNodeInfo 4 | import cn.vove7.andro_accessibility_api.viewfinder.ViewFinder 5 | import cn.vove7.andro_accessibility_api.viewnode.ViewNode 6 | 7 | /** 8 | * # ScreenTextFinder 9 | * 10 | * @author Vove 11 | * 2018/10/14 12 | */ 13 | class ScreenTextFinder(startNode: ViewNode? = null) : ViewFinder(startNode) { 14 | var isWeb = false 15 | 16 | override fun findCondition(node: AccessibilityNodeInfo): Boolean { 17 | if (node.className?.endsWith("WebView", ignoreCase = true) == true) { 18 | isWeb = true 19 | return false 20 | } 21 | return node.childCount == 0 && (node.text != null && node.text.trim() != "") 22 | || (isWeb && node.contentDescription ?: "" != "") 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/cn/vove7/andro_accessibility_api/utils/ResultBox.kt: -------------------------------------------------------------------------------- 1 | package cn.vove7.andro_accessibility_api.utils 2 | 3 | import java.util.concurrent.CountDownLatch 4 | 5 | /** 6 | * Created by Vove on 2018/7/5 7 | */ 8 | class ResultBox { 9 | private var mValue: T? = null 10 | 11 | var lock = CountDownLatch(1) 12 | 13 | constructor() 14 | 15 | constructor(initValue: T) { 16 | this.mValue = initValue 17 | } 18 | 19 | fun setAndNotify(value: T) { 20 | mValue = value 21 | lock.countDown() 22 | } 23 | 24 | //等待结果 25 | @Throws(InterruptedException::class) 26 | fun blockedGet(safely: Boolean = true): T? { 27 | if (lock.count <= 0) return mValue 28 | if (safely) { 29 | kotlin.runCatching { 30 | lock.await() 31 | } 32 | } else { 33 | lock.await() 34 | } 35 | return mValue 36 | } 37 | 38 | 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/cn/vove7/andro_accessibility_api/utils/exceptions.kt: -------------------------------------------------------------------------------- 1 | package cn.vove7.andro_accessibility_api.utils 2 | 3 | import cn.vove7.andro_accessibility_api.AccessibilityApi 4 | import cn.vove7.andro_accessibility_api.viewfinder.ViewFinder 5 | 6 | /** 7 | * # exceptions 8 | * 异常类合集 9 | * @author Administrator 10 | * 2018/12/20 11 | */ 12 | 13 | /** 14 | * 视图搜索失败异常 15 | */ 16 | class ViewNodeNotFoundException(finder: ViewFinder) : Exception( 17 | "ViewNodeNotFound: $finder" 18 | ) 19 | 20 | /** 21 | * 无障碍服务未运行异常 22 | * @constructor 23 | */ 24 | open class NeedAccessibilityException(name: String?) : RuntimeException("无障碍服务未运行: $name") 25 | 26 | class NeedBaseAccessibilityException : 27 | NeedAccessibilityException(AccessibilityApi.BASE_SERVICE_CLS.name) 28 | 29 | class NeedGestureAccessibilityException : 30 | NeedAccessibilityException(AccessibilityApi.GESTURE_SERVICE_CLS.name) 31 | -------------------------------------------------------------------------------- /app/src/main/java/cn/vove7/andro_accessibility_api/viewfinder/CustomViewFinder.kt: -------------------------------------------------------------------------------- 1 | package cn.vove7.andro_accessibility_api.viewfinder 2 | 3 | import android.view.accessibility.AccessibilityNodeInfo 4 | import cn.vove7.andro_accessibility_api.viewnode.ViewNode 5 | 6 | /** 7 | * # CustomViewFinder 8 | * 9 | * Created on 2020/6/11 10 | * @author Vove 11 | */ 12 | class CustomViewFinder( 13 | node: ViewNode? = null, 14 | val predicate: (AccessibilityNodeInfo) -> Boolean 15 | ) : ViewFinder(node) { 16 | override fun findCondition(node: AccessibilityNodeInfo): Boolean = predicate(node) 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/cn/vove7/andro_accessibility_api/viewnode/ViewInfo.kt: -------------------------------------------------------------------------------- 1 | package cn.vove7.andro_accessibility_api.viewnode 2 | 3 | import android.graphics.Bitmap 4 | import android.graphics.Rect 5 | 6 | /** 7 | * # ViewInfo 8 | * (权)属性: 1位置 3文字 1类型 9 | * 特征: 是否位于 相似 相同 10 | * @author Administrator 11 | * 2018/11/1 12 | */ 13 | class ViewInfo( 14 | val text: CharSequence?, 15 | val desc: CharSequence?, 16 | val type: CharSequence?, 17 | val boundsInParent: Rect, 18 | val boundsInScreen: Rect, 19 | // val clickable: Boolean, 20 | val image: Bitmap? = null 21 | // val canPopup: Boolean 22 | ) { 23 | override fun toString(): String { 24 | return "$text\t$type\t$boundsInScreen\t$desc" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/AppBarActivity.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_ 2 | 3 | import android.os.Bundle 4 | import android.view.ViewGroup 5 | import androidx.appcompat.widget.Toolbar 6 | import androidx.viewbinding.ViewBinding 7 | import com.google.android.material.appbar.AppBarLayout 8 | 9 | abstract class AppBarActivity : BaseActivity() { 10 | protected abstract fun getToolBar(): Toolbar 11 | protected abstract fun getAppBarLayout(): AppBarLayout 12 | 13 | override fun onCreate(savedInstanceState: Bundle?) { 14 | super.onCreate(savedInstanceState) 15 | setSupportActionBar(getToolBar()) 16 | supportActionBar?.setDisplayHomeAsUpEnabled(true) 17 | (root as ViewGroup).bringChildToFront(getAppBarLayout()) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/AwContextWrapper.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_ 2 | 3 | import android.content.Context 4 | import android.view.ContextThemeWrapper 5 | 6 | class AwContextWrapper(context: Context) : ContextThemeWrapper(context, R.style.Base_AppTheme) -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/Global.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_ 2 | 3 | import android.os.Handler 4 | import android.os.Looper 5 | import android.util.Log 6 | import timber.log.Timber 7 | 8 | object Global { 9 | 10 | private val handler = Handler(Looper.getMainLooper()) 11 | 12 | fun start() { 13 | handler.post { 14 | while (true) { 15 | try { 16 | Looper.loop() 17 | } catch (e: Throwable) { 18 | dealStackTraceException(e) 19 | } 20 | } 21 | } 22 | } 23 | 24 | @Throws(Throwable::class) 25 | private fun dealStackTraceException(e: Throwable) { 26 | val stack = Log.getStackTraceString(e) 27 | 28 | if (stack.contains("Service.startForeground()") || 29 | stack.contains("com.swift.sandhook") || 30 | stack.contains("updateForceDarkMode") || 31 | stack.contains("MultiSelectPopupWindow.showMultiSelectPopupWindow") || 32 | stack.contains("get life cycle exception") || 33 | stack.contains("checkStartAnyActivityPermission") 34 | ) { 35 | Timber.w(e) 36 | } else if (stack.contains("ClipboardService")) { 37 | Timber.w(e) 38 | } else if (stack.contains("de.robv.android.xposed")) { 39 | Timber.w(e) 40 | } else { 41 | throw e 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/a11y/A11yActionBean.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.a11y 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class A11yActionBean( 6 | @SerializedName("type") val type: Int = A11yType.NONE, 7 | @SerializedName("pkgName") var pkgName: String = "", 8 | @SerializedName("content") var content: String = "", 9 | @SerializedName("activityId") var activityId: String = "", 10 | @SerializedName("delay") var delay: Long = 0, 11 | @SerializedName("contains") var contains: Boolean = false 12 | ) 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/a11y/A11yEntity.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.a11y 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class A11yEntity( 6 | @SerializedName("applicationId") var applicationId: String = "", 7 | @SerializedName("entryActivity") var entryActivity: String = "", 8 | @SerializedName("actions") var actions: List = listOf() 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/a11y/A11yType.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.a11y 2 | 3 | object A11yType { 4 | const val NONE = -1 5 | const val TEXT = 0 6 | const val VIEW_ID = 1 7 | const val LONG_PRESS_TEXT = 2 8 | const val LONG_PRESS_VIEW_ID = 3 9 | const val COORDINATE = 4 10 | const val LONG_PRESS_COORDINATE = 5 11 | const val SWIPE = 6 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/SpacesItemDecoration.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter 2 | 3 | import android.graphics.Rect 4 | import android.view.View 5 | import androidx.recyclerview.widget.RecyclerView 6 | import androidx.recyclerview.widget.RecyclerView.ItemDecoration 7 | 8 | class SpacesItemDecoration(val space: Int) : ItemDecoration() { 9 | 10 | override fun getItemOffsets( 11 | outRect: Rect, 12 | view: View, 13 | parent: RecyclerView, 14 | state: RecyclerView.State 15 | ) { 16 | 17 | outRect.apply { 18 | left = space 19 | right = space 20 | bottom = space / 2 21 | top = space / 2 22 | } 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/a11y/bean/A11yBaseBean.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.a11y.bean 2 | 3 | import com.absinthe.anywhere_.a11y.A11yActionBean 4 | import com.chad.library.adapter.base.entity.node.BaseNode 5 | 6 | open class A11yBaseBean(val actionBean: A11yActionBean) : BaseNode() { 7 | override val childNode: MutableList? = null 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/a11y/bean/A11yCoordBean.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.a11y.bean 2 | 3 | import com.absinthe.anywhere_.a11y.A11yActionBean 4 | 5 | class A11yCoordBean(actionBean: A11yActionBean) : A11yBaseBean(actionBean) -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/a11y/bean/A11yTextBean.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.a11y.bean 2 | 3 | import com.absinthe.anywhere_.a11y.A11yActionBean 4 | 5 | class A11yTextBean(actionBean: A11yActionBean) : A11yBaseBean(actionBean) -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/a11y/bean/A11yViewIdBean.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.a11y.bean 2 | 3 | import com.absinthe.anywhere_.a11y.A11yActionBean 4 | 5 | class A11yViewIdBean(actionBean: A11yActionBean) : A11yBaseBean(actionBean) -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/applist/AppListDiffCallback.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.applist 2 | 3 | import androidx.recyclerview.widget.DiffUtil 4 | import com.absinthe.anywhere_.model.viewholder.AppListBean 5 | 6 | class AppListDiffCallback : DiffUtil.ItemCallback() { 7 | 8 | override fun areItemsTheSame(oldItem: AppListBean, newItem: AppListBean): Boolean { 9 | return oldItem.id == newItem.id 10 | } 11 | 12 | override fun areContentsTheSame(oldItem: AppListBean, newItem: AppListBean): Boolean { 13 | return oldItem.packageName == newItem.packageName && 14 | oldItem.appName == newItem.appName && 15 | oldItem.className == newItem.className && 16 | oldItem.type == newItem.type 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/backup/WebdavRestoreAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.backup 2 | 3 | import android.text.format.Formatter 4 | import com.absinthe.anywhere_.R 5 | import com.chad.library.adapter.base.BaseQuickAdapter 6 | import com.chad.library.adapter.base.viewholder.BaseViewHolder 7 | import com.thegrizzlylabs.sardineandroid.DavResource 8 | import java.text.SimpleDateFormat 9 | import java.util.* 10 | 11 | class WebdavRestoreAdapter : 12 | BaseQuickAdapter(R.layout.item_webdav_restore) { 13 | 14 | override fun convert(holder: BaseViewHolder, item: DavResource) { 15 | holder.setText(R.id.tv_title, item.displayName) 16 | holder.setText(R.id.tv_size, Formatter.formatFileSize(context, item.contentLength)) 17 | 18 | if (item.creation != null) { 19 | holder.setVisible(R.id.tv_timestamp, true) 20 | holder.setText( 21 | R.id.tv_timestamp, 22 | SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(item.creation) 23 | ) 24 | } else { 25 | holder.setGone(R.id.tv_timestamp, true) 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/card/AdvancedCardItem.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.card 2 | 3 | import android.view.View 4 | import androidx.annotation.StringRes 5 | 6 | data class AdvancedCardItem( 7 | @StringRes val title: Int, 8 | val type: Int, 9 | val listener: View.OnClickListener 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/card/AdvancedCardListAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.card 2 | 3 | import com.absinthe.anywhere_.R 4 | import com.absinthe.anywhere_.utils.manager.CardTypeIconGenerator 5 | import com.absinthe.libraries.utils.extensions.dp 6 | import com.chad.library.adapter.base.BaseQuickAdapter 7 | import com.chad.library.adapter.base.viewholder.BaseViewHolder 8 | 9 | class AdvancedCardListAdapter : 10 | BaseQuickAdapter(R.layout.item_advanced_card) { 11 | 12 | override fun convert(holder: BaseViewHolder, item: AdvancedCardItem) { 13 | holder.setText(R.id.tv_title, item.title) 14 | 15 | holder.setImageDrawable( 16 | R.id.iv_icon, 17 | CardTypeIconGenerator.getAdvancedIcon(context, item.type, 45.dp) 18 | ) 19 | holder.itemView.setOnClickListener(item.listener) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/card/DiffListCallback.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.card 2 | 3 | import androidx.recyclerview.widget.DiffUtil 4 | import com.absinthe.anywhere_.model.database.AnywhereEntity 5 | 6 | class DiffListCallback : DiffUtil.ItemCallback() { 7 | 8 | override fun areItemsTheSame(oldItem: AnywhereEntity, newItem: AnywhereEntity): Boolean { 9 | return oldItem.id == newItem.id 10 | } 11 | 12 | override fun areContentsTheSame(oldItem: AnywhereEntity, newItem: AnywhereEntity): Boolean { 13 | return oldItem.appName == newItem.appName && 14 | oldItem.param1 == newItem.param1 && 15 | oldItem.param2 == newItem.param2 && 16 | oldItem.param3 == newItem.param3 && 17 | oldItem.description == newItem.description && 18 | oldItem.type == newItem.type && 19 | oldItem.color == newItem.color && 20 | oldItem.iconUri == newItem.iconUri 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/cloud/CloudRulesAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.cloud 2 | 3 | import android.view.View 4 | import com.absinthe.anywhere_.R 5 | import com.absinthe.anywhere_.model.cloud.RuleEntity 6 | import com.chad.library.adapter.base.BaseQuickAdapter 7 | import com.chad.library.adapter.base.viewholder.BaseViewHolder 8 | import me.zhanghai.android.fastscroll.PopupTextProvider 9 | 10 | class CloudRulesAdapter : 11 | BaseQuickAdapter(R.layout.item_cloud_rules), 12 | PopupTextProvider { 13 | 14 | override fun convert(holder: BaseViewHolder, item: RuleEntity) { 15 | holder.setText(R.id.tv_app_name, item.name) 16 | holder.setText(R.id.tv_contributor, item.contributor) 17 | } 18 | 19 | override fun getPopupText(view: View, position: Int): CharSequence { 20 | return data[position].name.ifEmpty { " " }.first().toString() 21 | } 22 | 23 | override fun getItemId(position: Int): Long { 24 | return try { 25 | data[position].hashCode().toLong() 26 | } catch (e: Exception) { 27 | super.getItemId(position) 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/defrost/DefrostItem.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.defrost 2 | 3 | data class DefrostItem( 4 | var mode: String, var title: String, 5 | var summary: String, var buttonText: String, 6 | var addition: CharSequence 7 | ) 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/log/LogAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.log 2 | 3 | import android.text.format.Formatter 4 | import com.absinthe.anywhere_.R 5 | import com.absinthe.anywhere_.model.viewholder.LogModel 6 | import com.chad.library.adapter.base.BaseQuickAdapter 7 | import com.chad.library.adapter.base.viewholder.BaseViewHolder 8 | 9 | class LogAdapter : BaseQuickAdapter(R.layout.item_card_logcat) { 10 | 11 | override fun convert(holder: BaseViewHolder, item: LogModel) { 12 | holder.apply { 13 | setText(R.id.tv_create_time, item.createTime) 14 | setText(R.id.tv_file_path, item.filePath) 15 | setText(R.id.tv_file_size, Formatter.formatFileSize(context, item.fileSize)) 16 | } 17 | } 18 | 19 | init { 20 | addChildClickViewIds(R.id.btn_send) 21 | addChildClickViewIds(R.id.btn_delete) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/log/LogDiffCallback.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.log 2 | 3 | import androidx.recyclerview.widget.DiffUtil 4 | import com.absinthe.anywhere_.model.viewholder.LogModel 5 | 6 | class LogDiffCallback : DiffUtil.ItemCallback() { 7 | 8 | override fun areItemsTheSame(oldItem: LogModel, newItem: LogModel): Boolean { 9 | return oldItem.filePath == newItem.filePath 10 | } 11 | 12 | override fun areContentsTheSame(oldItem: LogModel, newItem: LogModel): Boolean { 13 | return oldItem.createTime == newItem.createTime 14 | && oldItem.fileSize == newItem.fileSize 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/manager/WrapContentLinearLayoutManager.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.manager 2 | 3 | import android.content.Context 4 | import androidx.recyclerview.widget.LinearLayoutManager 5 | import androidx.recyclerview.widget.RecyclerView 6 | import androidx.recyclerview.widget.RecyclerView.Recycler 7 | import timber.log.Timber 8 | 9 | class WrapContentLinearLayoutManager : LinearLayoutManager { 10 | 11 | constructor(context: Context?) : super(context) 12 | 13 | constructor(context: Context?, @RecyclerView.Orientation orientation: Int) : super( 14 | context, 15 | orientation, 16 | false 17 | ) 18 | 19 | override fun onLayoutChildren(recycler: Recycler, state: RecyclerView.State) { 20 | try { 21 | super.onLayoutChildren(recycler, state) 22 | } catch (e: IndexOutOfBoundsException) { 23 | Timber.e("encounter an IOOBE in RecyclerView") 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/manager/WrapContentStaggeredGridLayoutManager.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.manager 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | import androidx.recyclerview.widget.RecyclerView.Recycler 5 | import androidx.recyclerview.widget.StaggeredGridLayoutManager 6 | import timber.log.Timber 7 | 8 | class WrapContentStaggeredGridLayoutManager(spanCount: Int, orientation: Int) : 9 | StaggeredGridLayoutManager(spanCount, orientation) { 10 | 11 | override fun onLayoutChildren(recycler: Recycler, state: RecyclerView.State) { 12 | try { 13 | super.onLayoutChildren(recycler, state) 14 | } catch (e: IndexOutOfBoundsException) { 15 | Timber.e("encounter an IOOBE in RecyclerView") 16 | } 17 | } 18 | 19 | override fun onItemsChanged(recyclerView: RecyclerView) { 20 | try { 21 | super.onItemsChanged(recyclerView) 22 | } catch (e: IndexOutOfBoundsException) { 23 | Timber.e("encounter an IOOBE in RecyclerView") 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/page/PageListAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.page 2 | 3 | import com.absinthe.anywhere_.R 4 | import com.absinthe.anywhere_.adapter.ItemTouchCallBack 5 | import com.chad.library.adapter.base.BaseNodeAdapter 6 | import com.chad.library.adapter.base.entity.node.BaseNode 7 | import java.util.* 8 | 9 | class PageListAdapter : BaseNodeAdapter(), ItemTouchCallBack.OnItemTouchListener { 10 | 11 | init { 12 | addNodeProvider(PageTitleProvider()) 13 | addNodeProvider(PageProvider()) 14 | addChildClickViewIds(R.id.iv_entry) 15 | } 16 | 17 | override fun getItemType(data: List, position: Int): Int { 18 | return when (data[position]) { 19 | is PageTitleNode -> 1 20 | is PageNode -> 2 21 | else -> -1 22 | } 23 | } 24 | 25 | override fun onMove(fromPosition: Int, toPosition: Int) { 26 | if (fromPosition < toPosition) { 27 | for (i in fromPosition until toPosition) { 28 | Collections.swap(data, i, i + 1) 29 | } 30 | } else { 31 | for (i in fromPosition downTo toPosition + 1) { 32 | Collections.swap(data, i, i - 1) 33 | } 34 | } 35 | notifyItemMoved(fromPosition, toPosition) 36 | } 37 | 38 | override fun onSwiped(position: Int) {} 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/page/PageNode.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.page 2 | 3 | import com.chad.library.adapter.base.entity.node.BaseNode 4 | 5 | class PageNode : BaseNode() { 6 | 7 | var title: String = "Page" 8 | 9 | override val childNode: MutableList? 10 | get() = null 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/page/PageTitleNode.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.page 2 | 3 | import com.chad.library.adapter.base.entity.node.BaseExpandNode 4 | import com.chad.library.adapter.base.entity.node.BaseNode 5 | 6 | class PageTitleNode(override val childNode: MutableList, val title: String) : 7 | BaseExpandNode() { 8 | 9 | init { 10 | isExpanded = false 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/shortcut/ThirdAppsShortcutAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.shortcut 2 | 3 | import android.content.pm.ResolveInfo 4 | import com.absinthe.anywhere_.R 5 | import com.blankj.utilcode.util.AppUtils 6 | import com.chad.library.adapter.base.BaseQuickAdapter 7 | import com.chad.library.adapter.base.viewholder.BaseViewHolder 8 | 9 | class ThirdAppsShortcutAdapter: BaseQuickAdapter(R.layout.item_app_list) { 10 | override fun convert(holder: BaseViewHolder, item: ResolveInfo) { 11 | holder.setText(R.id.tv_app_name, AppUtils.getAppName(item.activityInfo.packageName)) 12 | holder.setImageDrawable(R.id.iv_app_icon, item.loadIcon(context.packageManager)) 13 | holder.setText(R.id.tv_pkg_name, (item.loadLabel(context.packageManager) ?: "App").toString()) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/adapter/tile/TileCardAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.adapter.tile 2 | 3 | import com.absinthe.anywhere_.R 4 | import com.absinthe.anywhere_.model.viewholder.AppListBean 5 | import com.chad.library.adapter.base.BaseQuickAdapter 6 | import com.chad.library.adapter.base.viewholder.BaseViewHolder 7 | 8 | class TileCardAdapter : BaseQuickAdapter(R.layout.card_tile) { 9 | 10 | init { 11 | addChildClickViewIds(R.id.btn_select) 12 | addChildClickViewIds(R.id.iv_app_icon) 13 | } 14 | 15 | override fun convert(holder: BaseViewHolder, item: AppListBean?) { 16 | holder.setText(R.id.tv_title, "Tile ${holder.layoutPosition + 1}") 17 | 18 | item?.let { 19 | holder.apply { 20 | setText(R.id.tv_app_name, item.appName) 21 | setText(R.id.tv_param_1, item.packageName) 22 | setText(R.id.tv_param_2, item.className) 23 | setImageDrawable(R.id.iv_app_icon, item.icon) 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/api/ApiManager.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.api 2 | 3 | object ApiManager { 4 | const val GITLAB_RULES_RAW_URL = "https://gitlab.com/zhaobozhen/Anywhere-Rules/-/raw/master/" 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/api/RuleApi.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.api 2 | 3 | import com.absinthe.anywhere_.model.cloud.RuleEntity 4 | import retrofit2.Call 5 | import retrofit2.http.GET 6 | 7 | interface RuleApi { 8 | 9 | @GET("rules/rules.json") 10 | fun requestAllRules(): Call> 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/constants/CommandResult.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.constants 2 | 3 | object CommandResult { 4 | const val RESULT_ERROR = "-1" 5 | const val RESULT_NULL = "1000" 6 | const val RESULT_SUCCESS = "1001" 7 | const val RESULT_NO_REACT_URL = "1002" 8 | const val RESULT_SHIZUKU_PERM_ERROR = "1003" 9 | const val RESULT_ROOT_PERM_ERROR = "1004" 10 | const val RESULT_FILE_URI_EXPOSED = "1005" 11 | const val RESULT_SECURITY_EXCEPTION = "1006" 12 | const val RESULT_URL_SCHEME = "1007" 13 | const val RESULT_EMPTY = "1008" 14 | const val RESULT_CHANGE_WORKING_MODE = "1009" 15 | 16 | val MAP: HashMap = hashMapOf( 17 | Pair(RESULT_ERROR, "RESULT_ERROR"), 18 | Pair(RESULT_NULL, "RESULT_NULL"), 19 | Pair(RESULT_SUCCESS, "RESULT_SUCCESS"), 20 | Pair(RESULT_NO_REACT_URL, "RESULT_NO_REACT_URL"), 21 | Pair(RESULT_SHIZUKU_PERM_ERROR, "RESULT_SHIZUKU_PERM_ERROR"), 22 | Pair(RESULT_ROOT_PERM_ERROR, "RESULT_ROOT_PERM_ERROR"), 23 | Pair(RESULT_FILE_URI_EXPOSED, "RESULT_FILE_URI_EXPOSED"), 24 | Pair(RESULT_SECURITY_EXCEPTION, "RESULT_SECURITY_EXCEPTION"), 25 | Pair(RESULT_URL_SCHEME, "RESULT_URL_SCHEME"), 26 | Pair(RESULT_EMPTY, "RESULT_EMPTY") 27 | ) 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/constants/EventTag.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.constants 2 | 3 | object EventTag { 4 | const val FAB_ACTIVITY_LIST_CLICK = "Fab Activity List clicked" 5 | const val FAB_QR_CODE_COLLECTION_CLICK = "Fab QRCode Collection clicked" 6 | const val FAB_COLLECTOR_CLICK = "Fab Collector clicked" 7 | const val FAB_CLOUD_RULES_CLICK = "Fab Cloud Rules clicked" 8 | const val FAB_THIRD_APPS_SHORTCUT_CLICK = "Fab Third Apps Shortcut clicked" 9 | 10 | const val SHORTCUT_OPEN = "Shortcut Open" 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/constants/OnceTag.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.constants 2 | 3 | object OnceTag { 4 | const val FIRST_GUIDE = "fabGuide" 5 | const val FAB_TIP = "fabTip" 6 | const val QR_COLLECTION_TIP = "qrCollectionTip" 7 | const val OVERLAY_TIP = "overlayTip" 8 | const val MMKV_MIGRATE = "mmkvMigrate" 9 | const val SHORTCUT_COMM_TIPS = "shortcutCommTips" 10 | const val CONVERT_TYPE_TO_V2 = "convertTypeToV2" 11 | const val A11Y_ANNOUNCEMENT = "a11yAnnouncement" 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/extension/ViewKtx.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.extension 2 | 3 | import android.view.View 4 | import com.absinthe.libraries.utils.extensions.addPaddingBottom 5 | import com.absinthe.libraries.utils.extensions.addPaddingTop 6 | import com.absinthe.libraries.utils.manager.SystemBarManager 7 | import com.absinthe.libraries.utils.utils.UiUtils 8 | 9 | fun View.addSystemBarPadding( 10 | addStatusBarPadding: Boolean = true, 11 | addNavigationBarPadding: Boolean = true 12 | ) { 13 | if (addStatusBarPadding) { 14 | addPaddingTop(UiUtils.getStatusBarHeight()) 15 | } 16 | if (addNavigationBarPadding) { 17 | addPaddingBottom(SystemBarManager.navigationBarSize) 18 | } 19 | } 20 | 21 | fun View.addSystemBarPaddingAsync( 22 | addStatusBarPadding: Boolean = true, 23 | addNavigationBarPadding: Boolean = true 24 | ) { 25 | post { 26 | if (addStatusBarPadding) { 27 | addPaddingTop(UiUtils.getStatusBarHeight()) 28 | } 29 | if (addNavigationBarPadding) { 30 | addPaddingBottom(SystemBarManager.navigationBarSize) 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/listener/OnAppDefrostListener.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.listener 2 | 3 | interface OnAppDefrostListener { 4 | fun onAppDefrost() 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/listener/OnQRLaunchedListener.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.listener 2 | 3 | interface OnQRLaunchedListener { 4 | fun onLaunched() 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/model/BackupBean.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.model 2 | 3 | import com.absinthe.anywhere_.model.database.AnywhereEntity 4 | import com.absinthe.anywhere_.model.database.PageEntity 5 | import com.google.gson.annotations.SerializedName 6 | 7 | data class BackupBean( 8 | @SerializedName("anywhereList") val anywhereList: List, 9 | @SerializedName("pageList") val pageList: List 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/model/QREntity.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.model 2 | 3 | import com.absinthe.anywhere_.listener.OnQRLaunchedListener 4 | 5 | class QREntity internal constructor(var listener: OnQRLaunchedListener) { 6 | 7 | var pkgName: String? = null 8 | var clsName: String? = null 9 | var urlScheme: String? = null 10 | 11 | fun launch() { 12 | listener.onLaunched() 13 | } 14 | 15 | override fun toString(): String { 16 | return "QREntity: pkgName = $pkgName, clsName = $clsName, urlScheme = $urlScheme" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/model/ShizukuProcess.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.model 2 | 3 | import com.absinthe.anywhere_.utils.AppUtils 4 | import rikka.shizuku.Shizuku 5 | import java.io.BufferedReader 6 | import java.io.DataOutputStream 7 | import java.io.InputStreamReader 8 | 9 | object ShizukuProcess { 10 | 11 | fun exec(cmd: String): String { 12 | 13 | val process = Shizuku.newProcess(arrayOf("sh"), null, null) 14 | val outputStream = DataOutputStream(process.outputStream) 15 | 16 | outputStream.apply { 17 | writeBytes("$cmd\n") 18 | flush() 19 | writeBytes("exit\n") 20 | flush() 21 | } 22 | 23 | val sb = StringBuilder() 24 | 25 | val runnable = Runnable { 26 | val inputStream = BufferedReader(InputStreamReader(process.inputStream)) 27 | val buf = CharArray(1024) 28 | var len: Int = inputStream.read(buf) 29 | 30 | while (len > 0) { 31 | sb.append(buf, 0, len) 32 | len = inputStream.read(buf) 33 | } 34 | inputStream.close() 35 | } 36 | val inputThread = Thread(runnable) 37 | inputThread.start() 38 | 39 | process.waitFor() 40 | inputThread.join() 41 | 42 | if (AppUtils.atLeastO()) { 43 | process.destroyForcibly() 44 | } else { 45 | process.destroy() 46 | } 47 | 48 | return sb.toString() 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/model/cloud/GiteeApiContentBean.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.model.cloud 2 | 3 | import androidx.annotation.Keep 4 | import com.google.gson.annotations.SerializedName 5 | 6 | /** 7 | *
 8 |  * author : Absinthe
 9 |  * time : 2020/10/12
10 |  * 
11 | */ 12 | @Keep 13 | data class GiteeApiContentBean( 14 | @SerializedName("type") val type: String, 15 | @SerializedName("size") val size: Long, 16 | @SerializedName("name") val name: String, 17 | @SerializedName("path") val path: String, 18 | @SerializedName("sha") val sha: String, 19 | @SerializedName("url") val url: String, 20 | @SerializedName("html_url") val html_url: String, 21 | @SerializedName("download_url") val download_url: String?, 22 | @SerializedName("_links") val _links: Links 23 | ) { 24 | data class Links( 25 | @SerializedName("self") val self: String, 26 | @SerializedName("html") val html: String 27 | ) 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/model/cloud/RuleEntity.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.model.cloud 2 | 3 | import android.os.Parcelable 4 | import androidx.annotation.Keep 5 | import com.google.gson.annotations.SerializedName 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | @Keep 10 | data class RuleEntity( 11 | @SerializedName("name") val name: String, 12 | @SerializedName("contributor") val contributor: String, 13 | @SerializedName("content") val content: String, 14 | @SerializedName("desc") val desc: String 15 | ) : Parcelable 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/model/database/PageEntity.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.model.database 2 | 3 | import androidx.annotation.Keep 4 | import androidx.room.ColumnInfo 5 | import androidx.room.Entity 6 | import androidx.room.PrimaryKey 7 | import com.absinthe.anywhere_.constants.AnywhereType 8 | 9 | @Keep 10 | @Entity(tableName = "page_table") 11 | data class PageEntity( 12 | @PrimaryKey 13 | @ColumnInfo(name = "id") 14 | var id: String = System.currentTimeMillis().toString(), 15 | 16 | @ColumnInfo(name = "title") 17 | var title: String = "", 18 | 19 | @ColumnInfo(name = "priority") 20 | var priority: Int = 0, 21 | 22 | @ColumnInfo(name = "type") 23 | var type: Int = AnywhereType.Page.CARD_PAGE, 24 | 25 | @ColumnInfo(name = "time_stamp") 26 | var timeStamp: String = id, 27 | 28 | @ColumnInfo(name = "extra") 29 | var extra: String? = "", 30 | 31 | @ColumnInfo(name = "backgroundUri") 32 | var backgroundUri: String? = "" 33 | ) 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/model/viewholder/AppListBean.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.model.viewholder 2 | 3 | import android.graphics.Color 4 | import android.graphics.drawable.ColorDrawable 5 | import android.graphics.drawable.Drawable 6 | 7 | data class AppListBean( 8 | val id: String, 9 | val appName: String = "", 10 | val packageName: String = "", 11 | val className: String = "", 12 | var icon: Drawable = ColorDrawable(Color.TRANSPARENT), 13 | val type: Int, 14 | val isExported: Boolean = false, 15 | var isLaunchActivity: Boolean = false 16 | ) 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/model/viewholder/FlowStepBean.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.model.viewholder 2 | 3 | import com.absinthe.anywhere_.model.database.AnywhereEntity 4 | import com.google.gson.annotations.SerializedName 5 | 6 | data class FlowStepBean( 7 | @SerializedName("entity") var entity: AnywhereEntity? = null, 8 | @SerializedName("delay") var delay: Long = 0 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/model/viewholder/LogModel.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.model.viewholder 2 | 3 | class LogModel { 4 | var createTime: String? = null 5 | var filePath: String? = null 6 | var fileSize: Long = 0 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/receiver/AdminReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.receiver 2 | 3 | import android.app.admin.DeviceAdminReceiver 4 | import android.content.ComponentName 5 | import android.content.Context 6 | import android.content.Intent 7 | import com.blankj.utilcode.util.Utils 8 | 9 | class AdminReceiver : DeviceAdminReceiver() { 10 | 11 | override fun onEnabled(context: Context, intent: Intent) { 12 | //设备管理可用 13 | } 14 | 15 | override fun onDisabled(context: Context, intent: Intent) { 16 | //设备管理不可用 17 | } 18 | 19 | @Deprecated("Deprecated in Java") 20 | override fun onPasswordChanged(context: Context, intent: Intent) {} 21 | 22 | companion object { 23 | val componentName = ComponentName(Utils.getApp(), AdminReceiver::class.java) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/receiver/NotificationClickReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.receiver 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import com.absinthe.anywhere_.ui.settings.LogcatActivity 7 | import com.absinthe.anywhere_.utils.manager.LogRecorder 8 | 9 | class NotificationClickReceiver : BroadcastReceiver() { 10 | 11 | override fun onReceive(context: Context, intent: Intent) { 12 | LogRecorder.getInstance().stop() 13 | LogcatActivity.isStartCatching = false 14 | val newIntent = Intent(context, LogcatActivity::class.java) 15 | .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 16 | context.startActivity(newIntent) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/services/IzukoService.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.services 2 | 3 | import android.view.accessibility.AccessibilityEvent 4 | import cn.vove7.andro_accessibility_api.AccessibilityApi 5 | import cn.vove7.andro_accessibility_api.AppScope 6 | import timber.log.Timber 7 | 8 | class IzukoService : AccessibilityApi() { 9 | 10 | override val enableListenAppScope = true 11 | 12 | override fun onAccessibilityEvent(event: AccessibilityEvent?) { 13 | Timber.e("onAccessibilityEvent $currentScope") 14 | super.onAccessibilityEvent(event) 15 | } 16 | 17 | override fun onPageUpdate(currentScope: AppScope) { 18 | super.onPageUpdate(currentScope) 19 | if (baseService == null) { 20 | baseService = this 21 | } 22 | if (gestureService == null) { 23 | gestureService = this 24 | } 25 | Timber.e("onPageUpdate $currentScope") 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/services/tile/TileService1.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.services.tile 2 | 3 | import android.os.Build 4 | import androidx.annotation.RequiresApi 5 | 6 | @RequiresApi(api = Build.VERSION_CODES.N) 7 | class TileService1 : BaseTileService() -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/services/tile/TileService2.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.services.tile 2 | 3 | import android.os.Build 4 | import androidx.annotation.RequiresApi 5 | 6 | @RequiresApi(api = Build.VERSION_CODES.N) 7 | class TileService2 : BaseTileService() -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/services/tile/TileService3.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.services.tile 2 | 3 | import android.os.Build 4 | import androidx.annotation.RequiresApi 5 | 6 | @RequiresApi(api = Build.VERSION_CODES.N) 7 | class TileService3 : BaseTileService() -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/services/tile/TileService4.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.services.tile 2 | 3 | import android.os.Build 4 | import androidx.annotation.RequiresApi 5 | 6 | @RequiresApi(api = Build.VERSION_CODES.N) 7 | class TileService4 : BaseTileService() -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/services/tile/TileService5.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.services.tile 2 | 3 | import android.os.Build 4 | import androidx.annotation.RequiresApi 5 | 6 | @RequiresApi(api = Build.VERSION_CODES.N) 7 | class TileService5 : BaseTileService() -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/services/tile/TileService6.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.services.tile 2 | 3 | import android.os.Build 4 | import androidx.annotation.RequiresApi 5 | 6 | @RequiresApi(api = Build.VERSION_CODES.N) 7 | class TileService6 : BaseTileService() -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/services/tile/TileService7.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.services.tile 2 | 3 | import android.os.Build 4 | import androidx.annotation.RequiresApi 5 | 6 | @RequiresApi(api = Build.VERSION_CODES.N) 7 | class TileService7 : BaseTileService() -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/ui/dialog/IceBoxGrantDialogFragment.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.ui.dialog 2 | 3 | import android.app.Dialog 4 | import android.content.ComponentName 5 | import android.content.DialogInterface 6 | import android.content.Intent 7 | import android.os.Bundle 8 | import com.absinthe.anywhere_.R 9 | import com.absinthe.anywhere_.view.app.AnywhereDialogBuilder 10 | import com.absinthe.anywhere_.view.app.AnywhereDialogFragment 11 | 12 | class IceBoxGrantDialogFragment : AnywhereDialogFragment() { 13 | 14 | override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 15 | return AnywhereDialogBuilder(requireContext()) 16 | .setMessage(R.string.dialog_message_ice_box_perm_not_support) 17 | .setPositiveButton(R.string.dialog_delete_positive_button, null) 18 | .setNeutralButton(R.string.dialog_go_to_perm_button) { _: DialogInterface?, _: Int -> 19 | val intent = Intent(Intent.ACTION_VIEW).apply { 20 | component = ComponentName( 21 | "com.android.settings", 22 | "com.android.settings.Settings\$ManageApplicationsActivity" 23 | ) 24 | } 25 | requireActivity().startActivity(intent) 26 | } 27 | .create() 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/ui/dialog/ShellResultBottomSheetDialogFragment.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.ui.dialog 2 | 3 | import android.content.DialogInterface 4 | import com.absinthe.anywhere_.view.card.ShellResultContentView 5 | import com.absinthe.libraries.utils.base.BaseBottomSheetViewDialogFragment 6 | import com.absinthe.libraries.utils.view.BottomSheetHeaderView 7 | 8 | const val EXTRA_CONTENT = "EXTRA_CONTENT" 9 | const val EXTRA_NEED_FINISH_ACTIVITY = "EXTRA_NEED_FINISH_ACTIVITY" 10 | 11 | class ShellResultBottomSheetDialogFragment : BaseBottomSheetViewDialogFragment() { 12 | 13 | private val content by lazy { arguments?.getString(EXTRA_CONTENT) } 14 | private val needFinishActivity by lazy { arguments?.getBoolean(EXTRA_NEED_FINISH_ACTIVITY, false) ?: false } 15 | 16 | override fun initRootView(): ShellResultContentView = ShellResultContentView(requireContext()) 17 | 18 | override fun getHeaderView(): BottomSheetHeaderView = root.getHeaderView() 19 | 20 | override fun init() { 21 | root.content.text = content 22 | } 23 | 24 | override fun onDismiss(dialog: DialogInterface) { 25 | super.onDismiss(dialog) 26 | 27 | if (needFinishActivity) { 28 | activity?.finish() 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/ui/editor/EditorFactory.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.ui.editor 2 | 3 | import com.absinthe.anywhere_.constants.AnywhereType 4 | import com.absinthe.anywhere_.ui.editor.impl.* 5 | 6 | object EditorFactory { 7 | 8 | @Throws(IllegalArgumentException::class) 9 | fun produce(type: Int): IEditor { 10 | return when (type) { 11 | AnywhereType.Card.URL_SCHEME -> SchemeEditorFragment() 12 | AnywhereType.Card.ACTIVITY -> AnywhereEditorFragment() 13 | AnywhereType.Card.QR_CODE -> QRCodeEditorFragment() 14 | AnywhereType.Card.IMAGE -> ImageEditorFragment() 15 | AnywhereType.Card.SHELL -> ShellEditorFragment() 16 | AnywhereType.Card.SWITCH_SHELL -> SwitchShellEditorFragment() 17 | AnywhereType.Card.FILE -> FileEditorFragment() 18 | AnywhereType.Card.BROADCAST -> BroadcastEditorFragment() 19 | AnywhereType.Card.WORKFLOW -> WorkflowEditorFragment() 20 | AnywhereType.Card.ACCESSIBILITY -> A11yEditorFragment() 21 | else -> throw IllegalArgumentException("Editor type not exists.") 22 | } 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/ui/editor/IEditor.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.ui.editor 2 | 3 | interface IEditor { 4 | var execWithRoot: Boolean 5 | fun tryRunning() 6 | fun doneEdit(): Boolean 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/ui/setup/SetupActivity.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.ui.setup 2 | 3 | import android.os.Bundle 4 | import com.absinthe.anywhere_.AppBarActivity 5 | import com.absinthe.anywhere_.R 6 | import com.absinthe.anywhere_.databinding.ActivitySetupBinding 7 | 8 | class SetupActivity : AppBarActivity() { 9 | 10 | override fun setViewBinding() = ActivitySetupBinding.inflate(layoutInflater) 11 | 12 | override fun getToolBar() = binding.toolbar.toolBar 13 | 14 | override fun getAppBarLayout() = binding.toolbar.appBar 15 | 16 | override fun onCreate(savedInstanceState: Bundle?) { 17 | super.onCreate(savedInstanceState) 18 | 19 | supportFragmentManager 20 | .beginTransaction() 21 | .setCustomAnimations(R.anim.anim_fade_in, R.anim.anim_fade_out) 22 | .replace(binding.fragmentContainerView.id, WelcomeFragment.newInstance()) 23 | .commitNow() 24 | } 25 | 26 | override fun initView() { 27 | super.initView() 28 | supportActionBar?.setDisplayHomeAsUpEnabled(false) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/ui/setup/WelcomeFragment.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.ui.setup 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import com.absinthe.anywhere_.R 9 | import com.absinthe.anywhere_.databinding.FragmentWelcomeBinding 10 | 11 | class WelcomeFragment : Fragment() { 12 | 13 | override fun onCreateView( 14 | inflater: LayoutInflater, container: ViewGroup?, 15 | savedInstanceState: Bundle? 16 | ): View { 17 | val binding = FragmentWelcomeBinding.inflate(inflater, container, false) 18 | setHasOptionsMenu(true) 19 | 20 | binding.btnWelcomeStart.setOnClickListener { 21 | requireActivity().supportFragmentManager 22 | .beginTransaction() 23 | .setCustomAnimations(R.anim.anim_fade_in, R.anim.anim_fade_out) 24 | .replace(R.id.fragment_container_view, InitializeFragment.newInstance()) 25 | .commitNow() 26 | } 27 | 28 | return binding.root 29 | } 30 | 31 | companion object { 32 | @JvmStatic 33 | fun newInstance(): WelcomeFragment { 34 | return WelcomeFragment() 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/utils/FlagDelegate.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.utils 2 | 3 | import android.app.PendingIntent 4 | 5 | object FlagDelegate { 6 | val PENDING_INTENT_FLAG_MUTABLE = if (AppUtils.atLeastS()) { 7 | PendingIntent.FLAG_MUTABLE 8 | } else { 9 | 0 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/utils/manager/IzukoHelper.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.utils.manager 2 | 3 | import androidx.annotation.Keep 4 | 5 | @Keep 6 | object IzukoHelper { 7 | 8 | init { 9 | System.loadLibrary("izuko") 10 | } 11 | 12 | val cipherKey: String 13 | external get 14 | 15 | external fun checkSignature() 16 | 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/utils/manager/PoliceMan.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.utils.manager 2 | 3 | import android.annotation.SuppressLint 4 | import android.app.Application 5 | import android.content.pm.PackageManager 6 | import java.lang.reflect.Field 7 | import kotlin.system.exitProcess 8 | 9 | 10 | private const val APPLICATION_CLASS_NAME = "AnywhereApplication" 11 | 12 | object PoliceMan { 13 | 14 | fun checkApplicationClass(application: Application) { 15 | if (APPLICATION_CLASS_NAME != application.javaClass.simpleName) { 16 | exitProcess(0) 17 | } 18 | } 19 | 20 | @SuppressLint("PrivateApi") 21 | fun checkPMProxy(application: Application) { 22 | val realPMName = "android.content.pm.IPackageManager\$Stub\$Proxy" 23 | var currentPMName = "" 24 | 25 | try { 26 | // 被代理的对象是 PackageManager.mPM 27 | val packageManager: PackageManager = application.packageManager 28 | val mPMField: Field = packageManager.javaClass.getDeclaredField("mPM") 29 | mPMField.isAccessible = true 30 | val mPM: Any? = mPMField.get(packageManager) 31 | // 取得类名 32 | currentPMName = mPM?.javaClass?.name.orEmpty() 33 | } catch (e: Exception) { 34 | e.printStackTrace() 35 | } finally { 36 | // 类名改变说明被代理了 37 | if (currentPMName != realPMName) { 38 | exitProcess(0) 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/utils/manager/ShellManager.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.utils.manager 2 | 3 | import com.absinthe.anywhere_.BuildConfig 4 | import com.topjohnwu.superuser.Shell 5 | 6 | object ShellManager { 7 | 8 | init { 9 | Shell.enableVerboseLogging = BuildConfig.DEBUG 10 | Shell.setDefaultBuilder( 11 | Shell.Builder.create() 12 | .setFlags(Shell.FLAG_REDIRECT_STDERR) 13 | .setTimeout(10) 14 | ) 15 | } 16 | 17 | fun exec(command: String): String { 18 | return Shell.cmd(command).exec().out.toString() 19 | } 20 | 21 | fun acquireRoot(): Boolean { 22 | return Shell.cmd("su").exec().isSuccess 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/utils/manager/URLManager.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.utils.manager 2 | 3 | import com.absinthe.anywhere_.BuildConfig 4 | import com.absinthe.libraries.me.Absinthe 5 | 6 | /** 7 | * URL Manager 8 | * 9 | * All URLs in App. 10 | */ 11 | object URLManager { 12 | //General 13 | const val DOCUMENT_PAGE = "https://absinthe.life/Anywhere-Docs/" 14 | const val SHIZUKU_MARKET_URL = Absinthe.MARKET_DETAIL_SCHEME + "moe.shizuku.privileged.api" 15 | const val SHORTCUT_COMMUNITY_PAGE = "https://sharecuts.cn/apps/" 16 | const val ANYWHERE_MARKET_URL = Absinthe.MARKET_DETAIL_SCHEME + BuildConfig.APPLICATION_ID 17 | 18 | //Scheme 19 | const val ANYWHERE_SCHEME = "anywhere://" 20 | const val ANYWHERE_SCHEME_RAW = "anywhere" 21 | const val URL_HOST = "url" 22 | const val OPEN_HOST = "open" 23 | const val CARD_SHARING_HOST = "share" 24 | 25 | //WebDAV 26 | const val BACKUP_DIR = "Anywhere-/Backup/" 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/utils/timber/ReleaseTree.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.utils.timber 2 | 3 | import android.util.Log 4 | import com.absinthe.anywhere_.constants.GlobalValues 5 | import timber.log.Timber.DebugTree 6 | 7 | class ReleaseTree : DebugTree() { 8 | 9 | override fun isLoggable(tag: String?, priority: Int): Boolean { 10 | return (!(priority == Log.VERBOSE || priority == Log.DEBUG || priority == Log.INFO) 11 | || GlobalValues.sIsDebugMode) 12 | } 13 | 14 | override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { 15 | if (!isLoggable(tag, priority)) { 16 | return 17 | } 18 | super.log(priority, tag, message, t) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/utils/timber/ThreadAwareDebugTree.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.utils.timber 2 | 3 | import timber.log.Timber.DebugTree 4 | 5 | class ThreadAwareDebugTree : DebugTree() { 6 | 7 | override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { 8 | var newTag = tag 9 | 10 | newTag?.let { 11 | val threadName = Thread.currentThread().name 12 | newTag = "<$threadName> $tag" 13 | } 14 | 15 | super.log(priority, newTag, message, t) 16 | } 17 | 18 | override fun createStackElementTag(element: StackTraceElement): String? { 19 | return super.createStackElementTag(element) + " (Line ${element.lineNumber})" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/view/app/AlwaysMarqueeTextView.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.view.app 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import androidx.appcompat.widget.AppCompatTextView 6 | 7 | class AlwaysMarqueeTextView : AppCompatTextView { 8 | 9 | constructor(context: Context) : super(context) 10 | constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) 11 | constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super( 12 | context, 13 | attrs, 14 | defStyle 15 | ) 16 | 17 | override fun isFocused(): Boolean { 18 | return true 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/view/app/AnywhereBottomSheetDialog.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.view.app 2 | 3 | import android.content.Context 4 | import com.absinthe.anywhere_.utils.manager.DialogStack 5 | import com.google.android.material.bottomsheet.BottomSheetDialog 6 | 7 | class AnywhereBottomSheetDialog(context: Context) : BottomSheetDialog(context) { 8 | 9 | var isPush = false 10 | private var isDismissParent = false 11 | 12 | override fun show() { 13 | super.show() 14 | 15 | setOnDismissListener { 16 | DialogStack.pop() 17 | if (isDismissParent) { 18 | DialogStack.pop() 19 | } 20 | } 21 | if (!isPush) { 22 | DialogStack.push(this) 23 | isPush = true 24 | } 25 | } 26 | 27 | fun setDismissParent(dismissParent: Boolean) { 28 | isDismissParent = dismissParent 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/view/app/AnywhereDialogBuilder.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.view.app 2 | 3 | import android.content.Context 4 | import android.widget.TextView 5 | import androidx.appcompat.app.AlertDialog 6 | import com.absinthe.anywhere_.utils.manager.DialogStack 7 | import com.google.android.material.dialog.MaterialAlertDialogBuilder 8 | 9 | class AnywhereDialogBuilder : MaterialAlertDialogBuilder { 10 | 11 | private var isDismissParent = false //Dismiss this Dialog and its parent Dialog 12 | private var isMessageSelectable = false 13 | 14 | constructor(context: Context) : super(context) 15 | constructor(context: Context, overrideThemeResId: Int) : super(context, overrideThemeResId) 16 | 17 | override fun show(): AlertDialog { 18 | setOnDismissListener { 19 | DialogStack.pop() 20 | if (isDismissParent) { 21 | DialogStack.pop() 22 | } 23 | } 24 | 25 | val dialog = super.show() 26 | dialog.findViewById(android.R.id.message)?.setTextIsSelectable(isMessageSelectable) 27 | DialogStack.push(dialog) 28 | return dialog 29 | } 30 | 31 | fun setDismissParent(flag: Boolean): AnywhereDialogBuilder { 32 | isDismissParent = flag 33 | return this 34 | } 35 | 36 | fun setMessageSelectable(flag: Boolean): AnywhereDialogBuilder { 37 | isMessageSelectable = flag 38 | return this 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/view/app/AnywhereDialogFragment.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.view.app 2 | 3 | import android.content.DialogInterface 4 | import androidx.fragment.app.DialogFragment 5 | import androidx.fragment.app.FragmentManager 6 | import com.absinthe.anywhere_.utils.manager.DialogStack 7 | import timber.log.Timber 8 | 9 | open class AnywhereDialogFragment : DialogFragment() { 10 | 11 | private var isDismissParent = false 12 | private var mListener: OnDismissListener? = null 13 | 14 | override fun show(manager: FragmentManager, tag: String?) { 15 | try { 16 | super.show(manager, tag) 17 | } catch (e: IllegalStateException) { 18 | Timber.e(e) 19 | } 20 | DialogStack.push(this) 21 | } 22 | 23 | override fun onDismiss(dialog: DialogInterface) { 24 | super.onDismiss(dialog) 25 | 26 | DialogStack.pop() 27 | if (isDismissParent) { 28 | DialogStack.pop() 29 | } 30 | mListener?.onDismiss() 31 | } 32 | 33 | protected fun setWrapOnDismissListener(listener: OnDismissListener?) { 34 | mListener = listener 35 | } 36 | 37 | protected fun setDismissParent(flag: Boolean) { 38 | isDismissParent = flag 39 | } 40 | 41 | interface OnDismissListener { 42 | fun onDismiss() 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/view/app/IHeaderView.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.view.app 2 | 3 | import com.absinthe.libraries.utils.view.BottomSheetHeaderView 4 | 5 | interface IHeaderView { 6 | fun getHeaderView(): BottomSheetHeaderView 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/view/card/FlowRecyclerView.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.view.card 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.view.MotionEvent 6 | import androidx.recyclerview.widget.RecyclerView 7 | 8 | class FlowRecyclerView : RecyclerView { 9 | 10 | constructor(context: Context) : super(context) 11 | constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) 12 | constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super( 13 | context, 14 | attrs, 15 | defStyle 16 | ) 17 | 18 | private var lastX = 0f 19 | private var lastY = 0f 20 | 21 | override fun dispatchTouchEvent(ev: MotionEvent): Boolean { 22 | when (ev.action) { 23 | MotionEvent.ACTION_DOWN -> { 24 | parent.requestDisallowInterceptTouchEvent(true) 25 | lastX = ev.x 26 | lastY = ev.y 27 | } 28 | MotionEvent.ACTION_MOVE -> { 29 | //如果不能垂直滑动则不拦截父布局点击事件 30 | if (!canScrollVertically(1) || !canScrollVertically(-1)) { 31 | parent.requestDisallowInterceptTouchEvent(false) 32 | } 33 | } 34 | } 35 | 36 | return super.dispatchTouchEvent(ev) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/view/home/CustomFullDraggableContainer.java: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.view.home; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.content.Context; 5 | import android.util.AttributeSet; 6 | import android.view.MotionEvent; 7 | 8 | import androidx.annotation.NonNull; 9 | import androidx.annotation.Nullable; 10 | 11 | import com.drakeet.drawer.FullDraggableContainer; 12 | 13 | public class CustomFullDraggableContainer extends FullDraggableContainer { 14 | 15 | private boolean mShouldEnableDrawer = false; 16 | 17 | public CustomFullDraggableContainer(@NonNull Context context) { 18 | super(context); 19 | } 20 | 21 | public CustomFullDraggableContainer(@NonNull Context context, @Nullable AttributeSet attrs) { 22 | super(context, attrs); 23 | } 24 | 25 | public CustomFullDraggableContainer(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 26 | super(context, attrs, defStyleAttr); 27 | } 28 | 29 | public void setEnableDrawer(boolean shouldEnableDrawer) { 30 | mShouldEnableDrawer = shouldEnableDrawer; 31 | } 32 | 33 | @SuppressLint("ClickableViewAccessibility") 34 | @Override 35 | public boolean onTouchEvent(MotionEvent event) { 36 | if (!mShouldEnableDrawer) { 37 | return false; 38 | } 39 | return super.onTouchEvent(event); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/view/settings/CustomCardLayoutView.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.view.settings 2 | 3 | import android.content.Context 4 | import androidx.constraintlayout.widget.ConstraintLayout 5 | 6 | class CustomCardLayoutView(context: Context) : ConstraintLayout(context) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/view/settings/ObservableTimePickerDialog.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.view.settings 2 | 3 | import android.app.TimePickerDialog 4 | import android.content.Context 5 | 6 | class ObservableTimePickerDialog( 7 | context: Context?, 8 | listener: OnTimeSetListener?, 9 | private val mListener: OnCancelledListener, 10 | hourOfDay: Int, minute: Int, is24HourView: Boolean 11 | ) : TimePickerDialog(context, listener, hourOfDay, minute, is24HourView) { 12 | 13 | override fun cancel() { 14 | super.cancel() 15 | mListener.onCancel() 16 | } 17 | 18 | interface OnCancelledListener { 19 | fun onCancel() 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/viewbuilder/IViewBuilder.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.viewbuilder 2 | 3 | import android.view.View 4 | 5 | internal interface IViewBuilder { 6 | fun addView(view: View) 7 | fun removeView(view: View) 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/viewbuilder/ViewBuilder.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.viewbuilder 2 | 3 | import android.content.Context 4 | import android.content.res.Resources 5 | import android.view.View 6 | import android.view.ViewGroup 7 | 8 | /** 9 | * View Builder 10 | * 11 | * 12 | * To build a view with Java code. 13 | */ 14 | open class ViewBuilder : IViewBuilder { 15 | 16 | lateinit var root: ViewGroup 17 | protected set 18 | protected var mContext: Context 19 | 20 | val Number.dp: Int get() = (toInt() * Resources.getSystem().displayMetrics.density).toInt() 21 | 22 | protected constructor(context: Context) { 23 | mContext = context 24 | } 25 | 26 | protected constructor(context: Context, viewGroup: ViewGroup) { 27 | mContext = context 28 | root = viewGroup 29 | } 30 | 31 | override fun addView(view: View) { 32 | root.addView(view) 33 | } 34 | 35 | override fun removeView(view: View) { 36 | root.removeView(view) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/viewbuilder/entity/CardSharingBuilder.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.viewbuilder.entity 2 | 3 | import android.content.Context 4 | import android.view.Gravity 5 | import android.widget.ImageView 6 | import android.widget.LinearLayout 7 | import com.absinthe.anywhere_.utils.QRCodeUtil 8 | import com.absinthe.anywhere_.viewbuilder.ViewBuilder 9 | 10 | class CardSharingBuilder(context: Context, text: String) : ViewBuilder(context) { 11 | 12 | private var ivQrCode: ImageView 13 | 14 | init { 15 | root = LinearLayout(context).apply { 16 | layoutParams = LinearLayout.LayoutParams( 17 | LinearLayout.LayoutParams.MATCH_PARENT, 18 | LinearLayout.LayoutParams.WRAP_CONTENT 19 | ) 20 | 21 | val padding = 20.dp 22 | setPadding(padding, padding, padding, padding) 23 | gravity = Gravity.CENTER 24 | } 25 | 26 | ivQrCode = ImageView(context).apply { 27 | layoutParams = LinearLayout.LayoutParams(250.dp, 250.dp) 28 | } 29 | addView(ivQrCode) 30 | 31 | ivQrCode.setImageBitmap(QRCodeUtil.createQRCodeBitmap(text, 250.dp, 250.dp)) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/viewbuilder/entity/CreateShortcutDialogBuilder.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.viewbuilder.entity 2 | 3 | import android.content.Context 4 | import android.widget.EditText 5 | import android.widget.ImageView 6 | import android.widget.LinearLayout 7 | import com.absinthe.anywhere_.viewbuilder.ViewBuilder 8 | 9 | class CreateShortcutDialogBuilder(context: Context) : ViewBuilder(context) { 10 | 11 | var ivIcon: ImageView 12 | var etName: EditText 13 | 14 | init { 15 | root = LinearLayout(context).apply { 16 | layoutParams = LinearLayout.LayoutParams( 17 | LinearLayout.LayoutParams.MATCH_PARENT, 18 | LinearLayout.LayoutParams.MATCH_PARENT 19 | ) 20 | 21 | val padding = 25.dp 22 | setPadding(padding, padding, padding, padding) 23 | orientation = LinearLayout.HORIZONTAL 24 | } 25 | 26 | ivIcon = ImageView(context).apply { 27 | layoutParams = LinearLayout.LayoutParams(45.dp, 45.dp) 28 | } 29 | addView(ivIcon) 30 | 31 | etName = EditText(context).apply { 32 | layoutParams = LinearLayout.LayoutParams( 33 | LinearLayout.LayoutParams.MATCH_PARENT, 34 | LinearLayout.LayoutParams.WRAP_CONTENT 35 | ).apply { 36 | marginStart = 10.dp 37 | } 38 | setSingleLine() 39 | } 40 | addView(etName) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/viewbuilder/entity/IconPackDialogBuilder.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.viewbuilder.entity 2 | 3 | import android.content.Context 4 | import android.widget.LinearLayout 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.absinthe.anywhere_.viewbuilder.ViewBuilder 7 | 8 | class IconPackDialogBuilder(context: Context) : ViewBuilder(context) { 9 | 10 | var rvIconPack: RecyclerView 11 | 12 | init { 13 | root = LinearLayout(context).apply { 14 | layoutParams = LinearLayout.LayoutParams( 15 | LinearLayout.LayoutParams.MATCH_PARENT, 16 | LinearLayout.LayoutParams.MATCH_PARENT 17 | ) 18 | } 19 | 20 | rvIconPack = RecyclerView(context).apply { 21 | layoutParams = LinearLayout.LayoutParams( 22 | LinearLayout.LayoutParams.MATCH_PARENT, 23 | LinearLayout.LayoutParams.WRAP_CONTENT 24 | ).apply { 25 | setMargins(0, 0, 0, 10.dp) 26 | overScrollMode = RecyclerView.OVER_SCROLL_NEVER 27 | } 28 | } 29 | 30 | addView(rvIconPack) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/viewbuilder/entity/IntervalDialogBuilder.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.viewbuilder.entity 2 | 3 | import android.content.Context 4 | import android.widget.LinearLayout 5 | import com.absinthe.anywhere_.viewbuilder.ViewBuilder 6 | import com.google.android.material.slider.Slider 7 | 8 | class IntervalDialogBuilder(context: Context) : ViewBuilder(context) { 9 | 10 | var slider: Slider 11 | 12 | init { 13 | root = LinearLayout(context).apply { 14 | layoutParams = LinearLayout.LayoutParams( 15 | LinearLayout.LayoutParams.MATCH_PARENT, 16 | LinearLayout.LayoutParams.MATCH_PARENT 17 | ) 18 | val padding = 10.dp 19 | setPadding(padding, padding, padding, padding) 20 | } 21 | 22 | slider = Slider(context).apply { 23 | layoutParams = LinearLayout.LayoutParams( 24 | LinearLayout.LayoutParams.MATCH_PARENT, 25 | LinearLayout.LayoutParams.WRAP_CONTENT 26 | ) 27 | valueFrom = 0.5f 28 | valueTo = 2.5f 29 | stepSize = 0.25f 30 | setLabelFormatter { value: Float -> value.toString() + "s" } 31 | } 32 | 33 | addView(slider) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/absinthe/anywhere_/viewbuilder/entity/RenameDialogBuilder.kt: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_.viewbuilder.entity 2 | 3 | import android.content.Context 4 | import android.widget.EditText 5 | import android.widget.LinearLayout 6 | import com.absinthe.anywhere_.viewbuilder.ViewBuilder 7 | 8 | class RenameDialogBuilder(context: Context) : ViewBuilder(context) { 9 | 10 | var etName: EditText 11 | 12 | init { 13 | root = LinearLayout(context).apply { 14 | layoutParams = LinearLayout.LayoutParams( 15 | LinearLayout.LayoutParams.MATCH_PARENT, 16 | LinearLayout.LayoutParams.MATCH_PARENT 17 | ) 18 | orientation = LinearLayout.HORIZONTAL 19 | 20 | val padding = 25.dp 21 | setPadding(padding, padding, padding, padding) 22 | } 23 | 24 | etName = EditText(context).apply { 25 | layoutParams = LinearLayout.LayoutParams( 26 | LinearLayout.LayoutParams.MATCH_PARENT, 27 | LinearLayout.LayoutParams.WRAP_CONTENT 28 | ).apply { 29 | marginStart = 10.dp 30 | } 31 | setSingleLine() 32 | } 33 | 34 | addView(etName) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_fade_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_fade_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_slide_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_slide_up.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_text_switcher_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_text_switcher_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/rd_dialog_enter.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 13 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/anim/rd_dialog_exit.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 13 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/animator/alpha_animator.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 11 | 12 | 13 | 14 | 15 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/btn_collector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/drawable-hdpi/btn_collector.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/btn_collector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/drawable-mdpi/btn_collector.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-xxxhdpi/bg_widget.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/drawable-night-xxxhdpi/bg_widget.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/pic_widget_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/drawable-nodpi/pic_widget_preview.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/btn_collector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/drawable-xhdpi/btn_collector.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/btn_collector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/drawable-xxhdpi/btn_collector.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/bg_widget.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/drawable-xxxhdpi/bg_widget.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/btn_collector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/drawable-xxxhdpi/btn_collector.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/pic_splash.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/drawable-xxxhdpi/pic_splash.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_collector_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_color_dashboard.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_home_widget.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_shell.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_shell_cursor.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_toast.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_widget_list_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_activity_list.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_home_shortcuts.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_advanced_card.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_alert.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_android.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_animation.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_apply_restore.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backup_and_restore.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_close_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_brush.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_card_accessibility.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_card_activity.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_card_no.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_card_shell.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_card_switch.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_change_bg.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear_shortcuts.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cloud_backup.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_code_setting.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_color.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_color_lens.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_content.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_copy.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dark_mode.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dehaze.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete_forever.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete_toolbar.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_deprecate_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_done.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_done_solid.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_filter_list.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_full_class_switch.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_green_dot.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_heart.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_help_outline.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_keyboard_arrow_right.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lab.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_logo.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_logo_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_manual_sort.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_move.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_outline_info_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pages.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_plus_circle.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_red_dot.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reset.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_restore.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_select_all.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_send_log.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_share.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sharp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_shortcut_start_collector.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sort.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_stream_card.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_target.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_user.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_visibility_off.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_working_mode.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_page_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_view_group.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/splash_drawable.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/transparent.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/font/jetbrains_mono_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/font/jetbrains_mono_regular.ttf -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_backup.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 16 | 17 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_defrost.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 16 | 17 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_lab.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 16 | 17 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 16 | 17 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_setup.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 16 | 17 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_third_apps_shortcut.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 16 | 17 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_tile_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 16 | 17 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_fragment_restore_apply.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_category_card.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_initialize.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | 13 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_webview.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_advanced_card.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 23 | 24 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_chip.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_cloud_rules.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 17 | 18 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_page.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_widget_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 19 | 20 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_header_extras.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_webdav_restore.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_recyclerview.xml: -------------------------------------------------------------------------------- 1 | 2 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/widget_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/menu/about_menu.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/menu/app_detail_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/menu/app_list_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 12 | 13 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/menu/cloud_rules_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/menu/editor_bottom_bar_edit_mode_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | 13 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/menu/editor_bottom_bar_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/menu/initialize_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/page_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/menu/sort_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 14 | 18 | 22 | 23 | 24 | 25 | 29 | 30 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/menu/web_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-xxxhdpi/ic_launcher_beta.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/pic_android_links.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-xxxhdpi/pic_android_links.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/pic_rabbit.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/app/src/main/res/mipmap-xxxhdpi/pic_rabbit.webp -------------------------------------------------------------------------------- /app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FF121212 4 | #FFB1B8DF 5 | 6 | #FF454545 7 | #FFFFFFFF 8 | #FF666666 9 | #FF121212 10 | #FFA0A0A0 11 | #FF121212 12 | #FF343434 13 | #FF565656 14 | #FF121212 15 | #CCBBBBBB 16 | #FFFFFFFF 17 | 18 | 19 | #FFECECEC 20 | #FF444444 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 7 | 8 | 9 | 10 | 9 | 10 | 5 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #8BC34A 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 22 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/values/transition.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | item_container 4 | background 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/xml-v25/shortcuts.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/xml/accessibility_service_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/xml/app_delegation.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/xml/backup_rules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/xml/file_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/xml/locales_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/xml/searchable.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/xml/widget_home_provider_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | -------------------------------------------------------------------------------- /app/src/test/java/com/absinthe/anywhere_/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.absinthe.anywhere_; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | 5 | import org.junit.Test; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | google() 6 | gradlePluginPortal() 7 | maven("https://jitpack.io") 8 | } 9 | dependencies { 10 | classpath("com.android.tools.build:gradle:8.1.4") 11 | classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.21") 12 | classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:1.9.0-1.0.13") 13 | classpath("dev.rikka.tools.materialthemebuilder:gradle-plugin:1.4.0") 14 | } 15 | } 16 | 17 | allprojects { 18 | repositories { 19 | google() 20 | maven("https://jitpack.io") 21 | mavenCentral() 22 | } 23 | } 24 | 25 | task("clean") { 26 | delete(rootProject.buildDir) 27 | } 28 | -------------------------------------------------------------------------------- /color-picker/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /color-picker/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdk 34 5 | 6 | defaultConfig { 7 | namespace "com.flask.colorpicker" 8 | minSdkVersion 23 9 | targetSdkVersion 33 10 | versionCode 18 11 | versionName "0.0.16" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(dir: 'libs', include: ['*.jar']) 23 | api 'androidx.appcompat:appcompat:1.1.0' 24 | } 25 | -------------------------------------------------------------------------------- /color-picker/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/flask/Documents/android-sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /color-picker/src/main/java/com/flask/colorpicker/ColorCircle.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker; 2 | 3 | import android.graphics.Color; 4 | 5 | public class ColorCircle { 6 | private float x, y; 7 | private float[] hsv = new float[3]; 8 | private float[] hsvClone; 9 | private int color; 10 | 11 | public ColorCircle(float x, float y, float[] hsv) { 12 | set(x, y, hsv); 13 | } 14 | 15 | public double sqDist(float x, float y) { 16 | double dx = this.x - x; 17 | double dy = this.y - y; 18 | return dx * dx + dy * dy; 19 | } 20 | 21 | public float getX() { 22 | return x; 23 | } 24 | 25 | public float getY() { 26 | return y; 27 | } 28 | 29 | public float[] getHsv() { 30 | return hsv; 31 | } 32 | 33 | public float[] getHsvWithLightness(float lightness) { 34 | if (hsvClone == null) 35 | hsvClone = hsv.clone(); 36 | hsvClone[0] = hsv[0]; 37 | hsvClone[1] = hsv[1]; 38 | hsvClone[2] = lightness; 39 | return hsvClone; 40 | } 41 | 42 | public void set(float x, float y, float[] hsv) { 43 | this.x = x; 44 | this.y = y; 45 | this.hsv[0] = hsv[0]; 46 | this.hsv[1] = hsv[1]; 47 | this.hsv[2] = hsv[2]; 48 | this.color = Color.HSVToColor(this.hsv); 49 | } 50 | 51 | public int getColor() { 52 | return color; 53 | } 54 | } -------------------------------------------------------------------------------- /color-picker/src/main/java/com/flask/colorpicker/OnColorChangedListener.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker; 2 | 3 | public interface OnColorChangedListener { 4 | void onColorChanged(int selectedColor); 5 | } 6 | -------------------------------------------------------------------------------- /color-picker/src/main/java/com/flask/colorpicker/OnColorSelectedListener.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker; 2 | 3 | public interface OnColorSelectedListener { 4 | void onColorSelected(int selectedColor); 5 | } 6 | -------------------------------------------------------------------------------- /color-picker/src/main/java/com/flask/colorpicker/Utils.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker; 2 | 3 | import android.graphics.Color; 4 | 5 | /** 6 | * Created by Charles Andersons on 4/17/15. 7 | */ 8 | public class Utils { 9 | public static float getAlphaPercent(int argb) { 10 | return Color.alpha(argb) / 255f; 11 | } 12 | 13 | public static int alphaValueAsInt(float alpha) { 14 | return Math.round(alpha * 255); 15 | } 16 | 17 | public static int adjustAlpha(float alpha, int color) { 18 | return alphaValueAsInt(alpha) << 24 | (0x00ffffff & color); 19 | } 20 | 21 | public static int colorAtLightness(int color, float lightness) { 22 | float[] hsv = new float[3]; 23 | Color.colorToHSV(color, hsv); 24 | hsv[2] = lightness; 25 | return Color.HSVToColor(hsv); 26 | } 27 | 28 | public static float lightnessOfColor(int color) { 29 | float[] hsv = new float[3]; 30 | Color.colorToHSV(color, hsv); 31 | return hsv[2]; 32 | } 33 | 34 | public static String getHexString(int color, boolean showAlpha) { 35 | int base = showAlpha ? 0xFFFFFFFF : 0xFFFFFF; 36 | String format = showAlpha ? "#%08X" : "#%06X"; 37 | return String.format(format, (base & color)).toUpperCase(); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /color-picker/src/main/java/com/flask/colorpicker/builder/ColorPickerClickListener.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker.builder; 2 | 3 | import android.content.DialogInterface; 4 | 5 | /** 6 | * Created by Charles Anderson on 4/17/15. 7 | */ 8 | public interface ColorPickerClickListener { 9 | void onClick(DialogInterface d, int lastSelectedColor, Integer[] allColors); 10 | } 11 | -------------------------------------------------------------------------------- /color-picker/src/main/java/com/flask/colorpicker/builder/ColorWheelRendererBuilder.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker.builder; 2 | 3 | import com.flask.colorpicker.ColorPickerView; 4 | import com.flask.colorpicker.renderer.ColorWheelRenderer; 5 | import com.flask.colorpicker.renderer.FlowerColorWheelRenderer; 6 | import com.flask.colorpicker.renderer.SimpleColorWheelRenderer; 7 | 8 | public class ColorWheelRendererBuilder { 9 | public static ColorWheelRenderer getRenderer(ColorPickerView.WHEEL_TYPE wheelType) { 10 | switch (wheelType) { 11 | case CIRCLE: 12 | return new SimpleColorWheelRenderer(); 13 | case FLOWER: 14 | return new FlowerColorWheelRenderer(); 15 | } 16 | throw new IllegalArgumentException("wrong WHEEL_TYPE"); 17 | } 18 | } -------------------------------------------------------------------------------- /color-picker/src/main/java/com/flask/colorpicker/renderer/AbsColorWheelRenderer.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker.renderer; 2 | 3 | import com.flask.colorpicker.ColorCircle; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public abstract class AbsColorWheelRenderer implements ColorWheelRenderer { 9 | protected ColorWheelRenderOption colorWheelRenderOption; 10 | protected List colorCircleList = new ArrayList<>(); 11 | 12 | public void initWith(ColorWheelRenderOption colorWheelRenderOption) { 13 | this.colorWheelRenderOption = colorWheelRenderOption; 14 | this.colorCircleList.clear(); 15 | } 16 | 17 | @Override 18 | public ColorWheelRenderOption getRenderOption() { 19 | if (colorWheelRenderOption == null) colorWheelRenderOption = new ColorWheelRenderOption(); 20 | return colorWheelRenderOption; 21 | } 22 | 23 | public List getColorCircleList() { 24 | return colorCircleList; 25 | } 26 | 27 | protected int getAlphaValueAsInt() { 28 | return Math.round(colorWheelRenderOption.alpha * 255); 29 | } 30 | 31 | protected int calcTotalCount(float radius, float size) { 32 | return Math.max(1, (int) ((1f - GAP_PERCENTAGE) * Math.PI / (Math.asin(size / radius)) + 0.5f)); 33 | } 34 | } -------------------------------------------------------------------------------- /color-picker/src/main/java/com/flask/colorpicker/renderer/ColorWheelRenderOption.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker.renderer; 2 | 3 | import android.graphics.Canvas; 4 | 5 | public class ColorWheelRenderOption { 6 | public int density; 7 | public float maxRadius; 8 | public float cSize, strokeWidth, alpha, lightness; 9 | public Canvas targetCanvas; 10 | } -------------------------------------------------------------------------------- /color-picker/src/main/java/com/flask/colorpicker/renderer/ColorWheelRenderer.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker.renderer; 2 | 3 | import com.flask.colorpicker.ColorCircle; 4 | 5 | import java.util.List; 6 | 7 | public interface ColorWheelRenderer { 8 | float GAP_PERCENTAGE = 0.025f; 9 | 10 | void draw(); 11 | 12 | ColorWheelRenderOption getRenderOption(); 13 | 14 | void initWith(ColorWheelRenderOption colorWheelRenderOption); 15 | 16 | List getColorCircleList(); 17 | } 18 | -------------------------------------------------------------------------------- /color-picker/src/main/java/com/flask/colorpicker/slider/OnValueChangedListener.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker.slider; 2 | 3 | public interface OnValueChangedListener { 4 | void onValueChanged(float value); 5 | } -------------------------------------------------------------------------------- /color-picker/src/main/res/layout/color_edit.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /color-picker/src/main/res/layout/color_preview.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /color-picker/src/main/res/layout/color_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 12 | -------------------------------------------------------------------------------- /color-picker/src/main/res/layout/color_widget.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /color-picker/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /color-picker/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 36dp 3 | 24dp 4 | 4dp 5 | 10dp 6 | 24dp 7 | 40dp 8 | 36dp 9 | 20dp 10 | 11 | -------------------------------------------------------------------------------- /color-picker/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx4g -XX:+UseParallelGC -Dfile.encoding=UTF-8 2 | org.gradle.parallel=true 3 | org.gradle.caching=true 4 | org.gradle.configureondemand=true 5 | 6 | android.enableJetifier=true 7 | android.useAndroidX=true 8 | android.nonTransitiveRClass=true 9 | android.enableR8.fullMode=false 10 | 11 | kotlin.code.style=official 12 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /icons/beta/LICENSE/LICENSE.txt: -------------------------------------------------------------------------------- 1 | License 2 | ======= 3 | 4 | Icons generated with the Android Material Icon Generator are licensed under the Creative Commons Attribution-NonCommercial 3.0 License (https://creativecommons.org/licenses/by-nc/3.0/). 5 | 6 | For commercial usage, please submit a request under https://goo.gl/forms/zX8GZ3Jz89SRyHdJ2 or send us an email to material-icons@bitdroid.de. 7 | 8 | 9 | Google Material Icons License 10 | ============================= 11 | 12 | This license applies to the Google Material Icons, which can be seen on the front page of the Android Material icon generator. 13 | 14 | (Copied from https://github.com/google/material-design-icons) 15 | We have made these icons available for you to incorporate them into your 16 | products under the Creative Common Attribution 4.0 International License (CC-BY 17 | 4.0, https://creativecommons.org/licenses/by/4.0/). Feel free to remix and 18 | re-share these icons and documentation in your products. We'd love attribution 19 | in your app's *about* screen, but it's not required. The only thing we ask is 20 | that you not re-sell the icons themselves. -------------------------------------------------------------------------------- /icons/beta/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/icons/beta/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /icons/beta/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/icons/beta/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /icons/beta/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/icons/beta/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /icons/beta/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/icons/beta/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /icons/beta/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/icons/beta/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /icons/beta/playstore/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhaobozhen/Anywhere-/03dd5f7f5d4a7d3f375c2e688016c532093bb815/icons/beta/playstore/icon.png -------------------------------------------------------------------------------- /icons/ic_logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | include(":app") 2 | include(":color-picker") 3 | 4 | rootProject.apply { 5 | name = "Anywhere-" 6 | buildFileName = "build.gradle.kts" 7 | } 8 | --------------------------------------------------------------------------------