├── docs ├── CNAME ├── _includes │ ├── logo.html │ ├── youtube.html │ ├── relative-src.html │ ├── search.html │ ├── navigation.html │ ├── search-icon.html │ ├── listings.html │ ├── footer.html │ └── document-icon.html ├── _sets │ ├── _defaults.md │ └── getting-started.md ├── .gitignore ├── _category │ ├── ui.md │ ├── bugs.md │ ├── advanced.md │ ├── contacts.md │ ├── widgets.md │ └── favorites.md ├── siteicon.png ├── touch-icon.png ├── images │ ├── favicon.png │ └── whatsapp.png ├── _posts │ ├── _defaults.md │ ├── 2018-02-11-missing-favorite.md │ ├── 2018-02-17-kiss-takes-lots-of-memory.md │ ├── 2018-02-14-some-settings-are-not-applied.md │ ├── 2018-02-24-freeze-history.md │ ├── 2018-02-17-add-nickname-for-contact.md │ ├── 2018-02-14-can-t-see-just-installed-apps.md │ ├── 2018-05-01-hibernate-apps.md │ ├── 2019-02-05-whatsapp-contacts.md │ ├── 2018-05-27-use-tag-bar.md │ ├── 2018-02-11-add-a-widget.md │ ├── 2018-02-14-can-t-see-a-contact.md │ ├── 2018-03-25-gestures.md │ ├── 2018-02-17-how-to-hide-certain-phone-numbers.md │ ├── 2018-02-11-pick-a-theme.md │ └── 2018-05-27-use-tags.md ├── screenshots │ ├── tags-menu.png │ ├── assist-app.png │ ├── dark-theme.png │ ├── light-theme.png │ ├── tags-dialog.png │ ├── tags-example.png │ ├── contact-alias.png │ ├── example-widget.png │ ├── tag-bar-select.png │ ├── tag-bar-configure.png │ ├── tag-bar-display.png │ ├── transparent-theme.png │ ├── contact-alias-edit.png │ ├── widget-context-menu.png │ ├── add-search-provider-1.png │ ├── add-search-provider-2.png │ ├── add-search-provider-3.png │ ├── dark-transparent-theme.png │ ├── example-minimalist-1.png │ ├── example-minimalist-2.png │ ├── example-minimalist-3.png │ ├── example-minimalist-4.png │ ├── gestures-minimalistic.png │ ├── semi-transparent-theme.png │ ├── dark-semi-transparent-theme.png │ ├── gestures-non-minimalistic.png │ ├── multiple-search-providers.png │ ├── assist-app-settings-android-6-1.png │ ├── assist-app-settings-android-6-2.png │ ├── assist-app-settings-android-8-1.png │ ├── assist-app-settings-android-8-2.png │ ├── contact-multiple-phone-numbers.png │ ├── contact-set-default-phone-number.png │ └── contact-multiple-default-phone-number.png ├── Gemfile ├── _layouts │ └── category.html ├── _sass │ ├── variables.scss │ ├── search.scss │ ├── faq.scss │ ├── cloudcannon.scss │ ├── footer.scss │ ├── elements.scss │ ├── layout.scss │ ├── form.scss │ └── modal.scss ├── css │ └── screen.scss ├── _data │ ├── navigation.yml │ └── footer.yml ├── index.html ├── search.html ├── LICENSE ├── README.md └── _config.yml ├── utils └── requirements.txt ├── .vscode └── settings.json ├── ic_launcher-web.png ├── app ├── libs │ └── calculator-lib-0.0.0.jar ├── gradle │ └── wrapper │ │ └── gradle-wrapper.jar ├── src │ └── main │ │ ├── res │ │ ├── drawable-hdpi │ │ │ ├── call.png │ │ │ ├── dots.png │ │ │ ├── ic_phone.png │ │ │ ├── search.png │ │ │ ├── clear_dark.png │ │ │ ├── ic_contact.png │ │ │ ├── ic_message.png │ │ │ ├── ic_public.png │ │ │ ├── setting_apps.png │ │ │ ├── setting_info.png │ │ │ ├── setting_nfc.png │ │ │ ├── setting_wifi.png │ │ │ ├── setting_battery.png │ │ │ ├── setting_airplane.png │ │ │ ├── setting_tethering.png │ │ │ ├── zerostate_burger.png │ │ │ ├── zerostate_search.png │ │ │ ├── ic_colorpicker_swatch_selected.png │ │ │ ├── circle_widget.xml │ │ │ └── rectangle_widget.xml │ │ ├── drawable-xhdpi │ │ │ ├── call.png │ │ │ ├── dots.png │ │ │ ├── search.png │ │ │ ├── contacts.png │ │ │ ├── ic_phone.png │ │ │ ├── ic_public.png │ │ │ ├── settings.png │ │ │ ├── clear_dark.png │ │ │ ├── ic_functions.png │ │ │ ├── ic_message.png │ │ │ ├── setting_apps.png │ │ │ ├── setting_dev.png │ │ │ ├── setting_info.png │ │ │ ├── setting_nfc.png │ │ │ ├── setting_wifi.png │ │ │ ├── setting_airplane.png │ │ │ ├── setting_battery.png │ │ │ ├── setting_storage.png │ │ │ ├── setting_tethering.png │ │ │ ├── zerostate_burger.png │ │ │ ├── zerostate_search.png │ │ │ ├── setting_accessibility.png │ │ │ └── ic_colorpicker_swatch_selected.png │ │ ├── drawable-nodpi │ │ │ ├── lightbulp.png │ │ │ ├── lightbulp_on.png │ │ │ └── example_appwidget_preview.png │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ ├── values │ │ │ ├── bools.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── attrs.xml │ │ │ ├── colors.xml │ │ │ └── styles.xml │ │ ├── xml │ │ │ ├── backup_descriptor.xml │ │ │ ├── policies.xml │ │ │ ├── accessibility_service_config.xml │ │ │ └── zen_widget_info.xml │ │ ├── drawable │ │ │ ├── badge_background.xml │ │ │ ├── notification_background.xml │ │ │ ├── setting_info_white.xml │ │ │ ├── search_bar_background.xml │ │ │ ├── size_badge_background.xml │ │ │ ├── bottom_panel.xml │ │ │ ├── widget_preview_background.xml │ │ │ ├── rounded_kiss_bar.xml │ │ │ ├── solid_rectangle.xml │ │ │ ├── main_bg_navigation.xml │ │ │ ├── rounded_result_layout.xml │ │ │ ├── rounded_search_bar_pre21_light.xml │ │ │ ├── rounded_result_layout_pre21_light.xml │ │ │ ├── rounded_search_bar_pre21_dark.xml │ │ │ ├── rounded_result_layout_pre21_dark.xml │ │ │ ├── settings_sound.xml │ │ │ ├── contact_bar.xml │ │ │ ├── list_separator_dark.xml │ │ │ ├── list_separator_light.xml │ │ │ ├── apps_grid.xml │ │ │ ├── favorite_background.xml │ │ │ ├── rounded_search_bar.xml │ │ │ ├── ic_action_forward.xml │ │ │ ├── border.xml │ │ │ ├── button_border_red.xml │ │ │ ├── button_border.xml │ │ │ ├── barcode_scan.xml │ │ │ ├── ic_open_with_24px.xml │ │ │ ├── line.xml │ │ │ ├── ic_alarm_add_24px.xml │ │ │ ├── ic_baseline_notification_important_24px.xml │ │ │ ├── ic_history_24px.xml │ │ │ ├── ic_lock_24px.xml │ │ │ ├── ic_keyboard_24px.xml │ │ │ ├── ic_search.xml │ │ │ ├── ic_forward.xml │ │ │ ├── ic_open_in_browser_24px.xml │ │ │ ├── no_image.xml │ │ │ ├── color_picker_swatch.xml │ │ │ ├── ic_dialpad_24px.xml │ │ │ ├── dialog_background.xml │ │ │ └── ic_z.xml │ │ ├── layout │ │ │ ├── appwidget_error.xml │ │ │ ├── popup_divider.xml │ │ │ ├── favorite_text.xml │ │ │ ├── popup_list_item.xml │ │ │ ├── tags_dialog.xml │ │ │ ├── rename_dialog.xml │ │ │ ├── popup_tag_menu.xml │ │ │ ├── custom_icon_item.xml │ │ │ ├── appgripscreen.xml │ │ │ ├── zen_widget.xml │ │ │ ├── activity_select_snapshot.xml │ │ │ ├── popup_title.xml │ │ │ ├── snapshotlayout.xml │ │ │ ├── popup_widget.xml │ │ │ ├── widget_picker_header.xml │ │ │ ├── favorite_tag.xml │ │ │ ├── color_picker_swatch.xml │ │ │ ├── custom_icon_quick.xml │ │ │ ├── history_layout.xml │ │ │ └── pref_color.xml │ │ ├── values-v14 │ │ │ ├── dimens.xml │ │ │ └── strings.xml │ │ ├── menu │ │ │ └── menu_settings.xml │ │ ├── drawable-anydpi │ │ │ ├── touch_app.xml │ │ │ └── dots.xml │ │ ├── anim │ │ │ ├── popup_out.xml │ │ │ ├── popup_in_bottom.xml │ │ │ └── popup_in_top.xml │ │ ├── values-sk │ │ │ └── strings.xml │ │ ├── values-it │ │ │ └── arrays.xml │ │ ├── values-fa │ │ │ └── strings.xml │ │ ├── values-de │ │ │ └── arrays.xml │ │ ├── values-lt │ │ │ └── arrays.xml │ │ └── values-et │ │ │ └── strings.xml │ │ └── java │ │ ├── android │ │ └── support │ │ │ └── v7 │ │ │ └── app │ │ │ └── ActionBarActivity.java │ │ ├── fr │ │ └── neamar │ │ │ └── kiss │ │ │ ├── DummyActivity.java │ │ │ ├── pojo │ │ │ ├── PhonePojo.java │ │ │ ├── PhoneAddPojo.java │ │ │ ├── PojoComparator.java │ │ │ ├── TagDummyPojo.java │ │ │ ├── PojoWithTags.java │ │ │ ├── ShortcutPojo.java │ │ │ ├── SearchPojo.java │ │ │ └── SettingsPojo.java │ │ │ ├── db │ │ │ ├── ShortcutRecord.java │ │ │ ├── ValuedHistoryRecord.java │ │ │ └── AppRecord.java │ │ │ ├── forwarder │ │ │ └── Forwarder.java │ │ │ ├── searcher │ │ │ ├── QueryInterface.java │ │ │ ├── NullSearcher.java │ │ │ └── UntaggedSearcher.java │ │ │ ├── preference │ │ │ ├── RestartPreference.java │ │ │ ├── NotificationPreference.java │ │ │ ├── ResetExcludedFromHistoryAppsPreference.java │ │ │ ├── ResetFavoritesPreference.java │ │ │ ├── ResetShortcutsPreference.java │ │ │ ├── ResetExcludedAppsPreference.java │ │ │ ├── ResetSearchProvidersPreference.java │ │ │ ├── RootModePreference.java │ │ │ ├── FreezeHistoryPreference.java │ │ │ ├── ResetPreference.java │ │ │ ├── ProximitySwitch.java │ │ │ ├── RootModeSwitch.java │ │ │ ├── SignInSwitch.java │ │ │ └── FreezeHistorySwitch.java │ │ │ ├── utils │ │ │ ├── ClipboardUtils.java │ │ │ ├── PackageManagerUtils.java │ │ │ ├── ViewGroupUtils.java │ │ │ ├── Base64Serialize.java │ │ │ └── SpaceTokenizer.java │ │ │ ├── ui │ │ │ ├── NoTouchScrollView.java │ │ │ ├── ShapedContactBadge.java │ │ │ ├── BlockableListView.java │ │ │ └── SearchEditText.java │ │ │ ├── SwitchPreference.java │ │ │ ├── dataprovider │ │ │ └── simpleprovider │ │ │ │ ├── TagsProvider.java │ │ │ │ ├── SimpleProvider.java │ │ │ │ └── CalculatorProvider.java │ │ │ ├── icons │ │ │ └── IconPack.java │ │ │ ├── normalizer │ │ │ ├── PhoneNormalizer.java │ │ │ └── IntSequenceBuilder.java │ │ │ ├── loader │ │ │ └── LoadPojos.java │ │ │ └── broadcast │ │ │ ├── LocaleChangedReceiver.java │ │ │ └── IncomingCallScreeningService.java │ │ └── fi │ │ └── zmengames │ │ └── zen │ │ ├── ColorUtil.java │ │ ├── BootUpReceiver.java │ │ ├── AlarmReceiver.java │ │ ├── ZenAdmin.java │ │ ├── ZenPojo.java │ │ ├── ShowHistoryButtonSwitch.java │ │ ├── ParcelableUtil.java │ │ ├── VibrateOnAlarmSwitch.java │ │ ├── ScreenReceiver.java │ │ └── Constants.java └── proguard-rules.pro ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── settings.gradle ├── .github ├── ISSUE_TEMPLATE.md ├── PULL_REQUEST_TEMPLATE.md └── workflows │ └── android.yml ├── Android.mk ├── gradle.properties ├── widgetpicker-dev ├── widget_picker_item.xml └── widget_picker_item_title.xml └── .circleci └── config.yml /docs/CNAME: -------------------------------------------------------------------------------- 1 | help.kisslauncher.com 2 | -------------------------------------------------------------------------------- /utils/requirements.txt: -------------------------------------------------------------------------------- 1 | docopt==0.6.2 2 | -------------------------------------------------------------------------------- /docs/_includes/logo.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /docs/_sets/_defaults.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 3 | description: 4 | --- -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | _site/ 2 | .sass-cache/ 3 | .jekyll-metadata 4 | -------------------------------------------------------------------------------- /docs/_category/ui.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: UI 3 | permalink: "/category/ui/" 4 | --- 5 | -------------------------------------------------------------------------------- /docs/_category/bugs.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: Bugs 3 | permalink: "/category/bugs/" 4 | --- 5 | -------------------------------------------------------------------------------- /docs/siteicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/siteicon.png -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "java.configuration.updateBuildConfiguration": "interactive" 3 | } -------------------------------------------------------------------------------- /docs/_category/advanced.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: Advanced 3 | permalink: "/category/advanced/" 4 | --- 5 | -------------------------------------------------------------------------------- /docs/_category/contacts.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: Contacts 3 | permalink: "/category/contacts/" 4 | --- 5 | -------------------------------------------------------------------------------- /docs/_category/widgets.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: Widgets 3 | permalink: "/category/widgets/" 4 | --- 5 | -------------------------------------------------------------------------------- /docs/touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/touch-icon.png -------------------------------------------------------------------------------- /ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/ic_launcher-web.png -------------------------------------------------------------------------------- /docs/_category/favorites.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: Favorites 3 | permalink: "/category/favorites/" 4 | --- 5 | -------------------------------------------------------------------------------- /docs/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/images/favicon.png -------------------------------------------------------------------------------- /docs/images/whatsapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/images/whatsapp.png -------------------------------------------------------------------------------- /docs/_posts/_defaults.md: -------------------------------------------------------------------------------- 1 | --- 2 | date: 3 | title: 4 | categories: 5 | description: 6 | type: Document 7 | --- 8 | -------------------------------------------------------------------------------- /docs/screenshots/tags-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/tags-menu.png -------------------------------------------------------------------------------- /app/libs/calculator-lib-0.0.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/libs/calculator-lib-0.0.0.jar -------------------------------------------------------------------------------- /docs/screenshots/assist-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/assist-app.png -------------------------------------------------------------------------------- /docs/screenshots/dark-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/dark-theme.png -------------------------------------------------------------------------------- /docs/screenshots/light-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/light-theme.png -------------------------------------------------------------------------------- /docs/screenshots/tags-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/tags-dialog.png -------------------------------------------------------------------------------- /docs/screenshots/tags-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/tags-example.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /docs/screenshots/contact-alias.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/contact-alias.png -------------------------------------------------------------------------------- /docs/screenshots/example-widget.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/example-widget.png -------------------------------------------------------------------------------- /docs/screenshots/tag-bar-select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/tag-bar-select.png -------------------------------------------------------------------------------- /app/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /docs/screenshots/tag-bar-configure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/tag-bar-configure.png -------------------------------------------------------------------------------- /docs/screenshots/tag-bar-display.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/tag-bar-display.png -------------------------------------------------------------------------------- /docs/screenshots/transparent-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/transparent-theme.png -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' 3 | } 4 | include ':app' 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/call.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/call.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/dots.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/call.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/call.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/dots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/dots.png -------------------------------------------------------------------------------- /docs/screenshots/contact-alias-edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/contact-alias-edit.png -------------------------------------------------------------------------------- /docs/screenshots/widget-context-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/widget-context-menu.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/ic_phone.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/search.png -------------------------------------------------------------------------------- /docs/screenshots/add-search-provider-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/add-search-provider-1.png -------------------------------------------------------------------------------- /docs/screenshots/add-search-provider-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/add-search-provider-2.png -------------------------------------------------------------------------------- /docs/screenshots/add-search-provider-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/add-search-provider-3.png -------------------------------------------------------------------------------- /docs/screenshots/dark-transparent-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/dark-transparent-theme.png -------------------------------------------------------------------------------- /docs/screenshots/example-minimalist-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/example-minimalist-1.png -------------------------------------------------------------------------------- /docs/screenshots/example-minimalist-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/example-minimalist-2.png -------------------------------------------------------------------------------- /docs/screenshots/example-minimalist-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/example-minimalist-3.png -------------------------------------------------------------------------------- /docs/screenshots/example-minimalist-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/example-minimalist-4.png -------------------------------------------------------------------------------- /docs/screenshots/gestures-minimalistic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/gestures-minimalistic.png -------------------------------------------------------------------------------- /docs/screenshots/semi-transparent-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/semi-transparent-theme.png -------------------------------------------------------------------------------- /app/src/main/java/android/support/v7/app/ActionBarActivity.java: -------------------------------------------------------------------------------- 1 | package android.support.v7.app; 2 | 3 | public class ActionBarActivity { 4 | } 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/clear_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/clear_dark.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_contact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/ic_contact.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/ic_message.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_public.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/ic_public.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/lightbulp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-nodpi/lightbulp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/contacts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/contacts.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/ic_phone.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_public.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/ic_public.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/settings.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /docs/_sets/getting-started.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Getting Started 3 | description: This series guides you through getting started on our platform. 4 | --- -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/setting_apps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/setting_apps.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/setting_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/setting_info.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/setting_nfc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/setting_nfc.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/setting_wifi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/setting_wifi.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/lightbulp_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-nodpi/lightbulp_on.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/clear_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/clear_dark.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_functions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/ic_functions.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/ic_message.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/setting_apps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/setting_apps.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/setting_dev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/setting_dev.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/setting_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/setting_info.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/setting_nfc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/setting_nfc.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/setting_wifi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/setting_wifi.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /docs/screenshots/dark-semi-transparent-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/dark-semi-transparent-theme.png -------------------------------------------------------------------------------- /docs/screenshots/gestures-non-minimalistic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/gestures-non-minimalistic.png -------------------------------------------------------------------------------- /docs/screenshots/multiple-search-providers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/multiple-search-providers.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/setting_battery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/setting_battery.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/setting_airplane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/setting_airplane.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/setting_tethering.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/setting_tethering.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/zerostate_burger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/zerostate_burger.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/zerostate_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/zerostate_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/setting_airplane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/setting_airplane.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/setting_battery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/setting_battery.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/setting_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/setting_storage.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/setting_tethering.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/setting_tethering.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/zerostate_burger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/zerostate_burger.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/zerostate_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/zerostate_search.png -------------------------------------------------------------------------------- /docs/screenshots/assist-app-settings-android-6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/assist-app-settings-android-6-1.png -------------------------------------------------------------------------------- /docs/screenshots/assist-app-settings-android-6-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/assist-app-settings-android-6-2.png -------------------------------------------------------------------------------- /docs/screenshots/assist-app-settings-android-8-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/assist-app-settings-android-8-1.png -------------------------------------------------------------------------------- /docs/screenshots/assist-app-settings-android-8-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/assist-app-settings-android-8-2.png -------------------------------------------------------------------------------- /docs/screenshots/contact-multiple-phone-numbers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/contact-multiple-phone-numbers.png -------------------------------------------------------------------------------- /docs/screenshots/contact-set-default-phone-number.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/contact-set-default-phone-number.png -------------------------------------------------------------------------------- /app/src/main/res/values/bools.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/setting_accessibility.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/setting_accessibility.png -------------------------------------------------------------------------------- /docs/screenshots/contact-multiple-default-phone-number.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/docs/screenshots/contact-multiple-default-phone-number.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/example_appwidget_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-nodpi/example_appwidget_preview.png -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #A1333E 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_colorpicker_swatch_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-hdpi/ic_colorpicker_swatch_selected.png -------------------------------------------------------------------------------- /app/src/main/res/xml/backup_descriptor.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/xml/policies.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_colorpicker_swatch_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/krasanen/zen-launcher/HEAD/app/src/main/res/drawable-xhdpi/ic_colorpicker_swatch_selected.png -------------------------------------------------------------------------------- /docs/_includes/youtube.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
-------------------------------------------------------------------------------- /docs/_includes/relative-src.html: -------------------------------------------------------------------------------- 1 | {% assign prefix = include.src | slice: 0, 2 %}{% assign protocol = include.src | slice: 0, 4 %}{% unless protocol == 'http' or prefix == "//" %}{{ site.baseurl }}{% endunless %}{{ include.src }} -------------------------------------------------------------------------------- /app/src/main/res/drawable/badge_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/notification_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/setting_info_white.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/DummyActivity.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss; 2 | 3 | import android.app.Activity; 4 | 5 | /** 6 | * An empty activity used for changing Android's Default Launcher 7 | */ 8 | 9 | public class DummyActivity extends Activity { 10 | } 11 | -------------------------------------------------------------------------------- /docs/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'jekyll', '3.7.2' 4 | 5 | group :jekyll_plugins do 6 | gem 'jekyll-extract-element', '0.0.7' 7 | gem 'jekyll-feed', '0.9.3' 8 | gem 'jekyll-seo-tag', '2.4.0' 9 | gem 'jekyll-sitemap', '1.2.0' 10 | end 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/search_bar_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/size_badge_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_panel.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_preview_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout/appwidget_error.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/pojo/PhonePojo.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.pojo; 2 | 3 | public class PhonePojo extends Pojo { 4 | public final String phone; 5 | 6 | public PhonePojo(String id, String phone) { 7 | super(id); 8 | 9 | this.phone = phone; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_kiss_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/pojo/PhoneAddPojo.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.pojo; 2 | 3 | public class PhoneAddPojo extends Pojo { 4 | public final String phone; 5 | 6 | public PhoneAddPojo(String id, String phone) { 7 | super(id); 8 | 9 | this.phone = phone; 10 | } 11 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/solid_rectangle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/_layouts/category.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | {% assign posts = site.categories[page.tag] | sort: "title" %} 5 |

{{ page.title | replace: "-", " " }} ({{ posts | size }})

6 | 7 | {% include listings.html listings=posts %} 8 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/db/ShortcutRecord.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.db; 2 | 3 | public class ShortcutRecord { 4 | public int dbId; 5 | 6 | public String name; 7 | 8 | public String packageName; 9 | 10 | public String intentUri; 11 | 12 | public byte[] icon_blob; 13 | 14 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/main_bg_navigation.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_result_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_search_bar_pre21_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/_includes/search.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | {% include search-icon.html %} 4 | 5 |
-------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_result_layout_pre21_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_search_bar_pre21_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values-v14/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 0dp 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-v14/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Toggle Wifi On/Off 4 | Wifi Off 5 | Wifi On 6 | 7 | -------------------------------------------------------------------------------- /docs/_sass/variables.scss: -------------------------------------------------------------------------------- 1 | // Breakpoints 2 | $tablet: "(min-width: 450px)"; 3 | $mid-point: "(min-width: 750px)"; 4 | $desktop: "(min-width: 900px)"; 5 | 6 | // Colors 7 | 8 | $dark-grey: #222; 9 | $medium-grey: #666; 10 | $light-grey: #ccc; 11 | $header-color: #66BB6A; 12 | 13 | $link-color: #4A4A4A; 14 | $link-hover-color: #111; 15 | -------------------------------------------------------------------------------- /docs/css/screen.scss: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | @import "variables"; 4 | @import "typography"; 5 | @import "elements"; 6 | @import "tutorials"; 7 | @import "header"; 8 | @import "layout"; 9 | @import "search"; 10 | @import "dark-theme"; 11 | @import "footer"; 12 | @import "faq"; 13 | @import "modal"; 14 | @import "form"; 15 | @import "cloudcannon"; 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_result_layout_pre21_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /docs/_data/navigation.yml: -------------------------------------------------------------------------------- 1 | - name: Documentation 2 | link: / 3 | - name: FAQ 4 | link: /faq 5 | - name: GitHub 6 | link: https://github.com/Neamar/KISS 7 | - name: Play Store 8 | link: https://play.google.com/store/apps/details?id=fi.zmengames.zlauncher 9 | - name: F-Droid 10 | link: https://f-droid.org/packages/fi.zmengames.zlauncher/ 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/settings_sound.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /docs/_sass/search.scss: -------------------------------------------------------------------------------- 1 | #search-results { 2 | margin: 0; 3 | padding: 0; 4 | 5 | li { 6 | list-style: none; 7 | margin: 0; 8 | padding: 0; 9 | 10 | h4 { 11 | margin: 20px 0 10px 0; 12 | } 13 | 14 | p { 15 | line-height: 1.5; 16 | padding: 0; 17 | margin: 0; 18 | } 19 | } 20 | } 21 | 22 | #search-query { 23 | font-weight: bold; 24 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/contact_bar.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/list_separator_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/list_separator_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /docs/_sass/faq.scss: -------------------------------------------------------------------------------- 1 | .faq { 2 | ul { 3 | padding: 0; 4 | margin: 0 0 50px 0; 5 | list-style: none; 6 | } 7 | 8 | li { 9 | font-size: 1em; 10 | 11 | a { 12 | color: $medium-grey; 13 | text-decoration: none; 14 | display: block; 15 | border-bottom: 1px solid #eee; 16 | padding: 5px 0; 17 | 18 | &:hover { 19 | color: $dark-grey; 20 | } 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/popup_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | -------------------------------------------------------------------------------- /docs/_includes/navigation.html: -------------------------------------------------------------------------------- 1 | 2 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/circle_widget.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/apps_grid.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/favorite_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_search_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /docs/_includes/search-icon.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/db/ValuedHistoryRecord.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.db; 2 | 3 | public class ValuedHistoryRecord { 4 | /** 5 | * ID for the record 6 | */ 7 | public String record; 8 | 9 | /** 10 | * Name for the record 11 | */ 12 | public String name; 13 | 14 | /** 15 | * Context dependant value, e.g. number of access 16 | */ 17 | public int value; 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_action_forward.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/border.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 11 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_border_red.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 11 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 11 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/forwarder/Forwarder.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.forwarder; 2 | 3 | import android.content.SharedPreferences; 4 | 5 | import fr.neamar.kiss.MainActivity; 6 | 7 | abstract class Forwarder { 8 | final MainActivity mainActivity; 9 | final SharedPreferences prefs; 10 | 11 | Forwarder(MainActivity mainActivity) { 12 | this.mainActivity = mainActivity; 13 | this.prefs = mainActivity.prefs; 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/touch_app.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/searcher/QueryInterface.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.searcher; 2 | 3 | import android.app.DialogFragment; 4 | 5 | import fr.neamar.kiss.ui.ListPopup; 6 | 7 | public interface QueryInterface { 8 | void temporarilyDisableTranscriptMode(); 9 | void updateTranscriptMode(int transcriptMode); 10 | 11 | void launchOccurred(); 12 | 13 | void registerPopup(ListPopup popup); 14 | 15 | void showDialog(DialogFragment dialog); 16 | } -------------------------------------------------------------------------------- /app/src/main/res/xml/accessibility_service_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | -------------------------------------------------------------------------------- /docs/_data/footer.yml: -------------------------------------------------------------------------------- 1 | - name: 2 | link: https://www.facebook.com/kisslauncher 3 | new_window: true 4 | social_icon: Facebook 5 | - name: 6 | link: https://twitter.com/KissLauncher 7 | social_icon: Twitter 8 | new_window: true 9 | - name: 10 | link: https://plus.google.com/communities/116489528310489783081 11 | social_icon: Google Plus 12 | new_window: true 13 | - name: 14 | link: https://github.com/Neamar/KISS 15 | social_icon: Subscribe 16 | new_window: false 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/barcode_scan.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout/favorite_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_open_with_24px.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/line.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /docs/_includes/listings.html: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/dots.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_alarm_add_24px.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_notification_important_24px.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/popup_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_history_24px.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /docs/_posts/2018-02-11-missing-favorite.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Fix missing favorite 3 | categories: 4 | - Favorites 5 | description: "One of my favorites is missing from KISS!" 6 | type: Document 7 | --- 8 | 9 | This will happen if the favorite isn't available to KISS anymore, for instance: 10 | 11 | * The app was uninstalled 12 | * The app was on an SD card that isn't available anymore 13 | * The contact was merged with someone else or removed 14 | 15 | To fix this issue, you'll need to remove all your favorites (`⋮, KISS Settings, Favorites settings, Reset your list of favorites`) and add them back. 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lock_24px.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/db/AppRecord.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.db; 2 | 3 | public class AppRecord { 4 | public static final int FLAG_CUSTOM_NAME = 2; 5 | public static final int FLAG_CUSTOM_ICON = 4; 6 | 7 | public long dbId; 8 | 9 | public String name; 10 | 11 | public String componentName; 12 | 13 | public int flags; 14 | 15 | public boolean hasCustomName() { 16 | return (flags & FLAG_CUSTOM_NAME) == FLAG_CUSTOM_NAME; 17 | } 18 | 19 | public boolean hasCustomIcon() { 20 | return (flags & FLAG_CUSTOM_ICON) == FLAG_CUSTOM_ICON; 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/tags_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | -------------------------------------------------------------------------------- /docs/_includes/footer.html: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | (please read this text, then remove it to write your issue) 2 | 3 | Thanks for taking the time to help us improve KISS! 4 | 5 | ## Submitting a bug? 6 | Make sure you include the following: 7 | 8 | * app version 9 | * android version 10 | * device used 11 | * custom settings that might have an impact 12 | * one or more screenshot 13 | 14 | ## Submitting a feature request? 15 | Make sure the issue title is descriptive enough :) 16 | Then explain what you're looking for, what problem it will solve and feel free to include a mockup (even a Paint drawing is fine) to ensure we're all on the same page 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/java/fi/zmengames/zen/ColorUtil.java: -------------------------------------------------------------------------------- 1 | package fi.zmengames.zen; 2 | 3 | import android.graphics.Color; 4 | 5 | public final class ColorUtil { 6 | 7 | public static int blendColors(int color1, int color2, float ratio) { 8 | final float inverseRation = 1f - ratio; 9 | float r = (Color.red(color1) * ratio) + (Color.red(color2) * inverseRation); 10 | float g = (Color.green(color1) * ratio) + (Color.green(color2) * inverseRation); 11 | float b = (Color.blue(color1) * ratio) + (Color.blue(color2) * inverseRation); 12 | return Color.rgb((int) r, (int) g, (int) b); 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_keyboard_24px.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/xml/zen_widget_info.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/rename_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Thanks for taking the time to make Zen Launcher better by contributing code! 2 | 3 | Before you open the pull request, please make sure that: 4 | 5 | * Your pull request title is clear enough -- ideally, reading the title should be enough to understand the content 6 | * Your description explains what you're trying to do (ideally referencing some existing issues) 7 | * If you made any tradeoffs, please mention them and explain why you think they were necessary 8 | * Include screenshots of your changes 9 | * check if fix could be applied to KISS also! 10 | 11 | Once again, thanks for your help! Feel free to remove all this text and start typing... 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/java/fi/zmengames/zen/BootUpReceiver.java: -------------------------------------------------------------------------------- 1 | package fi.zmengames.zen; 2 | import android.content.BroadcastReceiver; 3 | import android.content.ComponentName; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | 7 | import android.util.Log; 8 | 9 | import org.greenrobot.eventbus.EventBus; 10 | 11 | public class BootUpReceiver extends BroadcastReceiver { 12 | private static final String TAG = BootUpReceiver.class.getSimpleName(); 13 | 14 | @Override 15 | public void onReceive(Context context, Intent intent) { 16 | ZEvent event = new ZEvent(ZEvent.State.RELOAD_APPS); 17 | EventBus.getDefault().postSticky(event); 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_forward.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/popup_tag_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/anim/popup_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/rectangle_widget.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 16 | 17 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/pojo/PojoComparator.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.pojo; 2 | 3 | import java.util.Comparator; 4 | 5 | public class PojoComparator implements Comparator { 6 | 7 | public PojoComparator() { 8 | super(); 9 | } 10 | 11 | @Override 12 | public int compare(Pojo lhs, Pojo rhs) { 13 | if (lhs.relevance == rhs.relevance) { 14 | if (lhs.normalizedName != null && rhs.normalizedName != null) 15 | return lhs.normalizedName.compareTo(rhs.normalizedName); 16 | else 17 | return lhs.name.compareTo(rhs.name); 18 | } 19 | return lhs.relevance - rhs.relevance; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/pojo/TagDummyPojo.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.pojo; 2 | 3 | import fr.neamar.kiss.dataprovider.simpleprovider.TagsProvider; 4 | 5 | public final class TagDummyPojo extends Pojo { 6 | public TagDummyPojo(String id) { 7 | super(id); 8 | setName(id.substring(TagsProvider.SCHEME.length()), false); 9 | } 10 | 11 | @Override 12 | public String getHistoryId() { 13 | // Should not appear in history 14 | return ""; 15 | } 16 | 17 | @Override 18 | public String getFavoriteId() { 19 | // TagDummy are special, as they should appear in favorites but not in history 20 | return this.id; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_open_in_browser_24px.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/no_image.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 8 | 10 | 11 | 14 | 15 | 16 | 21 | 22 | -------------------------------------------------------------------------------- /docs/_sass/cloudcannon.scss: -------------------------------------------------------------------------------- 1 | .editor-link { 2 | display: none; 3 | margin-top: 0; 4 | border: 0; 5 | border-radius: 2px; 6 | box-sizing: border-box; 7 | text-decoration: none; 8 | margin: 0; 9 | cursor: pointer; 10 | background-color: #f7e064; 11 | color: #333; 12 | box-shadow: 1px 1px 5px 0 rgba(0, 0, 0, 0.2); 13 | 14 | &:hover { 15 | background-color: #f4d525; 16 | color: #333; 17 | } 18 | } 19 | 20 | .cms-editor-active .editor-link { 21 | display: block; 22 | } 23 | 24 | .cms-editor-active nav .editor-link { 25 | display: inline; 26 | } 27 | 28 | .cms-editor-active .sidebar .editor-link { 29 | display: inline-block; 30 | margin: 0 auto 20px auto; 31 | padding: 10px 20px; 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/res/layout/custom_icon_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/appgripscreen.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/preference/RestartPreference.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.preference; 2 | 3 | import android.content.Context; 4 | import android.content.DialogInterface; 5 | import android.preference.DialogPreference; 6 | import android.util.AttributeSet; 7 | 8 | public class RestartPreference extends DialogPreference { 9 | 10 | public RestartPreference(Context context, AttributeSet attrs) { 11 | super(context, attrs); 12 | } 13 | 14 | @Override 15 | public void onClick(DialogInterface dialog, int which) { 16 | super.onClick(dialog, which); 17 | if (which == DialogInterface.BUTTON_POSITIVE) { 18 | System.exit(0); 19 | } 20 | 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/zen_widget.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/utils/ClipboardUtils.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.utils; 2 | 3 | import android.content.ClipData; 4 | import android.content.ClipboardManager; 5 | import android.content.Context; 6 | 7 | public class ClipboardUtils { 8 | public static void setClipboard(Context context, String text) { 9 | ClipboardManager clipboard; 10 | if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { 11 | clipboard = context.getSystemService(ClipboardManager.class); 12 | } else { 13 | clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); 14 | } 15 | 16 | ClipData clip = ClipData.newPlainText("Copied Text", text); 17 | clipboard.setPrimaryClip(clip); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | -dontobfuscate 2 | -dontoptimize 3 | 4 | -optimizations !code/allocation/variable 5 | -dontwarn org.apache.commons.** 6 | -dontwarn org.apache.http.** 7 | -dontwarn com.google.common.** 8 | -assumenosideeffects class android.util.Log { 9 | public static boolean isLoggable(java.lang.String, int); 10 | public static int v(...); 11 | public static int i(...); 12 | public static int w(...); 13 | public static int d(...); 14 | public static int e(...); 15 | } 16 | 17 | -keep class androidx.appcompat.app.**{ 18 | *; 19 | } 20 | 21 | -keepclassmembers class * { 22 | @com.google.api.client.util.Key ; 23 | } 24 | 25 | -keepclassmembers class ** { 26 | public void onEvent*(**); 27 | } 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/searcher/NullSearcher.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.searcher; 2 | 3 | import fr.neamar.kiss.MainActivity; 4 | 5 | /** 6 | * Retrieve pojos from history 7 | */ 8 | public class NullSearcher extends Searcher { 9 | 10 | public NullSearcher(MainActivity activity) { 11 | super(activity, ""); 12 | } 13 | 14 | @Override 15 | protected void displayActivityLoader() { 16 | // Don't display the loader for the NullSearcher 17 | // (otherwise, pressing home again in minimalistic mode displays the loader for no reason) 18 | } 19 | 20 | @Override 21 | protected Void doInBackground(Void... voids) { 22 | // nothing found ;) 23 | return null; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/ui/NoTouchScrollView.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.ui; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.MotionEvent; 6 | import android.widget.HorizontalScrollView; 7 | 8 | /** 9 | * Created by TBog on 5/14/2018. 10 | */ 11 | public class NoTouchScrollView extends HorizontalScrollView { 12 | public NoTouchScrollView(Context context, AttributeSet attrs) { 13 | super(context, attrs); 14 | } 15 | 16 | @Override 17 | public boolean onTouchEvent(MotionEvent ev) { 18 | return false; 19 | } 20 | 21 | @Override 22 | public boolean onInterceptTouchEvent(MotionEvent ev) { 23 | return false; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /docs/_sass/footer.scss: -------------------------------------------------------------------------------- 1 | footer { 2 | background: #343642; 3 | color: #fff; 4 | padding: 20px 0; 5 | 6 | .edit-footer { 7 | text-align: center; 8 | margin: 0; 9 | } 10 | 11 | .copyright { 12 | color: $medium-grey; 13 | margin: 0; 14 | text-align: center; 15 | font-size: .9em; 16 | } 17 | 18 | a { 19 | color: #fff; 20 | text-decoration: none; 21 | 22 | &:hover svg { 23 | fill: #fff; 24 | } 25 | } 26 | 27 | ul { 28 | padding: 0; 29 | list-style: none; 30 | margin: 0; 31 | text-align: center; 32 | } 33 | 34 | li { 35 | display: inline-block; 36 | margin: 0 6px 15px 0; 37 | } 38 | 39 | svg { 40 | fill: $medium-grey; 41 | position: relative; 42 | top: 5px; 43 | transition: fill 200ms ease-in; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /.github/workflows/android.yml: -------------------------------------------------------------------------------- 1 | name: Android CI 2 | 3 | on: 4 | push: 5 | pull_request: 6 | branches: [ zen-launcher ] 7 | 8 | jobs: 9 | build: 10 | 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v2 15 | - name: set up JDK 11 16 | uses: actions/setup-java@v2 17 | with: 18 | java-version: '11' 19 | distribution: 'adopt' 20 | cache: gradle 21 | 22 | - name: Grant execute permission for gradlew 23 | run: chmod +x gradlew 24 | - name: Build with Gradle 25 | run: ./gradlew assembleDebug 26 | - name: Upload a Build Artifact 27 | uses: actions/upload-artifact@v2.2.4 28 | with: 29 | name: assets-for-download 30 | path: app/build/outputs 31 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/SwitchPreference.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | 6 | // https://code.google.com/p/android/issues/detail?id=26194 7 | // Can be removed once we drop support for KitKat 8 | public class SwitchPreference extends android.preference.SwitchPreference { 9 | 10 | public SwitchPreference(Context context) { 11 | this(context, null); 12 | } 13 | 14 | public SwitchPreference(Context context, AttributeSet attrs) { 15 | this(context, attrs, android.R.attr.switchPreferenceStyle); 16 | } 17 | 18 | public SwitchPreference(Context context, AttributeSet attrs, int defStyle) { 19 | super(context, attrs, defStyle); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/utils/PackageManagerUtils.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.utils; 2 | 3 | import android.content.ComponentName; 4 | import android.content.Context; 5 | import android.content.pm.PackageManager; 6 | 7 | public class PackageManagerUtils { 8 | 9 | /** 10 | * Method to enable/disable a specific component 11 | */ 12 | public static void enableComponent(Context ctx, Class component, boolean enabled) { 13 | PackageManager pm = ctx.getPackageManager(); 14 | ComponentName cn = new ComponentName(ctx, component); 15 | pm.setComponentEnabledSetting(cn, 16 | enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 17 | PackageManager.DONT_KILL_APP); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/utils/ViewGroupUtils.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.utils; 2 | 3 | import android.view.View; 4 | import android.view.ViewGroup; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | public class ViewGroupUtils { 10 | 11 | public static List removeAndGetDirectChildren(ViewGroup viewGroup) { 12 | List result = new ArrayList<>(); 13 | for (int i = 0; i < viewGroup.getChildCount(); i++) { 14 | result.add(viewGroup.getChildAt(i)); 15 | } 16 | viewGroup.removeAllViews(); 17 | return result; 18 | } 19 | 20 | public static void addAllViews(ViewGroup viewGroup, List views) { 21 | for (View view : views) { 22 | viewGroup.addView(view); 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /docs/_includes/document-icon.html: -------------------------------------------------------------------------------- 1 | {% case include.icon %} 2 | {% when "Video" %} 3 |
4 | 5 | 6 | 7 | 8 |
9 | {% when "Document" %} 10 |
11 | 12 | 13 | 14 | 15 |
16 | {% endcase %} 17 | -------------------------------------------------------------------------------- /app/src/main/java/fi/zmengames/zen/AlarmReceiver.java: -------------------------------------------------------------------------------- 1 | package fi.zmengames.zen; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.widget.Toast; 7 | 8 | import fr.neamar.kiss.R; 9 | 10 | public class AlarmReceiver extends BroadcastReceiver { 11 | 12 | @Override 13 | public void onReceive(Context context, Intent k2) { 14 | // TODO Auto-generated method stub 15 | Toast.makeText(context, context.getResources().getString(R.string.alarm_received), Toast.LENGTH_LONG).show(); 16 | Intent intent = new Intent(context, AlarmActivity.class); 17 | intent.putExtras(k2); 18 | intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK); 19 | context.startActivity(intent); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Android.mk: -------------------------------------------------------------------------------- 1 | LOCAL_PATH:= $(call my-dir) 2 | 3 | include $(CLEAR_VARS) 4 | 5 | LOCAL_MODULE := ZLauncher 6 | LOCAL_MODULE_TAGS := optional 7 | LOCAL_PACKAGE_NAME := ZLauncher 8 | 9 | kiss_root := $(LOCAL_PATH) 10 | kiss_dir := app 11 | kiss_out := $(PWD)/$(OUT_DIR)/target/common/obj/APPS/$(LOCAL_MODULE)_intermediates 12 | kiss_build := $(kiss_root)/$(kiss_dir)/build 13 | kiss_apk := build/outputs/apk/$(kiss_dir)-release-unsigned.apk 14 | 15 | $(kiss_root)/$(kiss_dir)/$(kiss_apk): 16 | rm -Rf $(kiss_build) 17 | mkdir -p $(kiss_out) 18 | ln -sf $(kiss_out) $(kiss_build) 19 | cd $(kiss_root)/$(kiss_dir) && gradle assembleRelease 20 | 21 | LOCAL_CERTIFICATE := platform 22 | LOCAL_SRC_FILES := $(kiss_dir)/$(kiss_apk) 23 | LOCAL_MODULE_CLASS := APPS 24 | LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) 25 | 26 | include $(BUILD_PREBUILT) 27 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/color_picker_swatch.xml: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /docs/_posts/2018-02-17-kiss-takes-lots-of-memory.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: KISS takes a lot of memory! 3 | categories: 4 | - Bugs 5 | description: "What to do when KISS starts using a lot of memory" 6 | type: Document 7 | --- 8 | 9 | KISS was designed to be easy to use, and fast. It also learns from your habits, and to do so needs to locally store all the results you've clicked before. This is then used to improve the ranking of items. 10 | 11 | Over time, the history can grow quite large and takes a lot of memory that you might want to use for something else. 12 | 13 | To clear history, go to `⋮, KISS Settings, History settings, Reset history`. 14 | 15 | After that, you'll have a clean KISS! 16 | 17 | > A note on privacy: The history is only visible to KISS, not to other applications, and is never sent over the network (KISS doesn't have the Internet permission) 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_select_snapshot.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 15 | 19 | -------------------------------------------------------------------------------- /docs/_posts/2018-02-14-some-settings-are-not-applied.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: My new setting is not applied! 3 | categories: 4 | - Bugs 5 | description: "What to do when KISS UI doesn't reflect your settings changes" 6 | type: Document 7 | --- 8 | 9 | KISS has a lot of settings, and sometimes updating multiples settings together can have unexpected side-effects. In other situations, you may need to completely restart the app to pick up the new settings. 10 | 11 | KISS does its best to automatically refresh itself when changing settings, but if you do not see the changes you're expecting you can force a reboot of KISS by going to `⋮, KISS Settings, Advanced settings, Restart KISS`. 12 | 13 | > Please note that if you're using KISS as [an assist app](/advanced/how-to-use-kiss-as-an-assist-app/), and not as a launcher, this will just quit the app and you'll need to re-open KISS manually. 14 | -------------------------------------------------------------------------------- /docs/_sass/elements.scss: -------------------------------------------------------------------------------- 1 | html, body { 2 | padding: 0; 3 | margin: 0; 4 | background: #343642; 5 | } 6 | 7 | body { 8 | min-height: 100vh; 9 | color: $dark-grey; 10 | -webkit-font-smoothing: antialiased; 11 | } 12 | 13 | h2, h2 a { 14 | color: $dark-grey; 15 | 16 | &:hover { 17 | text-decoration: none; 18 | } 19 | } 20 | 21 | h4 { 22 | margin: 0 0 20px 0; 23 | } 24 | 25 | img { 26 | max-width: 100%; 27 | } 28 | 29 | ul, ol { 30 | margin-top: 20px; 31 | margin-bottom: 20px; 32 | li { 33 | margin: 0 0 10px 0; 34 | } 35 | } 36 | 37 | code, pre, tt { 38 | font-family: Inconsolata,Consolas,Courier,"Courier New","Liberation Mono",monospace; 39 | font-size: .9em; 40 | white-space: pre-wrap; 41 | border-radius: 2px; 42 | line-height: 1.4; 43 | font-weight: 400; 44 | background-color: #404145; 45 | color: #FAFAFA; 46 | border-radius: 2px; 47 | padding: 2px 5px; 48 | } -------------------------------------------------------------------------------- /docs/_sass/layout.scss: -------------------------------------------------------------------------------- 1 | .wrapper { 2 | max-width: 900px; 3 | margin: 0 auto; 4 | padding: 0 30px; 5 | position: relative; 6 | } 7 | 8 | .logo { 9 | img { 10 | margin-top: 8px; 11 | height: 30px; 12 | } 13 | } 14 | 15 | .content { 16 | background: #fff; 17 | padding: 60px 0; 18 | } 19 | 20 | dt, h2 { 21 | a.header-link { 22 | text-decoration: none; 23 | color: #ccc; 24 | opacity: 0; 25 | transition: opacity ease .2s,color ease .2s; 26 | vertical-align: bottom; 27 | margin: 0 0 0 5px; 28 | 29 | &:hover { 30 | color: $link-color; 31 | } 32 | } 33 | 34 | &:hover a { 35 | opacity: 1; 36 | } 37 | } 38 | 39 | .video_wrapper { 40 | position: relative; 41 | padding-bottom: 59.5%; 42 | padding-top: 25px; 43 | height: 0; 44 | 45 | iframe { 46 | position: absolute; 47 | top: 0; 48 | left: 0; 49 | width: 100%; 50 | height: 100%; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/dataprovider/simpleprovider/TagsProvider.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.dataprovider.simpleprovider; 2 | 3 | import java.util.Locale; 4 | 5 | import fr.neamar.kiss.pojo.Pojo; 6 | import fr.neamar.kiss.pojo.TagDummyPojo; 7 | import fr.neamar.kiss.searcher.Searcher; 8 | 9 | public class TagsProvider extends SimpleProvider { 10 | public static final String SCHEME = "kisstag://"; 11 | 12 | public static String generateUniqueId(String tag) { 13 | return SCHEME + tag.toLowerCase(Locale.ROOT); 14 | } 15 | 16 | @Override 17 | public void requestResults(String s, Searcher searcher) { 18 | 19 | } 20 | 21 | @Override 22 | public boolean mayFindById(String id) { 23 | return id.startsWith(SCHEME); 24 | } 25 | 26 | @Override 27 | public Pojo findById(String id) { 28 | return new TagDummyPojo(id); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /docs/_posts/2018-02-24-freeze-history.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Freeze history feature 3 | categories: 4 | - Favorites 5 | description: "How to freeze history in order to display more favorites" 6 | type: Document 7 | --- 8 | 9 | KISS can display up to 5 favorites. If this is not enough for you, there is a way to freeze the history to always display the same results when you open KISS. 10 | 11 | The best way to use this feature is to reset all your history to start from a clean slate (`⋮, KISS Settings, History settings, Reset history`). 12 | 13 | > Make sure Minimalistic UI is turned off (`⋮, KISS Settings, User Experience, Minimalistic UI`). 14 | 15 | Then, search for everything that you want to see in your history. 16 | 17 | When you're ready, go back to the settings and Freeze history (`⋮, KISS Settings, History Settings, Freeze history`). 18 | 19 | From now on, the history list will always look the same as what it is *now*. 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dialpad_24px.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/preference/NotificationPreference.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.preference; 2 | 3 | import android.content.Context; 4 | import android.content.DialogInterface; 5 | import android.content.Intent; 6 | import android.preference.DialogPreference; 7 | import android.util.AttributeSet; 8 | 9 | public class NotificationPreference extends DialogPreference { 10 | private static final String ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"; 11 | 12 | public NotificationPreference(Context context, AttributeSet attrs) { 13 | super(context, attrs); 14 | } 15 | 16 | @Override 17 | public void onClick(DialogInterface dialog, int which) { 18 | super.onClick(dialog, which); 19 | if (which == DialogInterface.BUTTON_POSITIVE) { 20 | getContext().startActivity(new Intent(ACTION_NOTIFICATION_LISTENER_SETTINGS)); 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/popup_in_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | 19 | 20 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/anim/popup_in_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | 19 | 20 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/popup_title.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 13 | 14 | 23 | 24 | -------------------------------------------------------------------------------- /docs/_posts/2018-02-17-add-nickname-for-contact.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: How to add an alias to a contact? 3 | categories: 4 | - Contacts 5 | description: "How to find contact based on an alias in addition to their name" 6 | type: Document 7 | --- 8 | 9 | Sometimes, you may want to find a contact based on an alias, not on their name (a pseudonym, or simply "boss" or "mom"). 10 | 11 | To do that, find the contact for which you need to set an alias. Click on the contact image on the left. 12 | 13 | This will open the system contact app. Click on edit, then find "more fields", and select "Nickname". Add the alias you wish to use. 14 | 15 | ![Updating contact nickname](/screenshots/contact-alias-edit.png) 16 | 17 | You'll now be able to find this contact by alias: 18 | 19 | ![Example contact alias](/screenshots/contact-alias.png) 20 | 21 | > On some older phones, you'll need to restart KISS for the change to be visible: `⋮, KISS Settings, Advanced Settings, Restart KISS`. 22 | -------------------------------------------------------------------------------- /docs/_posts/2018-02-14-can-t-see-just-installed-apps.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: The app I just installed does not appear in KISS! 3 | categories: 4 | - Bugs 5 | description: "What to do when an app is missing in KISS list" 6 | type: Document 7 | --- 8 | 9 | When you install a new app, KISS relies on the device to be notified that the app list has changed. 10 | 11 | Sadly, some devices don't broadcast this change properly, and you'll have to manually restart KISS to pick up the change. You can do so by going to `⋮, KISS Settings, Advanced settings, Restart KISS`. 12 | 13 | > Please note that some apps don't provide a "launcher intent", which means they can't be opened from the launcher. This typically includes themes, assistant apps, alternative lock screens or Watch Faces. 14 | 15 | If the app still doesn't appear, make sure you haven't excluded it previously. Visit `⋮, KISS Settings, History settings, View or edit your excluded apps` and make sure the new app isn't on the list. 16 | -------------------------------------------------------------------------------- /docs/_posts/2018-05-01-hibernate-apps.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: How to hibernate an app? 3 | categories: 4 | - Advanced 5 | description: "How to hibernate an app in KISS?" 6 | type: Document 7 | --- 8 | 9 | If *your phone is rooted*, you can enable an option to hibernate an app from KISS launcher. 10 | 11 | Hibernated app do not consume any battery or memory until you launch them again. 12 | 13 | 14 | Navigate to `⋮, KISS Settings, Advanced Settings`. Select `Root mode`. 15 | 16 | > If you get an error message saying "Unable to gain root privileges", your device is not rooted and you won't be able to hibernate apps. Check online how to root your device (this will depend on your model), then try again! 17 | 18 | Authorize KISS to get SuperUser rights. 19 | 20 | From now on, long press on any application. A new menu button will appear to let you hibernate the app. 21 | 22 | Opening the app removes the app from hibernation, you'll need to hibernate again if you want to suspend it after use. 23 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | ## For more details on how to configure your build environment visit 2 | # http://www.gradle.org/docs/current/userguide/build_environment.html 3 | # 4 | # Specifies the JVM arguments used for the daemon process. 5 | # The setting is particularly useful for tweaking memory settings. 6 | # Default value: -Xmx1024m -XX:MaxPermSize=256m 7 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 8 | # 9 | # When configured, Gradle will run in incubating parallel mode. 10 | # This option should only be used with decoupled projects. More details, visit 11 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 12 | # org.gradle.parallel=true 13 | #Thu Dec 31 13:34:43 EET 2020 14 | org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M" 15 | android.enableJetifier=true 16 | android.useAndroidX=true 17 | android.nonFinalResIds=false 18 | org.gradle.configuration-cache=true 19 | -------------------------------------------------------------------------------- /docs/_posts/2019-02-05-whatsapp-contacts.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: How to display WhatsApp contacts in KISS? 3 | categories: 4 | - Contacts 5 | description: "How to start a WhatsApp conversation from KISS?" 6 | type: Document 7 | --- 8 | 9 | Although KISS doesn't support WhatsApp natively, you can use a workaround to display some of your WhatsApp contact in KISS. 10 | 11 | > Note: since Android 7, you'll need to define KISS as your default launcher to be able to add WhatsApp contacts. 12 | 13 | Open WhatsApp, then select the contact or group that you want to see in KISS. 14 | 15 | Select the menu option `⋮`, then `More`, and finally click `Add Shortcut`. Within a couple seconds, you should see a gray toast at the bottom of your screen saying "Shortcut added to KISS". 16 | 17 | You can now search for this contact by entering its name in KISS as usual. There will be a small WhatsApp icon to remind you that the result will open in WhatsApp: 18 | 19 | ![WhatsApp example in KISS](/images/whatsapp.png) 20 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/pojo/PojoWithTags.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.pojo; 2 | 3 | import fr.neamar.kiss.normalizer.StringNormalizer; 4 | 5 | public class PojoWithTags extends Pojo { 6 | // tags normalized, for faster search 7 | private StringNormalizer.Result normalizedTags = null; 8 | // Tags assigned to this pojo 9 | private String tags = ""; 10 | 11 | public PojoWithTags(String id) { 12 | super(id); 13 | } 14 | 15 | public StringNormalizer.Result getNormalizedTags() { 16 | return normalizedTags; 17 | } 18 | 19 | public String getTags() { 20 | return tags; 21 | } 22 | 23 | public void setTags(String tags) { 24 | if (tags != null) { 25 | // Set the actual user-friendly name 26 | this.tags = tags; 27 | this.normalizedTags = StringNormalizer.normalizeWithResult(this.tags, false); 28 | } else { 29 | this.tags = null; 30 | this.normalizedTags = null; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /widgetpicker-dev/widget_picker_item.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | 4 |
5 | {% assign categories = site.categories | sort %} 6 | {% for category in categories %} 7 | {% assign name = category[0] %} 8 | {% assign posts = category[1] %} 9 | {% assign size = posts | size %} 10 |
11 |

12 | {{ name | replace: "-", " " }} 13 |

14 | 15 | 33 |
34 | {% endfor %} 35 |
36 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/dataprovider/simpleprovider/SimpleProvider.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.dataprovider.simpleprovider; 2 | 3 | import java.util.List; 4 | 5 | import fr.neamar.kiss.dataprovider.IProvider; 6 | import fr.neamar.kiss.pojo.Pojo; 7 | 8 | /** 9 | * Unlike normal providers, simple providers are not Android Services but classic Android class 10 | * Android Services are expensive to create, and use a lot of memory, 11 | * so whenever we can, we avoid using them. 12 | */ 13 | public abstract class SimpleProvider implements IProvider { 14 | @Override 15 | public void reload() { 16 | // Simple providers can't be reloaded 17 | } 18 | 19 | @Override 20 | public final boolean isLoaded() { 21 | return true; 22 | } 23 | 24 | @Override 25 | public boolean mayFindById(String id) { 26 | return false; 27 | } 28 | 29 | @Override 30 | public Pojo findById(String id) { 31 | return null; 32 | } 33 | 34 | @Override 35 | public List getPojos() { 36 | return null; 37 | } 38 | } -------------------------------------------------------------------------------- /docs/_sass/form.scss: -------------------------------------------------------------------------------- 1 | input[type="text"], input[type="email"] { 2 | display: block; 3 | width: 100%; 4 | font-size: 1.3em; 5 | padding: 10px; 6 | box-sizing: border-box; 7 | border-radius: 3px; 8 | border: 1px solid #ccc; 9 | } 10 | 11 | input[type="submit"] { 12 | background: #2f8cff; 13 | color: #fff; 14 | border: 0; 15 | padding: 9px 10px; 16 | font-size: 1em; 17 | margin-top: 9px; 18 | border-radius: 3px; 19 | width: 100%; 20 | cursor: pointer; 21 | } 22 | 23 | input { 24 | outline: none; 25 | } 26 | 27 | input[type=search] { 28 | -webkit-appearance: textfield; 29 | -webkit-box-sizing: content-box; 30 | font-size: 100%; 31 | } 32 | 33 | input::-webkit-search-decoration, 34 | input::-webkit-search-cancel-button { 35 | display: none; 36 | } 37 | 38 | 39 | input[type=search] { 40 | border: solid 1px #ccc; 41 | padding: 7px 14px 7px 32px; 42 | 43 | -webkit-border-radius: 3px; 44 | -moz-border-radius: 3px; 45 | border-radius: 3px; 46 | } 47 | 48 | 49 | input:-moz-placeholder { 50 | color: #ccc; 51 | } 52 | input::-webkit-input-placeholder { 53 | color: #ccc; 54 | } -------------------------------------------------------------------------------- /docs/search.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: Search 3 | sitemap: false 4 | --- 5 | 6 |

Loading results

7 |
    8 | 9 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/icons/IconPack.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.icons; 2 | 3 | import android.content.ComponentName; 4 | import android.content.Context; 5 | import android.content.pm.PackageManager; 6 | import android.graphics.drawable.Drawable; 7 | 8 | import androidx.annotation.NonNull; 9 | import androidx.annotation.Nullable; 10 | 11 | import java.util.Collection; 12 | 13 | import fr.neamar.kiss.utils.UserHandle; 14 | 15 | public interface IconPack { 16 | 17 | @NonNull 18 | String getPackPackageName(); 19 | 20 | void load(PackageManager packageManager); 21 | 22 | @Nullable 23 | Drawable getComponentDrawable(String componentName); 24 | 25 | @Nullable 26 | Drawable getComponentDrawable(@NonNull Context ctx, @NonNull ComponentName componentName, @NonNull UserHandle userHandle); 27 | 28 | @NonNull 29 | Drawable applyBackgroundAndMask(@NonNull Context ctx, @NonNull Drawable defaultBitmap, boolean fitInside); 30 | 31 | @Nullable 32 | Collection getDrawableList(); 33 | 34 | @Nullable 35 | Drawable getDrawable(@NonNull DrawableInfo drawableInfo); 36 | } -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/pojo/ShortcutPojo.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.pojo; 2 | 3 | public final class ShortcutPojo extends PojoWithTags { 4 | 5 | public static final String SCHEME = "shortcut://"; 6 | public static final String OREO_PREFIX = "oreo-shortcut/"; 7 | 8 | public final String packageName; 9 | public final String intentUri;// TODO: 15/10/18 Use boolean instead of prefix for Oreo shortcuts 10 | 11 | public ShortcutPojo(String id, String packageName, String intentUri) { 12 | super(id); 13 | 14 | this.packageName = packageName; 15 | this.intentUri = intentUri; 16 | } 17 | 18 | /** 19 | * Oreo shortcuts do not have a real intentUri, instead they have a shortcut id 20 | * and the Android system is responsible for safekeeping the Intent 21 | */ 22 | public boolean isOreoShortcut() { 23 | return intentUri.contains(ShortcutPojo.OREO_PREFIX); 24 | } 25 | 26 | public String getOreoId() { 27 | // Oreo shortcuts encode their id in the unused intentUri field 28 | return intentUri.replace(ShortcutPojo.OREO_PREFIX, ""); 29 | } 30 | } -------------------------------------------------------------------------------- /docs/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 CloudCannon 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/snapshotlayout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 14 | 15 | 21 | 22 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/preference/ResetExcludedFromHistoryAppsPreference.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.preference; 2 | 3 | import android.content.Context; 4 | import android.content.DialogInterface; 5 | import android.preference.DialogPreference; 6 | import android.preference.PreferenceManager; 7 | import android.util.AttributeSet; 8 | import android.widget.Toast; 9 | 10 | import java.util.HashSet; 11 | 12 | import fr.neamar.kiss.R; 13 | 14 | public class ResetExcludedFromHistoryAppsPreference extends DialogPreference { 15 | 16 | public ResetExcludedFromHistoryAppsPreference(Context context, AttributeSet attrs) { 17 | super(context, attrs); 18 | } 19 | 20 | @Override 21 | public void onClick(DialogInterface dialog, int which) { 22 | super.onClick(dialog, which); 23 | if (which == DialogInterface.BUTTON_POSITIVE) { 24 | PreferenceManager.getDefaultSharedPreferences(getContext()).edit() 25 | .putStringSet("excluded-apps-from-history", new HashSet()).apply(); 26 | Toast.makeText(getContext(), R.string.excluded_app_list_erased, Toast.LENGTH_LONG).show(); 27 | } 28 | 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/popup_widget.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 11 | 15 | 20 | 25 | -------------------------------------------------------------------------------- /widgetpicker-dev/widget_picker_item_title.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 18 | 19 | 26 | 27 | -------------------------------------------------------------------------------- /docs/_posts/2018-05-27-use-tag-bar.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: How to group apps by folder? 3 | categories: 4 | - Tags 5 | description: "How to use the tag bar to easily view all apps in a given category?" 6 | type: Document 7 | --- 8 | 9 | You can configure KISS to display all apps in a given tag. 10 | 11 | For instance, this is all apps on my device tagged with *Google*: 12 | 13 | ![All apps tagged Google](/screenshots/tag-bar-display.png) 14 | 15 | This feature is disabled by default. 16 | 17 | To turn it on, navigate to `⋮, KISS Settings, User Experience, Customize tags bar`. Toggle `Enable tags menu` on. 18 | 19 | Then, select `Tags to show on bar` and check all the tags you want to be able to filter on: 20 | 21 | ![All apps tagged Google](/screenshots/tag-bar-configure.png) 22 | 23 | > You can't select more than 5 tags. If you do, only 5 tags will be displayed in the menu. 24 | 25 | When you go back to KISS, the next time you press `⋮`, the default menu will be replaced with the list of tags you selected, and a `KISS Menu` option to display the default menu: 26 | 27 | ![All apps tagged Google](/screenshots/tag-bar-select.png) 28 | 29 | Select any tag in the menu to display all matching apps and shortcuts. 30 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/normalizer/PhoneNormalizer.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.normalizer; 2 | 3 | public class PhoneNormalizer { 4 | public static StringNormalizer.Result simplifyPhoneNumber(String phoneNumber) { 5 | // This is done manually for performance reason, 6 | // But the algorithm is just a regexp replacement of "[-.():/ ]" with "" 7 | 8 | int numCodePoints = Character.codePointCount(phoneNumber, 0, phoneNumber.length()); 9 | IntSequenceBuilder codePoints = new IntSequenceBuilder(numCodePoints); 10 | IntSequenceBuilder resultMap = new IntSequenceBuilder(numCodePoints); 11 | 12 | int i = 0; 13 | for (int iterCodePoint = 0; iterCodePoint < numCodePoints; iterCodePoint += 1) { 14 | int c = Character.codePointAt(phoneNumber, i); 15 | 16 | if (c != ' ' && c != '-' && c != '.' && c != '(' && c != ')' && c != ':' && c != '/') { 17 | codePoints.add(c); 18 | resultMap.add(i); 19 | } 20 | i += Character.charCount(c); 21 | } 22 | 23 | return new StringNormalizer.Result(phoneNumber.length(), codePoints.toArray(), resultMap.toArray()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/preference/ResetFavoritesPreference.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.preference; 2 | 3 | import android.content.Context; 4 | import android.content.DialogInterface; 5 | import android.preference.DialogPreference; 6 | import android.preference.PreferenceManager; 7 | import android.util.AttributeSet; 8 | import android.widget.Toast; 9 | 10 | import fr.neamar.kiss.KissApplication; 11 | import fr.neamar.kiss.R; 12 | 13 | public class ResetFavoritesPreference extends DialogPreference { 14 | 15 | public ResetFavoritesPreference(Context context, AttributeSet attrs) { 16 | super(context, attrs); 17 | } 18 | 19 | @Override 20 | public void onClick(DialogInterface dialog, int which) { 21 | super.onClick(dialog, which); 22 | if (which == DialogInterface.BUTTON_POSITIVE) { 23 | PreferenceManager.getDefaultSharedPreferences(getContext()).edit() 24 | .putString("favorite-apps-list", "").apply(); 25 | KissApplication.getApplication(getContext()).getDataHandler().getAppProvider().reload(); 26 | Toast.makeText(getContext(), R.string.favorites_erased, Toast.LENGTH_LONG).show(); 27 | } 28 | 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /docs/_posts/2018-02-11-add-a-widget.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: How to add a widget? 3 | categories: 4 | - Widgets 5 | description: "Customize your KISS launcher with a widget on the home screen." 6 | type: Document 7 | --- 8 | 9 | KISS only supports widget in `Minimalistic UI`. 10 | 11 | ## Enable `Minimalistic UI` 12 | 13 | From the settings, enable `Minimalistic UI` (`⋮, KISS Settings, User experience`, enable `Minimalistic UI`). 14 | 15 | While you're there, you may want to enable some other settings in the `Minimalistic UI` section to make sure you're happy with the end result! 16 | 17 | Go back to KISS by pressing the Home button on your device. 18 | 19 | ## Add a widget 20 | Press the three-dots menu again `⋮`. You should now see a new option in the contextual menu, "Add widget": 21 | 22 | ![Context menu: Enable Widget](/screenshots/widget-context-menu.png) 23 | 24 | From there, pick a widget, and the widget will appear on top of an empty search bar. 25 | 26 | ![Context menu: Enable Widget](/screenshots/example-widget.png) 27 | 28 | To remove the widget, press `⋮` again and select "Remove widget". 29 | 30 | ## Limitations 31 | Currently, the widget feature: 32 | 33 | * Does not allow resizing 34 | * Does not allow multiple widgets 35 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/preference/ResetShortcutsPreference.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.preference; 2 | 3 | import android.content.Context; 4 | import android.content.DialogInterface; 5 | import android.os.Build; 6 | import android.preference.DialogPreference; 7 | import android.util.AttributeSet; 8 | import android.widget.Toast; 9 | 10 | import fr.neamar.kiss.R; 11 | import fr.neamar.kiss.utils.ShortcutUtil; 12 | 13 | public class ResetShortcutsPreference extends DialogPreference { 14 | 15 | public ResetShortcutsPreference(Context context, AttributeSet attrs) { 16 | super(context, attrs); 17 | } 18 | 19 | @Override 20 | public void onClick(DialogInterface dialog, int which) { 21 | super.onClick(dialog, which); 22 | if (which == DialogInterface.BUTTON_POSITIVE && 23 | android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 24 | 25 | // Remove all shortcuts 26 | ShortcutUtil.removeAllShortcuts(getContext()); 27 | 28 | // Build all shortcuts 29 | ShortcutUtil.addAllShortcuts(getContext()); 30 | 31 | Toast.makeText(getContext(), R.string.regenerate_shortcuts_done, Toast.LENGTH_LONG).show(); 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/loader/LoadPojos.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.loader; 2 | 3 | import android.content.Context; 4 | import android.os.AsyncTask; 5 | 6 | import java.lang.ref.WeakReference; 7 | import java.util.ArrayList; 8 | 9 | import fr.neamar.kiss.dataprovider.Provider; 10 | import fr.neamar.kiss.pojo.Pojo; 11 | 12 | public abstract class LoadPojos extends AsyncTask> { 13 | 14 | public final WeakReference context; 15 | public String pojoScheme = "(none)://"; 16 | private WeakReference> provider; 17 | 18 | public LoadPojos(Context context, String pojoScheme) { 19 | super(); 20 | this.context = new WeakReference<>(context); 21 | this.pojoScheme = pojoScheme; 22 | } 23 | 24 | public void setProvider(Provider provider) { 25 | this.provider = new WeakReference<>(provider); 26 | } 27 | 28 | public String getPojoScheme() { 29 | return pojoScheme; 30 | } 31 | 32 | @Override 33 | protected void onPostExecute(ArrayList result) { 34 | super.onPostExecute(result); 35 | if(provider != null && provider.get() != null) { 36 | provider.get().loadOver(result); 37 | } 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/fi/zmengames/zen/ZenAdmin.java: -------------------------------------------------------------------------------- 1 | package fi.zmengames.zen; 2 | 3 | 4 | import android.app.admin.DeviceAdminReceiver; 5 | import android.content.Context; 6 | import android.content.Intent; 7 | import android.content.SharedPreferences; 8 | import android.preference.PreferenceManager; 9 | import android.widget.Toast; 10 | 11 | import fr.neamar.kiss.R; 12 | 13 | 14 | public class ZenAdmin extends DeviceAdminReceiver { 15 | 16 | @Override 17 | public void onEnabled(Context context, Intent intent) { 18 | SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 19 | prefs.edit().putBoolean("device-admin-permission", true).commit(); 20 | Toast.makeText(context, context.getString(R.string.device_admin_enabled), Toast.LENGTH_SHORT).show(); 21 | } 22 | 23 | @Override 24 | public void onDisabled(Context context, Intent intent) { 25 | SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 26 | prefs.edit().putBoolean("device-admin-permission", false).commit(); 27 | prefs.edit().putBoolean("proximity-switch-lock", false).commit(); 28 | Toast.makeText(context, context.getString(R.string.device_admin_disabled), Toast.LENGTH_SHORT).show(); 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/dialog_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 | 23 | 24 | 25 | 26 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /docs/_sass/modal.scss: -------------------------------------------------------------------------------- 1 | .modalDialog { 2 | position: fixed; 3 | top: 0; 4 | right: 0; 5 | bottom: 0; 6 | left: 0; 7 | background: rgba(0,0,0,0.6); 8 | z-index: 99999; 9 | opacity:0; 10 | -webkit-transition: opacity 200ms ease-in; 11 | -moz-transition: opacity 200ms ease-in; 12 | transition: opacity 200ms ease-in; 13 | pointer-events: none; 14 | 15 | &.show { 16 | opacity:1; 17 | pointer-events: auto; 18 | } 19 | 20 | & > div { 21 | max-width: 600px; 22 | position: relative; 23 | margin: 10% auto; 24 | padding: 130px 40px 40px; 25 | border-radius: 3px; 26 | background: #fff; 27 | box-sizing: border-box; 28 | } 29 | 30 | h2 { 31 | font-weight: bold; 32 | position: absolute; 33 | top: 0; 34 | left: 0; 35 | padding: 0 40px; 36 | line-height: 100px; 37 | width: 100%; 38 | box-sizing: border-box; 39 | background: #eee; 40 | border-radius: 2px 2px 0 0; 41 | } 42 | 43 | p { 44 | font-size: .9em; 45 | line-height: 1.3em; 46 | margin: 0 0 20px 0; 47 | } 48 | 49 | input[type="email"] { 50 | font-size: 1em; 51 | } 52 | 53 | .close { 54 | position: absolute; 55 | top: 33px; 56 | right: 35px; 57 | font-size: 1.5em; 58 | width: 25px; 59 | height: 25px; 60 | cursor: pointer; 61 | z-index: 99; 62 | font-size: 30px; 63 | } 64 | } -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/preference/ResetExcludedAppsPreference.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.preference; 2 | 3 | import android.content.Context; 4 | import android.content.DialogInterface; 5 | import android.preference.DialogPreference; 6 | import android.preference.PreferenceManager; 7 | import android.util.AttributeSet; 8 | import android.widget.Toast; 9 | 10 | import java.util.HashSet; 11 | 12 | import fr.neamar.kiss.KissApplication; 13 | import fr.neamar.kiss.R; 14 | 15 | public class ResetExcludedAppsPreference extends DialogPreference { 16 | 17 | public ResetExcludedAppsPreference(Context context, AttributeSet attrs) { 18 | super(context, attrs); 19 | } 20 | 21 | @Override 22 | public void onClick(DialogInterface dialog, int which) { 23 | super.onClick(dialog, which); 24 | if (which == DialogInterface.BUTTON_POSITIVE) { 25 | PreferenceManager.getDefaultSharedPreferences(getContext()).edit() 26 | .putStringSet("excluded-apps", new HashSet()).apply(); 27 | KissApplication.getApplication(getContext()).getDataHandler().getAppProvider().reload(); 28 | Toast.makeText(getContext(), R.string.excluded_app_list_erased, Toast.LENGTH_LONG).show(); 29 | } 30 | 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/pojo/SearchPojo.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.pojo; 2 | 3 | public class SearchPojo extends Pojo { 4 | public static final int SEARCH_QUERY = 0; 5 | public static final int URL_QUERY = 1; 6 | public static final int CALCULATOR_QUERY = 2; 7 | public static final int ZEN_QUERY = 3; 8 | public static final int ZEN_ALARM = 4; 9 | public static final int ZEN_ADD_LINK = 5; 10 | public static final int ZEN_EMAIL = 6; 11 | 12 | public String query = ""; 13 | public String url = ""; 14 | public int type = SEARCH_QUERY; 15 | 16 | public SearchPojo(String query, String url, int type) { 17 | this(DEFAULT_ID, query, url, type); 18 | } 19 | 20 | public SearchPojo(String id, String query, String url, int type) { 21 | super(id); 22 | 23 | if(type != SEARCH_QUERY 24 | && type != URL_QUERY 25 | && type != CALCULATOR_QUERY 26 | && type != ZEN_QUERY 27 | && type != ZEN_ALARM 28 | && type != ZEN_ADD_LINK 29 | && type != ZEN_EMAIL) { 30 | throw new IllegalArgumentException("Wrong type!"); 31 | } 32 | 33 | this.query = query; 34 | this.url = url; 35 | this.type = type; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/pojo/SettingsPojo.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.pojo; 2 | 3 | 4 | import androidx.annotation.DrawableRes; 5 | 6 | public class SettingsPojo extends Pojo { 7 | public final String settingName; 8 | public final String packageName; 9 | public final @DrawableRes 10 | int icon; 11 | 12 | public SettingsPojo(String id, String settingName, @DrawableRes int icon) { 13 | super(id); 14 | 15 | this.settingName = settingName; 16 | this.packageName = ""; 17 | this.icon = icon; 18 | } 19 | 20 | public SettingsPojo(String id, String settingName, String packageName, @DrawableRes int icon) { 21 | super(id); 22 | 23 | this.settingName = settingName; 24 | this.packageName = packageName; 25 | this.icon = icon; 26 | } 27 | @Override 28 | @SuppressWarnings("EqualsHashCode") 29 | public boolean equals (Object object) { 30 | boolean result = false; 31 | if (object == null || object.getClass() != getClass()) { 32 | } else { 33 | SettingsPojo settingsPojo = (SettingsPojo) object; 34 | if (this.id.hashCode() == (settingsPojo.id.hashCode())) { 35 | result = true; 36 | } 37 | } 38 | return result; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/fi/zmengames/zen/ZenPojo.java: -------------------------------------------------------------------------------- 1 | package fi.zmengames.zen; 2 | 3 | 4 | import androidx.annotation.DrawableRes; 5 | 6 | import fr.neamar.kiss.pojo.Pojo; 7 | 8 | public class ZenPojo extends Pojo { 9 | public final String settingName; 10 | public final String packageName; 11 | public final @DrawableRes 12 | int icon; 13 | 14 | public ZenPojo(String id, String settingName, @DrawableRes int icon) { 15 | super(id); 16 | 17 | this.settingName = settingName; 18 | this.packageName = ""; 19 | this.icon = icon; 20 | } 21 | 22 | public ZenPojo(String id, String settingName, String packageName, @DrawableRes int icon) { 23 | super(id); 24 | 25 | this.settingName = settingName; 26 | this.packageName = packageName; 27 | this.icon = icon; 28 | } 29 | @Override 30 | @SuppressWarnings("EqualsHashCode") 31 | public boolean equals (Object object) { 32 | boolean result = false; 33 | if (object == null || object.getClass() != getClass()) { 34 | } else { 35 | ZenPojo settingsPojo = (ZenPojo) object; 36 | if (this.id.hashCode() == (settingsPojo.id.hashCode())) { 37 | result = true; 38 | } 39 | } 40 | return result; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/broadcast/LocaleChangedReceiver.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.broadcast; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | 7 | import fr.neamar.kiss.KissApplication; 8 | import fr.neamar.kiss.dataprovider.AppProvider; 9 | 10 | public class LocaleChangedReceiver extends BroadcastReceiver { 11 | 12 | @Override 13 | public void onReceive(Context ctx, Intent intent) { 14 | // Only handle system broadcasts 15 | if (!"android.intent.action.LOCALE_CHANGED".equals(intent.getAction())) { 16 | return; 17 | } 18 | 19 | try { 20 | // If new locale, then reset tags to load the correct aliases 21 | KissApplication.getApplication(ctx).getDataHandler().resetTagsHandler(); 22 | } 23 | catch(IllegalStateException e) { 24 | // Since Android 8.1, we're not allowed to create a new service 25 | // when the app is not running 26 | e.printStackTrace(); 27 | } 28 | // Reload application list 29 | final AppProvider provider = KissApplication.getApplication(ctx).getDataHandler().getAppProvider(); 30 | if (provider != null) { 31 | provider.reload(); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/ui/ShapedContactBadge.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.ui; 2 | 3 | import android.content.Context; 4 | import android.graphics.drawable.Drawable; 5 | import android.util.AttributeSet; 6 | import android.widget.QuickContactBadge; 7 | 8 | import androidx.annotation.NonNull; 9 | import androidx.annotation.Nullable; 10 | 11 | import fr.neamar.kiss.KissApplication; 12 | 13 | public class ShapedContactBadge extends QuickContactBadge { 14 | 15 | public ShapedContactBadge(Context context) { 16 | super(context); 17 | } 18 | 19 | public ShapedContactBadge(Context context, AttributeSet attrs) { 20 | super(context, attrs); 21 | } 22 | 23 | public ShapedContactBadge(Context context, AttributeSet attrs, int defStyle) { 24 | super(context, attrs, defStyle); 25 | } 26 | 27 | @Override 28 | public void setImageDrawable(@Nullable Drawable drawable) { 29 | if (drawable != null) { 30 | drawable = getShapedDrawable(getContext(), drawable); 31 | } 32 | super.setImageDrawable(drawable); 33 | } 34 | 35 | public static Drawable getShapedDrawable(@NonNull Context context, @NonNull Drawable drawable) { 36 | return KissApplication.getApplication(context).getIconsHandler().applyContactMask(context, drawable); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/utils/Base64Serialize.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.utils; 2 | 3 | import android.util.Base64; 4 | import android.util.Log; 5 | 6 | import java.io.ByteArrayInputStream; 7 | import java.io.ByteArrayOutputStream; 8 | import java.io.ObjectInputStream; 9 | import java.io.ObjectOutputStream; 10 | 11 | public class Base64Serialize { 12 | public static String encode(Object... args) { 13 | try { 14 | ByteArrayOutputStream bo = new ByteArrayOutputStream(); 15 | ObjectOutputStream so = new ObjectOutputStream(bo); 16 | so.writeObject(args); 17 | so.flush(); 18 | return new String(Base64.encode(bo.toByteArray(), Base64.NO_WRAP)); 19 | } catch (Exception e) { 20 | Log.e("Serialize", "encode", e); 21 | } 22 | return null; 23 | } 24 | 25 | public static Object[] decode(String text) { 26 | try { 27 | byte[] b = Base64.decode(text.getBytes(), Base64.NO_WRAP); 28 | ByteArrayInputStream bi = new ByteArrayInputStream(b); 29 | ObjectInputStream si = new ObjectInputStream(bi); 30 | return (Object[])si.readObject(); 31 | } catch (Exception e) { 32 | Log.e("Serialize", "decode", e); 33 | } 34 | return null; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/widget_picker_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 17 | 18 | 27 | 28 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/favorite_tag.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 22 | 23 | 24 | 34 | 35 | -------------------------------------------------------------------------------- /docs/_posts/2018-02-14-can-t-see-a-contact.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: One of my contacts does not appear in KISS 3 | categories: 4 | - UI 5 | description: "What to do when a contact is not listed in KISS" 6 | type: Document 7 | --- 8 | 9 | You may notice that some of your contacts are missing, even though you can see them fine in the default *Contacts* app. 10 | 11 | There can be multiple reasons for this: 12 | 13 | ### Contact was just added or edited 14 | Some devices don't notify properly when the contact database is updated. You'll need to manually restart KISS, which will force a synchronisation with the contact database: `⋮, KISS Settings, Advanced settings, Restart KISS`. 15 | 16 | ### Contact doesn't have a phone number 17 | Contacts without a phone number are not displayed in KISS, as KISS only provides tooling for phone and messages. 18 | 19 | To access this contact, you'll need to search in KISS for "Contacts" and open the system app. 20 | 21 | ### Contact isn't part of your personal contact list 22 | This will happen if your company uses Google Apps. The company directory will appear in contacts, but it isn't downloaded locally to the phone. As KISS doesn't have permission to access the Internet, it won't be able to display those contacts. 23 | 24 | To fix this, you can open one of the missing contacts in the *Contacts* app and click on the "+" icon to add the contact to one of your local accounts. 25 | -------------------------------------------------------------------------------- /app/src/main/java/fi/zmengames/zen/ShowHistoryButtonSwitch.java: -------------------------------------------------------------------------------- 1 | package fi.zmengames.zen; 2 | 3 | 4 | import static fi.zmengames.zen.ZEvent.State.HIDE_HISTORYBUTTON; 5 | import static fi.zmengames.zen.ZEvent.State.SHOW_HISTORYBUTTON; 6 | 7 | import android.content.Context; 8 | import android.content.SharedPreferences; 9 | import android.preference.PreferenceManager; 10 | import android.util.AttributeSet; 11 | import android.util.Log; 12 | import android.view.View; 13 | 14 | import org.greenrobot.eventbus.EventBus; 15 | 16 | import fr.neamar.kiss.BuildConfig; 17 | import fr.neamar.kiss.SwitchPreference; 18 | 19 | public class ShowHistoryButtonSwitch extends SwitchPreference{ 20 | 21 | public ShowHistoryButtonSwitch(Context context) { 22 | super(context); 23 | } 24 | public ShowHistoryButtonSwitch(Context context, AttributeSet attrs) { 25 | this(context, attrs, android.R.attr.switchPreferenceStyle); 26 | 27 | } 28 | 29 | public ShowHistoryButtonSwitch(Context context, AttributeSet attrs, int defStyle) { 30 | super(context, attrs, defStyle); 31 | } 32 | 33 | @Override 34 | protected void onClick() { 35 | if (!isChecked()) { 36 | EventBus.getDefault().postSticky(new ZEvent(SHOW_HISTORYBUTTON)); 37 | } else { 38 | EventBus.getDefault().postSticky(new ZEvent(HIDE_HISTORYBUTTON)); 39 | } 40 | super.onClick(); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/preference/ResetSearchProvidersPreference.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.preference; 2 | 3 | import android.content.Context; 4 | import android.content.DialogInterface; 5 | import android.preference.DialogPreference; 6 | import android.preference.PreferenceManager; 7 | import android.util.AttributeSet; 8 | import android.widget.Toast; 9 | 10 | import fr.neamar.kiss.KissApplication; 11 | import fr.neamar.kiss.R; 12 | import fr.neamar.kiss.dataprovider.SearchProvider; 13 | 14 | public class ResetSearchProvidersPreference extends DialogPreference { 15 | 16 | public ResetSearchProvidersPreference(Context context, AttributeSet attrs) { 17 | super(context, attrs); 18 | } 19 | 20 | @Override 21 | public void onClick(DialogInterface dialog, int which) { 22 | super.onClick(dialog, which); 23 | if (which == DialogInterface.BUTTON_POSITIVE) { 24 | PreferenceManager.getDefaultSharedPreferences(getContext()).edit() 25 | .remove("available-search-providers").apply(); 26 | Toast.makeText(getContext(), R.string.search_provider_reset_done_desc, Toast.LENGTH_LONG).show(); 27 | SearchProvider searchProvider = KissApplication.getApplication(getContext()).getDataHandler().getSearchProvider(); 28 | if (searchProvider != null) { 29 | searchProvider.reload(); 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/res/layout/color_picker_swatch.xml: -------------------------------------------------------------------------------- 1 | 15 | 16 | 17 | 22 | 23 | 31 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # KISS documentation 2 | This folder contains the documentation website used to generate http://help.kisslauncher.com. 3 | 4 | 5 | ## Credits 6 | This website was generated from https://github.com/CloudCannon/base-jekyll-template, who were kind enough to open-source a documentation platform. 7 | 8 | ## Develop 9 | The website is built with [Jekyll](http://jekyllrb.com/). 10 | 11 | Install the dependencies with [Bundler](http://bundler.io/): 12 | 13 | ~~~bash 14 | $ bundle install 15 | ~~~ 16 | 17 | Run `jekyll` commands through Bundler to ensure you're using the right versions: 18 | 19 | ~~~bash 20 | $ bundle exec jekyll serve 21 | ~~~ 22 | 23 | ## Editing 24 | 25 | ### Posts 26 | 27 | * Add, update or remove a post in the *Posts* collection. 28 | * The tutorials page is organised by categories. 29 | * Change the defaults when new posts are created in `_posts/_defaults.md`. 30 | 31 | ### Post Series 32 | To create a new series: 33 | 34 | * Add a new document to the `sets` collection. 35 | * Set the `title` and `description`. 36 | 37 | To add a tutorial/post to a series: 38 | * Add a `set` field to the tutorial front matter which points to the file name of the desired set without the `.md` extention. e.g. If I have a set at `_sets/getting-started.md` I would use this in my tutorial front matter: `set: getting-started`. 39 | * Add a `set_order` field to the tutorial front matter and specify a number. This is the tutorials order in the set. 40 | -------------------------------------------------------------------------------- /docs/_posts/2018-03-25-gestures.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: How to use gestures? 3 | categories: 4 | - Advanced 5 | description: "How to use gestures in KISS?" 6 | type: Document 7 | --- 8 | 9 | Gesture support is enabled by default in KISS, but can be hard to access if you're not using minimalistic mode. 10 | 11 | ## Supported gestures 12 | KISS currently supports two gestures: 13 | 14 | * On the wallpaper, scroll up to display the keyboard (start touch event on wallpaper and finish touch event on wallpaper) 15 | * On the wallpaper, scroll down to display notifications 16 | 17 | ## Gestures in minimalistic mode 18 | That's the easiest way to use gestures. Simply swipe up or down on the large wallpaper (red rectangle): 19 | 20 | ![Gestures on minimalistic mode in KISS](/screenshots/gestures-minimalistic.png) 21 | 22 | To turn on minimalistic mode, go to `⋮, KISS Settings, User Experience, Minimalistic UI`. 23 | 24 | Note that in this mode, a third gesture can be supported if you enable `⋮, KISS Settings, User Experience, Show history on touch`: in this case, simply touching (not swiping) the wallpaper will display the history. 25 | 26 | ## Gestures not in minimalistic mode 27 | If you're not using minimalistic, gestures are still supported but are harder to access, as you need to swipe up or down on the very thin margin between the list and the side of your screen (red rectangles): 28 | 29 | ![Gestures on non-minimalistic mode in KISS](/screenshots/gestures-non-minimalistic.png) 30 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/ui/BlockableListView.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.ui; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.MotionEvent; 6 | import android.widget.ListView; 7 | 8 | /** 9 | * ListView subclass that provides an interface for (temporarily) blocking all of it's input events 10 | */ 11 | public class BlockableListView extends ListView { 12 | private boolean touchEventsBlocked = false; 13 | 14 | public BlockableListView(Context context) { 15 | super(context); 16 | } 17 | 18 | public BlockableListView(Context context, AttributeSet attrs) { 19 | super(context, attrs); 20 | } 21 | 22 | public BlockableListView(Context context, AttributeSet attrs, int defStyleAttr) { 23 | super(context, attrs, defStyleAttr); 24 | } 25 | 26 | /** 27 | * Prevent this ListView from receiving any new touch events 28 | *

    29 | * Use {@link #unblockTouchEvents()} to end the blockage. 30 | */ 31 | public void blockTouchEvents() { 32 | this.touchEventsBlocked = true; 33 | } 34 | 35 | /** 36 | * Stop preventing this ListView from receiving touch events 37 | */ 38 | public void unblockTouchEvents() { 39 | this.touchEventsBlocked = false; 40 | } 41 | 42 | @Override 43 | public boolean onTouchEvent(MotionEvent ev) { 44 | return this.touchEventsBlocked || super.onTouchEvent(ev); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/res/layout/custom_icon_quick.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 22 | 23 | 36 | 37 | -------------------------------------------------------------------------------- /docs/_posts/2018-02-17-how-to-hide-certain-phone-numbers.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: How to only display one phone number per contact? 3 | categories: 4 | - Contacts 5 | description: "Not interested in landline phone numbers?" 6 | type: Document 7 | --- 8 | 9 | When one of your contacts has multiple phone numbers, KISS will display all of them separately, assuming you might want to call or message your contact over one of those phone numbers. 10 | 11 | However, for most contacts, you'll often end up using the same number. 12 | 13 | You can ask KISS to only display one phone number for a given contact. 14 | 15 | Let's take an example. Here is a contact with three phone numbers: 16 | 17 | ![Multiple phone numbers](/screenshots/contact-multiple-phone-numbers.png) 18 | 19 | To only display one phone number, we'll use the system feature of "default phone". Touch the contact picture, then long press the number you wish to use and select "Set default". 20 | 21 | ![Set default phone number](/screenshots/contact-set-default-phone-number.png) 22 | 23 | From now on, only this phone number will be displayed for this contact. 24 | 25 | ![Default phone number](/screenshots/contact-multiple-default-phone-number.png) 26 | 27 | > On some older phones, you'll need to restart KISS for the change to be visible: `⋮, KISS Settings, Advanced settings, Restart KISS`. 28 | 29 | To revert the change, view your contact again, long press the default phone number and select "Clear default". All phones numbers will be displayed again. 30 | -------------------------------------------------------------------------------- /app/src/main/java/fi/zmengames/zen/ParcelableUtil.java: -------------------------------------------------------------------------------- 1 | package fi.zmengames.zen; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | /** 7 | * How to use 8 | * - Make a simple object (POJO) 9 | * - Create a parcelable in ONE CLICK! http://devk.it/proj/parcelabler/ 10 | * - Convert to pojo <-> byte[] 11 | * 12 | * Example 13 | * MyParcelable happy = new MyParcelable(); 14 | * byte[] toByte = ParcelableUtil.marshall(happy); 15 | * // Save to DB? Send via socket? 16 | * // ... 17 | * // Restore from DB? 18 | * byte[] fromByte = cursor.getBlob(c); 19 | * MyParcelable happy = ParcelableUtil.unmarshall(fromByte, MyParcelable.CREATOR); 20 | */ 21 | public class ParcelableUtil { 22 | public static byte[] marshall(Parcelable parceable) { 23 | Parcel parcel = Parcel.obtain(); 24 | parceable.writeToParcel(parcel, 0); 25 | byte[] bytes = parcel.marshall(); 26 | parcel.recycle(); // not sure if needed or a good idea 27 | return bytes; 28 | } 29 | 30 | public static T unmarshall(byte[] bytes, Parcelable.Creator creator) { 31 | Parcel parcel = unmarshall(bytes); 32 | return creator.createFromParcel(parcel); 33 | } 34 | 35 | public static Parcel unmarshall(byte[] bytes) { 36 | Parcel parcel = Parcel.obtain(); 37 | parcel.unmarshall(bytes, 0, bytes.length); 38 | parcel.setDataPosition(0); // this is extremely important! 39 | return parcel; 40 | } 41 | } -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/searcher/UntaggedSearcher.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.searcher; 2 | 3 | import java.util.Iterator; 4 | import java.util.List; 5 | 6 | import fr.neamar.kiss.KissApplication; 7 | import fr.neamar.kiss.MainActivity; 8 | import fr.neamar.kiss.pojo.Pojo; 9 | import fr.neamar.kiss.pojo.PojoWithTags; 10 | 11 | public class UntaggedSearcher extends Searcher { 12 | 13 | public UntaggedSearcher(MainActivity activity ) 14 | { 15 | super( activity, "" ); 16 | } 17 | 18 | @Override 19 | protected Void doInBackground(Void... voids) { 20 | MainActivity activity = activityWeakReference.get(); 21 | if ( activity == null ) 22 | return null; 23 | List results = KissApplication.getApplication(activity).getDataHandler().getApplications(); 24 | if (results == null) 25 | return null; 26 | for(Iterator iterator = results.iterator(); iterator.hasNext(); ) { 27 | Pojo pojo = iterator.next(); 28 | if (!(pojo instanceof PojoWithTags)) { 29 | iterator.remove(); 30 | continue; 31 | } 32 | PojoWithTags pojoWithTags = (PojoWithTags) pojo; 33 | if (pojoWithTags.getTags() == null || pojoWithTags.getTags().isEmpty()) { 34 | continue; 35 | } 36 | iterator.remove(); 37 | } 38 | this.addResult(results.toArray(new Pojo[0])); 39 | return null; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_z.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | 7 | 9 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/history_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 17 | 32 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/preference/RootModePreference.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.preference; 2 | 3 | import android.app.AlertDialog; 4 | import android.content.Context; 5 | import android.content.DialogInterface; 6 | import android.content.DialogInterface.OnClickListener; 7 | import android.preference.CheckBoxPreference; 8 | import android.util.AttributeSet; 9 | 10 | import fr.neamar.kiss.KissApplication; 11 | import fr.neamar.kiss.R; 12 | 13 | class RootModePreference extends CheckBoxPreference { 14 | 15 | public RootModePreference(Context context, AttributeSet attrs) { 16 | super(context, attrs); 17 | } 18 | 19 | @Override 20 | protected void onClick() { 21 | if (!isChecked() && !KissApplication.getApplication(getContext()).getRootHandler().isRootAvailable()) { 22 | //show error dialog 23 | new AlertDialog.Builder(getContext()).setMessage(R.string.root_mode_error) 24 | .setPositiveButton(android.R.string.ok, new OnClickListener() { 25 | 26 | @Override 27 | public void onClick(DialogInterface dialog, int which) { 28 | // does nothing 29 | } 30 | }).show(); 31 | } else { 32 | super.onClick(); 33 | } 34 | 35 | try { 36 | KissApplication.getApplication(getContext()).resetRootHandler(getContext()); 37 | } catch (NullPointerException e) { 38 | // uninitialized roothandler. 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /docs/_posts/2018-02-11-pick-a-theme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: What are the themes available? 3 | categories: 4 | - UI 5 | description: "A quick description of available themes." 6 | type: Document 7 | --- 8 | 9 | KISS comes with 6 pre-defined themes: 10 | 11 | * Light theme, which is the theme enabled by default 12 | * Semi-transparent theme, a small deviation from the light theme which lets you see part of your wallpaper 13 | * Transparent theme, where you can completely see the wallpaper, but might have issues reading your app names on dark wallpapers 14 | * Dark theme, if you like vampires and low luminosity 15 | * Dark-semi-transparent theme, to dim your wallpaper 16 | * Dark transparent theme, for really light wallpapers 17 | 18 | Not all themes will work correctly with all wallpapers, make sure you pick a theme that you like, and that doesn't block legibility! 19 | 20 | To change your theme, click `⋮, KISS Settings, User interface, Theme interface`. 21 | 22 | Below is a preview of the built-in themes. 23 | 24 | ## Light theme 25 | ![Light theme](/screenshots/light-theme.png) 26 | 27 | ## Semi-transparent theme 28 | ![Semi-transparent theme](/screenshots/semi-transparent-theme.png) 29 | 30 | ## Transparent theme 31 | ![Transparent theme](/screenshots/transparent-theme.png) 32 | 33 | ## Dark theme 34 | ![Dark theme](/screenshots/dark-theme.png) 35 | 36 | ## Dark-semi-transparent theme 37 | ![Dark-semi-transparent theme](/screenshots/dark-semi-transparent-theme.png) 38 | 39 | ## Dark transparent theme 40 | ![Dark transparent theme](/screenshots/dark-transparent-theme.png) 41 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/preference/FreezeHistoryPreference.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.preference; 2 | 3 | import android.app.AlertDialog; 4 | import android.content.Context; 5 | import android.content.DialogInterface; 6 | import android.content.DialogInterface.OnClickListener; 7 | import android.preference.CheckBoxPreference; 8 | import android.util.AttributeSet; 9 | 10 | import fr.neamar.kiss.R; 11 | 12 | class FreezeHistoryPreference extends CheckBoxPreference { 13 | 14 | public FreezeHistoryPreference(Context context, AttributeSet attrs) { 15 | super(context, attrs); 16 | } 17 | 18 | @Override 19 | protected void onClick() { 20 | if (!isChecked()) { 21 | //show dialog 22 | new AlertDialog.Builder(getContext()).setMessage(R.string.freeze_history_warn) 23 | .setPositiveButton(android.R.string.ok, new OnClickListener() { 24 | 25 | @Override 26 | public void onClick(DialogInterface dialog, int which) { 27 | FreezeHistoryPreference.super.onClick(); 28 | } 29 | }) 30 | .setNegativeButton(android.R.string.cancel, new OnClickListener() { 31 | 32 | @Override 33 | public void onClick(DialogInterface dialog, int which) { 34 | // does nothing 35 | } 36 | }).show(); 37 | } else { 38 | super.onClick(); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/fi/zmengames/zen/VibrateOnAlarmSwitch.java: -------------------------------------------------------------------------------- 1 | package fi.zmengames.zen; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | import android.preference.PreferenceManager; 6 | import android.util.AttributeSet; 7 | import android.util.Log; 8 | import android.view.View; 9 | 10 | import fr.neamar.kiss.BuildConfig; 11 | import fr.neamar.kiss.SwitchPreference; 12 | 13 | public class VibrateOnAlarmSwitch extends SwitchPreference { 14 | public VibrateOnAlarmSwitch(Context context) { 15 | super(context); 16 | } 17 | public VibrateOnAlarmSwitch(Context context, AttributeSet attrs) { 18 | this(context, attrs, android.R.attr.switchPreferenceStyle); 19 | 20 | } 21 | public VibrateOnAlarmSwitch(Context context, AttributeSet attrs, int defStyle) { 22 | super(context, attrs, defStyle); 23 | 24 | } 25 | 26 | protected void onBindView(View view) { 27 | super.onBindView(view); 28 | } 29 | 30 | @Override 31 | protected void onClick() { 32 | if (BuildConfig.DEBUG) Log.v("VibrateOnAlarmSwitch", "onClick"); 33 | SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); 34 | if (isChecked()) { 35 | if (prefs.getBoolean("vibrate-on-alarm", false)) { 36 | enableVibrate(true); 37 | } 38 | } else { 39 | enableVibrate(false); 40 | } 41 | super.onClick 42 | (); 43 | } 44 | 45 | private void enableVibrate(boolean b) { 46 | } 47 | 48 | 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/preference/ResetPreference.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.preference; 2 | 3 | import android.content.Context; 4 | import android.content.DialogInterface; 5 | import android.content.SharedPreferences; 6 | import android.preference.DialogPreference; 7 | import android.preference.PreferenceManager; 8 | import android.util.AttributeSet; 9 | import android.widget.Toast; 10 | 11 | import fr.neamar.kiss.KissApplication; 12 | import fr.neamar.kiss.R; 13 | 14 | public class ResetPreference extends DialogPreference { 15 | 16 | public ResetPreference(Context context, AttributeSet attrs) { 17 | super(context, attrs); 18 | } 19 | 20 | @Override 21 | public void onClick(DialogInterface dialog, int which) { 22 | super.onClick(dialog, which); 23 | if (which == DialogInterface.BUTTON_POSITIVE) { 24 | KissApplication.getApplication(getContext()).getDataHandler().clearHistory(); 25 | 26 | // We'll have to redraw the list, so add a flag for MainActivity to restart 27 | SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getContext()).edit(); 28 | // SettingsActivity will have to restart (hides the summary with history count after reset) 29 | // Nothing to do for MainActivity, since updateSearchRecords() is called onResume(). 30 | editor.putBoolean("require-settings-update", true); 31 | editor.apply(); 32 | 33 | Toast.makeText(getContext(), R.string.history_erased, Toast.LENGTH_LONG).show(); 34 | } 35 | 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | jobs: 3 | build: 4 | working_directory: ~/code 5 | docker: 6 | - image: circleci/android:api-27-alpha 7 | environment: 8 | JVM_OPTS: -Xmx3200m 9 | steps: 10 | - checkout 11 | - restore_cache: 12 | key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} 13 | - run: 14 | name: Download Dependencies 15 | command: ./gradlew androidDependencies 16 | - save_cache: 17 | paths: 18 | - ~/.gradle 19 | key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} 20 | - run: 21 | name: Run Lint 22 | command: ./gradlew lint 23 | - store_artifacts: 24 | path: app/build/reports 25 | destination: reports 26 | - run: 27 | name: Generate debug APK 28 | command: ./gradlew assembleDebug assembleDebugAndroidTest 29 | - store_artifacts: 30 | path: app/build/outputs/apk/debug 31 | destination: debug-apk 32 | - run: 33 | name: Generate release APK 34 | command: ./gradlew assembleRelease 35 | - store_artifacts: 36 | path: app/build/outputs/apk/release 37 | destination: release-apk 38 | # - run: 39 | # name: Run tests on Firebase 40 | # command: gcloud firebase test android run --type instrumentation --app app/build/outputs/apk/debug/app-debug.apk --test app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk --device model=Nexus6,version=21,locale=en,orientation=portrait 41 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/java/fr/neamar/kiss/ui/SearchEditText.java: -------------------------------------------------------------------------------- 1 | package fr.neamar.kiss.ui; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.util.Log; 6 | import android.view.KeyEvent; 7 | import android.widget.EditText; 8 | 9 | import fr.neamar.kiss.BuildConfig; 10 | 11 | public class SearchEditText extends EditText { 12 | private static final String TAG = SearchEditText.class.getSimpleName(); 13 | private OnEditorActionListener mEditorListener; 14 | 15 | public SearchEditText(Context context) { 16 | super(context); 17 | } 18 | 19 | public SearchEditText(Context context, AttributeSet attrs) { 20 | super(context, attrs); 21 | } 22 | 23 | public SearchEditText(Context context, AttributeSet attrs, int defStyleAttr) { 24 | super(context, attrs, defStyleAttr); 25 | } 26 | 27 | @Override 28 | public void setOnEditorActionListener(OnEditorActionListener listener) { 29 | if (BuildConfig.DEBUG) Log.d(TAG, "setOnEditorActionListener"); 30 | mEditorListener = listener; 31 | super.setOnEditorActionListener(listener); 32 | } 33 | 34 | @Override 35 | public boolean onKeyPreIme(int keyCode, KeyEvent event) { 36 | if (BuildConfig.DEBUG) Log.d(TAG, "onKeyPreIme"); 37 | if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) 38 | if (mEditorListener != null && mEditorListener.onEditorAction(this, android.R.id.closeButton, event)) 39 | return true; 40 | return super.onKeyPreIme(keyCode, event); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #03DAC5 4 | #c3c3c3 5 | #dbdbdb 6 | #f8f8f8 7 | #525252 8 | #eaeaea 9 | #e0e0e0 10 | #303030 11 | #434343 12 | #88FFFFFF 13 | #99222222 14 | #884caf50 15 | #37474F 16 | #BBAA0000 17 | 18 | #3b5998 19 | #25d366 20 | #ffbd0400 21 | #ff757575 22 | #f0f0f0 23 | #930000 24 | #2e2e2e 25 | #eae8e8 26 | #6E6B6B 27 | #C2000E 28 | #000000 29 | #FF0000 30 | #FFFF00 31 | #505000 32 | #00ffff 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/java/fi/zmengames/zen/ScreenReceiver.java: -------------------------------------------------------------------------------- 1 | package fi.zmengames.zen; 2 | 3 | import static fi.zmengames.zen.ZEvent.State.SCREEN_OFF; 4 | import static fi.zmengames.zen.ZEvent.State.SCREEN_ON; 5 | 6 | import android.content.BroadcastReceiver; 7 | import android.content.Context; 8 | import android.content.Intent; 9 | import android.util.Log; 10 | 11 | import fr.neamar.kiss.BuildConfig; 12 | import fr.neamar.kiss.KissApplication; 13 | 14 | public class ScreenReceiver extends BroadcastReceiver { 15 | private static final String TAG = ScreenReceiver.class.getSimpleName(); 16 | private final Context context; 17 | 18 | public ScreenReceiver(Context context) { 19 | this.context = context; 20 | } 21 | @Override 22 | public void onReceive(Context context, Intent intent) { 23 | if (BuildConfig.DEBUG) Log.d(TAG, intent.getAction()); 24 | 25 | if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 26 | if (BuildConfig.DEBUG) Log.d(TAG, "ACTION_SCREEN_OFF"); 27 | Intent proximity = new Intent(context, LauncherService.class); 28 | proximity.setAction(SCREEN_OFF.toString()); 29 | KissApplication.startLaucherService(proximity, context); 30 | } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 31 | // and do whatever you need to do here 32 | if (BuildConfig.DEBUG) Log.d(TAG, "ACTION_SCREEN_ON"); 33 | Intent proximity = new Intent(context, LauncherService.class); 34 | proximity.setAction(SCREEN_ON.toString()); 35 | KissApplication.startLaucherService(proximity, context); 36 | 37 | } 38 | 39 | } 40 | 41 | } -------------------------------------------------------------------------------- /app/src/main/res/values-sk/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Zen launcher 4 | Zen nastavenia 5 | Hľadaj aplikácie, kontakty, … 6 | %1$s Vyhľadať “%2$s” 7 | Volaj “%s” 8 | Správa 9 | Hovor 10 | 11 | Užívateľské rozhranie 12 | História 13 | Pokročilé nastavenia 14 | Nastavenia zariadenia 15 | 16 | Začni hľadaním čohokoľvek 17 | Aplikácie, kontakty, nastavenia, … 18 | Vždy zobrazovať históriu 19 | Pre rýchly prístup 20 | Rýchly prístup pre najpoužívanejšie aplikácie 21 | Zen launcher sa učí z Vaších zvykov 22 | 23 | Kontakty 24 | 25 | Google vyhľadávanie 26 | 27 | Nastavenia 28 | 29 | 30 | "Vyberte farbu" 31 | Farba %1$d 32 | "Bola vybratá farba %1$d" 33 | 34 | -------------------------------------------------------------------------------- /docs/_config.yml: -------------------------------------------------------------------------------- 1 | # ---- 2 | # Site 3 | 4 | title: KISS 5 | url: "http://help.kisslauncher.com" 6 | baseurl: 7 | disqus_shortname: 8 | newsletter_action: 9 | 10 | # Values for the jekyll-seo-tag gem (https://github.com/jekyll/jekyll-seo-tag) 11 | logo: /siteicon.png 12 | description: Knowledge base for KISS launcher. 13 | author: 14 | name: 15 | email: 16 | twitter: Kisslauncher 17 | social: 18 | name: KISS documentation 19 | links: 20 | - https://github.com/Neamar/KISS 21 | 22 | # ----- 23 | # Build 24 | 25 | permalink: /:categories/:title/ 26 | 27 | plugins: 28 | - jekyll-extract-element 29 | - jekyll-sitemap 30 | - jekyll-seo-tag 31 | - jekyll-feed 32 | 33 | exclude: 34 | - Gemfile 35 | - Gemfile.lock 36 | - README.md 37 | - LICENCE 38 | - vendor 39 | 40 | collections: 41 | sets: 42 | category: 43 | output: true 44 | 45 | defaults: 46 | - 47 | scope: 48 | path: "" 49 | values: 50 | layout: "default" 51 | - 52 | scope: 53 | type: "posts" 54 | values: 55 | layout: "post" 56 | comments: true 57 | - 58 | scope: 59 | type: "sets" 60 | values: 61 | _hide_content: true 62 | - 63 | scope: 64 | path: "index.html" 65 | values: 66 | body_class: "show_hero_search" 67 | - 68 | scope: 69 | path: "" 70 | type: category 71 | values: 72 | layout: "category" 73 | 74 | # ----------- 75 | # CloudCannon 76 | 77 | social_icons: 78 | - Facebook 79 | - Google Plus 80 | - Instagram 81 | - LinkedIn 82 | - Pinterest 83 | - Tumblr 84 | - Twitter 85 | - YouTube 86 | - Email 87 | - RSS 88 | 89 | types: 90 | - Document 91 | - Video 92 | 93 | _comments: 94 | -------------------------------------------------------------------------------- /app/src/main/res/values-it/arrays.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Chiaro 5 | Semitrasparente 6 | Trasparente 7 | Scuro 8 | Semitrasparente scuro 9 | Trasparente scuro 10 | AMOLED dark theme 11 | 12 | 13 | Non fare nulla 14 | Mostra tastiera 15 | Mostra tendina notifiche 16 | Mostra elenco app 17 | Mostra cronologia 18 | Mostra app con notifiche 19 | Mostra contatti 20 | Mostra tutte le app 21 | Avvia lettore di codici a barre 22 | Avvia torcia 23 | Blocca schermo 24 | Spegni schermo 25 | Nascondi tastiera 26 | 27 | 28 | do-nothing 29 | display-keyboard 30 | display-notifications 31 | display-apps 32 | display-history 33 | display-apps-notif 34 | display-contacts 35 | display-all-apps 36 | start-barcode-reader 37 | start-flashlight 38 | lock-screen 39 | turn-off-screen 40 | hide-keyboard 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/values-fa/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | راهانداز ذن 4 | تنظیمات ذن 5 | جستجوی برنامه ها, مخاطبین… 6 | بازدید به “%1$s” 7 | تماس به “%s” 8 | پیام 9 | تماس 10 | رابط کاربری 11 | تنظیمات تاریخچه 12 | تنظیمات پیشرفته 13 | تنظیمات دستگاه 14 | جستجو 15 | برنامه ها، مخاطبین، تنظیمات، … 16 | همیشه تاریخچه خود را ببینید 17 | برای دسترسی سریع 18 | دسترسی سریع به اکثر برنامه های مورد استفاده 19 | کیس از عادت های شما یاد می گیرد 20 | مخاطبین 21 | جستجوی وب 22 | تنظیمات دستگاه 23 | میانبرها 24 | فهرست 25 | پاک کردن نوار جستجو 26 | نمایش فهرست مورد علاقه ها و برنامه ها 27 | نمایش تاریخچه 28 | بازنشانی تاریخچه 29 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | 22 | 23 | 31 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/pref_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | 15 | 16 |