Showing preview only (2,759K chars total). Download the full file or copy to clipboard to get everything.
Repository: TBog/TBLauncher
Branch: master
Commit: f7fbfcc03dd9
Files: 546
Total size: 2.5 MB
Directory structure:
gitextract_ggifh6nm/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── dependabot.yml
│ └── workflows/
│ ├── android.yml
│ ├── deploy.yml
│ └── release.yml
├── .gitignore
├── .idea/
│ ├── codeStyles/
│ │ ├── Project.xml
│ │ └── codeStyleConfig.xml
│ ├── compiler.xml
│ ├── google-java-format.xml
│ ├── inspectionProfiles/
│ │ └── Project_Default.xml
│ ├── jarRepositories.xml
│ ├── migrations.xml
│ ├── palantir-java-format.xml
│ └── render.experimental.xml
├── Gemfile
├── LICENSE.md
├── Privacy-Policy.md
├── README.md
├── _config.yml
├── _layouts/
│ ├── default.html
│ └── simple.html
├── app/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ ├── net/
│ │ │ └── mm2d/
│ │ │ └── color/
│ │ │ └── chooser/
│ │ │ ├── ColorChooserDialog.kt
│ │ │ ├── ColorChooserView.kt
│ │ │ ├── ColorLiveDataOwner.kt
│ │ │ ├── ColorObserverDelegate.kt
│ │ │ ├── ControlView.kt
│ │ │ ├── HsvView.kt
│ │ │ ├── PaletteView.kt
│ │ │ ├── SliderView.kt
│ │ │ ├── ViewPagerAdapter.kt
│ │ │ ├── element/
│ │ │ │ ├── ColorSliderView.kt
│ │ │ │ ├── HueView.kt
│ │ │ │ ├── PaletteCell.kt
│ │ │ │ ├── PreviewView.kt
│ │ │ │ └── SvView.kt
│ │ │ └── util/
│ │ │ ├── AttrExtentions.kt
│ │ │ ├── CanvasExtensions.kt
│ │ │ ├── ColorUtils.kt
│ │ │ └── ResourceExtensions.kt
│ │ └── rocks/
│ │ └── tbog/
│ │ └── tblauncher/
│ │ ├── Behaviour.java
│ │ ├── CustomizeUI.java
│ │ ├── DeviceAdmin.java
│ │ ├── DrawableCache.java
│ │ ├── DummyLauncherActivity.java
│ │ ├── EditTagsDialog.java
│ │ ├── LauncherState.java
│ │ ├── LiveWallpaper.java
│ │ ├── MimeTypeCache.java
│ │ ├── Permission.java
│ │ ├── PermissionsManager.java
│ │ ├── PinShortcutConfirm.java
│ │ ├── SettingsActivity.java
│ │ ├── TBApplication.java
│ │ ├── TBLauncherActivity.java
│ │ ├── TagsManager.java
│ │ ├── WallpaperSnapAnim.java
│ │ ├── WorkAsync/
│ │ │ ├── AsyncTask.java
│ │ │ ├── RunnableTask.java
│ │ │ └── TaskRunner.java
│ │ ├── broadcast/
│ │ │ ├── IncomingCallHandler.java
│ │ │ ├── LocaleChangedReceiver.java
│ │ │ └── PackageAddedRemovedHandler.java
│ │ ├── calculator/
│ │ │ ├── Calculator.java
│ │ │ ├── Result.java
│ │ │ ├── ShuntingYard.java
│ │ │ └── Tokenizer.java
│ │ ├── customicon/
│ │ │ ├── ButtonHelper.java
│ │ │ ├── CustomShapePage.java
│ │ │ ├── DefaultButtonPage.java
│ │ │ ├── IconAdapter.java
│ │ │ ├── IconData.java
│ │ │ ├── IconPackPage.java
│ │ │ ├── IconSelectDialog.java
│ │ │ ├── IconViewHolder.java
│ │ │ ├── PageAdapter.java
│ │ │ ├── ShortcutPage.java
│ │ │ ├── StaticEntryPage.java
│ │ │ └── SystemPage.java
│ │ ├── dataprovider/
│ │ │ ├── ActionProvider.java
│ │ │ ├── AppCacheProvider.java
│ │ │ ├── AppProvider.java
│ │ │ ├── CalculatorProvider.java
│ │ │ ├── ContactsProvider.java
│ │ │ ├── DBProvider.java
│ │ │ ├── DialProvider.java
│ │ │ ├── EntryToResultUtils.java
│ │ │ ├── FilterProvider.java
│ │ │ ├── IProvider.java
│ │ │ ├── ModProvider.java
│ │ │ ├── Provider.java
│ │ │ ├── QuickListProvider.java
│ │ │ ├── SearchProvider.java
│ │ │ ├── ShortcutsProvider.java
│ │ │ ├── SimpleProvider.java
│ │ │ ├── TagsProvider.java
│ │ │ └── UpdateFromModsLoader.java
│ │ ├── db/
│ │ │ ├── AppRecord.java
│ │ │ ├── DB.java
│ │ │ ├── DBHelper.java
│ │ │ ├── ExportedData.java
│ │ │ ├── FlagsRecord.java
│ │ │ ├── ModRecord.java
│ │ │ ├── PlaceholderWidgetRecord.java
│ │ │ ├── ShortcutRecord.java
│ │ │ ├── ValuedHistoryRecord.java
│ │ │ ├── WidgetRecord.java
│ │ │ ├── XmlExport.java
│ │ │ └── XmlImport.java
│ │ ├── drawable/
│ │ │ ├── CodePointDrawable.java
│ │ │ ├── DrawableUtils.java
│ │ │ ├── FourCodePointDrawable.java
│ │ │ ├── LoadingDrawable.java
│ │ │ ├── SizeWrappedDrawable.java
│ │ │ ├── SquareDrawable.java
│ │ │ ├── TextDrawable.java
│ │ │ └── TwoCodePointDrawable.java
│ │ ├── entry/
│ │ │ ├── ActionEntry.java
│ │ │ ├── AppEntry.java
│ │ │ ├── CalculatorEntry.java
│ │ │ ├── ContactEntry.java
│ │ │ ├── DialContactEntry.java
│ │ │ ├── EntryItem.java
│ │ │ ├── EntryWithTags.java
│ │ │ ├── FilterEntry.java
│ │ │ ├── ICustomIconEntry.java
│ │ │ ├── OpenUrlEntry.java
│ │ │ ├── PlaceholderEntry.java
│ │ │ ├── ResultRelevance.java
│ │ │ ├── SearchEngineEntry.java
│ │ │ ├── SearchEntry.java
│ │ │ ├── ShortcutEntry.java
│ │ │ ├── StaticEntry.java
│ │ │ ├── TagEntry.java
│ │ │ └── UrlEntry.java
│ │ ├── handler/
│ │ │ ├── AppsHandler.java
│ │ │ ├── DataHandler.java
│ │ │ ├── IconsHandler.java
│ │ │ └── TagsHandler.java
│ │ ├── icons/
│ │ │ ├── CalendarDrawable.java
│ │ │ ├── DrawableInfo.java
│ │ │ ├── IconPack.java
│ │ │ ├── IconPackCache.java
│ │ │ ├── IconPackXML.java
│ │ │ ├── LazyLoadDrawable.java
│ │ │ ├── SimpleDrawable.java
│ │ │ └── SystemIconPack.java
│ │ ├── loader/
│ │ │ ├── LoadAppEntry.java
│ │ │ ├── LoadCacheApps.java
│ │ │ ├── LoadContactsEntry.java
│ │ │ ├── LoadEntryItem.java
│ │ │ └── LoadShortcutsEntryItem.java
│ │ ├── normalizer/
│ │ │ ├── IntSequenceBuilder.java
│ │ │ ├── PhoneNormalizer.java
│ │ │ └── StringNormalizer.java
│ │ ├── preference/
│ │ │ ├── BaseListPreferenceDialog.java
│ │ │ ├── BaseMultiSelectListPreferenceDialog.java
│ │ │ ├── BasePreferenceDialog.java
│ │ │ ├── ConfirmDialog.java
│ │ │ ├── ContentLoadHelper.java
│ │ │ ├── CustomDialogPreference.java
│ │ │ ├── EditAddResetEditor.java
│ │ │ ├── EditAddResetPreferenceDialog.java
│ │ │ ├── EditSearchEnginesPreferenceDialog.java
│ │ │ ├── EditSearchHintPreferenceDialog.java
│ │ │ ├── IconListPreferenceDialog.java
│ │ │ ├── MarginDialog.java
│ │ │ ├── MultiDependencies.java
│ │ │ ├── MultiDependenciesSwitchPreference.java
│ │ │ ├── OrderListPreferenceDialog.java
│ │ │ ├── PreferenceColorDialog.java
│ │ │ ├── PreviewImagePreference.java
│ │ │ ├── QuickListPreferenceDialog.java
│ │ │ ├── SeekBarChangeListener.java
│ │ │ ├── ShadowDialog.java
│ │ │ ├── SliderDialog.java
│ │ │ └── TagOrderListPreferenceDialog.java
│ │ ├── quicklist/
│ │ │ ├── DockRecycleLayoutManager.java
│ │ │ ├── DragAndDropInfo.java
│ │ │ ├── EditQuickList.java
│ │ │ ├── EditQuickListDialog.java
│ │ │ ├── PagedScrollListener.java
│ │ │ ├── QuickList.java
│ │ │ ├── RecycleAdapter.java
│ │ │ └── ViewPagerAdapter.java
│ │ ├── result/
│ │ │ ├── AsyncSetEntryDrawable.java
│ │ │ ├── CustomRecycleLayoutManager.java
│ │ │ ├── EntryAdapter.java
│ │ │ ├── LoadDataForAdapter.java
│ │ │ ├── RecycleAdapter.java
│ │ │ ├── RecycleAdapterBase.java
│ │ │ ├── RecycleScrollListener.java
│ │ │ ├── ResultHelper.java
│ │ │ ├── ResultItemDecoration.java
│ │ │ ├── ResultViewHelper.java
│ │ │ └── ReversibleAdapterRecyclerLayoutManager.java
│ │ ├── searcher/
│ │ │ ├── HistorySearcher.java
│ │ │ ├── ISearchActivity.java
│ │ │ ├── ISearcher.java
│ │ │ ├── QuerySearcher.java
│ │ │ ├── ResultBuffer.java
│ │ │ ├── Searcher.java
│ │ │ ├── TagList.java
│ │ │ └── TagSearcher.java
│ │ ├── shortcut/
│ │ │ ├── SaveSingleOreoShortcutAsync.java
│ │ │ └── ShortcutUtil.java
│ │ ├── ui/
│ │ │ ├── BlockableListView.java
│ │ │ ├── BottomPullEffectView.java
│ │ │ ├── CenteredImageSpan.java
│ │ │ ├── CustomizeMarginView.java
│ │ │ ├── CustomizeShadowView.java
│ │ │ ├── CutoutFactory.java
│ │ │ ├── DialogFragment.java
│ │ │ ├── DialogWrapper.java
│ │ │ ├── ICutout.java
│ │ │ ├── KeyboardHandler.java
│ │ │ ├── LinearAdapter.java
│ │ │ ├── LinearAdapterPlus.java
│ │ │ ├── ListPopup.java
│ │ │ ├── RecyclerList.java
│ │ │ ├── SearchEditText.java
│ │ │ ├── SquareImageView.java
│ │ │ ├── TagsMenuUtils.java
│ │ │ ├── ViewStubPreview.java
│ │ │ ├── WindowInsetsHelper.java
│ │ │ └── dialog/
│ │ │ ├── ConfirmDialog.java
│ │ │ ├── EditTextDialog.java
│ │ │ ├── PleaseWaitDialog.java
│ │ │ └── TagsManagerDialog.java
│ │ ├── utils/
│ │ │ ├── ArrayHelper.java
│ │ │ ├── ClipboardUtils.java
│ │ │ ├── ColorFilterHelper.java
│ │ │ ├── DebugInfo.java
│ │ │ ├── DebugString.java
│ │ │ ├── DeviceUtils.java
│ │ │ ├── DialogHelper.java
│ │ │ ├── EdgeGlowHelper.java
│ │ │ ├── FileUtils.java
│ │ │ ├── FuzzyScore.java
│ │ │ ├── GestureDetectorHelper.java
│ │ │ ├── GoogleCalendarIcon.java
│ │ │ ├── ISparseArray.java
│ │ │ ├── KeyboardToggleHelper.java
│ │ │ ├── KeyboardTriggerBehaviour.java
│ │ │ ├── MapCompat.java
│ │ │ ├── MimeTypeUtils.java
│ │ │ ├── PackageManagerUtils.java
│ │ │ ├── PrefCache.java
│ │ │ ├── PrefOrderedListHelper.java
│ │ │ ├── RootHandler.java
│ │ │ ├── SimpleTextWatcher.java
│ │ │ ├── SimpleXmlWriter.java
│ │ │ ├── SparseArrayWrapper.java
│ │ │ ├── SystemUiVisibility.java
│ │ │ ├── Timer.java
│ │ │ ├── UIColors.java
│ │ │ ├── UISizes.java
│ │ │ ├── UITheme.java
│ │ │ ├── UserHandleCompat.java
│ │ │ ├── Utilities.java
│ │ │ ├── ViewHolderAdapter.java
│ │ │ └── ViewHolderListAdapter.java
│ │ └── widgets/
│ │ ├── ItemTitle.java
│ │ ├── ItemWidget.java
│ │ ├── LoadWidgetsAsync.java
│ │ ├── MenuItem.java
│ │ ├── PickAppWidgetActivity.java
│ │ ├── WidgetInfo.java
│ │ ├── WidgetLayout.java
│ │ ├── WidgetListAdapter.java
│ │ ├── WidgetManager.java
│ │ └── WidgetView.java
│ └── res/
│ ├── anim/
│ │ ├── popup_in_bottom.xml
│ │ ├── popup_in_top.xml
│ │ └── popup_out.xml
│ ├── color/
│ │ ├── accent_text_selector.xml
│ │ ├── accent_text_selector_black.xml
│ │ ├── accent_text_selector_deep_blues.xml
│ │ ├── accent_text_selector_white.xml
│ │ ├── primary_text_selector_darkbg.xml
│ │ ├── primary_text_selector_lightbg.xml
│ │ ├── secondary_text_selector_darkbg.xml
│ │ ├── settings_primary_selector_black.xml
│ │ ├── settings_primary_selector_darkbg.xml
│ │ ├── settings_primary_selector_deep_blues.xml
│ │ ├── settings_primary_selector_default.xml
│ │ ├── settings_primary_selector_lightbg.xml
│ │ ├── settings_secondary_selector_black.xml
│ │ ├── settings_secondary_selector_deep_blues.xml
│ │ ├── settings_secondary_selector_default.xml
│ │ └── settings_secondary_selector_lightbg.xml
│ ├── drawable/
│ │ ├── button_bar_background.xml
│ │ ├── button_bar_background_deep_blues.xml
│ │ ├── button_bar_background_default.xml
│ │ ├── button_bar_background_light.xml
│ │ ├── dialog_background.xml
│ │ ├── dialog_background_black.xml
│ │ ├── dialog_background_dark.xml
│ │ ├── dialog_background_deep_blues.xml
│ │ ├── dialog_background_default.xml
│ │ ├── dialog_background_light.xml
│ │ ├── handle_background.xml
│ │ ├── ic_add_tag.xml
│ │ ├── ic_android.xml
│ │ ├── ic_apps.xml
│ │ ├── ic_apps_grid_az.xml
│ │ ├── ic_apps_grid_za.xml
│ │ ├── ic_apps_list_az.xml
│ │ ├── ic_apps_list_za.xml
│ │ ├── ic_arrow_back.xml
│ │ ├── ic_backup.xml
│ │ ├── ic_behaviour.xml
│ │ ├── ic_browse_add_icon.xml
│ │ ├── ic_bug.xml
│ │ ├── ic_clear.xml
│ │ ├── ic_contact_placeholder.xml
│ │ ├── ic_contacts.xml
│ │ ├── ic_contacts_az.xml
│ │ ├── ic_contacts_za.xml
│ │ ├── ic_dots.xml
│ │ ├── ic_edit.xml
│ │ ├── ic_eye_crossed.xml
│ │ ├── ic_favorites.xml
│ │ ├── ic_features.xml
│ │ ├── ic_functions.xml
│ │ ├── ic_gesture.xml
│ │ ├── ic_grid.xml
│ │ ├── ic_handle_move.xml
│ │ ├── ic_handle_resize_bl.xml
│ │ ├── ic_handle_resize_l.xml
│ │ ├── ic_history.xml
│ │ ├── ic_icon.xml
│ │ ├── ic_keyboard.xml
│ │ ├── ic_list.xml
│ │ ├── ic_loading_arrows.xml
│ │ ├── ic_loading_pulse.xml
│ │ ├── ic_memory.xml
│ │ ├── ic_message.xml
│ │ ├── ic_phone.xml
│ │ ├── ic_phone_ui.xml
│ │ ├── ic_popup.xml
│ │ ├── ic_quick.xml
│ │ ├── ic_refresh.xml
│ │ ├── ic_remove_tag.xml
│ │ ├── ic_search.xml
│ │ ├── ic_search_bar.xml
│ │ ├── ic_send.xml
│ │ ├── ic_settings.xml
│ │ ├── ic_shortcuts.xml
│ │ ├── ic_shortcuts_az.xml
│ │ ├── ic_shortcuts_za.xml
│ │ ├── ic_tags.xml
│ │ ├── ic_undo.xml
│ │ ├── ic_untagged.xml
│ │ ├── ic_wallpaper.xml
│ │ ├── launcher_pill.xml
│ │ ├── launcher_pill_background.xml
│ │ ├── launcher_white.xml
│ │ ├── list_separator_dark.xml
│ │ ├── list_separator_deep_blues.xml
│ │ ├── list_separator_default.xml
│ │ ├── list_separator_light.xml
│ │ ├── mm2d_cc_ic_check.xml
│ │ ├── notification_bar_background.xml
│ │ ├── notification_dot.xml
│ │ ├── popup_background.xml
│ │ ├── tab_background_black.xml
│ │ ├── tab_background_deep_blues.xml
│ │ ├── tab_background_default.xml
│ │ ├── tab_background_light.xml
│ │ ├── window_title_background.xml
│ │ ├── window_title_background_deep_blues.xml
│ │ ├── window_title_background_default.xml
│ │ └── window_title_background_light.xml
│ ├── drawable-v23/
│ │ ├── button_bar_background.xml
│ │ └── window_title_background.xml
│ ├── layout/
│ │ ├── activity_fullscreen.xml
│ │ ├── activity_settings.xml
│ │ ├── add_search_engine.xml
│ │ ├── add_search_hint.xml
│ │ ├── custom_icon_item.xml
│ │ ├── dialog_custom_shape_icon_select_page.xml
│ │ ├── dialog_edit_tags.xml
│ │ ├── dialog_icon_select.xml
│ │ ├── dialog_icon_select_page.xml
│ │ ├── dialog_preference_color_chooser.xml
│ │ ├── dialog_rename.xml
│ │ ├── dialog_title.xml
│ │ ├── edit_search_engines.xml
│ │ ├── edit_tag_item.xml
│ │ ├── item_app.xml
│ │ ├── item_builtin.xml
│ │ ├── item_contact.xml
│ │ ├── item_dock.xml
│ │ ├── item_dock_shortcut.xml
│ │ ├── item_grid.xml
│ │ ├── item_grid_shortcut.xml
│ │ ├── item_shortcut.xml
│ │ ├── mm2d_cc_color_chooser.xml
│ │ ├── mm2d_cc_item_palette.xml
│ │ ├── mm2d_cc_view_control.xml
│ │ ├── mm2d_cc_view_dialog.xml
│ │ ├── mm2d_cc_view_hsv.xml
│ │ ├── mm2d_cc_view_slider.xml
│ │ ├── ok_cancel_button_bar.xml
│ │ ├── order_list_item.xml
│ │ ├── pin_shortcut_confirm.xml
│ │ ├── popup_divider.xml
│ │ ├── popup_list_item.xml
│ │ ├── popup_list_item_icon.xml
│ │ ├── popup_list_text.xml
│ │ ├── popup_title.xml
│ │ ├── pref_alpha_preview.xml
│ │ ├── pref_amount_preview.xml
│ │ ├── pref_color_preview.xml
│ │ ├── pref_confirm.xml
│ │ ├── pref_margin_offset.xml
│ │ ├── pref_matrix_preview.xml
│ │ ├── pref_offset_preview.xml
│ │ ├── pref_shadow.xml
│ │ ├── pref_shadow_preview.xml
│ │ ├── pref_size_preview.xml
│ │ ├── pref_slider.xml
│ │ ├── preference_switch.xml
│ │ ├── quick_list.xml
│ │ ├── quick_list_editor.xml
│ │ ├── quick_list_editor_page.xml
│ │ ├── result_list.xml
│ │ ├── search_bar.xml
│ │ ├── search_pill.xml
│ │ ├── tags_manager.xml
│ │ ├── tags_manager_item.xml
│ │ ├── tags_manager_item_deleted.xml
│ │ ├── widget_handle.xml
│ │ ├── widget_picker.xml
│ │ └── widget_placeholder.xml
│ ├── mipmap-anydpi-v26/
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ ├── values/
│ │ ├── arrays.xml
│ │ ├── attrs.xml
│ │ ├── colors.xml
│ │ ├── default_tags.xml
│ │ ├── dimens.xml
│ │ ├── ids.xml
│ │ ├── pref_default.xml
│ │ ├── strings.xml
│ │ ├── styles.xml
│ │ └── themes.xml
│ ├── values-de/
│ │ └── strings.xml
│ ├── values-de-v26/
│ │ └── strings.xml
│ ├── values-fr/
│ │ └── strings.xml
│ ├── values-fr-v26/
│ │ └── strings.xml
│ ├── values-h400dp/
│ │ └── dimens.xml
│ ├── values-in/
│ │ └── strings.xml
│ ├── values-it/
│ │ └── strings.xml
│ ├── values-it-v26/
│ │ └── strings.xml
│ ├── values-ja/
│ │ └── strings.xml
│ ├── values-nb-rNO/
│ │ └── strings.xml
│ ├── values-nb-rNO-v26/
│ │ └── strings.xml
│ ├── values-pl/
│ │ └── strings.xml
│ ├── values-pl-v26/
│ │ └── strings.xml
│ ├── values-pt/
│ │ └── strings.xml
│ ├── values-pt-rBR/
│ │ └── strings.xml
│ ├── values-pt-rBR-v26/
│ │ └── strings.xml
│ ├── values-pt-rPT/
│ │ └── strings.xml
│ ├── values-pt-rPT-v26/
│ │ └── strings.xml
│ ├── values-ro/
│ │ └── strings.xml
│ ├── values-ro-v26/
│ │ └── strings.xml
│ ├── values-ru/
│ │ └── strings.xml
│ ├── values-tr/
│ │ └── strings.xml
│ ├── values-tr-v26/
│ │ └── strings.xml
│ ├── values-v21/
│ │ └── pref_default.xml
│ ├── values-v26/
│ │ └── strings.xml
│ ├── values-zh-rCN/
│ │ └── strings.xml
│ └── xml/
│ ├── backup_descriptor.xml
│ ├── data_extraction_rules.xml
│ ├── file_paths.xml
│ ├── policies.xml
│ ├── preference_features.xml
│ ├── preferences.xml
│ └── search_pill_scene.xml
├── build.gradle
├── fastlane/
│ ├── Appfile
│ ├── Fastfile
│ ├── README.md
│ └── metadata/
│ └── android/
│ ├── de-DE/
│ │ ├── changelogs/
│ │ │ └── 40.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── en-US/
│ │ ├── changelogs/
│ │ │ ├── 31.txt
│ │ │ ├── 32.txt
│ │ │ ├── 33.txt
│ │ │ ├── 34.txt
│ │ │ ├── 35.txt
│ │ │ ├── 36.txt
│ │ │ ├── 37.txt
│ │ │ ├── 38.txt
│ │ │ ├── 39.txt
│ │ │ ├── 40.txt
│ │ │ ├── 41.txt
│ │ │ ├── 42.txt
│ │ │ └── 43.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ ├── title.txt
│ │ └── video.txt
│ ├── fr/
│ │ ├── changelogs/
│ │ │ ├── 31.txt
│ │ │ ├── 32.txt
│ │ │ ├── 33.txt
│ │ │ ├── 34.txt
│ │ │ ├── 35.txt
│ │ │ └── 36.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── nb-NO/
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── nb_NO-V26/
│ │ └── title.txt
│ ├── pt-BR/
│ │ ├── changelogs/
│ │ │ └── 31.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── pt-PT/
│ │ ├── changelogs/
│ │ │ ├── 31.txt
│ │ │ ├── 36.txt
│ │ │ └── 40.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── ro/
│ │ └── title.txt
│ └── tr/
│ ├── changelogs/
│ │ ├── 36.txt
│ │ ├── 39.txt
│ │ └── 40.txt
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: "Short descriptive title"
labels: bug
assignees: ''
---
# Description #
<!-- Describe the bug. A clear and concise description of what the bug is. -->
## Context ##
<!-- Add any context about the problem here. -->
## Steps to Reproduce ##
<!-- It is important to let developer know how to replicate the problem without re-reading the description -->
To reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
## Expected behavior ##
<!-- A clear and concise description of what you expected to happen. If you think it would help, provide a modified screenshot. -->
### Screenshots ###
<!-- If applicable, add screenshots to help explain your problem.
It would be best if you could show what was expected or highlight the problem. -->
## Device info ##
<!-- please complete the following information -->
* Device: <!-- e.g. Samsung S10+ -->
* OS: <!-- e.g. Android 10 -->
* TinyBit Launcher version: <!-- e.g. v4.5 -->
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: "Great idea title"
labels: enhancement
assignees: ''
---
**Description**
<!--
Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is.
Ex. I'm always frustrated when [...]
-->
**Solution**
<!--
Describe the solution you'd like
A clear and concise description of what you want to happen.
-->
**Alternative solutions**
<!--
Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.
-->
**Additional context**
<!--
Add any other *context* or *screenshots* about the feature request here.
-->
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: gradle
directory: "/"
schedule:
interval: daily
time: "03:00"
open-pull-requests-limit: 10
================================================
FILE: .github/workflows/android.yml
================================================
name: Android CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v4
- name: set up JDK 17
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
- name: Build with Gradle
run: bash ./gradlew build --stacktrace
================================================
FILE: .github/workflows/deploy.yml
================================================
name: Deploy to Playstore beta
on:
workflow_dispatch:
jobs:
distribute:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-ruby@v1
with:
ruby-version: '2.6'
- name: Install bundle
run: |
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3
- name: Configure Keystore
run: |
echo "$ANDROID_KEYSTORE_FILE" > keystore.jks.b64
base64 -d -i keystore.jks.b64 > app/keystore.jks
echo "storeFile=keystore.jks" >> keystore.properties
echo "keyAlias=$KEYSTORE_KEY_ALIAS" >> keystore.properties
echo "storePassword=$KEYSTORE_STORE_PASSWORD" >> keystore.properties
echo "keyPassword=$KEYSTORE_KEY_PASSWORD" >> keystore.properties
env:
ANDROID_KEYSTORE_FILE: ${{ secrets.PLAYSTORE_KEYSTORE }}
KEYSTORE_KEY_ALIAS: ${{ secrets.PLAYSTORE_KEY_ALIAS }}
KEYSTORE_KEY_PASSWORD: ${{ secrets.PLAYSTORE_KEY_PASSWORD }}
KEYSTORE_STORE_PASSWORD: ${{ secrets.PLAYSTORE_STORE_PASSWORD }}
- name: Create Google Play Config file
run : |
echo "$PLAY_CONFIG_JSON" > play_config.json.b64
base64 -d -i play_config.json.b64 > play_config.json
env:
PLAY_CONFIG_JSON: ${{ secrets.PLAYSTORE_API_JSON }}
- name: Distribute app to Beta track 🚀
run: bundle exec fastlane beta
================================================
FILE: .github/workflows/release.yml
================================================
# This is a basic workflow to help you get started with Actions
name: Android Release
on:
push:
branches:
- 'release*'
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job
apk:
name: Generate APK
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v4
# Runs a single command using the runners shell
- name: set up JDK 17
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
- name: Build debug APK
run: bash ./gradlew assembleGithubDebug --stacktrace
- name: Upload APK
uses: actions/upload-artifact@v4
with:
name: app
path: app/build/outputs/apk/github/debug/app-github-debug.apk
================================================
FILE: .gitignore
================================================
# Built application files
*.apk
*.ap_
*.aab
# Files for the ART/Dalvik VM
*.dex
# Java class files
*.class
# Generated files
bin/
gen/
out/
release/
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/
# IntelliJ
*.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
# Android Studio 3 in .gitignore file.
.idea/caches
.idea/modules.xml
# Comment next line if keeping position of elements in Navigation Editor is relevant for you
.idea/navEditor.xml
# TBog: Keeps changing when I use the IDE
.idea/misc.xml
.idea/deploymentTargetDropDown.xml
.idea/kotlinc.xml
# Keystore files
# Uncomment the following lines if you do not want to check your keystore files in.
#*.jks
#*.keystore
# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
# Google Services (e.g. APIs or Firebase)
# google-services.json
# Freeline
freeline.py
freeline/
freeline_project_description.json
# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md
# Version control
vcs.xml
# lint
lint/intermediates/
lint/generated/
lint/outputs/
lint/tmp/
# lint/reports/
Gemfile.lock
.idea/deploymentTargetSelector.xml
================================================
FILE: .idea/codeStyles/Project.xml
================================================
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<codeStyleSettings language="JAVA">
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="XML">
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>ANDROID_ATTRIBUTE_ORDER</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
</codeStyleSettings>
</code_scheme>
</component>
================================================
FILE: .idea/codeStyles/codeStyleConfig.xml
================================================
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>
================================================
FILE: .idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>
================================================
FILE: .idea/google-java-format.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GoogleJavaFormatSettings">
<option name="enabled" value="false" />
</component>
</project>
================================================
FILE: .idea/inspectionProfiles/Project_Default.xml
================================================
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="CastConflictsWithInstanceof" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="CastToIncompatibleInterface" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="ComparableImplementedButEqualsNotOverridden" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="ConstantConditions" enabled="true" level="WARNING" enabled_by_default="true">
<option name="SUGGEST_NULLABLE_ANNOTATIONS" value="false" />
<option name="DONT_REPORT_TRUE_ASSERT_STATEMENTS" value="false" />
</inspection_tool>
<inspection_tool class="NullableProblems" enabled="true" level="WARNING" enabled_by_default="true">
<option name="REPORT_NULLABLE_METHOD_OVERRIDES_NOTNULL" value="true" />
<option name="REPORT_NOT_ANNOTATED_METHOD_OVERRIDES_NOTNULL" value="true" />
<option name="REPORT_NOTNULL_PARAMETER_OVERRIDES_NULLABLE" value="true" />
<option name="REPORT_NOT_ANNOTATED_PARAMETER_OVERRIDES_NOTNULL" value="true" />
<option name="REPORT_NOT_ANNOTATED_GETTER" value="true" />
<option name="REPORT_NOTNULL_PARAMETERS_OVERRIDES_NOT_ANNOTATED" value="true" />
<option name="REPORT_NOT_ANNOTATED_SETTER_PARAMETER" value="true" />
<option name="REPORT_ANNOTATION_NOT_PROPAGATED_TO_OVERRIDERS" value="true" />
<option name="REPORT_NULLS_PASSED_TO_NON_ANNOTATED_METHOD" value="true" />
</inspection_tool>
</profile>
</component>
================================================
FILE: .idea/jarRepositories.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="BintrayJCenter" />
<option name="name" value="BintrayJCenter" />
<option name="url" value="https://jcenter.bintray.com/" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="MavenRepo" />
<option name="name" value="MavenRepo" />
<option name="url" value="https://repo.maven.apache.org/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://jitpack.io" />
</remote-repository>
</component>
</project>
================================================
FILE: .idea/migrations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>
================================================
FILE: .idea/palantir-java-format.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PalantirJavaFormatSettings">
<option name="enabled" value="false" />
</component>
</project>
================================================
FILE: .idea/render.experimental.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RenderSettings">
<option name="quality" value="1.0" />
</component>
</project>
================================================
FILE: Gemfile
================================================
source "https://rubygems.org"
gem "fastlane"
gem "rake"
================================================
FILE: LICENSE.md
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
{project} Copyright (C) {year} {fullname}
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
================================================
FILE: Privacy-Policy.md
================================================
---
title: TinyBit launcher
layout: simple
---
# Privacy policy
This privacy policy ("Policy") describes how the personally identifiable information ("Personal Information") you may provide in the "TBLauncher" mobile application ("Mobile Application" or "Service") and any of its related products and services (collectively, "Services") is collected, protected and used. It also describes the choices available to you regarding our use of your Personal Information and how you can access and update this information. This Policy is a legally binding agreement between you ("User", "you" or "your") and this Mobile Application developer ("Operator", "we", "us" or "our"). By accessing and using the Mobile Application and Services, you acknowledge that you have read, understood, and agree to be bound by the terms of this Policy. This Policy does not apply to the practices of companies that we do not own or control, or to individuals that we do not employ or manage.
## Collection of information
Our top priority is customer data security and, as such, we exercise the no logs policy. We may process only minimal user data, only as much as it is absolutely necessary to maintain the Mobile Application and Services. Information collected automatically is used only to identify potential cases of abuse and establish statistical information regarding the usage of the Mobile Application and Services. This statistical information is not otherwise aggregated in such a way that would identify any particular user of the system.
## Use and processing of collected information
In order to make the Mobile Application and Services available to you, or to meet a legal obligation, we may need to collect and use certain Personal Information. If you do not provide the information that we request, we may not be able to provide you with the requested products or services. Any of the information we collect from you may be used for the following purposes:
* Respond to inquiries and offer support
* Improve user experience
* Run and operate the Mobile Application and Services
Processing your Personal Information depends on how you interact with the Mobile Application and Services, where you are located in the world and if one of the following applies: (i) you have given your consent for one or more specific purposes; this, however, does not apply, whenever the processing of Personal Information is subject to California Consumer Privacy Act or European data protection law; (ii) provision of information is necessary for the performance of an agreement with you and/or for any pre-contractual obligations thereof; (iii) processing is necessary for compliance with a legal obligation to which you are subject; (iv) processing is related to a task that is carried out in the public interest or in the exercise of official authority vested in us; (v) processing is necessary for the purposes of the legitimate interests pursued by us or by a third party.
Note that under some legislations we may be allowed to process information until you object to such processing (by opting out), without having to rely on consent or any other of the following legal bases below. In any case, we will be happy to clarify the specific legal basis that applies to the processing, and in particular whether the provision of Personal Information is a statutory or contractual requirement, or a requirement necessary to enter into a contract.
## Disclosure of information
Depending on the requested Services or as necessary to complete any transaction or provide any service you have requested, we may share your information with your consent with our trusted third parties that work with us, any other affiliates and subsidiaries we rely upon to assist in the operation of the Mobile Application and Services available to you. We do not share Personal Information with unaffiliated third parties. These service providers are not authorized to use or disclose your information except as necessary to perform services on our behalf or comply with legal requirements. We may share your Personal Information for these purposes only with third parties whose privacy policies are consistent with ours or who agree to abide by our policies with respect to Personal Information. These third parties are given Personal Information they need only in order to perform their designated functions, and we do not authorize them to use or disclose Personal Information for their own marketing or other purposes.
## Retention of information
We will retain and use your Personal Information for the period necessary to comply with our legal obligations, resolve disputes, and enforce our agreements unless a longer retention period is required or permitted by law. We may use any aggregated data derived from or incorporating your Personal Information after you update or delete it, but not in a manner that would identify you personally. Once the retention period expires, Personal Information shall be deleted. Therefore, the right to access, the right to erasure, the right to rectification and the right to data portability cannot be enforced after the expiration of the retention period.
## Transfer of information
Depending on your location, data transfers may involve transferring and storing your information in a country other than your own. You are entitled to learn about the legal basis of information transfers to a country outside the European Union or to any international organization governed by public international law or set up by two or more countries, such as the UN, and about the security measures taken by us to safeguard your information. If any such transfer takes place, you can find out more by checking the relevant sections of this Policy or inquire with us using the information provided in the contact section.
## The rights of users
You may exercise certain rights regarding your information processed by us. In particular, you have the right to do the following: (i) you have the right to withdraw consent where you have previously given your consent to the processing of your information; (ii) you have the right to object to the processing of your information if the processing is carried out on a legal basis other than consent; (iii) you have the right to learn if information is being processed by us, obtain disclosure regarding certain aspects of the processing and obtain a copy of the information undergoing processing; (iv) you have the right to verify the accuracy of your information and ask for it to be updated or corrected; (v) you have the right, under certain circumstances, to restrict the processing of your information, in which case, we will not process your information for any purpose other than storing it; (vi) you have the right, under certain circumstances, to obtain the erasure of your Personal Information from us; (vii) you have the right to receive your information in a structured, commonly used and machine readable format and, if technically feasible, to have it transmitted to another controller without any hindrance. This provision is applicable provided that your information is processed by automated means and that the processing is based on your consent, on a contract which you are part of or on pre-contractual obligations thereof.
## The right to object to processing
Where Personal Information is processed for the public interest, in the exercise of an official authority vested in us or for the purposes of the legitimate interests pursued by us, you may object to such processing by providing a ground related to your particular situation to justify the objection.
## Data protection rights under GDPR
If you are a resident of the European Economic Area (EEA), you have certain data protection rights and the Operator aims to take reasonable steps to allow you to correct, amend, delete, or limit the use of your Personal Information. If you wish to be informed what Personal Information we hold about you and if you want it to be removed from our systems, please contact us. In certain circumstances, you have the following data protection rights:
* You have the right to request access to your Personal Information that we store and have the ability to access your Personal Information.
* You have the right to request that we correct any Personal Information you believe is inaccurate. You also have the right to request us to complete the Personal Information you believe is incomplete.
* You have the right to request the erase your Personal Information under certain conditions of this Policy.
* You have the right to object to our processing of your Personal Information.
* You have the right to seek restrictions on the processing of your Personal Information. When you restrict the processing of your Personal Information, we may store it but will not process it further.
* You have the right to be provided with a copy of the information we have on you in a structured, machine-readable and commonly used format.
* You also have the right to withdraw your consent at any time where the Operator relied on your consent to process your Personal Information.
You have the right to complain to a Data Protection Authority about our collection and use of your Personal Information. For more information, please contact your local data protection authority in the European Economic Area (EEA).
## California privacy rights
In addition to the rights as explained in this Policy, California residents who provide Personal Information (as defined in the statute) to obtain products or services for personal, family, or household use are entitled to request and obtain from us, once a calendar year, information about the Personal Information we shared, if any, with other businesses for marketing uses. If applicable, this information would include the categories of Personal Information and the names and addresses of those businesses with which we shared such personal information for the immediately prior calendar year (e.g., requests made in the current year will receive information about the prior year). To obtain this information please contact us.
## How to exercise these rights
Any requests to exercise your rights can be directed to the Operator through the contact details provided in this document. Please note that we may ask you to verify your identity before responding to such requests. Your request must provide sufficient information that allows us to verify that you are the person you are claiming to be or that you are the authorized representative of such person. You must include sufficient details to allow us to properly understand the request and respond to it. We cannot respond to your request or provide you with Personal Information unless we first verify your identity or authority to make such a request and confirm that the Personal Information relates to you.
## Privacy of children
We do not knowingly collect any Personal Information from children. We encourage all children to never submit any Personal Information through the Mobile Application and Services. We encourage parents and legal guardians to monitor their children's Internet usage and to help enforce this Policy by instructing their children never to provide Personal Information through the Mobile Application and Services without their permission. If you have reason to believe that a child has provided Personal Information to us through the Mobile Application and Services, please contact us. You must also be at least 16 years of age to consent to the processing of your Personal Information in your country (in some countries we may allow your parent or guardian to do so on your behalf).
## Links to other resources
The Mobile Application and Services contain links to other resources that are not owned or controlled by us. Please be aware that we are not responsible for the privacy practices of such other resources or third parties. We encourage you to be aware when you leave the Mobile Application and Services and to read the privacy statements of each and every resource that may collect Personal Information.
## Information security
We secure information you provide on computer servers in a controlled, secure environment, protected from unauthorized access, use, or disclosure. We maintain reasonable administrative, technical, and physical safeguards in an effort to protect against unauthorized access, use, modification, and disclosure of Personal Information in its control and custody. However, no data transmission over the Internet or wireless network can be guaranteed. Therefore, while we strive to protect your Personal Information, you acknowledge that (i) there are security and privacy limitations of the Internet which are beyond our control; (ii) the security, integrity, and privacy of any and all information and data exchanged between you and the Mobile Application and Services cannot be guaranteed; and (iii) any such information and data may be viewed or tampered with in transit by a third party, despite best efforts.
## Data breach
In the event we become aware that the security of the Mobile Application and Services has been compromised or users Personal Information has been disclosed to unrelated third parties as a result of external activity, including, but not limited to, security attacks or fraud, we reserve the right to take reasonably appropriate measures, including, but not limited to, investigation and reporting, as well as notification to and cooperation with law enforcement authorities. In the event of a data breach, we will make reasonable efforts to notify affected individuals if we believe that there is a reasonable risk of harm to the user as a result of the breach or if notice is otherwise required by law. When we do, we will post a notice in the Mobile Application.
## Changes and amendments
We reserve the right to modify this Policy or its terms relating to the Mobile Application and Services from time to time in our discretion and will notify you of any material changes to the way in which we treat Personal Information. When we do, we will revise the updated date at the bottom of this page. We may also provide notice to you in other ways in our discretion, such as through contact information you have provided. Any updated version of this Policy will be effective immediately upon the posting of the revised Policy unless otherwise specified. Your continued use of the Mobile Application and Services after the effective date of the revised Policy (or such other act specified at that time) will constitute your consent to those changes. However, we will not, without your consent, use your Personal Information in a manner materially different than what was stated at the time your Personal Information was collected.
## Acceptance of this policy
You acknowledge that you have read this Policy and agree to all its terms and conditions. By accessing and using the Mobile Application and Services you agree to be bound by this Policy. If you do not agree to abide by the terms of this Policy, you are not authorized to access or use the Mobile Application and Services. <!-- This privacy policy was created with the [privacy policy generator](https://www.websitepolicies.com/privacy-policy-generator). -->
## Contacting us
If you would like to contact us to understand more about this Policy or wish to contact us concerning any matter relating to individual rights and your Personal Information, you may send an email to privacy@tbog.rocks.
This document was last updated on April 8, 2021
================================================
FILE: README.md
================================================
# TinyBit Launcher
[<img src="https://github.com/TBog/TBLauncher/workflows/Android%20CI/badge.svg"
alt="Android CI"
height="22"/>](https://github.com/TBog/TBLauncher/actions/)
[<img src="https://app.codacy.com/project/badge/Grade/367f62e2ae68488fbee63cf2dfe267db"
alt="Codacy Badge"
height="22"/>](https://www.codacy.com/gh/TBog/TBLauncher/dashboard?utm_source=github.com&utm_medium=referral&utm_content=TBog/TBLauncher&utm_campaign=Badge_Grade)
[<img src="https://img.shields.io/github/v/release/TBog/TBLauncher.svg?logo=github&label=GitHub"
alt="GitHub Releases"
height="22"/>](https://github.com/TBog/TBLauncher/releases)
[<img src="https://img.shields.io/f-droid/v/rocks.tbog.tblauncher.svg?logo=f-droid&label=F-Droid"
alt="F-Droid Releases"
height="22"/>](https://f-droid.org/packages/rocks.tbog.tblauncher/)
[<img src="https://img.shields.io/endpoint?label=Play%20Store&style=flat&cacheSeconds=65536&url=https%3A%2F%2Fplay.cuzi.workers.dev%2Fplay%3Fi%3Drocks.tbog.tblauncher%26l%3DGoogle%2520Play%26m%3D%24version"
alt="Playstore"
height="22"/>](https://play.google.com/store/apps/details?id=rocks.tbog.tblauncher)
## This is _the_ launcher used and developed by TBog
Motives for developing ~~a new~~ my own launcher:
- Clean main screen to enjoy the wallpaper
- Fast access to apps by searching
- Icon Pack compatible
- Ability to customize colors and behaviors
### How it looks like
| Homescreen | Search `tbl` | Edit QuickList | Launcher settings | Customize any icon |
| :---: | :---: | :---: | :---: | :---: |
| [](https://imgur.com/Idkhx5v) |  |  | [](https://imgur.com/J8EslbJ) | [](https://imgur.com/jxvRmzV) |
### Where one can get it
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
alt="Get it on F-Droid"
height="80">](https://f-droid.org/packages/rocks.tbog.tblauncher/)
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png"
alt="Get it on Google Play"
height="80">](https://play.google.com/store/apps/details?id=rocks.tbog.tblauncher)
[<img src="https://i.ibb.co/q0mdc4Z/get-it-on-github.png"
alt="Get it on Github"
height="80">](https://github.com/TBog/TBLauncher/releases)
### Translation
[<img src="https://hosted.weblate.org/widgets/tblauncher/-/multi-auto.svg"
alt="Translation status" />](https://hosted.weblate.org/engage/tblauncher/)
<footer>
<hr>
<p>The initial idea and code came from <a href="https://github.com/Neamar/KISS" style="display: inline">KISS</a></p>
<p>TinyBit Launcher icon (2022)<br>Copyright 2022 <a href="https://www.onnno.nl/" style="display: inline">Onno van den Dungen</a><br><a href="https://creativecommons.org/licenses/by-sa/4.0/" style="display: inline">Licensed under CC BY-SA 4.0</a></p>
<p>Some SVG icons came from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> and were made by
<ul>
<li><a href="https://www.freepik.com" title="Freepik">Freepik</a></li>
<li><a href="https://www.flaticon.com/authors/swifticons" title="Swifticons">Swifticons</a></li>
<li><a href="https://www.flaticon.com/authors/eucalyp" title="Eucalyp">Eucalyp</a></li>
<li><a href="https://www.flaticon.com/authors/monkik" title="monkik">monkik</a></li>
<li><a href="https://www.flaticon.com/authors/prettycons" title="prettycons">prettycons</a></li>
</ul>
</p>
<p>The SVG files were first optimized with <a href="https://github.com/jakearchibald/svgomg/">SVGOMG!</a> then imported with Android Studio</p>
</footer>
================================================
FILE: _config.yml
================================================
description: Android launcher with icon pack support, search to launch apps and contacts, color and behaviour customizable
show_downloads: true
theme: jekyll-theme-hacker
github:
apk_url: https://github.com/TBog/TBLauncher/releases/latest/download/app-release.apk
================================================
FILE: _layouts/default.html
================================================
<!DOCTYPE html>
<html lang="{{ site.lang | default: "en-US" }}">
<head>
<meta charset='utf-8'>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}">
{% include head-custom.html %}
{% seo %}
</head>
<body>
<header>
<div class="container">
<a id="a-title" href="{{ '/' | relative_url }}">
<h1>{{ site.title | default: site.github.repository_name }}</h1>
</a>
<h2>{{ site.description | default: site.github.project_tagline }}</h2>
<section id="downloads">
{% if site.show_downloads %}
<a href="{{ site.github.zip_url }}" class="btn">Download sources as .zip</a>
<a href="{{ site.github.tar_url }}" class="btn">Download sources as .tar.gz</a>
<a href="{{ site.github.apk_url }}" class="btn">Download release apk</a>
{% endif %}
<a href="{{ site.github.repository_url }}" class="btn btn-github"><span class="icon"></span>View project on GitHub</a>
</section>
</div>
</header>
<div class="container">
<section id="main_content">
{{ content }}
</section>
</div>
</body>
</html>
================================================
FILE: _layouts/simple.html
================================================
<!DOCTYPE html>
<html lang="{{ site.lang | default: "en-US" }}">
<head>
<meta charset='utf-8'>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}">
{% include head-custom.html %}
{% seo %}
</head>
<body>
<header>
<div class="container">
<h1>{{ page.title | default: site.github.repository_name }}</h1>
</div>
</header>
<div class="container">
<section id="main_content">
{{ content }}
</section>
</div>
</body>
</html>
================================================
FILE: app/.gitignore
================================================
/build
================================================
FILE: app/build.gradle
================================================
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'com.getkeepsafe.dexcount'
apply plugin: 'com.dipien.byebyejetifier'
android {
namespace 'rocks.tbog.tblauncher'
compileSdk 34
defaultConfig {
applicationId "rocks.tbog.tblauncher"
minSdk 19
targetSdk 33
versionCode 43
versionName "7.5"
vectorDrawables.useSupportLibrary = true
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
resValue "string", "app_name_dynamic", "@string/app_name"
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
applicationIdSuffix '.debug'
versionNameSuffix '-dbg'
resValue "string", "app_name_dynamic", "@string/app_name_debug"
}
}
flavorDimensions = ["store"]
productFlavors {
playstore {
dimension "store"
buildConfigField 'boolean', 'SHOW_PRIVACY_POLICY', 'true'
buildConfigField 'boolean', 'SHOW_RATE_APP', 'true'
}
fdroid {
dimension "store"
buildConfigField 'boolean', 'SHOW_PRIVACY_POLICY', 'false'
buildConfigField 'boolean', 'SHOW_RATE_APP', 'true'
}
github {
dimension "store"
buildConfigField 'boolean', 'SHOW_PRIVACY_POLICY', 'false'
buildConfigField 'boolean', 'SHOW_RATE_APP', 'false'
}
}
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString()
}
buildFeatures {
viewBinding true
buildConfig = true
}
lint {
// disable quantity translation errors
disable 'ImpliedQuantity'
}
}
configurations {
compileClasspath {
resolutionStrategy.force 'com.github.yalantis:ucrop:2.2.8'
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//noinspection KtxExtensionAvailable
implementation("androidx.preference:preference:$preference_version") {
exclude group: 'androidx.lifecycle', module: 'lifecycle-viewmodel'
exclude group: 'androidx.lifecycle', module: 'lifecycle-viewmodel-ktx'
}
implementation "ch.acra:acra-mail:$acra_version"
implementation "ch.acra:acra-dialog:$acra_version"
implementation "ch.acra:acra-core:$acra_version"
implementation "androidx.asynclayoutinflater:asynclayoutinflater:1.0.0"
implementation 'androidx.annotation:annotation:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.core:core-ktx:1.13.1'
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation 'com.google.android.material:material:1.12.0'
implementation('com.github.dhaval2404:imagepicker:2.1', {
exclude group: 'com.squareup.okhttp3'
})
implementation "androidx.multidex:multidex:$multidex_version"
// 2.0.0 not supported, as "Unsupported desugared library configuration version, please upgrade the D8/R8 compiler." Android Gradle Plugin would need to be 7.4.0-alpha10
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
}
repositories {
mavenCentral()
}
//configurations.all {
// resolutionStrategy.eachDependency { DependencyResolveDetails details ->
// def requested = details.requested
// if (requested.group == 'org.jetbrains.kotlin'
// && (requested.name == 'kotlin-reflect'
// || requested.name.startsWith('kotlin-stdlib'))
// ) {
// details.useVersion kotlin_version
// }
// }
//}
//allprojects {
// tasks.withType(JavaCompile) {
// options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
// }
//}
//tasks.whenTaskAdded { task ->
// if (task.name == 'assembleDebug') {
// task.dependsOn lint
// task.mustRunAfter lint
// }
//}
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
# Allow the access modifiers of classes and class members to be modified, while optimizing.
-allowaccessmodification
-dontobfuscate
## If we are obfuscating we need to keep the dataprovider class names
#-keepnames class rocks.tbog.tblauncher.dataprovider.*
#
## If we are obfuscating check rocks/tbog/tblauncher/utils/EdgeGlowHelper.java
#-keepnames class android.**
#-keepclassmembernames class android.** {
# private <fields>;
#}
#-keepnames class androidx.**
#-keepclassmembernames class androidx.** {
# private <fields>;
#}
# Need to keep constructor of worker
-keepclassmembers class * extends rocks.tbog.tblauncher.WorkAsync.AsyncTask { <init>(...); }
# Keep constructor of ViewHolder
-keepclassmembers class * extends rocks.tbog.tblauncher.utils.ViewHolderAdapter$ViewHolder { <init>(...); }
# We don't use okhttp3 from com.github.dhaval2404:imagepicker so don't warn that it's missing
-dontwarn okhttp3.**
-dontwarn okio.BufferedSource
-dontwarn okio.Okio
-dontwarn okio.Sink
# From https://github.com/Yalantis/uCrop
-dontwarn com.yalantis.ucrop**
-keep class com.yalantis.ucrop** { *; }
-keep interface com.yalantis.ucrop** { *; }
# ACRA
-keepattributes *Annotation*
-dontwarn javax.annotation.processing.AbstractProcessor
-dontwarn javax.annotation.processing.SupportedOptions
-keep class javax.annotation.processing.** { *; }
-keep interface javax.annotation.processing.** { *; }
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- Self explanatory -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<!-- To call a phone number directly without displaying the dialer -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<!-- Ability to uninstall an app from KISS -->
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<!-- Ability to open the notification bar -->
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<uses-feature
android:name="android.hardware.bluetooth"
android:required="false" />
<uses-feature
android:name="android.hardware.wifi"
android:required="false" />
<uses-feature
android:name="android.hardware.nfc"
android:required="false" />
<!-- more info on queries here: https://medium.com/androiddevelopers/package-visibility-in-android-11-cc857f221cd9 -->
<queries>
<!-- for exporting the settings -->
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="text/xml" />
</intent>
</queries>
<application
android:name=".TBApplication"
android:allowBackup="true"
android:fullBackupContent="@xml/backup_descriptor"
android:dataExtractionRules="@xml/data_extraction_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name_dynamic"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/SettingsDialogTheme.Default">
<activity
android:name=".TBLauncherActivity"
android:clearTaskOnLaunch="true"
android:configChanges="orientation|keyboardHidden|screenSize"
android:excludeFromRecents="true"
android:exported="true"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:screenOrientation="user"
android:stateNotNeeded="true"
android:taskAffinity=".TBLauncherActivity"
android:theme="@style/AppThemeTransparent"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize"
tools:ignore="UnusedAttribute">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
<activity
android:name=".SettingsActivity"
android:allowTaskReparenting="true"
android:exported="true"
android:label="@string/menu_popup_launcher_settings"
android:launchMode="singleTask"
android:parentActivityName=".TBLauncherActivity"
android:screenOrientation="user"
android:taskAffinity=".SettingsActivity"
android:theme="@style/SettingsTheme">
<!-- Parent activity meta-data to support API level 4+ -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".TBLauncherActivity" />
<intent-filter>
<action android:name="android.intent.action.APPLICATION_PREFERENCES" />
<action android:name="com.sec.android.intent.action.SEC_APPLICATION_SETTINGS" />
<category android:name="android.intent.category.PREFERENCE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".widgets.PickAppWidgetActivity"
android:exported="false"
android:launchMode="singleTop"
android:parentActivityName=".TBLauncherActivity"
android:screenOrientation="portrait"
android:theme="@style/NoTitleDialogTheme">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".TBLauncherActivity" />
</activity>
<activity
android:name=".PinShortcutConfirm"
android:allowTaskReparenting="true"
android:excludeFromRecents="true"
android:exported="false"
android:launchMode="singleInstance"
android:noHistory="true"
android:screenOrientation="user"
android:taskAffinity=".TBLauncherActivity"
android:theme="@style/TitleDialogTheme"
tools:ignore="NewApi">
<intent-filter>
<action android:name="android.content.pm.action.CONFIRM_PIN_SHORTCUT" />
</intent-filter>
</activity>
<activity
android:name=".DummyLauncherActivity"
android:enabled="false"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<meta-data
android:name="android.max_aspect"
android:value="3" />
<service android:name=".dataprovider.AppProvider" />
<service android:name=".dataprovider.ContactsProvider" />
<service android:name=".dataprovider.ShortcutsProvider" />
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<receiver
android:name=".DeviceAdmin"
android:exported="true"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/policies" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
<action android:name="android.app.action.DEVICE_ADMIN_DISABLED" />
</intent-filter>
</receiver>
</application>
</manifest>
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/ColorChooserDialog.kt
================================================
/*
* Copyright (c) 2018 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser
import android.app.Dialog
import android.content.DialogInterface
import android.graphics.Color
import android.os.Bundle
import androidx.annotation.ColorInt
import androidx.appcompat.app.AlertDialog
import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import androidx.lifecycle.LifecycleOwner
import rocks.tbog.tblauncher.databinding.Mm2dCcColorChooserBinding
/**
* Color chooser dialog
*/
object ColorChooserDialog {
private const val KEY_REQUEST_KEY = "KEY_REQUEST_KEY"
const val KEY_INITIAL_COLOR = "KEY_INITIAL_COLOR"
private const val KEY_WITH_ALPHA = "KEY_WITH_ALPHA"
const val KEY_INITIAL_TAB = "KEY_INITIAL_TAB"
private const val RESULT_KEY_COLOR = "RESULT_KEY_COLOR"
private const val RESULT_KEY_CANCEL = "RESULT_KEY_CANCEL"
private const val TAG = "ColorChooserDialog"
const val TAB_PALETTE: Int = 0
const val TAB_HSV: Int = 1
const val TAB_RGB: Int = 2
/**
* Register result listener.
*
* Call at the timing of onCreate of activity.
*
* @param activity Caller fragment activity
* @param requestKey Request Key, pass the same value to the `show`
* @param onSelect Listener receiving the result
* @param onCancel Listener receiving a cancel event
*/
fun registerListener(
activity: FragmentActivity,
requestKey: String,
onSelect: (color: Int) -> Unit,
onCancel: (() -> Unit)? = null,
) {
registerListener(
activity.supportFragmentManager,
requestKey,
activity,
onSelect,
onCancel,
)
}
/**
* Register result listener.
*
* Call at the timing of onViewCreated of fragment.
*
* @param fragment Caller fragment
* @param requestKey Request Key, pass the same value to the `show`
* @param onSelect Listener receiving the result
* @param onCancel Listener receiving a cancel event
*/
fun registerListener(
fragment: Fragment,
requestKey: String,
onSelect: (color: Int) -> Unit,
onCancel: (() -> Unit)? = null,
) {
registerListener(
fragment.childFragmentManager,
requestKey,
fragment.viewLifecycleOwner,
onSelect,
onCancel,
)
}
private fun registerListener(
manager: FragmentManager,
requestKey: String,
lifecycleOwner: LifecycleOwner,
onSelect: (color: Int) -> Unit,
onCancel: (() -> Unit)?,
) {
manager.setFragmentResultListener(requestKey, lifecycleOwner) { _, result ->
if (result.getBoolean(RESULT_KEY_CANCEL)) {
onCancel?.invoke()
} else {
onSelect.invoke(result.getInt(RESULT_KEY_COLOR))
}
}
}
/**
* Show dialog.
*
* @param activity FragmentActivity
* @param requestKey Request Key used for registration with registerListener
* @param initialColor initial color
* @param withAlpha if true, alpha section is enabled
* @param initialTab initial tab, TAB_PALETTE/TAB_HSV/TAB_RGB
*/
fun show(
activity: FragmentActivity,
requestKey: String,
@ColorInt initialColor: Int = Color.WHITE,
withAlpha: Boolean = false,
initialTab: Int = TAB_PALETTE
) {
show(
activity.supportFragmentManager,
bundleOf(
KEY_REQUEST_KEY to requestKey,
KEY_INITIAL_COLOR to initialColor,
KEY_WITH_ALPHA to withAlpha,
KEY_INITIAL_TAB to initialTab,
)
)
}
/**
* Show dialog.
*
* @param fragment Fragment
* @param requestKey Request Key used for registration with registerListener
* @param initialColor initial color
* @param withAlpha if true, alpha section is enabled
* @param initialTab initial tab, TAB_PALETTE/TAB_HSV/TAB_RGB
*/
fun show(
fragment: Fragment,
requestKey: String,
@ColorInt initialColor: Int = Color.WHITE,
withAlpha: Boolean = false,
initialTab: Int = TAB_PALETTE
) {
show(
fragment.childFragmentManager,
bundleOf(
KEY_REQUEST_KEY to requestKey,
KEY_INITIAL_COLOR to initialColor,
KEY_WITH_ALPHA to withAlpha,
KEY_INITIAL_TAB to initialTab,
)
)
}
private fun show(manager: FragmentManager, arguments: Bundle) {
if (manager.findFragmentByTag(TAG) != null) return
if (manager.isStateSaved) return
ColorChooserDialogImpl().also {
it.arguments = arguments
}.show(manager, TAG)
}
internal class ColorChooserDialogImpl : DialogFragment() {
private lateinit var colorChooserView: ColorChooserView
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val activity = requireActivity()
colorChooserView =
Mm2dCcColorChooserBinding.inflate(activity.layoutInflater).root
if (savedInstanceState != null) {
val tab = savedInstanceState.getInt(KEY_INITIAL_TAB, 0)
colorChooserView.setCurrentItem(tab)
val color = savedInstanceState.getInt(KEY_INITIAL_COLOR, 0)
colorChooserView.init(color)
} else {
val arguments = requireArguments()
val tab = arguments.getInt(KEY_INITIAL_TAB, 0)
colorChooserView.setCurrentItem(tab)
val color = arguments.getInt(KEY_INITIAL_COLOR, 0)
colorChooserView.init(color)
}
colorChooserView.setWithAlpha(requireArguments().getBoolean(KEY_WITH_ALPHA))
return AlertDialog.Builder(activity)
.setView(colorChooserView)
.setPositiveButton("OK") { _, _ ->
notifySelect()
}
.setNegativeButton("Cancel") { dialog, _ ->
dialog.cancel()
}
.create()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt(KEY_INITIAL_TAB, colorChooserView.getCurrentItem())
outState.putInt(KEY_INITIAL_COLOR, colorChooserView.color)
}
override fun onCancel(dialog: DialogInterface) {
val key = requireArguments().getString(KEY_REQUEST_KEY) ?: return
parentFragmentManager.setFragmentResult(
key, bundleOf(RESULT_KEY_CANCEL to true)
)
}
private fun notifySelect() {
val key = requireArguments().getString(KEY_REQUEST_KEY) ?: return
parentFragmentManager.setFragmentResult(
key, bundleOf(
RESULT_KEY_CANCEL to false,
RESULT_KEY_COLOR to colorChooserView.color,
)
)
}
}
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/ColorChooserView.kt
================================================
/*
* Copyright (c) 2018 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.graphics.alpha
import androidx.core.view.doOnLayout
import androidx.lifecycle.MutableLiveData
import com.google.android.material.tabs.TabLayoutMediator
import rocks.tbog.tblauncher.databinding.Mm2dCcViewDialogBinding
import net.mm2d.color.chooser.util.toOpacity
internal class ColorChooserView
@JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), ColorLiveDataOwner {
private val colorLiveData: MutableLiveData<Int> = MutableLiveData()
private val binding: Mm2dCcViewDialogBinding =
Mm2dCcViewDialogBinding.inflate(LayoutInflater.from(context), this)
val color: Int
get() = binding.controlView.color
fun init(color: Int) {
colorLiveData.value = color.toOpacity()
binding.controlView.setAlpha(color.alpha)
val pageTitles: List<String> = listOf("palette", "hsv", "rgb")
val pageViews: List<View> = listOf(
PaletteView(context), HsvView(context), SliderView(context),
)
binding.viewPager.adapter = ViewPagerAdapter(pageViews)
TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position ->
tab.text = pageTitles[position]
}.attach()
}
fun setCurrentItem(position: Int) {
binding.viewPager.doOnLayout {
binding.viewPager.post {
binding.viewPager.setCurrentItem(position, false)
}
}
}
fun getCurrentItem(): Int = binding.viewPager.currentItem
fun setWithAlpha(withAlpha: Boolean) {
binding.controlView.setWithAlpha(withAlpha)
}
override fun getColorLiveData(): MutableLiveData<Int> = colorLiveData
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/ColorLiveDataOwner.kt
================================================
package net.mm2d.color.chooser
import android.view.View
import androidx.lifecycle.MutableLiveData
internal interface ColorLiveDataOwner {
fun getColorLiveData(): MutableLiveData<Int>
}
internal fun View.findColorLiveDataOwner(): ColorLiveDataOwner? {
if (this is ColorLiveDataOwner) return this
val parent = parent
return if (parent !is View) null else parent.findColorLiveDataOwner()
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/ColorObserverDelegate.kt
================================================
package net.mm2d.color.chooser
import android.view.View
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import androidx.lifecycle.distinctUntilChanged
internal class ColorObserverDelegate<T>(
private val target: T
) where T : View,
T : Observer<Int> {
private var colorLiveData: MutableLiveData<Int>? = null
fun onAttachedToWindow() {
val owner = target.findColorLiveDataOwner()
?: throw IllegalStateException("parent is not ColorLiveDataOwner")
val liveData = owner.getColorLiveData()
liveData.distinctUntilChanged()
.observeForever(target)
colorLiveData = liveData
}
fun onDetachedFromWindow() {
colorLiveData?.removeObserver(target)
colorLiveData = null
}
fun post(color: Int) {
colorLiveData?.postValue(color)
}
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/ControlView.kt
================================================
/*
* Copyright (c) 2018 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser
import android.annotation.SuppressLint
import android.content.Context
import android.content.res.ColorStateList
import android.graphics.Color
import android.text.*
import android.text.InputFilter.LengthFilter
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.graphics.alpha
import androidx.core.view.ViewCompat
import androidx.core.view.isVisible
import androidx.lifecycle.Observer
import net.mm2d.color.chooser.util.resolveColor
import net.mm2d.color.chooser.util.setAlpha
import net.mm2d.color.chooser.util.toOpacity
import com.google.android.material.R
import rocks.tbog.tblauncher.databinding.Mm2dCcViewControlBinding
import java.util.*
internal class ControlView
@JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), Observer<Int> {
private val delegate = ColorObserverDelegate(this)
private val normalTint =
ColorStateList.valueOf(context.resolveColor(R.attr.colorAccent, Color.BLUE))
private val errorTint =
ColorStateList.valueOf(context.resolveColor(R.attr.colorError, Color.RED))
private var changeHexTextByUser = true
private var hasAlpha: Boolean = true
private val rgbFilter = arrayOf(HexadecimalFilter(), LengthFilter(6))
private val argbFilter = arrayOf(HexadecimalFilter(), LengthFilter(8))
private val binding: Mm2dCcViewControlBinding =
Mm2dCcViewControlBinding.inflate(LayoutInflater.from(context), this)
var color: Int = Color.BLACK
private set
init {
binding.colorPreview.setColor(color)
binding.seekAlpha.setValue(color.alpha)
binding.seekAlpha.onValueChanged = { value, fromUser ->
binding.textAlpha.text = value.toString()
if (fromUser) {
setAlpha(value)
}
}
binding.editHex.filters = argbFilter
binding.editHex.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) = Unit
override fun beforeTextChanged(s: CharSequence?, start: Int, c: Int, a: Int) = Unit
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
if (!changeHexTextByUser) {
return
}
if (s.isNullOrEmpty()) {
setError()
return
}
try {
color = Color.parseColor("#$s")
clearError()
binding.colorPreview.setColor(color)
binding.seekAlpha.setValue(color.alpha)
delegate.post(color.toOpacity())
} catch (e: IllegalArgumentException) {
setError()
}
}
})
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
delegate.onAttachedToWindow()
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
delegate.onDetachedFromWindow()
}
fun setAlpha(alpha: Int) {
binding.seekAlpha.setValue(alpha)
color = color.setAlpha(alpha)
binding.colorPreview.setColor(color)
setColorToHexText()
}
fun setWithAlpha(withAlpha: Boolean) {
hasAlpha = withAlpha
binding.seekAlpha.isVisible = withAlpha
binding.textAlpha.isVisible = withAlpha
if (withAlpha) {
binding.editHex.filters = argbFilter
} else {
binding.editHex.filters = rgbFilter
setAlpha(0xff)
}
}
private fun setError() {
ViewCompat.setBackgroundTintList(binding.editHex, errorTint)
}
private fun clearError() {
ViewCompat.setBackgroundTintList(binding.editHex, normalTint)
}
override fun onChanged(value: Int) {
if (this.color.toOpacity() == value) return
this.color = value.setAlpha(binding.seekAlpha.value)
binding.colorPreview.setColor(this.color)
setColorToHexText()
binding.seekAlpha.setMaxColor(value)
}
@SuppressLint("SetTextI18n")
private fun setColorToHexText() {
changeHexTextByUser = false
if (hasAlpha) {
binding.editHex.setText("%08X".format(color))
} else {
binding.editHex.setText("%06X".format(color and 0xffffff))
}
clearError()
changeHexTextByUser = true
}
private class HexadecimalFilter : InputFilter {
override fun filter(
source: CharSequence?, start: Int, end: Int, dest: Spanned?, dstart: Int, dend: Int
): CharSequence? {
val converted = source.toString()
.replace("[^0-9a-fA-F]".toRegex(), "")
.uppercase(Locale.ENGLISH)
if (source.toString() == converted) return null
if (source !is Spanned) return converted
return SpannableString(converted).also {
TextUtils.copySpansFrom(source, 0, converted.length, null, it, 0)
}
}
}
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/HsvView.kt
================================================
/*
* Copyright (c) 2018 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser
import android.content.Context
import android.graphics.Color
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.Observer
import rocks.tbog.tblauncher.databinding.Mm2dCcViewHsvBinding
import net.mm2d.color.chooser.util.ColorUtils
internal class HsvView
@JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), Observer<Int> {
private val delegate = ColorObserverDelegate(this)
private var color: Int = Color.BLACK
private val binding: Mm2dCcViewHsvBinding =
Mm2dCcViewHsvBinding.inflate(LayoutInflater.from(context), this)
init {
binding.svView.onColorChanged = {
color = it
delegate.post(color)
}
binding.hueView.onHueChanged = {
color = ColorUtils.hsvToColor(it, binding.svView.saturation, binding.svView.value)
binding.svView.setHue(it)
delegate.post(color)
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
delegate.onAttachedToWindow()
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
delegate.onDetachedFromWindow()
}
override fun onChanged(value: Int) {
if (this.color == value) return
this.color = value
binding.svView.setColor(value)
binding.hueView.setColor(value)
}
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/PaletteView.kt
================================================
/*
* Copyright (c) 2018 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser
import android.annotation.SuppressLint
import android.content.Context
import android.content.res.Resources
import android.content.res.TypedArray
import android.graphics.Color
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.ArrayRes
import androidx.core.content.res.getColorOrThrow
import androidx.core.content.res.getResourceIdOrThrow
import androidx.core.content.res.use
import androidx.core.view.children
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import net.mm2d.color.chooser.element.PaletteCell
import net.mm2d.color.chooser.util.getPixels
import rocks.tbog.tblauncher.R
import java.lang.ref.SoftReference
import kotlin.collections.forEach as kForEach
internal class PaletteView
@JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : RecyclerView(context, attrs, defStyleAttr), Observer<Int> {
private val delegate = ColorObserverDelegate(this)
private val cellHeight = getPixels(R.dimen.mm2d_cc_palette_cell_height)
private val cellAdapter = CellAdapter(context)
private val linearLayoutManager = LinearLayoutManager(context)
init {
val padding = resources.getDimensionPixelSize(R.dimen.mm2d_cc_palette_padding)
setPadding(0, padding, 0, padding)
clipToPadding = false
setHasFixedSize(true)
overScrollMode = View.OVER_SCROLL_NEVER
itemAnimator = null
layoutManager = linearLayoutManager
adapter = cellAdapter
isVerticalFadingEdgeEnabled = true
setFadingEdgeLength(padding)
cellAdapter.onColorChanged = {
delegate.post(it)
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
delegate.onAttachedToWindow()
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
delegate.onDetachedFromWindow()
}
override fun isPaddingOffsetRequired(): Boolean = true
override fun getTopPaddingOffset(): Int = -paddingTop
override fun getBottomPaddingOffset(): Int = paddingBottom
override fun onChanged(value: Int) {
cellAdapter.setColor(value)
}
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
if (oldh == 0 && h > 0) {
linearLayoutManager.scrollToPositionWithOffset(cellAdapter.index, (h - cellHeight) / 2)
}
}
private class CellAdapter(context: Context) : Adapter<CellHolder>() {
private val inflater: LayoutInflater = LayoutInflater.from(context)
private val list: List<IntArray> = createPalette(context)
private var color: Int = 0
var onColorChanged: ((color: Int) -> Unit)? = null
var index: Int = -1
private set
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CellHolder =
CellHolder(inflater.inflate(R.layout.mm2d_cc_item_palette, parent, false))
.also { holder -> holder.onColorChanged = { onColorChanged?.invoke(it) } }
override fun onBindViewHolder(holder: CellHolder, position: Int) =
holder.apply(list[position], color)
override fun getItemCount(): Int = list.size
fun setColor(newColor: Int) {
if (color == newColor) return
color = newColor
val newIndex = list.indexOfFirst { it.contains(newColor) }
val lastIndex = index
index = newIndex
if (lastIndex >= 0) notifyItemChanged(lastIndex)
if (newIndex >= 0) notifyItemChanged(newIndex)
}
}
private class CellHolder(itemView: View) : ViewHolder(itemView) {
private val viewList: List<PaletteCell> = (itemView as ViewGroup).children
.map { it as PaletteCell }
.toList()
var onColorChanged: ((color: Int) -> Unit)? = null
init {
viewList.kForEach {
it.setOnClickListener(::performOnColorChanged)
}
}
private fun performOnColorChanged(view: View) {
onColorChanged?.invoke(view.tag as? Int ?: return)
}
fun apply(colors: IntArray, selected: Int) {
viewList.withIndex().kForEach { (i, view) ->
val color = if (i < colors.size) colors[i] else Color.TRANSPARENT
view.tag = color
view.setColor(color)
view.checked = color == selected
}
}
}
companion object {
private var cache: SoftReference<List<IntArray>> = SoftReference<List<IntArray>>(null)
@SuppressLint("Recycle")
private fun <R> Resources.useTypedArray(@ArrayRes id: Int, block: TypedArray.() -> R): R =
obtainTypedArray(id).use { it.block() }
private fun createPalette(context: Context): List<IntArray> {
cache.get()?.let { return it }
val resources = context.resources
return resources.useTypedArray(R.array.material_colors) {
(0 until length()).map { resources.readColorArray(getResourceIdOrThrow(it)) }
}.also {
cache = SoftReference(it)
}
}
private fun Resources.readColorArray(id: Int): IntArray =
useTypedArray(id) { IntArray(length()) { getColorOrThrow(it) } }
}
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/SliderView.kt
================================================
/*
* Copyright (c) 2018 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser
import android.content.Context
import android.graphics.Color
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.Observer
import rocks.tbog.tblauncher.databinding.Mm2dCcViewSliderBinding
internal class SliderView
@JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), Observer<Int> {
private val delegate = ColorObserverDelegate(this)
private val binding: Mm2dCcViewSliderBinding =
Mm2dCcViewSliderBinding.inflate(LayoutInflater.from(context), this)
init {
binding.seekRed.onValueChanged = { value, fromUser ->
binding.textRed.text = value.toString()
updateBySeekBar(fromUser)
}
binding.seekGreen.onValueChanged = { value, fromUser ->
binding.textGreen.text = value.toString()
updateBySeekBar(fromUser)
}
binding.seekBlue.onValueChanged = { value, fromUser ->
binding.textBlue.text = value.toString()
updateBySeekBar(fromUser)
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
delegate.onAttachedToWindow()
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
delegate.onDetachedFromWindow()
}
override fun onChanged(value: Int) {
binding.seekRed.setValue(Color.red(value))
binding.seekGreen.setValue(Color.green(value))
binding.seekBlue.setValue(Color.blue(value))
}
private fun updateBySeekBar(fromUser: Boolean) {
if (!fromUser) return
val color = Color.rgb(
binding.seekRed.value,
binding.seekGreen.value,
binding.seekBlue.value
)
delegate.post(color)
}
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/ViewPagerAdapter.kt
================================================
/*
* Copyright (c) 2018 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser
import android.view.View
import android.view.ViewGroup
import androidx.core.view.ViewCompat
import androidx.recyclerview.widget.RecyclerView
import net.mm2d.color.chooser.ViewPagerAdapter.ViewHolder
internal class ViewPagerAdapter(
pageViews: List<View>
) : RecyclerView.Adapter<ViewHolder>() {
private val pageViews = pageViews.toList().onEach {
it.id = ViewCompat.generateViewId()
it.layoutParams = RecyclerView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
}
class ViewHolder(val view: View) : RecyclerView.ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder =
ViewHolder(pageViews[viewType])
override fun onBindViewHolder(holder: ViewHolder, position: Int) = Unit
override fun getItemViewType(position: Int): Int = position
override fun getItemCount(): Int = pageViews.size
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/element/ColorSliderView.kt
================================================
/*
* Copyright (c) 2019 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser.element
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.*
import android.graphics.Paint.Style
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import androidx.core.content.withStyledAttributes
import net.mm2d.color.chooser.util.*
import rocks.tbog.tblauncher.R
import kotlin.math.max
internal class ColorSliderView
@JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private val paint = Paint().also {
it.isAntiAlias = true
}
private val sampleRadius = getDimension(R.dimen.mm2d_cc_sample_radius)
private val sampleFrameRadius = sampleRadius + getDimension(R.dimen.mm2d_cc_sample_frame)
private val sampleShadowRadius =
sampleFrameRadius + getDimension(R.dimen.mm2d_cc_sample_shadow)
private val frameLineWidth = getDimension(R.dimen.mm2d_cc_sample_frame)
private val shadowLineWidth = getDimension(R.dimen.mm2d_cc_sample_shadow)
private val requestPaddingH = max(getPixels(R.dimen.mm2d_cc_panel_margin), sampleShadowRadius.toInt())
private val requestPaddingV = max(getPixels(R.dimen.mm2d_cc_panel_margin), (frameLineWidth * 2 + shadowLineWidth).toInt())
private val requestWidth = getPixels(R.dimen.mm2d_cc_slider_width) + requestPaddingH * 2
private val requestHeight = getPixels(R.dimen.mm2d_cc_slider_height) + requestPaddingV * 2
private val gradationRect = Rect(0, 0, RANGE, 1)
private val targetRect = Rect()
private val colorSampleFrame = getColor(R.color.mm2d_cc_sample_frame)
private val colorSampleShadow = getColor(R.color.mm2d_cc_sample_shadow)
private var checker: Bitmap? = null
private var floatValue: Float = 0f
private var maxColor: Int = Color.WHITE
private var gradation: Bitmap
private var baseColor: Int = Color.BLACK
private var alphaMode: Boolean = true
var onValueChanged: ((value: Int, fromUser: Boolean) -> Unit)? = null
val value: Int
get() = (floatValue * MAX).toInt()
init {
context.withStyledAttributes(attrs, R.styleable.ColorSliderView) {
maxColor = getColor(R.styleable.ColorSliderView_maxColor, Color.WHITE)
baseColor = getColor(R.styleable.ColorSliderView_baseColor, Color.BLACK)
alphaMode = getBoolean(R.styleable.ColorSliderView_alphaMode, true)
}
gradation = createGradation(maxColor)
updateChecker()
}
fun setMaxColor(maxColor: Int) {
this.maxColor = maxColor.toOpacity()
gradation = createGradation(this.maxColor)
invalidate()
}
fun setValue(value: Int) {
floatValue = (value / MAX.toFloat()).coerceIn(0f, 1f)
onValueChanged?.invoke(value, false)
invalidate()
}
private fun updateChecker() {
checker = if (alphaMode) {
createChecker(
getPixels(R.dimen.mm2d_cc_checker_size),
getPixels(R.dimen.mm2d_cc_slider_height),
getColor(R.color.mm2d_cc_checker_light),
getColor(R.color.mm2d_cc_checker_dark)
)
} else {
null
}
}
@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(event: MotionEvent): Boolean {
if (event.action == MotionEvent.ACTION_DOWN) {
parent.requestDisallowInterceptTouchEvent(true)
}
floatValue = ((event.x - targetRect.left) / targetRect.width().toFloat()).coerceIn(0f, 1f)
onValueChanged?.invoke(value, true)
invalidate()
return true
}
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
targetRect.set(
paddingLeft + requestPaddingH,
paddingTop + requestPaddingV,
width - paddingRight - requestPaddingH,
height - paddingBottom - requestPaddingV
)
}
override fun onDraw(canvas: Canvas) {
paint.style = Style.STROKE
paint.color = colorSampleShadow
paint.strokeWidth = shadowLineWidth
val shadow = frameLineWidth + shadowLineWidth / 2
canvas.drawRectWithOffset(targetRect, shadow, paint)
paint.color = colorSampleFrame
paint.strokeWidth = frameLineWidth
val frame = frameLineWidth / 2
canvas.drawRectWithOffset(targetRect, frame, paint)
paint.style = Style.FILL
if (alphaMode) {
val checker = checker ?: return
canvas.save()
canvas.clipRect(targetRect)
val top = targetRect.top.toFloat()
for (left in targetRect.left until targetRect.right step checker.width) {
canvas.drawBitmap(checker, left.toFloat(), top, paint)
}
canvas.restore()
} else {
paint.color = baseColor
canvas.drawRect(targetRect, paint)
}
canvas.drawBitmap(gradation, gradationRect, targetRect, paint)
val x = floatValue * targetRect.width() + targetRect.left
val y = targetRect.centerY().toFloat()
paint.color = colorSampleShadow
canvas.drawCircle(x, y, sampleShadowRadius, paint)
paint.color = colorSampleFrame
canvas.drawCircle(x, y, sampleFrameRadius, paint)
paint.color = baseColor
canvas.drawCircle(x, y, sampleRadius, paint)
paint.color = maxColor.setAlpha(value)
canvas.drawCircle(x, y, sampleRadius, paint)
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
setMeasuredDimension(
getDefaultSize(
maxOf(requestWidth + paddingLeft + paddingRight, suggestedMinimumWidth),
widthMeasureSpec
),
resolveSizeAndState(
maxOf(requestHeight + paddingTop + paddingBottom, suggestedMinimumHeight),
heightMeasureSpec,
MeasureSpec.UNSPECIFIED
)
)
}
companion object {
private const val MAX = 255
private const val RANGE = 256
private fun createGradation(color: Int): Bitmap {
val pixels = IntArray(RANGE) { color.setAlpha(it) }
return Bitmap.createBitmap(pixels, RANGE, 1, Bitmap.Config.ARGB_8888)
}
private fun createChecker(step: Int, height: Int, color1: Int, color2: Int): Bitmap {
val width = step * 4
val pixels = IntArray(width * height)
for (y in 0 until height) {
for (x in 0 until width) {
pixels[x + y * width] = if ((x / step + y / step) % 2 == 0) color1 else color2
}
}
return Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_8888)
}
}
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/element/HueView.kt
================================================
/*
* Copyright (c) 2018 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser.element
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import androidx.annotation.ColorInt
import net.mm2d.color.chooser.util.ColorUtils
import net.mm2d.color.chooser.util.getColor
import net.mm2d.color.chooser.util.getDimension
import net.mm2d.color.chooser.util.getPixels
import rocks.tbog.tblauncher.R
import kotlin.math.max
internal class HueView
@JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
@ColorInt
private var color: Int = Color.RED
private val paint = Paint()
private val bitmap: Bitmap = createMaskBitmap()
private val sampleRadius = getDimension(R.dimen.mm2d_cc_sample_radius)
private val sampleFrameRadius =
sampleRadius + getDimension(R.dimen.mm2d_cc_sample_frame)
private val sampleShadowRadius =
sampleFrameRadius + getDimension(R.dimen.mm2d_cc_sample_shadow)
private val requestPaddingH = getPixels(R.dimen.mm2d_cc_panel_margin)
private val requestPaddingV = max(getPixels(R.dimen.mm2d_cc_panel_margin), sampleShadowRadius.toInt())
private val requestWidth = getPixels(R.dimen.mm2d_cc_hue_width) + requestPaddingH * 2
private val requestHeight = getPixels(R.dimen.mm2d_cc_hsv_size) + requestPaddingV * 2
private val bitmapRect = Rect(0, 0, 1, RANGE)
private val targetRect = Rect()
private var hue: Float = 0f
private val colorSampleFrame = getColor(R.color.mm2d_cc_sample_frame)
private val colorSampleShadow = getColor(R.color.mm2d_cc_sample_shadow)
var onHueChanged: ((hue: Float) -> Unit)? = null
fun setColor(@ColorInt color: Int) {
updateHue(ColorUtils.hue(color))
}
private fun updateHue(h: Float, fromUser: Boolean = false) {
if (hue == h) return
hue = h
color = ColorUtils.hsvToColor(hue, 1f, 1f)
invalidate()
if (fromUser) {
onHueChanged?.invoke(hue)
}
}
@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(event: MotionEvent): Boolean {
updateHue(((event.y - targetRect.top) / targetRect.height()).coerceIn(0f, 1f), true)
return true
}
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
targetRect.set(
paddingLeft + requestPaddingH,
paddingTop + requestPaddingV,
width - paddingRight - requestPaddingH,
height - paddingBottom - requestPaddingV
)
}
override fun onDraw(canvas: Canvas) {
canvas.drawBitmap(bitmap, bitmapRect, targetRect, paint)
val x = targetRect.centerX().toFloat()
val y = hue * targetRect.height() + targetRect.top
paint.color = colorSampleShadow
canvas.drawCircle(x, y, sampleShadowRadius, paint)
paint.color = colorSampleFrame
canvas.drawCircle(x, y, sampleFrameRadius, paint)
paint.color = color
canvas.drawCircle(x, y, sampleRadius, paint)
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
setMeasuredDimension(
resolveSizeAndState(
max(requestWidth + paddingLeft + paddingRight, suggestedMinimumWidth),
widthMeasureSpec,
MeasureSpec.UNSPECIFIED
),
resolveSizeAndState(
max(requestHeight + paddingTop + paddingBottom, suggestedMinimumHeight),
heightMeasureSpec,
MeasureSpec.UNSPECIFIED
)
)
}
companion object {
private const val RANGE = 360
private fun createMaskBitmap(): Bitmap {
val pixels = IntArray(RANGE) { ColorUtils.hsvToColor(it.toFloat() / RANGE, 1f, 1f) }
return Bitmap.createBitmap(pixels, 1, RANGE, Bitmap.Config.ARGB_8888)
}
}
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/element/PaletteCell.kt
================================================
/*
* Copyright (c) 2018 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser.element
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Paint.Style
import android.graphics.drawable.Drawable
import android.util.AttributeSet
import android.view.View
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.graphics.drawable.DrawableCompat
import rocks.tbog.tblauncher.R.drawable
import net.mm2d.color.chooser.util.ColorUtils
import kotlin.math.min
internal class PaletteCell @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private val icon: Drawable = loadIcon(context)
private var color: Int = Color.TRANSPARENT
private val paint: Paint = Paint().also {
it.style = Style.FILL_AND_STROKE
}
var checked: Boolean = false
fun setColor(color: Int) {
this.color = color
paint.color = color
isEnabled = color != Color.TRANSPARENT
invalidate()
}
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
val size = min(min(width, height), icon.intrinsicWidth)
icon.setBounds((w - size) / 2, (h - size) / 2, (w + size) / 2, (h + size) / 2)
}
override fun onDraw(canvas: Canvas) {
if (color == Color.TRANSPARENT) return
canvas.drawColor(color)
if (checked) {
DrawableCompat.setTint(icon, selectForeground(color))
icon.draw(canvas)
}
}
companion object {
private var icon: Drawable? = null
private fun loadIcon(context: Context): Drawable =
icon ?: loadIconInner(context).also { icon = it }
private fun loadIconInner(context: Context): Drawable =
AppCompatResources.getDrawable(context, drawable.mm2d_cc_ic_check)!!.wrap()
private fun Drawable.wrap(): Drawable = DrawableCompat.wrap(this)
fun selectForeground(background: Int): Int =
if (ColorUtils.shouldUseWhiteForeground(background)) Color.WHITE else Color.BLACK
}
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/element/PreviewView.kt
================================================
/*
* Copyright (c) 2019 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser.element
import android.content.Context
import android.graphics.*
import android.graphics.Paint.Style
import android.util.AttributeSet
import android.view.View
import rocks.tbog.tblauncher.R
import net.mm2d.color.chooser.util.drawRectWithOffset
import net.mm2d.color.chooser.util.getColor
import net.mm2d.color.chooser.util.getDimension
import net.mm2d.color.chooser.util.getPixels
import kotlin.math.max
internal class PreviewView
@JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private val paint = Paint().also {
it.isAntiAlias = true
}
private val requestWidth = getPixels(R.dimen.mm2d_cc_preview_width)
private val requestHeight = getPixels(R.dimen.mm2d_cc_preview_height)
private val frameLineWidth = getDimension(R.dimen.mm2d_cc_sample_frame)
private val shadowLineWidth = getDimension(R.dimen.mm2d_cc_sample_shadow)
private val colorSampleFrame = getColor(R.color.mm2d_cc_sample_frame)
private val colorSampleShadow = getColor(R.color.mm2d_cc_sample_shadow)
private val checkerRect = Rect()
private val targetRect = Rect()
private val checkerSize = getPixels(R.dimen.mm2d_cc_checker_size)
private val colorCheckerLight = getColor(R.color.mm2d_cc_checker_light)
private val colorCheckerDark = getColor(R.color.mm2d_cc_checker_dark)
private var checker: Bitmap? = null
var color: Int = Color.BLACK
private set
override fun onDraw(canvas: Canvas) {
paint.style = Style.STROKE
paint.color = colorSampleShadow
paint.strokeWidth = shadowLineWidth
val shadow = frameLineWidth + shadowLineWidth / 2
canvas.drawRectWithOffset(targetRect, shadow, paint)
paint.color = colorSampleFrame
paint.strokeWidth = frameLineWidth
val frame = frameLineWidth / 2
canvas.drawRectWithOffset(targetRect, frame, paint)
val checker = checker ?: return
canvas.drawBitmap(checker, checkerRect, targetRect, paint)
paint.style = Style.FILL
paint.color = color
canvas.drawRect(targetRect, paint)
}
fun setColor(color: Int) {
this.color = color
invalidate()
}
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
val border = (frameLineWidth + shadowLineWidth).toInt()
targetRect.set(
paddingLeft + border,
paddingTop + border,
width - paddingRight - border,
height - paddingBottom - border
)
checkerRect.set(0, 0, targetRect.width(), targetRect.height())
checker = createChecker(
checkerSize,
checkerRect.width(),
checkerRect.height(),
colorCheckerLight,
colorCheckerDark
)
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
setMeasuredDimension(
resolveSizeAndState(
max(requestWidth, suggestedMinimumWidth),
widthMeasureSpec,
MeasureSpec.UNSPECIFIED
),
resolveSizeAndState(
max(requestHeight, suggestedMinimumHeight),
heightMeasureSpec,
MeasureSpec.UNSPECIFIED
)
)
}
companion object {
private fun createChecker(
step: Int,
width: Int,
height: Int,
color1: Int,
color2: Int
): Bitmap {
val pixels = IntArray(width * height)
for (y in 0 until height) {
for (x in 0 until width) {
pixels[x + y * width] = if ((x / step + y / step) % 2 == 0) color1 else color2
}
}
return Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_8888)
}
}
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/element/SvView.kt
================================================
/*
* Copyright (c) 2018 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser.element
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import androidx.annotation.ColorInt
import net.mm2d.color.chooser.util.ColorUtils
import net.mm2d.color.chooser.util.getColor
import net.mm2d.color.chooser.util.getDimension
import net.mm2d.color.chooser.util.getPixels
import rocks.tbog.tblauncher.R
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.min
internal class SvView
@JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
@ColorInt
private var color: Int = Color.BLACK
private var maxColor: Int = Color.RED
private var maskBitmap: Bitmap? = null
private val paint = Paint().also { it.isAntiAlias = true }
private val sampleRadius = getDimension(R.dimen.mm2d_cc_sample_radius)
private val sampleFrameRadius = sampleRadius + getDimension(R.dimen.mm2d_cc_sample_frame)
private val sampleShadowRadius =
sampleFrameRadius + getDimension(R.dimen.mm2d_cc_sample_shadow)
private val requestPadding = max(getPixels(R.dimen.mm2d_cc_panel_margin), sampleShadowRadius.toInt())
private val requestWidth = getPixels(R.dimen.mm2d_cc_hsv_size) + requestPadding * 2
private val requestHeight = getPixels(R.dimen.mm2d_cc_hsv_size) + requestPadding * 2
private val maskRect = Rect(0, 0, TONE_SIZE, TONE_SIZE)
private val targetRect = Rect()
private var hue: Float = 0f
private val colorSampleFrame = getColor(R.color.mm2d_cc_sample_frame)
private val colorSampleShadow = getColor(R.color.mm2d_cc_sample_shadow)
private val hsvCache = FloatArray(3)
var saturation: Float = 0f
private set
var value: Float = 0f
private set
var onColorChanged: ((color: Int) -> Unit)? = null
init {
Thread {
maskBitmap = createMaskBitmap()
postInvalidate()
}.start()
}
fun setColor(@ColorInt color: Int) {
this.color = color
ColorUtils.colorToHsv(color, hsvCache)
updateHue(hsvCache[0])
updateSv(hsvCache[1], hsvCache[2])
}
fun setHue(h: Float) {
color = ColorUtils.hsvToColor(h, saturation, value)
updateHue(h)
}
private fun updateHue(h: Float) {
if (hue == h) {
return
}
hue = h
maxColor = ColorUtils.hsvToColor(hue, 1f, 1f)
invalidate()
}
private fun updateSv(s: Float, v: Float, fromUser: Boolean = false) {
if (saturation == s && value == v) {
return
}
saturation = s
value = v
invalidate()
if (fromUser) {
onColorChanged?.invoke(color)
}
}
@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(event: MotionEvent): Boolean {
if (event.action == MotionEvent.ACTION_DOWN) {
parent.requestDisallowInterceptTouchEvent(true)
}
val s = ((event.x - targetRect.left) / targetRect.width()).coerceIn(0f, 1f)
val v = ((targetRect.bottom - event.y) / targetRect.height()).coerceIn(0f, 1f)
color = ColorUtils.hsvToColor(hue, s, v)
updateSv(s, v, true)
return true
}
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
targetRect.set(
paddingLeft + requestPadding,
paddingTop + requestPadding,
width - paddingRight - requestPadding,
height - paddingBottom - requestPadding
)
}
override fun onDraw(canvas: Canvas) {
val mask = maskBitmap ?: return
paint.color = maxColor
canvas.drawRect(targetRect, paint)
canvas.drawBitmap(mask, maskRect, targetRect, paint)
val x = saturation * targetRect.width() + targetRect.left
val y = (1f - value) * targetRect.height() + targetRect.top
paint.color = colorSampleShadow
canvas.drawCircle(x, y, sampleShadowRadius, paint)
paint.color = colorSampleFrame
canvas.drawCircle(x, y, sampleFrameRadius, paint)
paint.color = color
canvas.drawCircle(x, y, sampleRadius, paint)
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val paddingHorizontal = paddingLeft + paddingRight
val paddingVertical = paddingTop + paddingBottom
val resizeWidth = MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY
val resizeHeight = MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY
if (!resizeWidth && !resizeHeight) {
setMeasuredDimension(
resolveSizeAndState(
max(requestWidth + paddingHorizontal, suggestedMinimumWidth),
widthMeasureSpec,
MeasureSpec.UNSPECIFIED
),
resolveSizeAndState(
max(requestHeight + paddingVertical, suggestedMinimumHeight),
heightMeasureSpec,
MeasureSpec.UNSPECIFIED
)
)
return
}
var widthSize = resolveAdjustedSize(requestWidth + paddingHorizontal, widthMeasureSpec)
var heightSize = resolveAdjustedSize(requestHeight + paddingVertical, heightMeasureSpec)
val actualAspect =
(widthSize - paddingHorizontal).toFloat() / (heightSize - paddingVertical)
if (abs(actualAspect - 1f) < 0.0000001) {
setMeasuredDimension(widthSize, heightSize)
return
}
if (resizeWidth) {
val newWidth = heightSize - paddingVertical + paddingHorizontal
if (!resizeHeight) {
widthSize = resolveAdjustedSize(newWidth, widthMeasureSpec)
}
if (newWidth <= widthSize) {
widthSize = newWidth
setMeasuredDimension(widthSize, heightSize)
return
}
}
if (resizeHeight) {
val newHeight = widthSize - paddingHorizontal + paddingVertical
if (!resizeWidth) {
heightSize = resolveAdjustedSize(newHeight, heightMeasureSpec)
}
if (newHeight <= heightSize) {
heightSize = newHeight
}
}
setMeasuredDimension(widthSize, heightSize)
}
private fun resolveAdjustedSize(desiredSize: Int, measureSpec: Int): Int {
val specMode = MeasureSpec.getMode(measureSpec)
val specSize = MeasureSpec.getSize(measureSpec)
return when (specMode) {
MeasureSpec.UNSPECIFIED -> desiredSize
MeasureSpec.AT_MOST -> min(desiredSize, specSize)
MeasureSpec.EXACTLY -> specSize
else -> desiredSize
}
}
companion object {
private const val TONE_MAX = 255f
private const val TONE_SIZE = 256
private fun createMaskBitmap(): Bitmap {
val pixels = IntArray(TONE_SIZE * TONE_SIZE)
for (y in 0 until TONE_SIZE) {
for (x in 0 until TONE_SIZE) {
pixels[x + y * TONE_SIZE] =
ColorUtils.svToMask(x / TONE_MAX, (TONE_MAX - y) / TONE_MAX)
}
}
return Bitmap.createBitmap(pixels, TONE_SIZE, TONE_SIZE, Bitmap.Config.ARGB_8888)
}
}
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/util/AttrExtentions.kt
================================================
/*
* Copyright (c) 2019 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser.util
import android.annotation.SuppressLint
import android.content.Context
import androidx.annotation.AttrRes
import androidx.annotation.ColorInt
import androidx.annotation.StyleRes
import androidx.core.content.res.use
@ColorInt
internal fun Context.resolveColor(
@AttrRes attr: Int,
@ColorInt defaultColor: Int
): Int = resolveColor(0, attr, defaultColor)
@SuppressLint("Recycle")
@ColorInt
internal fun Context.resolveColor(
@StyleRes style: Int,
@AttrRes attr: Int,
@ColorInt defaultColor: Int
): Int = obtainStyledAttributes(style, intArrayOf(attr))
.use { it.getColor(0, defaultColor) }
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/util/CanvasExtensions.kt
================================================
/*
* Copyright (c) 2020 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser.util
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.Rect
internal fun Canvas.drawRectWithOffset(rect: Rect, offset: Float, paint: Paint) =
drawRect(
rect.left - offset,
rect.top - offset,
rect.right + offset,
rect.bottom + offset,
paint
)
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/util/ColorUtils.kt
================================================
/*
* Copyright (c) 2018 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser.util
import androidx.core.graphics.blue
import androidx.core.graphics.green
import androidx.core.graphics.red
import kotlin.math.pow
/**
* HSVやRGBの色空間表現を扱う上でのメソッド
*/
internal object ColorUtils {
/**
* Convert given HSV [0.0f, 1.0f] to color
*
* @param h Hue
* @param s Saturation
* @param v Value
* @return color
*/
fun hsvToColor(h: Float, s: Float, v: Float): Int {
if (s <= 0f) return toColor(v, v, v)
val hue = h * 6f // [0.0f, 6.0f]
val i = hue.toInt() // hueの整数部
val d = hue - i // hueの小数部
var r = v
var g = v
var b = v
when (i) {
0 -> { // h:[0.0f, 1.0f)
g *= 1f - s * (1f - d)
b *= 1f - s
}
1 -> { // h:[1.0f, 2.0f)
r *= 1f - s * d
b *= 1f - s
}
2 -> { // h:[2.0f, 3.0f)
r *= 1f - s
b *= 1f - s * (1f - d)
}
3 -> { // h:[3.0f, 4.0f)
r *= 1f - s
g *= 1f - s * d
}
4 -> { // h:[4.0f, 5.0f)
r *= 1f - s * (1f - d)
g *= 1f - s
}
5 -> { // h:[5.0f, 6.0f)
g *= 1f - s
b *= 1f - s * d
}
else -> {
g *= 1f - s * (1f - d)
b *= 1f - s
}
}
return toColor(r, g, b)
}
/**
* Convert given SV [0.0f, 1.0f] to monochrome + alpha mask
*
* @param s Saturation
* @param v Value
* @return pixel value of mask
*/
fun svToMask(s: Float, v: Float): Int {
val a = 1f - (s * v)
val g = if (a == 0f) 0f else (v * (1f - s) / a).coerceIn(0f, 1f)
return toColor(a, g, g, g)
}
/**
* Convert given color to HSV [0.0f, 1.0f] array
*
* @param color color
* @param outHsv hsv buffer if not specify or null, allocate new array
* @return hsv array
*/
fun colorToHsv(color: Int, outHsv: FloatArray? = null): FloatArray {
val r = color.red / 255f
val g = color.green / 255f
val b = color.blue / 255f
val max = max(r, g, b)
val min = min(r, g, b)
val hsv = outHsv ?: FloatArray(3)
hsv[0] = hue(r, g, b, max, min)
hsv[1] = saturation(max, min)
hsv[2] = max
return hsv
}
/**
* Calculate hue value
*
* @param color color
* @return hue
*/
fun hue(color: Int): Float {
val r = color.red / 255f
val g = color.green / 255f
val b = color.blue / 255f
val max = max(r, g, b)
val min = min(r, g, b)
return hue(r, g, b, max, min)
}
private fun max(v1: Float, v2: Float, v3: Float): Float =
maxOf(maxOf(v1, v2), v3)
private fun min(v1: Float, v2: Float, v3: Float): Float =
minOf(minOf(v1, v2), v3)
private fun hue(r: Float, g: Float, b: Float, max: Float, min: Float): Float {
val range = max - min
if (range == 0f) return 0f
val hue = when (max) {
r -> ((g - b) / range).let { if (it < 0f) it + 6f else it }
g -> (b - r) / range + 2f
else -> (r - g) / range + 4f
}
return (hue / 6f).coerceIn(0f, 1f)
}
private fun saturation(max: Float, min: Float): Float =
if (max != 0.0f) (max - min) / max else 0f
/**
* Convert [0.0f, 1.0f] ARGB value to color
*
* @param r Red value
* @param g Green value
* @param b Blue value
* @return color
*/
private fun toColor(r: Float, g: Float, b: Float): Int =
toColor(r.to8bit(), g.to8bit(), b.to8bit())
/**
* Convert [0, 255] RGB value to color
*
* @param r Red value
* @param g Green value
* @param b Blue value
* @return color
*/
private fun toColor(r: Int, g: Int, b: Int): Int =
(0xff shl 24) or (0xff and r shl 16) or (0xff and g shl 8) or (0xff and b)
/**
* Convert [0.0f, 1.0f] ARGB value to color
*
* @param a Alpha value
* @param r Red value
* @param g Green value
* @param b Blue value
* @return color
*/
private fun toColor(a: Float, r: Float, g: Float, b: Float): Int =
toColor(
a.to8bit(),
r.to8bit(),
g.to8bit(),
b.to8bit()
)
/**
* Convert [0, 255] ARGB value to color
*
* @param a Alpha value
* @param r Red value
* @param g Green value
* @param b Blue value
* @return color
*/
private fun toColor(a: Int, r: Int, g: Int, b: Int): Int =
(0xff and a shl 24) or (0xff and r shl 16) or (0xff and g shl 8) or (0xff and b)
/**
* Calculate luminance based on ITU-R BT.709 and sRGB
*
* https://www.w3.org/TR/WCAG20/#relativeluminancedef
*
* @param r Red ratio
* @param g Green ratio
* @param b Blue ratio
* @return luminance
*/
fun luminance(r: Float, g: Float, b: Float): Float =
r * 0.2126f + g * 0.7152f + b * 0.0722f
/**
* Minimum contrast for large text based on W3C guideline
*
* https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast
*/
private const val MINIMUM_CONTRAST_FOR_LARGE_TEXT = 3f
/**
* Determine whether sufficient contrast can be secured with white foreground.
*
* @param color
* @return if true, should use white foreground, else avoid white foreground
*/
fun shouldUseWhiteForeground(color: Int): Boolean =
color.contrastWithWhite() > MINIMUM_CONTRAST_FOR_LARGE_TEXT
}
/**
* Overwrite alpha value of color
*
* @receiver color
* @param alpha Alpha
* @return alpha applied color
*/
internal fun Int.setAlpha(alpha: Int): Int = this and 0xffffff or (alpha shl 24)
/**
* Overwrite alpha value to completely opaque
*/
internal fun Int.toOpacity(): Int = setAlpha(0xff)
/**
* Convert [0, 255] to [0.0f, 1.0f]
*
* @receiver [0, 255]
* @return [0.0f, 1.0f]
*/
internal fun Int.toRatio(): Float = this / 255f
/**
* Convert [0.0f, 1.0f] to [0, 255]
*
* @receiver [0.0f, 1.0f]
* @return [0, 255]
*/
internal fun Float.to8bit(): Int = (this * 255f + 0.5f).toInt().coerceIn(0, 255)
/**
* Normalize value of primary color luminance to calculate sRGB luminance of color
*
* https://www.w3.org/TR/WCAG20/#relativeluminancedef
*
* @receiver primary color luminance
* @return normalized luminance
*/
internal fun Float.normalizeForSrgb(): Float =
if (this < 0.03928f) this / 12.92f else ((this + 0.055) / 1.055).pow(2.4).toFloat()
/**
* Normalize value of primary color luminance to calculate sRGB luminance of color
*
* https://www.w3.org/TR/WCAG20/#relativeluminancedef
*
* @receiver primary color luminance
* @return normalized luminance
*/
internal fun Int.normalizeForSrgb(): Float = toRatio().normalizeForSrgb()
/**
* Calculate sRGB luminance of color
*
* @receiver color
* @return sRGB luminance
*/
internal fun Int.relativeLuminance(): Float {
return ColorUtils.luminance(
red.normalizeForSrgb(),
green.normalizeForSrgb(),
blue.normalizeForSrgb()
)
}
/**
* Calculate contrast between given color and pure white (#ffffff)
*
* @receiver color
* @return contrast [1, 21]
*/
internal fun Int.contrastWithWhite(): Float {
return 1.05f / (relativeLuminance() + 0.05f)
}
================================================
FILE: app/src/main/java/net/mm2d/color/chooser/util/ResourceExtensions.kt
================================================
/*
* Copyright (c) 2020 大前良介 (OHMAE Ryosuke)
*
* This software is released under the MIT License.
* http://opensource.org/licenses/MIT
*/
package net.mm2d.color.chooser.util
import android.content.Context
import android.util.TypedValue
import android.view.View
import androidx.annotation.ColorInt
import androidx.annotation.ColorRes
import androidx.annotation.DimenRes
import androidx.annotation.Dimension
import androidx.core.content.ContextCompat
@ColorInt
internal fun View.getColor(@ColorRes id: Int): Int =
ContextCompat.getColor(context, id)
@Dimension
internal fun View.getDimension(@DimenRes id: Int): Float =
resources.getDimension(id)
@Dimension
internal fun View.getPixels(@DimenRes id: Int): Int =
resources.getDimensionPixelSize(id)
@Dimension
internal fun Int.toPixelsAsDp(context: Context): Int =
TypedValue.complexToDimensionPixelSize(this, context.resources.displayMetrics)
================================================
FILE: app/src/main/java/rocks/tbog/tblauncher/Behaviour.java
================================================
package rocks.tbog.tblauncher;
import static rocks.tbog.tblauncher.entry.EntryItem.LAUNCHED_FROM_GESTURE;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.pm.LauncherApps;
import android.graphics.drawable.Animatable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.LinearInterpolator;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.DrawableRes;
import androidx.annotation.IdRes;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.ActionBar;
import androidx.lifecycle.Lifecycle;
import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.RecyclerView;
import java.lang.reflect.Constructor;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.Set;
import rocks.tbog.tblauncher.customicon.ButtonHelper;
import rocks.tbog.tblauncher.customicon.IconSelectDialog;
import rocks.tbog.tblauncher.dataprovider.IProvider;
import rocks.tbog.tblauncher.dataprovider.TagsProvider;
import rocks.tbog.tblauncher.entry.ActionEntry;
import rocks.tbog.tblauncher.entry.AppEntry;
import rocks.tbog.tblauncher.entry.DialContactEntry;
import rocks.tbog.tblauncher.entry.EntryItem;
import rocks.tbog.tblauncher.entry.EntryWithTags;
import rocks.tbog.tblauncher.entry.SearchEntry;
import rocks.tbog.tblauncher.entry.ShortcutEntry;
import rocks.tbog.tblauncher.entry.StaticEntry;
import rocks.tbog.tblauncher.handler.DataHandler;
import rocks.tbog.tblauncher.quicklist.EditQuickListDialog;
import rocks.tbog.tblauncher.result.CustomRecycleLayoutManager;
import rocks.tbog.tblauncher.result.RecycleAdapter;
import rocks.tbog.tblauncher.result.RecycleScrollListener;
import rocks.tbog.tblauncher.result.ResultHelper;
import rocks.tbog.tblauncher.result.ResultItemDecoration;
import rocks.tbog.tblauncher.searcher.ISearchActivity;
import rocks.tbog.tblauncher.searcher.QuerySearcher;
import rocks.tbog.tblauncher.searcher.Searcher;
import rocks.tbog.tblauncher.shortcut.ShortcutUtil;
import rocks.tbog.tblauncher.ui.DialogFragment;
import rocks.tbog.tblauncher.ui.KeyboardHandler;
import rocks.tbog.tblauncher.ui.LinearAdapter;
import rocks.tbog.tblauncher.ui.ListPopup;
import rocks.tbog.tblauncher.ui.RecyclerList;
import rocks.tbog.tblauncher.ui.ViewStubPreview;
import rocks.tbog.tblauncher.ui.WindowInsetsHelper;
import rocks.tbog.tblauncher.ui.dialog.TagsManagerDialog;
import rocks.tbog.tblauncher.utils.KeyboardToggleHelper;
import rocks.tbog.tblauncher.utils.KeyboardTriggerBehaviour;
import rocks.tbog.tblauncher.utils.PrefCache;
import rocks.tbog.tblauncher.utils.SystemUiVisibility;
import rocks.tbog.tblauncher.utils.UISizes;
import rocks.tbog.tblauncher.utils.UITheme;
import rocks.tbog.tblauncher.utils.UserHandleCompat;
import rocks.tbog.tblauncher.utils.Utilities;
/**
* Behaviour of the launcher, when are stuff hidden, animation, user interaction responses
*/
public class Behaviour implements ISearchActivity {
public static final int LAUNCH_DELAY = 100;
static final String DIALOG_CUSTOM_ICON = "custom_icon_dialog";
static final String DIALOG_EDIT_TAGS = "edit_tags_dialog";
static final String DIALOG_EDIT_QUICK_LIST = "edit_quick_list_dialog";
static final String DIALOG_TAGS_MANAGER = "tags_manager_dialog";
private static final int UI_ANIMATION_DELAY = 300;
// time to wait for the keyboard to show up
private static final int KEYBOARD_ANIMATION_DELAY = 100;
private static final int UI_ANIMATION_DURATION = 200;
private static final String TAG = Behaviour.class.getSimpleName();
private TBLauncherActivity mTBLauncherActivity = null;
private DialogFragment<?> mFragmentDialog = null;
private View mResultLayout;
private RecyclerList mResultList;
private RecycleAdapter mResultAdapter;
private EditText mSearchEditText;
private View mSearchBarContainer;
private View mWidgetContainer;
private View mClearButton;
private View mMenuButton;
private TextView mLauncherTime = null;
private final Runnable mUpdateTime = new Runnable() {
@Override
public void run() {
if (mLauncherTime == null ||
!mLauncherTime.isAttachedToWindow() ||
!mTBLauncherActivity.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
return;
Date date = new Date();
mLauncherTime.setText(DateFormat.getDateTimeInstance().format(date));
long delay = 1000 - date.getTime() % 1000;
mLauncherTime.postDelayed(mUpdateTime, delay);
}
};
private boolean mLaunchMostRelevantResult = false;
private final TextWatcher mSearchTextWatcher = new TextWatcher() {
@NonNull
String lastText = "";
public void afterTextChanged(Editable s) {
//Log.i(TAG, "afterTextChanged `" + s + "`");
// left-trim text.
final int length = s.length();
int spaceEnd = 0;
while (spaceEnd < length && s.charAt(spaceEnd) == ' ')
spaceEnd += 1;
if (spaceEnd > 0) {
// delete and wait for the next call to afterTextChanged generated by the delete
s.delete(0, spaceEnd);
} else {
String text = s.toString();
if (lastText.equals(text) || mLaunchMostRelevantResult)
return;
if (TextUtils.isEmpty(text))
clearAdapter();
else
updateSearchRecords(false, text);
updateClearButton();
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
lastText = (s != null) ? s.toString() : "";
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
// do nothing
}
};
private ImageView mLauncherButton;
private View mDecorView;
private Handler mHandler;
private final Runnable mHidePart2Runnable = new Runnable() {
@Override
public void run() {
// if (TBApplication.state().isKeyboardVisible()) {
// // if keyboard is visible, the notification bar is also visible
// return;
// }
// Delayed hide UI elements
ActionBar actionBar = mTBLauncherActivity != null ? mTBLauncherActivity.getSupportActionBar() : null;
if (actionBar != null) {
actionBar.hide();
}
SystemUiVisibility.setFullscreen(mDecorView);
//mTBLauncherActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
};
private final Runnable mShowPart2Runnable = new Runnable() {
@Override
public void run() {
// Delayed display of UI elements
ActionBar actionBar = mTBLauncherActivity != null ? mTBLauncherActivity.getSupportActionBar() : null;
if (actionBar != null) {
actionBar.show();
}
SystemUiVisibility.clearFullscreen(mDecorView);
//mTBLauncherActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
};
private final Runnable mShowKeyboardRunnable = () -> {
if (WindowInsetsHelper.isKeyboardVisible(mSearchEditText))
this.mKeyboardHandler.mRequestOpen = false;
else
this.mKeyboardHandler.showKeyboard();
};
private final Runnable mOnKeyboardClosedByUser = () -> {
Log.i(TAG, "on keyboard closed by user");
if (dismissPopup())
return;
LauncherState state = TBApplication.state();
if (LauncherState.Desktop.SEARCH == state.getDesktop()) {
if (PrefCache.linkCloseKeyboardToBackButton(this.mPref))
onBackPressed();
}
if (LauncherState.Desktop.SEARCH == state.getDesktop()) {
if (state.isKeyboardHidden() && PrefCache.modeSearchFullscreen(this.mPref))
enableFullscreen(0);
}
};
private View mNotificationBackground;
private KeyboardToggleHelper mKeyboardHandler = null;
private RecycleScrollListener mRecycleScrollListener;
private SharedPreferences mPref;
private static void launchIntent(@NonNull Behaviour behaviour, @NonNull View view, @NonNull Intent intent) {
behaviour.beforeLaunchOccurred();
view.postDelayed(() -> {
Activity activity = Utilities.getActivity(view);
if (activity == null)
return;
Utilities.setIntentSourceBounds(intent, view);
Bundle startActivityOptions = Utilities.makeStartActivityOptions(view);
try {
activity.startActivity(intent, startActivityOptions);
} catch (ActivityNotFoundException ignored) {
return;
}
behaviour.afterLaunchOccurred();
}, LAUNCH_DELAY);
}
private void initResultLayout() {
mResultLayout = inflateViewStub(R.id.resultLayout);
mResultList = mResultLayout.findViewById(R.id.resultList);
if (mResultList == null)
throw new IllegalStateException("mResultList==null");
mRecycleScrollListener = new RecycleScrollListener(new KeyboardHandler() {
@Override
public void showKeyboard() {
mKeyboardHandler.showKeyboard();
}
@Override
public void hideKeyboard() {
mKeyboardHandler.hideKeyboard();
mKeyboardHandler.mHiddenByScrolling = true;
}
});
mResultAdapter = new RecycleAdapter(getContext(), new ArrayList<>());
mResultList.setHasFixedSize(true);
mResultList.setAdapter(mResultAdapter);
mResultList.addOnScrollListener(mRecycleScrollListener);
// mResultList.addOnLayoutChangeListener(recycleScrollListener);
int vertical = getContext().getResources().getDimensionPixelSize(R.dimen.result_margin_vertical);
mResultList.addItemDecoration(new ResultItemDecoration(0, vertical, true));
setListLayout();
}
private void initSearchBarContainer() {
int layout = PrefCache.getSearchBarLayout(mPref);
if (PrefCache.searchBarAtBottom(mPref)) {
mSearchBarContainer = inflateViewStub(R.id.stubSearchBottom, layout);
} else {
mSearchBarContainer = inflateViewStub(R.id.stubSearchTop, layout);
}
if (mSearchBarContainer == null)
throw new IllegalStateException("mSearchBarContainer==null");
mLauncherButton = mSearchBarContainer.findViewById(R.id.launcherButton);
mSearchEditText = mSearchBarContainer.findViewById(R.id.launcherSearch);
mClearButton = mSearchBarContainer.findViewById(R.id.clearButton);
mMenuButton = mSearchBarContainer.findViewById(R.id.menuButton);
// when pill search bar expanded, show keyboard
mTBLauncherActivity.customizeUI.setExpandedSearchPillListener(this::showKeyboard);
}
private void initLauncherButtons() {
final ListPopup buttonMenu;
if (PrefCache.getSearchBarLayout(mPref) == R.layout.search_pill)
buttonMenu = getButtonPopup(getContext(), ButtonHelper.BTN_ID_LAUNCHER_PILL, R.drawable.launcher_pill);
else
buttonMenu = getButtonPopup(getContext(), ButtonHelper.BTN_ID_LAUNCHER_WHITE, R.drawable.launcher_white);
mLauncherButton.setOnClickListener((v) -> executeButtonAction("button-launcher"));
mLauncherButton.setOnLongClickListener((v) -> ButtonHelper.showButtonPopup(v, buttonMenu));
// menu button / 3 dot button actions
mMenuButton.setOnClickListener(v -> {
Context ctx = v.getContext();
ListPopup menu = getMenuPopup(ctx);
registerPopup(menu);
menu.showCenter(v);
});
mMenuButton.setOnLongClickListener(v -> {
Context ctx = v.getContext();
ListPopup menu = getMenuPopup(ctx);
// check if menu contains elements and if yes show it
if (!menu.getAdapter().isEmpty()) {
registerPopup(menu);
menu.show(v, 0f);
return true;
}
return false;
});
// clear button actions
mClearButton.setOnClickListener(v -> clearSearch());
mClearButton.setOnLongClickListener(v -> {
clearSearch();
Context ctx = v.getContext();
ListPopup menu = getMenuPopup(ctx);
// check if menu contains elements and if yes show it
if (!menu.getAdapter().isEmpty()) {
registerPopup(menu);
menu.show(v);
return true;
}
return false;
});
}
private void setSearchHint() {
Set<String> selectedHints = mPref.getStringSet("selected-search-hints", null);
if (selectedHints != null && !selectedHints.isEmpty()) {
int random = new Random().nextInt(selectedHints.size());
for (String selectedHint : selectedHints) {
if (--random < 0) {
mSearchEditText.setHint(selectedHint);
break;
}
}
}
}
private void initLauncherSearchEditText() {
setSearchHint();
mSearchEditText.setTextIsSelectable(false);
mSearchEditText.addTextChangedListener(mSearchTextWatcher);
// On validate, launch first record
mSearchEditText.setOnEditorActionListener((view, actionId, event) -> {
// Return true if you have consumed the action, else false.
// if keyboard close action issued
if (actionId == android.R.id.closeButton) {
LauncherState state = TBApplication.state();
// Fix for #238
state.syncKeyboardVisibility(view);
if (state.isKeyboardHidden()) {
Log.i(TAG, "Keyboard - closeButton while keyboard hidden");
return false;
}
if (state.isSearchBarVisible() && PrefCache.linkKeyboardAndSearchBar(mPref)) {
// consume action to avoid closing the keyboard
Log.i(TAG, "Keyboard - closeButton - linkKeyboardAndSearchBar");
return true;
}
// close the keyboard
Log.i(TAG, "Keyboard - closeButton - close");
return false;
}
// launch most relevant result
if (TBApplication.hasSearchTask(getContext())) {
mLaunchMostRelevantResult = true;
return true;
} else {
final int mostRelevantIdx = mResultList.getAdapterFirstItemIdx();
if (mostRelevantIdx >= 0 && mostRelevantIdx < mResultAdapter.getItemCount()) {
RecyclerView.ViewHolder holder = mResultList.findViewHolderForAdapterPosition(mostRelevantIdx);
mResultAdapter.onClick(mostRelevantIdx, holder != null ? holder.itemView : view);
return true;
}
}
return false;
});
}
private KeyboardToggleHelper newKeyboardHandler() {
return new KeyboardToggleHelper(mSearchEditText) {
@Override
public void showKeyboard() {
LauncherState state = TBApplication.state();
if (TBApplication.activityInvalid(mTBLauncherActivity)) {
Log.e(TAG, "[activityInvalid] showKeyboard");
return;
}
if (state.isSearchBarVisible() && PrefCache.modeSearchFullscreen(mPref)) {
showSystemBars();
disableFullscreen();
}
Log.i(TAG, "Keyboard - SHOW");
removeCallback(mOnKeyboardClosedByUser);
dismissPopup();
mSearchEditText.requestFocus();
super.showKeyboard();
}
@Override
public void hideKeyboard() {
if (TBApplication.activityInvalid(mTBLauncherActivity)) {
Log.e(TAG, "[activityInvalid] hideKeyboard");
return;
}
if (TBApplication.state().isSearchBarVisible() && PrefCache.modeSearchFullscreen(mPref)) {
//hideSystemBars();
enableFullscreen(0);
}
Log.i(TAG, "Keyboard - HIDE");
dismissPopup();
View focus = mTBLauncherActivity.getCurrentFocus();
if (focus != null)
focus.clearFocus();
mSearchEditText.clearFocus();
super.hideKeyboard();
}
};
}
private void removeCallback(@NonNull Runnable callback) {
mHandler.removeCallbacks(callback);
}
private void postDelayedCallbackOnce(@NonNull Runnable callback, long delayMillis) {
mHandler.removeCallbacks(callback);
mHandler.postDelayed(callback, delayMillis);
}
private void postDelayedRunnableOnce(@NonNull Runnable runnable, @NonNull Object token, long delayMillis) {
mHandler.removeCallbacksAndMessages(token);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
mHandler.postDelayed(runnable, token, delayMillis);
} else {
Message msg = Message.obtain(mHandler, runnable);
msg.obj = token;
mHandler.sendMessageDelayed(msg, delayMillis);
}
}
public void onCreateActivity(TBLauncherActivity tbLauncherActivity) {
mHandler = new Handler(tbLauncherActivity.getMainLooper());
mTBLauncherActivity = tbLauncherActivity;
mPref = PreferenceManager.getDefaultSharedPreferences(mTBLauncherActivity);
Window window = mTBLauncherActivity.getWindow();
mDecorView = window.getDecorView();
KeyboardTriggerBehaviour keyboardListener = new KeyboardTriggerBehaviour(mTBLauncherActivity);
keyboardListener.observe(mTBLauncherActivity, status -> {
LauncherState state = TBApplication.state();
if (status == KeyboardTriggerBehaviour.Status.CLOSED) {
//-->> keyboard CLOSED event <<--//
boolean keyboardClosedByUser = true;
if (state.getSearchBarVisibility() == LauncherState.AnimatedVisibility.ANIM_TO_VISIBLE) {
Log.i(TAG, "keyboard closed - app start");
// don't call onKeyboardClosed() when we start the app
keyboardClosedByUser = false;
} else if (mKeyboardHandler != null && mKeyboardHandler.mHiddenByScrolling) {
Log.i(TAG, "keyboard closed - scrolling results");
// keyboard closed because the result list was scrolled
keyboardClosedByUser = false;
} else if (isFragmentDialogVisible()) {
Log.i(TAG, "keyboard closed - fragment dialog");
// don't send keyboard close event while we have a dialog open
keyboardClosedByUser = false;
} else if (mKeyboardHandler != null && mKeyboardHandler.mLaunchedApp) {
Log.i(TAG, "keyboard closed - launched app");
// don't send keyboard close event after start intent
keyboardClosedByUser = false;
}
if (keyboardClosedByUser) {
if (mKeyboardHandler != null && mKeyboardHandler.mRequestOpen) {
Log.i(TAG, "keyboard closed - while mRequestOpen true");
mKeyboardHandler.mRequestOpen = false;
} else {
Log.i(TAG, "keyboard closed - user");
// delay keyboard closed event to make sure the keyboard is not just glitching
postDelayedCallbackOnce(mOnKeyboardClosedByUser, UI_ANIMATION_DURATION);
}
}
// collapse search pill
if (state.isSearchBarVisible()) {
int duration = 0;
if (mPref.getBoolean("search-bar-animation", true))
duration = UI_ANIMATION_DURATION;
mTBLauncherActivity.customizeUI.collapseSearchPill(duration);
}
} else {
//-->> keyboard OPEN event <<--//
if (mKeyboardHandler != null) {
// request to open fulfilled
mKeyboardHandler.mRequestOpen = false;
// reset HiddenByScrolling flag when keyboard opens
mKeyboardHandler.mHiddenByScrolling = false;
}
// don't call the keyboard closed event if keyboard opened
removeCallback(mOnKeyboardClosedByUser);
// expand search pill
if (state.isSearchBarVisible()) {
int duration = 0;
if (mPref.getBoolean("search-bar-animation", true))
duration = UI_ANIMATION_DURATION;
mTBLauncherActivity.customizeUI.expandSearchPill(duration);
mSearchEditText.requestFocus();
}
}
});
initResultLayout();
initSearchBarContainer();
// KeyboardHandler needs SearchEditText initialized
mKeyboardHandler = newKeyboardHandler();
mNotificationBackground = findViewById(R.id.notificationBackground);
mWidgetContainer = findViewById(R.id.widgetContainer);
initLauncherButtons();
initLauncherSearchEditText();
}
public void onStart() {
// don't let the close keyboard event trigger
mKeyboardHandler.mLaunchedApp = true;
String initialDesktop = mPref.getString("initial-desktop", null);
if ("none".equals(initialDesktop)) {
if (TBApplication.state().getDesktop() != null) {
return;
}
Log.d(TAG, "desktop is null");
}
if (executeAction(initialDesktop, null))
return;
switchToDesktop(LauncherState.Desktop.EMPTY);
}
private ListPopup getMenuPopup(Context ctx) {
LinearAdapter adapter = new LinearAdapter();
ListPopup menu = ListPopup.create(ctx, adapter);
adapter.add(new LinearAdapter.ItemTitle(ctx, R.string.menu_popup_title));
adapter.add(new LinearAdapter.Item(ctx, R.string.change_wallpaper));
adapter.add(new LinearAdapter.Item(ctx, R.string.menu_widget_add));
if (TBApplication.widgetManager(ctx).widgetCount() > 0)
adapter.add(new LinearAdapter.Item(ctx, R.string.menu_widget_remove));
adapter.add(new LinearAdapter.ItemTitle(ctx, R.string.menu_popup_title_settings));
adapter.add(new LinearAdapter.Item(ctx, R.string.menu_popup_launcher_settings));
adapter.add(new LinearAdapter.Item(ctx, R.string.menu_popup_tags_manager));
adapter.add(new LinearAdapter.Item(ctx, R.string.menu_popup_tags_menu));
adapter.add(new LinearAdapter.Item(ctx, R.string.menu_popup_android_settings));
menu.setOnItemClickListener((a, v, pos) -> {
LinearAdapter.MenuItem item = ((LinearAdapter) a).getItem(pos);
@StringRes int stringId = 0;
if (item instanceof LinearAdapter.Item) {
stringId = ((LinearAdapter.Item) a.getItem(pos)).stringId;
}
Context c = mTBLauncherActivity;
if (stringId == R.string.menu_popup_tags_manager) {
launchTagsManagerDialog(mTBLauncherActivity);
} else if (stringId == R.string.menu_popup_tags_menu) {
executeAction("showTagsMenu", "button-menu");
} else if (stringId == R.string.menu_popup_launcher_settings) {
Intent intent = new Intent(mClearButton.getContext(), SettingsActivity.class);
launchIntent(this, mClearButton, intent);
} else if (stringId == R.string.change_wallpaper) {
Intent intent = new Intent(Intent.ACTION_SET_WALLPAPER);
intent = Intent.createChooser(intent, c.getString(R.string.change_wallpaper));
launchIntent(this, mClearButton, intent);
} else if (stringId == R.string.menu_widget_add) {
TBApplication.widgetManager(c).showSelectWidget(mTBLauncherActivity);
} else if (stringId == R.string.menu_widget_remove) {
TBApplication.widgetManager(c).showRemoveWidgetPopup();
} else if (stringId == R.string.menu_popup_android_settings) {
Intent intent = new Intent(Settings.ACTION_SETTINGS);
launchIntent(this, mClearButton, intent);
}
});
return menu;
}
public void launchIntent(@NonNull View view, @NonNull Intent intent) {
launchIntent(this, view, intent);
}
@SuppressWarnings("TypeParameterUnusedInFormals")
private <T extends View> T findViewById(@IdRes int id) {
return mTBLauncherActivity.findViewById(id);
}
@SuppressWarnings("unchecked")
private <T extends View> T inflateViewStub(@IdRes int id) {
View stub = mTBLauncherActivity.findViewById(id);
return (T) ViewStubPreview.inflateStub(stub);
}
@SuppressWarnings("unchecked")
private <T extends View> T inflateViewStub(@IdRes int id, @LayoutRes int layoutRes) {
View stub = mTBLauncherActivity.findViewById(id);
return (T) ViewStubPreview.inflateStub(stub, layoutRes);
}
private void updateClearButton() {
if (mSearchEditText.getText().length() > 0 || TBApplication.state().isResultListVisible()) {
mClearButton.setVisibility(View.VISIBLE);
mMenuButton.setVisibility(View.INVISIBLE);
} else {
mClearButton.setVisibility(View.INVISIBLE);
mMenuButton.setVisibility(View.VISIBLE);
}
}
public void switchToDesktop(@NonNull LauncherState.Desktop mode) {
// get current mode
@Nullable
LauncherState.Desktop currentMode = TBApplication.state().getDesktop();
Log.d(TAG, "desktop changed " + currentMode + " -> " + mode);
if (mode.equals(currentMode)) {
// no change, maybe refresh?
if (TBApplication.state().isResultListVisible() && mResultAdapter.getItemCount() == 0)
showDesktop(mode);
return;
}
// hide current mode
if (currentMode != null) {
switch (currentMode) {
case SEARCH:
resetTask();
hideSearchBar();
break;
case WIDGET:
hideWidgets();
break;
case EMPTY:
default:
break;
}
}
// show next mode
showDesktop(mode);
}
private void showDesktop(LauncherState.Desktop mode) {
if (TBApplication.activityInvalid(mTBLauncherActivity)) {
Log.e(TAG, "[activityInvalid] showDesktop " + mode);
return;
}
TBApplication.state().setDesktop(mode);
switch (mode) {
case SEARCH:
// show the SearchBar
showSearchBar();
// hide/show result list
final String openResult = PrefCache.modeSearchOpenResult(mPref);
if ("none".equals(openResult)) {
// hide result
hideResultList(false);
} else {
// try to execute the action
postDelayedRunnableOnce(() ->
TBApplication.dataHandler(getContext()).runAfterLoadOver(() -> {
LauncherState state = TBApplication.state();
if (!state.isResultListVisible() && state.getDesktop() == LauncherState.Desktop.SEARCH)
executeAction(openResult, "dm-search-open-result");
}),
mLauncherButton,
KEYBOARD_ANIMATION_DELAY);
}
// hide/show the QuickList
TBApplication.quickList(getContext()).updateVisibility();
// enable/disable fullscreen (status and navigation bar)
if (TBApplication.state().isKeyboardHidden()
&& PrefCache.modeSearchFullscreen(mPref))
enableFullscreen(UI_ANIMATION_DELAY);
else
disableFullscreen();
break;
case WIDGET:
// show widgets
showWidgets();
// hide/show the QuickList
TBApplication.quickList(getContext()).updateVisibility();
// enable/disable fullscreen (status and navigation bar)
if (PrefCache.modeWidgetFullscreen(mPref))
enableFullscreen(UI_ANIMATION_DELAY);
else
disableFullscreen();
break;
case EMPTY:
default:
// hide/show the QuickList
TBApplication.quickList(getContext()).updateVisibility();
// enable/disable fullscreen (status and navigation bar)
if (PrefCache.modeEmptyFullscreen(mPref))
enableFullscreen(UI_ANIMATION_DELAY);
else
disableFullscreen();
break;
}
}
/**
* Hide status and notification bar
*
* @param startDelay milliseconds of delay
*/
private void enableFullscreen(int startDelay) {
boolean animate = !SystemUiVisibility.isFullscreenSet(mDecorView) || TBApplication.state().isNotificationBarVisible();
Log.i(TAG, "enableFullscreen delay=" + startDelay + " anim=" + animate);
// Schedule a runnable to remove the status and navigation bar after a delay
removeCallback(mShowPart2Runnable);
postDelayedCallbackOnce(mHidePart2Runnable, startDelay);
// hide notification background
final int statusHeight = UISizes.getStatusBarSize(getContext());
if (TBApplication.state().getNotificationBarVisibility() != LauncherState.AnimatedVisibility.ANIM_TO_HIDDEN)
mNotificationBackground.animate().cancel();
if (animate) {
mNotificationBackground.animate()
.translationY(-statusHeight)
.setStartDelay(startDelay)
.setDuration(UI_ANIMATION_DURATION)
.setInterpolator(new AccelerateInterpolator())
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
TBApplication.state().setNotificationBar(LauncherState.AnimatedVisibility.ANIM_TO_HIDDEN);
}
@Override
public void onAnimationEnd(Animator animation) {
TBApplication.state().setNotificationBar(LauncherState.AnimatedVisibility.HIDDEN);
}
})
.start();
} else {
TBApplication.state().setNotificationBar(LauncherState.AnimatedVisibility.HIDDEN);
mNotificationBackground.setTranslationY(-statusHeight);
}
}
/**
* Show status and notification bar
*/
private void disableFullscreen() {
boolean animate = SystemUiVisibility.isFullscreenSet(mDecorView) || !TBApplication.state().isNotificationBarVisible();
// Schedule a runnable to display UI elements after a delay
removeCallback(mHidePart2Runnable);
postDelayedCallbackOnce(mShowPart2Runnable, UI_ANIMATION_DELAY);
// show notification background
final int statusHeight = UISizes.getStatusBarSize(getContext());
if (!TBApplication.state().isNotificationBarVisible())
mNotificationBackground.setTranslationY(-statusHeight);
if (TBApplication.state().getNotificationBarVisibility() != LauncherState.AnimatedVisibility.ANIM_TO_VISIBLE)
mNotificationBackground.animate().cancel();
if (animate) {
mNotificationBackground.animate()
.translationY(0f)
.setStartDelay(0)
.setDuration(UI_ANIMATION_DURATION)
.setInterpolator(new LinearInterpolator())
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
TBApplication.state().setNotificationBar(LauncherState.AnimatedVisibility.ANIM_TO_VISIBLE);
}
@Override
public void onAnimationEnd(Animator animation) {
TBApplication.state().setNotificationBar(LauncherState.AnimatedVisibility.VISIBLE);
}
})
.start();
} else {
TBApplication.state().setNotificationBar(LauncherState.AnimatedVisibility.VISIBLE);
mNotificationBackground.setTranslationY(0f);
}
}
private void showSearchBar() {
mSearchEditText.setEnabled(true);
setSearchHint();
UITheme.applySearchBarTextShadow(mSearchEditText);
if (TBApplication.state().getSearchBarVisibility() != LauncherState.AnimatedVisibility.ANIM_TO_VISIBLE)
mSearchBarContainer.animate().cancel();
mSearchBarContainer.setVisibility(View.VISIBLE);
mSearchBarContainer.animate()
.setStartDelay(0)
.alpha(1f)
.translationY(0f)
.setDuration(UI_ANIMATION_DURATION)
.setInterpolator(new DecelerateInterpolator())
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
TBApplication.state().setSearchBar(LauncherState.AnimatedVisibility.ANIM_TO_VISIBLE);
}
@Override
public void onAnimationEnd(Animator animation) {
LauncherState state = TBApplication.state();
state.setSearchBar(LauncherState.AnimatedVisibility.VISIBLE);
if (PrefCache.linkKeyboardAndSearchBar(mPref))
showKeyboard();
else {
// sync keyboard state
state.syncKeyboardVisibility(mSearchEditText);
}
}
})
.start();
mSearchEditText.requestFocus();
}
private void hideWidgets() {
TBApplication.state().setWidgetScreen(LauncherState.AnimatedVisibility.HIDDEN);
mWidgetContainer.setVisibility(View.GONE);
}
private void hideSearchBar() {
boolean animate = !TBApplication.state().isSearchBarVisible();
hideSearchBar(animate);
}
private void hideSearchBar(boolean animate) {
clearSearchText();
clearAdapter();
if (mSearchBarContainer.getVisibility() == View.VISIBLE) {
final float translationY;
if (PrefCache.searchBarAtBottom(mPref))
translationY = mSearchBarContainer.getHeight() * 2f;
else
translationY = mSearchBarContainer.getHeight() * -2f;
if (TBApplication.state().getSearchBarVisibility() != LauncherState.AnimatedVisibility.ANIM_TO_HIDDEN)
mSearchBarContainer.animate().cancel();
if (animate) {
mSearchBarContainer.setTranslationY(0f);
mSearchBarContainer.animate()
.alpha(0f)
.translationY(translationY)
.setDuration(UI_ANIMATION_DURATION)
.setInterpolator(new AccelerateInterpolator())
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
TBApplication.state().setSearchBar(LauncherState.AnimatedVisibility.ANIM_TO_HIDDEN);
}
@Override
public void onAnimationEnd(Animator animation) {
TBApplication.state().setSearchBar(LauncherState.AnimatedVisibility.HIDDEN);
mSearchBarContainer.setVisibility(View.GONE);
}
})
.start();
} else {
TBApplication.state().setSearchBar(LauncherState.AnimatedVisibility.HIDDEN);
mSearchBarContainer.setAlpha(0f);
mSearchBarContainer.setTranslationY(translationY);
mSearchBarContainer.setVisibility(View.GONE);
}
} else {
Log.d(TAG, "mSearchBarContainer not VISIBLE, setting state to HIDDEN");
TBApplication.state().setResultList(LauncherState.AnimatedVisibility.HIDDEN);
}
if (PrefCache.linkKeyboardAndSearchBar(mPref))
hideKeyboard();
// disabling mSearchEditText will most probably also close the keyboard
mSearchEditText.setEnabled(false);
}
private void showWidgets() {
boolean animate = !TBApplication.state().isWidgetScreenVisible();
showWidgets(animate);
}
private void showWidgets(boolean animate) {
if (TBApplication.state().getWidgetScreenVisibility() != LauncherState.AnimatedVisibility.ANIM_TO_VISIBLE)
mSearchBarContainer.animate().cancel();
mWidgetContainer.setVisibility(View.VISIBLE);
if (animate) {
mWidgetContainer.setAlpha(0f);
mWidgetContainer.animate()
.setStartDelay(UI_ANIMATION_DURATION)
.alpha(1f)
.setDuration(UI_ANIMATION_DURATION)
.setInterpolator(new DecelerateInterpolator())
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
TBApplication.state().setWidgetScreen(LauncherState.AnimatedVisibility.ANIM_TO_VISIBLE);
}
@Override
public void onAnimationEnd(Animator animation) {
TBApplication.state().setWidgetScreen(LauncherState.AnimatedVisibility.VISIBLE);
}
})
.start();
} else {
mWidgetContainer.animate().cancel();
TBApplication.state().setWidgetScreen(LauncherState.AnimatedVisibility.VISIBLE);
mWidgetContainer.setAlpha(1f);
}
hideResultList(animate);
}
public void showKeyboard() {
mKeyboardHandler.mRequestOpen = true;
mKeyboardHandler.showKeyboard();
// UI_ANIMATION_DURATION should be the exact time the full-screen animation ends
postDelayedCallbackOnce(mShowKeyboardRunnable, UI_ANIMATION_DELAY);
}
public void hideKeyboard() {
mKeyboardHandler.mRequestOpen = false;
removeCallback(mShowKeyboardRunnable);
mKeyboardHandler.hideKeyboard();
}
@Override
public void displayLoader(boolean running) {
if (mLauncherButton == null)
return;
Drawable loadingDrawable = mLauncherButton.getDrawable();
if (loadingDrawable instanceof Animatable) {
if (running)
((Animatable) loadingDrawable).start();
else
((Animatable) loadingDrawable).stop();
}
}
@NonNull
@Override
public Context getContext() {
return mTBLauncherActivity;
}
@Override
public void resetTask() {
TBApplication.resetTask(getContext());
}
@Override
public void clearAdapter() {
mResultAdapter.clear();
TBApplication.quickList(getContext()).adapterCleared();
if (TBApplication.state().isResultListVisible())
hideResultList(true);
updateClearButton();
}
public boolean showProviderEntries(@Nullable IProvider<?> provider) {
return showProviderEntries(provider, null);
}
public boolean showProviderEntries(@Nullable IProvider<?> provider, @Nullable java.util.Comparator<? super EntryItem> comparator) {
if (TBApplication.state().getDesktop() != LauncherState.Desktop.SEARCH) {
// TODO: switchToDesktop might show the result list, we may need to prevent this as an optimization
switchToDesktop(LauncherState.Desktop.SEARCH);
clearAdapter();
}
List<? extends EntryItem> entries = provider != null ? provider.getPojos() : null;
if (entries != null && entries.size() > 0) {
// reset relevance. This is normally done by a Searcher.
for (EntryItem entry : entries)
entry.resetResultInfo();
// // copy list in order to change it
// entries = new ArrayList<>(entries);
// // remove actions and filters from the result list
// for (Iterator<? extends EntryItem> iterator = entries.iterator(); iterator.hasNext(); ) {
// EntryItem entry = iterator.next();
// if (entry instanceof FilterEntry)
// iterator.remove();
// }
if (comparator != null) {
// copy list in order to change it
entries = new ArrayList<>(entries);
//TODO: do we need this on another thread?
Collections.sort(entries, comparator);
}
updateAdapter(entries, false);
return true;
}
return false;
}
@Override
public void updateAdapter(@NonNull List<? extends EntryItem> results, boolean isRefresh) {
Log.d(TAG, "updateAdapter " + results.size() + " result(s); isRefresh=" + isRefresh);
if (!isFragmentDialogVisible()) {
LauncherState state = TBApplication.state();
if (!state.isResultListVisible() && state.getDesktop() == LauncherState.Desktop.SEARCH)
showResultList(false);
}
mResultAdapter.updateItems(results);
if (!isRefresh) {
// Make sure the first item is visible when we search
mResultList.scrollToFirstItem();
}
mTBLauncherActivity.quickList.adapterUpdated();
mClearButton.setVisibility(View.VISIBLE);
mMenuButton.setVisibility(View.INVISIBLE);
if (mLaunchMostRelevantResult) {
mLaunchMostRelevantResult = false;
// get any view
View view = mResultList.getLayoutManager() != null ? mResultList.getLayoutManager().getChildAt(0) : null;
final int mostRelevantIdx = mResultList.getAdapterFirstItemIdx();
// try to get view of the most relevant item from adapter
if (mostRelevantIdx >= 0 && mostRelevantIdx < mResultAdapter.getItemCount()) {
RecyclerView.ViewHolder holder = mResultList.findViewHolderForAdapterPosition(mostRelevantIdx);
if (holder != null)
view = holder.itemView;
}
if (view != null)
mResultAdapter.onClick(mostRelevantIdx, view);
}
}
@Override
public void removeResult(@NonNull EntryItem result) {
// Do not reset scroll, we want the remaining items to still be in view
mResultAdapter.removeItem(result);
}
@Override
public void filterResults(String text) {
mResultAdapter.getFilter().filter(text);
}
public void handleRemoveApp(String packageName) {
int count = mResultAdapter.getItemCount();
for (int idx = count - 1; idx >= 0; idx -= 1) {
EntryItem entryItem = mResultAdapter.getItem(idx);
if (entryItem.id.contains(packageName))
removeResult(entryItem);
}
}
public void runSearcher(@NonNull String query, @NonNull Class<? extends Searcher> searcherClass) {
if (TBApplication.state().getDesktop() != LauncherState.Desktop.SEARCH) {
// TODO: switchToDesktop might show the result list, we may need to prevent this as an optimization
switchToDesktop(LauncherState.Desktop.
gitextract_ggifh6nm/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ ├── dependabot.yml │ └── workflows/ │ ├── android.yml │ ├── deploy.yml │ └── release.yml ├── .gitignore ├── .idea/ │ ├── codeStyles/ │ │ ├── Project.xml │ │ └── codeStyleConfig.xml │ ├── compiler.xml │ ├── google-java-format.xml │ ├── inspectionProfiles/ │ │ └── Project_Default.xml │ ├── jarRepositories.xml │ ├── migrations.xml │ ├── palantir-java-format.xml │ └── render.experimental.xml ├── Gemfile ├── LICENSE.md ├── Privacy-Policy.md ├── README.md ├── _config.yml ├── _layouts/ │ ├── default.html │ └── simple.html ├── app/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ ├── net/ │ │ │ └── mm2d/ │ │ │ └── color/ │ │ │ └── chooser/ │ │ │ ├── ColorChooserDialog.kt │ │ │ ├── ColorChooserView.kt │ │ │ ├── ColorLiveDataOwner.kt │ │ │ ├── ColorObserverDelegate.kt │ │ │ ├── ControlView.kt │ │ │ ├── HsvView.kt │ │ │ ├── PaletteView.kt │ │ │ ├── SliderView.kt │ │ │ ├── ViewPagerAdapter.kt │ │ │ ├── element/ │ │ │ │ ├── ColorSliderView.kt │ │ │ │ ├── HueView.kt │ │ │ │ ├── PaletteCell.kt │ │ │ │ ├── PreviewView.kt │ │ │ │ └── SvView.kt │ │ │ └── util/ │ │ │ ├── AttrExtentions.kt │ │ │ ├── CanvasExtensions.kt │ │ │ ├── ColorUtils.kt │ │ │ └── ResourceExtensions.kt │ │ └── rocks/ │ │ └── tbog/ │ │ └── tblauncher/ │ │ ├── Behaviour.java │ │ ├── CustomizeUI.java │ │ ├── DeviceAdmin.java │ │ ├── DrawableCache.java │ │ ├── DummyLauncherActivity.java │ │ ├── EditTagsDialog.java │ │ ├── LauncherState.java │ │ ├── LiveWallpaper.java │ │ ├── MimeTypeCache.java │ │ ├── Permission.java │ │ ├── PermissionsManager.java │ │ ├── PinShortcutConfirm.java │ │ ├── SettingsActivity.java │ │ ├── TBApplication.java │ │ ├── TBLauncherActivity.java │ │ ├── TagsManager.java │ │ ├── WallpaperSnapAnim.java │ │ ├── WorkAsync/ │ │ │ ├── AsyncTask.java │ │ │ ├── RunnableTask.java │ │ │ └── TaskRunner.java │ │ ├── broadcast/ │ │ │ ├── IncomingCallHandler.java │ │ │ ├── LocaleChangedReceiver.java │ │ │ └── PackageAddedRemovedHandler.java │ │ ├── calculator/ │ │ │ ├── Calculator.java │ │ │ ├── Result.java │ │ │ ├── ShuntingYard.java │ │ │ └── Tokenizer.java │ │ ├── customicon/ │ │ │ ├── ButtonHelper.java │ │ │ ├── CustomShapePage.java │ │ │ ├── DefaultButtonPage.java │ │ │ ├── IconAdapter.java │ │ │ ├── IconData.java │ │ │ ├── IconPackPage.java │ │ │ ├── IconSelectDialog.java │ │ │ ├── IconViewHolder.java │ │ │ ├── PageAdapter.java │ │ │ ├── ShortcutPage.java │ │ │ ├── StaticEntryPage.java │ │ │ └── SystemPage.java │ │ ├── dataprovider/ │ │ │ ├── ActionProvider.java │ │ │ ├── AppCacheProvider.java │ │ │ ├── AppProvider.java │ │ │ ├── CalculatorProvider.java │ │ │ ├── ContactsProvider.java │ │ │ ├── DBProvider.java │ │ │ ├── DialProvider.java │ │ │ ├── EntryToResultUtils.java │ │ │ ├── FilterProvider.java │ │ │ ├── IProvider.java │ │ │ ├── ModProvider.java │ │ │ ├── Provider.java │ │ │ ├── QuickListProvider.java │ │ │ ├── SearchProvider.java │ │ │ ├── ShortcutsProvider.java │ │ │ ├── SimpleProvider.java │ │ │ ├── TagsProvider.java │ │ │ └── UpdateFromModsLoader.java │ │ ├── db/ │ │ │ ├── AppRecord.java │ │ │ ├── DB.java │ │ │ ├── DBHelper.java │ │ │ ├── ExportedData.java │ │ │ ├── FlagsRecord.java │ │ │ ├── ModRecord.java │ │ │ ├── PlaceholderWidgetRecord.java │ │ │ ├── ShortcutRecord.java │ │ │ ├── ValuedHistoryRecord.java │ │ │ ├── WidgetRecord.java │ │ │ ├── XmlExport.java │ │ │ └── XmlImport.java │ │ ├── drawable/ │ │ │ ├── CodePointDrawable.java │ │ │ ├── DrawableUtils.java │ │ │ ├── FourCodePointDrawable.java │ │ │ ├── LoadingDrawable.java │ │ │ ├── SizeWrappedDrawable.java │ │ │ ├── SquareDrawable.java │ │ │ ├── TextDrawable.java │ │ │ └── TwoCodePointDrawable.java │ │ ├── entry/ │ │ │ ├── ActionEntry.java │ │ │ ├── AppEntry.java │ │ │ ├── CalculatorEntry.java │ │ │ ├── ContactEntry.java │ │ │ ├── DialContactEntry.java │ │ │ ├── EntryItem.java │ │ │ ├── EntryWithTags.java │ │ │ ├── FilterEntry.java │ │ │ ├── ICustomIconEntry.java │ │ │ ├── OpenUrlEntry.java │ │ │ ├── PlaceholderEntry.java │ │ │ ├── ResultRelevance.java │ │ │ ├── SearchEngineEntry.java │ │ │ ├── SearchEntry.java │ │ │ ├── ShortcutEntry.java │ │ │ ├── StaticEntry.java │ │ │ ├── TagEntry.java │ │ │ └── UrlEntry.java │ │ ├── handler/ │ │ │ ├── AppsHandler.java │ │ │ ├── DataHandler.java │ │ │ ├── IconsHandler.java │ │ │ └── TagsHandler.java │ │ ├── icons/ │ │ │ ├── CalendarDrawable.java │ │ │ ├── DrawableInfo.java │ │ │ ├── IconPack.java │ │ │ ├── IconPackCache.java │ │ │ ├── IconPackXML.java │ │ │ ├── LazyLoadDrawable.java │ │ │ ├── SimpleDrawable.java │ │ │ └── SystemIconPack.java │ │ ├── loader/ │ │ │ ├── LoadAppEntry.java │ │ │ ├── LoadCacheApps.java │ │ │ ├── LoadContactsEntry.java │ │ │ ├── LoadEntryItem.java │ │ │ └── LoadShortcutsEntryItem.java │ │ ├── normalizer/ │ │ │ ├── IntSequenceBuilder.java │ │ │ ├── PhoneNormalizer.java │ │ │ └── StringNormalizer.java │ │ ├── preference/ │ │ │ ├── BaseListPreferenceDialog.java │ │ │ ├── BaseMultiSelectListPreferenceDialog.java │ │ │ ├── BasePreferenceDialog.java │ │ │ ├── ConfirmDialog.java │ │ │ ├── ContentLoadHelper.java │ │ │ ├── CustomDialogPreference.java │ │ │ ├── EditAddResetEditor.java │ │ │ ├── EditAddResetPreferenceDialog.java │ │ │ ├── EditSearchEnginesPreferenceDialog.java │ │ │ ├── EditSearchHintPreferenceDialog.java │ │ │ ├── IconListPreferenceDialog.java │ │ │ ├── MarginDialog.java │ │ │ ├── MultiDependencies.java │ │ │ ├── MultiDependenciesSwitchPreference.java │ │ │ ├── OrderListPreferenceDialog.java │ │ │ ├── PreferenceColorDialog.java │ │ │ ├── PreviewImagePreference.java │ │ │ ├── QuickListPreferenceDialog.java │ │ │ ├── SeekBarChangeListener.java │ │ │ ├── ShadowDialog.java │ │ │ ├── SliderDialog.java │ │ │ └── TagOrderListPreferenceDialog.java │ │ ├── quicklist/ │ │ │ ├── DockRecycleLayoutManager.java │ │ │ ├── DragAndDropInfo.java │ │ │ ├── EditQuickList.java │ │ │ ├── EditQuickListDialog.java │ │ │ ├── PagedScrollListener.java │ │ │ ├── QuickList.java │ │ │ ├── RecycleAdapter.java │ │ │ └── ViewPagerAdapter.java │ │ ├── result/ │ │ │ ├── AsyncSetEntryDrawable.java │ │ │ ├── CustomRecycleLayoutManager.java │ │ │ ├── EntryAdapter.java │ │ │ ├── LoadDataForAdapter.java │ │ │ ├── RecycleAdapter.java │ │ │ ├── RecycleAdapterBase.java │ │ │ ├── RecycleScrollListener.java │ │ │ ├── ResultHelper.java │ │ │ ├── ResultItemDecoration.java │ │ │ ├── ResultViewHelper.java │ │ │ └── ReversibleAdapterRecyclerLayoutManager.java │ │ ├── searcher/ │ │ │ ├── HistorySearcher.java │ │ │ ├── ISearchActivity.java │ │ │ ├── ISearcher.java │ │ │ ├── QuerySearcher.java │ │ │ ├── ResultBuffer.java │ │ │ ├── Searcher.java │ │ │ ├── TagList.java │ │ │ └── TagSearcher.java │ │ ├── shortcut/ │ │ │ ├── SaveSingleOreoShortcutAsync.java │ │ │ └── ShortcutUtil.java │ │ ├── ui/ │ │ │ ├── BlockableListView.java │ │ │ ├── BottomPullEffectView.java │ │ │ ├── CenteredImageSpan.java │ │ │ ├── CustomizeMarginView.java │ │ │ ├── CustomizeShadowView.java │ │ │ ├── CutoutFactory.java │ │ │ ├── DialogFragment.java │ │ │ ├── DialogWrapper.java │ │ │ ├── ICutout.java │ │ │ ├── KeyboardHandler.java │ │ │ ├── LinearAdapter.java │ │ │ ├── LinearAdapterPlus.java │ │ │ ├── ListPopup.java │ │ │ ├── RecyclerList.java │ │ │ ├── SearchEditText.java │ │ │ ├── SquareImageView.java │ │ │ ├── TagsMenuUtils.java │ │ │ ├── ViewStubPreview.java │ │ │ ├── WindowInsetsHelper.java │ │ │ └── dialog/ │ │ │ ├── ConfirmDialog.java │ │ │ ├── EditTextDialog.java │ │ │ ├── PleaseWaitDialog.java │ │ │ └── TagsManagerDialog.java │ │ ├── utils/ │ │ │ ├── ArrayHelper.java │ │ │ ├── ClipboardUtils.java │ │ │ ├── ColorFilterHelper.java │ │ │ ├── DebugInfo.java │ │ │ ├── DebugString.java │ │ │ ├── DeviceUtils.java │ │ │ ├── DialogHelper.java │ │ │ ├── EdgeGlowHelper.java │ │ │ ├── FileUtils.java │ │ │ ├── FuzzyScore.java │ │ │ ├── GestureDetectorHelper.java │ │ │ ├── GoogleCalendarIcon.java │ │ │ ├── ISparseArray.java │ │ │ ├── KeyboardToggleHelper.java │ │ │ ├── KeyboardTriggerBehaviour.java │ │ │ ├── MapCompat.java │ │ │ ├── MimeTypeUtils.java │ │ │ ├── PackageManagerUtils.java │ │ │ ├── PrefCache.java │ │ │ ├── PrefOrderedListHelper.java │ │ │ ├── RootHandler.java │ │ │ ├── SimpleTextWatcher.java │ │ │ ├── SimpleXmlWriter.java │ │ │ ├── SparseArrayWrapper.java │ │ │ ├── SystemUiVisibility.java │ │ │ ├── Timer.java │ │ │ ├── UIColors.java │ │ │ ├── UISizes.java │ │ │ ├── UITheme.java │ │ │ ├── UserHandleCompat.java │ │ │ ├── Utilities.java │ │ │ ├── ViewHolderAdapter.java │ │ │ └── ViewHolderListAdapter.java │ │ └── widgets/ │ │ ├── ItemTitle.java │ │ ├── ItemWidget.java │ │ ├── LoadWidgetsAsync.java │ │ ├── MenuItem.java │ │ ├── PickAppWidgetActivity.java │ │ ├── WidgetInfo.java │ │ ├── WidgetLayout.java │ │ ├── WidgetListAdapter.java │ │ ├── WidgetManager.java │ │ └── WidgetView.java │ └── res/ │ ├── anim/ │ │ ├── popup_in_bottom.xml │ │ ├── popup_in_top.xml │ │ └── popup_out.xml │ ├── color/ │ │ ├── accent_text_selector.xml │ │ ├── accent_text_selector_black.xml │ │ ├── accent_text_selector_deep_blues.xml │ │ ├── accent_text_selector_white.xml │ │ ├── primary_text_selector_darkbg.xml │ │ ├── primary_text_selector_lightbg.xml │ │ ├── secondary_text_selector_darkbg.xml │ │ ├── settings_primary_selector_black.xml │ │ ├── settings_primary_selector_darkbg.xml │ │ ├── settings_primary_selector_deep_blues.xml │ │ ├── settings_primary_selector_default.xml │ │ ├── settings_primary_selector_lightbg.xml │ │ ├── settings_secondary_selector_black.xml │ │ ├── settings_secondary_selector_deep_blues.xml │ │ ├── settings_secondary_selector_default.xml │ │ └── settings_secondary_selector_lightbg.xml │ ├── drawable/ │ │ ├── button_bar_background.xml │ │ ├── button_bar_background_deep_blues.xml │ │ ├── button_bar_background_default.xml │ │ ├── button_bar_background_light.xml │ │ ├── dialog_background.xml │ │ ├── dialog_background_black.xml │ │ ├── dialog_background_dark.xml │ │ ├── dialog_background_deep_blues.xml │ │ ├── dialog_background_default.xml │ │ ├── dialog_background_light.xml │ │ ├── handle_background.xml │ │ ├── ic_add_tag.xml │ │ ├── ic_android.xml │ │ ├── ic_apps.xml │ │ ├── ic_apps_grid_az.xml │ │ ├── ic_apps_grid_za.xml │ │ ├── ic_apps_list_az.xml │ │ ├── ic_apps_list_za.xml │ │ ├── ic_arrow_back.xml │ │ ├── ic_backup.xml │ │ ├── ic_behaviour.xml │ │ ├── ic_browse_add_icon.xml │ │ ├── ic_bug.xml │ │ ├── ic_clear.xml │ │ ├── ic_contact_placeholder.xml │ │ ├── ic_contacts.xml │ │ ├── ic_contacts_az.xml │ │ ├── ic_contacts_za.xml │ │ ├── ic_dots.xml │ │ ├── ic_edit.xml │ │ ├── ic_eye_crossed.xml │ │ ├── ic_favorites.xml │ │ ├── ic_features.xml │ │ ├── ic_functions.xml │ │ ├── ic_gesture.xml │ │ ├── ic_grid.xml │ │ ├── ic_handle_move.xml │ │ ├── ic_handle_resize_bl.xml │ │ ├── ic_handle_resize_l.xml │ │ ├── ic_history.xml │ │ ├── ic_icon.xml │ │ ├── ic_keyboard.xml │ │ ├── ic_list.xml │ │ ├── ic_loading_arrows.xml │ │ ├── ic_loading_pulse.xml │ │ ├── ic_memory.xml │ │ ├── ic_message.xml │ │ ├── ic_phone.xml │ │ ├── ic_phone_ui.xml │ │ ├── ic_popup.xml │ │ ├── ic_quick.xml │ │ ├── ic_refresh.xml │ │ ├── ic_remove_tag.xml │ │ ├── ic_search.xml │ │ ├── ic_search_bar.xml │ │ ├── ic_send.xml │ │ ├── ic_settings.xml │ │ ├── ic_shortcuts.xml │ │ ├── ic_shortcuts_az.xml │ │ ├── ic_shortcuts_za.xml │ │ ├── ic_tags.xml │ │ ├── ic_undo.xml │ │ ├── ic_untagged.xml │ │ ├── ic_wallpaper.xml │ │ ├── launcher_pill.xml │ │ ├── launcher_pill_background.xml │ │ ├── launcher_white.xml │ │ ├── list_separator_dark.xml │ │ ├── list_separator_deep_blues.xml │ │ ├── list_separator_default.xml │ │ ├── list_separator_light.xml │ │ ├── mm2d_cc_ic_check.xml │ │ ├── notification_bar_background.xml │ │ ├── notification_dot.xml │ │ ├── popup_background.xml │ │ ├── tab_background_black.xml │ │ ├── tab_background_deep_blues.xml │ │ ├── tab_background_default.xml │ │ ├── tab_background_light.xml │ │ ├── window_title_background.xml │ │ ├── window_title_background_deep_blues.xml │ │ ├── window_title_background_default.xml │ │ └── window_title_background_light.xml │ ├── drawable-v23/ │ │ ├── button_bar_background.xml │ │ └── window_title_background.xml │ ├── layout/ │ │ ├── activity_fullscreen.xml │ │ ├── activity_settings.xml │ │ ├── add_search_engine.xml │ │ ├── add_search_hint.xml │ │ ├── custom_icon_item.xml │ │ ├── dialog_custom_shape_icon_select_page.xml │ │ ├── dialog_edit_tags.xml │ │ ├── dialog_icon_select.xml │ │ ├── dialog_icon_select_page.xml │ │ ├── dialog_preference_color_chooser.xml │ │ ├── dialog_rename.xml │ │ ├── dialog_title.xml │ │ ├── edit_search_engines.xml │ │ ├── edit_tag_item.xml │ │ ├── item_app.xml │ │ ├── item_builtin.xml │ │ ├── item_contact.xml │ │ ├── item_dock.xml │ │ ├── item_dock_shortcut.xml │ │ ├── item_grid.xml │ │ ├── item_grid_shortcut.xml │ │ ├── item_shortcut.xml │ │ ├── mm2d_cc_color_chooser.xml │ │ ├── mm2d_cc_item_palette.xml │ │ ├── mm2d_cc_view_control.xml │ │ ├── mm2d_cc_view_dialog.xml │ │ ├── mm2d_cc_view_hsv.xml │ │ ├── mm2d_cc_view_slider.xml │ │ ├── ok_cancel_button_bar.xml │ │ ├── order_list_item.xml │ │ ├── pin_shortcut_confirm.xml │ │ ├── popup_divider.xml │ │ ├── popup_list_item.xml │ │ ├── popup_list_item_icon.xml │ │ ├── popup_list_text.xml │ │ ├── popup_title.xml │ │ ├── pref_alpha_preview.xml │ │ ├── pref_amount_preview.xml │ │ ├── pref_color_preview.xml │ │ ├── pref_confirm.xml │ │ ├── pref_margin_offset.xml │ │ ├── pref_matrix_preview.xml │ │ ├── pref_offset_preview.xml │ │ ├── pref_shadow.xml │ │ ├── pref_shadow_preview.xml │ │ ├── pref_size_preview.xml │ │ ├── pref_slider.xml │ │ ├── preference_switch.xml │ │ ├── quick_list.xml │ │ ├── quick_list_editor.xml │ │ ├── quick_list_editor_page.xml │ │ ├── result_list.xml │ │ ├── search_bar.xml │ │ ├── search_pill.xml │ │ ├── tags_manager.xml │ │ ├── tags_manager_item.xml │ │ ├── tags_manager_item_deleted.xml │ │ ├── widget_handle.xml │ │ ├── widget_picker.xml │ │ └── widget_placeholder.xml │ ├── mipmap-anydpi-v26/ │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ ├── values/ │ │ ├── arrays.xml │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── default_tags.xml │ │ ├── dimens.xml │ │ ├── ids.xml │ │ ├── pref_default.xml │ │ ├── strings.xml │ │ ├── styles.xml │ │ └── themes.xml │ ├── values-de/ │ │ └── strings.xml │ ├── values-de-v26/ │ │ └── strings.xml │ ├── values-fr/ │ │ └── strings.xml │ ├── values-fr-v26/ │ │ └── strings.xml │ ├── values-h400dp/ │ │ └── dimens.xml │ ├── values-in/ │ │ └── strings.xml │ ├── values-it/ │ │ └── strings.xml │ ├── values-it-v26/ │ │ └── strings.xml │ ├── values-ja/ │ │ └── strings.xml │ ├── values-nb-rNO/ │ │ └── strings.xml │ ├── values-nb-rNO-v26/ │ │ └── strings.xml │ ├── values-pl/ │ │ └── strings.xml │ ├── values-pl-v26/ │ │ └── strings.xml │ ├── values-pt/ │ │ └── strings.xml │ ├── values-pt-rBR/ │ │ └── strings.xml │ ├── values-pt-rBR-v26/ │ │ └── strings.xml │ ├── values-pt-rPT/ │ │ └── strings.xml │ ├── values-pt-rPT-v26/ │ │ └── strings.xml │ ├── values-ro/ │ │ └── strings.xml │ ├── values-ro-v26/ │ │ └── strings.xml │ ├── values-ru/ │ │ └── strings.xml │ ├── values-tr/ │ │ └── strings.xml │ ├── values-tr-v26/ │ │ └── strings.xml │ ├── values-v21/ │ │ └── pref_default.xml │ ├── values-v26/ │ │ └── strings.xml │ ├── values-zh-rCN/ │ │ └── strings.xml │ └── xml/ │ ├── backup_descriptor.xml │ ├── data_extraction_rules.xml │ ├── file_paths.xml │ ├── policies.xml │ ├── preference_features.xml │ ├── preferences.xml │ └── search_pill_scene.xml ├── build.gradle ├── fastlane/ │ ├── Appfile │ ├── Fastfile │ ├── README.md │ └── metadata/ │ └── android/ │ ├── de-DE/ │ │ ├── changelogs/ │ │ │ └── 40.txt │ │ ├── full_description.txt │ │ ├── short_description.txt │ │ └── title.txt │ ├── en-US/ │ │ ├── changelogs/ │ │ │ ├── 31.txt │ │ │ ├── 32.txt │ │ │ ├── 33.txt │ │ │ ├── 34.txt │ │ │ ├── 35.txt │ │ │ ├── 36.txt │ │ │ ├── 37.txt │ │ │ ├── 38.txt │ │ │ ├── 39.txt │ │ │ ├── 40.txt │ │ │ ├── 41.txt │ │ │ ├── 42.txt │ │ │ └── 43.txt │ │ ├── full_description.txt │ │ ├── short_description.txt │ │ ├── title.txt │ │ └── video.txt │ ├── fr/ │ │ ├── changelogs/ │ │ │ ├── 31.txt │ │ │ ├── 32.txt │ │ │ ├── 33.txt │ │ │ ├── 34.txt │ │ │ ├── 35.txt │ │ │ └── 36.txt │ │ ├── full_description.txt │ │ ├── short_description.txt │ │ └── title.txt │ ├── nb-NO/ │ │ ├── full_description.txt │ │ ├── short_description.txt │ │ └── title.txt │ ├── nb_NO-V26/ │ │ └── title.txt │ ├── pt-BR/ │ │ ├── changelogs/ │ │ │ └── 31.txt │ │ ├── full_description.txt │ │ ├── short_description.txt │ │ └── title.txt │ ├── pt-PT/ │ │ ├── changelogs/ │ │ │ ├── 31.txt │ │ │ ├── 36.txt │ │ │ └── 40.txt │ │ ├── short_description.txt │ │ └── title.txt │ ├── ro/ │ │ └── title.txt │ └── tr/ │ ├── changelogs/ │ │ ├── 36.txt │ │ ├── 39.txt │ │ └── 40.txt │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle
Showing preview only (267K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3177 symbols across 232 files)
FILE: app/src/main/java/rocks/tbog/tblauncher/Behaviour.java
class Behaviour (line 100) | public class Behaviour implements ISearchActivity {
method run (line 124) | @Override
method afterTextChanged (line 141) | public void afterTextChanged(Editable s) {
method beforeTextChanged (line 163) | public void beforeTextChanged(CharSequence s, int start, int count, in...
method onTextChanged (line 167) | public void onTextChanged(CharSequence s, int start, int before, int c...
method run (line 175) | @Override
method run (line 192) | @Override
method launchIntent (line 228) | private static void launchIntent(@NonNull Behaviour behaviour, @NonNul...
method initResultLayout (line 245) | private void initResultLayout() {
method initSearchBarContainer (line 278) | private void initSearchBarContainer() {
method initLauncherButtons (line 297) | private void initLauncherButtons() {
method setSearchHint (line 347) | private void setSearchHint() {
method initLauncherSearchEditText (line 360) | private void initLauncherSearchEditText() {
method newKeyboardHandler (line 405) | private KeyboardToggleHelper newKeyboardHandler() {
method removeCallback (line 453) | private void removeCallback(@NonNull Runnable callback) {
method postDelayedCallbackOnce (line 457) | private void postDelayedCallbackOnce(@NonNull Runnable callback, long ...
method postDelayedRunnableOnce (line 462) | private void postDelayedRunnableOnce(@NonNull Runnable runnable, @NonN...
method onCreateActivity (line 473) | public void onCreateActivity(TBLauncherActivity tbLauncherActivity) {
method onStart (line 559) | public void onStart() {
method getMenuPopup (line 575) | private ListPopup getMenuPopup(Context ctx) {
method launchIntent (line 621) | public void launchIntent(@NonNull View view, @NonNull Intent intent) {
method findViewById (line 625) | @SuppressWarnings("TypeParameterUnusedInFormals")
method inflateViewStub (line 630) | @SuppressWarnings("unchecked")
method inflateViewStub (line 636) | @SuppressWarnings("unchecked")
method updateClearButton (line 642) | private void updateClearButton() {
method switchToDesktop (line 652) | public void switchToDesktop(@NonNull LauncherState.Desktop mode) {
method showDesktop (line 684) | private void showDesktop(LauncherState.Desktop mode) {
method enableFullscreen (line 751) | private void enableFullscreen(int startDelay) {
method disableFullscreen (line 791) | private void disableFullscreen() {
method showSearchBar (line 828) | private void showSearchBar() {
method hideWidgets (line 865) | private void hideWidgets() {
method hideSearchBar (line 870) | private void hideSearchBar() {
method hideSearchBar (line 875) | private void hideSearchBar(boolean animate) {
method showWidgets (line 926) | private void showWidgets() {
method showWidgets (line 931) | private void showWidgets(boolean animate) {
method showKeyboard (line 963) | public void showKeyboard() {
method hideKeyboard (line 972) | public void hideKeyboard() {
method displayLoader (line 979) | @Override
method getContext (line 993) | @NonNull
method resetTask (line 999) | @Override
method clearAdapter (line 1004) | @Override
method showProviderEntries (line 1014) | public boolean showProviderEntries(@Nullable IProvider<?> provider) {
method showProviderEntries (line 1018) | public boolean showProviderEntries(@Nullable IProvider<?> provider, @N...
method updateAdapter (line 1054) | @Override
method removeResult (line 1091) | @Override
method filterResults (line 1097) | @Override
method handleRemoveApp (line 1102) | public void handleRemoveApp(String packageName) {
method runSearcher (line 1111) | public void runSearcher(@NonNull String query, @NonNull Class<? extend...
method clearSearchText (line 1130) | public void clearSearchText() {
method clearSearch (line 1139) | public void clearSearch() {
method refreshSearchRecords (line 1145) | public void refreshSearchRecords() {
method refreshSearchRecord (line 1155) | public void refreshSearchRecord(EntryItem entry) {
method showResultList (line 1159) | private void showResultList(boolean animate) {
method hideResultList (line 1184) | private void hideResultList(boolean animate) {
method updateSearchRecords (line 1214) | public void updateSearchRecords() {
method updateSearchRecords (line 1232) | private void updateSearchRecords(boolean isRefresh, @NonNull String qu...
method updateSearchRecords (line 1236) | private void updateSearchRecords(boolean isRefresh, @NonNull Searcher ...
method beforeLaunchOccurred (line 1247) | public void beforeLaunchOccurred() {
method afterLaunchOccurred (line 1256) | public void afterLaunchOccurred() {
method showContextMenu (line 1274) | public void showContextMenu() {
method setListLayout (line 1278) | public void setListLayout() {
method setGridLayout (line 1294) | public void setGridLayout() {
method setGridLayout (line 1298) | public void setGridLayout(int columnCount) {
method isGridLayout (line 1315) | public boolean isGridLayout() {
method onBackPressed (line 1327) | public boolean onBackPressed() {
method getButtonPopup (line 1355) | @NonNull
method getCustomIconDialog (line 1376) | @NonNull
method launchCustomIconDialog (line 1394) | public void launchCustomIconDialog(AppEntry appEntry) {
method launchCustomIconDialog (line 1414) | public void launchCustomIconDialog(ShortcutEntry shortcutEntry) {
method launchCustomIconDialog (line 1434) | public void launchCustomIconDialog(@NonNull StaticEntry staticEntry) {
method launchCustomIconDialog (line 1438) | public void launchCustomIconDialog(@NonNull StaticEntry staticEntry, @...
method launchCustomIconDialog (line 1457) | public void launchCustomIconDialog(@NonNull SearchEntry searchEntry, @...
method launchCustomIconDialog (line 1483) | public void launchCustomIconDialog(@NonNull DialContactEntry dialEntry) {
method launchCustomIconDialog (line 1503) | public void launchCustomIconDialog(@NonNull String buttonId, int defau...
method launchEditTagsDialog (line 1521) | public void launchEditTagsDialog(EntryWithTags entry) {
method launchEditQuickListDialog (line 1541) | public void launchEditQuickListDialog(Context context) {
method launchTagsManagerDialog (line 1545) | public void launchTagsManagerDialog(Context context) {
method isFragmentDialogVisible (line 1549) | private boolean isFragmentDialogVisible() {
method showDialog (line 1560) | public static void showDialog(Context context, DialogFragment<?> dialo...
method showDialog (line 1568) | private void showDialog(@NonNull DialogFragment<?> dialog, @Nullable S...
method openFragmentDialog (line 1573) | private void openFragmentDialog(DialogFragment<?> dialog, @Nullable St...
method closeFragmentDialog (line 1578) | public boolean closeFragmentDialog() {
method closeFragmentDialog (line 1582) | private boolean closeFragmentDialog(@Nullable String tag) {
method registerPopup (line 1597) | private void registerPopup(ListPopup menu) {
method dismissPopup (line 1601) | private boolean dismissPopup() {
method onResume (line 1605) | public void onResume() {
method onNewIntent (line 1620) | public void onNewIntent() {
method onWindowFocusChanged (line 1652) | public void onWindowFocusChanged(boolean hasFocus) {
method setActivityOrientation (line 1685) | public static void setActivityOrientation(@NonNull Activity act, @NonN...
method launchStaticEntry (line 1699) | private boolean launchStaticEntry(@NonNull String entryId) {
method launchActionEntry (line 1722) | private boolean launchActionEntry(@NonNull String action) {
method launchAppEntry (line 1726) | private boolean launchAppEntry(@NonNull String userComponentName) {
method launchEntryById (line 1740) | private boolean launchEntryById(@NonNull String entryId) {
method executeButtonAction (line 1752) | private void executeButtonAction(@Nullable String button) {
method executeGestureAction (line 1757) | private boolean executeGestureAction(@Nullable String gesture) {
method executeAction (line 1763) | private boolean executeAction(@Nullable String action, @Nullable Strin...
method onFlingDownLeft (line 1891) | public boolean onFlingDownLeft() {
method onFlingDownRight (line 1895) | public boolean onFlingDownRight() {
method onFlingUp (line 1899) | public boolean onFlingUp() {
method onFlingLeft (line 1903) | public boolean onFlingLeft() {
method onFlingRight (line 1907) | public boolean onFlingRight() {
method onClick (line 1911) | public boolean onClick() {
method hasDoubleClick (line 1915) | public boolean hasDoubleClick() {
method onDoubleClick (line 1922) | public boolean onDoubleClick() {
FILE: app/src/main/java/rocks/tbog/tblauncher/CustomizeUI.java
class CustomizeUI (line 46) | public class CustomizeUI {
class UpdateResultFadeOut (line 79) | private static final class UpdateResultFadeOut implements View.OnLayou...
method onLayoutChange (line 80) | @Override
class MotionTransitionListener (line 97) | public static final class MotionTransitionListener implements MotionLa...
type TransitionType (line 100) | public enum TransitionType {STARTED, CHANGE, COMPLETED, TRIGGER}
method setTransitionToEndListener (line 102) | public void setTransitionToEndListener(Runnable listener) {
method onTransitionStarted (line 106) | @Override
method onTransitionChange (line 111) | @Override
method onTransitionCompleted (line 116) | @Override
method onTransitionTrigger (line 122) | @Override
method findViewById (line 128) | @SuppressWarnings("TypeParameterUnusedInFormals")
method onCreateActivity (line 133) | public void onCreateActivity(TBLauncherActivity tbLauncherActivity) {
method onStart (line 150) | public void onStart() {
method setNotificationBarColor (line 163) | private void setNotificationBarColor() {
method setNavigationBarColor (line 185) | private void setNavigationBarColor() {
method refreshSearchBar (line 193) | public void refreshSearchBar() {
method setSearchBarPref (line 200) | private void setSearchBarPref() {
method setSearchPillPref (line 295) | private void setSearchPillPref() {
method setResultListPref (line 425) | public static void setResultListPref(View resultLayout) {
method setResultListGradientFade (line 429) | private static boolean setResultListGradientFade(@NonNull View resultL...
method setResultListPref (line 452) | public static void setResultListPref(View resultLayout, boolean setMar...
method setFadingEdge (line 506) | private static void setFadingEdge(@Nullable View view, boolean enabled) {
method adjustInputType (line 514) | private void adjustInputType(EditText searchEditText) {
method setListViewSelectorPref (line 533) | public static void setListViewSelectorPref(AbsListView listView, boole...
method getSelectorDrawable (line 539) | public static Drawable getSelectorDrawable(View view, int color, boole...
method setListViewScrollbarPref (line 558) | public static void setListViewScrollbarPref(View listView) {
method setListViewScrollbarPref (line 563) | public static void setListViewScrollbarPref(View listView, int color) {
method getContext (line 571) | public Context getContext() {
method getPopupBackgroundDrawable (line 575) | @NonNull
method getDialogButtonBarBackgroundDrawable (line 588) | public static Drawable getDialogButtonBarBackgroundDrawable(@NonNull R...
method isNonCompliantKeyboard (line 605) | private boolean isNonCompliantKeyboard() {
method isSuggestionsEnabled (line 613) | private boolean isSuggestionsEnabled() {
method expandSearchPill (line 617) | public void expandSearchPill(int duration) {
method collapseSearchPill (line 624) | public void collapseSearchPill(int duration) {
method setExpandedSearchPillListener (line 631) | public void setExpandedSearchPillListener(Runnable listener) {
FILE: app/src/main/java/rocks/tbog/tblauncher/DeviceAdmin.java
class DeviceAdmin (line 13) | public class DeviceAdmin extends DeviceAdminReceiver {
method onEnabled (line 15) | @Override
method onDisabled (line 22) | @Override
method getAdminComponent (line 29) | @NonNull
method isAdminActive (line 34) | public static boolean isAdminActive(@NonNull Context context) {
method removeActiveAdmin (line 43) | public static void removeActiveAdmin(@NonNull Context context) {
method lockScreen (line 51) | public static void lockScreen(@NonNull Context context) {
FILE: app/src/main/java/rocks/tbog/tblauncher/DrawableCache.java
class DrawableCache (line 15) | public class DrawableCache {
method setSize (line 20) | public void setSize(int maxSize) {
method setCalendar (line 24) | public void setCalendar(String cacheId) {
method getCachedDrawable (line 32) | @Nullable
method cacheDrawable (line 45) | public void cacheDrawable(@NonNull String cacheId, @Nullable Drawable ...
method clearCache (line 58) | public void clearCache() {
method onPrefChanged (line 64) | public void onPrefChanged(Context ctx, SharedPreferences pref) {
class DrawableInfo (line 80) | public static class DrawableInfo {
method DrawableInfo (line 84) | public DrawableInfo(Drawable drawable) {
method setToday (line 92) | public void setToday() {
method isToday (line 96) | public boolean isToday() {
FILE: app/src/main/java/rocks/tbog/tblauncher/DummyLauncherActivity.java
class DummyLauncherActivity (line 5) | public class DummyLauncherActivity extends Activity {
FILE: app/src/main/java/rocks/tbog/tblauncher/EditTagsDialog.java
class EditTagsDialog (line 37) | public class EditTagsDialog extends DialogFragment<Set<String>> {
method layoutRes (line 44) | @Override
method onCreateView (line 49) | @Nullable
method onViewCreated (line 80) | @Override
method onButtonClick (line 162) | @Override
method onStart (line 172) | @Override
method showKeyboard (line 186) | private static void showKeyboard(@NonNull Dialog dialog, @NonNull Text...
method addTag (line 195) | private void addTag(String tag) {
method removeTag (line 204) | private void removeTag(String tag) {
method onActivityCreated (line 209) | @Override
class TagsAdapter (line 226) | static class TagsAdapter extends BaseAdapter {
type OnItemClickListener (line 230) | public interface OnItemClickListener {
method onItemClick (line 231) | void onItemClick(TagsAdapter adapter, View view, int position);
method TagsAdapter (line 234) | TagsAdapter(@NonNull ArraySet<String> tags) {
method setOnItemClickListener (line 238) | void setOnItemClickListener(OnItemClickListener listener) {
method getCount (line 242) | @Override
method getItem (line 247) | @Override
method getItemId (line 252) | @Override
method getView (line 257) | @Override
class ViewHolder (line 277) | static class ViewHolder {
method ViewHolder (line 281) | ViewHolder(View itemView) {
method setContent (line 287) | public void setContent(CharSequence content) {
FILE: app/src/main/java/rocks/tbog/tblauncher/LauncherState.java
class LauncherState (line 10) | public class LauncherState {
type AnimatedVisibility (line 11) | public enum AnimatedVisibility {
type Desktop (line 18) | public enum Desktop {
method isVisible (line 34) | private static boolean isVisible(AnimatedVisibility state) {
method isQuickListVisible (line 39) | public boolean isQuickListVisible() {
method isSearchBarVisible (line 43) | public boolean isSearchBarVisible() {
method isResultListVisible (line 47) | public boolean isResultListVisible() {
method isNotificationBarVisible (line 51) | public boolean isNotificationBarVisible() {
method isWidgetScreenVisible (line 55) | public boolean isWidgetScreenVisible() {
method isClearScreenVisible (line 59) | public boolean isClearScreenVisible() {
method isKeyboardHidden (line 63) | public boolean isKeyboardHidden() {
method syncKeyboardVisibility (line 67) | public void syncKeyboardVisibility(View anyView) {
method getDesktop (line 74) | @Nullable
method setNotificationBar (line 79) | public void setNotificationBar(@NonNull AnimatedVisibility state) {
method setSearchBar (line 83) | public void setSearchBar(@NonNull AnimatedVisibility state) {
method setResultList (line 87) | public void setResultList(@NonNull AnimatedVisibility state) {
method setQuickList (line 91) | public void setQuickList(@NonNull AnimatedVisibility state) {
method setWidgetScreen (line 95) | public void setWidgetScreen(@NonNull AnimatedVisibility state) {
method setKeyboard (line 99) | public void setKeyboard(@NonNull AnimatedVisibility state) {
method setDesktop (line 103) | public void setDesktop(@NonNull Desktop mode) {
method getSearchBarVisibility (line 107) | @NonNull
method getResultListVisibility (line 112) | @NonNull
method getNotificationBarVisibility (line 117) | @NonNull
method getWidgetScreenVisibility (line 122) | @NonNull
FILE: app/src/main/java/rocks/tbog/tblauncher/LiveWallpaper.java
class LiveWallpaper (line 30) | public class LiveWallpaper {
method onLongPress (line 57) | @Override
method onFling (line 65) | @Override
method onDoubleTapEvent (line 80) | @Override
method onSingleTapUp (line 89) | @Override
method onSingleTapConfirmed (line 98) | @Override
method LiveWallpaper (line 109) | LiveWallpaper() {
method getWallpaperOffset (line 117) | @NonNull
method getWindowSize (line 122) | @NonNull
method scroll (line 127) | public void scroll(MotionEvent e1, MotionEvent e2) {
method prefGetInt (line 138) | private int prefGetInt(@NonNull SharedPreferences prefs, @NonNull Stri...
method onCreateActivity (line 149) | public void onCreateActivity(TBLauncherActivity mainActivity) {
method resetPosition (line 182) | public void resetPosition() {
method resetPageCount (line 186) | private void resetPageCount() {
method onClick (line 202) | private static boolean onClick(View view) {
method onDoubleClick (line 208) | private static boolean onDoubleClick(View view) {
method computeAngle (line 214) | private static int computeAngle(float x, float y) {
method onFling (line 218) | private boolean onFling(View view, float xMove, float yMove, float xVe...
method onLongClick (line 259) | private void onLongClick(View view) {
method cacheWindowSize (line 271) | private void cacheWindowSize() {
method initializeSnapAnimation (line 286) | private boolean initializeSnapAnimation() {
method onRootTouch (line 290) | boolean onRootTouch(View view, MotionEvent event) {
method getContext (line 381) | public Context getContext() {
method onPrefChanged (line 385) | public void onPrefChanged(SharedPreferences prefs, String key) {
method isScrollEnabled (line 424) | private boolean isScrollEnabled() {
method isPreferenceLWPScrollPages (line 428) | private boolean isPreferenceLWPScrollPages() {
method isPreferenceLWPTouch (line 432) | private boolean isPreferenceLWPTouch() {
method isPreferenceLWPDrag (line 436) | private boolean isPreferenceLWPDrag() {
method isPreferenceWPDragAnimate (line 440) | public boolean isPreferenceWPDragAnimate() {
method isPreferenceWPReturnCenter (line 444) | public boolean isPreferenceWPReturnCenter() {
method isPreferenceWPStickToSides (line 448) | public boolean isPreferenceWPStickToSides() {
method getWindowToken (line 452) | private android.os.IBinder getWindowToken() {
method updateWallpaperOffset (line 456) | public void updateWallpaperOffset(float offsetX, float offsetY) {
method sendTouchEvent (line 471) | private void sendTouchEvent(int x, int y, int index) {
method sendTouchEvent (line 483) | private void sendTouchEvent(View view, MotionEvent event) {
FILE: app/src/main/java/rocks/tbog/tblauncher/MimeTypeCache.java
class MimeTypeCache (line 36) | public class MimeTypeCache {
method clearCache (line 55) | public synchronized void clearCache() {
method getLabel (line 66) | public String getLabel(Context context, String mimeType) {
method getComponentName (line 77) | public ComponentName getComponentName(Context context, String mimeType) {
method fetchDetailColumns (line 93) | public Map<String, String> fetchDetailColumns(Context context) {
method loadContactsXml (line 160) | @SuppressLint("WrongConstant")
method getDetailColumn (line 190) | public String getDetailColumn(Context context, String mimeType) {
method greatestCommonPrefix (line 195) | private static String greatestCommonPrefix(@NonNull String a, @NonNull...
method getUniqueLabels (line 212) | public Map<String, String> getUniqueLabels(Context context, Set<String...
FILE: app/src/main/java/rocks/tbog/tblauncher/Permission.java
class Permission (line 16) | public class Permission {
method checkPermission (line 33) | public static boolean checkPermission(Context context, int permission) {
method askPermission (line 37) | public static void askPermission(int permission, PermissionResultListe...
method Permission (line 55) | public Permission(Activity activity) {
method onRequestPermissionsResult (line 60) | public void onRequestPermissionsResult(int requestCode, @NonNull Strin...
class PermissionResultListener (line 83) | public static class PermissionResultListener {
method onGranted (line 86) | public void onGranted() {
method onDenied (line 89) | public void onDenied() {
FILE: app/src/main/java/rocks/tbog/tblauncher/PermissionsManager.java
type PermissionsManager (line 6) | public interface PermissionsManager {
type PermissionGroup (line 7) | enum PermissionGroup {
method requestPermission (line 17) | void requestPermission(AppCompatActivity context, PermissionGroup perm...
method checkPermissionOnce (line 24) | Boolean checkPermissionOnce(PermissionGroup permissionGroup);
method onRequestPermissionsResult (line 26) | void onRequestPermissionsResult(
method onResume (line 32) | void onResume();
method hasPermission (line 34) | Boolean hasPermission(PermissionGroup permissionGroup);
method reportNotificationListenerState (line 40) | void reportNotificationListenerState(Boolean running);
FILE: app/src/main/java/rocks/tbog/tblauncher/PinShortcutConfirm.java
class PinShortcutConfirm (line 49) | @RequiresApi(api = Build.VERSION_CODES.O)
method onCreate (line 57) | @Override
method initViews (line 89) | private void initViews(@NonNull ShortcutInfo shortcutInfo) {
method setIconsAsync (line 169) | private static void setIconsAsync(ImageView icon, ShortcutInfo shortcu...
method packageNameHeuristic (line 191) | @NonNull
method onClick (line 222) | @Override
method acceptShortcut (line 236) | private void acceptShortcut() {
FILE: app/src/main/java/rocks/tbog/tblauncher/SettingsActivity.java
class SettingsActivity (line 91) | public class SettingsActivity extends AppCompatActivity implements Prefe...
method onCreate (line 127) | @Override
method restoreBackStack (line 157) | private void restoreBackStack() {
method addToBackStack (line 168) | private void addToBackStack(@NonNull String key) {
method onCreateOptionsMenu (line 179) | @Override
method onOptionsItemSelected (line 187) | @SuppressLint("ApplySharedPref")
method restart (line 209) | private void restart() {
method onTitleChanged (line 238) | @Override
method onSupportNavigateUp (line 253) | @Override
method onPreferenceStartScreen (line 278) | @Override
method onActivityResult (line 285) | @Override
class SettingsFragment (line 337) | public static class SettingsFragment extends PreferenceFragmentCompat ...
method SettingsFragment (line 349) | public SettingsFragment() {
method onCreatePreferences (line 353) | @Override
method setupButtonActions (line 440) | private void setupButtonActions(@NonNull Activity activity) {
method onCreateAsyncLoad (line 464) | private void onCreateAsyncLoad(@NonNull Context context, @NonNull Sh...
method initAppToRunLists (line 516) | private void initAppToRunLists(@NonNull Context context, @NonNull Sh...
method initShortcutToRunLists (line 534) | private void initShortcutToRunLists(@NonNull Context context, @NonNu...
method initEntryToShowLists (line 552) | private void initEntryToShowLists(@NonNull Context context, @NonNull...
method initTagsMenuList (line 570) | private void initTagsMenuList(@NonNull Context context, @NonNull Sha...
method initResultPopupList (line 594) | private void initResultPopupList(@NonNull Context context, @NonNull ...
method initMimeTypes (line 616) | private void initMimeTypes(@NonNull Context context) {
method tintPreferenceIcons (line 638) | private void tintPreferenceIcons(Preference preference, int color) {
method removePreference (line 657) | private void removePreference(String key) {
method setListPreferenceIconsPacksData (line 663) | private void setListPreferenceIconsPacksData(ListPreference lp) {
method onResume (line 685) | @Override
method onPause (line 694) | @Override
method onDestroy (line 700) | @Override
method onDisplayPreferenceDialog (line 712) | @Override
method generateAppToRunListContent (line 796) | private static Pair<CharSequence[], CharSequence[]> generateAppToRun...
method generateShortcutToRunListContent (line 810) | private static Pair<CharSequence[], CharSequence[]> generateShortcut...
method generateEntryToShowListContent (line 829) | private static Pair<CharSequence[], CharSequence[]> generateEntryToS...
method generateMimeTypeListContent (line 857) | private static Pair<CharSequence[], CharSequence[]> generateMimeType...
method updateListPrefDependency (line 871) | private void updateListPrefDependency(@NonNull String dependOnKey, @...
method updateAppToRunList (line 897) | private void updateAppToRunList(@NonNull SharedPreferences sharedPre...
method updateShortcutToRunList (line 901) | private void updateShortcutToRunList(@NonNull SharedPreferences shar...
method updateEntryToShowList (line 905) | private void updateEntryToShowList(@NonNull SharedPreferences shared...
method removeEntryValueFromListPreference (line 909) | private static void removeEntryValueFromListPreference(@NonNull Stri...
method onSharedPreferenceChanged (line 938) | @Override
method setActionBarTextColor (line 967) | @SuppressWarnings("deprecation")
method applyNotificationBarColor (line 993) | private static void applyNotificationBarColor(@NonNull SharedPreferenc...
method applyNavigationBarColor (line 1015) | private static void applyNavigationBarColor(@NonNull SharedPreferences...
method onSharedPreferenceChanged (line 1034) | public static void onSharedPreferenceChanged(Context context, SharedPr...
FILE: app/src/main/java/rocks/tbog/tblauncher/TBApplication.java
class TBApplication (line 46) | public class TBApplication extends Application {
method attachBaseContext (line 88) | @Override
method getApplication (line 107) | @NonNull
method validateActivity (line 115) | @NonNull
method getActivity (line 131) | @NonNull
method launcherActivity (line 157) | @Nullable
method launcherActivity (line 173) | @Nullable
method activityInvalid (line 178) | public static boolean activityInvalid(@Nullable View view) {
method activityInvalid (line 184) | public static boolean activityInvalid(@Nullable Context ctx) {
method activityValid (line 188) | public static boolean activityValid(@Nullable Context context) {
method onCreateActivity (line 214) | public void onCreateActivity(TBLauncherActivity activity) {
method preferences (line 227) | @NonNull
method behaviour (line 232) | public static Behaviour behaviour(@NonNull Context context) {
method behaviour (line 237) | @NonNull
method liveWallpaper (line 242) | @NonNull
method quickList (line 248) | public static QuickList quickList(Context context) {
method ui (line 253) | public static CustomizeUI ui(Context context) {
method widgetManager (line 258) | @NonNull
method drawableCache (line 264) | @NonNull
method iconPackCache (line 269) | @NonNull
method mimeTypeCache (line 274) | @NonNull
method tagsHandler (line 279) | @NonNull
method appsHandler (line 284) | @NonNull
method dataHandler (line 289) | @NonNull
method rootHandler (line 294) | @NonNull
method state (line 299) | @NonNull
method onDestroyActivity (line 304) | public static void onDestroyActivity(TBLauncherActivity activity) {
method runTask (line 323) | public static void runTask(Context context, Searcher task) {
method resetTask (line 329) | public static void resetTask(Context context) {
method hasSearchTask (line 337) | public static boolean hasSearchTask(Context context) {
method iconsHandler (line 342) | public static IconsHandler iconsHandler(Context ctx) {
method isDefaultLauncher (line 346) | public static boolean isDefaultLauncher(Context context) {
method resetDefaultLauncherAndOpenChooser (line 361) | public static void resetDefaultLauncherAndOpenChooser(Context context) {
method onCreate (line 374) | @Override
method onTerminate (line 398) | @Override
method tagsHandler (line 406) | @NonNull
method appsHandler (line 413) | @NonNull
method getDataHandler (line 420) | @NonNull
method drawableCache (line 430) | @NonNull
method initDataHandler (line 435) | public void initDataHandler() {
method iconsHandler (line 447) | @NonNull
method resetIconsHandler (line 456) | public void resetIconsHandler() {
method rootHandler (line 460) | @NonNull
method requireLayoutUpdate (line 467) | public void requireLayoutUpdate() {
method registerPopup (line 475) | public void registerPopup(ListPopup popup) {
method dismissPopup (line 483) | public boolean dismissPopup() {
method getPopup (line 491) | @Nullable
method onTrimMemory (line 501) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/TBLauncherActivity.java
class TBLauncherActivity (line 32) | public class TBLauncherActivity extends AppCompatActivity implements Act...
method onReceive (line 44) | @Override
method onCreate (line 97) | @Override
method dispatchKeyEvent (line 151) | @Override
method onStart (line 157) | @Override
method onStop (line 171) | @Override
method onRestart (line 177) | @Override
method onDestroy (line 183) | @Override
method onConfigurationChanged (line 195) | @Override
method isLayoutUpdateRequired (line 205) | public boolean isLayoutUpdateRequired() {
method requireLayoutUpdate (line 209) | public void requireLayoutUpdate(boolean require) {
method requireLayoutUpdate (line 213) | public void requireLayoutUpdate() {
method onResume (line 217) | @Override
method onNewIntent (line 237) | @Override
method onSaveInstanceState (line 251) | @Override
method onKeyDown (line 258) | @Override
method onBackPressed (line 269) | @Override
method onWindowFocusChanged (line 280) | @Override
method queueDockReload (line 295) | public void queueDockReload() {
method refreshSearchRecords (line 299) | public void refreshSearchRecords() {
method dispatchTouchEvent (line 303) | @Override
method onRequestPermissionsResult (line 323) | @Override
method attachBaseContext (line 329) | @Override
method onActivityResult (line 344) | @Override
method updateTextView (line 351) | private void updateTextView(TextView debugTextView) {
FILE: app/src/main/java/rocks/tbog/tblauncher/TagsManager.java
class TagsManager (line 47) | public class TagsManager {
type OnItemClickListener (line 54) | public interface OnItemClickListener {
method onItemClickListener (line 55) | void onItemClickListener(@NonNull View view, @NonNull TagInfo tagInfo);
method hasChangesMade (line 58) | public boolean hasChangesMade() {
method applyChanges (line 68) | public void applyChanges(@NonNull Context context) {
method afterChangesMade (line 111) | public static void afterChangesMade(@NonNull Context context) {
method bindView (line 132) | public void bindView(@NonNull View view, @Nullable OnItemClickListener...
method launchRenameDialog (line 196) | private void launchRenameDialog(Context ctx, TagInfo info) {
method launchCustomTagIconDialog (line 223) | private void launchCustomTagIconDialog(Context ctx, TagInfo info) {
method onStart (line 264) | public void onStart() {
class TagsAdapter (line 278) | static class TagsAdapter extends ViewHolderListAdapter<TagInfo, TagVie...
type OnItemClickListener (line 283) | public interface OnItemClickListener {
method onClick (line 284) | void onClick(TagsAdapter adapter, View view, int position);
method TagsAdapter (line 287) | TagsAdapter(@NonNull ArrayList<TagInfo> tags) {
method setOnRemoveListener (line 291) | void setOnRemoveListener(OnItemClickListener listener) {
method setOnRenameListener (line 295) | void setOnRenameListener(OnItemClickListener listener) {
method setOnEditIconListener (line 299) | void setOnEditIconListener(OnItemClickListener listener) {
method getItemViewTypeLayout (line 303) | @Override
method getItemViewType (line 310) | public int getItemViewType(int position) {
method getViewTypeCount (line 314) | public int getViewTypeCount() {
class TagViewHolder (line 319) | public static class TagViewHolder extends ViewHolderAdapter.ViewHolder...
method TagViewHolder (line 327) | public TagViewHolder(View itemView) {
method setContent (line 337) | @Override
class TagInfo (line 406) | public static class TagInfo {
type Action (line 415) | public enum Action {NONE, DELETE, RENAME}
method TagInfo (line 417) | public TagInfo(String name) {
method TagInfo (line 422) | public TagInfo(StaticEntry entry) {
method setInfo (line 427) | public void setInfo(String name, int count) {
method equals (line 432) | @Override
method hashCode (line 446) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/WallpaperSnapAnim.java
class WallpaperSnapAnim (line 12) | class WallpaperSnapAnim extends Animation {
method WallpaperSnapAnim (line 18) | WallpaperSnapAnim(LiveWallpaper liveWallpaper) {
method init (line 25) | boolean init(@Nullable VelocityTracker velocityTracker) {
method applyTransformation (line 62) | @Override
class SnapInfo (line 78) | private static class SnapInfo {
method SnapInfo (line 87) | public SnapInfo(boolean sidesSnap, boolean centerSnap) {
method init (line 92) | public void init(float x, float y) {
method removeDiagonals (line 119) | public void removeDiagonals(float x, float y) {
FILE: app/src/main/java/rocks/tbog/tblauncher/WorkAsync/AsyncTask.java
class AsyncTask (line 12) | public abstract class AsyncTask<In, Out> extends FutureTask<Out> {
method AsyncTask (line 16) | protected AsyncTask() {
method AsyncTask (line 20) | private AsyncTask(BackgroundWorker<In, Out> worker) {
method onPreExecute (line 25) | @MainThread
method doInBackground (line 29) | @WorkerThread
method done (line 32) | @Override
method onPostExecute (line 49) | @MainThread
method onCancelled (line 53) | @MainThread
class BackgroundWorker (line 57) | private static class BackgroundWorker<In, Out> implements Callable<Out> {
method call (line 60) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/WorkAsync/RunnableTask.java
class RunnableTask (line 10) | public final class RunnableTask extends FutureTask<RunnableTask> {
method cancel (line 14) | public void cancel() {
method RunnableTask (line 18) | protected RunnableTask(@NonNull TaskRunner.AsyncRunnable worker, @Null...
method RunnableTask (line 24) | protected RunnableTask(@NonNull TaskRunner.AsyncRunnable worker, @Null...
method RunnableTask (line 28) | private RunnableTask(@NonNull BackgroundWorker background) {
method done (line 33) | @Override
class BackgroundWorker (line 43) | private static class BackgroundWorker implements Callable<RunnableTask> {
method BackgroundWorker (line 47) | private BackgroundWorker(TaskRunner.AsyncRunnable worker) {
method call (line 51) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/WorkAsync/TaskRunner.java
class TaskRunner (line 13) | public class TaskRunner {
type AsyncRunnable (line 16) | public interface AsyncRunnable {
method run (line 17) | void run(@NonNull RunnableTask task);
method runOnUiThread (line 20) | public static boolean runOnUiThread(Runnable runnable) {
method newTask (line 24) | @NonNull
method newTask (line 29) | @NonNull
method executeOnExecutor (line 34) | @MainThread
method executeOnExecutor (line 39) | @MainThread
FILE: app/src/main/java/rocks/tbog/tblauncher/broadcast/IncomingCallHandler.java
class IncomingCallHandler (line 14) | public class IncomingCallHandler extends BroadcastReceiver {
method onReceive (line 18) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/broadcast/LocaleChangedReceiver.java
class LocaleChangedReceiver (line 10) | public class LocaleChangedReceiver extends BroadcastReceiver {
method onReceive (line 12) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/broadcast/PackageAddedRemovedHandler.java
class PackageAddedRemovedHandler (line 26) | public class PackageAddedRemovedHandler extends BroadcastReceiver {
method handleEvent (line 28) | public static void handleEvent(Context ctx, String action, String pack...
method onReceive (line 74) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/calculator/Calculator.java
class Calculator (line 9) | public class Calculator {
method calculateExpression (line 11) | public static Result<BigDecimal> calculateExpression(ArrayDeque<Tokeni...
method calculateExpressionThrowing (line 21) | private static Result<BigDecimal> calculateExpressionThrowing(ArrayDeq...
method errorInExpression (line 112) | private static boolean errorInExpression(boolean isUnary, final ArrayD...
method isFinite (line 131) | public static boolean isFinite(double d) {
FILE: app/src/main/java/rocks/tbog/tblauncher/calculator/Result.java
class Result (line 5) | public final class Result<T> {
method syntacticalError (line 6) | static <T> Result<T> syntacticalError() {
method arithmeticalError (line 10) | static <T> Result<T> arithmeticalError() {
method result (line 14) | static <T> Result<T> result(@NonNull T result) {
method Result (line 23) | private Result(boolean isSyntactical) {
method Result (line 29) | private Result(@NonNull T result) {
FILE: app/src/main/java/rocks/tbog/tblauncher/calculator/ShuntingYard.java
class ShuntingYard (line 5) | public class ShuntingYard {
method infixToPostfix (line 7) | public static Result<ArrayDeque<Tokenizer.Token>> infixToPostfix(Array...
FILE: app/src/main/java/rocks/tbog/tblauncher/calculator/Tokenizer.java
class Tokenizer (line 12) | public class Tokenizer {
class Token (line 13) | public static final class Token {
method Token (line 31) | public Token(int type) {
method Token (line 41) | public Token(@NonNull BigDecimal number) {
method Token (line 46) | public Token(boolean isParenthesisOpen) {
method getPrecedence (line 51) | public final int getPrecedence() {
method isRightAssociative (line 69) | public final boolean isRightAssociative() {
method isLeftAssociative (line 85) | public final boolean isLeftAssociative() {
method tokenize (line 90) | public static Result<ArrayDeque<Token>> tokenize(String expression) {
method checkOperatorIsPartOfNumber (line 188) | private static boolean checkOperatorIsPartOfNumber(char operator) {
FILE: app/src/main/java/rocks/tbog/tblauncher/customicon/ButtonHelper.java
class ButtonHelper (line 11) | public class ButtonHelper {
method ButtonHelper (line 19) | private ButtonHelper() {
method showButtonPopup (line 23) | public static boolean showButtonPopup(@NonNull View view, @NonNull Lis...
FILE: app/src/main/java/rocks/tbog/tblauncher/customicon/CustomShapePage.java
class CustomShapePage (line 54) | class CustomShapePage extends PageAdapter.Page {
method CustomShapePage (line 63) | CustomShapePage(CharSequence name, View view) {
method setupView (line 73) | @Override
method addShapesList (line 119) | private void addShapesList() {
method addIconsList (line 143) | private void addIconsList(@Nullable OnItemClickListener iconClickListe...
method addScaleBar (line 166) | private void addScaleBar() {
method addBackgroundColorChooser (line 194) | private void addBackgroundColorChooser(float colorPreviewRadius, int c...
method addLetterColorChooser (line 217) | private void addLetterColorChooser(float colorPreviewRadius, int color...
method addPickedIcon (line 239) | @Override
method setupToggle (line 244) | private void setupToggle(@IdRes int toggleTextView, @IdRes int viewToT...
method addIcon (line 265) | public void addIcon(@NonNull String name, @NonNull Drawable drawable) {
method addTextIcon (line 272) | private void addTextIcon(CharSequence name, @NonNull TextDrawable icon) {
method generateTextIcons (line 281) | private void generateTextIcons(@Nullable CharSequence text) {
method generateShapes (line 329) | private void generateShapes(Context context) {
method reshapeIcons (line 347) | private void reshapeIcons(Context context) {
type OnColorChanged (line 362) | interface OnColorChanged {
method onColorChanged (line 363) | void onColorChanged(int color);
method launchCustomColorDialog (line 366) | private static void launchCustomColorDialog(@Nullable Context context,...
class LetterIconInfo (line 397) | static class LetterIconInfo extends NamedIconInfo {
method LetterIconInfo (line 399) | LetterIconInfo(CharSequence name, Drawable icon, Drawable text) {
method reshape (line 403) | @Override
class DefaultIconInfo (line 410) | static class DefaultIconInfo extends ShapedIconInfo {
method DefaultIconInfo (line 412) | DefaultIconInfo(IconsHandler.IconInfo icon) {
method getIcon (line 416) | @Override
class NamedIconInfo (line 422) | static class NamedIconInfo extends ShapedIconInfo {
method NamedIconInfo (line 425) | NamedIconInfo(CharSequence name, Drawable icon, Drawable origin) {
method reshape (line 430) | @Override
method getText (line 436) | @Nullable
class ShapedIconInfo (line 443) | public static class ShapedIconInfo {
method ShapedIconInfo (line 449) | public ShapedIconInfo(Drawable icon, Drawable origin) {
method reshape (line 454) | protected ShapedIconInfo reshape(Context context, int shape, float s...
method getIcon (line 461) | public Drawable getIcon() {
method getPreview (line 465) | public Drawable getPreview() {
method getText (line 469) | @Nullable
method equals (line 474) | @Override
method hashCode (line 485) | @Override
class ShapedIconVH (line 491) | public static class ShapedIconVH extends ViewHolderAdapter.ViewHolder<...
method ShapedIconVH (line 496) | public ShapedIconVH(View view) {
method setContent (line 503) | @Override
class ShapedIconAdapter (line 523) | static class ShapedIconAdapter extends ViewHolderListAdapter<ShapedIco...
method ShapedIconAdapter (line 524) | protected ShapedIconAdapter() {
method getList (line 528) | List<ShapedIconInfo> getList() {
method removeItem (line 532) | void removeItem(ShapedIconInfo item) {
class PickedIconInfo (line 538) | public static class PickedIconInfo extends ShapedIconInfo {
method PickedIconInfo (line 542) | public PickedIconInfo(Drawable icon, @StringRes int textId) {
method PickedIconInfo (line 547) | public PickedIconInfo(Drawable icon, @Nullable String text) {
method PickedIconInfo (line 552) | public PickedIconInfo(Drawable shaped, Drawable original, @Nullable ...
method getText (line 557) | @Nullable
method reshape (line 562) | @Override
method launchPicker (line 570) | public boolean launchPicker(@NonNull IconSelectDialog iconSelectDial...
FILE: app/src/main/java/rocks/tbog/tblauncher/customicon/DefaultButtonPage.java
class DefaultButtonPage (line 17) | public class DefaultButtonPage extends CustomShapePage {
method DefaultButtonPage (line 23) | DefaultButtonPage(CharSequence name, View view, String entryName, int ...
method setupView (line 31) | @Override
class DefaultIconInfo (line 56) | static class DefaultIconInfo extends CustomShapePage.DefaultIconInfo {
method DefaultIconInfo (line 59) | DefaultIconInfo(@NonNull String name, IconsHandler.IconInfo icon) {
method getText (line 65) | @Nullable
FILE: app/src/main/java/rocks/tbog/tblauncher/customicon/IconAdapter.java
class IconAdapter (line 10) | class IconAdapter extends ViewHolderListAdapter<IconData, IconViewHolder> {
method IconAdapter (line 12) | IconAdapter(@NonNull List<IconData> objects) {
FILE: app/src/main/java/rocks/tbog/tblauncher/customicon/IconData.java
class IconData (line 8) | class IconData {
method IconData (line 12) | IconData(IconPackXML iconPack, DrawableInfo drawableInfo) {
method getIcon (line 17) | Drawable getIcon() {
FILE: app/src/main/java/rocks/tbog/tblauncher/customicon/IconPackPage.java
class IconPackPage (line 34) | class IconPackPage extends PageAdapter.Page {
method IconPackPage (line 44) | IconPackPage(CharSequence name, String packPackageName, View view) {
method setupView (line 49) | @Override
method loadData (line 107) | @Override
method refreshList (line 141) | private void refreshList() {
FILE: app/src/main/java/rocks/tbog/tblauncher/customicon/IconSelectDialog.java
class IconSelectDialog (line 56) | public class IconSelectDialog extends DialogFragment<Drawable> {
method onCreate (line 64) | @Override
method getFileName (line 92) | public static String getFileName(@NonNull Context context, @NonNull Ur...
method addPickedIcon (line 113) | private void addPickedIcon(@NonNull Drawable pickedImage, String filen...
method layoutRes (line 122) | @Override
method onCreateView (line 127) | @Nullable
method addIconPacks (line 168) | @NonNull
method addSystemIcons (line 202) | private void addSystemIcons(LayoutInflater inflater) {
method onStart (line 254) | @Override
method setFixedHeight (line 270) | private void setFixedHeight(View view) {
method setSelectedDrawable (line 276) | public void setSelectedDrawable(Drawable selected, Drawable preview) {
method addIconPackPage (line 288) | private void addIconPackPage(@NonNull LayoutInflater inflater, ViewGro...
method addCustomShapePage (line 296) | private CustomShapePage addCustomShapePage(CustomShapePage page) {
method addSystemPage (line 303) | private CustomShapePage addSystemPage(LayoutInflater inflater, Compone...
method addStaticEntryPage (line 309) | private CustomShapePage addStaticEntryPage(LayoutInflater inflater, St...
method addSearchEntryPage (line 315) | private CustomShapePage addSearchEntryPage(LayoutInflater inflater, St...
method addShortcutPage (line 321) | private CustomShapePage addShortcutPage(LayoutInflater inflater, Short...
method addButtonPage (line 327) | private CustomShapePage addButtonPage(LayoutInflater inflater, int def...
method getIconPackMenu (line 333) | public ListPopup getIconPackMenu(IconData iconData) {
method onViewCreated (line 361) | @Override
method customIconApp (line 399) | private void customIconApp(Bundle args) {
method initPreviewIcon (line 424) | private static void initPreviewIcon(TextView preview, Utilities.GetDra...
method customIconStaticEntry (line 438) | private void customIconStaticEntry(Bundle args) {
method customIconSearchEntry (line 454) | private void customIconSearchEntry(Bundle args) {
method customIconShortcut (line 470) | private void customIconShortcut(Bundle args) {
method customIconButton (line 487) | private void customIconButton(Bundle args) {
method onActivityCreated (line 500) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/customicon/IconViewHolder.java
class IconViewHolder (line 17) | public class IconViewHolder extends ViewHolderAdapter.ViewHolder<IconDat...
method IconViewHolder (line 21) | public IconViewHolder(View view) {
method setContent (line 26) | @Override
class AsyncLoad (line 34) | static class AsyncLoad extends AsyncTask<IconData, Drawable> {
method AsyncLoad (line 38) | protected AsyncLoad(IconViewHolder holder) {
method onPreExecute (line 43) | @Override
method doInBackground (line 51) | @Override
method onPostExecute (line 59) | @Override
method execute (line 74) | public void execute(IconData content) {
FILE: app/src/main/java/rocks/tbog/tblauncher/customicon/PageAdapter.java
class PageAdapter (line 15) | class PageAdapter extends androidx.viewpager.widget.PagerAdapter impleme...
method addPage (line 20) | void addPage(Page page) {
method getPageIterable (line 24) | @NonNull
method setupPageView (line 29) | public void setupPageView(@NonNull IconSelectDialog iconSelectDialog) {
method onPageScrolled (line 57) | @Override
method onPageSelected (line 72) | @Override
method onPageScrollStateChanged (line 80) | @Override
class Page (line 86) | static abstract class Page {
type OnItemClickListener (line 91) | public interface OnItemClickListener {
method onItemClick (line 92) | void onItemClick(Adapter adapter, View view, int position);
method Page (line 95) | Page(CharSequence name, View view) {
method setupView (line 100) | abstract void setupView(@NonNull DialogFragment dialogFragment, @Nul...
method addPickedIcon (line 102) | public void addPickedIcon(@NonNull Drawable pickedImage, String file...
method loadData (line 106) | void loadData() {
method getCount (line 111) | @Override
method isViewFromObject (line 116) | @Override
method getPageTitle (line 123) | @Nullable
method instantiateItem (line 129) | @NonNull
method destroyItem (line 137) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/customicon/ShortcutPage.java
class ShortcutPage (line 20) | public class ShortcutPage extends CustomShapePage {
method ShortcutPage (line 23) | ShortcutPage(CharSequence name, View view, ShortcutRecord shortcutReco...
method setupView (line 28) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/customicon/StaticEntryPage.java
class StaticEntryPage (line 16) | public class StaticEntryPage extends CustomShapePage {
method StaticEntryPage (line 19) | StaticEntryPage(CharSequence name, View view, StaticEntry staticEntry) {
method setupView (line 25) | @Override
class DefaultIconInfo (line 50) | static class DefaultIconInfo extends CustomShapePage.DefaultIconInfo {
method DefaultIconInfo (line 53) | DefaultIconInfo(@NonNull String name, IconsHandler.IconInfo icon) {
method getText (line 59) | @Nullable
FILE: app/src/main/java/rocks/tbog/tblauncher/customicon/SystemPage.java
class SystemPage (line 34) | public class SystemPage extends CustomShapePage {
method SystemPage (line 38) | SystemPage(CharSequence name, View view, ComponentName cn, UserHandleC...
method setupView (line 44) | @Override
method addSystemIcons (line 54) | private void addSystemIcons(Context context, ShapedIconAdapter adapter) {
method checkDuplicateDrawable (line 124) | private boolean checkDuplicateDrawable(ArraySet<Bitmap> set, Drawable ...
method addQuickOption (line 136) | private static void addQuickOption(@StringRes int textId, Drawable sha...
method loadIconPackIcons (line 145) | public void loadIconPackIcons(List<Pair<String, String>> iconPacks) {
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/ActionProvider.java
class ActionProvider (line 25) | public class ActionProvider extends DBProvider<ActionEntry> {
method toggleSearch (line 273) | private static void toggleSearch(@NonNull View v, @NonNull String quer...
method ActionProvider (line 279) | public ActionProvider(@NonNull Context context) {
method newLoadTask (line 283) | @Override
method mayFindById (line 303) | @Override
method getDefaultName (line 308) | @NonNull
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/AppCacheProvider.java
class AppCacheProvider (line 20) | public class AppCacheProvider implements IProvider<AppEntry> {
method AppCacheProvider (line 24) | public AppCacheProvider(@NonNull AppsHandler handler) {
method requestResults (line 28) | @WorkerThread
method reload (line 54) | public void reload(boolean cancelCurrentLoadTask) {
method isLoaded (line 57) | @Override
method getLoadDuration (line 62) | @Override
method setDirty (line 67) | @Override
method getLoadStep (line 72) | @Override
method mayFindById (line 77) | @Override
method findById (line 82) | @Override
method getPojos (line 87) | @Nullable
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/AppProvider.java
class AppProvider (line 29) | public class AppProvider extends Provider<AppEntry> {
method onReceive (line 34) | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
class AppsCallback (line 55) | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
method AppsCallback (line 59) | AppsCallback(Context context) {
method onPackageAdded (line 64) | @Override
method onPackageChanged (line 69) | @Override
method onPackageRemoved (line 74) | @Override
method onPackagesAvailable (line 79) | @Override
method onPackagesUnavailable (line 85) | @Override
method onPackagesSuspended (line 90) | @Override
method onPackagesUnsuspended (line 97) | @Override
method handleEvent (line 104) | private void handleEvent(String action, String packageName, android....
method onCreate (line 117) | @Override
method onDestroy (line 156) | @Override
method reload (line 169) | public void reload(boolean cancelCurrentLoadTask) {
method loadOver (line 181) | @Override
method requestResults (line 200) | @WorkerThread
method findById (line 215) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/CalculatorProvider.java
class CalculatorProvider (line 17) | public class CalculatorProvider extends SimpleProvider<CalculatorEntry> {
method CalculatorProvider (line 23) | public CalculatorProvider() {
method requestResults (line 30) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/ContactsProvider.java
class ContactsProvider (line 21) | public class ContactsProvider extends Provider<ContactEntry> {
method onChange (line 25) | @Override
method reload (line 33) | public void reload(boolean cancelCurrentLoadTask) {
method onCreate (line 39) | @Override
method onDestroy (line 62) | @Override
method requestResults (line 69) | @Override
method checkResults (line 77) | @WorkerThread
method findByPhone (line 124) | public ContactEntry findByPhone(String phoneNumber) {
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/DBProvider.java
class DBProvider (line 26) | public abstract class DBProvider<T extends EntryItem> implements IProvid...
method DBProvider (line 34) | public DBProvider(Context context) {
method requestResults (line 38) | @Override
method reload (line 42) | @Override
method newLoadTask (line 53) | protected abstract DBLoader<T> newLoadTask();
method isLoaded (line 55) | @Override
method getLoadDuration (line 60) | @Override
method setLoaded (line 65) | protected void setLoaded() {
method setDirty (line 69) | @Override
method getLoadStep (line 78) | @Override
method mayFindById (line 89) | @Override
method findById (line 100) | @Override
method getPojos (line 110) | @Nullable
class DBLoader (line 118) | protected abstract static class DBLoader<T extends EntryItem> extends ...
method DBLoader (line 121) | public DBLoader(DBProvider<T> provider) {
method getContext (line 126) | @Nullable
method doInBackground (line 132) | @WorkerThread
method getEntryItems (line 144) | @WorkerThread
method onPostExecute (line 147) | @MainThread
method execute (line 167) | public void execute() {
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/DialProvider.java
class DialProvider (line 11) | public class DialProvider extends SimpleProvider<ContactEntry> {
method DialProvider (line 18) | public DialProvider() {
method mayFindById (line 23) | @Override
method findById (line 28) | @Override
method requestResults (line 35) | @Override
method getResult (line 47) | private ContactEntry getResult(String phoneNumber) {
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/EntryToResultUtils.java
class EntryToResultUtils (line 16) | public class EntryToResultUtils {
type CheckResults (line 19) | interface CheckResults<T> {
method checkResults (line 20) | void checkResults(Collection<T> entries, FuzzyScore fuzzyScore, ISea...
method recursiveWordCheck (line 23) | @WorkerThread
method tagsCheckResults (line 49) | @WorkerThread
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/FilterProvider.java
class FilterProvider (line 15) | public class FilterProvider extends DBProvider<FilterEntry> {
method FilterProvider (line 65) | public FilterProvider(Context context) {
method newLoadTask (line 69) | @Override
method mayFindById (line 74) | @Override
method getDefaultName (line 79) | @NonNull
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/IProvider.java
type IProvider (line 16) | public interface IProvider<T extends EntryItem> {
method requestResults (line 27) | @WorkerThread
method reload (line 38) | void reload(boolean cancelCurrentLoadTask);
method isLoaded (line 48) | boolean isLoaded();
method getLoadDuration (line 55) | @Nullable
method setDirty (line 61) | void setDirty();
method getLoadStep (line 67) | int getLoadStep();
method mayFindById (line 77) | boolean mayFindById(@NonNull String id);
method findById (line 85) | T findById(@NonNull String id);
method getPojos (line 92) | @Nullable
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/ModProvider.java
class ModProvider (line 16) | public class ModProvider extends DBProvider<EntryItem> {
method ModProvider (line 18) | public ModProvider(Context context) {
method getLoadStep (line 22) | @Override
method newLoadTask (line 27) | @Override
class FavLoader (line 32) | private static class FavLoader extends DBProvider.DBLoader<EntryItem> {
method FavLoader (line 34) | public FavLoader(DBProvider<EntryItem> provider) {
method getEntryItems (line 38) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/Provider.java
class Provider (line 24) | public abstract class Provider<T extends EntryItem> extends Service impl...
method onCreate (line 49) | @Override
method isLoading (line 57) | protected boolean isLoading() {
method initialize (line 61) | protected void initialize(@NonNull LoadEntryItem<T> loader) {
method reload (line 75) | public void reload(boolean cancelCurrentLoadTask) {
method setDirty (line 85) | @Override
method isLoaded (line 90) | @Override
method getLoadDuration (line 95) | @Nullable
method getLoadStep (line 101) | @Override
method loadOver (line 106) | public void loadOver(ArrayList<T> results) {
method getScheme (line 120) | @NonNull
method mayFindById (line 133) | public boolean mayFindById(@NonNull String id) {
method findById (line 143) | public T findById(@NonNull String id) {
method getPojos (line 152) | @Nullable
method onStartCommand (line 160) | @Override
method onBind (line 167) | @Override
class LocalBinder (line 176) | public class LocalBinder extends Binder {
method getService (line 177) | public IProvider<T> getService() {
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/QuickListProvider.java
class QuickListProvider (line 18) | public class QuickListProvider extends DBProvider<EntryItem> {
method QuickListProvider (line 21) | public QuickListProvider(Context context) {
method getLoadStep (line 25) | @Override
method fixPlaceholders (line 91) | private void fixPlaceholders() {
method newLoadTask (line 107) | @Override
class QuickListLoader (line 112) | private static class QuickListLoader extends DBProvider.DBLoader<Entry...
method QuickListLoader (line 113) | public QuickListLoader(DBProvider<EntryItem> provider) {
method getEntryItems (line 117) | @Override
method onPostExecute (line 153) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/SearchProvider.java
class SearchProvider (line 27) | public class SearchProvider extends SimpleProvider<SearchEntry> {
method getDefaultSearchProviders (line 34) | @NonNull
method getAvailableSearchProviders (line 40) | @NonNull
method getSelectedProviderNames (line 50) | @NonNull
method sanitizeProviderName (line 62) | @NonNull
method sanitizeProviderUrl (line 71) | @NonNull
method SearchProvider (line 80) | public SearchProvider(Context context, SharedPreferences sharedPrefere...
method reload (line 87) | @Override
method mayFindById (line 105) | @Override
method findById (line 110) | @Override
method requestResults (line 118) | @Override
method getResults (line 123) | @NonNull
method getProviderUrl (line 169) | @Nullable
method getProviderName (line 179) | @NonNull
method makeProvider (line 187) | @NonNull
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/ShortcutsProvider.java
class ShortcutsProvider (line 35) | public class ShortcutsProvider extends Provider<ShortcutEntry> {
method onReceive (line 42) | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
class AppsCallback (line 94) | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
method AppsCallback (line 98) | AppsCallback(Context context) {
method onPackageRemoved (line 103) | @Override
method onPackageAdded (line 108) | @Override
method onPackageChanged (line 113) | @Override
method onPackagesAvailable (line 118) | @Override
method onPackagesUnavailable (line 123) | @Override
method onShortcutsChanged (line 128) | @RequiresApi(api = Build.VERSION_CODES.O)
method onCreate (line 157) | @Override
method onDestroy (line 180) | @Override
method reload (line 193) | @Override
method requestResults (line 214) | @WorkerThread
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/SimpleProvider.java
class SimpleProvider (line 17) | public abstract class SimpleProvider<T extends EntryItem> implements IPr...
method requestResults (line 19) | @Override
method reload (line 23) | @Override
method isLoaded (line 27) | @Override
method getLoadDuration (line 32) | @Nullable
method setDirty (line 38) | @Override
method getLoadStep (line 42) | @Override
method mayFindById (line 47) | @Override
method findById (line 52) | @Override
method getPojos (line 57) | @Nullable
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/TagsProvider.java
class TagsProvider (line 15) | public class TagsProvider extends DBProvider<TagEntry> {
method TagsProvider (line 17) | public TagsProvider(Context context) {
method newLoadTask (line 21) | @Override
method newTagEntryCheckId (line 26) | @Nullable
method getTagId (line 37) | @NonNull
method newTagEntry (line 42) | @NonNull
method mayFindById (line 49) | @Override
method getTagEntry (line 54) | @NonNull
method addTagEntry (line 63) | public void addTagEntry(TagEntry tagEntry) {
class FavLoader (line 68) | private static class FavLoader extends DBProvider.DBLoader<TagEntry> {
method FavLoader (line 70) | public FavLoader(DBProvider<TagEntry> provider) {
method getEntryItems (line 74) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/dataprovider/UpdateFromModsLoader.java
class UpdateFromModsLoader (line 12) | public class UpdateFromModsLoader<T extends StaticEntry> extends DBProvi...
method UpdateFromModsLoader (line 16) | public UpdateFromModsLoader(DBProvider<T> provider, T[] entries, int[]...
method getEntryItems (line 22) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/db/AppRecord.java
class AppRecord (line 3) | public final class AppRecord extends FlagsRecord {
method AppRecord (line 17) | public AppRecord() {
method getFlagsDB (line 21) | @Override
method hasCustomName (line 26) | public boolean hasCustomName() {
method hasCustomIcon (line 30) | public boolean hasCustomIcon() {
method isHidden (line 34) | public boolean isHidden() {
FILE: app/src/main/java/rocks/tbog/tblauncher/db/DB.java
class DB (line 11) | class DB extends SQLiteOpenHelper {
method DB (line 16) | DB(Context context) {
method onCreate (line 20) | @Override
method createHistory (line 30) | void createHistory(SQLiteDatabase database) {
method createTags (line 34) | void createTags(SQLiteDatabase database) {
method addTimeStamps (line 39) | private void addTimeStamps(SQLiteDatabase database) {
method addAppsTable (line 43) | private void addAppsTable(SQLiteDatabase db) {
method createShortcutsTable (line 48) | private void createShortcutsTable(SQLiteDatabase db) {
method createFavoritesTable (line 52) | void createFavoritesTable(SQLiteDatabase db, boolean generateDefaults) {
method createWidgetsTable (line 80) | private void createWidgetsTable(SQLiteDatabase db) {
method onUpgrade (line 84) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/db/DBHelper.java
class DBHelper (line 28) | public class DBHelper {
method DBHelper (line 39) | private DBHelper() {
method getDatabase (line 42) | private static SQLiteDatabase getDatabase(Context context) {
method readCursor (line 51) | private static ArrayList<ValuedHistoryRecord> readCursor(Cursor cursor) {
method insertHistory (line 76) | public static void insertHistory(Context context, String query, String...
method removeFromHistory (line 94) | public static void removeFromHistory(Context context, String record) {
method clearHistory (line 99) | public static void clearHistory(Context context) {
method setHistory (line 104) | public static void setHistory(Context context, Collection<ValuedHistor...
method getHistoryByFrecency (line 124) | private static Cursor getHistoryByFrecency(SQLiteDatabase db, int limi...
method getHistoryByFrequency (line 144) | private static Cursor getHistoryByFrequency(SQLiteDatabase db, int lim...
method getHistoryByRecency (line 153) | private static Cursor getHistoryByRecency(SQLiteDatabase db, int limit) {
method getHistoryByAdaptive (line 166) | private static Cursor getHistoryByAdaptive(SQLiteDatabase db, int hour...
method getHistoryRaw (line 177) | @NonNull
type HistoryMode (line 198) | public enum HistoryMode {
method getHistory (line 212) | @NonNull
method getHistoryLength (line 250) | public static int getHistoryLength(Context context) {
method getPreviousResultsForQuery (line 273) | public static ArrayList<ValuedHistoryRecord> getPreviousResultsForQuer...
method insertApp (line 288) | public static boolean insertApp(Context context, AppEntry entry) {
method insertShortcut (line 298) | public static boolean insertShortcut(@NonNull Context context, @NonNul...
method removeShortcut (line 319) | public static void removeShortcut(@NonNull Context context, @NonNull S...
method removeShortcut (line 324) | public static void removeShortcut(@NonNull Context context, long dbId) {
method renameShortcut (line 329) | public static void renameShortcut(@NonNull Context context, @NonNull S...
method getShortcutsNoIcons (line 351) | @NonNull
method getShortcutsNoIcons (line 381) | @NonNull
method getShortcutIcon (line 407) | @Nullable
method removeShortcuts (line 426) | public static void removeShortcuts(Context context, String packageName) {
method removeAllShortcuts (line 433) | public static void removeAllShortcuts(Context context) {
method addTag (line 447) | public static void addTag(Context context, String tag, EntryItem entry) {
method removeTag (line 464) | public static int removeTag(Context context, String tag, String entryI...
method renameTag (line 476) | public static int renameTag(Context context, String tagName, String ne...
method loadTags (line 499) | @NonNull
method setTagsMap (line 524) | public static void setTagsMap(Context context, Map<String, ? extends C...
method addTags (line 552) | public static void addTags(Context context, Map<String, ? extends Coll...
method loadTagList (line 575) | @NonNull
method loadTags (line 595) | @NonNull
method getAppsData (line 610) | @NonNull
method insertOrUpdateApps (line 632) | public static void insertOrUpdateApps(Context context, ArrayList<AppRe...
method deleteApps (line 656) | public static void deleteApps(Context context, ArrayList<AppRecord> ap...
method setCustomAppName (line 667) | public static void setCustomAppName(Context context, String componentN...
method setAppHidden (line 685) | public static boolean setAppHidden(Context context, String componentNa...
method removeAppHidden (line 706) | public static boolean removeAppHidden(Context context, String componen...
method setCustomStaticEntryName (line 727) | public static void setCustomStaticEntryName(Context context, String en...
method removeCustomAppName (line 755) | public static void removeCustomAppName(Context context, String compone...
method getAppRecord (line 773) | @Nullable
method setCachedAppIcon (line 792) | public static boolean setCachedAppIcon(Context context, String compone...
method setCustomAppIcon (line 811) | public static AppRecord setCustomAppIcon(Context context, String compo...
method setCustomStaticEntryIcon (line 831) | public static void setCustomStaticEntryIcon(Context context, String en...
method removeCustomAppIcon (line 860) | public static AppRecord removeCustomAppIcon(Context context, String co...
method removeCustomStaticEntryIcon (line 879) | public static void removeCustomStaticEntryIcon(Context context, String...
method removeCustomStaticEntryName (line 896) | public static void removeCustomStaticEntryName(Context context, String...
method getAppIcon (line 913) | @Nullable
method getCachedAppIcon (line 926) | @Nullable
method getCustomAppIcon (line 931) | @Nullable
method getCustomFavIcon (line 936) | @Nullable
method setMod (line 949) | public static void setMod(Context context, ModRecord fav) {
method setMods (line 967) | public static void setMods(Context context, Collection<Pair<ModRecord,...
method removeMod (line 991) | public static boolean removeMod(Context context, String record) {
method getMods (line 1001) | @NonNull
method updateQuickListPosition (line 1019) | public static boolean updateQuickListPosition(@NonNull Context context...
method getWidgets (line 1040) | public static ArrayList<WidgetRecord> getWidgets(@NonNull Context cont...
method addWidget (line 1055) | public static void addWidget(@NonNull Context context, WidgetRecord re...
method removeWidget (line 1063) | public static void removeWidget(@NonNull Context context, int appWidge...
method removeWidgetPlaceholder (line 1068) | public static void removeWidgetPlaceholder(@NonNull Context context, i...
method setWidgetProperties (line 1075) | public static void setWidgetProperties(@NonNull Context context, Widge...
FILE: app/src/main/java/rocks/tbog/tblauncher/db/ExportedData.java
class ExportedData (line 34) | public class ExportedData {
method parseTagList (line 70) | void parseTagList(@NonNull XmlPullParser xpp, int eventType) throws IO...
method parseFavorites (line 129) | public void parseFavorites(XmlPullParser xpp, int eventType) throws IO...
method parseApplications (line 228) | public void parseApplications(XmlPullParser xpp, int eventType) throws...
method parsePreferences (line 328) | void parsePreferences(@NonNull XmlPullParser xpp, int eventType) throw...
method parseWidgets_v1 (line 441) | public void parseWidgets_v1(XmlPullParser xpp, int eventType) throws I...
method parseWidgets_v2 (line 541) | public void parseWidgets_v2(XmlPullParser xpp, int eventType) throws I...
method parseHistory (line 599) | public void parseHistory(XmlPullParser xpp, int eventType) throws IOEx...
method addIcon (line 675) | private void addIcon(@NonNull FlagsRecord rec, String text, @Nullable ...
method addRecordTag (line 685) | private void addRecordTag(@Nullable String record, @NonNull String tag...
method saveToDB (line 698) | public void saveToDB(@NonNull Context context, @NonNull Method method) {
method saveTags (line 708) | private void saveTags(@NonNull Context context, Method method) {
method saveMods (line 741) | private void saveMods(Context context, Method method) {
method saveApplications (line 758) | private void saveApplications(Context context, Method method) {
method savePreferences (line 816) | @SuppressLint("ApplySharedPref")
method restoreWidgets (line 857) | private void restoreWidgets(Context context, Method method) {
method saveHistory (line 876) | private void saveHistory(Context context, Method method) {
type Method (line 896) | public enum Method {OVERWRITE, APPEND, SET}
FILE: app/src/main/java/rocks/tbog/tblauncher/db/FlagsRecord.java
class FlagsRecord (line 3) | public abstract class FlagsRecord {
method getFlagsDB (line 6) | public abstract int getFlagsDB();
method setFlags (line 8) | public void setFlags(int flags) {
method addFlags (line 12) | public void addFlags(int flags) {
method clearFlags (line 16) | public void clearFlags(int flags) {
method isFlagSet (line 20) | public boolean isFlagSet(int flag) {
FILE: app/src/main/java/rocks/tbog/tblauncher/db/ModRecord.java
class ModRecord (line 3) | public class ModRecord extends FlagsRecord {
method getFlagsDB (line 14) | @Override
method isInQuickList (line 19) | public boolean isInQuickList() {
method hasCustomName (line 23) | public boolean hasCustomName() {
method hasCustomIcon (line 27) | public boolean hasCustomIcon() {
method canBeCulled (line 31) | public boolean canBeCulled() {
FILE: app/src/main/java/rocks/tbog/tblauncher/db/PlaceholderWidgetRecord.java
class PlaceholderWidgetRecord (line 17) | public class PlaceholderWidgetRecord extends WidgetRecord {
method copyFrom (line 24) | @Override
method parseProperties (line 35) | @Override
method writeProperties (line 98) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/db/ShortcutRecord.java
class ShortcutRecord (line 3) | public class ShortcutRecord extends FlagsRecord {
method getFlagsDB (line 19) | @Override
method isOreo (line 24) | public boolean isOreo() {
FILE: app/src/main/java/rocks/tbog/tblauncher/db/ValuedHistoryRecord.java
class ValuedHistoryRecord (line 3) | public class ValuedHistoryRecord {
FILE: app/src/main/java/rocks/tbog/tblauncher/db/WidgetRecord.java
class WidgetRecord (line 21) | public class WidgetRecord {
method WidgetRecord (line 32) | public WidgetRecord() {
method WidgetRecord (line 35) | public WidgetRecord(@Nullable WidgetRecord rec) {
method copyFrom (line 41) | protected <T extends WidgetRecord> void copyFrom(@NonNull T o) {
method loadFromDB (line 51) | @NonNull
method parseProperties (line 72) | public void parseProperties(@NonNull XmlPullParser xpp, int eventType)...
method writeProperties (line 128) | public void writeProperties(@NonNull SimpleXmlWriter simpleXmlWriter, ...
method parseInt (line 147) | static int parseInt(String value) {
method packedProperties (line 155) | public String packedProperties() {
method saveProperties (line 172) | public void saveProperties(AppWidgetHostView view) {
FILE: app/src/main/java/rocks/tbog/tblauncher/db/XmlExport.java
class XmlExport (line 28) | public class XmlExport {
method tagsXml (line 32) | public static void tagsXml(@NonNull Context context, @NonNull Writer w...
method tagsXml (line 44) | public static void tagsXml(@NonNull Context context, @NonNull SimpleXm...
method modificationsXml (line 60) | public static void modificationsXml(@NonNull Context context, @NonNull...
method modificationsXml (line 72) | public static void modificationsXml(@NonNull Context context, @NonNull...
method applicationsXml (line 110) | public static void applicationsXml(@NonNull Context context, @NonNull ...
method applicationsXml (line 122) | public static void applicationsXml(@NonNull Context context, @NonNull ...
method interfaceXml (line 158) | public static void interfaceXml(@NonNull PreferenceGroup rootPref, @No...
method interfaceXml (line 170) | public static void interfaceXml(@NonNull PreferenceGroup rootPref, @No...
method preferencesXml (line 199) | public static void preferencesXml(@NonNull PreferenceGroup rootPref, @...
method preferencesXml (line 211) | public static void preferencesXml(@NonNull PreferenceGroup rootPref, @...
method widgetsXml (line 226) | public static void widgetsXml(@NonNull Context context, @NonNull Write...
method widgetsXml (line 238) | public static void widgetsXml(@NonNull Context context, @NonNull Simpl...
method historyXml (line 267) | public static void historyXml(@NonNull Context context, @NonNull Write...
method historyXml (line 279) | public static void historyXml(@NonNull Context context, @NonNull Simpl...
method backupXml (line 298) | public static void backupXml(@NonNull PreferenceGroup rootPref, @NonNu...
method recursiveWritePreferences (line 320) | private static void recursiveWritePreferences(@NonNull SimpleXmlWriter...
method writePreference (line 335) | private static void writePreference(@NonNull SimpleXmlWriter sx, @NonN...
FILE: app/src/main/java/rocks/tbog/tblauncher/db/XmlImport.java
class XmlImport (line 21) | public class XmlImport {
method settingsXml (line 24) | public static boolean settingsXml(@NonNull Context context, @NonNull F...
method settingsXml (line 34) | public static boolean settingsXml(@NonNull Context context, @Nullable ...
FILE: app/src/main/java/rocks/tbog/tblauncher/drawable/CodePointDrawable.java
class CodePointDrawable (line 8) | public class CodePointDrawable extends TextDrawable {
method CodePointDrawable (line 11) | public CodePointDrawable(int codePoint) {
method CodePointDrawable (line 15) | public CodePointDrawable(CharSequence text) {
method CodePointDrawable (line 19) | public CodePointDrawable(State state) {
method getConstantState (line 24) | @Nullable
method getText (line 30) | @Override
class State (line 35) | protected static class State extends ConstantState {
method State (line 38) | protected State(int cp) {
method newDrawable (line 42) | @NonNull
method getChangingConfigurations (line 48) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/drawable/DrawableUtils.java
class DrawableUtils (line 33) | public class DrawableUtils {
method shapeName (line 70) | @NonNull
method drawableToBitmap (line 85) | @NonNull
method getScaleToFit (line 102) | public static float getScaleToFit(int shape) {
method applyIconMaskShape (line 106) | public static Drawable applyIconMaskShape(Context ctx, Drawable icon, ...
method applyIconMaskShape (line 110) | public static Drawable applyIconMaskShape(Context ctx, Drawable icon, ...
method getMarginToFit (line 129) | private static float getMarginToFit(int shape) {
method getIconSize (line 158) | private static int getIconSize(@NonNull Context ctx, int shape) {
method applyAdaptiveIconBackgroundShape (line 163) | @SuppressLint("NewApi")
method applyIconMaskShape (line 211) | @SuppressLint("NewApi")
method cropIconShape (line 294) | private static void cropIconShape(Canvas canvas, Paint paint, int shap...
type PointProvider (line 439) | interface PointProvider {
method get (line 446) | void get(int in_pointIdx, @NonNull PointF out_point);
class Vector2D (line 452) | static class Vector2D {
method set (line 464) | void set(PointF A, PointF B) {
method roundedPolyPath (line 488) | private static void roundedPolyPath(@NonNull Path path, PointProvider ...
method isAdaptiveIconDrawable (line 560) | public static boolean isAdaptiveIconDrawable(Drawable drawable) {
method getProgressBarIndeterminate (line 567) | @Nullable
method setImageDrawable (line 585) | public static boolean setImageDrawable(@Nullable ImageView icon, @Null...
method getBitmapDrawable (line 593) | @Nullable
FILE: app/src/main/java/rocks/tbog/tblauncher/drawable/FourCodePointDrawable.java
class FourCodePointDrawable (line 10) | public class FourCodePointDrawable extends TextDrawable {
method FourCodePointDrawable (line 13) | public FourCodePointDrawable(int cp1, int cp2, int cp3, int cp4) {
method FourCodePointDrawable (line 17) | public FourCodePointDrawable(State state) {
method fromText (line 22) | @NonNull
method getConstantState (line 38) | @Nullable
method getLineCount (line 44) | @Override
method getText (line 49) | @Override
class State (line 64) | protected static class State extends ConstantState {
method State (line 67) | protected State(int cp1, int cp2, int cp3, int cp4) {
method newDrawable (line 74) | @NonNull
method getChangingConfigurations (line 80) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/drawable/LoadingDrawable.java
class LoadingDrawable (line 23) | public class LoadingDrawable extends SquareDrawable implements Animatabl...
method LoadingDrawable (line 31) | public LoadingDrawable() {
method draw (line 36) | @Override
method onBoundsChange (line 47) | @Override
method start (line 78) | @Override
method stop (line 98) | @Override
method isRunning (line 106) | @Override
method onAnimationUpdate (line 113) | @Override
method updatePath (line 119) | private void updatePath(float value) {
class Shape (line 127) | private static class Shape {
method Shape (line 132) | Shape(int width, int height, int posX, int posY) {
method addToPath (line 137) | void addToPath(Path path, float angle) {
FILE: app/src/main/java/rocks/tbog/tblauncher/drawable/SizeWrappedDrawable.java
class SizeWrappedDrawable (line 17) | public class SizeWrappedDrawable extends Drawable {
method SizeWrappedDrawable (line 22) | public SizeWrappedDrawable(@NonNull Drawable drawable, int size) {
method draw (line 27) | @Override
method setAlpha (line 32) | @Override
method setColorFilter (line 37) | @Override
method getOpacity (line 42) | @SuppressWarnings("deprecation")
method getIntrinsicWidth (line 48) | @Override
method getIntrinsicHeight (line 53) | @Override
method onBoundsChange (line 58) | @Override
method setTint (line 63) | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
method setTintList (line 69) | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
method setTintMode (line 75) | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
method setTintBlendMode (line 81) | @RequiresApi(api = Build.VERSION_CODES.Q)
method setHotspot (line 87) | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
method setHotspotBounds (line 93) | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
method getOutline (line 99) | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
method getDirtyBounds (line 105) | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
FILE: app/src/main/java/rocks/tbog/tblauncher/drawable/SquareDrawable.java
class SquareDrawable (line 20) | public abstract class SquareDrawable extends Drawable {
method SquareDrawable (line 33) | public SquareDrawable() {
method setAlpha (line 41) | @Override
method setColorFilter (line 46) | @Override
method getOpacity (line 51) | @SuppressWarnings("deprecation")
method getCenterRect (line 57) | protected Rect getCenterRect(@NonNull Rect bounds) {
FILE: app/src/main/java/rocks/tbog/tblauncher/drawable/TextDrawable.java
class TextDrawable (line 12) | public abstract class TextDrawable extends SquareDrawable {
method TextDrawable (line 19) | public TextDrawable() {
method getConstantState (line 24) | @Nullable
method setTextColor (line 28) | public void setTextColor(int color) {
method getLineCount (line 32) | protected int getLineCount() {
method getText (line 36) | protected abstract char[] getText(int line);
method onBoundsChange (line 38) | @Override
method precacheTextPosAndSize (line 45) | protected void precacheTextPosAndSize(Rect rect) {
method draw (line 117) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/drawable/TwoCodePointDrawable.java
class TwoCodePointDrawable (line 10) | public class TwoCodePointDrawable extends TextDrawable {
method TwoCodePointDrawable (line 14) | public TwoCodePointDrawable(int cp1, int cp2) {
method TwoCodePointDrawable (line 18) | public TwoCodePointDrawable(State state) {
method fromText (line 23) | @NonNull
method setVertical (line 32) | public void setVertical(boolean vertical) {
method getConstantState (line 36) | @Nullable
method getLineCount (line 42) | @Override
method getText (line 47) | @Override
class State (line 61) | protected static class State extends ConstantState {
method State (line 65) | protected State(int cp1, int cp2) {
method newDrawable (line 70) | @NonNull
method getChangingConfigurations (line 76) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/ActionEntry.java
class ActionEntry (line 15) | public class ActionEntry extends StaticEntry {
type DoAction (line 20) | public interface DoAction {
method doAction (line 21) | void doAction(View view, int flags);
method ActionEntry (line 24) | public ActionEntry(@NonNull String id, @NonNull Drawable icon) {
method ActionEntry (line 32) | public ActionEntry(@NonNull String id, @DrawableRes int icon) {
method displayResult (line 39) | @Override
method doLaunch (line 45) | @Override
method setAction (line 54) | public void setAction(@Nullable DoAction action) {
method getDefaultDrawable (line 58) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/AppEntry.java
class AppEntry (line 54) | public final class AppEntry extends EntryWithTags {
class IconInfo (line 68) | private static class IconInfo {
method setIconInfo (line 74) | public void setIconInfo(IconsHandler.IconInfo icon) {
method setCustomIcon (line 79) | public void setCustomIcon(long dbId) {
method clearCustomIcon (line 86) | public void clearCustomIcon() {
method AppEntry (line 92) | public AppEntry(@NonNull ComponentName component, @NonNull UserHandleC...
method AppEntry (line 96) | public AppEntry(@NonNull String packageName, @NonNull String activityN...
method generateAppId (line 109) | @NonNull
method generateAppId (line 114) | @NonNull
method getIconCacheId (line 119) | @NonNull
method getUserComponentName (line 125) | public String getUserComponentName() {
method getPackageName (line 129) | protected String getPackageName() {
method isHiddenByUser (line 133) | @Override
method setHiddenByUser (line 138) | public void setHiddenByUser(boolean hiddenByUser) {
method isExcludedFromHistory (line 142) | @Override
method setExcludedFromHistory (line 147) | public void setExcludedFromHistory(boolean excludedFromHistory) {
method canUninstall (line 151) | public boolean canUninstall() {
method getActivityList (line 155) | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
method getIconDrawable (line 160) | @WorkerThread
method getRealHandle (line 175) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
method setCustomIcon (line 180) | public void setCustomIcon(long dbId) {
method clearCustomIcon (line 184) | public void clearCustomIcon() {
method getCustomIcon (line 188) | public long getCustomIcon() {
method getResultLayout (line 196) | public static int[] getResultLayout() {
method getResultLayout (line 200) | @Override
method displayResult (line 207) | @Override
method displayGridResult (line 217) | private void displayGridResult(@NonNull View view, int drawFlags) {
method displayListResult (line 253) | private void displayListResult(@NonNull View view, int drawFlags) {
class ShortcutItem (line 305) | static class ShortcutItem extends LinearAdapter.ItemString {
method ShortcutItem (line 309) | public ShortcutItem(@NonNull String string, @NonNull ShortcutInfo in...
method buildPopupMenu (line 315) | @Override
method popupMenuClickHandler (line 405) | @Override
method doLaunch (line 488) | @Override
method launchRenameDialog (line 518) | private void launchRenameDialog(@NonNull Context ctx) {
method launchAppDetails (line 560) | private void launchAppDetails(Context context, View view) {
method launchAppStore (line 582) | private void launchAppStore(Context context, View view) {
method launchUninstall (line 606) | private void launchUninstall(Context context) {
method hibernate (line 612) | private void hibernate(Context context) {
class AsyncSetEntryIcon (line 623) | public static class AsyncSetEntryIcon extends AsyncSetEntryDrawable<Ap...
method AsyncSetEntryIcon (line 624) | public AsyncSetEntryIcon(@NonNull ImageView image, int drawFlags, @N...
method getDrawable (line 628) | @Override
method setDrawable (line 633) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/CalculatorEntry.java
class CalculatorEntry (line 21) | public final class CalculatorEntry extends SearchEntry {
method CalculatorEntry (line 24) | public CalculatorEntry(String query) {
method getHistoryId (line 29) | @Override
method displayResult (line 35) | @Override
method doLaunch (line 76) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/ContactEntry.java
class ContactEntry (line 50) | public class ContactEntry extends EntryItem {
method ContactEntry (line 81) | public ContactEntry(String id) {
method setNickname (line 88) | protected void setNickname(String nickname) {
method isPrimary (line 99) | public boolean isPrimary() {
method isStarred (line 103) | public boolean isStarred() {
method getImData (line 107) | public ImData getImData() {
method isHomeNumber (line 111) | public boolean isHomeNumber() {
method getTimesContacted (line 115) | public int getTimesContacted() {
method getPhone (line 119) | public String getPhone() {
method getResultLayout (line 127) | public static int[] getResultLayout() {
method getResultLayout (line 131) | @Override
method getIconDrawable (line 138) | @WorkerThread
method displayResult (line 154) | @Override
method displayGridResult (line 164) | private void displayGridResult(@NonNull View view, int drawFlags) {
method displayListResult (line 194) | private void displayListResult(@NonNull View view, int drawFlags) {
method displayNickname (line 252) | private void displayNickname(View root) {
method displayActions (line 266) | private void displayActions(View root, boolean hasPhone) {
method doLaunch (line 333) | @Override
method getButtonIdFromAction (line 363) | @NonNull
method showButtonPopup (line 377) | private static boolean showButtonPopup(@NonNull View view, @NonNull St...
method getButtonPopup (line 383) | @NonNull
class SetContactIconAsync (line 436) | public static class SetContactIconAsync extends AsyncSetEntryDrawable<...
method SetContactIconAsync (line 437) | public SetContactIconAsync(@NonNull ImageView image, int drawFlags, ...
method getDrawable (line 441) | @Override
class SetAppIconAsync (line 447) | public static class SetAppIconAsync extends AsyncSetEntryDrawable<Cont...
method SetAppIconAsync (line 448) | public SetAppIconAsync(@NonNull ImageView image, int drawFlags, @Non...
method getDrawable (line 452) | @Override
class ImData (line 469) | public static class ImData {
method ImData (line 476) | public ImData(String mimeType, long id, String label) {
method getIdentifier (line 482) | public String getIdentifier() {
method setIdentifier (line 486) | public void setIdentifier(String identifier) {
method getMimeType (line 490) | public String getMimeType() {
method getId (line 494) | public long getId() {
class Builder (line 499) | public static class Builder {
method setContactId (line 513) | public Builder setContactId(long contactId) {
method setPhone (line 518) | public Builder setPhone(String phone) {
method setMimeInfo (line 523) | public Builder setMimeInfo(long contentId, @NonNull String shortMime...
method setIconUri (line 529) | public Builder setIconUri(Uri iconUri) {
method setPrimary (line 534) | public Builder setPrimary(boolean primary) {
method setStarred (line 539) | public Builder setStarred(boolean starred) {
method setLookupKey (line 544) | public Builder setLookupKey(String lookupKey) {
method setName (line 549) | public Builder setName(@NonNull String name) {
method setNickname (line 554) | public Builder setNickname(@NonNull String nickname) {
method setImData (line 559) | public Builder setImData(@NonNull ImData imData) {
method getContact (line 564) | public ContactEntry getContact() {
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/DialContactEntry.java
class DialContactEntry (line 21) | public class DialContactEntry extends ContactEntry implements ICustomIco...
method DialContactEntry (line 26) | public DialContactEntry() {
method getHistoryId (line 30) | @Override
method getIconCacheId (line 36) | @NonNull
method setCustomIcon (line 43) | @Override
method clearCustomIcon (line 48) | @Override
method hasCustomIcon (line 53) | @Override
method getIconDrawable (line 58) | @Override
method buildPopupMenu (line 71) | @Override
method popupMenuClickHandler (line 90) | @Override
method setPhone (line 100) | public void setPhone(String phone) {
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/EntryItem.java
class EntryItem (line 27) | public abstract class EntryItem {
method EntryItem (line 102) | public EntryItem(@NonNull String id) {
method equals (line 106) | @Override
method hashCode (line 116) | @Override
method getName (line 121) | @NonNull
method setName (line 135) | public void setName(String name) {
method setName (line 146) | public void setName(String name, boolean generateNormalization) {
method getRelevance (line 155) | public int getRelevance() {
method addResultMatch (line 159) | public void addResultMatch(@NonNull StringNormalizer.Result normalized...
method setRelevance (line 163) | public void setRelevance(@NonNull StringNormalizer.Result normalizedNa...
method boostRelevance (line 167) | public void boostRelevance(int boost) {
method resetResultInfo (line 171) | public void resetResultInfo() {
method getHistoryId (line 179) | public String getHistoryId() {
method isExcludedFromHistory (line 183) | public boolean isExcludedFromHistory() {
method getResultLayout (line 191) | @LayoutRes
method displayResult (line 194) | public abstract void displayResult(@NonNull View view, int drawFlags);
method getIconCacheId (line 196) | @NonNull
class RelevanceComparator (line 201) | public static class RelevanceComparator implements java.util.Comparato...
method compare (line 202) | @Override
class NameComparator (line 212) | public static class NameComparator implements java.util.Comparator<Ent...
method compare (line 213) | @Override
method buildPopupMenu (line 227) | protected ListPopup buildPopupMenu(Context context, LinearAdapter adap...
method inflatePopupMenu (line 238) | ListPopup inflatePopupMenu(@NonNull Context context, @NonNull LinearAd...
method getPopupMenu (line 302) | @NonNull
method getPopupMenu (line 320) | @NonNull
method popupMenuClickHandler (line 331) | @CallSuper
method doLaunch (line 360) | public void doLaunch(@NonNull View view, int flags) {
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/EntryWithTags.java
class EntryWithTags (line 12) | public abstract class EntryWithTags extends EntryItem {
method isHiddenByUser (line 16) | public boolean isHiddenByUser() {
class TagDetails (line 20) | public static class TagDetails {
method equals (line 25) | @Override
method hashCode (line 35) | @Override
method TagDetails (line 40) | public TagDetails(@NonNull String name) {
method TagDetails (line 44) | public TagDetails(@NonNull String name, StringNormalizer.Result norm...
method EntryWithTags (line 50) | EntryWithTags(@NonNull String id) {
method getTags (line 54) | @NonNull
method setTags (line 59) | public void setTags(@Nullable List<String> tags) {
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/FilterEntry.java
class FilterEntry (line 12) | public class FilterEntry extends StaticEntry {
method FilterEntry (line 17) | public FilterEntry(@NonNull String id, @DrawableRes int icon, String f...
method displayResult (line 25) | @Override
method doLaunch (line 33) | @Override
method setOnClickListener (line 38) | public void setOnClickListener(@Nullable View.OnClickListener listener) {
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/ICustomIconEntry.java
type ICustomIconEntry (line 3) | public interface ICustomIconEntry {
method setCustomIcon (line 4) | void setCustomIcon();
method clearCustomIcon (line 6) | void clearCustomIcon();
method hasCustomIcon (line 8) | boolean hasCustomIcon();
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/OpenUrlEntry.java
class OpenUrlEntry (line 14) | public final class OpenUrlEntry extends UrlEntry {
method OpenUrlEntry (line 17) | public OpenUrlEntry(String query, String url) {
method getResultText (line 25) | @Override
method doLaunch (line 30) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/PlaceholderEntry.java
class PlaceholderEntry (line 16) | public class PlaceholderEntry extends StaticEntry {
method PlaceholderEntry (line 19) | public PlaceholderEntry(@NonNull String id, String position) {
method buildPopupMenu (line 24) | @Override
method getDefaultDrawable (line 33) | @Override
method doLaunch (line 39) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/ResultRelevance.java
class ResultRelevance (line 14) | public class ResultRelevance implements Comparable<ResultRelevance> {
method getRelevance (line 19) | public int getRelevance() {
method addMatchInfo (line 28) | public void addMatchInfo(@NonNull StringNormalizer.Result matchedText,...
method setMatchInfo (line 37) | public void setMatchInfo(@NonNull StringNormalizer.Result normalizedNa...
method boostRelevance (line 42) | public void boostRelevance(int boost) {
method resetRelevance (line 46) | public void resetRelevance() {
method forEach (line 51) | public void forEach(Consumer<ResultInfo> action) {
method compareTo (line 57) | @Override
method equals (line 74) | @Override
class ResultInfo (line 81) | public static class ResultInfo {
method ResultInfo (line 90) | private ResultInfo(@NonNull StringNormalizer.Result relevanceSource,...
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/SearchEngineEntry.java
class SearchEngineEntry (line 20) | public final class SearchEngineEntry extends UrlEntry {
method SearchEngineEntry (line 23) | public SearchEngineEntry(String engineName, String engineUrl) {
method getResultText (line 31) | @Override
method buildPopupMenuCategory (line 36) | @Override
method popupMenuClickHandler (line 48) | @Override
method doLaunch (line 61) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/SearchEntry.java
class SearchEntry (line 22) | public abstract class SearchEntry extends EntryItem implements ICustomIc...
method SearchEntry (line 29) | public SearchEntry(String id) {
method setQuery (line 33) | public void setQuery(@NonNull String query) {
method getHistoryId (line 37) | @Override
method getIconCacheId (line 43) | @NonNull
method setCustomIcon (line 49) | @Override
method clearCustomIcon (line 54) | @Override
method hasCustomIcon (line 59) | @Override
method getIconDrawable (line 68) | @WorkerThread
method getDefaultDrawable (line 81) | public Drawable getDefaultDrawable(Context context) {
method getResultLayout (line 85) | public static int[] getResultLayout() {
method getResultLayout (line 89) | @Override
method buildPopupMenu (line 96) | @Override
method buildPopupMenuCategory (line 114) | protected void buildPopupMenuCategory(Context context, @NonNull Linear...
method popupMenuClickHandler (line 122) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/ShortcutEntry.java
class ShortcutEntry (line 52) | public final class ShortcutEntry extends EntryWithTags {
method ShortcutEntry (line 66) | public ShortcutEntry(@NonNull String id, long dbId, @NonNull String pa...
method ShortcutEntry (line 75) | @RequiresApi(api = Build.VERSION_CODES.N_MR1)
method generateShortcutId (line 88) | public static String generateShortcutId(@NonNull ShortcutRecord rec) {
method getResultLayout (line 92) | public static int[] getResultLayout() {
method doShortcutLaunch (line 96) | public static void doShortcutLaunch(@NonNull Context context, @NonNull...
method doOreoLaunch (line 112) | @TargetApi(Build.VERSION_CODES.O)
method getAppDrawable (line 140) | @WorkerThread
method setIcons (line 201) | public static void setIcons(int drawFlags, @NonNull ImageView icon1, D...
method getIconCacheId (line 221) | @NonNull
method isOreoShortcut (line 231) | public boolean isOreoShortcut() {
method getOreoId (line 235) | public String getOreoId() {
method getIcon (line 240) | public Drawable getIcon(@NonNull Context context) {
method getResultLayout (line 257) | @Override
method displayResult (line 264) | @Override
method displayGridResult (line 274) | private void displayGridResult(@NonNull View view, int drawFlags) {
method displayListResult (line 306) | private void displayListResult(@NonNull View view, int drawFlags) {
method doLaunch (line 348) | @Override
method buildPopupMenu (line 359) | @Override
method popupMenuClickHandler (line 391) | @Override
method launchRenameDialog (line 413) | private void launchRenameDialog(@NonNull Context ctx) {
method setCustomIcon (line 429) | public void setCustomIcon() {
method clearCustomIcon (line 433) | public void clearCustomIcon() {
class AsyncSetEntryIcon (line 437) | public static class AsyncSetEntryIcon extends AsyncSetEntryDrawable<Sh...
method AsyncSetEntryIcon (line 440) | public AsyncSetEntryIcon(@NonNull ImageView image, int drawFlags, @N...
method getDrawable (line 444) | @Override
method onPostExecute (line 457) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/StaticEntry.java
class StaticEntry (line 34) | public abstract class StaticEntry extends EntryItem implements ICustomIc...
method StaticEntry (line 42) | public StaticEntry(@NonNull String id, @DrawableRes int icon) {
method getIconCacheId (line 47) | @NonNull
method buildPopupMenu (line 53) | @Override
method popupMenuClickHandler (line 76) | @Override
method launchRenameDialog (line 89) | private void launchRenameDialog(@NonNull Context c) {
method getResultLayout (line 128) | public static int[] getResultLayout() {
method getResultLayout (line 132) | @Override
method displayResult (line 139) | @Override
method setCustomIcon (line 164) | @Override
method clearCustomIcon (line 169) | @Override
method hasCustomIcon (line 174) | @Override
method isExcludedFromHistory (line 179) | @Override
method getIconDrawable (line 184) | @WorkerThread
method getDefaultDrawable (line 197) | public Drawable getDefaultDrawable(@NonNull Context context) {
class AsyncSetEntryIcon (line 201) | public static class AsyncSetEntryIcon extends AsyncSetEntryDrawable<St...
method AsyncSetEntryIcon (line 202) | public AsyncSetEntryIcon(@NonNull ImageView image, int drawFlags, @N...
method getDrawable (line 206) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/TagEntry.java
class TagEntry (line 18) | public class TagEntry extends StaticEntry {
method TagEntry (line 21) | public TagEntry(@NonNull String id) {
method setName (line 28) | @Override
method popupMenuClickHandler (line 39) | @Override
method doLaunch (line 49) | @Override
method displayResult (line 57) | @Override
method getDefaultDrawable (line 63) | @Override
method launchRenameDialog (line 68) | private void launchRenameDialog(@NonNull Context c) {
FILE: app/src/main/java/rocks/tbog/tblauncher/entry/UrlEntry.java
class UrlEntry (line 25) | public abstract class UrlEntry extends SearchEntry {
method UrlEntry (line 39) | public UrlEntry(@NonNull String id, @NonNull String url) {
method getHistoryId (line 44) | @Override
method getApplicationIconForUrl (line 50) | @Nullable
method isGoogleSearch (line 66) | protected static boolean isGoogleSearch(String url) {
method getResultText (line 73) | protected abstract String getResultText(Context context);
method getDefaultDrawable (line 75) | @Override
method displayResult (line 83) | @Override
class AsyncSetUrlEntryIcon (line 124) | public static class AsyncSetUrlEntryIcon extends AsyncSetEntryDrawable...
method AsyncSetUrlEntryIcon (line 125) | public AsyncSetUrlEntryIcon(@NonNull ImageView image, int drawFlags,...
method getDrawable (line 129) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/handler/AppsHandler.java
class AppsHandler (line 27) | public class AppsHandler {
method AppsHandler (line 34) | public AppsHandler(TBApplication application) {
method loadFromDB (line 39) | public void loadFromDB(boolean wait) {
method runWhenLoaded (line 85) | public void runWhenLoaded(@NonNull Runnable task) {
method setTagsForApps (line 94) | @WorkerThread
method record2app (line 105) | @NonNull
method getContext (line 121) | private Context getContext() {
method getAllApps (line 129) | @NonNull
method getApplications (line 143) | @NonNull
method getCacheProvider (line 157) | public AppCacheProvider getCacheProvider() {
method getAppRecords (line 161) | @NonNull
method updateAppCache (line 166) | public void updateAppCache(@Nullable ArrayList<AppRecord> insertOrUpda...
method setAppCache (line 175) | public void setAppCache(@Nullable ArrayList<AppEntry> list) {
FILE: app/src/main/java/rocks/tbog/tblauncher/handler/DataHandler.java
class DataHandler (line 72) | public class DataHandler extends BroadcastReceiver
method DataHandler (line 118) | public DataHandler(@NonNull Application app) {
method sendBroadcast (line 163) | public static void sendBroadcast(@NonNull Context context, @NonNull St...
method getContext (line 170) | @NonNull
method basicProviders (line 180) | private void basicProviders() {
method toggleableProviders (line 218) | private void toggleableProviders(SharedPreferences prefs) {
method onSharedPreferenceChanged (line 259) | @Override
method providerName2Intent (line 279) | private Intent providerName2Intent(@NonNull Context context, String na...
method connectToProvider (line 301) | private void connectToProvider(final String name, final int counter) {
method startService (line 351) | private boolean startService(Context context, Intent intent, String na...
method disconnectFromProvider (line 413) | private void disconnectFromProvider(String name) {
method allProvidersHaveLoaded (line 432) | private boolean allProvidersHaveLoaded() {
method providersHaveLoaded (line 448) | private boolean providersHaveLoaded(int step) {
method handleProviderLoaded (line 464) | private void handleProviderLoaded() {
method onReceive (line 501) | @Override
method appendDebugText (line 507) | public void appendDebugText(StringBuilder text) {
method requestResults (line 561) | @WorkerThread
method requestAllRecords (line 586) | public void requestAllRecords(Searcher searcher) {
method getHistoryMode (line 601) | @NonNull
method getHistory (line 627) | public List<EntryItem> getHistory(int itemCount, DBHelper.HistoryMode ...
method addShortcut (line 664) | public boolean addShortcut(ShortcutRecord record) {
method removeShortcut (line 677) | public void removeShortcut(ShortcutEntry shortcut) {
method removeShortcuts (line 693) | public void removeShortcuts(String packageName) {
method addToHidden (line 716) | public boolean addToHidden(AppEntry entry) {
method removeFromHidden (line 721) | public boolean removeFromHidden(AppEntry entry) {
method getContactsProvider (line 726) | @Nullable
method getShortcutsProvider (line 732) | @Nullable
method getAppProvider (line 738) | @Nullable
method getModProvider (line 744) | @Nullable
method getFilterProvider (line 750) | @Nullable
method getActionProvider (line 756) | @Nullable
method getTagsProvider (line 762) | @Nullable
method getQuickListProvider (line 768) | @Nullable
method getMods (line 779) | @NonNull
method removeFromMods (line 785) | public void removeFromMods(EntryItem entry) {
method addToHistory (line 800) | public void addToHistory(String id) {
method getPojo (line 808) | @Nullable
method renameApp (line 820) | public void renameApp(String componentName, String newName) {
method renameStaticEntry (line 832) | @Nullable
method removeRenameApp (line 867) | public void removeRenameApp(String componentName, String defaultName) {
method setCachedAppIcon (line 872) | public void setCachedAppIcon(String componentName, Bitmap bitmap) {
method setCustomAppIcon (line 884) | @Nullable
method setCustomStaticEntryIcon (line 895) | public void setCustomStaticEntryIcon(String entryId, Bitmap bitmap) {
method setCustomButtonIcon (line 907) | public void setCustomButtonIcon(String buttonId, Bitmap bitmap) {
method getCachedAppIcon (line 916) | public Bitmap getCachedAppIcon(String componentName) {
method getCustomAppIcon (line 924) | public Bitmap getCustomAppIcon(String componentName) {
method removeCustomAppIcon (line 932) | public AppRecord removeCustomAppIcon(String componentName) {
method removeCustomStaticEntryIcon (line 937) | public void removeCustomStaticEntryIcon(String entryId) {
method removeCustomButtonIcon (line 942) | public void removeCustomButtonIcon(String buttonId) {
method getCustomEntryIconById (line 947) | public Bitmap getCustomEntryIconById(@NonNull String entryId) {
method renameShortcut (line 955) | public void renameShortcut(ShortcutEntry shortcutEntry, String newName) {
method onProviderRecreated (line 960) | public void onProviderRecreated(Provider<? extends EntryItem> provider) {
method reloadProviders (line 985) | public void reloadProviders(int loadStep) {
method reloadProviders (line 1005) | public void reloadProviders() {
method checkServices (line 1032) | public void checkServices() {
method setQuickList (line 1043) | public void setQuickList(Iterable<String> records) {
method fullLoadOverSent (line 1097) | public boolean fullLoadOverSent() {
method runAfterLoadOver (line 1101) | public void runAfterLoadOver(@NonNull Runnable task) {
method executeAfterLoadOverTasks (line 1110) | public void executeAfterLoadOverTasks() {
class ProviderEntry (line 1129) | static final class ProviderEntry {
FILE: app/src/main/java/rocks/tbog/tblauncher/handler/IconsHandler.java
class IconsHandler (line 60) | public class IconsHandler {
method IconsHandler (line 78) | public IconsHandler(Context ctx) {
method onPrefChanged (line 89) | public void onPrefChanged(SharedPreferences pref) {
method getAdaptiveShape (line 104) | private static int getAdaptiveShape(SharedPreferences pref, String key) {
method loadIconsPack (line 117) | private void loadIconsPack(@Nullable String packageName) {
method cacheAppIcons (line 173) | private void cacheAppIcons(long cacheVersion) {
method resetCachedAppIcons (line 216) | public void resetCachedAppIcons() {
method getIconForPackage (line 227) | @WorkerThread
method getDrawableIconForPackage (line 298) | @WorkerThread
method getDrawableBadgeForPackage (line 308) | @WorkerThread
method loadAvailableIconsPacks (line 343) | private void loadAvailableIconsPacks() {
method getIconPackNames (line 361) | public HashMap<String, String> getIconPackNames() {
method getCustomIconPack (line 365) | @Nullable
method getSystemIconPack (line 370) | @NonNull
method getIconPack (line 375) | @NonNull
method getCustomIcon (line 380) | public Drawable getCustomIcon(StaticEntry staticEntry) {
method getCustomIcon (line 389) | public Drawable getCustomIcon(SearchEntry searchEntry) {
method getCustomIcon (line 398) | public Drawable getCustomIcon(ShortcutEntry shortcutEntry) {
method getCustomIcon (line 407) | public Drawable getCustomIcon(ContactEntry contactEntry) {
method getButtonIcon (line 416) | @Nullable
method getCachedAppIcon (line 424) | @WorkerThread
method getCustomIcon (line 434) | @WorkerThread
method getIconBitmap (line 444) | private static Bitmap getIconBitmap(Context ctx, Drawable drawable) {
method changeIcon (line 452) | public void changeIcon(AppEntry appEntry, Drawable drawable) {
method changeIcon (line 462) | public void changeIcon(ShortcutEntry shortcutEntry, Drawable drawable) {
method changeIcon (line 472) | public void changeIcon(StaticEntry staticEntry, Drawable drawable) {
method changeIcon (line 482) | public void changeIcon(SearchEntry searchEntry, Drawable drawable) {
method changeIcon (line 492) | public void changeIcon(DialContactEntry dialContactEntry, Drawable dra...
method changeIcon (line 502) | public void changeIcon(@NonNull String buttonId, Drawable drawable) {
method restoreDefaultIcon (line 510) | public void restoreDefaultIcon(AppEntry appEntry) {
method restoreDefaultIcon (line 518) | public void restoreDefaultIcon(ShortcutEntry shortcutEntry) {
method restoreDefaultIcon (line 526) | public void restoreDefaultIcon(StaticEntry staticEntry) {
method restoreDefaultIcon (line 534) | public void restoreDefaultIcon(SearchEntry searchEntry) {
method restoreDefaultIcon (line 542) | public void restoreDefaultIcon(DialContactEntry dialContactEntry) {
method restoreDefaultIcon (line 550) | public void restoreDefaultIcon(@NonNull String buttonId) {
method applyContactMask (line 557) | public Drawable applyContactMask(@NonNull Context ctx, @NonNull Drawab...
method applyShortcutMask (line 575) | public Drawable applyShortcutMask(@NonNull Context ctx, Bitmap bitmap) {
method getDefaultActivityIcon (line 584) | @NonNull
class IconInfo (line 601) | public static class IconInfo {
method setDynamic (line 606) | public void setDynamic() {
method isDynamic (line 610) | public boolean isDynamic() {
method setCachedAppIcon (line 614) | public IconInfo setCachedAppIcon(Drawable cachedAppIcon) {
method getDrawable (line 619) | public Drawable getDrawable() {
method setAdaptiveIcon (line 623) | public IconInfo setAdaptiveIcon(Drawable drawable) {
method setNonAdaptiveIcon (line 628) | public IconInfo setNonAdaptiveIcon(Drawable drawable) {
method setPackMask (line 633) | public IconInfo setPackMask() {
method setFitInside (line 637) | public IconInfo setFitInside(boolean fitInside) {
method getFitInside (line 642) | public Boolean getFitInside() {
FILE: app/src/main/java/rocks/tbog/tblauncher/handler/TagsHandler.java
class TagsHandler (line 44) | public class TagsHandler {
method TagsHandler (line 52) | public TagsHandler(TBApplication application) {
method loadFromDB (line 57) | @Nullable
method runWhenLoaded (line 103) | public void runWhenLoaded(@NonNull Runnable task) {
method getContext (line 112) | private Context getContext() {
method addTag (line 116) | public void addTag(EntryItem entry, String tag) {
method removeTag (line 126) | private boolean removeTag(String entryId, String tag) {
method removeTag (line 140) | public boolean removeTag(String tag) {
method getTags (line 151) | @NonNull
method getValidTags (line 165) | @NonNull
method validateTags (line 184) | public static void validateTags(@NonNull Context context, Map<String, ...
method getAllTags (line 209) | @NonNull
method getValidEntryIds (line 219) | @NonNull
method getAllEntryIds (line 233) | @NonNull
method getEntries (line 243) | @NonNull
method getTagsMenu (line 257) | @NonNull
method getAllEntryIds (line 279) | @NonNull
method addDefaultAliases (line 284) | private void addDefaultAliases() {
method addAliasesToEntry (line 346) | private void addAliasesToEntry(String aliases, String entryId, Map<Str...
method getApp (line 358) | private String getApp(PackageManager pm, String action) {
method getAppByCategory (line 363) | private String getAppByCategory(PackageManager pm, String category) {
method getApp (line 369) | private String getApp(PackageManager pm, Intent lookingFor) {
method getClockApp (line 382) | private String getClockApp(PackageManager pm) {
method setTags (line 427) | public void setTags(EntryWithTags entry, Set<String> tags) {
method renameTag (line 455) | public boolean renameTag(String tagName, String newName) {
method removeAllTags (line 515) | public void removeAllTags(String entryId) {
FILE: app/src/main/java/rocks/tbog/tblauncher/icons/CalendarDrawable.java
class CalendarDrawable (line 15) | public class CalendarDrawable extends DrawableInfo {
method CalendarDrawable (line 19) | protected CalendarDrawable(@NonNull String drawableName) {
method getDrawableResId (line 26) | @SuppressLint("DiscouragedApi")
method getDayDrawableId (line 34) | @SuppressLint("DiscouragedApi")
method isDynamic (line 49) | @Override
method getDrawable (line 54) | @Nullable
FILE: app/src/main/java/rocks/tbog/tblauncher/icons/DrawableInfo.java
class DrawableInfo (line 12) | public abstract class DrawableInfo {
method DrawableInfo (line 16) | protected DrawableInfo(@NonNull String drawableName) {
method getDrawableName (line 20) | @NonNull
method isDynamic (line 25) | public boolean isDynamic() {
method getDrawableResId (line 29) | @DrawableRes
method getDrawable (line 32) | @Nullable
method equals (line 35) | @Override
method hashCode (line 45) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/icons/IconPack.java
type IconPack (line 15) | public interface IconPack<DrawableInfo> {
method getPackPackageName (line 17) | @NonNull
method load (line 20) | void load(PackageManager packageManager);
method isLoaded (line 21) | boolean isLoaded();
method getComponentDrawable (line 23) | @Nullable
method isComponentDynamic (line 26) | boolean isComponentDynamic(@NonNull ComponentName componentName);
method applyBackgroundAndMask (line 28) | @NonNull
method getDrawableList (line 31) | @NonNull
method getDrawable (line 34) | @Nullable
FILE: app/src/main/java/rocks/tbog/tblauncher/icons/IconPackCache.java
class IconPackCache (line 12) | public class IconPackCache {
method getIconPack (line 15) | @NonNull
method clearCache (line 25) | public void clearCache(TBApplication app) {
class SoftReferenceCache (line 39) | static class SoftReferenceCache<K, V> {
method put (line 48) | public void put(K key, V value) {
method get (line 58) | @Nullable
method evictAll (line 74) | public void evictAll() {
FILE: app/src/main/java/rocks/tbog/tblauncher/icons/IconPackXML.java
class IconPackXML (line 45) | public class IconPackXML implements IconPack<DrawableInfo> {
method IconPackXML (line 68) | public IconPackXML(@NonNull String packageName) {
method isLoaded (line 73) | @Override
method load (line 78) | @Override
method loadDrawables (line 92) | public synchronized void loadDrawables(PackageManager packageManager) {
method hasMask (line 104) | public boolean hasMask() {
method getDrawableList (line 108) | @NonNull
method getComponentDrawable (line 114) | @Override
method isComponentDynamic (line 120) | @Override
method getCalendarDrawable (line 125) | @Nullable
method getComponentDrawable (line 135) | @Nullable
method getDrawable (line 144) | @Nullable
method getBitmap (line 153) | @NonNull
method applyBackgroundAndMask (line 159) | @NonNull
method generateBitmap (line 181) | @NonNull
method parseDrawableXML (line 232) | @SuppressLint("DiscouragedApi")
method findAppFilterXml (line 276) | @NonNull
method parseAppFilterXML (line 316) | @SuppressLint("DiscouragedApi")
method getPackPackageName (line 438) | @NonNull
method getResources (line 444) | @Nullable
FILE: app/src/main/java/rocks/tbog/tblauncher/icons/LazyLoadDrawable.java
class LazyLoadDrawable (line 12) | public class LazyLoadDrawable extends DrawableInfo {
method LazyLoadDrawable (line 18) | protected LazyLoadDrawable(@NonNull String drawableName) {
method getDrawableResId (line 22) | @SuppressLint("DiscouragedApi")
method getDrawable (line 36) | @SuppressLint("DiscouragedApi")
FILE: app/src/main/java/rocks/tbog/tblauncher/icons/SimpleDrawable.java
class SimpleDrawable (line 11) | public class SimpleDrawable extends DrawableInfo {
method SimpleDrawable (line 15) | public SimpleDrawable(@NonNull String drawableName, @DrawableRes int d...
method getDrawableResId (line 20) | @Override
method getDrawable (line 26) | @Nullable
FILE: app/src/main/java/rocks/tbog/tblauncher/icons/SystemIconPack.java
class SystemIconPack (line 23) | public class SystemIconPack implements IconPack<Drawable> {
method getPackPackageName (line 28) | @NonNull
method isLoaded (line 34) | @Override
method load (line 39) | @Override
method getAdaptiveShape (line 43) | public int getAdaptiveShape() {
method setAdaptiveShape (line 47) | public void setAdaptiveShape(int shape) {
method getComponentDrawable (line 51) | @Nullable
method isComponentDynamic (line 98) | @Override
method applyBackgroundAndMask (line 103) | @NonNull
method getDrawableList (line 109) | @NonNull
method getDrawable (line 115) | @Nullable
FILE: app/src/main/java/rocks/tbog/tblauncher/loader/LoadAppEntry.java
class LoadAppEntry (line 28) | public class LoadAppEntry extends LoadEntryItem<AppEntry> {
method LoadAppEntry (line 30) | public LoadAppEntry(Context context) {
method getScheme (line 34) | @NonNull
method doInBackground (line 40) | @Override
class SystemAppLoader (line 56) | public static class SystemAppLoader {
method SystemAppLoader (line 62) | SystemAppLoader(@Nullable Context context) {
method getAppList (line 66) | @NonNull
method processApp (line 145) | @NonNull
FILE: app/src/main/java/rocks/tbog/tblauncher/loader/LoadCacheApps.java
class LoadCacheApps (line 17) | public class LoadCacheApps extends LoadEntryItem<AppEntry> {
method LoadCacheApps (line 21) | public LoadCacheApps(Context context) {
method getScheme (line 28) | @NonNull
method doInBackground (line 34) | @Override
method getApps (line 65) | @NonNull
FILE: app/src/main/java/rocks/tbog/tblauncher/loader/LoadContactsEntry.java
class LoadContactsEntry (line 28) | public class LoadContactsEntry extends LoadEntryItem<ContactEntry> {
method LoadContactsEntry (line 32) | public LoadContactsEntry(Context context) {
method getScheme (line 36) | @NonNull
method doInBackground (line 42) | @Override
method loadBasicContacts (line 118) | @NonNull
method loadRawContacts (line 162) | private static Map<Long, BasicRawContact> loadRawContacts(@NonNull Con...
method createPhoneContacts (line 193) | private static ArrayList<ContactEntry> createPhoneContacts(@NonNull Co...
method createGenericContacts (line 245) | @NonNull
method addContactToMap (line 331) | private static void addContactToMap(@NonNull ContactEntry contact, @No...
method getFilteredContacts (line 349) | private static ArrayList<ContactEntry> getFilteredContacts(Map<String,...
type IdSupplier (line 381) | @FunctionalInterface
method getId (line 383) | Object getId(ContactEntry contact);
class BasicContact (line 387) | private static class BasicContact {
method BasicContact (line 396) | private BasicContact(String lookupKey, long contactId, String displa...
method getLookupKey (line 404) | public String getLookupKey() {
method getContactId (line 408) | public long getContactId() {
method getDisplayName (line 412) | public String getDisplayName() {
method getNickName (line 416) | public String getNickName() {
method setNickName (line 420) | public void setNickName(String nickName) {
method setLabel (line 424) | public void setLabel(String label) {
method getIcon (line 428) | public Uri getIcon() {
class BasicRawContact (line 442) | private static class BasicRawContact {
method BasicRawContact (line 447) | private BasicRawContact(long id, String accountType, boolean starred) {
method getId (line 453) | public long getId() {
method getAccountType (line 457) | public String getAccountType() {
method isStarred (line 461) | public boolean isStarred() {
FILE: app/src/main/java/rocks/tbog/tblauncher/loader/LoadEntryItem.java
class LoadEntryItem (line 16) | public abstract class LoadEntryItem<T extends EntryItem> extends AsyncTa...
method LoadEntryItem (line 21) | LoadEntryItem(Context context) {
method setProvider (line 26) | public void setProvider(Provider<T> provider) {
method getScheme (line 30) | @NonNull
method doInBackground (line 33) | protected abstract ArrayList<T> doInBackground(Void param);
method onPostExecute (line 35) | protected void onPostExecute(ArrayList<T> result) {
method execute (line 42) | public void execute() {
FILE: app/src/main/java/rocks/tbog/tblauncher/loader/LoadShortcutsEntryItem.java
class LoadShortcutsEntryItem (line 24) | public class LoadShortcutsEntryItem extends LoadEntryItem<ShortcutEntry> {
method LoadShortcutsEntryItem (line 29) | public LoadShortcutsEntryItem(Context context) {
method getScheme (line 39) | @NonNull
method doInBackground (line 45) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/normalizer/IntSequenceBuilder.java
class IntSequenceBuilder (line 9) | class IntSequenceBuilder {
method IntSequenceBuilder (line 17) | public IntSequenceBuilder(int capacity) {
method add (line 29) | public void add(int element) {
method toArray (line 50) | public int[] toArray() {
FILE: app/src/main/java/rocks/tbog/tblauncher/normalizer/PhoneNormalizer.java
class PhoneNormalizer (line 3) | public class PhoneNormalizer {
method simplifyPhoneNumber (line 4) | public static StringNormalizer.Result simplifyPhoneNumber(String phone...
FILE: app/src/main/java/rocks/tbog/tblauncher/normalizer/StringNormalizer.java
class StringNormalizer (line 10) | public class StringNormalizer {
method StringNormalizer (line 11) | private StringNormalizer() {
method normalizeWithResult (line 35) | public static Result normalizeWithResult(CharSequence input, boolean m...
class Result (line 101) | public static class Result implements Comparable<Result> {
method Result (line 106) | Result(final int originalInputLastCharPosition,
method length (line 115) | public int length() {
method mapPosition (line 125) | public int mapPosition(int position) {
method compareTo (line 132) | @Override
method equals (line 154) | @Override
method hashCode (line 166) | @Override
method toString (line 171) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/BaseListPreferenceDialog.java
class BaseListPreferenceDialog (line 10) | public class BaseListPreferenceDialog extends ListPreferenceDialogFragme...
method newInstance (line 12) | public static BaseListPreferenceDialog newInstance(String key) {
method onPrepareDialogBuilder (line 20) | @Override
method onStart (line 26) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/BaseMultiSelectListPreferenceDialog.java
class BaseMultiSelectListPreferenceDialog (line 10) | public class BaseMultiSelectListPreferenceDialog extends MultiSelectList...
method newInstance (line 12) | public static BaseMultiSelectListPreferenceDialog newInstance(String k...
method onPrepareDialogBuilder (line 20) | @Override
method onStart (line 26) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/BasePreferenceDialog.java
class BasePreferenceDialog (line 16) | public abstract class BasePreferenceDialog extends PreferenceDialogFragm...
method getDialogLifecycleOwner (line 20) | public LifecycleOwner getDialogLifecycleOwner() {
method onBindDialogView (line 24) | @Override
method onPrepareDialogBuilder (line 31) | @Override
method onStart (line 37) | @Override
method onStop (line 60) | @Override
method onDestroyView (line 66) | @Override
method onResume (line 73) | @Override
method onPause (line 79) | @Override
class DialogLifecycleOwner (line 85) | protected static class DialogLifecycleOwner implements LifecycleOwner {
method DialogLifecycleOwner (line 88) | public DialogLifecycleOwner() {
method onCreate (line 92) | public void onCreate() {
method onStart (line 96) | public void onStart() {
method onResume (line 100) | public void onResume() {
method onPause (line 104) | public void onPause() {
method onStop (line 108) | public void onStop() {
method onDestroy (line 112) | public void onDestroy() {
method getLifecycle (line 116) | @NonNull
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/ConfirmDialog.java
class ConfirmDialog (line 34) | public class ConfirmDialog extends BasePreferenceDialog {
method newInstance (line 38) | public static ConfirmDialog newInstance(String key) {
method onDialogClosed (line 47) | @SuppressLint("ApplySharedPref")
method onBindDialogView (line 152) | @Override
method loadAllPreferences (line 203) | @WorkerThread
method onStart (line 228) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/ContentLoadHelper.java
class ContentLoadHelper (line 39) | public class ContentLoadHelper {
method generateResultPopupContent (line 48) | public static OrderedMultiSelectListData generateResultPopupContent(@N...
method generateTagsMenuContent (line 98) | public static OrderedMultiSelectListData generateTagsMenuContent(@NonN...
method generateStaticEntryList (line 151) | public static Pair<CharSequence[], CharSequence[]> generateStaticEntry...
method setMultiListValues (line 188) | public static void setMultiListValues(@Nullable Preference preference,...
class CategoryItem (line 198) | public static class CategoryItem {
method CategoryItem (line 216) | public CategoryItem(int textId, String value) {
method updateText (line 226) | public void updateText(@NonNull Context context) {
class OrderedMultiSelectListData (line 231) | public static class OrderedMultiSelectListData {
method OrderedMultiSelectListData (line 237) | public OrderedMultiSelectListData(CharSequence[] entries, CharSequen...
method reloadOrderedValues (line 252) | public void reloadOrderedValues(@NonNull SharedPreferences sharedPre...
method setMultiListValues (line 259) | public void setMultiListValues(@Nullable Preference preference) {
method setOrderedListValues (line 274) | public void setOrderedListValues(@Nullable Preference preference) {
method getOrderedListValues (line 297) | public List<String> getOrderedListValues() {
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/CustomDialogPreference.java
class CustomDialogPreference (line 22) | public class CustomDialogPreference extends androidx.preference.DialogPr...
method CustomDialogPreference (line 26) | public CustomDialogPreference(Context context, AttributeSet attrs, int...
method CustomDialogPreference (line 30) | public CustomDialogPreference(Context context, AttributeSet attrs, int...
method CustomDialogPreference (line 34) | public CustomDialogPreference(Context context, AttributeSet attrs) {
method CustomDialogPreference (line 38) | public CustomDialogPreference(Context context) {
method getValue (line 42) | public Object getValue() {
method setValue (line 46) | public void setValue(Object value) {
method persistValue (line 50) | public boolean persistValue() {
method persistValueIfAllowed (line 61) | public boolean persistValueIfAllowed() {
method persistValueIfAllowed (line 68) | public boolean persistValueIfAllowed(Object value) {
method onSetInitialValue (line 76) | @Override
method onGetDefaultValue (line 83) | @Override
method onBindViewHolder (line 96) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/EditAddResetEditor.java
class EditAddResetEditor (line 17) | public abstract class EditAddResetEditor extends AndroidViewModel {
method getFragmentManager (line 19) | protected FragmentManager getFragmentManager() {
method EditAddResetEditor (line 22) | public EditAddResetEditor(@NonNull Application application) {
method loadDefaults (line 26) | public void loadDefaults(@NonNull Context context)
method loadData (line 31) | public void loadData(@NonNull Context context, @NonNull SharedPreferen...
method loadDefaultsInternal (line 36) | @WorkerThread
method loadDataInternal (line 38) | @WorkerThread
method applyChanges (line 40) | public abstract void applyChanges(@NonNull Context context);
method bindEditView (line 41) | public abstract void bindEditView(@NonNull View view);
method bindAddView (line 42) | public abstract void bindAddView(@NonNull View view);
method onStartLifecycle (line 44) | public void onStartLifecycle(@NonNull Dialog dialog, @NonNull BasePref...
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/EditAddResetPreferenceDialog.java
class EditAddResetPreferenceDialog (line 16) | public abstract class EditAddResetPreferenceDialog extends BasePreferenc...
method newInstance (line 21) | @Nullable
method getEditAddResetKeys (line 37) | @NonNull
method newEditor (line 40) | @Nullable
method onCreateDialog (line 43) | @NonNull
method onDialogClosed (line 50) | @Override
method onBindDialogView (line 58) | @Override
method onStart (line 87) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/EditSearchEnginesPreferenceDialog.java
class EditSearchEnginesPreferenceDialog (line 46) | public class EditSearchEnginesPreferenceDialog extends EditAddResetPrefe...
method newInstance (line 47) | @Nullable
method newEditor (line 52) | @Nullable
method getEditAddResetKeys (line 58) | @NonNull
class EditSearchEngines (line 63) | public static class EditSearchEngines extends EditAddResetEditor {
method EditSearchEngines (line 69) | public EditSearchEngines(@NonNull Application application) {
method getSearchEngineInfoList (line 73) | public LiveData<ArrayList<SearchEngineInfo>> getSearchEngineInfoList...
method getDefaultProviderName (line 77) | public LiveData<String> getDefaultProviderName() {
method setDefaultProviderName (line 81) | public void setDefaultProviderName(String name) {
method updateSearchEngineInfoList (line 85) | public void updateSearchEngineInfoList(SearchEngineInfo info) {
method loadDefaultsInternal (line 91) | @Override
method loadDataInternal (line 107) | @Override
method applyChanges (line 132) | public void applyChanges(@NonNull Context context) {
method bindEditView (line 170) | public void bindEditView(@NonNull View view) {
method bindAddView (line 227) | public void bindAddView(@NonNull View view) {
method launchRenameDialog (line 255) | private void launchRenameDialog(Context ctx, SearchEngineInfo info) {
method launchEditUrlDialog (line 290) | private void launchEditUrlDialog(Context ctx, SearchEngineInfo info) {
method onStartLifecycle (line 313) | public void onStartLifecycle(@NonNull Dialog dialog, @NonNull BasePr...
class SearchEngineInfo (line 328) | public static class SearchEngineInfo {
type Action (line 336) | public enum Action {NONE, DELETE, RENAME}
method SearchEngineInfo (line 338) | public SearchEngineInfo(@NonNull String searchProvider) {
method equals (line 344) | @Override
method hashCode (line 358) | @Override
class SearchEngineAdapter (line 364) | public static class SearchEngineAdapter extends ViewHolderListAdapter<...
method SearchEngineAdapter (line 366) | SearchEngineAdapter(@NonNull ArrayList<SearchEngineInfo> list) {
method getItemViewTypeLayout (line 370) | @Override
method getItemViewType (line 377) | public int getItemViewType(int position) {
method getViewTypeCount (line 381) | public int getViewTypeCount() {
method replaceItems (line 385) | public void replaceItems(Collection<? extends SearchEngineInfo> list) {
class TagViewHolder (line 394) | public static class TagViewHolder extends ViewHolderAdapter.ViewHolder...
method TagViewHolder (line 397) | public TagViewHolder(View itemView) {
method setContent (line 403) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/EditSearchHintPreferenceDialog.java
class EditSearchHintPreferenceDialog (line 42) | public class EditSearchHintPreferenceDialog extends EditAddResetPreferen...
method newInstance (line 44) | @Nullable
method newEditor (line 49) | @Nullable
method getEditAddResetKeys (line 55) | @NonNull
class EditSearchHint (line 60) | public static class EditSearchHint extends EditAddResetEditor {
method EditSearchHint (line 65) | public EditSearchHint(@NonNull Application application) {
method updateSearchHintList (line 69) | public void updateSearchHintList(SearchHintInfo info) {
method applyChanges (line 75) | public void applyChanges(@NonNull Context context) {
method bindEditView (line 107) | public void bindEditView(@NonNull View view) {
method bindAddView (line 153) | public void bindAddView(@NonNull View view) {
method launchRenameDialog (line 166) | private void launchRenameDialog(@NonNull Context ctx, @NonNull Searc...
method onStartLifecycle (line 197) | public void onStartLifecycle(@NonNull Dialog dialog, @NonNull BasePr...
method loadDataInternal (line 210) | public void loadDataInternal(@NonNull Context context, @NonNull Shar...
method loadDefaultsInternal (line 233) | public void loadDefaultsInternal(@NonNull Context context) {
class SearchHintInfo (line 248) | public static class SearchHintInfo {
type Action (line 255) | public enum Action {NONE, DELETE, RENAME}
method SearchHintInfo (line 257) | public SearchHintInfo(@NonNull String hintText) {
method equals (line 262) | @Override
method hashCode (line 275) | @Override
class SearchHintAdapter (line 281) | public static class SearchHintAdapter extends ViewHolderListAdapter<Se...
method SearchHintAdapter (line 283) | public SearchHintAdapter(@NonNull List<SearchHintInfo> list) {
method getItemViewTypeLayout (line 287) | @Override
method getItemViewType (line 294) | public int getItemViewType(int position) {
method getViewTypeCount (line 298) | public int getViewTypeCount() {
method getItems (line 302) | public List<SearchHintInfo> getItems() {
method replaceItems (line 306) | public void replaceItems(Collection<? extends SearchHintInfo> list) {
class SearchHintVH (line 315) | public static class SearchHintVH extends ViewHolderAdapter.ViewHolder<...
method SearchHintVH (line 318) | public SearchHintVH(View view) {
method setContent (line 323) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/IconListPreferenceDialog.java
class IconListPreferenceDialog (line 39) | public class IconListPreferenceDialog extends PreferenceDialogFragmentCo...
method newInstance (line 49) | public static IconListPreferenceDialog newInstance(String key) {
method onCreate (line 57) | @Override
method onSaveInstanceState (line 77) | @Override
method onPrepareDialogBuilder (line 85) | @Override
method onStart (line 122) | @Override
method getListPreference (line 128) | private ListPreference getListPreference() {
method getItemLayout (line 132) | @LayoutRes
method onDialogClosed (line 148) | @Override
class IconEntry (line 159) | private static class IconEntry {
method IconEntry (line 163) | public IconEntry(CharSequence name, CharSequence value) {
class IconAdapter (line 169) | private static class IconAdapter extends ViewHolderListAdapter<IconEnt...
method IconAdapter (line 170) | protected IconAdapter(@NonNull Class<? extends ViewHolder<IconEntry>...
class ShapeViewHolder (line 175) | public static class ShapeViewHolder extends ViewHolderAdapter.ViewHold...
method ShapeViewHolder (line 183) | public ShapeViewHolder(View view) {
method setContent (line 221) | @Override
class PackViewHolder (line 264) | public static class PackViewHolder extends ViewHolderAdapter.ViewHolde...
method PackViewHolder (line 268) | public PackViewHolder(View view) {
method setContent (line 275) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/MarginDialog.java
class MarginDialog (line 19) | public class MarginDialog extends BasePreferenceDialog {
method newInstance (line 24) | public static MarginDialog newInstance(String key) {
method onDialogClosed (line 33) | @Override
method onBindDialogView (line 60) | @Override
class LiveMarginParameters (line 141) | private static class LiveMarginParameters {
method LiveMarginParameters (line 145) | public LiveMarginParameters(Float dx, Float dy) {
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/MultiDependencies.java
class MultiDependencies (line 13) | public abstract class MultiDependencies {
method findPreferenceInHierarchy (line 41) | protected abstract Preference findPreferenceInHierarchy(String key);
method MultiDependencies (line 43) | public MultiDependencies(Preference host, AttributeSet attrs) {
method register (line 57) | public void register() {
method unregister (line 62) | public void unregister() {
method onDependencyChanged (line 66) | public void onDependencyChanged(Preference dependency, boolean disable...
method setDependencyState (line 71) | private void setDependencyState(String key, boolean enabled) {
method getAttributeStringValue (line 76) | private static String getAttributeStringValue(AttributeSet attrs, Stri...
method registerDependencies (line 83) | private void registerDependencies() {
method unregisterDependencies (line 105) | private void unregisterDependencies() {
method setHostState (line 126) | private void setHostState() {
method hasDependencies (line 137) | public boolean hasDependencies() {
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/MultiDependenciesSwitchPreference.java
class MultiDependenciesSwitchPreference (line 11) | public class MultiDependenciesSwitchPreference extends SwitchPreference {
method MultiDependenciesSwitchPreference (line 15) | public MultiDependenciesSwitchPreference(@NonNull Context context, @Nu...
method MultiDependenciesSwitchPreference (line 20) | public MultiDependenciesSwitchPreference(@NonNull Context context, @Nu...
method MultiDependenciesSwitchPreference (line 25) | public MultiDependenciesSwitchPreference(@NonNull Context context, @Nu...
method MultiDependenciesSwitchPreference (line 30) | public MultiDependenciesSwitchPreference(@NonNull Context context) {
method initMultiDep (line 34) | private void initMultiDep(@Nullable AttributeSet attrs) {
method onAttached (line 43) | @Override
method onDetached (line 49) | @Override
method onPrepareForRemoval (line 55) | @Override
method onDependencyChanged (line 61) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/OrderListPreferenceDialog.java
class OrderListPreferenceDialog (line 25) | public class OrderListPreferenceDialog extends PreferenceDialogFragmentC...
method newInstance (line 37) | public static OrderListPreferenceDialog newInstance(String key) {
method onCreate (line 45) | @Override
method onSaveInstanceState (line 72) | @Override
method getListPreference (line 81) | private MultiSelectListPreference getListPreference() {
method generateEntryList (line 85) | protected ArrayList<ListEntry> generateEntryList() {
method onPrepareDialogBuilder (line 95) | @Override
method onStart (line 132) | @Override
method generateNewValues (line 138) | protected void generateNewValues(List<ListEntry> list) {
method onDialogClosed (line 149) | @Override
class ListEntry (line 162) | public static class ListEntry {
method ListEntry (line 166) | public ListEntry(@NonNull CharSequence name, @NonNull String value) {
method equals (line 171) | @Override
method hashCode (line 181) | @Override
class EntryAdapter (line 187) | private static class EntryAdapter extends ViewHolderListAdapter<ListEn...
type OnItemClickListener (line 192) | public interface OnItemClickListener {
method onClick (line 193) | void onClick(EntryAdapter adapter, View view, int position);
method EntryAdapter (line 196) | protected EntryAdapter(@NonNull Class<? extends EntryViewHolder> vie...
method getList (line 200) | public List<ListEntry> getList() {
class EntryViewHolder (line 205) | public static class EntryViewHolder extends ViewHolderAdapter.ViewHold...
method EntryViewHolder (line 210) | protected EntryViewHolder(View view) {
method setContent (line 217) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/PreferenceColorDialog.java
class PreferenceColorDialog (line 30) | public class PreferenceColorDialog extends BasePreferenceDialog {
method newInstance (line 36) | public static PreferenceColorDialog newInstance(String key) {
method onDialogClosed (line 45) | @Override
method onCreate (line 61) | @Override
method onCreateDialogView (line 82) | @Override
method onSaveInstanceState (line 139) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/PreviewImagePreference.java
class PreviewImagePreference (line 26) | public class PreviewImagePreference extends androidx.preference.DialogPr...
method PreviewImagePreference (line 28) | public PreviewImagePreference(Context context, AttributeSet attrs, int...
method PreviewImagePreference (line 32) | public PreviewImagePreference(Context context, AttributeSet attrs, int...
method PreviewImagePreference (line 36) | public PreviewImagePreference(Context context, AttributeSet attrs) {
method PreviewImagePreference (line 40) | public PreviewImagePreference(Context context) {
method onBindViewHolder (line 44) | @SuppressLint("ClickableViewAccessibility")
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/QuickListPreferenceDialog.java
class QuickListPreferenceDialog (line 8) | public class QuickListPreferenceDialog extends BasePreferenceDialog {
method newInstance (line 12) | public static QuickListPreferenceDialog newInstance(String key) {
method onDialogClosed (line 21) | @Override
method onBindDialogView (line 28) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/SeekBarChangeListener.java
class SeekBarChangeListener (line 8) | public abstract class SeekBarChangeListener<T> implements SeekBar.OnSeek...
type ValueChanged (line 13) | interface ValueChanged<T> {
method valueChanged (line 14) | void valueChanged(T newValue);
method SeekBarChangeListener (line 17) | public SeekBarChangeListener(int offset, TextView textView, ValueChang...
method onStartTrackingTouch (line 23) | @Override
class ProgressChangedInt (line 28) | public static class ProgressChangedInt extends SeekBarChangeListener<I...
method ProgressChangedInt (line 30) | public ProgressChangedInt(int offset, TextView textView, ValueChange...
method onProgressChanged (line 34) | @Override
method onStopTrackingTouch (line 40) | @Override
class ProgressChangedFloat (line 48) | public static class ProgressChangedFloat extends SeekBarChangeListener...
method ProgressChangedFloat (line 51) | public ProgressChangedFloat(int offset, float incrementBy, TextView ...
method onProgressChanged (line 56) | @Override
method onStopTrackingTouch (line 62) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/ShadowDialog.java
class ShadowDialog (line 20) | public class ShadowDialog extends BasePreferenceDialog {
method newInstance (line 26) | public static ShadowDialog newInstance(String key) {
method onDialogClosed (line 35) | @Override
method onBindDialogView (line 68) | @Override
class SeekBarChangeListener (line 186) | private static class SeekBarChangeListener implements SeekBar.OnSeekBa...
method SeekBarChangeListener (line 191) | public SeekBarChangeListener(MutableLiveData<Float> var, int min, fl...
method onProgressChanged (line 197) | @Override
method onStartTrackingTouch (line 203) | @Override
method onStopTrackingTouch (line 208) | @Override
class LiveShadowParameters (line 214) | private static class LiveShadowParameters {
method LiveShadowParameters (line 219) | public LiveShadowParameters(Float radius, Float dx, Float dy) {
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/SliderDialog.java
class SliderDialog (line 17) | public class SliderDialog extends BasePreferenceDialog {
method newInstance (line 21) | public static SliderDialog newInstance(String key) {
method onDialogClosed (line 30) | @Override
method onBindDialogView (line 42) | @Override
method setProgressFromPreference (line 195) | public static void setProgressFromPreference(@NonNull SeekBar seekBar,...
FILE: app/src/main/java/rocks/tbog/tblauncher/preference/TagOrderListPreferenceDialog.java
class TagOrderListPreferenceDialog (line 26) | public class TagOrderListPreferenceDialog extends OrderListPreferenceDia...
method newInstance (line 32) | public static TagOrderListPreferenceDialog newInstance(String key) {
method onCreate (line 40) | @Override
method onSaveInstanceState (line 57) | @Override
method getUntaggedIndexPreference (line 63) | @Nullable
method generateEntryList (line 72) | @Override
method generateNewValues (line 115) | @Override
method onDialogClosed (line 132) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/quicklist/DockRecycleLayoutManager.java
class DockRecycleLayoutManager (line 17) | public class DockRecycleLayoutManager extends RecyclerView.LayoutManager...
method DockRecycleLayoutManager (line 34) | public DockRecycleLayoutManager(int columnCount, int rowCount) {
method setColumnCount (line 40) | public void setColumnCount(int count) {
method setRowCount (line 44) | public void setRowCount(int count) {
method setRightToLeft (line 48) | public void setRightToLeft(boolean rightToLeft) {
method adapterPosition (line 52) | private static int adapterPosition(@NonNull View child) {
method viewNeedsUpdate (line 56) | private static boolean viewNeedsUpdate(View v) {
method getDebugName (line 61) | private static String getDebugName(View v) {
method getDebugInfo (line 84) | private static String getDebugInfo(View v) {
method logDebug (line 102) | private static void logDebug(String message) {
method onAttachedToWindow (line 107) | @Override
method onDetachedFromWindow (line 113) | @Override
method supportsPredictiveItemAnimations (line 126) | @Override
method onItemsRemoved (line 139) | @Override
method onItemsMoved (line 145) | @Override
method generateDefaultLayoutParams (line 151) | @Override
method getVerticalSpace (line 156) | private int getVerticalSpace() {
method getHorizontalSpace (line 160) | private int getHorizontalSpace() {
method onLayoutChildren (line 179) | @Override
method onLayoutCompleted (line 204) | @Override
method smoothScrollToPosition (line 210) | @Override
method scrollToPosition (line 217) | @Override
method updateSizing (line 222) | private void updateSizing() {
method getAdapterIdx (line 256) | private int getAdapterIdx(int colIdx, int rowIdx) {
method getColumnIdx (line 262) | private int getColumnIdx(int adapterPos) {
method getRowIdx (line 268) | private int getRowIdx(int adapterPos) {
method getPageIdx (line 273) | private int getPageIdx(int adapterPos) {
method getColumnWidth (line 277) | private int getColumnWidth() {
method getRowHeight (line 281) | private int getRowHeight() {
method getColumnPosition (line 285) | private int getColumnPosition(int columnIdx) {
method getRowPosition (line 302) | private int getRowPosition(int rowIdx) {
method getPagePosition (line 309) | private int getPagePosition(int pageIdx) {
method layoutChildren (line 317) | private void layoutChildren(RecyclerView.Recycler recycler) {
method findFirstVisibleAdapterPosition (line 401) | private int findFirstVisibleAdapterPosition() {
method layoutAdapterPos (line 419) | private View layoutAdapterPos(RecyclerView.Recycler recycler, int adap...
method cacheChildren (line 467) | private void cacheChildren() {
method detachCachedChildren (line 483) | private void detachCachedChildren(RecyclerView.Recycler recycler) {
method clearViewCache (line 500) | private void clearViewCache(RecyclerView.Recycler recycler) {
method indexOfChild (line 509) | private int indexOfChild(View child) {
method canScrollHorizontally (line 517) | @Override
method scrollHorizontallyBy (line 532) | @Override
method checkVisibilityAfterScroll (line 604) | private boolean checkVisibilityAfterScroll() {
method getLeftChildView (line 621) | @NonNull
method getRightChildView (line 647) | @NonNull
method getPageScroll (line 673) | public float getPageScroll() {
method getPageAdapterPosition (line 685) | public int getPageAdapterPosition(int page) {
method computeScrollVectorForPosition (line 690) | @Nullable
FILE: app/src/main/java/rocks/tbog/tblauncher/quicklist/DragAndDropInfo.java
class DragAndDropInfo (line 5) | class DragAndDropInfo {
FILE: app/src/main/java/rocks/tbog/tblauncher/quicklist/EditQuickList.java
class EditQuickList (line 43) | public class EditQuickList {
method applyChanges (line 55) | public void applyChanges(@NonNull Context context) {
method addFilters (line 69) | private void addFilters(@NonNull LayoutInflater inflater, @NonNull Arr...
method addActions (line 92) | private void addActions(@NonNull LayoutInflater inflater, @NonNull Arr...
method addTags (line 115) | private void addTags(@NonNull LayoutInflater inflater, @NonNull ArrayL...
method addFavorites (line 141) | private void addFavorites(@NonNull LayoutInflater inflater, @NonNull A...
method bindView (line 163) | public void bindView(@NonNull View view) {
method previewStartDrag (line 236) | private static boolean previewStartDrag(@NonNull EntryItem entry, @Non...
method startDragAndDrop (line 247) | @SuppressWarnings("deprecation")
method repositionViews (line 256) | protected static void repositionViews(@NonNull ViewGroup quickList, in...
method previewDragListener (line 281) | private static boolean previewDragListener(@Nullable View v, @NonNull ...
FILE: app/src/main/java/rocks/tbog/tblauncher/quicklist/EditQuickListDialog.java
class EditQuickListDialog (line 15) | public class EditQuickListDialog extends DialogFragment<Void> {
method layoutRes (line 19) | @Override
method onCreateView (line 24) | @Nullable
method onViewCreated (line 36) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/quicklist/PagedScrollListener.java
class PagedScrollListener (line 8) | public class PagedScrollListener extends RecyclerView.OnScrollListener {
method PagedScrollListener (line 12) | public PagedScrollListener() {
method onScrollStateChanged (line 15) | @Override
method snapToPage (line 22) | public static void snapToPage(@NonNull RecyclerView recyclerView) {
FILE: app/src/main/java/rocks/tbog/tblauncher/quicklist/QuickList.java
class QuickList (line 53) | public class QuickList {
method run (line 67) | @Override
method cornerRadius (line 95) | private static int cornerRadius(@NonNull Context ctx, @NonNull SharedP...
method applyUiPref (line 102) | public static void applyUiPref(@NonNull SharedPreferences pref, View q...
method setGridSize (line 151) | private static void setGridSize(View quickList) {
method setLayoutDirection (line 169) | private static void setLayoutDirection(View quickList, boolean rightTo...
method getBackgroundColor (line 181) | public static int getBackgroundColor(SharedPreferences pref) {
method onClick (line 185) | public static void onClick(final EntryItem entry, View v) {
method onLongClick (line 193) | public static boolean onLongClick(final EntryItem entry, View v) {
method getContext (line 206) | public Context getContext() {
method onCreateActivity (line 210) | public void onCreateActivity(TBLauncherActivity tbLauncherActivity) {
method reload (line 228) | public void reload() {
method inflateViewStub (line 237) | @SuppressWarnings("unchecked")
method inflateQuickListView (line 243) | private void inflateQuickListView() {
method populateList (line 258) | private void populateList() {
method populateList (line 276) | public static boolean populateList(Context context, RecycleAdapter ada...
method toggleSearch (line 302) | public void toggleSearch(@NonNull View v, @NonNull String query, @NonN...
method toggleProvider (line 334) | public void toggleProvider(View v, IProvider<?> provider, @Nullable ja...
method toggleFilter (line 368) | public void toggleFilter(View v, IProvider<?> provider, @NonNull Strin...
method toggleFilter (line 426) | public void toggleFilter(View v, @Nullable Provider<? extends EntryIte...
method animToggleOn (line 432) | private void animToggleOn(View v) {
method animToggleOff (line 437) | private void animToggleOff() {
method isQuickListEnabled (line 450) | private boolean isQuickListEnabled() {
method isOnlyForResults (line 462) | private boolean isOnlyForResults() {
method updateVisibility (line 468) | public void updateVisibility() {
method show (line 483) | private void show() {
method hideQuickList (line 515) | public void hideQuickList(boolean animate) {
method onStart (line 547) | public void onStart() {
method adapterCleared (line 555) | public void adapterCleared() {
method adapterUpdated (line 565) | public void adapterUpdated() {
method isViewInList (line 577) | public boolean isViewInList(View view) {
method isLastSelection (line 581) | public boolean isLastSelection(@NonNull String entryId) {
type QuickListPosition (line 585) | public enum QuickListPosition {
FILE: app/src/main/java/rocks/tbog/tblauncher/quicklist/RecycleAdapter.java
class RecycleAdapter (line 22) | public class RecycleAdapter extends RecycleAdapterBase<RecycleAdapter.Ho...
method RecycleAdapter (line 24) | public RecycleAdapter(@NonNull Context context, @NonNull ArrayList<Ent...
method onCreateViewHolder (line 30) | @NonNull
method setGridLayout (line 42) | public void setGridLayout(@NonNull Context context, boolean bGridLayou...
method getDrawFlags (line 52) | public static int getDrawFlags(@NonNull Context context) {
method onBindViewHolder (line 67) | @Override
method moveResult (line 82) | public void moveResult(int sourceIdx, int destIdx) {
FILE: app/src/main/java/rocks/tbog/tblauncher/quicklist/ViewPagerAdapter.java
class ViewPagerAdapter (line 12) | class ViewPagerAdapter extends PagerAdapter {
method ViewPagerAdapter (line 15) | ViewPagerAdapter(@NonNull ArrayList<PageInfo> pages) {
method getCount (line 19) | @Override
method isViewFromObject (line 24) | @Override
method getPageTitle (line 31) | @Nullable
method instantiateItem (line 37) | @NonNull
method destroyItem (line 45) | @Override
class PageInfo (line 53) | public static class PageInfo {
method PageInfo (line 57) | public PageInfo(String title, View view) {
method getView (line 62) | public View getView() {
FILE: app/src/main/java/rocks/tbog/tblauncher/result/AsyncSetEntryDrawable.java
class AsyncSetEntryDrawable (line 23) | public abstract class AsyncSetEntryDrawable<Entry extends EntryItem> ext...
method AsyncSetEntryDrawable (line 30) | public AsyncSetEntryDrawable(@NonNull ImageView image, int drawFlags, ...
method getImageView (line 65) | @Nullable
method doInBackground (line 75) | @Override
method getDrawable (line 86) | @WorkerThread
method setDrawable (line 89) | @UiThread
method onPostExecute (line 98) | @Override
method onCancelled (line 140) | @Override
method execute (line 146) | public void execute() {
FILE: app/src/main/java/rocks/tbog/tblauncher/result/CustomRecycleLayoutManager.java
class CustomRecycleLayoutManager (line 19) | public class CustomRecycleLayoutManager extends RecyclerView.LayoutManag...
type OverScrollListener (line 56) | public interface OverScrollListener {
method onOverScroll (line 57) | void onOverScroll(RecyclerView recyclerView, int amount);
class RowInfo (line 60) | private static class RowInfo {
method CustomRecycleLayoutManager (line 67) | public CustomRecycleLayoutManager() {
method CustomRecycleLayoutManager (line 71) | public CustomRecycleLayoutManager(boolean bottomToTop, boolean rightTo...
method setBottomToTop (line 78) | public void setBottomToTop(boolean bottomToTop) {
method isBottomToTop (line 87) | public boolean isBottomToTop() {
method setRightToLeft (line 91) | public void setRightToLeft(boolean rightToLeft) {
method isRightToLeft (line 100) | public boolean isRightToLeft() {
method setReverseAdapter (line 104) | @Override
method isReverseAdapter (line 114) | @Override
method setColumns (line 125) | public void setColumns(int columnCount, boolean autoFill) {
method getColumnCount (line 139) | public int getColumnCount() {
method setAutoScrollBottom (line 143) | public void setAutoScrollBottom(boolean autoScrollBottom) {
method setOverScrollListener (line 147) | public void setOverScrollListener(@Nullable OverScrollListener listene...
method computeVerticalScrollExtent (line 152) | @Override
method computeVerticalScrollOffset (line 157) | @Override
method computeVerticalScrollRange (line 194) | @Override
method onAttachedToWindow (line 203) | @Override
method onDetachedFromWindow (line 209) | @Override
method supportsPredictiveItemAnimations (line 222) | @Override
method onItemsRemoved (line 235) | @Override
method onItemsChanged (line 249) | @Override
method onItemsUpdated (line 264) | @Override
method onAdapterChanged (line 270) | @Override
method scrollToPosition (line 277) | @Override
method generateDefaultLayoutParams (line 291) | @Override
method getVerticalSpace (line 296) | private int getVerticalSpace() {
method getHorizontalSpace (line 300) | private int getHorizontalSpace() {
method onLayoutChildren (line 319) | @Override
method onLayoutCompleted (line 374) | @Override
method computeScrollOffset (line 412) | private int computeScrollOffset() {
method computeRowCount (line 423) | private int computeRowCount(int itemCount) {
class LayoutRowHelper (line 427) | private class LayoutRowHelper {
method LayoutRowHelper (line 436) | private LayoutRowHelper(RecyclerView.Recycler recycler, int columnCo...
method setPositionIncrement (line 441) | public void setPositionIncrement(int nextLeft) {
method layoutRow (line 445) | public void layoutRow(int rowIdx, int posX, int posY) {
method layoutView (line 484) | @Nullable
method offsetVertical (line 491) | public void offsetVertical(int offsetY) {
method initRow (line 507) | public void initRow() {
method getDecoratedHeight (line 511) | public int getDecoratedHeight() {
method getDecoratedTop (line 515) | public int getDecoratedTop() {
method getDecoratedBottom (line 519) | public int getDecoratedBottom() {
method getRowPosition (line 524) | private int getRowPosition(int rowIdx) {
method getRowHeight (line 537) | private int getRowHeight(int rowIdx) {
method layoutChildren (line 545) | private void layoutChildren(RecyclerView.Recycler recycler) {
method cacheChildren (line 637) | private void cacheChildren() {
method detachCachedChildren (line 653) | private void detachCachedChildren(RecyclerView.Recycler recycler) {
method layoutAdapterPos (line 675) | private View layoutAdapterPos(RecyclerView.Recycler recycler, int adap...
method layoutChildView (line 706) | private void layoutChildView(View view, int left, int top) {
method layoutChildView (line 710) | private void layoutChildView(View view, int left, int top, int width, ...
method clearViewCache (line 720) | private void clearViewCache(RecyclerView.Recycler recycler) {
method updateSizing (line 734) | private void updateSizing() {
method updateRowInfo (line 776) | private void updateRowInfo(int expectedRowHeight) {
method updateRowHeight (line 803) | private void updateRowHeight(int rowIdx, int newHeight) {
method canScrollVertically (line 838) | @Override
method indexOfChild (line 851) | private int indexOfChild(View child) {
method adapterPosition (line 859) | private int adapterPosition(@NonNull View child) {
method adapterPosition (line 863) | private int adapterPosition(int childIdx) {
method adapterPosition (line 870) | private int adapterPosition(int colIdx, int rowIdx) {
method getRowIdx (line 877) | private int getRowIdx(int adapterPos) {
method getTopView (line 888) | @NonNull
method getBottomView (line 902) | @NonNull
method findBottomVisibleItemView (line 911) | @NonNull
method findLastVisibleItemPosition (line 929) | public int findLastVisibleItemPosition() {
method topAdapterItemIdx (line 953) | private int topAdapterItemIdx() {
method bottomAdapterItemIdx (line 962) | private int bottomAdapterItemIdx() {
method aboveAdapterItemIdx (line 966) | private int aboveAdapterItemIdx(int idx) {
method belowAdapterItemIdx (line 970) | private int belowAdapterItemIdx(int idx) {
method scrollVerticallyBy (line 979) | @Override
method overScrollVertical (line 1043) | private void overScrollVertical(int amount) {
method resetOverScrollVertical (line 1053) | private void resetOverScrollVertical() {
method checkVisibilityAfterScroll (line 1058) | private void checkVisibilityAfterScroll(RecyclerView.Recycler recycler...
method needsVisibilityChange (line 1083) | private boolean needsVisibilityChange(int adapterPosition, int top, bo...
method changeFirstVisible (line 1092) | private void changeFirstVisible(RecyclerView.Recycler recycler, int va...
method viewNeedsUpdate (line 1102) | private static boolean viewNeedsUpdate(View v) {
method getDebugName (line 1107) | private static String getDebugName(View v) {
method getDebugInfo (line 1130) | private static String getDebugInfo(View v) {
method logDebug (line 1148) | private static void logDebug(String message) {
FILE: app/src/main/java/rocks/tbog/tblauncher/result/EntryAdapter.java
class EntryAdapter (line 16) | public class EntryAdapter extends BaseAdapter {
method EntryAdapter (line 20) | public EntryAdapter(@NonNull List<EntryItem> objects) {
method EntryAdapter (line 25) | public EntryAdapter(@NonNull List<EntryItem> objects, int drawFlags) {
method addAll (line 30) | public void addAll(Collection<EntryItem> newElements) {
method getViewTypeCount (line 35) | @Override
method getItemViewType (line 40) | @Override
method getItem (line 45) | @Override
method getCount (line 50) | @Override
method getItemId (line 55) | @Override
method getView (line 60) | @NonNull
FILE: app/src/main/java/rocks/tbog/tblauncher/result/LoadDataForAdapter.java
class LoadDataForAdapter (line 9) | public class LoadDataForAdapter extends AsyncTask<Void, ArrayList<EntryI...
type LoadInBackground (line 13) | public interface LoadInBackground {
method loadInBackground (line 14) | ArrayList<EntryItem> loadInBackground();
method LoadDataForAdapter (line 17) | public LoadDataForAdapter(EntryAdapter adapter, LoadInBackground loadI...
method doInBackground (line 23) | @Override
method onPostExecute (line 30) | @Override
method execute (line 37) | public void execute() {
FILE: app/src/main/java/rocks/tbog/tblauncher/result/RecycleAdapter.java
class RecycleAdapter (line 22) | public class RecycleAdapter extends RecycleAdapterBase<RecycleAdapterBas...
method RecycleAdapter (line 29) | public RecycleAdapter(@NonNull Context context, @NonNull ArrayList<Ent...
method onCreateViewHolder (line 37) | @NonNull
method setGridLayout (line 49) | public void setGridLayout(@NonNull Context context, boolean bGridLayou...
method getDrawFlags (line 59) | private int getDrawFlags(@NonNull Context context) {
method onClick (line 71) | public void onClick(int index, View anyView) {
method onClick (line 80) | public static void onClick(final EntryItem result, @NonNull View v) {
method onLongClick (line 84) | public static boolean onLongClick(final EntryItem result, @NonNull Vie...
method clear (line 97) | @Override
method updateItems (line 103) | @SuppressLint("NotifyDataSetChanged")
method removeItem (line 109) | public void removeItem(EntryItem result) {
method getFilter (line 115) | public Filter getFilter() {
class FilterById (line 121) | private class FilterById extends Filter {
method performFiltering (line 124) | @Override
method publishResults (line 141) | @SuppressWarnings("unchecked")
FILE: app/src/main/java/rocks/tbog/tblauncher/result/RecycleAdapterBase.java
class RecycleAdapterBase (line 19) | public abstract class RecycleAdapterBase<VH extends RecycleAdapterBase.H...
method RecycleAdapterBase (line 31) | public RecycleAdapterBase(@NonNull List<EntryItem> list) {
method setOnClickListener (line 35) | public void setOnClickListener(@Nullable OnClickListener listener) {
method setOnLongClickListener (line 39) | public void setOnLongClickListener(@Nullable OnLongClickListener liste...
method getItemViewType (line 43) | @Override
method getItemId (line 51) | @Override
method onBindViewHolder (line 59) | @Override
method getItemCount (line 78) | @Override
method getItem (line 83) | @Nullable
method removeItem (line 95) | public void removeItem(EntryItem result) {
method addItem (line 101) | public void addItem(EntryItem item) {
method clear (line 106) | public void clear() {
method refresh (line 112) | public void refresh() {
method updateItems (line 117) | @SuppressLint("NotifyDataSetChanged")
method notifyItemChanged (line 124) | public void notifyItemChanged(EntryItem result) {
class Holder (line 131) | public static class Holder extends RecyclerView.ViewHolder {
method Holder (line 133) | public Holder(@NonNull View itemView) {
method setOnClickListener (line 143) | public void setOnClickListener(@Nullable View.OnClickListener listen...
method setOnLongClickListener (line 149) | public void setOnLongClickListener(@Nullable View.OnLongClickListene...
type OnClickListener (line 156) | public interface OnClickListener {
method onClick (line 157) | void onClick(EntryItem entryItem, View view);
type OnLongClickListener (line 160) | public interface OnLongClickListener {
method onLongClick (line 161) | boolean onLongClick(EntryItem entryItem, View view);
FILE: app/src/main/java/rocks/tbog/tblauncher/result/RecycleScrollListener.java
class RecycleScrollListener (line 21) | public class RecycleScrollListener extends RecyclerView.OnScrollListener...
class State (line 29) | private static class State {
method resizeFinished (line 38) | public boolean resizeFinished() {
method resizeInProgress (line 42) | public boolean resizeInProgress() {
method resizeWithScroll (line 46) | public boolean resizeWithScroll() {
method toString (line 50) | @NonNull
method reset (line 56) | public void reset() {
method setResizeAnimation (line 63) | public void setResizeAnimation() {
method setResizeWithScroll (line 67) | public void setResizeWithScroll() {
method setResizeFinished (line 71) | public void setResizeFinished() {
method RecycleScrollListener (line 76) | public RecycleScrollListener(KeyboardHandler handler) {
method onScrollStateChanged (line 80) | @Override
method scrollStateString (line 167) | @NonNull
method onScrolled (line 181) | @Override
method onOverScroll (line 233) | @Override
method hideKeyboardWhileDragging (line 241) | private void hideKeyboardWhileDragging(RecyclerView list) {
method setListAutoScroll (line 291) | private void setListAutoScroll(@NonNull RecyclerView list, boolean val...
method handleResizeDone (line 296) | private void handleResizeDone(@NonNull RecyclerView list) {
method setListLayoutHeight (line 312) | public static void setListLayoutHeight(ViewGroup list, int height) {
FILE: app/src/main/java/rocks/tbog/tblauncher/result/ResultHelper.java
class ResultHelper (line 39) | public class ResultHelper {
method ResultHelper (line 57) | private ResultHelper() {
method addViewTypes (line 61) | private static void addViewTypes(int[] viewTypes) {
method launch (line 73) | public static void launch(@NonNull View view, @NonNull EntryItem pojo) {
method launch (line 91) | public static void launch(@NonNull View view, @NonNull EntryItem pojo,...
method recordLaunch (line 119) | public static void recordLaunch(@NonNull EntryItem pojo, @NonNull Cont...
method removeFromResultsAndHistory (line 131) | public static void removeFromResultsAndHistory(@NonNull EntryItem pojo...
method removeFromHistory (line 139) | private static void removeFromHistory(@NonNull EntryItem pojo, @NonNul...
method launchAddToQuickList (line 143) | public static void launchAddToQuickList(@NonNull Context context, Entr...
method launchRemoveFromQuickList (line 161) | public static void launchRemoveFromQuickList(@NonNull Context context,...
method launchMessaging (line 179) | public static void launchMessaging(ContactEntry contactPojo, View v) {
method launchIm (line 192) | public static void launchIm(ContactEntry.ImData imData, View v) {
method launchContactView (line 206) | public static void launchContactView(ContactEntry contactPojo, Context...
method launchCall (line 222) | public static void launchCall(Context context, View v, String phone) {
method getItemViewTypeCount (line 255) | public static int getItemViewTypeCount() {
method getItemViewLayout (line 259) | @LayoutRes
method getItemViewType (line 269) | public static int getItemViewType(@NonNull EntryItem item, int drawFla...
FILE: app/src/main/java/rocks/tbog/tblauncher/result/ResultItemDecoration.java
class ResultItemDecoration (line 9) | public class ResultItemDecoration extends RecyclerView.ItemDecoration {
method ResultItemDecoration (line 14) | public ResultItemDecoration(int horizontal, int vertical, boolean only...
method getItemOffsets (line 20) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/result/ResultViewHelper.java
class ResultViewHelper (line 43) | public final class ResultViewHelper {
method ResultViewHelper (line 48) | private ResultViewHelper() {
method highlightText (line 52) | private static CharSequence highlightText(@NonNull StringNormalizer.Re...
method highlightText (line 67) | private static SpannableString highlightText(StringNormalizer.Result n...
method displayHighlighted (line 90) | public static void displayHighlighted(@NonNull ResultRelevance relevan...
method displayHighlighted (line 96) | public static boolean displayHighlighted(@NonNull ResultRelevance rele...
method setButtonIconAsync (line 132) | public static void setButtonIconAsync(@NonNull ImageView iconView, @No...
method setIconAsync (line 153) | public static <E extends EntryItem, T extends AsyncSetEntryDrawable<E>...
method applyResultItemShadow (line 237) | public static void applyResultItemShadow(@NonNull TextView textView) {
method applyPreferences (line 252) | public static void applyPreferences(int drawFlags, TextView nameView, ...
method applyPreferences (line 288) | public static void applyPreferences(int drawFlags, TextView nameView, ...
method applyListRowPreferences (line 297) | public static void applyListRowPreferences(ViewGroup rowView) {
method getColorFilter (line 308) | @Nullable
method setIconColorFilter (line 318) | @Nullable
method removeIconColorFilter (line 325) | public static void removeIconColorFilter(@NonNull ImageView icon) {
method setLoadingIcon (line 329) | public static void setLoadingIcon(@NonNull ImageView image) {
FILE: app/src/main/java/rocks/tbog/tblauncher/result/ReversibleAdapterRecyclerLayoutManager.java
type ReversibleAdapterRecyclerLayoutManager (line 3) | public interface ReversibleAdapterRecyclerLayoutManager {
method setReverseAdapter (line 4) | void setReverseAdapter(boolean reverseAdapter);
method isReverseAdapter (line 5) | boolean isReverseAdapter();
FILE: app/src/main/java/rocks/tbog/tblauncher/searcher/HistorySearcher.java
class HistorySearcher (line 20) | public class HistorySearcher extends Searcher {
method HistorySearcher (line 24) | public HistorySearcher(ISearchActivity activity, @NonNull String query) {
method doInBackground (line 29) | @Override
method getHistory (line 54) | static List<EntryItem> getHistory(@NonNull Context context, DBHelper.H...
FILE: app/src/main/java/rocks/tbog/tblauncher/searcher/ISearchActivity.java
type ISearchActivity (line 11) | public interface ISearchActivity {
method displayLoader (line 12) | void displayLoader(boolean b);
method getContext (line 14) | @NonNull
method resetTask (line 20) | void resetTask();
method clearAdapter (line 25) | void clearAdapter();
method updateAdapter (line 30) | void updateAdapter(@NonNull List<? extends EntryItem> results, boolean...
method removeResult (line 35) | void removeResult(@NonNull EntryItem result);
method filterResults (line 41) | void filterResults(String text);
FILE: app/src/main/java/rocks/tbog/tblauncher/searcher/ISearcher.java
type ISearcher (line 7) | public interface ISearcher {
method addResult (line 8) | @WorkerThread
method tagsEnabled (line 11) | boolean tagsEnabled();
FILE: app/src/main/java/rocks/tbog/tblauncher/searcher/QuerySearcher.java
class QuerySearcher (line 22) | public class QuerySearcher extends Searcher {
method QuerySearcher (line 26) | public QuerySearcher(ISearchActivity activity, @NonNull String query) {
method addResult (line 31) | @Override
method doInBackground (line 48) | @WorkerThread
FILE: app/src/main/java/rocks/tbog/tblauncher/searcher/ResultBuffer.java
class ResultBuffer (line 8) | public class ResultBuffer<T extends EntryItem> implements ISearcher {
method ResultBuffer (line 13) | public ResultBuffer(boolean tagsEnabled, Class<T> typeClass) {
method getEntryItems (line 18) | public Collection<T> getEntryItems() {
method addResult (line 22) | @Override
method tagsEnabled (line 30) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/searcher/Searcher.java
class Searcher (line 27) | public abstract class Searcher extends AsyncTask<Void, Void> implements ...
method Searcher (line 44) | public Searcher(ISearchActivity activity, @NonNull String query) {
method getContext (line 53) | @Nullable
method getQuery (line 59) | @NonNull
method getPojoProcessor (line 64) | protected PriorityQueue<EntryItem> getPojoProcessor(ISearchActivity ac...
method getMaxResultCount (line 68) | protected int getMaxResultCount(Context context) {
method addResult (line 75) | @WorkerThread
method onPreExecute (line 93) | @CallSuper
method displayActivityLoader (line 102) | private void displayActivityLoader() {
method onPostExecute (line 111) | @Override
method setRefresh (line 139) | public void setRefresh(boolean refresh) {
method tagsEnabled (line 143) | @Override
method execute (line 148) | public void execute() {
FILE: app/src/main/java/rocks/tbog/tblauncher/searcher/TagList.java
class TagList (line 26) | public class TagList extends Searcher {
method TagList (line 29) | public TagList(ISearchActivity activity, @NonNull String query) {
method getPojoProcessor (line 33) | @Override
method addResult (line 40) | @WorkerThread
method addProcessedPojo (line 62) | private void addProcessedPojo(EntryItem entryItem) {
method doInBackground (line 72) | @WorkerThread
FILE: app/src/main/java/rocks/tbog/tblauncher/searcher/TagSearcher.java
class TagSearcher (line 17) | public class TagSearcher extends Searcher {
method TagSearcher (line 21) | public TagSearcher(ISearchActivity activity, @NonNull String query) {
method getPojoProcessor (line 26) | @Override
method addResult (line 31) | @WorkerThread
method addProcessedPojo (line 52) | private void addProcessedPojo(EntryWithTags entryItem) {
method doInBackground (line 62) | @WorkerThread
FILE: app/src/main/java/rocks/tbog/tblauncher/shortcut/SaveSingleOreoShortcutAsync.java
class SaveSingleOreoShortcutAsync (line 24) | @TargetApi(Build.VERSION_CODES.O)
method SaveSingleOreoShortcutAsync (line 32) | public SaveSingleOreoShortcutAsync(@NonNull Context context, @NonNull ...
method doInBackground (line 39) | @Override
method onPostExecute (line 79) | @Override
method execute (line 99) | public void execute() {
FILE: app/src/main/java/rocks/tbog/tblauncher/shortcut/ShortcutUtil.java
class ShortcutUtil (line 38) | public class ShortcutUtil {
method areShortcutsEnabled (line 45) | public static boolean areShortcutsEnabled(Context context) {
method addShortcut (line 55) | @TargetApi(Build.VERSION_CODES.O)
method removeAllShortcuts (line 63) | public static void removeAllShortcuts(Context context) {
method getAllShortcuts (line 70) | @TargetApi(Build.VERSION_CODES.O)
method getShortcut (line 75) | @TargetApi(Build.VERSION_CODES.O)
method getShortcut (line 83) | @TargetApi(Build.VERSION_CODES.O)
method createShortcutRecord (line 117) | @TargetApi(Build.VERSION_CODES.O)
method getAppNameFromPackageName (line 154) | @NonNull
method getIconBlob (line 165) | @NonNull
method getInitialIcon (line 175) | @Nullable
method removeShortcut (line 189) | @WorkerThread
FILE: app/src/main/java/rocks/tbog/tblauncher/ui/BlockableListView.java
class BlockableListView (line 12) | public class BlockableListView extends ListView {
method BlockableListView (line 15) | public BlockableListView(Context context) {
method BlockableListView (line 19) | public BlockableListView(Context context, AttributeSet attrs) {
method BlockableListView (line 23) | public BlockableListView(Context context, AttributeSet attrs, int defS...
method blockTouchEvents (line 32) | public void blockTouchEvents() {
method unblockTouchEvents (line 39) | public void unblockTouchEvents() {
method onTouchEvent (line 43) | @SuppressLint("ClickableViewAccessibility")
FILE: app/src/main/java/rocks/tbog/tblauncher/ui/BottomPullEffectView.java
class BottomPullEffectView (line 16) | public class BottomPullEffectView extends View {
method BottomPullEffectView (line 22) | public BottomPullEffectView(Context context) {
method BottomPullEffectView (line 26) | public BottomPullEffectView(Context context, AttributeSet attrs) {
method BottomPullEffectView (line 30) | public BottomPullEffectView(Context context, AttributeSet attrs, int f...
method setPull (line 41) | public void setPull(float distance, float displacement, boolean animat...
method releasePull (line 70) | public void releasePull() {
method onDraw (line 85) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/ui/CenteredImageSpan.java
class CenteredImageSpan (line 11) | public class CenteredImageSpan extends ImageSpan {
method CenteredImageSpan (line 17) | public CenteredImageSpan(@NonNull Drawable drawable) {
method getSize (line 21) | @Override
method draw (line 46) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/ui/CustomizeMarginView.java
class CustomizeMarginView (line 17) | public class CustomizeMarginView extends View {
type OnOffsetChanged (line 36) | public interface OnOffsetChanged {
method onOffsetChanged (line 37) | void onOffsetChanged(float dx, float dy);
method CustomizeMarginView (line 40) | public CustomizeMarginView(Context context, @Nullable AttributeSet att...
method CustomizeMarginView (line 44) | public CustomizeMarginView(Context context, @Nullable AttributeSet att...
method setOnOffsetChanged (line 64) | public void setOnOffsetChanged(OnOffsetChanged listener) {
method setPreviewColors (line 68) | public void setPreviewColors(int bgColor1, int bgColor2) {
method setMarginParameters (line 73) | public void setMarginParameters(float horizontalMargin, float vertical...
method setOffsetValues (line 80) | public void setOffsetValues(float offsetX, float offsetY) {
method onDraw (line 86) | @Override
method clampOffset (line 115) | private static float clampOffset(float value) {
method onTouchEvent (line 119) | @SuppressLint("ClickableViewAccessibility")
method onLayout (line 142) | @Override
method onMeasure (line 152) | @Override
method resolveAdjustedSize (line 206) | private int resolveAdjustedSize(int desiredSize, int measureSpec) {
FILE: app/src/main/java/rocks/tbog/tblauncher/ui/CustomizeShadowView.java
class CustomizeShadowView (line 17) | public class CustomizeShadowView extends View {
type OnOffsetChanged (line 42) | public interface OnOffsetChanged {
method onOffsetChanged (line 43) | void onOffsetChanged(float dx, float dy);
method CustomizeShadowView (line 46) | public CustomizeShadowView(Context context, @Nullable AttributeSet att...
method CustomizeShadowView (line 50) | public CustomizeShadowView(Context context, @Nullable AttributeSet att...
method setShadowParameters (line 73) | public void setShadowParameters(float radius, float dx, float dy, int ...
method setTextParameters (line 81) | public void setTextParameters(@Nullable CharSequence text, int color, ...
method setOnOffsetChanged (line 91) | public void setOnOffsetChanged(OnOffsetChanged listener) {
method setBackgroundParameters (line 95) | public void setBackgroundParameters(int bgColor1, int bgColor2) {
method onDraw (line 100) | @Override
method clampOffset (line 154) | private static float clampOffset(float value) {
method onTouchEvent (line 158) | @SuppressLint("ClickableViewAccessibility")
method onLayout (line 181) | @Override
method onMeasure (line 191) | @Override
method resolveAdjustedSize (line 245) | private int resolveAdjustedSize(int desiredSize, int measureSpec) {
FILE: app/src/main/java/rocks/tbog/tblauncher/ui/CutoutFactory.java
class CutoutFactory (line 21) | public class CutoutFactory {
method getByManufacturer (line 23) | @Nullable
method getForAndroidPie (line 37) | @TargetApi(Build.VERSION_CODES.P)
method getStatusBar (line 51) | @NonNull
method getNoCutout (line 56) | @NonNull
class ComputeSafeZoneFromCutout (line 62) | private static abstract class ComputeSafeZoneFromCutout implements ICu...
method ComputeSafeZoneFromCutout (line 66) | ComputeSafeZoneFromCutout(@NonNull Context context) {
method getSafeZone (line 70) | @Override
class HuaweiCutout (line 87) | private static class HuaweiCutout extends ComputeSafeZoneFromCutout {
method HuaweiCutout (line 89) | HuaweiCutout(@NonNull Context context) {
method hasCutout (line 93) | @Override
method getCutout (line 107) | @Override
class OppoCutout (line 133) | private static class OppoCutout extends ComputeSafeZoneFromCutout {
method OppoCutout (line 135) | OppoCutout(@NonNull Context context) {
method hasCutout (line 139) | @Override
method getCutout (line 145) | @Override
class VivoCutout (line 174) | private static class VivoCutout extends ComputeSafeZoneFromCutout {
method VivoCutout (line 176) | VivoCutout(@NonNull Context context) {
method hasCutout (line 180) | @Override
method getCutout (line 200) | @Override
class XiaomiCutout (line 210) | private static class XiaomiCutout extends ComputeSafeZoneFromCutout {
method XiaomiCutout (line 212) | XiaomiCutout(@NonNull Context context) {
method hasCutout (line 216) | @Override
method getCutout (line 223) | @SuppressWarnings("UnnecessaryLocalVariable")
class StatusBarCutout (line 248) | public static class StatusBarCutout extends ComputeSafeZoneFromCutout {
method StatusBarCutout (line 250) | StatusBarCutout(@NonNull Context context) {
method getStatusBarHeight (line 254) | public static int getStatusBarHeight(Context context) {
method hasCutout (line 264) | @Override
method getCutout (line 269) | @Override
class AndroidPCutout (line 276) | @TargetApi(Build.VERSION_CODES.P)
method AndroidPCutout (line 282) | AndroidPCutout(@NonNull DisplayCutout displayCutout) {
method hasCutout (line 290) | @Override
method getCutout (line 295) | @Override
method getSafeZone (line 301) | @Override
class NoCutout (line 307) | private static class NoCutout implements ICutout {
method hasCutout (line 308) | @Override
method getCutout (line 313) | @Override
method getSafeZone (line 318) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/ui/DialogFragment.java
class DialogFragment (line 26) | public abstract class DialogFragment<Output> extends androidx.fragment.a...
type Button (line 34) | public enum Button {
method layoutRes (line 38) | @LayoutRes
type OnDismissListener (line 41) | public interface OnDismissListener<T> {
method onDismiss (line 42) | void onDismiss(@NonNull DialogFragment<T> dialog);
type OnConfirmListener (line 45) | public interface OnConfirmListener<T> {
method onConfirm (line 46) | void onConfirm(@Nullable T output);
type OnButtonClickListener (line 49) | public interface OnButtonClickListener<T> {
method onButtonClick (line 50) | void onButtonClick(@NonNull DialogFragment<T> dialog, @NonNull Butto...
method setOnDismissListener (line 53) | public void setOnDismissListener(OnDismissListener<Output> listener) {
method setOnConfirmListener (line 57) | public void setOnConfirmListener(OnConfirmListener<Output> listener) {
method setOnPositiveClickListener (line 61) | public void setOnPositiveClickListener(OnButtonClickListener<Output> l...
method setOnNegativeClickListener (line 65) | public void setOnNegativeClickListener(OnButtonClickListener<Output> l...
method setOnNeutralClickListener (line 69) | public void setOnNeutralClickListener(OnButtonClickListener<Output> li...
method putArgString (line 73) | public DialogFragment<Output> putArgString(@Nullable String key, @Null...
method putArgLong (line 82) | public DialogFragment<Output> putArgLong(@Nullable String key, long va...
method putArgInt (line 91) | public DialogFragment<Output> putArgInt(@Nullable String key, int valu...
method onDismiss (line 100) | @Override
method onConfirm (line 107) | public void onConfirm(@Nullable Output output) {
method onButtonClick (line 112) | public void onButtonClick(@NonNull Button button) {
method onCreate (line 131) | @Override
method onCreateDialog (line 143) | @NonNull
method inflateLayoutRes (line 157) | @NonNull
method onCreateView (line 165) | @Nullable
method setupDefaultButtonOkCancel (line 191) | protected void setupDefaultButtonOkCancel(Context context) {
method setupDefaultButtonOk (line 200) | protected void setupDefaultButtonOk(Context context) {
method createButtonBar (line 208) | private void createButtonBar(View view, LayoutInflater inflater) {
method resolvePanel (line 257) | @Nullable
method findViewById (line 270) | @Nullable
FILE: app/src/main/java/rocks/tbog/tblauncher/ui/DialogWrapper.java
class DialogWrapper (line 9) | public class DialogWrapper extends AppCompatDialog {
type OnWindowFocusChanged (line 13) | public interface OnWindowFocusChanged {
method onWindowFocusChanged (line 14) | void onWindowFocusChanged(@NonNull DialogWrapper dialog, boolean has...
method DialogWrapper (line 17) | public DialogWrapper(Context context) {
method DialogWrapper (line 21) | public DialogWrapper(Context context, int theme) {
method DialogWrapper (line 25) | protected DialogWrapper(Context context, boolean cancelable, OnCancelL...
method setOnWindowFocusChanged (line 29) | public void setOnWindowFocusChanged(@Nullable OnWindowFocusChanged cal...
method onWindowFocusChanged (line 33) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/ui/ICutout.java
type ICutout (line 5) | public interface ICutout {
method hasCutout (line 6) | boolean hasCutout();
method getCutout (line 8) | Rect[] getCutout();
method getSafeZone (line 9) | Rect getSafeZone();
FILE: app/src/main/java/rocks/tbog/tblauncher/ui/KeyboardHandler.java
type KeyboardHandler (line 3) | public interface KeyboardHandler {
method showKeyboard (line 4) | void showKeyboard();
method hideKeyboard (line 5) | void hideKeyboard();
FILE: app/src/main/java/rocks/tbog/tblauncher/ui/LinearAdapter.java
class LinearAdapter (line 28) | public class LinearAdapter extends BaseAdapter {
type MenuItem (line 31) | public interface MenuItem {
method getLayoutResource (line 32) | @LayoutRes
method isEnabled (line 35) | boolean isEnabled();
class ItemDivider (line 38) | public static class ItemDivider implements MenuItem {
method getLayoutResource (line 39) | @Override
method isEnabled (line 44) | @Override
class ItemTitle (line 50) | public static class ItemTitle implements MenuItem {
method ItemTitle (line 54) | public ItemTitle(Context context, @StringRes int nameRes) {
method ItemTitle (line 58) | public ItemTitle(@NonNull String string) {
method toString (line 62) | @NonNull
method getLayoutResource (line 68) | @Override
method isEnabled (line 73) | @Override
class ItemString (line 79) | public static class ItemString implements MenuItem {
method ItemString (line 83) | public ItemString(@NonNull String string) {
method toString (line 87) | @NonNull
method getLayoutResource (line 93) | @Override
method isEnabled (line 98) | @Override
class ItemText (line 104) | public static class ItemText extends ItemString {
method ItemText (line 105) | public ItemText(@NonNull String string) {
method getLayoutResource (line 109) | @Override
method isEnabled (line 114) | @Override
class Item (line 120) | public static class Item extends ItemString {
method Item (line 124) | public Item(Context context, @StringRes int stringId) {
method getCount (line 135) | @Override
method getItem (line 140) | @Override
method getItemId (line 145) | @Override
method getView (line 150) | @SuppressLint("ViewHolder")
method bindView (line 180) | protected void bindView(View convertView, MenuItem item) {
method add (line 186) | public void add(MenuItem item) {
method add (line 191) | public void add(int index, MenuItem item) {
method areAllItemsEnabled (line 196) | @Override
method isEnabled (line 201) | @Override
method remove (line 207) | public void remove(MenuItem item) {
FILE: app/src/main/java/rocks/tbog/tblauncher/ui/LinearAdapterPlus.java
class LinearAdapterPlus (line 12) | public class LinearAdapterPlus extends LinearAdapter {
type BindCallback (line 13) | public interface BindCallback {
method bindView (line 18) | boolean bindView(View view);
class ItemStringIcon (line 21) | public static class ItemStringIcon extends ItemString implements BindC...
method ItemStringIcon (line 25) | public ItemStringIcon(@NonNull String string, @NonNull Drawable icon) {
method getLayoutResource (line 30) | @Override
method bindView (line 35) | @Override
method bindView (line 44) | @Override
FILE: app/src/main/java/rocks/tbog/tblauncher/ui/ListPopup.java
class ListPopup (line 29) | public class ListPopup exten
Condensed preview — 546 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,773K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 1042,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"Short descriptive title\"\nlabels: bug\nassignees: '"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 705,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: \"Great idea title\"\nlabels: enhancement\nassignee"
},
{
"path": ".github/dependabot.yml",
"chars": 146,
"preview": "version: 2\nupdates:\n- package-ecosystem: gradle\n directory: \"/\"\n schedule:\n interval: daily\n time: \"03:00\"\n ope"
},
{
"path": ".github/workflows/android.yml",
"chars": 411,
"preview": "name: Android CI\n\non:\n push:\n branches: [ master ]\n pull_request:\n branches: [ master ]\n\njobs:\n build:\n\n run"
},
{
"path": ".github/workflows/deploy.yml",
"chars": 1487,
"preview": "name: Deploy to Playstore beta\n\non:\n workflow_dispatch:\n\njobs:\n distribute:\n runs-on: ubuntu-latest\n\n steps:\n "
},
{
"path": ".github/workflows/release.yml",
"chars": 1098,
"preview": "# This is a basic workflow to help you get started with Actions\n\nname: Android Release\n\non:\n push:\n branches:\n "
},
{
"path": ".gitignore",
"chars": 1473,
"preview": "# Built application files\n*.apk\n*.ap_\n*.aab\n\n# Files for the ART/Dalvik VM\n*.dex\n\n# Java class files\n*.class\n\n# Generate"
},
{
"path": ".idea/codeStyles/Project.xml",
"chars": 3726,
"preview": "<component name=\"ProjectCodeStyleConfiguration\">\n <code_scheme name=\"Project\" version=\"173\">\n <codeStyleSettings lan"
},
{
"path": ".idea/codeStyles/codeStyleConfig.xml",
"chars": 142,
"preview": "<component name=\"ProjectCodeStyleConfiguration\">\n <state>\n <option name=\"USE_PER_PROJECT_SETTINGS\" value=\"true\" />\n "
},
{
"path": ".idea/compiler.xml",
"chars": 169,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"CompilerConfiguration\">\n <bytecodeTar"
},
{
"path": ".idea/google-java-format.xml",
"chars": 176,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"GoogleJavaFormatSettings\">\n <option n"
},
{
"path": ".idea/inspectionProfiles/Project_Default.xml",
"chars": 1638,
"preview": "<component name=\"InspectionProjectProfileManager\">\n <profile version=\"1.0\">\n <option name=\"myName\" value=\"Project De"
},
{
"path": ".idea/jarRepositories.xml",
"chars": 1455,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"RemoteRepositoriesConfiguration\">\n <r"
},
{
"path": ".idea/migrations.xml",
"chars": 254,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"ProjectMigrations\">\n <option name=\"Mi"
},
{
"path": ".idea/palantir-java-format.xml",
"chars": 178,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"PalantirJavaFormatSettings\">\n <option"
},
{
"path": ".idea/render.experimental.xml",
"chars": 164,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"RenderSettings\">\n <option name=\"quali"
},
{
"path": "Gemfile",
"chars": 57,
"preview": "source \"https://rubygems.org\"\n\ngem \"fastlane\"\ngem \"rake\"\n"
},
{
"path": "LICENSE.md",
"chars": 35142,
"preview": "\n GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free"
},
{
"path": "Privacy-Policy.md",
"chars": 15587,
"preview": "---\ntitle: TinyBit launcher\nlayout: simple\n---\n\n# Privacy policy\n\nThis privacy policy (\"Policy\") describes how the perso"
},
{
"path": "README.md",
"chars": 4115,
"preview": "# TinyBit Launcher\n\n[<img src=\"https://github.com/TBog/TBLauncher/workflows/Android%20CI/badge.svg\"\n alt=\"Android C"
},
{
"path": "_config.yml",
"chars": 266,
"preview": "description: Android launcher with icon pack support, search to launch apps and contacts, color and behaviour customizab"
},
{
"path": "_layouts/default.html",
"chars": 1353,
"preview": "<!DOCTYPE html>\n<html lang=\"{{ site.lang | default: \"en-US\" }}\">\n <head>\n <meta charset='utf-8'>\n <meta http-equi"
},
{
"path": "_layouts/simple.html",
"chars": 692,
"preview": "<!DOCTYPE html>\n<html lang=\"{{ site.lang | default: \"en-US\" }}\">\n <head>\n <meta charset='utf-8'>\n <meta http-equi"
},
{
"path": "app/.gitignore",
"chars": 7,
"preview": "/build\n"
},
{
"path": "app/build.gradle",
"chars": 4385,
"preview": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply plugin: 'com.getkeepsafe.dexcount'\napply pl"
},
{
"path": "app/proguard-rules.pro",
"chars": 2154,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "app/src/main/AndroidManifest.xml",
"chars": 7213,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:to"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/ColorChooserDialog.kt",
"chars": 7402,
"preview": "/*\n * Copyright (c) 2018 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/ColorChooserView.kt",
"chars": 2109,
"preview": "/*\n * Copyright (c) 2018 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/ColorLiveDataOwner.kt",
"chars": 406,
"preview": "package net.mm2d.color.chooser\n\nimport android.view.View\nimport androidx.lifecycle.MutableLiveData\n\ninternal interface C"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/ColorObserverDelegate.kt",
"chars": 872,
"preview": "package net.mm2d.color.chooser\n\nimport android.view.View\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifec"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/ControlView.kt",
"chars": 5372,
"preview": "/*\n * Copyright (c) 2018 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/HsvView.kt",
"chars": 1707,
"preview": "/*\n * Copyright (c) 2018 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/PaletteView.kt",
"chars": 5713,
"preview": "/*\n * Copyright (c) 2018 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/SliderView.kt",
"chars": 2079,
"preview": "/*\n * Copyright (c) 2018 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/ViewPagerAdapter.kt",
"chars": 1134,
"preview": "/*\n * Copyright (c) 2018 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/element/ColorSliderView.kt",
"chars": 7029,
"preview": "/*\n * Copyright (c) 2019 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/element/HueView.kt",
"chars": 4172,
"preview": "/*\n * Copyright (c) 2018 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/element/PaletteCell.kt",
"chars": 2283,
"preview": "/*\n * Copyright (c) 2018 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/element/PreviewView.kt",
"chars": 4104,
"preview": "/*\n * Copyright (c) 2019 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/element/SvView.kt",
"chars": 7670,
"preview": "/*\n * Copyright (c) 2018 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/util/AttrExtentions.kt",
"chars": 794,
"preview": "/*\n * Copyright (c) 2019 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/util/CanvasExtensions.kt",
"chars": 502,
"preview": "/*\n * Copyright (c) 2020 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/util/ColorUtils.kt",
"chars": 7676,
"preview": "/*\n * Copyright (c) 2018 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/net/mm2d/color/chooser/util/ResourceExtensions.kt",
"chars": 918,
"preview": "/*\n * Copyright (c) 2020 大前良介 (OHMAE Ryosuke)\n *\n * This software is released under the MIT License.\n * http://opensourc"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/Behaviour.java",
"chars": 79370,
"preview": "package rocks.tbog.tblauncher;\n\nimport static rocks.tbog.tblauncher.entry.EntryItem.LAUNCHED_FROM_GESTURE;\n\nimport andro"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/CustomizeUI.java",
"chars": 28255,
"preview": "package rocks.tbog.tblauncher;\n\nimport static rocks.tbog.tblauncher.customicon.ButtonHelper.BTN_ID_LAUNCHER_PILL;\nimport"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/DeviceAdmin.java",
"chars": 2198,
"preview": "package rocks.tbog.tblauncher;\n\nimport android.app.admin.DeviceAdminReceiver;\nimport android.app.admin.DevicePolicyManag"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/DrawableCache.java",
"chars": 3016,
"preview": "package rocks.tbog.tblauncher;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/DummyLauncherActivity.java",
"chars": 118,
"preview": "package rocks.tbog.tblauncher;\n\nimport android.app.Activity;\n\npublic class DummyLauncherActivity extends Activity {\n}\n"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/EditTagsDialog.java",
"chars": 10099,
"preview": "package rocks.tbog.tblauncher;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.os.Build;\nimpo"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/LauncherState.java",
"chars": 3211,
"preview": "package rocks.tbog.tblauncher;\n\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotatio"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/LiveWallpaper.java",
"chars": 20563,
"preview": "package rocks.tbog.tblauncher;\n\nimport android.app.WallpaperManager;\nimport android.content.Context;\nimport android.cont"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/MimeTypeCache.java",
"chars": 10972,
"preview": "package rocks.tbog.tblauncher;\n\nimport android.accounts.AccountManager;\nimport android.accounts.AuthenticatorDescription"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/Permission.java",
"chars": 3196,
"preview": "package rocks.tbog.tblauncher;\n\nimport android.Manifest;\nimport android.app.Activity;\nimport android.content.Context;\nim"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/PermissionsManager.java",
"chars": 1097,
"preview": "package rocks.tbog.tblauncher;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatActivity;\n\npu"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/PinShortcutConfirm.java",
"chars": 9630,
"preview": "/*\n * Copyright (C) 2016 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/SettingsActivity.java",
"chars": 55974,
"preview": "package rocks.tbog.tblauncher;\n\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport android.cont"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/TBApplication.java",
"chars": 18387,
"preview": "package rocks.tbog.tblauncher;\n\nimport android.app.Activity;\nimport android.app.Application;\nimport android.content.Comp"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/TBLauncherActivity.java",
"chars": 12520,
"preview": "package rocks.tbog.tblauncher;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/TagsManager.java",
"chars": 18234,
"preview": "package rocks.tbog.tblauncher;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Pai"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/WallpaperSnapAnim.java",
"chars": 5697,
"preview": "package rocks.tbog.tblauncher;\n\nimport android.graphics.Point;\nimport android.graphics.PointF;\nimport android.view.Veloc"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/WorkAsync/AsyncTask.java",
"chars": 1655,
"preview": "package rocks.tbog.tblauncher.WorkAsync;\n\nimport android.util.Log;\n\nimport androidx.annotation.MainThread;\nimport androi"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/WorkAsync/RunnableTask.java",
"chars": 1704,
"preview": "package rocks.tbog.tblauncher.WorkAsync;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimpor"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/WorkAsync/TaskRunner.java",
"chars": 1437,
"preview": "package rocks.tbog.tblauncher.WorkAsync;\n\nimport android.os.Handler;\nimport android.os.Looper;\n\nimport androidx.annotati"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/broadcast/IncomingCallHandler.java",
"chars": 1807,
"preview": "package rocks.tbog.tblauncher.broadcast;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimpo"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/broadcast/LocaleChangedReceiver.java",
"chars": 1167,
"preview": "package rocks.tbog.tblauncher.broadcast;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimpo"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/broadcast/PackageAddedRemovedHandler.java",
"chars": 3606,
"preview": "package rocks.tbog.tblauncher.broadcast;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimpo"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/calculator/Calculator.java",
"chars": 3677,
"preview": "package rocks.tbog.tblauncher.calculator;\n\nimport android.os.Build;\n\nimport java.math.BigDecimal;\nimport java.math.MathC"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/calculator/Result.java",
"chars": 731,
"preview": "package rocks.tbog.tblauncher.calculator;\n\nimport androidx.annotation.NonNull;\n\npublic final class Result<T> {\n\tstatic <"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/calculator/ShuntingYard.java",
"chars": 1889,
"preview": "package rocks.tbog.tblauncher.calculator;\n\nimport java.util.ArrayDeque;\n\npublic class ShuntingYard {\n\n\tpublic static Res"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/calculator/Tokenizer.java",
"chars": 5034,
"preview": "package rocks.tbog.tblauncher.calculator;\n\nimport java.math.BigDecimal;\nimport java.text.DecimalFormat;\nimport java.text"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/customicon/ButtonHelper.java",
"chars": 1179,
"preview": "package rocks.tbog.tblauncher.customicon;\n\nimport android.content.Context;\nimport android.view.View;\n\nimport androidx.an"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/customicon/CustomShapePage.java",
"chars": 23060,
"preview": "package rocks.tbog.tblauncher.customicon;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.g"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/customicon/DefaultButtonPage.java",
"chars": 2586,
"preview": "package rocks.tbog.tblauncher.customicon;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nim"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/customicon/IconAdapter.java",
"chars": 404,
"preview": "package rocks.tbog.tblauncher.customicon;\n\nimport androidx.annotation.NonNull;\n\nimport java.util.List;\n\nimport rocks.tbo"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/customicon/IconData.java",
"chars": 503,
"preview": "package rocks.tbog.tblauncher.customicon;\n\nimport android.graphics.drawable.Drawable;\n\nimport rocks.tbog.tblauncher.icon"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/customicon/IconPackPage.java",
"chars": 6610,
"preview": "package rocks.tbog.tblauncher.customicon;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.c"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/customicon/IconSelectDialog.java",
"chars": 22071,
"preview": "package rocks.tbog.tblauncher.customicon;\n\nimport android.app.Activity;\nimport android.app.Dialog;\nimport android.conten"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/customicon/IconViewHolder.java",
"chars": 2700,
"preview": "package rocks.tbog.tblauncher.customicon;\n\nimport android.graphics.drawable.Drawable;\nimport android.util.Log;\nimport an"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/customicon/PageAdapter.java",
"chars": 5038,
"preview": "package rocks.tbog.tblauncher.customicon;\n\nimport android.graphics.drawable.Drawable;\nimport android.view.View;\nimport a"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/customicon/ShortcutPage.java",
"chars": 2383,
"preview": "package rocks.tbog.tblauncher.customicon;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport androi"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/customicon/StaticEntryPage.java",
"chars": 2418,
"preview": "package rocks.tbog.tblauncher.customicon;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nim"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/customicon/SystemPage.java",
"chars": 7835,
"preview": "package rocks.tbog.tblauncher.customicon;\n\nimport android.app.Activity;\nimport android.content.ComponentName;\nimport and"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/ActionProvider.java",
"chars": 15015,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport android.content.Context;\nimport android.view.View;\n\nimport androidx."
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/AppCacheProvider.java",
"chars": 2373,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androi"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/AppProvider.java",
"chars": 8775,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\ni"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/CalculatorProvider.java",
"chars": 2984,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport java.math.BigDecimal;\nimport java.text.NumberFormat;\nimport java.uti"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/ContactsProvider.java",
"chars": 5205,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport android.content.SharedPreferences;\nimport android.database.ContentOb"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/DBProvider.java",
"chars": 4876,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport android.content.Context;\nimport android.util.Log;\n\nimport androidx.a"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/DialProvider.java",
"chars": 2203,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport androidx.annotation.NonNull;\n\nimport java.util.regex.Pattern;\n\nimpor"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/EntryToResultUtils.java",
"chars": 3375,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport android.util.Log;\n\nimport androidx.annotation.WorkerThread;\n\nimport "
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/FilterProvider.java",
"chars": 3191,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\nimport"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/IProvider.java",
"chars": 2721,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nim"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/ModProvider.java",
"chars": 1772,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport android.content.Context;\n\nimport java.util.ArrayList;\nimport java.ut"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/Provider.java",
"chars": 4838,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport android.app.Service;\nimport android.content.Intent;\nimport android.o"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/QuickListProvider.java",
"chars": 6429,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport android.content.Context;\nimport android.util.Log;\n\nimport java.util."
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/SearchProvider.java",
"chars": 7281,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\ni"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/ShortcutsProvider.java",
"chars": 9213,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport android.content.BroadcastReceiver;\nimport android.content.ComponentN"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/SimpleProvider.java",
"chars": 1323,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\ni"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/TagsProvider.java",
"chars": 2541,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\nimport"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/dataprovider/UpdateFromModsLoader.java",
"chars": 1857,
"preview": "package rocks.tbog.tblauncher.dataprovider;\n\nimport android.content.Context;\n\nimport java.util.ArrayList;\nimport java.ut"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/db/AppRecord.java",
"chars": 1065,
"preview": "package rocks.tbog.tblauncher.db;\n\npublic final class AppRecord extends FlagsRecord {\n public static final int FLAG_D"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/db/DB.java",
"chars": 6647,
"preview": "package rocks.tbog.tblauncher.db;\n\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android."
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/db/DBHelper.java",
"chars": 41974,
"preview": "package rocks.tbog.tblauncher.db;\n\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android."
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/db/ExportedData.java",
"chars": 41703,
"preview": "package rocks.tbog.tblauncher.db;\n\nimport android.annotation.SuppressLint;\nimport android.content.ComponentName;\nimport "
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/db/FlagsRecord.java",
"chars": 452,
"preview": "package rocks.tbog.tblauncher.db;\n\npublic abstract class FlagsRecord {\n protected int flags = 0;\n\n public abstract"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/db/ModRecord.java",
"chars": 1006,
"preview": "package rocks.tbog.tblauncher.db;\n\npublic class ModRecord extends FlagsRecord {\n public static final int FLAG_SHOW_IN"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/db/PlaceholderWidgetRecord.java",
"chars": 4603,
"preview": "package rocks.tbog.tblauncher.db;\n\nimport android.content.ComponentName;\nimport android.util.Base64;\nimport android.util"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/db/ShortcutRecord.java",
"chars": 645,
"preview": "package rocks.tbog.tblauncher.db;\n\npublic class ShortcutRecord extends FlagsRecord {\n public static final int FLAG_HI"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/db/ValuedHistoryRecord.java",
"chars": 301,
"preview": "package rocks.tbog.tblauncher.db;\n\npublic class ValuedHistoryRecord {\n /**\n * ID for the record\n */\n publi"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/db/WidgetRecord.java",
"chars": 6468,
"preview": "package rocks.tbog.tblauncher.db;\n\nimport android.appwidget.AppWidgetHostView;\nimport android.util.Log;\nimport android.u"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/db/XmlExport.java",
"chars": 14966,
"preview": "package rocks.tbog.tblauncher.db;\n\nimport android.appwidget.AppWidgetProviderInfo;\nimport android.content.Context;\nimpor"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/db/XmlImport.java",
"chars": 3700,
"preview": "package rocks.tbog.tblauncher.db;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.widget.Toast;"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/drawable/CodePointDrawable.java",
"chars": 1152,
"preview": "package rocks.tbog.tblauncher.drawable;\n\nimport android.graphics.drawable.Drawable;\n\nimport androidx.annotation.NonNull;"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/drawable/DrawableUtils.java",
"chars": 24620,
"preview": "package rocks.tbog.tblauncher.drawable;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport "
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/drawable/FourCodePointDrawable.java",
"chars": 2449,
"preview": "package rocks.tbog.tblauncher.drawable;\n\nimport android.graphics.drawable.Drawable;\n\nimport androidx.annotation.NonNull;"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/drawable/LoadingDrawable.java",
"chars": 4955,
"preview": "package rocks.tbog.tblauncher.drawable;\n\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport "
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/drawable/SizeWrappedDrawable.java",
"chars": 2848,
"preview": "package rocks.tbog.tblauncher.drawable;\n\nimport android.content.res.ColorStateList;\nimport android.graphics.BlendMode;\ni"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/drawable/SquareDrawable.java",
"chars": 1942,
"preview": "package rocks.tbog.tblauncher.drawable;\n\nimport android.graphics.ColorFilter;\nimport android.graphics.Paint;\nimport andr"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/drawable/TextDrawable.java",
"chars": 5082,
"preview": "package rocks.tbog.tblauncher.drawable;\n\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.g"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/drawable/TwoCodePointDrawable.java",
"chars": 2213,
"preview": "package rocks.tbog.tblauncher.drawable;\n\nimport android.graphics.drawable.Drawable;\n\nimport androidx.annotation.NonNull;"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/ActionEntry.java",
"chars": 1936,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nimport "
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/AppEntry.java",
"chars": 28655,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC;\nim"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/CalculatorEntry.java",
"chars": 3093,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport android.content.Context;\nimport android.text.Spannable;\nimport android.text"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/ContactEntry.java",
"chars": 23600,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport static rocks.tbog.tblauncher.customicon.ButtonHelper.BTN_ID_MESSAGE;\nimport"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/DialContactEntry.java",
"chars": 3380,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nimport "
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/EntryItem.java",
"chars": 12846,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport android.content.Context;\nimport android.view.View;\n\nimport androidx.annotat"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/EntryWithTags.java",
"chars": 1708,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport an"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/FilterEntry.java",
"chars": 1304,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport android.view.View;\n\nimport androidx.annotation.DrawableRes;\nimport androidx"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/ICustomIconEntry.java",
"chars": 161,
"preview": "package rocks.tbog.tblauncher.entry;\n\npublic interface ICustomIconEntry {\n void setCustomIcon();\n\n void clearCusto"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/OpenUrlEntry.java",
"chars": 1361,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport android.content.ActivityNotFoundException;\nimport android.content.Context;\n"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/PlaceholderEntry.java",
"chars": 1472,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nimport "
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/ResultRelevance.java",
"chars": 3231,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport j"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/SearchEngineEntry.java",
"chars": 3572,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport android.app.SearchManager;\nimport android.content.ActivityNotFoundException"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/SearchEntry.java",
"chars": 4528,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nimport "
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/ShortcutEntry.java",
"chars": 19831,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport android.annotation.TargetApi;\nimport android.content.ActivityNotFoundExcept"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/StaticEntry.java",
"chars": 8287,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport android.content.Context;\nimport android.graphics.Color;\nimport android.grap"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/TagEntry.java",
"chars": 2855,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nimport "
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/entry/UrlEntry.java",
"chars": 5018,
"preview": "package rocks.tbog.tblauncher.entry;\n\nimport android.content.Context;\nimport android.content.pm.PackageManager;\nimport a"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/handler/AppsHandler.java",
"chars": 6103,
"preview": "package rocks.tbog.tblauncher.handler;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport and"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/handler/DataHandler.java",
"chars": 42435,
"preview": "package rocks.tbog.tblauncher.handler;\n\nimport android.app.Application;\nimport android.app.KeyguardManager;\nimport andro"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/handler/IconsHandler.java",
"chars": 26082,
"preview": "package rocks.tbog.tblauncher.handler;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport and"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/handler/TagsHandler.java",
"chars": 19896,
"preview": "package rocks.tbog.tblauncher.handler;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport and"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/icons/CalendarDrawable.java",
"chars": 2281,
"preview": "package rocks.tbog.tblauncher.icons;\n\nimport android.annotation.SuppressLint;\nimport android.content.res.Resources;\nimpo"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/icons/DrawableInfo.java",
"chars": 1189,
"preview": "package rocks.tbog.tblauncher.icons;\n\nimport android.content.res.Resources;\nimport android.graphics.drawable.Drawable;\n\n"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/icons/IconPack.java",
"chars": 1002,
"preview": "package rocks.tbog.tblauncher.icons;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport andro"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/icons/IconPackCache.java",
"chars": 2194,
"preview": "package rocks.tbog.tblauncher.icons;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport an"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/icons/IconPackXML.java",
"chars": 19274,
"preview": "package rocks.tbog.tblauncher.icons;\n\nimport android.annotation.SuppressLint;\nimport android.content.ComponentName;\nimpo"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/icons/LazyLoadDrawable.java",
"chars": 1662,
"preview": "package rocks.tbog.tblauncher.icons;\n\nimport android.annotation.SuppressLint;\nimport android.content.res.Resources;\nimpo"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/icons/SimpleDrawable.java",
"chars": 1088,
"preview": "package rocks.tbog.tblauncher.icons;\n\nimport android.content.res.Resources;\nimport android.graphics.drawable.Drawable;\n\n"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/icons/SystemIconPack.java",
"chars": 3945,
"preview": "package rocks.tbog.tblauncher.icons;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport andro"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/loader/LoadAppEntry.java",
"chars": 6698,
"preview": "package rocks.tbog.tblauncher.loader;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.con"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/loader/LoadCacheApps.java",
"chars": 2394,
"preview": "package rocks.tbog.tblauncher.loader;\n\nimport android.content.Context;\nimport android.util.Log;\n\nimport androidx.annotat"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/loader/LoadContactsEntry.java",
"chars": 19266,
"preview": "package rocks.tbog.tblauncher.loader;\n\nimport android.content.ContentResolver;\nimport android.content.ContentUris;\nimpor"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/loader/LoadEntryItem.java",
"chars": 1276,
"preview": "package rocks.tbog.tblauncher.loader;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\n\nimport java"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/loader/LoadShortcutsEntryItem.java",
"chars": 5328,
"preview": "package rocks.tbog.tblauncher.loader;\n\nimport android.content.Context;\nimport android.content.pm.LauncherApps;\nimport an"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/normalizer/IntSequenceBuilder.java",
"chars": 1537,
"preview": "package rocks.tbog.tblauncher.normalizer;\n\n/**\n * Simple integer sequence class that allows adding individual elements a"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/normalizer/PhoneNormalizer.java",
"chars": 1067,
"preview": "package rocks.tbog.tblauncher.normalizer;\n\npublic class PhoneNormalizer {\n public static StringNormalizer.Result simp"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/normalizer/StringNormalizer.java",
"chars": 8138,
"preview": "package rocks.tbog.tblauncher.normalizer;\n\nimport java.nio.CharBuffer;\nimport java.text.Normalizer;\nimport java.util.Arr"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/BaseListPreferenceDialog.java",
"chars": 961,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.os.Bundle;\n\nimport androidx.appcompat.app.AlertDialog;\nimport "
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/BaseMultiSelectListPreferenceDialog.java",
"chars": 1027,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.os.Bundle;\n\nimport androidx.appcompat.app.AlertDialog;\nimport "
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/BasePreferenceDialog.java",
"chars": 3634,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view."
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/ConfirmDialog.java",
"chars": 14831,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport a"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/ContentLoadHelper.java",
"chars": 13251,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimp"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/CustomDialogPreference.java",
"chars": 6734,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/EditAddResetEditor.java",
"chars": 1731,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.app.Application;\nimport android.app.Dialog;\nimport android.con"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/EditAddResetPreferenceDialog.java",
"chars": 2773,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.os."
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/EditSearchEnginesPreferenceDialog.java",
"chars": 19302,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.app.Application;\nimport android.app.Dialog;\nimport android.con"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/EditSearchHintPreferenceDialog.java",
"chars": 13794,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.app.Application;\nimport android.app.Dialog;\nimport android.con"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/IconListPreferenceDialog.java",
"chars": 12710,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.content.Context;\nimport android.content.DialogInterface;\nimpor"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/MarginDialog.java",
"chars": 5490,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimp"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/MultiDependencies.java",
"chars": 4926,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.util.AttributeSet;\nimport android.util.Log;\n\nimport androidx.p"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/MultiDependenciesSwitchPreference.java",
"chars": 2142,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\n\nimport and"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/OrderListPreferenceDialog.java",
"chars": 9647,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.View;\n"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/PreferenceColorDialog.java",
"chars": 6344,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimpor"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/PreviewImagePreference.java",
"chars": 2868,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport a"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/QuickListPreferenceDialog.java",
"chars": 893,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.os.Bundle;\nimport android.view.View;\n\nimport rocks.tbog.tblaun"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/SeekBarChangeListener.java",
"chars": 2325,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.widget.SeekBar;\nimport android.widget.TextView;\n\nimport rocks."
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/ShadowDialog.java",
"chars": 8738,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimp"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/SliderDialog.java",
"chars": 8115,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.content.SharedPreferences;\nimport android.os.Bundle;\nimport an"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/preference/TagOrderListPreferenceDialog.java",
"chars": 5486,
"preview": "package rocks.tbog.tblauncher.preference;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nim"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/quicklist/DockRecycleLayoutManager.java",
"chars": 27004,
"preview": "package rocks.tbog.tblauncher.quicklist;\n\nimport android.graphics.PointF;\nimport android.util.Log;\nimport android.view.V"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/quicklist/DragAndDropInfo.java",
"chars": 233,
"preview": "package rocks.tbog.tblauncher.quicklist;\n\nimport android.view.View;\n\nclass DragAndDropInfo {\n // the initial view tha"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/quicklist/EditQuickList.java",
"chars": 15871,
"preview": "package rocks.tbog.tblauncher.quicklist;\n\nimport android.content.ClipData;\nimport android.content.Context;\nimport androi"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/quicklist/EditQuickListDialog.java",
"chars": 1399,
"preview": "package rocks.tbog.tblauncher.quicklist;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.view."
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/quicklist/PagedScrollListener.java",
"chars": 1537,
"preview": "package rocks.tbog.tblauncher.quicklist;\n\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx."
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/quicklist/QuickList.java",
"chars": 22516,
"preview": "package rocks.tbog.tblauncher.quicklist;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAd"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/quicklist/RecycleAdapter.java",
"chars": 3293,
"preview": "package rocks.tbog.tblauncher.quicklist;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimpo"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/quicklist/ViewPagerAdapter.java",
"chars": 1695,
"preview": "package rocks.tbog.tblauncher.quicklist;\n\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.anno"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/result/AsyncSetEntryDrawable.java",
"chars": 5844,
"preview": "package rocks.tbog.tblauncher.result;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graph"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/result/CustomRecycleLayoutManager.java",
"chars": 43863,
"preview": "package rocks.tbog.tblauncher.result;\n\nimport android.util.Log;\nimport android.view.View;\nimport android.view.ViewGroup;"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/result/EntryAdapter.java",
"chars": 2141,
"preview": "package rocks.tbog.tblauncher.result;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/result/LoadDataForAdapter.java",
"chars": 1074,
"preview": "package rocks.tbog.tblauncher.result;\n\nimport java.util.ArrayList;\n\nimport rocks.tbog.tblauncher.WorkAsync.AsyncTask;\nim"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/result/RecycleAdapter.java",
"chars": 5429,
"preview": "package rocks.tbog.tblauncher.result;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport an"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/result/RecycleAdapterBase.java",
"chars": 5012,
"preview": "package rocks.tbog.tblauncher.result;\n\nimport android.annotation.SuppressLint;\nimport android.graphics.drawable.Drawable"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/result/RecycleScrollListener.java",
"chars": 14534,
"preview": "package rocks.tbog.tblauncher.result;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/result/ResultHelper.java",
"chars": 10337,
"preview": "package rocks.tbog.tblauncher.result;\n\nimport static rocks.tbog.tblauncher.entry.EntryItem.LAUNCHED_FROM_QUICK_LIST;\nimp"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/result/ResultItemDecoration.java",
"chars": 2511,
"preview": "package rocks.tbog.tblauncher.result;\n\nimport android.graphics.Rect;\nimport android.view.View;\n\nimport androidx.annotati"
},
{
"path": "app/src/main/java/rocks/tbog/tblauncher/result/ResultViewHelper.java",
"chars": 14954,
"preview": "package rocks.tbog.tblauncher.result;\n\nimport android.content.Context;\nimport android.graphics.ColorFilter;\nimport andro"
}
]
// ... and 346 more files (download for full content)
About this extraction
This page contains the full source code of the TBog/TBLauncher GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 546 files (2.5 MB), approximately 684.5k tokens, and a symbol index with 3177 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.