├── .gitattributes ├── .github └── workflows │ └── android.yml ├── .gitignore ├── .idea ├── .gitignore ├── .name ├── appInsightsSettings.xml ├── gradle.xml ├── kotlinc.xml ├── migrations.xml ├── misc.xml └── vcs.xml ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── wstxda │ │ └── gsl │ │ ├── activity │ │ ├── AppActivity.kt │ │ ├── BaseActivity.kt │ │ ├── LibraryActivity.kt │ │ ├── SettingsActivity.kt │ │ └── ShortcutsActivity.kt │ │ ├── fragments │ │ ├── SettingsFragment.kt │ │ └── preferences │ │ │ ├── DigitalAssistantPreference.kt │ │ │ └── UpdaterPreference.kt │ │ ├── logic │ │ ├── PreferenceHelper.kt │ │ ├── RootChecker.kt │ │ └── ShortcutLauncher.kt │ │ ├── services │ │ ├── AssistantFallbackService.kt │ │ ├── MusicSearchTileService.kt │ │ └── UpdaterService.kt │ │ ├── shortcuts │ │ ├── AssistantShortcut.kt │ │ ├── FilesShortcut.kt │ │ ├── GamesShortcut.kt │ │ ├── IncognitoShortcut.kt │ │ ├── LensShortcut.kt │ │ ├── MusicSearchShortcut.kt │ │ ├── PasswordManagerShortcut.kt │ │ ├── QuickShareShortcut.kt │ │ ├── SearchShortcut.kt │ │ └── WeatherShortcut.kt │ │ ├── ui │ │ ├── DigitalAssistantSetupDialog.kt │ │ ├── ThemeManager.kt │ │ └── TileManager.kt │ │ ├── utils │ │ ├── Constants.kt │ │ ├── DigitalAssistantShortcuts.kt │ │ ├── GamesBrandsPackages.kt │ │ ├── IncognitoBrowsersPackages.kt │ │ └── IntentFactory.kt │ │ └── viewmodel │ │ └── SettingsViewModel.kt │ └── res │ ├── anim-v33 │ ├── shared_x_axis_activity_close_enter.xml │ ├── shared_x_axis_activity_close_exit.xml │ ├── shared_x_axis_activity_open_enter.xml │ └── shared_x_axis_activity_open_exit.xml │ ├── drawable │ ├── dialog_singlechoice_icon.xml │ ├── ic_add.xml │ ├── ic_check.xml │ ├── ic_check_update.xml │ ├── ic_developer.xml │ ├── ic_device_shortcut.xml │ ├── ic_empty.xml │ ├── ic_games.xml │ ├── ic_github.xml │ ├── ic_launcher_foreground.xml │ ├── ic_launcher_foreground_assistant.xml │ ├── ic_launcher_foreground_files.xml │ ├── ic_launcher_foreground_game.xml │ ├── ic_launcher_foreground_incognito.xml │ ├── ic_launcher_foreground_lens.xml │ ├── ic_launcher_foreground_music.xml │ ├── ic_launcher_foreground_password.xml │ ├── ic_launcher_foreground_search.xml │ ├── ic_launcher_foreground_settings.xml │ ├── ic_launcher_foreground_share.xml │ ├── ic_launcher_foreground_weather.xml │ ├── ic_launcher_monochrome.xml │ ├── ic_launcher_monochrome_assistant.xml │ ├── ic_launcher_monochrome_files.xml │ ├── ic_launcher_monochrome_game.xml │ ├── ic_launcher_monochrome_incognito.xml │ ├── ic_launcher_monochrome_lens.xml │ ├── ic_launcher_monochrome_music.xml │ ├── ic_launcher_monochrome_password.xml │ ├── ic_launcher_monochrome_search.xml │ ├── ic_launcher_monochrome_settings.xml │ ├── ic_launcher_monochrome_share.xml │ ├── ic_launcher_monochrome_weather.xml │ ├── ic_library.xml │ ├── ic_license.xml │ ├── ic_music_search_tile.xml │ ├── ic_open.xml │ ├── ic_root.xml │ ├── ic_settings.xml │ ├── ic_shortcut.xml │ ├── ic_theme.xml │ ├── ic_theme_color.xml │ ├── ic_weather_sun_cloud.xml │ ├── ic_weather_sun_core.xml │ ├── ic_weather_sun_corona.xml │ ├── ic_weather_sun_shape.xml │ ├── preference_background_bottom.xml │ ├── preference_background_highlight_single.xml │ ├── preference_background_highlight_top.xml │ ├── preference_background_middle.xml │ ├── preference_background_top.xml │ ├── single_choice_background.xml │ ├── single_choice_background_off.xml │ └── single_choice_background_on.xml │ ├── layout-land │ └── assistant_setup_dialog.xml │ ├── layout-v26 │ └── assistant_setup_dialog.xml │ ├── layout │ ├── activity_library.xml │ ├── activity_settings.xml │ ├── assistant_setup_dialog.xml │ ├── listitem_opensource.xml │ ├── listloader_opensource.xml │ ├── mtrl_alert_select_dialog_singlechoice.xml │ ├── preference_material_bottom.xml │ ├── preference_material_category.xml │ ├── preference_material_highlight_top.xml │ ├── preference_material_middle.xml │ ├── preference_material_shortcuts_bottom.xml │ ├── preference_material_shortcuts_middle.xml │ ├── preference_material_shortcuts_tile.xml │ ├── preference_material_shortcuts_top.xml │ ├── preference_material_switch.xml │ ├── preference_material_top.xml │ └── preference_material_updater.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ ├── ic_launcher_assistant.xml │ ├── ic_launcher_files.xml │ ├── ic_launcher_game.xml │ ├── ic_launcher_incognito.xml │ ├── ic_launcher_lens.xml │ ├── ic_launcher_music.xml │ ├── ic_launcher_password.xml │ ├── ic_launcher_search.xml │ ├── ic_launcher_settings.xml │ ├── ic_launcher_share.xml │ └── ic_launcher_weather.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ ├── ic_launcher_assistant.png │ ├── ic_launcher_files.png │ ├── ic_launcher_game.png │ ├── ic_launcher_incognito.png │ ├── ic_launcher_lens.png │ ├── ic_launcher_music.png │ ├── ic_launcher_password.png │ ├── ic_launcher_search.png │ ├── ic_launcher_settings.png │ ├── ic_launcher_share.png │ └── ic_launcher_weather.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ ├── ic_launcher_assistant.png │ ├── ic_launcher_files.png │ ├── ic_launcher_game.png │ ├── ic_launcher_incognito.png │ ├── ic_launcher_lens.png │ ├── ic_launcher_music.png │ ├── ic_launcher_password.png │ ├── ic_launcher_search.png │ ├── ic_launcher_settings.png │ ├── ic_launcher_share.png │ └── ic_launcher_weather.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ ├── ic_launcher_assistant.png │ ├── ic_launcher_files.png │ ├── ic_launcher_game.png │ ├── ic_launcher_incognito.png │ ├── ic_launcher_lens.png │ ├── ic_launcher_music.png │ ├── ic_launcher_password.png │ ├── ic_launcher_search.png │ ├── ic_launcher_settings.png │ ├── ic_launcher_share.png │ └── ic_launcher_weather.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_assistant.png │ ├── ic_launcher_files.png │ ├── ic_launcher_game.png │ ├── ic_launcher_incognito.png │ ├── ic_launcher_lens.png │ ├── ic_launcher_music.png │ ├── ic_launcher_password.png │ ├── ic_launcher_search.png │ ├── ic_launcher_settings.png │ ├── ic_launcher_share.png │ └── ic_launcher_weather.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_assistant.png │ ├── ic_launcher_files.png │ ├── ic_launcher_game.png │ ├── ic_launcher_incognito.png │ ├── ic_launcher_lens.png │ ├── ic_launcher_music.png │ ├── ic_launcher_password.png │ ├── ic_launcher_search.png │ ├── ic_launcher_settings.png │ ├── ic_launcher_share.png │ └── ic_launcher_weather.png │ ├── navigation │ └── nav_settings.xml │ ├── values-ar │ └── strings.xml │ ├── values-es │ └── strings.xml │ ├── values-fa-rIR │ └── strings.xml │ ├── values-ja │ └── strings.xml │ ├── values-night-v27 │ └── themes.xml │ ├── values-night-v31 │ └── themes.xml │ ├── values-night │ ├── color.xml │ ├── theme_overlays.xml │ └── themes.xml │ ├── values-pl │ └── strings.xml │ ├── values-pt-rBR │ └── strings.xml │ ├── values-v27 │ └── themes.xml │ ├── values-v31 │ └── themes.xml │ ├── values-v33 │ └── themes.xml │ ├── values │ ├── arrays.xml │ ├── color.xml │ ├── ids.xml │ ├── strings.xml │ ├── styles.xml │ ├── theme_overlays.xml │ └── themes.xml │ └── xml │ ├── data_extraction_rules.xml │ └── preferences.xml ├── build.gradle.kts ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── images ├── Banner.svg └── Screenshots.png └── settings.gradle.kts /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/workflows/android.yml: -------------------------------------------------------------------------------- 1 | name: Android CI 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: ["main"] 7 | pull_request: 8 | branches: ["main"] 9 | 10 | jobs: 11 | build_debug_apk: 12 | name: Build Debug APK 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - name: Checkout Repository 17 | uses: actions/checkout@v4 18 | 19 | - name: Set Up JDK 22 20 | uses: actions/setup-java@v4 21 | with: 22 | java-version: '22' 23 | distribution: 'oracle' 24 | cache: gradle 25 | 26 | - name: Cache Gradle Dependencies 27 | uses: actions/cache@v4 28 | with: 29 | path: | 30 | ~/.gradle/caches 31 | ~/.gradle/wrapper 32 | key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} 33 | restore-keys: | 34 | ${{ runner.os }}-gradle 35 | 36 | - name: Cache Android Build Outputs 37 | uses: actions/cache@v4 38 | with: 39 | path: app/build 40 | key: ${{ runner.os }}-build-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} 41 | restore-keys: | 42 | ${{ runner.os }}-build 43 | 44 | - name: Set Executable Permission for Gradle Wrapper 45 | run: chmod +x gradlew 46 | 47 | - name: Validate Gradle Wrapper 48 | uses: gradle/actions/wrapper-validation@v4 49 | 50 | - name: Run Code Linting 51 | run: ./gradlew lint 52 | 53 | - name: Run Unit Tests 54 | run: ./gradlew test 55 | 56 | - name: Build APK (Debug) 57 | id: gradle_build_debug 58 | run: ./gradlew assembleDebug 59 | 60 | - name: Upload Debug APK 61 | uses: actions/upload-artifact@v4 62 | with: 63 | name: app-debug 64 | path: app/build/outputs/apk/debug/ -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /package.properties 5 | /.idea 6 | /.kotlin 7 | .DS_Store 8 | /build 9 | /captures 10 | .externalNativeBuild 11 | .cxx 12 | local.properties 13 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | Google Shortcuts Launcher -------------------------------------------------------------------------------- /.idea/appInsightsSettings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 25 | 26 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/migrations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 16 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Google Shortcuts Launcher 2 | Easily access essential Google apps features directly from your launcher app drawer. 3 | 4 | [![GitHub Actions Status](https://img.shields.io/github/actions/workflow/status/WSTxda/Google-Shortcuts-Launcher/.github%2Fworkflows%2Fandroid.yml?style=for-the-badge&logo=github-actions&labelColor=21262D&color=3FB950)](https://github.com/WSTxda/Google-Shortcuts-Launcher/actions) 5 | [![Platform](https://img.shields.io/badge/android-platform?style=for-the-badge&label=platform&labelColor=21262d&color=6e7681)](https://www.android.com) 6 | [![API](https://img.shields.io/badge/24%2B-level?style=for-the-badge&logo=android&logoColor=3cd382&label=API&labelColor=21262d&color=ff663b)](https://developer.android.com/studio/releases/platforms) 7 | [![Release](https://img.shields.io/github/v/release/WSTxda/Google-Shortcuts-Launcher?display_name=tag&style=for-the-badge&logo=github&labelColor=21262d&color=1f6feb)](https://github.com/WSTxda/Google-Shortcuts-Launcher/releases/latest) 8 | [![Downloads](https://img.shields.io/github/downloads/WSTxda/Google-Shortcuts-Launcher/total?style=for-the-badge&labelColor=21262d&color=238636)](https://github.com/WSTxda/Google-Shortcuts-Launcher/releases) 9 | 10 | ![Banner](https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/main/images/Banner.svg) 11 | 12 | **Google Shortcuts Launcher** provides a seamless way to integrate powerful Google services into your daily workflow. With just a tap, you can quickly access a variety of shortcuts designed to enhance usability and simplify your interaction with core Google features. 13 | 14 |
15 | Screenshots 16 | 17 | ![Screenshot](https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/main/images/Screenshots.png) 18 | 19 |
20 | 21 | ## Shortcuts Available 22 | 23 | #### Digital Assistant 24 | Quickly invoke your device’s voice assistant—such as Gemini, Google Assistant, or others—to streamline tasks and access smart voice commands. 25 | 26 | #### Files (AOSP) 27 | Launch the system's built-in file manager to organize, copy, move, delete, and perform many other operations easily. 28 | 29 | #### Games Launcher 30 | A folder that displays all your installed games alongside recommendations from Google Play Games. 31 | > Also integrates with game managers from various brands such as Xiaomi, Oppo, Samsung, Nubia, Asus, and more. 32 | 33 | #### Google Lens 34 | Use your camera to search for objects, translate text, scan QR codes, copy content, and explore the world with powerful visual recognition features. 35 | 36 | #### Google Music Search 37 | Identify music playing nearby with a single tap. 38 | > A Quick Settings tile is also available for faster access. 39 | 40 | #### Google Password Manager 41 | Launch the Google Password Manager in your browser to securely manage saved credentials. 42 | > **Rooted Devices:** Directly access the native Play Services Password Manager interface—no browser required. 43 | 44 | #### Chrome Incognito Tab 45 | Start an Incognito session in Google Chrome where your activity isn’t saved to browsing history or local storage. 46 | 47 | #### Google Quick Share 48 | Send and receive photos, files, and more between nearby Android devices and compatible Windows PCs—securely and wirelessly. 49 | 50 | #### Google Weather 51 | Access real-time local weather updates along with a full weekly forecast. 52 | > If the Google app is unavailable, weather data will open in your browser. 53 | 54 | #### Google Search 55 | Perform quick searches on Google using the keyboard or voice input directly from your launcher. 56 | 57 | > [!NOTE] 58 | > **Required Apps:** The Google app, Google Chrome, Google Play Services, and Google Play Games must be installed on your device for most shortcuts to function properly. 59 | > **Root Access:** Some features require a rooted device for full functionality. 60 | 61 | ### Download 62 | 63 | [Get it on GitHub](https://github.com/WSTxda/Google-Shortcuts-Launcher/releases/latest) 66 | [Get it on Telegram](https://t.me/WSTprojects) 69 | 70 | ### Donate 71 | 72 | [Donate with PayPal](https://bit.ly/2lV0E6u) 75 | [Donate with BMC](https://www.buymeacoffee.com/wstxda) 78 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /release 3 | /debug -------------------------------------------------------------------------------- /app/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.android.application) 3 | alias(libs.plugins.kotlin.android) 4 | alias(libs.plugins.aboutLibraries) 5 | } 6 | 7 | android { 8 | namespace = "com.wstxda.gsl" 9 | compileSdk = 35 10 | 11 | defaultConfig { 12 | applicationId = "com.wstxda.gsl" 13 | minSdk = 24 14 | targetSdk = 35 15 | versionCode = 540 16 | versionName = "5.4" 17 | } 18 | 19 | buildTypes { 20 | release { 21 | isMinifyEnabled = false 22 | proguardFiles( 23 | getDefaultProguardFile("proguard-android-optimize.txt"), 24 | "proguard-rules.pro" 25 | ) 26 | signingConfig = signingConfigs.getByName("debug") 27 | } 28 | } 29 | compileOptions { 30 | sourceCompatibility = JavaVersion.VERSION_18 31 | targetCompatibility = JavaVersion.VERSION_18 32 | } 33 | kotlinOptions { 34 | jvmTarget = "18" 35 | } 36 | buildFeatures { 37 | viewBinding = true 38 | } 39 | } 40 | 41 | dependencies { 42 | implementation(libs.androidx.preference) 43 | implementation(libs.androidx.appcompat) 44 | implementation(libs.androidx.navigation) 45 | implementation(libs.google.material) 46 | implementation(libs.aboutlibraries.view) 47 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/activity/AppActivity.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.activity 2 | 3 | import android.app.Application 4 | import androidx.preference.PreferenceManager 5 | import com.wstxda.gsl.utils.Constants 6 | import com.wstxda.gsl.ui.ThemeManager 7 | 8 | class AppActivity : Application() { 9 | override fun onCreate() { 10 | super.onCreate() 11 | val prefs = PreferenceManager.getDefaultSharedPreferences(this) 12 | val selectedTheme = prefs.getString(Constants.THEME_PREF_KEY, Constants.THEME_SYSTEM) 13 | selectedTheme?.let { ThemeManager.applyTheme(it) } 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/activity/BaseActivity.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.activity 2 | 3 | import android.graphics.Color 4 | import android.os.Build 5 | import android.os.Bundle 6 | import android.view.View 7 | import androidx.activity.SystemBarStyle 8 | import androidx.activity.enableEdgeToEdge 9 | import androidx.appcompat.app.AppCompatActivity 10 | import androidx.appcompat.widget.Toolbar 11 | import androidx.core.view.ViewCompat 12 | import androidx.core.view.WindowInsetsCompat 13 | 14 | abstract class BaseActivity : AppCompatActivity() { 15 | 16 | override fun onCreate(savedInstanceState: Bundle?) { 17 | super.onCreate(savedInstanceState) 18 | enableEdgeToEdgeNoContrast() 19 | } 20 | 21 | protected fun setupToolbar(toolbar: Toolbar, showBackButton: Boolean = true) { 22 | setSupportActionBar(toolbar) 23 | supportActionBar?.setDisplayHomeAsUpEnabled(showBackButton) 24 | if (showBackButton) { 25 | toolbar.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() } 26 | } 27 | } 28 | 29 | private fun enableEdgeToEdgeNoContrast() { 30 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { 31 | enableEdgeToEdge( 32 | navigationBarStyle = SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT) 33 | ) 34 | window.isNavigationBarContrastEnforced = false 35 | } 36 | } 37 | 38 | protected fun applySystemBarInsets(target: View) { 39 | ViewCompat.setOnApplyWindowInsetsListener(target) { view, insets -> 40 | val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) 41 | view.setPadding( 42 | systemBarsInsets.left, 0, systemBarsInsets.right, systemBarsInsets.bottom 43 | ) 44 | WindowInsetsCompat.CONSUMED 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/activity/LibraryActivity.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("DEPRECATION") 2 | 3 | package com.wstxda.gsl.activity 4 | 5 | import android.os.Bundle 6 | import com.mikepenz.aboutlibraries.LibsBuilder 7 | import com.wstxda.gsl.R 8 | import com.wstxda.gsl.databinding.ActivityLibraryBinding 9 | 10 | class LibraryActivity : BaseActivity() { 11 | 12 | private val binding by lazy { ActivityLibraryBinding.inflate(layoutInflater) } 13 | 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | setContentView(binding.root) 17 | 18 | setupToolbar(binding.toolbar) 19 | binding.collapsingToolbar.title = getString(R.string.pref_used_library_summary) 20 | 21 | if (savedInstanceState == null) { 22 | val fragment = LibsBuilder().withEdgeToEdge(true).supportFragment() 23 | supportFragmentManager.beginTransaction() 24 | .replace(binding.libraryFragmentContainer.id, fragment).commit() 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/activity/SettingsActivity.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.activity 2 | 3 | import android.os.Bundle 4 | import com.wstxda.gsl.R 5 | import com.wstxda.gsl.databinding.ActivitySettingsBinding 6 | 7 | class SettingsActivity : BaseActivity() { 8 | 9 | private val binding by lazy { ActivitySettingsBinding.inflate(layoutInflater) } 10 | 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | setContentView(binding.root) 14 | applySystemBarInsets(binding.navHostContainer) 15 | 16 | setupToolbar(binding.toolbar, showBackButton = false) 17 | binding.collapsingToolbar.title = getString(R.string.app_settings) 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/activity/ShortcutsActivity.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.activity 2 | 3 | import android.os.Bundle 4 | 5 | abstract class ShortcutsActivity : BaseActivity() { 6 | 7 | override fun onCreate(savedInstanceState: Bundle?) { 8 | super.onCreate(savedInstanceState) 9 | onCreateInternal() 10 | finish() 11 | } 12 | 13 | abstract fun onCreateInternal() 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/fragments/preferences/DigitalAssistantPreference.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.fragments.preferences 2 | 3 | import android.content.Context 4 | import android.os.Build 5 | import androidx.core.content.edit 6 | import androidx.preference.PreferenceFragmentCompat 7 | import androidx.preference.PreferenceManager 8 | import com.wstxda.gsl.utils.Constants 9 | 10 | class DigitalAssistantPreference(private val fragment: PreferenceFragmentCompat) { 11 | private val prefs by lazy { PreferenceManager.getDefaultSharedPreferences(fragment.requireContext()) } 12 | 13 | fun checkDigitalAssistSetupStatus(): Boolean = 14 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { 15 | fragment.requireContext().getSystemService(android.app.role.RoleManager::class.java) 16 | .isRoleHeld(android.app.role.RoleManager.ROLE_ASSISTANT) 17 | } else { 18 | prefs.getBoolean(Constants.IS_ASSIST_SETUP_DONE, false) 19 | } 20 | 21 | fun setDigitalAssistSetupStatus(context: Context, isSetupDone: Boolean) { 22 | PreferenceManager.getDefaultSharedPreferences(context).edit { 23 | putBoolean(Constants.IS_ASSIST_SETUP_DONE, isSetupDone) 24 | } 25 | } 26 | 27 | fun updateDigitalAssistantPreferences(isAssistSetupDone: Boolean) { 28 | fragment.findPreference(Constants.DIGITAL_ASSISTANT_SETUP_PREF_KEY)?.isVisible = 29 | !isAssistSetupDone 30 | fragment.findPreference(Constants.DIGITAL_ASSISTANT_SHORTCUT_PREF_KEY) 31 | ?.apply { 32 | isVisible = isAssistSetupDone 33 | isEnabled = isAssistSetupDone 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/fragments/preferences/UpdaterPreference.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.fragments.preferences 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.widget.Button 6 | import android.widget.TextView 7 | import androidx.preference.Preference 8 | import androidx.preference.PreferenceViewHolder 9 | import com.wstxda.gsl.R 10 | import com.wstxda.gsl.services.UpdaterService 11 | import kotlinx.coroutines.CoroutineScope 12 | import kotlinx.coroutines.Dispatchers 13 | import kotlinx.coroutines.launch 14 | 15 | class UpdaterPreference @JvmOverloads constructor( 16 | context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 17 | ) : Preference(context, attrs, defStyleAttr) { 18 | 19 | init { 20 | layoutResource = R.layout.preference_material_updater 21 | } 22 | 23 | override fun onBindViewHolder(holder: PreferenceViewHolder) { 24 | super.onBindViewHolder(holder) 25 | holder.itemView.apply { 26 | isClickable = false 27 | isFocusable = false 28 | } 29 | (holder.findViewById(android.R.id.summary) as? TextView)?.text = getVersionName(context) 30 | 31 | (holder.findViewById(R.id.check_updates) as? Button)?.setOnClickListener { 32 | CoroutineScope(Dispatchers.Main).launch { 33 | UpdaterService.checkForUpdates(context, holder.itemView) 34 | } 35 | } 36 | } 37 | 38 | private fun getVersionName(context: Context): String = runCatching { 39 | context.packageManager.getPackageInfo(context.packageName, 0).versionName ?: "N/A" 40 | }.getOrDefault("N/A") 41 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/logic/PreferenceHelper.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.logic 2 | 3 | import android.content.Context 4 | import androidx.preference.PreferenceManager 5 | 6 | class PreferenceHelper(context: Context) { 7 | private val preferences = PreferenceManager.getDefaultSharedPreferences(context) 8 | 9 | fun getBoolean(key: String, defaultValue: Boolean = false): Boolean = 10 | preferences.getBoolean(key, defaultValue) 11 | 12 | fun getString(key: String, defaultValue: String? = null): String? = 13 | preferences.getString(key, defaultValue) 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/logic/RootChecker.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.logic 2 | 3 | import android.util.Log 4 | 5 | object RootChecker { 6 | private const val TAG = "RootChecker" 7 | 8 | fun isRootAvailable(): Boolean = runCatching { 9 | val process = ProcessBuilder("su", "-c", "id").start() 10 | process.waitFor() == 0 11 | }.getOrElse { 12 | Log.e(TAG, "Root check failed", it) 13 | false 14 | } 15 | 16 | fun launchRootActivity(packageName: String, activityName: String): Boolean = runCatching { 17 | val process = 18 | ProcessBuilder("su", "-c", "am", "start", "-n", "$packageName/$activityName").start() 19 | process.waitFor() == 0 20 | }.getOrElse { 21 | Log.e(TAG, "Failed to launch root activity", it) 22 | false 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/logic/ShortcutLauncher.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.logic 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import android.widget.Toast 6 | 7 | fun Context.launchShortcuts(intents: List, errorMessageResId: Int): Boolean { 8 | intents.forEach { intent -> 9 | if (launchShortcuts(intent)) return true 10 | } 11 | showToast(errorMessageResId) 12 | return false 13 | } 14 | 15 | fun Context.launchShortcuts(intent: Intent): Boolean = runCatching { 16 | intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK 17 | startActivity(intent) 18 | true 19 | }.getOrElse { false } 20 | 21 | fun Context.launchShortcutsHistory(intent: Intent): Boolean = runCatching { 22 | // TODO: Investigate why FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY is required for Lens to work properly. 23 | // Currently, using this flag causes an issue where launching another shortcut after (e.g., FilesShortcut) reopens Lens instead of the another shortcut. 24 | intent.flags = Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 25 | startActivity(intent) 26 | true 27 | }.getOrElse { false } 28 | 29 | fun Context.showToast(messageResId: Int) { 30 | Toast.makeText(this, messageResId, Toast.LENGTH_SHORT).show() 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/services/AssistantFallbackService.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.services 2 | 3 | import com.wstxda.gsl.activity.ShortcutsActivity 4 | import com.wstxda.gsl.utils.DigitalAssistantShortcuts 5 | 6 | class AssistantFallbackService : ShortcutsActivity() { 7 | override fun onCreateInternal() { 8 | DigitalAssistantShortcuts.launchSelectedShortcut(this) 9 | } 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/services/MusicSearchTileService.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.services 2 | 3 | import android.annotation.SuppressLint 4 | import android.app.PendingIntent 5 | import android.os.Build 6 | import android.service.quicksettings.TileService 7 | import com.wstxda.gsl.R 8 | import com.wstxda.gsl.logic.launchShortcuts 9 | import com.wstxda.gsl.logic.showToast 10 | import com.wstxda.gsl.utils.IntentFactory 11 | 12 | class MusicSearchTileService : TileService() { 13 | 14 | @SuppressLint("StartActivityAndCollapseDeprecated") 15 | override fun onClick() { 16 | super.onClick() 17 | val intent = IntentFactory.createMusicSearchIntent() 18 | if (!launchShortcuts(intent)) { 19 | showToast(R.string.google_not_found) 20 | } else { 21 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { 22 | val pendingIntent = PendingIntent.getActivity( 23 | this, 0, intent, PendingIntent.FLAG_IMMUTABLE 24 | ) 25 | startActivityAndCollapse(pendingIntent) 26 | } else { 27 | @Suppress("DEPRECATION") startActivityAndCollapse(intent) 28 | } 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/services/UpdaterService.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.services 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import android.net.ConnectivityManager 6 | import android.net.NetworkCapabilities 7 | import android.view.View 8 | import androidx.coordinatorlayout.widget.CoordinatorLayout 9 | import androidx.core.net.toUri 10 | import com.google.android.material.snackbar.Snackbar 11 | import com.wstxda.gsl.R 12 | import com.wstxda.gsl.utils.Constants 13 | import kotlinx.coroutines.CoroutineScope 14 | import kotlinx.coroutines.Dispatchers 15 | import kotlinx.coroutines.launch 16 | import kotlinx.coroutines.withContext 17 | import org.json.JSONObject 18 | import java.net.URL 19 | 20 | object UpdaterService { 21 | fun checkForUpdates(context: Context, anchorView: View) { 22 | CoroutineScope(Dispatchers.Main).launch { 23 | if (!isNetworkAvailable(context)) { 24 | showNoInternetSnackbar(anchorView) 25 | return@launch 26 | } 27 | 28 | try { 29 | val latestVersion = withContext(Dispatchers.IO) { fetchLatestVersion() } 30 | val currentVersion = getCurrentVersion(context) 31 | if (compareVersions(currentVersion, latestVersion) < 0) { 32 | showUpdateAvailableSnackbar(anchorView, latestVersion) 33 | } else { 34 | showNoUpdateSnackbar(anchorView) 35 | } 36 | } catch (_: Exception) { 37 | showGenericErrorSnackbar(anchorView) 38 | } 39 | } 40 | } 41 | 42 | private fun isNetworkAvailable(context: Context): Boolean { 43 | val connectivityManager = 44 | context.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager 45 | ?: return false 46 | val network = connectivityManager.activeNetwork ?: return false 47 | val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false 48 | return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) 49 | } 50 | 51 | private suspend fun fetchLatestVersion(): String = withContext(Dispatchers.IO) { 52 | val jsonString = URL(Constants.GITHUB_RELEASE_URL).readText() 53 | val jsonObject = JSONObject(jsonString) 54 | jsonObject.optString("tag_name").removePrefix("v") 55 | } 56 | 57 | private fun getCurrentVersion(context: Context): String = runCatching { 58 | context.packageManager.getPackageInfo(context.packageName, 0).versionName ?: "N/A" 59 | }.getOrDefault("N/A") 60 | 61 | private fun compareVersions(current: String, latest: String): Int { 62 | if (current == "N/A") return -1 63 | val currentParts = current.split(".").map { it.toIntOrNull() ?: 0 } 64 | val latestParts = latest.split(".").map { it.toIntOrNull() ?: 0 } 65 | for (i in 0 until maxOf(currentParts.size, latestParts.size)) { 66 | val curr = currentParts.getOrElse(i) { 0 } 67 | val late = latestParts.getOrElse(i) { 0 } 68 | if (curr != late) return curr - late 69 | } 70 | return 0 71 | } 72 | 73 | private fun showNoUpdateSnackbar(anchorView: View) { 74 | Snackbar.make(anchorView, R.string.update_checker_no_update, Snackbar.LENGTH_SHORT).show() 75 | } 76 | 77 | private fun showUpdateAvailableSnackbar(anchorView: View, latestVersion: String) { 78 | Snackbar.make( 79 | anchorView, 80 | anchorView.context.getString(R.string.update_checker_update_available, latestVersion), 81 | Snackbar.LENGTH_LONG 82 | ).apply { 83 | setAction(R.string.update_checker_download_button) { 84 | val intent = Intent( 85 | Intent.ACTION_VIEW, 86 | Constants.GITHUB_RELEASE_URL.replace("api.", "").replace("/repos", "").toUri() 87 | ) 88 | anchorView.context.startActivity(intent) 89 | } 90 | addCallback(object : Snackbar.Callback() { 91 | override fun onShown(snackBar: Snackbar) { 92 | (snackBar.view.layoutParams as? CoordinatorLayout.LayoutParams)?.behavior = null 93 | } 94 | }) 95 | }.show() 96 | } 97 | 98 | private fun showNoInternetSnackbar(anchorView: View) { 99 | Snackbar.make(anchorView, R.string.update_checker_no_internet, Snackbar.LENGTH_LONG).show() 100 | } 101 | 102 | private fun showGenericErrorSnackbar(anchorView: View) { 103 | Snackbar.make(anchorView, R.string.update_checker_generic_error, Snackbar.LENGTH_LONG) 104 | .show() 105 | } 106 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/shortcuts/AssistantShortcut.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.shortcuts 2 | 3 | import android.content.Intent 4 | import com.wstxda.gsl.R 5 | import com.wstxda.gsl.activity.ShortcutsActivity 6 | import com.wstxda.gsl.logic.launchShortcuts 7 | 8 | class AssistantShortcut : ShortcutsActivity() { 9 | override fun onCreateInternal() { 10 | launchShortcuts(listOf(createAssistantIntent()), R.string.google_not_found) 11 | } 12 | 13 | private fun createAssistantIntent() = Intent(Intent.ACTION_VOICE_COMMAND) 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/shortcuts/FilesShortcut.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.shortcuts 2 | 3 | import android.content.Intent 4 | import com.wstxda.gsl.R 5 | import com.wstxda.gsl.activity.ShortcutsActivity 6 | import com.wstxda.gsl.logic.launchShortcuts 7 | import com.wstxda.gsl.utils.Constants 8 | 9 | class FilesShortcut : ShortcutsActivity() { 10 | override fun onCreateInternal() { 11 | launchShortcuts( 12 | listOf( 13 | Intent(Intent.ACTION_VIEW, Constants.STORAGE_URI), 14 | Intent("android.provider.action.BROWSE", Constants.STORAGE_URI), 15 | Intent("android.provider.action.BROWSE_DOCUMENT_ROOT", Constants.STORAGE_URI) 16 | ), R.string.files_not_found 17 | ) 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/shortcuts/GamesShortcut.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.shortcuts 2 | 3 | import android.content.Intent 4 | import com.wstxda.gsl.R 5 | import com.wstxda.gsl.activity.ShortcutsActivity 6 | import com.wstxda.gsl.logic.PreferenceHelper 7 | import com.wstxda.gsl.logic.launchShortcuts 8 | import com.wstxda.gsl.utils.Constants 9 | import com.wstxda.gsl.utils.GamesBrandsPackages 10 | 11 | class GamesShortcut : ShortcutsActivity() { 12 | private val preferences by lazy { PreferenceHelper(this) } 13 | override fun onCreateInternal() { 14 | if (preferences.getBoolean(Constants.GAME_MANAGER_PREF_KEY)) launchBrandGamesManager() 15 | else launchGooglePlayGamesFolder() 16 | } 17 | 18 | private fun launchBrandGamesManager() { 19 | val intents = GamesBrandsPackages.gamesLaunchersIntents.map { (pkg, cls) -> 20 | Intent().apply { 21 | setClassName(pkg, cls) 22 | action = Intent.ACTION_MAIN 23 | addCategory(Intent.CATEGORY_LAUNCHER) 24 | } 25 | } 26 | launchShortcuts(intents, R.string.game_manager_not_found) 27 | } 28 | 29 | private fun launchGooglePlayGamesFolder() { 30 | val intent = Intent().apply { 31 | setClassName( 32 | "com.google.android.play.games", 33 | "com.google.android.apps.play.games.features.gamefolder.GameFolderTrampolineActivity" 34 | ) 35 | } 36 | launchShortcuts(listOf(intent), R.string.play_games_not_found) 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/shortcuts/IncognitoShortcut.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.shortcuts 2 | 3 | import android.content.Intent 4 | import com.wstxda.gsl.R 5 | import com.wstxda.gsl.activity.ShortcutsActivity 6 | import com.wstxda.gsl.logic.launchShortcuts 7 | import com.wstxda.gsl.utils.IncognitoBrowsersPackages 8 | 9 | class IncognitoShortcut : ShortcutsActivity() { 10 | override fun onCreateInternal() { 11 | val intents = IncognitoBrowsersPackages.incognitoLauncherIntents.map { (pkg, cls) -> 12 | Intent().apply { 13 | setClassName(pkg, cls) 14 | action = Intent.ACTION_MAIN 15 | addCategory(Intent.CATEGORY_LAUNCHER) 16 | } 17 | } 18 | launchShortcuts(intents, R.string.browser_not_found) 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/shortcuts/LensShortcut.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.shortcuts 2 | 3 | import android.content.ComponentName 4 | import android.content.Intent 5 | import com.wstxda.gsl.R 6 | import com.wstxda.gsl.activity.ShortcutsActivity 7 | import com.wstxda.gsl.logic.launchShortcutsHistory 8 | import com.wstxda.gsl.logic.showToast 9 | 10 | class LensShortcut : ShortcutsActivity() { 11 | override fun onCreateInternal() { 12 | if (!launchShortcutsHistory(createLensIntent())) { 13 | showToast(R.string.google_not_found) 14 | } 15 | } 16 | 17 | private fun createLensIntent() = Intent().apply { 18 | component = ComponentName( 19 | "com.google.android.googlequicksearchbox", 20 | "com.google.android.apps.search.lens.LensExportedActivity" 21 | ) 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/shortcuts/MusicSearchShortcut.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.shortcuts 2 | 3 | import com.wstxda.gsl.R 4 | import com.wstxda.gsl.activity.ShortcutsActivity 5 | import com.wstxda.gsl.logic.launchShortcuts 6 | import com.wstxda.gsl.utils.IntentFactory 7 | 8 | class MusicSearchShortcut : ShortcutsActivity() { 9 | override fun onCreateInternal() { 10 | launchShortcuts(listOf(IntentFactory.createMusicSearchIntent()), R.string.google_not_found) 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/shortcuts/PasswordManagerShortcut.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.shortcuts 2 | 3 | import android.content.Intent 4 | import androidx.core.net.toUri 5 | import androidx.lifecycle.lifecycleScope 6 | import com.wstxda.gsl.R 7 | import com.wstxda.gsl.activity.ShortcutsActivity 8 | import com.wstxda.gsl.logic.PreferenceHelper 9 | import com.wstxda.gsl.logic.RootChecker 10 | import com.wstxda.gsl.logic.launchShortcuts 11 | import com.wstxda.gsl.logic.showToast 12 | import com.wstxda.gsl.utils.Constants 13 | import kotlinx.coroutines.Dispatchers 14 | import kotlinx.coroutines.launch 15 | import kotlinx.coroutines.withContext 16 | 17 | class PasswordManagerShortcut : ShortcutsActivity() { 18 | private val preferences by lazy { PreferenceHelper(this) } 19 | 20 | override fun onCreateInternal() { 21 | lifecycleScope.launch { 22 | when { 23 | preferences.getBoolean(Constants.PASSWORD_MANAGER_ROOT_PREF_KEY) -> handleRootMode() 24 | else -> launchPasswordManagerBrowser() 25 | } 26 | } 27 | } 28 | 29 | private suspend fun handleRootMode() { 30 | if (withContext(Dispatchers.IO) { RootChecker.isRootAvailable() }) { 31 | val success = withContext(Dispatchers.IO) { 32 | RootChecker.launchRootActivity( 33 | "com.google.android.gms", 34 | "com.google.android.gms.credential.manager.PasswordManagerActivity" 35 | ) 36 | } 37 | if (!success) { 38 | showToast(R.string.play_services_not_found) 39 | } 40 | } else { 41 | showToast(R.string.root_access_error) 42 | } 43 | } 44 | 45 | private fun launchPasswordManagerBrowser() { 46 | launchShortcuts(listOf(createBrowserIntent()), R.string.browser_not_found) 47 | } 48 | 49 | private fun createBrowserIntent(): Intent = 50 | Intent(Intent.ACTION_VIEW, getString(R.string.password_url).toUri()) 51 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/shortcuts/QuickShareShortcut.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.shortcuts 2 | 3 | import android.content.ComponentName 4 | import android.content.Intent 5 | import com.wstxda.gsl.R 6 | import com.wstxda.gsl.activity.ShortcutsActivity 7 | import com.wstxda.gsl.logic.launchShortcuts 8 | 9 | class QuickShareShortcut : ShortcutsActivity() { 10 | override fun onCreateInternal() { 11 | launchShortcuts(listOf(createQuickShareIntent()), R.string.play_services_not_found) 12 | } 13 | 14 | private fun createQuickShareIntent() = Intent().apply { 15 | component = ComponentName( 16 | "com.google.android.gms", "com.google.android.gms.nearby.sharing.send.SendActivity" 17 | ) 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/shortcuts/SearchShortcut.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.shortcuts 2 | 3 | import android.content.ComponentName 4 | import android.content.Intent 5 | import com.wstxda.gsl.R 6 | import com.wstxda.gsl.activity.ShortcutsActivity 7 | import com.wstxda.gsl.logic.launchShortcuts 8 | 9 | class SearchShortcut : ShortcutsActivity() { 10 | override fun onCreateInternal() { 11 | launchShortcuts(listOf(createSearchIntent()), R.string.google_not_found) 12 | } 13 | 14 | private fun createSearchIntent() = Intent().apply { 15 | component = ComponentName( 16 | "com.google.android.googlequicksearchbox", 17 | "com.google.android.search.core.google.GoogleSearch" 18 | ) 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/shortcuts/WeatherShortcut.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.shortcuts 2 | 3 | import android.content.Intent 4 | import androidx.core.net.toUri 5 | import com.wstxda.gsl.R 6 | import com.wstxda.gsl.activity.ShortcutsActivity 7 | import com.wstxda.gsl.logic.launchShortcuts 8 | 9 | class WeatherShortcut : ShortcutsActivity() { 10 | override fun onCreateInternal() { 11 | launchShortcuts( 12 | listOf( 13 | createWeatherIntent(), 14 | Intent(Intent.ACTION_VIEW, getString(R.string.weather_url).toUri()) 15 | ), R.string.browser_not_found 16 | ) 17 | } 18 | 19 | private fun createWeatherIntent() = Intent().apply { 20 | setClassName( 21 | "com.google.android.googlequicksearchbox", 22 | "com.google.android.apps.search.weather.WeatherExportedActivity" 23 | ) 24 | action = Intent.ACTION_MAIN 25 | addCategory(Intent.CATEGORY_LAUNCHER) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/ui/DigitalAssistantSetupDialog.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.ui 2 | 3 | import android.app.Dialog 4 | import android.content.Intent 5 | import android.os.Build 6 | import android.os.Bundle 7 | import android.provider.Settings 8 | import androidx.activity.result.ActivityResultLauncher 9 | import androidx.fragment.app.DialogFragment 10 | import androidx.preference.PreferenceFragmentCompat 11 | import com.google.android.material.dialog.MaterialAlertDialogBuilder 12 | import com.wstxda.gsl.databinding.AssistantSetupDialogBinding 13 | import com.wstxda.gsl.fragments.preferences.DigitalAssistantPreference 14 | import com.wstxda.gsl.utils.Constants 15 | 16 | class DigitalAssistantSetupDialog : DialogFragment() { 17 | 18 | private lateinit var launcher: ActivityResultLauncher 19 | private var _binding: AssistantSetupDialogBinding? = null 20 | private val binding get() = _binding!! 21 | 22 | companion object { 23 | fun show( 24 | fragmentManager: androidx.fragment.app.FragmentManager, 25 | launcher: ActivityResultLauncher 26 | ) { 27 | if (fragmentManager.findFragmentByTag(Constants.DIGITAL_ASSISTANT_DIALOG) != null) return 28 | DigitalAssistantSetupDialog().apply { this.launcher = launcher } 29 | .show(fragmentManager, Constants.DIGITAL_ASSISTANT_DIALOG) 30 | } 31 | } 32 | 33 | override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 34 | _binding = AssistantSetupDialogBinding.inflate(requireActivity().layoutInflater) 35 | 36 | binding.positiveButton.setOnClickListener { 37 | if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { 38 | (parentFragment as? PreferenceFragmentCompat)?.let { 39 | DigitalAssistantPreference(it).setDigitalAssistSetupStatus( 40 | requireContext(), true 41 | ) 42 | } 43 | } 44 | runCatching { 45 | launcher.launch(Intent(Settings.ACTION_VOICE_INPUT_SETTINGS)) 46 | } 47 | dismiss() 48 | } 49 | 50 | binding.negativeButton.setOnClickListener { 51 | dismiss() 52 | } 53 | 54 | return MaterialAlertDialogBuilder(requireContext()).setView(binding.root).create() 55 | } 56 | 57 | override fun onDestroyView() { 58 | super.onDestroyView() 59 | _binding = null 60 | } 61 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/ui/ThemeManager.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.ui 2 | 3 | import androidx.appcompat.app.AppCompatDelegate 4 | import com.wstxda.gsl.utils.Constants 5 | 6 | object ThemeManager { 7 | 8 | fun applyTheme(theme: String) { 9 | AppCompatDelegate.setDefaultNightMode( 10 | when (theme) { 11 | Constants.THEME_LIGHT -> AppCompatDelegate.MODE_NIGHT_NO 12 | Constants.THEME_DARK -> AppCompatDelegate.MODE_NIGHT_YES 13 | Constants.THEME_SYSTEM -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM 14 | else -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM 15 | } 16 | ) 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/ui/TileManager.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.ui 2 | 3 | import android.app.Activity 4 | import android.app.StatusBarManager 5 | import android.content.ComponentName 6 | import android.content.Context 7 | import android.graphics.drawable.Icon 8 | import android.os.Build 9 | import android.view.View 10 | import com.google.android.material.snackbar.Snackbar 11 | import com.wstxda.gsl.R 12 | import com.wstxda.gsl.services.MusicSearchTileService 13 | import java.util.concurrent.Executors 14 | import java.util.function.Consumer 15 | 16 | class TileManager(private val context: Context) { 17 | fun requestAddTile() { 18 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { 19 | val tileServiceComponent = ComponentName(context, MusicSearchTileService::class.java) 20 | val executor = Executors.newSingleThreadExecutor() 21 | val resultCallback = Consumer { result -> 22 | (context as? Activity)?.findViewById(android.R.id.content)?.let { rootView -> 23 | val message = when (result) { 24 | StatusBarManager.TILE_ADD_REQUEST_RESULT_TILE_ADDED -> context.getString(R.string.tile_added_success) 25 | 26 | StatusBarManager.TILE_ADD_REQUEST_RESULT_TILE_ALREADY_ADDED -> context.getString( 27 | R.string.tile_already_added 28 | ) 29 | 30 | else -> "" 31 | } 32 | if (message.isNotEmpty()) showSnackBar(rootView, message) 33 | } 34 | } 35 | context.getSystemService(StatusBarManager::class.java)?.requestAddTileService( 36 | tileServiceComponent, 37 | context.getString(R.string.music_search_label), 38 | Icon.createWithResource(context, R.drawable.ic_music_search_tile), 39 | executor, 40 | resultCallback 41 | ) 42 | } 43 | } 44 | 45 | private fun showSnackBar(view: View, message: String) { 46 | Snackbar.make(view, message, Snackbar.LENGTH_SHORT).show() 47 | } 48 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/utils/Constants.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.utils 2 | 3 | import android.net.Uri 4 | import androidx.core.net.toUri 5 | 6 | object Constants { 7 | const val DIGITAL_ASSISTANT_SETUP_PREF_KEY = "digital_assistant_setup" 8 | const val DIGITAL_ASSISTANT_SHORTCUT_PREF_KEY = "digital_assistant_shortcut" 9 | const val GAME_MANAGER_PREF_KEY = "device_game_manager" 10 | const val PASSWORD_MANAGER_ROOT_PREF_KEY = "password_manager_root" 11 | const val LIBRARY_PREF_KEY = "library" 12 | const val THEME_PREF_KEY = "select_theme" 13 | 14 | const val THEME_SYSTEM = "system" 15 | const val THEME_LIGHT = "light" 16 | const val THEME_DARK = "dark" 17 | 18 | const val MUSIC_SEARCH_TILE_KEY = "add_music_search_tile" 19 | 20 | const val DIGITAL_ASSISTANT_DIALOG = "DigitalAssistantSetupDialog" 21 | const val IS_ASSIST_SETUP_DONE = "is_assist_setup_done" 22 | 23 | const val GITHUB_RELEASE_URL = "https://api.github.com/repos/WSTxda/Google-Shortcuts-Launcher/releases/latest" 24 | 25 | val STORAGE_URI: Uri = "content://com.android.externalstorage.documents/root/primary".toUri() 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/utils/DigitalAssistantShortcuts.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.utils 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import com.wstxda.gsl.R 6 | import com.wstxda.gsl.logic.PreferenceHelper 7 | import com.wstxda.gsl.logic.launchShortcuts 8 | import com.wstxda.gsl.logic.showToast 9 | import com.wstxda.gsl.shortcuts.* 10 | 11 | object DigitalAssistantShortcuts { 12 | private val shortcutMap = mapOf( 13 | "files_shortcut" to FilesShortcut::class.java, 14 | "games_shortcut" to GamesShortcut::class.java, 15 | "lens_shortcut" to LensShortcut::class.java, 16 | "music_search_shortcut" to MusicSearchShortcut::class.java, 17 | "password_manager_shortcut" to PasswordManagerShortcut::class.java, 18 | "incognito_shortcut" to IncognitoShortcut::class.java, 19 | "quick_share_shortcut" to QuickShareShortcut::class.java, 20 | "search_shortcut" to SearchShortcut::class.java, 21 | "weather_shortcut" to WeatherShortcut::class.java 22 | ) 23 | 24 | fun launchSelectedShortcut(context: Context) { 25 | val preferenceHelper = PreferenceHelper(context) 26 | val selectedShortcut = 27 | preferenceHelper.getString(Constants.DIGITAL_ASSISTANT_SHORTCUT_PREF_KEY, null) ?: return 28 | val activityClass = shortcutMap[selectedShortcut] 29 | if (activityClass != null) { 30 | val intent = Intent(context, activityClass) 31 | if (!context.launchShortcuts(intent)) context.showToast(R.string.digital_assistant_shortcut_disabled) 32 | } else { 33 | context.showToast(R.string.digital_assistant_shortcut_invalid) 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/utils/IncognitoBrowsersPackages.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.utils 2 | 3 | object IncognitoBrowsersPackages { 4 | val incognitoLauncherIntents = listOf( 5 | // Google Chrome 6 | "com.android.chrome" to "org.chromium.chrome.browser.incognito.IncognitoTabLauncher", 7 | "com.chrome.canary" to "org.chromium.chrome.browser.incognito.IncognitoTabLauncher", 8 | "com.chrome.beta" to "org.chromium.chrome.browser.incognito.IncognitoTabLauncher", 9 | "com.chrome.dev" to "org.chromium.chrome.browser.incognito.IncognitoTabLauncher", 10 | 11 | // Brave Browser 12 | "com.brave.browser" to "org.chromium.chrome.browser.incognito.IncognitoTabLauncher" 13 | ) 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/utils/IntentFactory.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.utils 2 | 3 | import android.content.Intent 4 | 5 | object IntentFactory { 6 | fun createMusicSearchIntent(): Intent = 7 | Intent("com.google.android.googlequicksearchbox.MUSIC_SEARCH").apply { 8 | flags = Intent.FLAG_ACTIVITY_NEW_TASK 9 | } 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wstxda/gsl/viewmodel/SettingsViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.wstxda.gsl.viewmodel 2 | 3 | import android.app.Application 4 | import android.content.ComponentName 5 | import android.content.pm.PackageManager 6 | import androidx.lifecycle.AndroidViewModel 7 | import androidx.lifecycle.LiveData 8 | import androidx.lifecycle.MutableLiveData 9 | import com.wstxda.gsl.ui.ThemeManager 10 | 11 | class SettingsViewModel(application: Application) : AndroidViewModel(application) { 12 | private val pm = application.packageManager 13 | private val _isAssistSetupDone = MutableLiveData() 14 | val isAssistSetupDone: LiveData = _isAssistSetupDone 15 | 16 | fun setAssistSetupDone(done: Boolean) { 17 | _isAssistSetupDone.value = done 18 | } 19 | 20 | fun toggleActivityVisibility(activityClass: Class<*>, show: Boolean) { 21 | val newState = if (show) PackageManager.COMPONENT_ENABLED_STATE_ENABLED 22 | else PackageManager.COMPONENT_ENABLED_STATE_DISABLED 23 | 24 | val component = ComponentName(getApplication(), activityClass) 25 | pm.setComponentEnabledSetting(component, newState, PackageManager.DONT_KILL_APP) 26 | } 27 | 28 | fun applyTheme(themeKey: String) { 29 | ThemeManager.applyTheme(themeKey) 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/res/anim-v33/shared_x_axis_activity_close_enter.xml: -------------------------------------------------------------------------------- 1 | 5 | 15 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/anim-v33/shared_x_axis_activity_close_exit.xml: -------------------------------------------------------------------------------- 1 | 4 | 14 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/anim-v33/shared_x_axis_activity_open_enter.xml: -------------------------------------------------------------------------------- 1 | 5 | 15 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/anim-v33/shared_x_axis_activity_open_exit.xml: -------------------------------------------------------------------------------- 1 | 4 | 14 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/dialog_singlechoice_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_update.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_developer.xml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_device_shortcut.xml: -------------------------------------------------------------------------------- 1 | 9 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_empty.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_games.xml: -------------------------------------------------------------------------------- 1 | 8 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_github.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground_assistant.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 16 | 19 | 22 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground_files.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground_game.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground_incognito.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground_lens.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground_music.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground_password.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground_search.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | 13 | 16 | 21 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground_settings.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground_share.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground_weather.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 15 | 18 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome_assistant.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome_files.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome_game.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome_incognito.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome_lens.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome_music.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome_password.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome_search.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | 13 | 16 | 20 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome_settings.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome_share.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome_weather.xml: -------------------------------------------------------------------------------- 1 | 7 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_library.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_license.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_music_search_tile.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_open.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_root.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings.xml: -------------------------------------------------------------------------------- 1 | 8 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_shortcut.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_theme.xml: -------------------------------------------------------------------------------- 1 | 8 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_theme_color.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_weather_sun_cloud.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 11 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_weather_sun_core.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 11 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_weather_sun_corona.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 11 | 14 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_weather_sun_shape.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 11 | 14 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/preference_background_bottom.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/preference_background_highlight_single.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/preference_background_highlight_top.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/preference_background_middle.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/preference_background_top.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/single_choice_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/single_choice_background_off.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/single_choice_background_on.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout-land/assistant_setup_dialog.xml: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | 24 | 36 | 37 | 48 | 49 | 58 | 59 | 60 | 73 | 74 | 86 | -------------------------------------------------------------------------------- /app/src/main/res/layout-v26/assistant_setup_dialog.xml: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | 24 | 41 | 42 | 53 | 54 | 63 | 64 | 65 | 76 | 77 | 88 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_library.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 12 | 13 | 26 | 27 | 34 | 35 | 36 | 37 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_settings.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 12 | 13 | 26 | 27 | 33 | 34 | 35 | 36 | 37 | 38 | 44 | 45 | 52 | 53 | -------------------------------------------------------------------------------- /app/src/main/res/layout/assistant_setup_dialog.xml: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | 24 | 37 | 38 | 49 | 50 | 58 | 59 | 60 | 70 | 71 | 81 | -------------------------------------------------------------------------------- /app/src/main/res/layout/listloader_opensource.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/mtrl_alert_select_dialog_singlechoice.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_material_bottom.xml: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | 24 | 34 | 35 | 43 | 44 | 53 | 54 | 55 | 62 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_material_category.xml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_material_highlight_top.xml: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | 25 | 35 | 36 | 44 | 45 | 54 | 55 | 56 | 63 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_material_middle.xml: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | 25 | 35 | 36 | 44 | 45 | 54 | 55 | 56 | 63 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_material_shortcuts_bottom.xml: -------------------------------------------------------------------------------- 1 | 12 | 13 | 21 | 22 | 32 | 33 | 41 | 42 | 51 | 52 | 53 | 60 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_material_shortcuts_middle.xml: -------------------------------------------------------------------------------- 1 | 13 | 14 | 22 | 23 | 33 | 34 | 42 | 43 | 52 | 53 | 54 | 61 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_material_shortcuts_tile.xml: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | 25 | 35 | 36 | 45 | 46 | 55 | 56 | 57 | 64 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_material_shortcuts_top.xml: -------------------------------------------------------------------------------- 1 | 13 | 14 | 22 | 23 | 33 | 34 | 42 | 43 | 52 | 53 | 54 | 61 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_material_switch.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_material_top.xml: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | 25 | 35 | 36 | 44 | 45 | 54 | 55 | 56 | 63 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_material_updater.xml: -------------------------------------------------------------------------------- 1 | 13 | 14 | 21 | 22 | 32 | 33 | 41 | 42 | 51 | 52 | 53 | 66 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_assistant.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_files.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_game.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_incognito.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_lens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_music.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_password.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_search.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_share.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_weather.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_assistant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-hdpi/ic_launcher_assistant.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-hdpi/ic_launcher_files.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-hdpi/ic_launcher_game.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_incognito.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-hdpi/ic_launcher_incognito.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_lens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-hdpi/ic_launcher_lens.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-hdpi/ic_launcher_music.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-hdpi/ic_launcher_password.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-hdpi/ic_launcher_search.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-hdpi/ic_launcher_settings.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-hdpi/ic_launcher_share.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_weather.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-hdpi/ic_launcher_weather.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_assistant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-mdpi/ic_launcher_assistant.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-mdpi/ic_launcher_files.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-mdpi/ic_launcher_game.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_incognito.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-mdpi/ic_launcher_incognito.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_lens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-mdpi/ic_launcher_lens.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-mdpi/ic_launcher_music.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-mdpi/ic_launcher_password.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-mdpi/ic_launcher_search.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-mdpi/ic_launcher_settings.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-mdpi/ic_launcher_share.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_weather.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-mdpi/ic_launcher_weather.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_assistant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xhdpi/ic_launcher_assistant.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xhdpi/ic_launcher_files.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xhdpi/ic_launcher_game.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_incognito.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xhdpi/ic_launcher_incognito.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_lens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xhdpi/ic_launcher_lens.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xhdpi/ic_launcher_music.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xhdpi/ic_launcher_password.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xhdpi/ic_launcher_search.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xhdpi/ic_launcher_settings.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xhdpi/ic_launcher_share.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_weather.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xhdpi/ic_launcher_weather.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_assistant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxhdpi/ic_launcher_assistant.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxhdpi/ic_launcher_files.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxhdpi/ic_launcher_game.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_incognito.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxhdpi/ic_launcher_incognito.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_lens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxhdpi/ic_launcher_lens.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxhdpi/ic_launcher_music.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxhdpi/ic_launcher_password.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxhdpi/ic_launcher_search.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxhdpi/ic_launcher_settings.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxhdpi/ic_launcher_share.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_weather.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxhdpi/ic_launcher_weather.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_assistant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_assistant.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_files.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_game.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_incognito.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_incognito.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_lens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_lens.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_music.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_password.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_search.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_settings.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_share.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_weather.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_weather.png -------------------------------------------------------------------------------- /app/src/main/res/navigation/nav_settings.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/values-ar/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | مشغّل اختصارات Google 4 | الإعدادات 5 | المكتبة 6 | 7 | إدارة الاختصارات 8 | إعدادات الاختصارات 9 | أخرى 10 | حول 11 | 12 | الإصدار 13 | المطور 14 | مستودع الكود المصدري 15 | 16 | تم تفعيل مشغّل الاختصارات 17 | تم تعطيل مشغّل الاختصارات 18 | 19 | مدير الألعاب بالجهاز 20 | استخدم مدير الألعاب بالجهاز لتشغيل الألعاب بدلاً من مجلد ألعاب Google Play 21 | 22 | مدير كلمات المرور (روت) 23 | استخدم صلاحيات الروت لفتح نشاط مدير كلمات المرور في خدمات Google Play 24 | 25 | عرض الإعدادات في المشغّل 26 | للوصول إلى الإعدادات عند إخفائها، اضغط على لوحة البحث عن الموسيقى في لوحة الإعدادات السريعة 27 | 28 | أضف البحث عن الموسيقى في لوحة الإعدادات السريعة 29 | 30 | السمة 31 | 32 | اختصار المساعد الرقمي 33 | 34 | إعداد المساعد الرقمي 35 | تعيين مشغّل اختصارات Google كتطبيق مساعد رقمي افتراضي 36 | 37 | المكتبات 38 | تراخيص المصدر المفتوح 39 | 40 | البحث عن الموسيقى 41 | كلمات المرور 42 | بحث 43 | الطقس 44 | الألعاب 45 | المساعد 46 | Lens 47 | Quick Share 48 | الملفات 49 | متخفٍ 50 | بحث 51 | 52 | النشاط غير موجود. الرجاء تثبيت أو تفعيل تطبيق Google 53 | النشاط غير موجود. الرجاء تثبيت أو تفعيل خدمات Google Play 54 | النشاط غير موجود. الرجاء تثبيت أو تفعيل ألعاب Google Play 55 | لم يتم العثور على متصفح، الرجاء تثبيت أو تفعيل المتصفح 56 | مدير الألعاب غير مدعوم على هذا الجهاز 57 | الملفات غير مدعومة على هذا الجهاز 58 | امنح صلاحية الروت أولاً 59 | 60 | تمت الإضافة إلى الإعدادات السريعة بنجاح 61 | موجود بالفعل في الإعدادات السريعة 62 | 63 | اختر السمة 64 | 65 | افتراضي 66 | فاتح 67 | مظلم 68 | 69 | التحقق من التحديثات 70 | تحميل 71 | 72 | لا يوجد تحديث متاح 73 | تحديث جديد متاح: %s 74 | لا يوجد اتصال بالإنترنت 75 | حدث خطأ ما. الرجاء المحاولة لاحقاً 76 | 77 | تطبيق المساعد الرقمي الافتراضي 78 | في الإعدادات، اختر مشغّل اختصارات Google كتطبيق مساعد رقمي افتراضي لتشغيل الاختصار المحدد باستخدام الإيماءات أو الأزرار أو غيرها… 79 | إعداد الآن 80 | 81 | اختر اختصار 82 | غير قادر على التشغيل، فعّل هذا الاختصار من الإعدادات أولاً 83 | تم اختيار اختصار غير صالح 84 | 85 | -------------------------------------------------------------------------------- /app/src/main/res/values-ja/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Google ショートカットランチャー 4 | 設定 5 | ライブラリ 6 | 7 | ショートカットの管理 8 | ショートカットの設定 9 | その他 10 | アプリについて 11 | 12 | バージョン 13 | 開発者 14 | ソースコードのリポジトリ 15 | 16 | ショートカットランチャーは有効化されています。 17 | ショートカットランチャーは無効化されています。 18 | 19 | デバイスのゲームマネージャー 20 | Google ゲームフォルダの代わりにデバイス内のゲーム マネージャーを使用してゲームを起動します。 21 | 22 | パスワード マネージャー (root) 23 | root 権限を使用して、Google Play 開発者サービスからパスワード マネージャーのアクティビティを開きます。 24 | 25 | ランチャーで設定を表示 26 | 非表示になっている設定にアクセスするには音楽を検索のクイック設定パネルからアクセスしてください。 27 | 28 | 音楽を検索のパネルをクイック設定に追加 29 | 30 | テーマ 31 | 32 | デジタルアシスタントのショートカット 33 | 34 | デジタルアシスタントの設定 35 | Google ショートカットランチャーをデフォルトのデジタルアシスタントアプリとして設定する 36 | 37 | ライブラリ 38 | オープンソースライセンス 39 | 40 | 音楽を検索 41 | パスワード 42 | 検索 43 | 天気 44 | ゲーム 45 | アシスタント 46 | レンズ 47 | Quick Share 48 | ファイル 49 | シークレット 50 | 検索 51 | 52 | アクティビティが見つかりません。Google アプリをインストールするか有効化してください。 53 | アクティビティが見つかりません。Google Play Games をインストールするか有効化してください。 54 | アクティビティが見つかりません。Google Play サービスをインストールまたは有効にしてください 55 | ブラウザが見つかりません。ブラウザをインストールするか有効化してください。 56 | このデバイスではゲームマネージャーに非対応です。 57 | このデバイスでサポートされていないファイル 58 | 最初に root 権限を許可してください 59 | 60 | クイック設定に正常に追加されました 61 | クイック設定にすでに追加されています 62 | 63 | テーマを選択 64 | 65 | システムのデフォルト 66 | ライト 67 | ダーク 68 | 69 | アップデートを確認 70 | ダウンロード 71 | 72 | 利用可能なアップデートはありません 73 | 新しいアップデートが利用可能です: %s 74 | インターネット接続がありません 75 | 何か問題が発生しました。後でもう一度お試しください 76 | 77 | デフォルトのデジタルアシスタントアプリ 78 | 設定でGoogle ショートカットランチャーをデフォルトのデジタルアシスタントアプリとして選択すると、デバイスジェスチャー、ボタンなどで選択したショートカットをすばやく起動できます… 79 | 今すぐ設定 80 | 81 | ショートカットを選択 82 | 起動できません。まず設定でこのショートカットを有効にしてください 83 | 無効なショートカットが選択されました 84 | -------------------------------------------------------------------------------- /app/src/main/res/values-night-v31/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/values-v31/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/values-v33/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @string/theme_system 5 | @string/theme_light 6 | @string/theme_dark 7 | 8 | 9 | 10 | system 11 | light 12 | dark 13 | 14 | 15 | 16 | @string/files 17 | @string/games 18 | @string/lens 19 | @string/music_search_label 20 | @string/password 21 | @string/incognito 22 | @string/quick_share 23 | @string/search 24 | @string/weather 25 | 26 | 27 | 28 | files_shortcut 29 | games_shortcut 30 | lens_shortcut 31 | music_search_shortcut 32 | password_manager_shortcut 33 | incognito_shortcut 34 | quick_share_shortcut 35 | search_shortcut 36 | weather_shortcut 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 13 | 14 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 28 | 29 | 35 | -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | plugins { 3 | alias(libs.plugins.android.application) apply false 4 | alias(libs.plugins.kotlin.android) apply false 5 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. For more details, visit 12 | # https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app's APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Kotlin code style for this project: "official" or "obsolete": 19 | kotlin.code.style=official 20 | # Enables namespacing of each library's R class so that its R class includes only the 21 | # resources declared in the library itself and none from the library's dependencies, 22 | # thereby reducing the size of the R class for that library 23 | android.nonTransitiveRClass=true -------------------------------------------------------------------------------- /gradle/libs.versions.toml: -------------------------------------------------------------------------------- 1 | # versions.toml 2 | [versions] 3 | agp = "8.9.3" 4 | kotlin = "2.1.20" 5 | preference = "1.2.1" 6 | appcompat = "1.7.0" 7 | navigation = "2.9.0" 8 | material = "1.14.0-alpha01" 9 | aboutLibraries = "12.1.2" 10 | 11 | [libraries] 12 | androidx-preference = { group = "androidx.preference", name = "preference", version.ref = "preference" } 13 | androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } 14 | androidx-navigation = { group = "androidx.navigation", name = "navigation-fragment", version.ref = "navigation" } 15 | google-material = { group = "com.google.android.material", name = "material", version.ref = "material" } 16 | aboutlibraries-view = { module = "com.mikepenz:aboutlibraries", version.ref = "aboutLibraries" } 17 | 18 | [plugins] 19 | android-application = { id = "com.android.application", version.ref = "agp" } 20 | kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } 21 | aboutLibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "aboutLibraries" } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon May 05 22:35:11 BRT 2025 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /images/Screenshots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WSTxda/Google-Shortcuts-Launcher/c12b60956d4dbd447c590dad8194ee5cb29bba0e/images/Screenshots.png -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | @file:Suppress("UnstableApiUsage") 2 | 3 | pluginManagement { 4 | repositories { 5 | google { 6 | content { 7 | includeGroupByRegex("com\\.android.*") 8 | includeGroupByRegex("com\\.google.*") 9 | includeGroupByRegex("androidx.*") 10 | } 11 | } 12 | mavenCentral() 13 | gradlePluginPortal() 14 | } 15 | } 16 | dependencyResolutionManagement { 17 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 18 | repositories { 19 | google() 20 | mavenCentral() 21 | } 22 | } 23 | 24 | rootProject.name = "Google Shortcuts Launcher" 25 | include(":app") --------------------------------------------------------------------------------