diff --git a/app/src/main/java/com/github/droidworksstudio/common/ContextExtensions.kt b/app/src/main/java/com/github/droidworksstudio/common/ContextExtensions.kt index 5844aaf..038bca9 100644 --- a/app/src/main/java/com/github/droidworksstudio/common/ContextExtensions.kt +++ b/app/src/main/java/com/github/droidworksstudio/common/ContextExtensions.kt @@ -501,4 +501,15 @@ fun Context.isPackageInstalled( val launcher = getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps val activityInfo = launcher.getActivityList(packageName, userHandle) return activityInfo.size > 0 +} + +fun Context.getAppNameFromPackageName(packageName: String): String? { + val packageManager = this.packageManager + return try { + val appInfo = packageManager.getApplicationInfo(packageName, 0) + packageManager.getApplicationLabel(appInfo) as String + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + null + } } \ No newline at end of file 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 efd75cf..3662cc7 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 @@ -188,6 +188,26 @@ class PreferenceHelper @Inject constructor(@ApplicationContext context: Context) get() = loadAction(Constants.DOUBLE_TAP_ACTION, Constants.Action.LockScreen) set(value) = storeAction(Constants.DOUBLE_TAP_ACTION, value) + var swipeUpApp: String + get() = prefs.getString(Constants.SWIPE_UP_APP, "").toString() + set(value) = prefs.edit().putString(Constants.SWIPE_UP_APP, value).apply() + + var swipeDownApp: String + get() = prefs.getString(Constants.SWIPE_DOWN_APP, "").toString() + set(value) = prefs.edit().putString(Constants.SWIPE_DOWN_APP, value).apply() + + var swipeLeftApp: String + get() = prefs.getString(Constants.SWIPE_LEFT_APP, "").toString() + set(value) = prefs.edit().putString(Constants.SWIPE_LEFT_APP, value).apply() + + var swipeRightApp: String + get() = prefs.getString(Constants.SWIPE_RIGHT_APP, "").toString() + set(value) = prefs.edit().putString(Constants.SWIPE_RIGHT_APP, value).apply() + + var doubleTapApp: String + get() = prefs.getString(Constants.DOUBLE_TAP_APP, "").toString() + set(value) = prefs.edit().putString(Constants.DOUBLE_TAP_APP, value).apply() + var weatherUnits: Constants.Units get() { return try { diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt index 35b70a5..2fe200f 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt @@ -5,6 +5,7 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter +import android.content.pm.PackageManager import android.os.BatteryManager import android.os.Build import android.os.Bundle @@ -25,6 +26,7 @@ import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.github.droidworksstudio.common.hasInternetPermission import com.github.droidworksstudio.common.hideKeyboard +import com.github.droidworksstudio.common.isPackageInstalled import com.github.droidworksstudio.common.launchApp import com.github.droidworksstudio.common.launchCalendar import com.github.droidworksstudio.common.launchClock @@ -337,10 +339,48 @@ class HomeFragment : Fragment(), } } + private fun openApp(packageName: String) { + val context = binding.root.context + val pm: PackageManager = context.packageManager + val intent = pm.getLaunchIntentForPackage(packageName) + if (intent != null) { + context.startActivity(intent) + } else { + Log.e("HomeViewHolder", "Unable to find app with package name: $packageName") + } + } + @RequiresApi(Build.VERSION_CODES.P) private fun handleOtherAction(action: Constants.Action, actionType: Constants.Swipe) { when (action) { -// Constants.Action.OpenApp -> {} + Constants.Action.OpenApp -> { + when (actionType) { + Constants.Swipe.DoubleTap, + Constants.Swipe.Up, + Constants.Swipe.Down, + Constants.Swipe.Left, + Constants.Swipe.Right -> { + val packageName = when (actionType) { + Constants.Swipe.DoubleTap -> preferenceHelper.doubleTapApp + Constants.Swipe.Up -> preferenceHelper.swipeUpApp + Constants.Swipe.Down -> preferenceHelper.swipeDownApp + Constants.Swipe.Left -> preferenceHelper.swipeLeftApp + Constants.Swipe.Right -> preferenceHelper.swipeRightApp + } + + if (packageName.isNotEmpty()) { + if (context.isPackageInstalled(packageName)) { + openApp(packageName) + } else { + Log.e("HomeViewHolder", "App $packageName is not installed") + context.showLongToast("App $packageName is not installed") + } + } else { + Log.e("HomeViewHolder", "No package name found in preferences") + } + } + } + } Constants.Action.LockScreen -> { ActionService.runAccessibilityMode(context) 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 98f7162..0bee26f 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 @@ -9,11 +9,14 @@ import android.os.Looper import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController import androidx.navigation.fragment.findNavController +import com.github.droidworksstudio.common.getAppNameFromPackageName import com.github.droidworksstudio.common.resetDefaultLauncher import com.github.droidworksstudio.launcher.utils.Constants import com.github.droidworksstudio.launcher.R @@ -24,6 +27,7 @@ import com.github.droidworksstudio.launcher.helper.AppReloader import com.github.droidworksstudio.launcher.helper.PreferenceHelper import com.github.droidworksstudio.launcher.listener.OnSwipeTouchListener import com.github.droidworksstudio.launcher.listener.ScrollEventListener +import com.github.droidworksstudio.launcher.repository.AppInfoRepository import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.AlignmentBottomSheetDialogFragment import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.ColorBottomSheetDialogFragment import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.PaddingBottomSheetDialogFragment @@ -31,6 +35,8 @@ import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.TextBottomSheet import com.github.droidworksstudio.launcher.viewmodel.PreferenceViewModel import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import javax.inject.Inject @AndroidEntryPoint @@ -45,6 +51,9 @@ class SettingsFragment : Fragment(), @Inject lateinit var preferenceHelper: PreferenceHelper + @Inject + lateinit var appInfoRepository: AppInfoRepository + @Inject lateinit var appHelper: AppHelper @@ -86,11 +95,27 @@ class SettingsFragment : Fragment(), binding.miscellaneousSearchEngineControl.text = preferenceHelper.searchEngines.getString(context) binding.miscellaneousLauncherFontsControl.text = preferenceHelper.launcherFont.getString(context) - binding.gesturesDoubleTapControl.text = preferenceHelper.doubleTapAction.getString(context) - binding.gesturesSwipeUpControl.text = preferenceHelper.swipeUpAction.getString(context) - binding.gesturesSwipeDownControl.text = preferenceHelper.swipeDownAction.getString(context) - binding.gesturesSwipeLeftControl.text = preferenceHelper.swipeLeftAction.getString(context) - binding.gesturesSwipeRightControl.text = preferenceHelper.swipeRightAction.getString(context) + updateGestureControlText(context, preferenceHelper.doubleTapAction, preferenceHelper.doubleTapApp, binding.gesturesDoubleTapControl) + updateGestureControlText(context, preferenceHelper.swipeUpAction, preferenceHelper.swipeUpApp, binding.gesturesSwipeUpControl) + updateGestureControlText(context, preferenceHelper.swipeDownAction, preferenceHelper.swipeDownApp, binding.gesturesSwipeDownControl) + updateGestureControlText(context, preferenceHelper.swipeLeftAction, preferenceHelper.swipeLeftApp, binding.gesturesSwipeLeftControl) + updateGestureControlText(context, preferenceHelper.swipeRightAction, preferenceHelper.swipeRightApp, binding.gesturesSwipeRightControl) + } + + // Function to update UI text based on action and app name + private fun updateGestureControlText( + context: Context, + action: Constants.Action, + appPackageName: String?, + textView: TextView + ) { + val appName = appPackageName?.let { context.getAppNameFromPackageName(it) } + val actionText = if (action == Constants.Action.OpenApp) { + context.getString(R.string.settings_actions_open_app_run, appName) + } else { + action.getString(context) + } + textView.text = actionText } @SuppressLint("SetTextI18n") @@ -320,6 +345,65 @@ class SettingsFragment : Fragment(), searchEngineDialog?.dismiss() } + private fun showAppSelectionDialog(swipeType: Constants.Swipe) { + // Make sure this method is called within a lifecycle owner scope + lifecycleScope.launch(Dispatchers.Main) { + // Collect the flow of installed apps + appInfoRepository.getDrawApps().collect { installedApps -> + // Extract app names and package names + val appNames = installedApps.map { it.appName }.toTypedArray() + val packageNames = installedApps.map { it.packageName } + + // Build and display the dialog + val builder = AlertDialog.Builder(binding.root.context) + builder.setTitle("Select an App") + builder.setItems(appNames) { _, which -> + val selectedPackageName = packageNames[which] + when (swipeType) { + Constants.Swipe.DoubleTap, + Constants.Swipe.Up, + Constants.Swipe.Down, + Constants.Swipe.Left, + Constants.Swipe.Right -> handleSwipeAction(swipeType, selectedPackageName) + } + + } + builder.show() + } + } + } + + private fun handleSwipeAction(swipeType: Constants.Swipe, selectedPackageName: String) { + val selectedApp = context.getAppNameFromPackageName(selectedPackageName) + + when (swipeType) { + Constants.Swipe.DoubleTap -> { + binding.gesturesDoubleTapControl.text = "Open $selectedApp" + preferenceHelper.doubleTapApp = selectedPackageName + } + + Constants.Swipe.Up -> { + binding.gesturesSwipeUpControl.text = "Open $selectedApp" + preferenceHelper.swipeUpApp = selectedPackageName + } + + Constants.Swipe.Down -> { + binding.gesturesSwipeDownControl.text = "Open $selectedApp" + preferenceHelper.swipeDownApp = selectedPackageName + } + + Constants.Swipe.Left -> { + binding.gesturesSwipeLeftControl.text = "Open $selectedApp" + preferenceHelper.swipeLeftApp = selectedPackageName + } + + Constants.Swipe.Right -> { + binding.gesturesSwipeRightControl.text = "Open $selectedApp" + preferenceHelper.swipeRightApp = selectedPackageName + } + } + } + private fun swipeActionClickEvent(swipe: Constants.Swipe) { // Get the array of Action enum values @@ -333,45 +417,66 @@ class SettingsFragment : Fragment(), dialog.setItems(actionStrings) { _, which -> val selectedAction = actions[which] when (swipe) { - Constants.Swipe.DoubleTap -> { - preferenceViewModel.setDoubleTap(selectedAction) - binding.gesturesDoubleTapControl.text = - preferenceHelper.doubleTapAction.getString(context) - } - - Constants.Swipe.Up -> { - preferenceViewModel.setSwipeUp(selectedAction) - binding.gesturesSwipeUpControl.text = - preferenceHelper.swipeUpAction.getString(context) - - } - - Constants.Swipe.Down -> { - preferenceViewModel.setSwipeDown(selectedAction) - binding.gesturesSwipeDownControl.text = - preferenceHelper.swipeDownAction.getString(context) - - } - - Constants.Swipe.Left -> { - preferenceViewModel.setSwipeLeft(selectedAction) - binding.gesturesSwipeLeftControl.text = - preferenceHelper.swipeLeftAction.getString(context) - - } - - Constants.Swipe.Right -> { - preferenceViewModel.setSwipeRight(selectedAction) - binding.gesturesSwipeRightControl.text = - preferenceHelper.swipeRightAction.getString(context) - - } - + Constants.Swipe.DoubleTap -> handleSwipeAction(context, Constants.Swipe.DoubleTap, selectedAction, binding) + Constants.Swipe.Up -> handleSwipeAction(context, Constants.Swipe.Up, selectedAction, binding) + Constants.Swipe.Down -> handleSwipeAction(context, Constants.Swipe.Down, selectedAction, binding) + Constants.Swipe.Left -> handleSwipeAction(context, Constants.Swipe.Left, selectedAction, binding) + Constants.Swipe.Right -> handleSwipeAction(context, Constants.Swipe.Right, selectedAction, binding) } } dialog.show() } + // Function to handle setting action and updating UI + private fun handleSwipeAction(context: Context, swipe: Constants.Swipe, action: Constants.Action, binding: FragmentSettingsBinding) { + preferenceViewModel.setSwipeAction(swipe, action) + + when (action) { + Constants.Action.OpenApp -> { + val selectedApp = when (swipe) { + Constants.Swipe.DoubleTap -> context.getAppNameFromPackageName(preferenceHelper.doubleTapApp) + Constants.Swipe.Up -> context.getAppNameFromPackageName(preferenceHelper.swipeUpApp) + Constants.Swipe.Down -> context.getAppNameFromPackageName(preferenceHelper.swipeDownApp) + Constants.Swipe.Left -> context.getAppNameFromPackageName(preferenceHelper.swipeLeftApp) + Constants.Swipe.Right -> context.getAppNameFromPackageName(preferenceHelper.swipeRightApp) + } + binding.apply { + when (swipe) { + Constants.Swipe.DoubleTap -> gesturesDoubleTapControl.text = "Open $selectedApp" + Constants.Swipe.Up -> gesturesSwipeUpControl.text = "Open $selectedApp" + Constants.Swipe.Down -> gesturesSwipeDownControl.text = "Open $selectedApp" + Constants.Swipe.Left -> gesturesSwipeLeftControl.text = "Open $selectedApp" + Constants.Swipe.Right -> gesturesSwipeRightControl.text = "Open $selectedApp" + } + } + showAppSelectionDialog(swipe) + } + + else -> { + binding.apply { + when (swipe) { + Constants.Swipe.DoubleTap -> gesturesDoubleTapControl.text = preferenceHelper.doubleTapAction.getString(context) + Constants.Swipe.Up -> gesturesSwipeUpControl.text = preferenceHelper.swipeUpAction.getString(context) + Constants.Swipe.Down -> gesturesSwipeDownControl.text = preferenceHelper.swipeDownAction.getString(context) + Constants.Swipe.Left -> gesturesSwipeLeftControl.text = preferenceHelper.swipeLeftAction.getString(context) + Constants.Swipe.Right -> gesturesSwipeRightControl.text = preferenceHelper.swipeRightAction.getString(context) + } + } + } + } + } + + // Extension function to set swipe action in ViewModel + private fun PreferenceViewModel.setSwipeAction(swipe: Constants.Swipe, action: Constants.Action) { + when (swipe) { + Constants.Swipe.DoubleTap -> setDoubleTap(action) + Constants.Swipe.Up -> setSwipeUp(action) + Constants.Swipe.Down -> setSwipeDown(action) + Constants.Swipe.Left -> setSwipeLeft(action) + Constants.Swipe.Right -> setSwipeRight(action) + } + } + override fun onStop() { super.onStop() dismissDialogs() diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/utils/Constants.kt b/app/src/main/java/com/github/droidworksstudio/launcher/utils/Constants.kt index a933588..8b79435 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/utils/Constants.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/utils/Constants.kt @@ -106,13 +106,18 @@ object Constants { } const val SWIPE_UP_ACTION = "SWIPE_UP_ACTION" + const val SWIPE_UP_APP = "SWIPE_UP_APP" const val SWIPE_DOWN_ACTION = "SWIPE_DOWN_ACTION" + const val SWIPE_DOWN_APP = "SWIPE_DOWN_APP" const val SWIPE_LEFT_ACTION = "SWIPE_LEFT_ACTION" + const val SWIPE_LEFT_APP = "SWIPE_LEFT_APP" const val SWIPE_RIGHT_ACTION = "SWIPE_RIGHT_ACTION" + const val SWIPE_RIGHT_APP = "SWIPE_RIGHT_APP" const val DOUBLE_TAP_ACTION = "DOUBLE_TAP_ACTION" + const val DOUBLE_TAP_APP = "DOUBLE_TAP_APP" enum class Action { - // OpenApp, + OpenApp, LockScreen, ShowNotification, ShowAppList, @@ -127,7 +132,7 @@ object Constants { fun getString(context: Context): String { return when (this) { -// OpenApp -> context.getString(R.string.settings_actions_open_app) + OpenApp -> context.getString(R.string.settings_actions_open_app) LockScreen -> context.getString(R.string.settings_actions_lock_screen) ShowNotification -> context.getString(R.string.settings_actions_show_notifications) ShowAppList -> context.getString(R.string.settings_actions_show_app_list) @@ -145,10 +150,10 @@ object Constants { enum class Swipe { DoubleTap, - Left, - Right, Up, - Down; + Down, + Left, + Right; } enum class Units { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2ef854f..48b0260 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -102,6 +102,7 @@ Preferences restored. Restarting. Open App + Open %s Lock Screen Show Notifications Show Apps List