diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d81d7e6..cdc0dec 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -52,12 +52,20 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } + kotlinOptions { jvmTarget = JavaVersion.VERSION_17.toString() } + buildFeatures { + compose = true viewBinding = true dataBinding = true + buildConfig = true + } + + composeOptions { + kotlinCompilerExtensionVersion = "1.4.3" } applicationVariants.all { @@ -99,6 +107,8 @@ dependencies { implementation(libs.biometric.ktx) implementation(libs.room.ktx) implementation(libs.room.runtime) + implementation(libs.androidx.runtime.android) + implementation(libs.androidx.ui.android) //noinspection KaptUsageInsteadOfKsp kapt(libs.room.compiler) diff --git a/app/src/main/java/com/github/droidworksstudio/ktx/ContextExtensions.kt b/app/src/main/java/com/github/droidworksstudio/ktx/ContextExtensions.kt index 16a05f9..7c564c6 100644 --- a/app/src/main/java/com/github/droidworksstudio/ktx/ContextExtensions.kt +++ b/app/src/main/java/com/github/droidworksstudio/ktx/ContextExtensions.kt @@ -37,6 +37,7 @@ import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.LifecycleOwner import com.github.droidworksstudio.launcher.Constants import com.github.droidworksstudio.launcher.data.entities.AppInfo +import com.github.droidworksstudio.launcher.helper.PreferenceHelper import com.github.droidworksstudio.launcher.ui.activities.FakeHomeActivity import java.io.File import java.io.IOException @@ -290,8 +291,37 @@ fun Context.searchOnPlayStore(query: String? = null): Boolean { } } -fun Context.searchCustomSearchEngine(searchQuery: String? = null): Boolean { - val searchUrl = Constants.URL_GOOGLE_SEARCH +fun Context.searchCustomSearchEngine( + preferenceHelper: PreferenceHelper, + searchQuery: String? = null +): Boolean { + + val searchUrl = when (preferenceHelper.searchEngines) { + Constants.SearchEngines.Google -> { + Constants.URL_GOOGLE_SEARCH + } + + Constants.SearchEngines.Yahoo -> { + Constants.URL_YAHOO_SEARCH + } + + Constants.SearchEngines.DuckDuckGo -> { + Constants.URL_DUCK_SEARCH + } + + Constants.SearchEngines.Bing -> { + Constants.URL_BING_SEARCH + } + + Constants.SearchEngines.Brave -> { + Constants.URL_BRAVE_SEARCH + } + + Constants.SearchEngines.SwissCow -> { + Constants.URL_SWISSCOW_SEARCH + } + } + val encodedQuery = Uri.encode(searchQuery) val fullUrl = "$searchUrl$encodedQuery" Log.d("fullUrl", fullUrl) diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/Constants.kt b/app/src/main/java/com/github/droidworksstudio/launcher/Constants.kt index 8878973..d54f6c1 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/Constants.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/Constants.kt @@ -1,5 +1,7 @@ package com.github.droidworksstudio.launcher +import android.content.Context + object Constants { const val PACKAGE_NAME = "app.easy.launcher" const val PACKAGE_NAME_DEBUG = "$PACKAGE_NAME.debug" @@ -53,6 +55,7 @@ object Constants { const val TOGGLE_SETTING_LOCK = "TOGGLE_SETTING_LOCK" + const val SEARCH_ENGINE = "SEARCH_ENGINE" const val URL_DUCK_SEARCH = "https://duckduckgo.com/?q=" const val URL_GOOGLE_SEARCH = "https://google.com/search?q=" const val URL_YAHOO_SEARCH = "https://search.yahoo.com/search?p=" @@ -65,4 +68,24 @@ object Constants { const val APP_WIDGET_HOST_ID = 1024 const val TRIPLE_TAP_DELAY_MS = 300 const val LONG_PRESS_DELAY_MS = 500 + + enum class SearchEngines { + Google, + Yahoo, + DuckDuckGo, + Bing, + Brave, + SwissCow; + + fun getString(context: Context): String { + return when (this) { + Google -> context.getString(R.string.search_google) + Yahoo -> context.getString(R.string.search_yahoo) + DuckDuckGo -> context.getString(R.string.search_duckduckgo) + Bing -> context.getString(R.string.search_bing) + Brave -> context.getString(R.string.search_brave) + SwissCow -> context.getString(R.string.search_swisscow) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/helper/AppHelper.kt b/app/src/main/java/com/github/droidworksstudio/launcher/helper/AppHelper.kt index f2f0e84..960eb7c 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/helper/AppHelper.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/helper/AppHelper.kt @@ -16,19 +16,20 @@ import android.view.Window import android.view.WindowInsets import android.widget.TextView import androidx.appcompat.widget.LinearLayoutCompat +import androidx.fragment.app.viewModels import com.github.droidworksstudio.ktx.backupSharedPreferences import com.github.droidworksstudio.ktx.restoreSharedPreferences -//import com.github.droidworksstudio.ktx.backupSharedPreferences -//import com.github.droidworksstudio.ktx.restoreSharedPreferences import com.github.droidworksstudio.ktx.showLongToast import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.github.droidworksstudio.launcher.Constants import com.github.droidworksstudio.launcher.R import com.github.droidworksstudio.launcher.accessibility.ActionService +import com.github.droidworksstudio.launcher.viewmodel.PreferenceViewModel import java.util.Calendar import javax.inject.Inject class AppHelper @Inject constructor() { + @SuppressLint("WrongConstant", "PrivateApi") fun expandNotificationDrawer(context: Context) { try { diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/helper/PreferenceHelper.kt b/app/src/main/java/com/github/droidworksstudio/launcher/helper/PreferenceHelper.kt index b78804d..acbd44d 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/helper/PreferenceHelper.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/helper/PreferenceHelper.kt @@ -84,7 +84,7 @@ class PreferenceHelper @Inject constructor(@ApplicationContext context: Context) var homeDailyWordAlignment: Int get() = prefs.getInt(Constants.HOME_DAILY_WORD_ALIGNMENT, Gravity.START) - set(value) = prefs.edit().putInt(Constants.HOME_DAILY_WORD_ALIGNMENT,value).apply() + set(value) = prefs.edit().putInt(Constants.HOME_DAILY_WORD_ALIGNMENT, value).apply() var batteryTextSize: Float get() = prefs.getFloat(Constants.BATTERY_TEXT_SIZE, 12f) @@ -121,4 +121,19 @@ class PreferenceHelper @Inject constructor(@ApplicationContext context: Context) var swipeSearch: Boolean get() = prefs.getBoolean(Constants.SWIPE_SEARCH, false) set(value) = prefs.edit().putBoolean(Constants.SWIPE_SEARCH, value).apply() + + var searchEngines: Constants.SearchEngines + get() { + return try { + Constants.SearchEngines.valueOf( + prefs.getString( + Constants.SEARCH_ENGINE, + Constants.SearchEngines.Google.name + ).toString() + ) + } catch (_: Exception) { + Constants.SearchEngines.Google + } + } + set(value) = prefs.edit().putString(Constants.SEARCH_ENGINE, value.name).apply() } \ No newline at end of file diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/drawer/DrawFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/drawer/DrawFragment.kt index 3f21a37..511eaeb 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/drawer/DrawFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/drawer/DrawFragment.kt @@ -125,7 +125,7 @@ class DrawFragment : Fragment(), if (trimmedQuery.isNotEmpty()) { if (trimmedQuery.startsWith("!")) { val searchQuery = trimmedQuery.substringAfter("!") - requireContext().searchCustomSearchEngine(searchQuery) + requireContext().searchCustomSearchEngine(preferenceHelper, searchQuery) } else { checkAppThenRun(trimmedQuery) return true // Exit the function diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/settings/SettingsFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/settings/SettingsFragment.kt index 4486028..fa44e9a 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/settings/SettingsFragment.kt @@ -13,6 +13,7 @@ import androidx.navigation.NavController import androidx.navigation.fragment.findNavController import com.github.droidworksstudio.ktx.resetDefaultLauncher import com.github.droidworksstudio.ktx.restartApp +import com.github.droidworksstudio.launcher.Constants import com.github.droidworksstudio.launcher.R import com.github.droidworksstudio.launcher.databinding.FragmentSettingsBinding import com.github.droidworksstudio.launcher.helper.AppHelper @@ -24,6 +25,7 @@ import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.ColorBottomShee import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.PaddingBottomSheetDialogFragment import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.TextBottomSheetDialogFragment import com.github.droidworksstudio.launcher.viewmodel.PreferenceViewModel +import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -76,6 +78,9 @@ class SettingsFragment : Fragment(), getString(R.string.app_name), packageInfo.versionName ) + + val searchEngine = preferenceHelper.searchEngines.toString() + binding.searchEngineText.text = searchEngine } @SuppressLint("SetTextI18n") @@ -138,6 +143,10 @@ class SettingsFragment : Fragment(), bottomSheetFragment.show(parentFragmentManager, "BottomSheetDialog") } + binding.miscellaneousSearchEngine.setOnClickListener { + showSearchEngineDialog() + } + binding.shareView.setOnClickListener { appHelper.shareAppButton(requireContext()) } @@ -161,6 +170,7 @@ class SettingsFragment : Fragment(), } } + private fun setupSwitchListeners() { binding.statueBarSwitchCompat.setOnCheckedChangeListener { _, isChecked -> preferenceViewModel.setShowStatusBar(isChecked) @@ -234,4 +244,51 @@ class SettingsFragment : Fragment(), } } + + private fun showSearchEngineDialog() { + // Get the array of SearchEngines enum values + val items = Constants.SearchEngines.values() + + // Map the enum values to their string representations + val itemStrings = items.map { it.getString(context) }.toTypedArray() + + val dialog = MaterialAlertDialogBuilder(context) + + dialog.setTitle("Select a Search Engine") + dialog.setItems(itemStrings) { _, which -> + val selectedItem = items[which] + when (selectedItem) { + Constants.SearchEngines.Google -> { + preferenceViewModel.setSearchEngine(Constants.SearchEngines.Google) + binding.searchEngineText.text = preferenceHelper.searchEngines.name + } + + Constants.SearchEngines.Bing -> { + preferenceViewModel.setSearchEngine(Constants.SearchEngines.Bing) + binding.searchEngineText.text = preferenceHelper.searchEngines.name + } + + Constants.SearchEngines.Brave -> { + preferenceViewModel.setSearchEngine(Constants.SearchEngines.Brave) + binding.searchEngineText.text = preferenceHelper.searchEngines.name + } + + Constants.SearchEngines.Yahoo -> { + preferenceViewModel.setSearchEngine(Constants.SearchEngines.Yahoo) + binding.searchEngineText.text = preferenceHelper.searchEngines.name + } + + Constants.SearchEngines.DuckDuckGo -> { + preferenceViewModel.setSearchEngine(Constants.SearchEngines.DuckDuckGo) + binding.searchEngineText.text = preferenceHelper.searchEngines.name + } + + Constants.SearchEngines.SwissCow -> { + preferenceViewModel.setSearchEngine(Constants.SearchEngines.SwissCow) + binding.searchEngineText.text = preferenceHelper.searchEngines.name + } + } + } + dialog.show() + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/viewmodel/PreferenceViewModel.kt b/app/src/main/java/com/github/droidworksstudio/launcher/viewmodel/PreferenceViewModel.kt index 9f1499b..5c16178 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/viewmodel/PreferenceViewModel.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/viewmodel/PreferenceViewModel.kt @@ -2,14 +2,15 @@ package com.github.droidworksstudio.launcher.viewmodel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import com.github.droidworksstudio.launcher.Constants import com.github.droidworksstudio.launcher.helper.PreferenceHelper import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel class PreferenceViewModel @Inject constructor( - private val preferenceHelper: PreferenceHelper) - : ViewModel() { + private val preferenceHelper: PreferenceHelper +) : ViewModel() { private val firstLaunchLiveData: MutableLiveData = MutableLiveData() val showStatusBarLiveData: MutableLiveData = MutableLiveData() @@ -39,6 +40,8 @@ class PreferenceViewModel @Inject constructor( private val lockSettingsLiveData: MutableLiveData = MutableLiveData() private val appPaddingSizeLiveData: MutableLiveData = MutableLiveData() + private val searchEngineLiveData: MutableLiveData = MutableLiveData() + fun setFirstLaunch(firstLaunch: Boolean) { preferenceHelper.firstLaunch = firstLaunch firstLaunchLiveData.postValue(preferenceHelper.firstLaunch) @@ -59,7 +62,7 @@ class PreferenceViewModel @Inject constructor( showDateLiveData.postValue(preferenceHelper.showDate) } - fun setShowBattery(showBattery: Boolean){ + fun setShowBattery(showBattery: Boolean) { preferenceHelper.showBattery = showBattery showBatteryLiveData.postValue(preferenceHelper.showBattery) } @@ -94,7 +97,7 @@ class PreferenceViewModel @Inject constructor( timeColorLiveData.postValue(preferenceHelper.timeColor) } - fun setBatteryColor(batteryColor: Int){ + fun setBatteryColor(batteryColor: Int) { preferenceHelper.batteryColor = batteryColor batteryColorLiveData.postValue(preferenceHelper.batteryColor) } @@ -144,33 +147,38 @@ class PreferenceViewModel @Inject constructor( appPaddingSizeLiveData.postValue(preferenceHelper.homeAppPadding) } - fun setDoubleTapLock(tapLockScreen: Boolean){ + fun setDoubleTapLock(tapLockScreen: Boolean) { preferenceHelper.tapLockScreen = tapLockScreen tapLockScreenLiveData.postValue((preferenceHelper.tapLockScreen)) } - fun setSwipeNotification(swipeNotification: Boolean){ + fun setSwipeNotification(swipeNotification: Boolean) { preferenceHelper.swipeNotification = swipeNotification swipeNotificationLiveData.postValue((preferenceHelper.swipeNotification)) } - fun setSwipeSearch(swipeSearch: Boolean){ + fun setSwipeSearch(swipeSearch: Boolean) { preferenceHelper.swipeSearch = swipeSearch swipeSearchLiveData.postValue((preferenceHelper.swipeSearch)) } - fun setAutoKeyboard(autoKeyboard: Boolean){ + fun setAutoKeyboard(autoKeyboard: Boolean) { preferenceHelper.automaticKeyboard = autoKeyboard autoKeyboardLiveData.postValue((preferenceHelper.automaticKeyboard)) } - fun setAutoOpenApp(autoOpenApp: Boolean){ + fun setAutoOpenApp(autoOpenApp: Boolean) { preferenceHelper.automaticOpenApp = autoOpenApp autoOpenAppsLiveData.postValue((preferenceHelper.automaticOpenApp)) } - fun setLockSettings(lockSettings: Boolean){ + fun setLockSettings(lockSettings: Boolean) { preferenceHelper.settingsLock = lockSettings lockSettingsLiveData.postValue((preferenceHelper.settingsLock)) } + + fun setSearchEngine(searchEngine: Constants.SearchEngines) { + preferenceHelper.searchEngines = searchEngine + searchEngineLiveData.postValue((preferenceHelper.searchEngines)) + } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index c920c5e..6a854c8 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -680,6 +680,54 @@ + + + + + + + + + + + + + + Time Style App Manage Gestures + Miscellaneous Backups Others @@ -79,6 +80,8 @@ Swipe down expand notification Swipe up open search view + Search Engine + Share Feedback Github diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ec5371b..93a365c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,15 +1,15 @@ [versions] agp = "8.4.1" -kotlin = "2.0.0" +kotlin = "1.8.10" coreKtx = "1.13.1" junit = "4.13.2" junitVersion = "1.1.5" espressoCore = "3.5.1" -appcompat = "1.6.1" +appcompat = "1.7.0" material = "1.12.0" constraintlayout = "2.1.4" navigation = "2.7.7" -lifecycle = "2.8.0" +lifecycle = "2.8.1" dagger = "2.51.1" work = "2.9.0" recyclerview = "1.3.2" @@ -17,6 +17,8 @@ preference = "1.2.1" room = "2.6.1" biometric = "1.2.0-alpha05" color-chooser = "0.7.3" +runtimeAndroid = "1.6.7" +uiAndroid = "1.6.7" [libraries] core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -46,6 +48,8 @@ dagger-hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", ve junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } +androidx-runtime-android = { group = "androidx.compose.runtime", name = "runtime-android", version.ref = "runtimeAndroid" } +androidx-ui-android = { group = "androidx.compose.ui", name = "ui-android", version.ref = "uiAndroid" } [plugins]