diff --git a/README.md b/README.md
index e141590..9e8a3e1 100644
--- a/README.md
+++ b/README.md
@@ -10,6 +10,8 @@ This is a fork of [finnmglas's app Launcher][original-repo].
## Notable changes:
+* Edge gestures: There is a setting to allow distinguishing swiping at the edges of the screen from swiping in the center.
+
### Visual
* This app uses the system wallpaper instead of rolling a custom solution.
* The font has been changed to [Hack][hack-font].
@@ -26,6 +28,7 @@ This is a fork of [finnmglas's app Launcher][original-repo].
* Different apps set as default.
* Package name was changed to `de.jrpie.android.launcher` to avoid clashing with the original app.
* Dropped support for API < 21 (i.e. pre Lollypop)
+* Some refactoring
---
---
[hack-font]: https://sourcefoundry.org/hack/
diff --git a/app/build.gradle b/app/build.gradle
index 32bf184..bf97889 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,8 +10,8 @@ android {
applicationId "de.jrpie.android.launcher"
minSdkVersion 21
targetSdkVersion 35
- versionCode 14
- versionName "j-alpha-0.2"
+ versionCode 15
+ versionName "j-alpha-0.3"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json
index e44f2e5..0ef8bfc 100644
--- a/app/release/output-metadata.json
+++ b/app/release/output-metadata.json
@@ -11,8 +11,8 @@
"type": "SINGLE",
"filters": [],
"attributes": [],
- "versionCode": 14,
- "versionName": "j-alpha-0.2",
+ "versionCode": 15,
+ "versionName": "j-alpha-0.3",
"outputFile": "app-release.apk"
}
],
diff --git a/app/src/main/java/de/jrpie/android/launcher/Functions.kt b/app/src/main/java/de/jrpie/android/launcher/Functions.kt
index d4f1ac2..72f2075 100644
--- a/app/src/main/java/de/jrpie/android/launcher/Functions.kt
+++ b/app/src/main/java/de/jrpie/android/launcher/Functions.kt
@@ -50,6 +50,7 @@ const val PREF_SCREEN_FULLSCREEN = "useFullScreen"
const val PREF_DATE_FORMAT = "dateFormat"
const val PREF_DOUBLE_ACTIONS_ENABLED = "enableDoubleActions"
+const val PREF_EDGE_ACTIONS_ENABLED = "enableEdgeActions"
const val PREF_SEARCH_AUTO_LAUNCH = "searchAutoLaunch"
const val PREF_SEARCH_AUTO_KEYBOARD = "searchAutoKeyboard"
diff --git a/app/src/main/java/de/jrpie/android/launcher/Gesture.kt b/app/src/main/java/de/jrpie/android/launcher/Gesture.kt
index ecacd3d..8d70340 100644
--- a/app/src/main/java/de/jrpie/android/launcher/Gesture.kt
+++ b/app/src/main/java/de/jrpie/android/launcher/Gesture.kt
@@ -21,14 +21,26 @@ enum class Gesture (val id: String, private val labelResource: Int,
LONG_CLICK("action_longClickApp", R.string.settings_gesture_long_click, R.array.default_long_click, 0,0),
DOUBLE_CLICK("action_doubleClickApp", R.string.settings_gesture_double_click, R.array.default_double_click,0,0),
SWIPE_UP("action_upApp", R.string.settings_gesture_up, R.array.default_up, R.anim.bottom_up),
+ SWIPE_UP_LEFT_EDGE("action_up_leftApp", R.string.settings_gesture_up_left_edge, R.array.default_up_left, R.anim.bottom_up),
+ SWIPE_UP_RIGHT_EDGE("action_up_rightApp", R.string.settings_gesture_up_right_edge, R.array.default_up_right, R.anim.bottom_up),
SWIPE_UP_DOUBLE( "action_doubleUpApp", R.string.settings_gesture_double_up, R.array.default_double_up, R.anim.bottom_up),
SWIPE_DOWN("action_downApp", R.string.settings_gesture_down, R.array.default_down, R.anim.top_down),
+ SWIPE_DOWN_LEFT_EDGE("action_down_leftApp", R.string.settings_gesture_down_left_edge, R.array.default_down_left, R.anim.top_down),
+ SWIPE_DOWN_RIGHT_EDGE("action_down_rightApp", R.string.settings_gesture_down_right_edge, R.array.default_down_right, R.anim.top_down),
SWIPE_DOWN_DOUBLE("action_doubleDownApp", R.string.settings_gesture_double_down, R.array.default_double_down, R.anim.top_down),
SWIPE_LEFT("action_leftApp", R.string.settings_gesture_left, R.array.default_left, R.anim.right_left),
+ SWIPE_LEFT_TOP_EDGE("action_left_topApp", R.string.settings_gesture_left_top_edge, R.array.default_left_top, R.anim.right_left),
+ SWIPE_LEFT_BOTTOM_EDGE("action_left_bottomApp", R.string.settings_gesture_left_bottom_edge, R.array.default_left_bottom, R.anim.right_left),
SWIPE_LEFT_DOUBLE("action_doubleLeftApp", R.string.settings_gesture_double_left, R.array.default_double_left, R.anim.right_left),
SWIPE_RIGHT("action_rightApp", R.string.settings_gesture_right, R.array.default_right, R.anim.left_right),
+ SWIPE_RIGHT_TOP_EDGE("action_right_topApp", R.string.settings_gesture_right_top_edge, R.array.default_right_top, R.anim.left_right),
+ SWIPE_RIGHT_BOTTOM_EDGE("action_right_bottomApp", R.string.settings_gesture_right_bottom_edge, R.array.default_right_bottom, R.anim.left_right),
SWIPE_RIGHT_DOUBLE("action_doubleRightApp", R.string.settings_gesture_double_right, R.array.default_double_right, R.anim.left_right);
+ enum class Edge{
+ TOP, BOTTOM, LEFT, RIGHT
+ }
+
fun getApp(context: Context): String {
return getPreferences(context).getString(this.id, "")!!
}
@@ -66,6 +78,35 @@ enum class Gesture (val id: String, private val labelResource: Int,
}
}
+ fun getEdgeVariant(edge: Edge): Gesture {
+ return when(edge) {
+ Edge.TOP ->
+ when(this) {
+ SWIPE_LEFT -> SWIPE_LEFT_TOP_EDGE
+ SWIPE_RIGHT -> SWIPE_RIGHT_TOP_EDGE
+ else -> this
+ }
+ Edge.BOTTOM ->
+ when(this) {
+ SWIPE_LEFT -> SWIPE_LEFT_BOTTOM_EDGE
+ SWIPE_RIGHT -> SWIPE_RIGHT_BOTTOM_EDGE
+ else -> this
+ }
+ Edge.LEFT ->
+ when(this) {
+ SWIPE_UP -> SWIPE_UP_LEFT_EDGE
+ SWIPE_DOWN -> SWIPE_DOWN_LEFT_EDGE
+ else -> this
+ }
+ Edge.RIGHT ->
+ when(this) {
+ SWIPE_UP -> SWIPE_UP_RIGHT_EDGE
+ SWIPE_DOWN -> SWIPE_DOWN_RIGHT_EDGE
+ else -> this
+ }
+ }
+ }
+
fun isDoubleVariant(): Boolean {
return when(this){
SWIPE_UP_DOUBLE,
@@ -76,6 +117,20 @@ enum class Gesture (val id: String, private val labelResource: Int,
}
}
+ fun isEdgeVariant(): Boolean {
+ return when(this){
+ SWIPE_UP_RIGHT_EDGE,
+ SWIPE_UP_LEFT_EDGE,
+ SWIPE_DOWN_LEFT_EDGE,
+ SWIPE_DOWN_RIGHT_EDGE,
+ SWIPE_LEFT_TOP_EDGE,
+ SWIPE_LEFT_BOTTOM_EDGE,
+ SWIPE_RIGHT_TOP_EDGE,
+ SWIPE_RIGHT_BOTTOM_EDGE -> true
+ else -> false
+ }
+ }
+
operator fun invoke(activity: Activity) {
launch(this.getApp(activity), activity, this.animationIn, this.animationOut)
}
diff --git a/app/src/main/java/de/jrpie/android/launcher/HomeActivity.kt b/app/src/main/java/de/jrpie/android/launcher/HomeActivity.kt
index 73e8e4a..3e7dd00 100644
--- a/app/src/main/java/de/jrpie/android/launcher/HomeActivity.kt
+++ b/app/src/main/java/de/jrpie/android/launcher/HomeActivity.kt
@@ -16,6 +16,8 @@ import java.text.SimpleDateFormat
import java.util.*
import kotlin.concurrent.fixedRateTimer
import kotlin.math.abs
+import kotlin.math.max
+import kotlin.math.min
/**
* [HomeActivity] is the actual application Launcher,
@@ -146,7 +148,8 @@ class HomeActivity: UIObject, AppCompatActivity(),
val preferences = getPreferences(this)
val doubleActions = preferences.getBoolean(PREF_DOUBLE_ACTIONS_ENABLED, false)
-
+ val edgeActions = preferences.getBoolean(PREF_EDGE_ACTIONS_ENABLED, false)
+ val edgeStrictness = 0.15
// how distinguished the swipe has to be to launch something
// strictness = opposite of sensitivity. TODO - May have to be adjusted
val strictness = (4 / bufferedPointerCount) * ((100 - preferences.getInt(PREF_SLIDE_SENSITIVITY, 50)) / 50)
@@ -169,6 +172,20 @@ class HomeActivity: UIObject, AppCompatActivity(),
if (doubleActions && bufferedPointerCount > 1) {
gesture = gesture?.let(Gesture::getDoubleVariant)
}
+
+ if (edgeActions) {
+ if(max(e1.x, e2.x) < edgeStrictness * width){
+ gesture = gesture?.let{it.getEdgeVariant(Gesture.Edge.LEFT)};
+ } else if (min(e1.x, e2.x) > (1-edgeStrictness) * width){
+ gesture = gesture?.let{it.getEdgeVariant(Gesture.Edge.RIGHT)};
+ }
+
+ if(max(e1.y, e2.y) < edgeStrictness * height){
+ gesture = gesture?.let{it.getEdgeVariant(Gesture.Edge.TOP)};
+ } else if (min(e1.y, e2.y) > (1-edgeStrictness) * height){
+ gesture = gesture?.let{it.getEdgeVariant(Gesture.Edge.BOTTOM)};
+ }
+ }
gesture?.invoke(this)
return true
diff --git a/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActionsRecycler.kt b/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActionsRecycler.kt
index 6fcf4fd..1198ee0 100644
--- a/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActionsRecycler.kt
+++ b/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActionsRecycler.kt
@@ -118,7 +118,10 @@ class ActionsRecyclerAdapter(val activity: Activity):
init {
val doubleActions = getPreferences(activity).getBoolean(PREF_DOUBLE_ACTIONS_ENABLED, false)
- gesturesList = Gesture.values().filter { doubleActions || !it.isDoubleVariant() }
+ val edgeActions = getPreferences(activity).getBoolean(PREF_EDGE_ACTIONS_ENABLED, false)
+ gesturesList = Gesture.values().filter {
+ (doubleActions || !it.isDoubleVariant())
+ && (edgeActions || !it.isEdgeVariant())}
}
/* */
diff --git a/app/src/main/java/de/jrpie/android/launcher/settings/launcher/SettingsFragmentLauncher.kt b/app/src/main/java/de/jrpie/android/launcher/settings/launcher/SettingsFragmentLauncher.kt
index d91948f..f77bbea 100644
--- a/app/src/main/java/de/jrpie/android/launcher/settings/launcher/SettingsFragmentLauncher.kt
+++ b/app/src/main/java/de/jrpie/android/launcher/settings/launcher/SettingsFragmentLauncher.kt
@@ -9,9 +9,11 @@ import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.SeekBar
+import android.widget.Switch
import androidx.fragment.app.Fragment
import de.jrpie.android.launcher.PREF_DATE_FORMAT
import de.jrpie.android.launcher.PREF_DOUBLE_ACTIONS_ENABLED
+import de.jrpie.android.launcher.PREF_EDGE_ACTIONS_ENABLED
import de.jrpie.android.launcher.PREF_SCREEN_FULLSCREEN
import de.jrpie.android.launcher.PREF_SCREEN_TIMEOUT_DISABLED
import de.jrpie.android.launcher.PREF_SEARCH_AUTO_KEYBOARD
@@ -58,6 +60,8 @@ class SettingsFragmentLauncher : Fragment(), UIObject {
setSwitchColor(settings_launcher_switch_auto_launch, vibrantColor)
setSwitchColor(settings_launcher_switch_auto_keyboard, vibrantColor)
setSwitchColor(settings_launcher_switch_enable_double, vibrantColor)
+ setSwitchColor(settings_launcher_switch_enable_edge, vibrantColor)
+
setButtonColor(settings_launcher_button_choose_wallpaper, vibrantColor)
settings_seekbar_sensitivity.progressDrawable.setColorFilter(vibrantColor, PorterDuff.Mode.SRC_IN)
@@ -65,6 +69,18 @@ class SettingsFragmentLauncher : Fragment(), UIObject {
override fun setOnClicks() {
+ val preferences = getPreferences(activity!!)
+
+ fun bindSwitchToPref(switch: Switch, pref: String, default: Boolean, onChange: (Boolean) -> Unit){
+ switch.isChecked = preferences.getBoolean(pref, default)
+ switch.setOnCheckedChangeListener { _, isChecked -> // Toggle double actions
+ preferences.edit()
+ .putBoolean(pref, isChecked)
+ .apply()
+ onChange(isChecked);
+ }
+ }
+
settings_launcher_button_choose_wallpaper.setOnClickListener {
// https://github.com/LineageOS/android_packages_apps_Trebuchet/blob/6caab89b21b2b91f0a439e1fd8c4510dcb255819/src/com/android/launcher3/views/OptionsPopupView.java#L271
val intent = Intent(Intent.ACTION_SET_WALLPAPER)
@@ -74,45 +90,21 @@ class SettingsFragmentLauncher : Fragment(), UIObject {
startActivity(intent)
}
- val preferences = getPreferences(activity!!)
- settings_launcher_switch_screen_timeout.isChecked = preferences.getBoolean(PREF_SCREEN_TIMEOUT_DISABLED, false)
- settings_launcher_switch_screen_timeout.setOnCheckedChangeListener { _, isChecked -> // Toggle screen timeout
- preferences.edit()
- .putBoolean(PREF_SCREEN_TIMEOUT_DISABLED, isChecked)
- .apply()
+ bindSwitchToPref(settings_launcher_switch_screen_timeout, PREF_SCREEN_TIMEOUT_DISABLED, false) {
setWindowFlags(activity!!.window)
}
- settings_launcher_switch_screen_full.isChecked = preferences.getBoolean(PREF_SCREEN_FULLSCREEN, true)
- settings_launcher_switch_screen_full.setOnCheckedChangeListener { _, isChecked -> // Toggle fullscreen
- preferences.edit()
- .putBoolean(PREF_SCREEN_FULLSCREEN, isChecked)
- .apply()
-
+ bindSwitchToPref(settings_launcher_switch_screen_full, PREF_SCREEN_FULLSCREEN, true) {
setWindowFlags(activity!!.window)
}
-
- settings_launcher_switch_auto_launch.isChecked = preferences.getBoolean(PREF_SEARCH_AUTO_LAUNCH, false)
- settings_launcher_switch_auto_launch.setOnCheckedChangeListener { _, isChecked -> // Toggle double actions
- preferences.edit()
- .putBoolean(PREF_SEARCH_AUTO_LAUNCH, isChecked)
- .apply()
+ bindSwitchToPref(settings_launcher_switch_auto_launch, PREF_SEARCH_AUTO_LAUNCH, false) {}
+ bindSwitchToPref(settings_launcher_switch_auto_keyboard, PREF_SEARCH_AUTO_KEYBOARD, true) {}
+ bindSwitchToPref(settings_launcher_switch_enable_double, PREF_DOUBLE_ACTIONS_ENABLED, false) {
+ intendedSettingsPause = true
+ activity!!.recreate()
}
-
- settings_launcher_switch_auto_keyboard.isChecked = preferences.getBoolean(PREF_SEARCH_AUTO_KEYBOARD, true)
- settings_launcher_switch_auto_keyboard.setOnCheckedChangeListener { _, isChecked -> // Toggle double actions
- preferences.edit()
- .putBoolean(PREF_SEARCH_AUTO_KEYBOARD, isChecked)
- .apply()
- }
-
- settings_launcher_switch_enable_double.isChecked = preferences.getBoolean(PREF_DOUBLE_ACTIONS_ENABLED, false)
- settings_launcher_switch_enable_double.setOnCheckedChangeListener { _, isChecked -> // Toggle double actions
- preferences.edit()
- .putBoolean(PREF_DOUBLE_ACTIONS_ENABLED, isChecked)
- .apply()
-
+ bindSwitchToPref(settings_launcher_switch_enable_edge, PREF_EDGE_ACTIONS_ENABLED, false) {
intendedSettingsPause = true
activity!!.recreate()
}
diff --git a/app/src/main/res/layout/settings_launcher.xml b/app/src/main/res/layout/settings_launcher.xml
index ee0cc3e..9c582bc 100644
--- a/app/src/main/res/layout/settings_launcher.xml
+++ b/app/src/main/res/layout/settings_launcher.xml
@@ -307,5 +307,34 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/defaults.xml b/app/src/main/res/values/defaults.xml
index f2694e0..1422647 100644
--- a/app/src/main/res/values/defaults.xml
+++ b/app/src/main/res/values/defaults.xml
@@ -8,6 +8,9 @@
- launcher:choose
+
+
+
- com.google.android.apps.translate
@@ -26,6 +29,9 @@
- com.android.chrome
+
+
+
- org.torproject.torbrowser
@@ -39,6 +45,9 @@
- com.google.android.gm
+
+
+
- com.android.documentsui
@@ -52,6 +61,11 @@
- org.thoughtcrime.securesms
+
+
+
+
+
- com.whatsapp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 15befe3..e81ae78 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -41,6 +41,14 @@
Double Left
Swipe Right
Double Right
+ Swipe Right (Top)
+ Swipe Right (Bottom)
+ Swipe Left (Bottom)
+ Swipe Left (Top)
+ Swipe Up (Left Edge)
+ Swipe Up (Right Edge)
+ Swipe Down (Left Edge)
+ Swipe Down (Right Edge)
Volume Up
Volume Down
Double Click
@@ -102,6 +110,7 @@
Functions
Double swipe actions
+ Edge swipe actions
Launch search results
Start keyboard for search
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 1c95fb0..aaf8158 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -8,7 +8,7 @@
This is more like a fallback- theme that may partially be used by older apis.
-->
-