├── .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 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/migrations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Google Shortcuts Launcher
2 | Easily access essential Google apps features directly from your launcher app drawer.
3 |
4 | [](https://github.com/WSTxda/Google-Shortcuts-Launcher/actions)
5 | [](https://www.android.com)
6 | [](https://developer.android.com/studio/releases/platforms)
7 | [](https://github.com/WSTxda/Google-Shortcuts-Launcher/releases/latest)
8 | [](https://github.com/WSTxda/Google-Shortcuts-Launcher/releases)
9 |
10 | 
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 | 
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 | [
](https://github.com/WSTxda/Google-Shortcuts-Launcher/releases/latest)
66 | [
](https://t.me/WSTprojects)
69 |
70 | ### Donate
71 |
72 | [
](https://bit.ly/2lV0E6u)
75 | [
](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")
--------------------------------------------------------------------------------