diff --git a/app/build.gradle b/app/build.gradle index 93b3e60..6b6df2f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { minSdkVersion 21 targetSdkVersion 35 compileSdk 35 - versionCode 22 - versionName "j-0.0.9" + versionCode 23 + versionName "j-0.0.10-beta1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -41,8 +41,6 @@ android { } - - buildTypes { release { minifyEnabled true diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6b4cbae..dfa90e2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,7 +3,8 @@ xmlns:tools="http://schemas.android.com/tools"> - @@ -20,14 +21,15 @@ + @@ -36,22 +38,20 @@ - + tools:ignore="LockedOrientationActivity"> - + tools:ignore="LockedOrientationActivity"> - - + + diff --git a/app/src/main/java/de/jrpie/android/launcher/Application.kt b/app/src/main/java/de/jrpie/android/launcher/Application.kt index f3452a2..50c41a3 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Application.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Application.kt @@ -3,7 +3,7 @@ package de.jrpie.android.launcher import android.content.Context import de.jrpie.android.launcher.preferences.LauncherPreferences -class Application: android.app.Application() { +class Application : android.app.Application() { override fun onCreate() { super.onCreate() 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 dba49f2..76e78db 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Functions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Functions.kt @@ -10,12 +10,8 @@ import android.content.pm.ApplicationInfo import android.content.pm.LauncherActivityInfo import android.content.pm.LauncherApps import android.content.pm.PackageManager -import android.graphics.BlendMode -import android.graphics.BlendModeColorFilter import android.graphics.ColorMatrix import android.graphics.ColorMatrixColorFilter -import android.graphics.PorterDuff -import android.graphics.PorterDuffColorFilter import android.graphics.Rect import android.graphics.drawable.Drawable import android.media.AudioManager @@ -30,16 +26,11 @@ import android.util.DisplayMetrics import android.util.Log import android.view.KeyEvent import android.view.View -import android.view.Window -import android.view.WindowManager import android.view.animation.AlphaAnimation import android.view.animation.Animation import android.view.inputmethod.InputMethodManager -import android.widget.Button import android.widget.ImageView -import android.widget.Switch import android.widget.Toast -import androidx.annotation.RequiresApi import de.jrpie.android.launcher.list.ListActivity import de.jrpie.android.launcher.list.apps.AppInfo import de.jrpie.android.launcher.list.apps.AppsRecyclerAdapter @@ -87,19 +78,23 @@ fun setDefaultHomeScreen(context: Context, checkDefault: Boolean = false) { if (checkDefault && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q - && context is Activity) { + && context is Activity + ) { val roleManager = context.getSystemService(RoleManager::class.java) - if(!roleManager.isRoleHeld(RoleManager.ROLE_HOME)) { - context.startActivityForResult(roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME), REQUEST_SET_DEFAULT_HOME) + if (!roleManager.isRoleHeld(RoleManager.ROLE_HOME)) { + context.startActivityForResult( + roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME), + REQUEST_SET_DEFAULT_HOME + ) } return } - if(checkDefault) { + if (checkDefault) { val testIntent = Intent(Intent.ACTION_MAIN) testIntent.addCategory(Intent.CATEGORY_HOME) val defaultHome = testIntent.resolveActivity(context.packageManager)?.packageName - if(defaultHome == context.packageName){ + if (defaultHome == context.packageName) { // Launcher is already the default home app return } @@ -116,7 +111,8 @@ fun isInstalled(uri: String, context: Context): Boolean { try { context.packageManager.getPackageInfo(uri, PackageManager.GET_ACTIVITIES) return true - } catch (_: PackageManager.NameNotFoundException) { } + } catch (_: PackageManager.NameNotFoundException) { + } return false } @@ -133,9 +129,8 @@ fun launch( ) { if (LauncherAction.isOtherAction(data)) { // [type]:[info] - LauncherAction.byId(data)?.let {it.launch(activity) } - } - else launchApp(data, user, activity) // app + LauncherAction.byId(data)?.let { it.launch(activity) } + } else launchApp(data, user, activity) // app activity.overridePendingTransition(animationIn, animationOut) } @@ -148,7 +143,8 @@ fun audioNextTrack(activity: Activity) { val eventTime: Long = SystemClock.uptimeMillis() - val downEvent = KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT, 0) + val downEvent = + KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT, 0) mAudioManager.dispatchMediaKeyEvent(downEvent) val upEvent = KeyEvent(eventTime, eventTime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT, 0) @@ -164,7 +160,8 @@ fun audioPreviousTrack(activity: Activity) { KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS, 0) mAudioManager.dispatchMediaKeyEvent(downEvent) - val upEvent = KeyEvent(eventTime, eventTime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PREVIOUS, 0) + val upEvent = + KeyEvent(eventTime, eventTime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PREVIOUS, 0) mAudioManager.dispatchMediaKeyEvent(upEvent) } @@ -199,7 +196,11 @@ fun expandNotificationsPanel(context: Context) { val showStatusBar = statusBarManager.getMethod("expandNotificationsPanel") showStatusBar.invoke(statusBarService) } catch (e: Exception) { - Toast.makeText(context, context.getString(R.string.alert_cant_expand_notifications_panel), Toast.LENGTH_LONG).show() + Toast.makeText( + context, + context.getString(R.string.alert_cant_expand_notifications_panel), + Toast.LENGTH_LONG + ).show() } } @@ -209,32 +210,39 @@ fun getUserFromId(user: Int?, context: Context): UserHandle? { val userManager = context.getSystemService(Service.USER_SERVICE) as UserManager return userManager.userProfiles.firstOrNull { it.hashCode() == user } } -fun getLauncherActivityInfo(packageName: String, user: Int?, context: Context): LauncherActivityInfo? { + +fun getLauncherActivityInfo( + packageName: String, + user: Int?, + context: Context +): LauncherActivityInfo? { val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps - return getUserFromId(user,context)?.let { - userHandle -> launcherApps.getActivityList(packageName, userHandle).firstOrNull() + return getUserFromId(user, context)?.let { userHandle -> + launcherApps.getActivityList(packageName, userHandle).firstOrNull() } } + fun uninstallApp(packageName: String, user: Int?, activity: Activity) { Log.i("Launcher", "uninstalling $packageName ($user)") val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE) intent.data = Uri.parse("package:$packageName") - getUserFromId(user, activity)?.let { - user -> intent.putExtra(Intent.EXTRA_USER, user) + getUserFromId(user, activity)?.let { user -> + intent.putExtra(Intent.EXTRA_USER, user) } intent.putExtra(Intent.EXTRA_RETURN_RESULT, true) - activity.startActivityForResult(intent, + activity.startActivityForResult( + intent, REQUEST_UNINSTALL ) } fun launchApp(packageName: String, user: Int?, context: Context, rect: Rect? = null) { - Log.i("Launcher", "Starting: " + packageName + " (user " +user.toString()+ ")") + Log.i("Launcher", "Starting: " + packageName + " (user " + user.toString() + ")") if (user != null) { val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps - getLauncherActivityInfo(packageName,user,context)?.let { - app -> launcherApps.startMainActivity(app.componentName, app.user, rect, null) + getLauncherActivityInfo(packageName, user, context)?.let { app -> + launcherApps.startMainActivity(app.componentName, app.user, rect, null) return } } @@ -244,7 +252,7 @@ fun launchApp(packageName: String, user: Int?, context: Context, rect: Rect? = n if (intent != null) { context.startActivity(intent) } else { - if (isInstalled(packageName, context)){ + if (isInstalled(packageName, context)) { AlertDialog.Builder( context, @@ -252,7 +260,8 @@ fun launchApp(packageName: String, user: Int?, context: Context, rect: Rect? = n ) .setTitle(context.getString(R.string.alert_cant_open_title)) .setMessage(context.getString(R.string.alert_cant_open_message)) - .setPositiveButton(android.R.string.ok + .setPositiveButton( + android.R.string.ok ) { _, _ -> openAppSettings( packageName, @@ -283,10 +292,16 @@ fun openNewTabWindow(urls: String, context: Context) { } -fun openAppSettings(packageName: String, user: Int?, context: Context, sourceBounds: Rect? = null, opts: Bundle? = null) { +fun openAppSettings( + packageName: String, + user: Int?, + context: Context, + sourceBounds: Rect? = null, + opts: Bundle? = null +) { val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps - getLauncherActivityInfo(packageName, user, context)?.let { - app -> launcherApps.startAppDetailsActivity(app.componentName, app.user, sourceBounds, opts) + getLauncherActivityInfo(packageName, user, context)?.let { app -> + launcherApps.startAppDetailsActivity(app.componentName, app.user, sourceBounds, opts) } } @@ -294,11 +309,11 @@ fun openSettings(activity: Activity) { activity.startActivity(Intent(activity, SettingsActivity::class.java)) } -fun openTutorial(activity: Activity){ +fun openTutorial(activity: Activity) { activity.startActivity(Intent(activity, TutorialActivity::class.java)) } -fun openAppsList(activity: Activity){ +fun openAppsList(activity: Activity) { val intent = Intent(activity, ListActivity::class.java) intent.putExtra("intention", ListActivity.ListActivityIntention.VIEW.toString()) activity.startActivity(intent) @@ -307,9 +322,9 @@ fun openAppsList(activity: Activity){ fun getAppIcon(context: Context, packageName: String, user: Int?): Drawable { if (user != null) { val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps - getUserFromId(user,context)?.let { - userHandle -> launcherApps.getActivityList(packageName, userHandle).firstOrNull()?.let { - app -> return app.getBadgedIcon(0) + getUserFromId(user, context)?.let { userHandle -> + launcherApps.getActivityList(packageName, userHandle).firstOrNull()?.let { app -> + return app.getBadgedIcon(0) } } } @@ -328,21 +343,22 @@ fun loadApps(packageManager: PackageManager, context: Context) { // TODO: shortcuts - launcherApps.getShortcuts() val users = userManager.userProfiles - for(user in users) { - for (activityInfo in launcherApps.getActivityList(null,user)) { + for (user in users) { + for (activityInfo in launcherApps.getActivityList(null, user)) { val app = AppInfo() app.label = activityInfo.label app.packageName = activityInfo.applicationInfo.packageName app.icon = activityInfo.getBadgedIcon(0) app.user = user.hashCode() - app.isSystemApp = activityInfo.applicationInfo.flags.and(ApplicationInfo.FLAG_SYSTEM) != 0 + app.isSystemApp = + activityInfo.applicationInfo.flags.and(ApplicationInfo.FLAG_SYSTEM) != 0 loadList.add(app) } } // fallback option - if(loadList.isEmpty()){ + if (loadList.isEmpty()) { Log.i("Launcher", "using fallback option to load packages") val i = Intent(Intent.ACTION_MAIN, null) i.addCategory(Intent.CATEGORY_LAUNCHER) @@ -364,8 +380,8 @@ fun loadApps(packageManager: PackageManager, context: Context) { // Used in Tutorial and Settings `ActivityOnResult` fun saveListActivityChoice(context: Context, data: Intent?) { val value = data?.getStringExtra("value") - var user = data?.getIntExtra("user", INVALID_USER) - user = user?.let{ if(it == INVALID_USER) null else it } + var user = data?.getIntExtra("user", INVALID_USER) + user = user?.let { if (it == INVALID_USER) null else it } val forGesture = data?.getStringExtra("forGesture") ?: return @@ -381,7 +397,7 @@ fun openSoftKeyboard(context: Context, view: View) { } // Taken from: https://stackoverflow.com/a/30340794/12787264 -fun transformGrayscale(imageView: ImageView){ +fun transformGrayscale(imageView: ImageView) { val matrix = ColorMatrix() matrix.setSaturation(0f) 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 8990da3..7fcd95b 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Gesture.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Gesture.kt @@ -11,43 +11,144 @@ import de.jrpie.android.launcher.preferences.LauncherPreferences * @param animationIn res id of transition animation (in) when using the gesture to launch an app. * @param animationOut res id of transition animation (out) when using the gesture to launch an app. */ -enum class Gesture (val id: String, private val labelResource: Int, - private val defaultsResource: Int, - private val animationIn: Int = android.R.anim.fade_in, - private val animationOut: Int = android.R.anim.fade_out){ - VOLUME_UP("action_volumeUpApp", R.string.settings_gesture_vol_up, R.array.default_volume_up, 0,0), - VOLUME_DOWN("action_volumeDownApp", R.string.settings_gesture_vol_down, R.array.default_volume_down,0,0), +enum class Gesture( + val id: String, private val labelResource: Int, + private val defaultsResource: Int, + private val animationIn: Int = android.R.anim.fade_in, + private val animationOut: Int = android.R.anim.fade_out +) { + VOLUME_UP( + "action_volumeUpApp", + R.string.settings_gesture_vol_up, + R.array.default_volume_up, + 0, + 0 + ), + VOLUME_DOWN( + "action_volumeDownApp", + R.string.settings_gesture_vol_down, + R.array.default_volume_down, + 0, + 0 + ), TIME("action_timeApp", R.string.settings_gesture_time, R.array.default_time), DATE("action_dateApp", R.string.settings_gesture_date, R.array.default_date), - 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), + 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); + 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 + enum class Edge { + TOP, BOTTOM, LEFT, RIGHT } fun getApp(context: Context): Pair { val preferences = LauncherPreferences.getSharedPreferences() var packageName = preferences.getString(this.id, "")!! - var u: Int? = preferences.getInt(this.id + "_user", INVALID_USER) - u = if(u == INVALID_USER) null else u - return Pair(packageName,u) + var u: Int? = preferences.getInt(this.id + "_user", INVALID_USER) + u = if (u == INVALID_USER) null else u + return Pair(packageName, u) } fun removeApp(context: Context) { @@ -61,7 +162,7 @@ enum class Gesture (val id: String, private val labelResource: Int, .putString(this.id, app) .apply() - val u = user?: INVALID_USER + val u = user ?: INVALID_USER LauncherPreferences.getSharedPreferences().edit() .putInt(this.id + "_user", u) .apply() @@ -71,7 +172,7 @@ enum class Gesture (val id: String, private val labelResource: Int, return context.resources.getString(this.labelResource) } - fun pickDefaultApp(context: Context) : String { + fun pickDefaultApp(context: Context): String { return context.resources .getStringArray(this.defaultsResource) .firstOrNull { isInstalled(it, context) } @@ -79,7 +180,7 @@ enum class Gesture (val id: String, private val labelResource: Int, } fun getDoubleVariant(): Gesture { - return when(this) { + return when (this) { SWIPE_UP -> SWIPE_UP_DOUBLE SWIPE_DOWN -> SWIPE_DOWN_DOUBLE SWIPE_LEFT -> SWIPE_LEFT_DOUBLE @@ -89,27 +190,30 @@ enum class Gesture (val id: String, private val labelResource: Int, } fun getEdgeVariant(edge: Edge): Gesture { - return when(edge) { + return when (edge) { Edge.TOP -> - when(this) { + when (this) { SWIPE_LEFT -> SWIPE_LEFT_TOP_EDGE SWIPE_RIGHT -> SWIPE_RIGHT_TOP_EDGE else -> this } + Edge.BOTTOM -> - when(this) { + when (this) { SWIPE_LEFT -> SWIPE_LEFT_BOTTOM_EDGE SWIPE_RIGHT -> SWIPE_RIGHT_BOTTOM_EDGE else -> this } + Edge.LEFT -> - when(this) { + when (this) { SWIPE_UP -> SWIPE_UP_LEFT_EDGE SWIPE_DOWN -> SWIPE_DOWN_LEFT_EDGE else -> this } + Edge.RIGHT -> - when(this) { + when (this) { SWIPE_UP -> SWIPE_UP_RIGHT_EDGE SWIPE_DOWN -> SWIPE_DOWN_RIGHT_EDGE else -> this @@ -118,25 +222,27 @@ enum class Gesture (val id: String, private val labelResource: Int, } fun isDoubleVariant(): Boolean { - return when(this){ + return when (this) { SWIPE_UP_DOUBLE, SWIPE_DOWN_DOUBLE, SWIPE_LEFT_DOUBLE, SWIPE_RIGHT_DOUBLE -> true + else -> false } } fun isEdgeVariant(): Boolean { - return when(this){ + 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 + 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 } } @@ -148,7 +254,7 @@ enum class Gesture (val id: String, private val labelResource: Int, companion object { fun byId(id: String): Gesture? { - return Gesture.values().firstOrNull {it.id == id } + return Gesture.values().firstOrNull { it.id == id } } } 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 1eafe50..5f4c157 100644 --- a/app/src/main/java/de/jrpie/android/launcher/HomeActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/HomeActivity.kt @@ -35,7 +35,7 @@ import kotlin.math.min * - Setting global variables (preferences etc.) * - Opening the [TutorialActivity] on new installations */ -class HomeActivity: UIObject, AppCompatActivity(), +class HomeActivity : UIObject, AppCompatActivity(), GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { private lateinit var binding: HomeBinding @@ -70,7 +70,7 @@ class HomeActivity: UIObject, AppCompatActivity(), setContentView(binding.root) } - override fun onStart(){ + override fun onStart() { super.onStart() mDetector = GestureDetectorCompat(this, this) @@ -97,7 +97,7 @@ class HomeActivity: UIObject, AppCompatActivity(), var upperVisible = dateVisible var lowerVisible = timeVisible - if(LauncherPreferences.clock().flipDateTime()) { + if (LauncherPreferences.clock().flipDateTime()) { upperFormat = lowerFormat.also { lowerFormat = upperFormat } upperVisible = lowerVisible.also { lowerVisible = upperVisible } } @@ -123,7 +123,7 @@ class HomeActivity: UIObject, AppCompatActivity(), override fun getTheme(): Resources.Theme { val mTheme = modifyTheme(super.getTheme()) - mTheme.applyStyle(R.style.backgroundWallpaper, true) + mTheme.applyStyle(R.style.backgroundWallpaper, true) return mTheme } @@ -161,7 +161,7 @@ class HomeActivity: UIObject, AppCompatActivity(), val edgeActions = LauncherPreferences.enabled_gestures().edgeSwipe() val edgeStrictness = 0.15 - var gesture = if(abs(diffX) > abs(diffY)) { // horizontal swipe + var gesture = if (abs(diffX) > abs(diffY)) { // horizontal swipe if (diffX > width / 4) Gesture.SWIPE_LEFT else if (diffX < -width / 4) @@ -181,16 +181,16 @@ class HomeActivity: UIObject, AppCompatActivity(), } 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.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)} + 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) @@ -224,13 +224,17 @@ class HomeActivity: UIObject, AppCompatActivity(), } } - return if (mDetector.onTouchEvent(event)) { false } else { super.onTouchEvent(event) } + return if (mDetector.onTouchEvent(event)) { + false + } else { + super.onTouchEvent(event) + } } override fun setOnClicks() { binding.homeUpperView.setOnClickListener { - if(LauncherPreferences.clock().flipDateTime()) { + if (LauncherPreferences.clock().flipDateTime()) { Gesture.TIME(this) } else { Gesture.DATE(this) @@ -238,7 +242,7 @@ class HomeActivity: UIObject, AppCompatActivity(), } binding.homeLowerView.setOnClickListener { - if(LauncherPreferences.clock().flipDateTime()) { + if (LauncherPreferences.clock().flipDateTime()) { Gesture.DATE(this) } else { Gesture.TIME(this) @@ -248,11 +252,22 @@ class HomeActivity: UIObject, AppCompatActivity(), /* TODO: Remove those. For now they are necessary * because this inherits from GestureDetector.OnGestureListener */ - override fun onDoubleTapEvent(event: MotionEvent): Boolean { return false } - override fun onDown(event: MotionEvent): Boolean { return false } - override fun onScroll(e1: MotionEvent?, e2: MotionEvent, dX: Float, dY: Float): Boolean { return false } + override fun onDoubleTapEvent(event: MotionEvent): Boolean { + return false + } + + override fun onDown(event: MotionEvent): Boolean { + return false + } + + override fun onScroll(e1: MotionEvent?, e2: MotionEvent, dX: Float, dY: Float): Boolean { + return false + } + override fun onShowPress(event: MotionEvent) {} - override fun onSingleTapUp(event: MotionEvent): Boolean { return false } + override fun onSingleTapUp(event: MotionEvent): Boolean { + return false + } override fun isHomeScreen(): Boolean { return true diff --git a/app/src/main/java/de/jrpie/android/launcher/UIObject.kt b/app/src/main/java/de/jrpie/android/launcher/UIObject.kt index 7bf0fd7..bc55345 100644 --- a/app/src/main/java/de/jrpie/android/launcher/UIObject.kt +++ b/app/src/main/java/de/jrpie/android/launcher/UIObject.kt @@ -2,7 +2,6 @@ package de.jrpie.android.launcher import android.app.Activity import android.content.res.Resources -import android.os.Build import android.view.Window import android.view.WindowManager import de.jrpie.android.launcher.preferences.LauncherPreferences @@ -43,6 +42,7 @@ interface UIObject { setOnClicks() adjustLayout() } + fun modifyTheme(theme: Resources.Theme): Resources.Theme { LauncherPreferences.theme().colorTheme().applyToTheme(theme) LauncherPreferences.theme().background().applyToTheme(theme) @@ -52,8 +52,8 @@ interface UIObject { } // fun applyTheme() { } - fun setOnClicks() { } - fun adjustLayout() { } + fun setOnClicks() {} + fun adjustLayout() {} fun isHomeScreen(): Boolean { return false diff --git a/app/src/main/java/de/jrpie/android/launcher/list/ListActivity.kt b/app/src/main/java/de/jrpie/android/launcher/list/ListActivity.kt index 1bc304e..f3d58df 100644 --- a/app/src/main/java/de/jrpie/android/launcher/list/ListActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/list/ListActivity.kt @@ -44,6 +44,7 @@ class ListActivity : AppCompatActivity(), UIObject { VIEW(R.string.list_title_view), /* view list of apps */ PICK(R.string.list_title_pick) /* choose app or action to associate to a gesture */ } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -66,7 +67,8 @@ class ListActivity : AppCompatActivity(), UIObject { binding.listContainer.context.resources.displayMetrics.heightPixels val diff = height - r.bottom if (diff != 0 && - LauncherPreferences.display().fullScreen()) { + LauncherPreferences.display().fullScreen() + ) { if (binding.listContainer.paddingBottom !== diff) { binding.listContainer.setPadding(0, 0, 0, diff) } @@ -80,7 +82,7 @@ class ListActivity : AppCompatActivity(), UIObject { } - override fun onStart(){ + override fun onStart() { super.onStart() super.onStart() } @@ -146,11 +148,11 @@ private val TAB_TITLES = arrayOf( * The [ListSectionsPagerAdapter] returns the fragment, * which corresponds to the selected tab in [ListActivity]. */ -class ListSectionsPagerAdapter(private val context: Context, fm: FragmentManager) - : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { +class ListSectionsPagerAdapter(private val context: Context, fm: FragmentManager) : + FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { override fun getItem(position: Int): Fragment { - return when (position){ + return when (position) { 0 -> ListFragmentApps() 1 -> ListFragmentOther() else -> Fragment() diff --git a/app/src/main/java/de/jrpie/android/launcher/list/apps/AppsRecyclerAdapter.kt b/app/src/main/java/de/jrpie/android/launcher/list/apps/AppsRecyclerAdapter.kt index 86fdb6f..1fb5c31 100644 --- a/app/src/main/java/de/jrpie/android/launcher/list/apps/AppsRecyclerAdapter.kt +++ b/app/src/main/java/de/jrpie/android/launcher/list/apps/AppsRecyclerAdapter.kt @@ -34,10 +34,12 @@ import kotlin.text.Regex.Companion.escapeReplacement * @param intention - why the list is displayed ("view", "pick") * @param forGesture - the action which an app is chosen for (when the intention is "pick") */ -class AppsRecyclerAdapter(val activity: Activity, - private val intention: ListActivity.ListActivityIntention - = ListActivity.ListActivityIntention.VIEW, - private val forGesture: String? = ""): +class AppsRecyclerAdapter( + val activity: Activity, + private val intention: ListActivity.ListActivityIntention + = ListActivity.ListActivityIntention.VIEW, + private val forGesture: String? = "" +) : RecyclerView.Adapter() { private val appsListDisplayed: MutableList @@ -53,7 +55,9 @@ class AppsRecyclerAdapter(val activity: Activity, selectItem(adapterPosition, rect) } - init { itemView.setOnClickListener(this) } + init { + itemView.setOnClickListener(this) + } } override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { @@ -72,16 +76,35 @@ class AppsRecyclerAdapter(val activity: Activity, // decide when to show the options popup menu about if (intention == ListActivity.ListActivityIntention.VIEW) { - viewHolder.textView.setOnLongClickListener{ showOptionsPopup(viewHolder, appPackageName, appUser, isSystemApp) } - viewHolder.img.setOnLongClickListener{ showOptionsPopup(viewHolder, appPackageName, appUser, isSystemApp) } + viewHolder.textView.setOnLongClickListener { + showOptionsPopup( + viewHolder, + appPackageName, + appUser, + isSystemApp + ) + } + viewHolder.img.setOnLongClickListener { + showOptionsPopup( + viewHolder, + appPackageName, + appUser, + isSystemApp + ) + } // ensure onClicks are actually caught - viewHolder.textView.setOnClickListener{ viewHolder.onClick(viewHolder.textView) } - viewHolder.img.setOnClickListener{ viewHolder.onClick(viewHolder.img) } + viewHolder.textView.setOnClickListener { viewHolder.onClick(viewHolder.textView) } + viewHolder.img.setOnClickListener { viewHolder.onClick(viewHolder.img) } } } @Suppress("SameReturnValue") - private fun showOptionsPopup(viewHolder: ViewHolder, appPackageName: String, user: Int?, isSystemApp: Boolean): Boolean { + private fun showOptionsPopup( + viewHolder: ViewHolder, + appPackageName: String, + user: Int?, + isSystemApp: Boolean + ): Boolean { //create the popup menu val popup = PopupMenu(activity, viewHolder.img) @@ -97,10 +120,12 @@ class AppsRecyclerAdapter(val activity: Activity, uninstallApp(appPackageName, user, activity) true } + R.id.app_menu_info -> { openAppSettings(appPackageName, user, activity) true } + else -> false } } @@ -109,7 +134,9 @@ class AppsRecyclerAdapter(val activity: Activity, return true } - override fun getItemCount(): Int { return appsListDisplayed.size } + override fun getItemCount(): Int { + return appsListDisplayed.size + } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val inflater = LayoutInflater.from(parent.context) @@ -131,19 +158,20 @@ class AppsRecyclerAdapter(val activity: Activity, } fun selectItem(pos: Int, rect: Rect = Rect()) { - if(pos >= appsListDisplayed.size) { + if (pos >= appsListDisplayed.size) { return } val appPackageName = appsListDisplayed[pos].packageName.toString() val appUser = appsListDisplayed[pos].user - when (intention){ + when (intention) { ListActivity.ListActivityIntention.VIEW -> { launchApp(appPackageName, appUser, activity, rect) } + ListActivity.ListActivityIntention.PICK -> { val returnIntent = Intent() returnIntent.putExtra("value", appPackageName) - appUser?.let{ returnIntent.putExtra("user", it) } + appUser?.let { returnIntent.putExtra("user", it) } returnIntent.putExtra("forGesture", forGesture) activity.setResult(REQUEST_CHOOSE_APP, returnIntent) activity.finish() @@ -160,12 +188,12 @@ class AppsRecyclerAdapter(val activity: Activity, .lowercase(Locale.ROOT) .toCharArray() .distinct() - .filter { c -> ! ((c in 'a'..'z') || (c in '0'..'9')) } - .map { c -> escapeReplacement(c.toString())} - .fold("") { x,y -> x+y } + .filter { c -> !((c in 'a'..'z') || (c in '0'..'9')) } + .map { c -> escapeReplacement(c.toString()) } + .fold("") { x, y -> x + y } var disallowedCharsRegex = "[^a-z0-9$allowedSpecialCharacters]".toRegex() - fun normalize(text: String): String{ + fun normalize(text: String): String { return text.lowercase(Locale.ROOT).replace(disallowedCharsRegex, "") } appsListDisplayed.clear() @@ -179,7 +207,7 @@ class AppsRecyclerAdapter(val activity: Activity, if (itemLabel.startsWith(normalizedText)) { appsListDisplayed.add(item) - }else if(itemLabel.contains(normalizedText)){ + } else if (itemLabel.contains(normalizedText)) { appsSecondary.add(item) } } @@ -187,11 +215,13 @@ class AppsRecyclerAdapter(val activity: Activity, } if (appsListDisplayed.size == 1 && intention == ListActivity.ListActivityIntention.VIEW - && LauncherPreferences.functionality().searchAutoLaunch()) { + && LauncherPreferences.functionality().searchAutoLaunch() + ) { val info = appsListDisplayed[0] launch(info.packageName.toString(), info.user, activity) - val inputMethodManager = activity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager + val inputMethodManager = + activity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager inputMethodManager.hideSoftInputFromWindow(View(activity).windowToken, 0) } diff --git a/app/src/main/java/de/jrpie/android/launcher/list/apps/ListFragmentApps.kt b/app/src/main/java/de/jrpie/android/launcher/list/apps/ListFragmentApps.kt index 72f3f48..2a13c2e 100644 --- a/app/src/main/java/de/jrpie/android/launcher/list/apps/ListFragmentApps.kt +++ b/app/src/main/java/de/jrpie/android/launcher/list/apps/ListFragmentApps.kt @@ -36,7 +36,7 @@ class ListFragmentApps : Fragment(), UIObject { super.onStart() } - override fun setOnClicks() { } + override fun setOnClicks() {} override fun adjustLayout() { @@ -66,7 +66,8 @@ class ListFragmentApps : Fragment(), UIObject { }) if (intention == ListActivity.ListActivityIntention.VIEW - && LauncherPreferences.functionality().searchAutoOpenKeyboard()){ + && LauncherPreferences.functionality().searchAutoOpenKeyboard() + ) { openSoftKeyboard(requireContext(), binding.listAppsSearchview) } } diff --git a/app/src/main/java/de/jrpie/android/launcher/list/other/LauncherAction.kt b/app/src/main/java/de/jrpie/android/launcher/list/other/LauncherAction.kt index b1137f3..54daceb 100644 --- a/app/src/main/java/de/jrpie/android/launcher/list/other/LauncherAction.kt +++ b/app/src/main/java/de/jrpie/android/launcher/list/other/LauncherAction.kt @@ -10,25 +10,50 @@ import de.jrpie.android.launcher.expandNotificationsPanel import de.jrpie.android.launcher.openAppsList import de.jrpie.android.launcher.openSettings -enum class LauncherAction(val id: String, val label: Int, val icon: Int, val launch: (Activity) -> Unit) { - SETTINGS("launcher:settings", R.string.list_other_settings, R.drawable.baseline_settings_24, ::openSettings), - CHOOSE("launcher:choose", R.string.list_other_list, R.drawable.baseline_menu_24, ::openAppsList), - VOLUME_UP("launcher:volumeUp", +enum class LauncherAction( + val id: String, + val label: Int, + val icon: Int, + val launch: (Activity) -> Unit +) { + SETTINGS( + "launcher:settings", + R.string.list_other_settings, + R.drawable.baseline_settings_24, + ::openSettings + ), + CHOOSE( + "launcher:choose", + R.string.list_other_list, + R.drawable.baseline_menu_24, + ::openAppsList + ), + VOLUME_UP( + "launcher:volumeUp", R.string.list_other_volume_up, - R.drawable.baseline_volume_up_24, ::audioVolumeUp), - VOLUME_DOWN("launcher:volumeDown", + R.drawable.baseline_volume_up_24, ::audioVolumeUp + ), + VOLUME_DOWN( + "launcher:volumeDown", R.string.list_other_volume_down, - R.drawable.baseline_volume_down_24, ::audioVolumeDown), - TRACK_NEXT("launcher:nextTrack", + R.drawable.baseline_volume_down_24, ::audioVolumeDown + ), + TRACK_NEXT( + "launcher:nextTrack", R.string.list_other_track_next, - R.drawable.baseline_skip_next_24, ::audioNextTrack), - TRACK_PREV("launcher:previousTrack", + R.drawable.baseline_skip_next_24, ::audioNextTrack + ), + TRACK_PREV( + "launcher:previousTrack", R.string.list_other_track_previous, - R.drawable.baseline_skip_previous_24, ::audioPreviousTrack), - EXPAND_NOTIFICATIONS_PANEL("launcher:expandNotificationsPanel", + R.drawable.baseline_skip_previous_24, ::audioPreviousTrack + ), + EXPAND_NOTIFICATIONS_PANEL( + "launcher:expandNotificationsPanel", R.string.list_other_expand_notifications_panel, R.drawable.baseline_notifications_24, - ::expandNotificationsPanel), + ::expandNotificationsPanel + ), NOP("launcher:nop", R.string.list_other_nop, R.drawable.baseline_not_interested_24, {}); companion object { diff --git a/app/src/main/java/de/jrpie/android/launcher/list/other/ListFragmentOther.kt b/app/src/main/java/de/jrpie/android/launcher/list/other/ListFragmentOther.kt index 2c73aea..b1cd93f 100644 --- a/app/src/main/java/de/jrpie/android/launcher/list/other/ListFragmentOther.kt +++ b/app/src/main/java/de/jrpie/android/launcher/list/other/ListFragmentOther.kt @@ -6,7 +6,6 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager -import de.jrpie.android.launcher.R import de.jrpie.android.launcher.databinding.ListOtherBinding /** diff --git a/app/src/main/java/de/jrpie/android/launcher/list/other/OtherRecyclerAdapter.kt b/app/src/main/java/de/jrpie/android/launcher/list/other/OtherRecyclerAdapter.kt index 0b54fa6..e9bee8d 100644 --- a/app/src/main/java/de/jrpie/android/launcher/list/other/OtherRecyclerAdapter.kt +++ b/app/src/main/java/de/jrpie/android/launcher/list/other/OtherRecyclerAdapter.kt @@ -20,7 +20,7 @@ import de.jrpie.android.launcher.list.forGesture * It lists `other` things to be launched that are not really represented by a URI, * rather by Launcher- internal conventions. */ -class OtherRecyclerAdapter(val activity: Activity): +class OtherRecyclerAdapter(val activity: Activity) : RecyclerView.Adapter() { private val othersList: Array = LauncherAction.values() @@ -38,7 +38,9 @@ class OtherRecyclerAdapter(val activity: Activity): forGesture?.let { returnChoiceIntent(it, content.id) } } - init { itemView.setOnClickListener(this) } + init { + itemView.setOnClickListener(this) + } } override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { @@ -49,7 +51,9 @@ class OtherRecyclerAdapter(val activity: Activity): viewHolder.iconView.setImageResource(icon) } - override fun getItemCount(): Int { return othersList.size } + override fun getItemCount(): Int { + return othersList.size + } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val inflater = LayoutInflater.from(parent.context) diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java b/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java index 10c4b4d..c224b84 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java @@ -13,41 +13,41 @@ import eu.jonahbauer.android.preference.annotations.Preferences; makeFile = true, r = R.class, value = { - @PreferenceGroup(name = "internal", prefix = "settings_internal_", suffix = "_key", value = { - @Preference(name = "started", type = boolean.class, defaultValue = "false"), - @Preference(name = "started_time", type = long.class), - @Preference(name = "version_code", type = int.class, defaultValue = "-1"), - }), - @PreferenceGroup( name = "gestures", prefix = "settings_gesture_", suffix = "_key", value = { - }), - @PreferenceGroup(name = "general", prefix = "settings_general_", suffix = "_key", value = { - @Preference(name = "choose_home_screen", type = void.class) - }), - @PreferenceGroup(name = "theme", prefix = "settings_theme_", suffix = "_key", value = { - @Preference(name = "wallpaper", type = void.class), - @Preference(name = "color_theme", type = ColorTheme.class, defaultValue = "DEFAULT"), - @Preference(name = "background", type = Background.class, defaultValue = "BLUR"), - @Preference(name = "font", type = Font.class, defaultValue = "HACK"), - @Preference(name = "monochrome_icons", type = boolean.class, defaultValue = "false"), - }), - @PreferenceGroup(name = "clock", prefix = "settings_clock_", suffix = "_key", value = { - @Preference(name = "date_visible", type = boolean.class, defaultValue = "true"), - @Preference(name = "time_visible", type = boolean.class, defaultValue = "true"), - @Preference(name = "flip_date_time", type = boolean.class, defaultValue = "false"), - @Preference(name = "localized", type = boolean.class, defaultValue = "false"), - }), - @PreferenceGroup(name = "display", prefix = "settings_display_", suffix = "_key", value = { - @Preference(name = "screen_timeout_disabled", type = boolean.class, defaultValue = "false"), - @Preference(name = "full_screen", type = boolean.class, defaultValue = "true"), - }), - @PreferenceGroup( name = "functionality", prefix = "settings_functionality_", suffix = "_key", value = { - @Preference(name = "search_auto_launch", type = boolean.class, defaultValue = "true"), - @Preference(name = "search_auto_open_keyboard", type = boolean.class, defaultValue = "true"), - }), - @PreferenceGroup(name = "enabled_gestures", prefix = "settings_enabled_gestures_", suffix = "_key", value = { - @Preference(name = "double_swipe", type = boolean.class, defaultValue = "true"), - @Preference(name = "edge_swipe", type = boolean.class, defaultValue = "true"), - }), + @PreferenceGroup(name = "internal", prefix = "settings_internal_", suffix = "_key", value = { + @Preference(name = "started", type = boolean.class, defaultValue = "false"), + @Preference(name = "started_time", type = long.class), + @Preference(name = "version_code", type = int.class, defaultValue = "-1"), + }), + @PreferenceGroup(name = "gestures", prefix = "settings_gesture_", suffix = "_key", value = { + }), + @PreferenceGroup(name = "general", prefix = "settings_general_", suffix = "_key", value = { + @Preference(name = "choose_home_screen", type = void.class) + }), + @PreferenceGroup(name = "theme", prefix = "settings_theme_", suffix = "_key", value = { + @Preference(name = "wallpaper", type = void.class), + @Preference(name = "color_theme", type = ColorTheme.class, defaultValue = "DEFAULT"), + @Preference(name = "background", type = Background.class, defaultValue = "BLUR"), + @Preference(name = "font", type = Font.class, defaultValue = "HACK"), + @Preference(name = "monochrome_icons", type = boolean.class, defaultValue = "false"), + }), + @PreferenceGroup(name = "clock", prefix = "settings_clock_", suffix = "_key", value = { + @Preference(name = "date_visible", type = boolean.class, defaultValue = "true"), + @Preference(name = "time_visible", type = boolean.class, defaultValue = "true"), + @Preference(name = "flip_date_time", type = boolean.class, defaultValue = "false"), + @Preference(name = "localized", type = boolean.class, defaultValue = "false"), + }), + @PreferenceGroup(name = "display", prefix = "settings_display_", suffix = "_key", value = { + @Preference(name = "screen_timeout_disabled", type = boolean.class, defaultValue = "false"), + @Preference(name = "full_screen", type = boolean.class, defaultValue = "true"), + }), + @PreferenceGroup(name = "functionality", prefix = "settings_functionality_", suffix = "_key", value = { + @Preference(name = "search_auto_launch", type = boolean.class, defaultValue = "true"), + @Preference(name = "search_auto_open_keyboard", type = boolean.class, defaultValue = "true"), + }), + @PreferenceGroup(name = "enabled_gestures", prefix = "settings_enabled_gestures_", suffix = "_key", value = { + @Preference(name = "double_swipe", type = boolean.class, defaultValue = "true"), + @Preference(name = "edge_swipe", type = boolean.class, defaultValue = "true"), + }), }) public final class LauncherPreferences$Config { } diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/Preferences.kt b/app/src/main/java/de/jrpie/android/launcher/preferences/Preferences.kt index 6012819..357cd6d 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/Preferences.kt +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/Preferences.kt @@ -13,10 +13,14 @@ fun migrateToNewVersion(activity: Activity) { when (LauncherPreferences.internal().versionCode()) { // Check versions, make sure transitions between versions go well - VERSION_CODE -> { /* the version installed and used previously are the same */ } - 21,22,23 -> { + VERSION_CODE -> { /* the version installed and used previously are the same */ + } + + 21, 22, 23 -> { // TODO - } else -> { /* The version used before was pre- v1.3.0, + } + + else -> { /* The version used before was pre- v1.3.0, as version tracking started then */ /* diff --git a/app/src/main/java/de/jrpie/android/launcher/settings/SettingsActivity.kt b/app/src/main/java/de/jrpie/android/launcher/settings/SettingsActivity.kt index c021f34..9f4278b 100644 --- a/app/src/main/java/de/jrpie/android/launcher/settings/SettingsActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/settings/SettingsActivity.kt @@ -7,14 +7,17 @@ import android.content.res.Resources import android.os.Bundle import android.provider.Settings import androidx.appcompat.app.AppCompatActivity -import androidx.viewpager.widget.ViewPager -import de.jrpie.android.launcher.* -import com.google.android.material.tabs.TabLayout -import de.jrpie.android.launcher.databinding.SettingsBinding import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter +import androidx.viewpager.widget.ViewPager +import com.google.android.material.tabs.TabLayout +import de.jrpie.android.launcher.R +import de.jrpie.android.launcher.REQUEST_CHOOSE_APP +import de.jrpie.android.launcher.UIObject +import de.jrpie.android.launcher.databinding.SettingsBinding import de.jrpie.android.launcher.preferences.LauncherPreferences +import de.jrpie.android.launcher.saveListActivityChoice import de.jrpie.android.launcher.settings.actions.SettingsFragmentActions import de.jrpie.android.launcher.settings.launcher.SettingsFragmentLauncher import de.jrpie.android.launcher.settings.meta.SettingsFragmentMeta @@ -28,11 +31,11 @@ import de.jrpie.android.launcher.settings.meta.SettingsFragmentMeta * * Settings are closed automatically if the activity goes `onPause` unexpectedly. */ -class SettingsActivity: AppCompatActivity(), UIObject { +class SettingsActivity : AppCompatActivity(), UIObject { private var sharedPreferencesListener = - SharedPreferences.OnSharedPreferenceChangeListener { _,prefKey -> - if(prefKey?.startsWith("theme.") == true) { + SharedPreferences.OnSharedPreferenceChangeListener { _, prefKey -> + if (prefKey?.startsWith("theme.") == true) { recreate() } } @@ -56,11 +59,13 @@ class SettingsActivity: AppCompatActivity(), UIObject { override fun onStart() { super.onStart() super.onStart() - LauncherPreferences.getSharedPreferences().registerOnSharedPreferenceChangeListener(sharedPreferencesListener) + LauncherPreferences.getSharedPreferences() + .registerOnSharedPreferenceChangeListener(sharedPreferencesListener) } override fun onPause() { - LauncherPreferences.getSharedPreferences().unregisterOnSharedPreferenceChangeListener(sharedPreferencesListener) + LauncherPreferences.getSharedPreferences() + .unregisterOnSharedPreferenceChangeListener(sharedPreferencesListener) super.onPause() } @@ -68,7 +73,7 @@ class SettingsActivity: AppCompatActivity(), UIObject { return modifyTheme(super.getTheme()) } - override fun setOnClicks(){ + override fun setOnClicks() { // As older APIs somehow do not recognize the xml defined onClick binding.settingsClose.setOnClickListener { finish() } // open device settings (see https://stackoverflow.com/a/62092663/12787264) @@ -91,11 +96,11 @@ private val TAB_TITLES = arrayOf( R.string.settings_tab_meta ) -class SettingsSectionsPagerAdapter(private val context: Context, fm: FragmentManager) - : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { +class SettingsSectionsPagerAdapter(private val context: Context, fm: FragmentManager) : + FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { override fun getItem(position: Int): Fragment { - return when (position){ + return when (position) { 0 -> SettingsFragmentActions() 1 -> SettingsFragmentLauncher() 2 -> SettingsFragmentMeta() @@ -107,5 +112,7 @@ class SettingsSectionsPagerAdapter(private val context: Context, fm: FragmentMan return context.resources.getString(TAB_TITLES[position]) } - override fun getCount(): Int { return 3 } + override fun getCount(): Int { + return 3 + } } diff --git a/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActions.kt b/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActions.kt index bd0fa19..e03f610 100644 --- a/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActions.kt @@ -44,18 +44,22 @@ SettingsFragmentActions : Fragment(), UIObject { override fun setOnClicks() { // App management buttons - binding!!.settingsActionsButtonViewApps.setOnClickListener{ + binding!!.settingsActionsButtonViewApps.setOnClickListener { val intent = Intent(this.context, ListActivity::class.java) intent.putExtra("intention", ListActivity.ListActivityIntention.VIEW.toString()) startActivity(intent) } - binding!!.settingsActionsButtonInstallApps.setOnClickListener{ + binding!!.settingsActionsButtonInstallApps.setOnClickListener { try { val intent = Intent(Intent.ACTION_MAIN) intent.addCategory(Intent.CATEGORY_APP_MARKET) startActivity(intent) } catch (e: ActivityNotFoundException) { - Toast.makeText(context, getString(R.string.settings_apps_toast_store_not_found), Toast.LENGTH_SHORT).show() + Toast.makeText( + context, + getString(R.string.settings_apps_toast_store_not_found), + Toast.LENGTH_SHORT + ).show() } } } 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 50bfa6c..d87c10c 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 @@ -1,25 +1,28 @@ package de.jrpie.android.launcher.settings.actions +import android.app.Activity +import android.content.Intent +import android.content.SharedPreferences import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.recyclerview.widget.LinearLayoutManager -import de.jrpie.android.launcher.* -import de.jrpie.android.launcher.list.ListActivity -import android.app.Activity -import android.content.Intent -import android.content.SharedPreferences -import android.util.Log import android.widget.Button import android.widget.ImageView import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import de.jrpie.android.launcher.list.other.LauncherAction +import de.jrpie.android.launcher.Gesture +import de.jrpie.android.launcher.R +import de.jrpie.android.launcher.REQUEST_CHOOSE_APP +import de.jrpie.android.launcher.UIObject import de.jrpie.android.launcher.databinding.SettingsActionsRecyclerBinding +import de.jrpie.android.launcher.getAppIcon +import de.jrpie.android.launcher.list.ListActivity +import de.jrpie.android.launcher.list.other.LauncherAction import de.jrpie.android.launcher.preferences.LauncherPreferences -import java.lang.Exception +import de.jrpie.android.launcher.transformGrayscale /** * The [SettingsFragmentActionsRecycler] is a fragment containing the [ActionsRecyclerAdapter], @@ -49,7 +52,7 @@ class SettingsFragmentActionsRecycler : Fragment(), UIObject { // set up the list / recycler val actionViewManager = LinearLayoutManager(context) - actionViewAdapter = ActionsRecyclerAdapter( requireActivity() ) + actionViewAdapter = ActionsRecyclerAdapter(requireActivity()) binding.settingsActionsRview.apply { // improve performance (since content changes don't change the layout size) @@ -57,19 +60,21 @@ class SettingsFragmentActionsRecycler : Fragment(), UIObject { layoutManager = actionViewManager adapter = actionViewAdapter } - LauncherPreferences.getSharedPreferences().registerOnSharedPreferenceChangeListener(sharedPreferencesListener) + LauncherPreferences.getSharedPreferences() + .registerOnSharedPreferenceChangeListener(sharedPreferencesListener) super.onStart() } override fun onDestroy() { - LauncherPreferences.getSharedPreferences().unregisterOnSharedPreferenceChangeListener(sharedPreferencesListener) + LauncherPreferences.getSharedPreferences() + .unregisterOnSharedPreferenceChangeListener(sharedPreferencesListener) super.onDestroy() } } -class ActionsRecyclerAdapter(val activity: Activity): +class ActionsRecyclerAdapter(val activity: Activity) : RecyclerView.Adapter() { private val gesturesList: ArrayList @@ -81,9 +86,11 @@ class ActionsRecyclerAdapter(val activity: Activity): var chooseButton: Button = itemView.findViewById(R.id.settings_actions_row_button_choose) var removeAction: ImageView = itemView.findViewById(R.id.settings_actions_row_remove) - override fun onClick(v: View) { } + override fun onClick(v: View) {} - init { itemView.setOnClickListener(this) } + init { + itemView.setOnClickListener(this) + } } private fun updateViewHolder(gesture: Gesture, viewHolder: ViewHolder) { @@ -92,12 +99,11 @@ class ActionsRecyclerAdapter(val activity: Activity): viewHolder.img.visibility = View.VISIBLE viewHolder.removeAction.visibility = View.VISIBLE viewHolder.chooseButton.visibility = View.INVISIBLE - if (content.isEmpty()){ + if (content.isEmpty()) { viewHolder.img.visibility = View.INVISIBLE viewHolder.removeAction.visibility = View.GONE viewHolder.chooseButton.visibility = View.VISIBLE - } - else if (LauncherAction.isOtherAction(content)) { + } else if (LauncherAction.isOtherAction(content)) { LauncherAction.byId(content)?.let { viewHolder.img.setImageResource(it.icon) } @@ -105,7 +111,7 @@ class ActionsRecyclerAdapter(val activity: Activity): // Set image icon (by packageName) try { viewHolder.img.setImageDrawable(getAppIcon(activity, content, app.second)) - } catch (e : Exception) { + } catch (e: Exception) { // Probably the app was uninstalled // the button is shown, user asked to select an action viewHolder.img.visibility = View.INVISIBLE @@ -119,14 +125,16 @@ class ActionsRecyclerAdapter(val activity: Activity): val gesture = gesturesList[i] viewHolder.textView.text = gesture.getLabel(activity) if (LauncherPreferences.theme().monochromeIcons()) - transformGrayscale( viewHolder.img ) + transformGrayscale(viewHolder.img) updateViewHolder(gesture, viewHolder) - viewHolder.img.setOnClickListener{ chooseApp(gesture) } - viewHolder.chooseButton.setOnClickListener{ chooseApp(gesture) } - viewHolder.removeAction.setOnClickListener{ gesture.removeApp(activity) } + viewHolder.img.setOnClickListener { chooseApp(gesture) } + viewHolder.chooseButton.setOnClickListener { chooseApp(gesture) } + viewHolder.removeAction.setOnClickListener { gesture.removeApp(activity) } } - override fun getItemCount(): Int { return gesturesList.size } + override fun getItemCount(): Int { + return gesturesList.size + } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val inflater = LayoutInflater.from(parent.context) @@ -139,7 +147,8 @@ class ActionsRecyclerAdapter(val activity: Activity): val edgeActions = LauncherPreferences.enabled_gestures().edgeSwipe() gesturesList = Gesture.values().filter { (doubleActions || !it.isDoubleVariant()) - && (edgeActions || !it.isEdgeVariant())} as ArrayList + && (edgeActions || !it.isEdgeVariant()) + } as ArrayList } fun updateActions() { @@ -148,7 +157,8 @@ class ActionsRecyclerAdapter(val activity: Activity): this.gesturesList.clear() gesturesList.addAll(Gesture.values().filter { (doubleActions || !it.isDoubleVariant()) - && (edgeActions || !it.isEdgeVariant())}) + && (edgeActions || !it.isEdgeVariant()) + }) notifyDataSetChanged() } @@ -158,7 +168,8 @@ class ActionsRecyclerAdapter(val activity: Activity): val intent = Intent(activity, ListActivity::class.java) intent.putExtra("intention", ListActivity.ListActivityIntention.PICK.toString()) intent.putExtra("forGesture", gesture.id) // for which action we choose the app - activity.startActivityForResult(intent, + activity.startActivityForResult( + intent, REQUEST_CHOOSE_APP ) } 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 c8240bf..94d1e10 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 @@ -4,8 +4,8 @@ import android.content.Context import android.content.Intent import android.os.Bundle import androidx.preference.PreferenceFragmentCompat -import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.R +import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.setDefaultHomeScreen @@ -21,7 +21,9 @@ class SettingsFragmentLauncher : PreferenceFragmentCompat() { preferenceManager.sharedPreferencesMode = Context.MODE_PRIVATE setPreferencesFromResource(R.xml.preferences, rootKey) - val selectWallpaper = findPreference(LauncherPreferences.theme().keys().wallpaper()) + val selectWallpaper = findPreference( + LauncherPreferences.theme().keys().wallpaper() + ) selectWallpaper?.setOnPreferenceClickListener { // 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) @@ -30,7 +32,9 @@ class SettingsFragmentLauncher : PreferenceFragmentCompat() { startActivity(intent) true } - val chooseHomeScreen = findPreference(LauncherPreferences.general().keys().chooseHomeScreen()) + val chooseHomeScreen = findPreference( + LauncherPreferences.general().keys().chooseHomeScreen() + ) chooseHomeScreen?.setOnPreferenceClickListener { setDefaultHomeScreen(requireContext(), checkDefault = false) true diff --git a/app/src/main/java/de/jrpie/android/launcher/settings/meta/SettingsFragmentMeta.kt b/app/src/main/java/de/jrpie/android/launcher/settings/meta/SettingsFragmentMeta.kt index 93c883e..bcec08f 100644 --- a/app/src/main/java/de/jrpie/android/launcher/settings/meta/SettingsFragmentMeta.kt +++ b/app/src/main/java/de/jrpie/android/launcher/settings/meta/SettingsFragmentMeta.kt @@ -10,10 +10,10 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import de.jrpie.android.launcher.R import de.jrpie.android.launcher.UIObject +import de.jrpie.android.launcher.databinding.SettingsMetaBinding import de.jrpie.android.launcher.openNewTabWindow import de.jrpie.android.launcher.preferences.resetSettings import de.jrpie.android.launcher.tutorial.TutorialActivity -import de.jrpie.android.launcher.databinding.SettingsMetaBinding /** * The [SettingsFragmentMeta] is a used as a tab in the SettingsActivity. @@ -65,7 +65,8 @@ class SettingsFragmentMeta : Fragment(), UIObject { AlertDialog.Builder(this.requireContext(), R.style.AlertDialogCustom) .setTitle(getString(R.string.settings_meta_reset)) .setMessage(getString(R.string.settings_meta_reset_confirm)) - .setPositiveButton(android.R.string.ok + .setPositiveButton( + android.R.string.ok ) { _, _ -> resetSettings(this.requireContext()) requireActivity().finish() @@ -85,7 +86,6 @@ class SettingsFragmentMeta : Fragment(), UIObject { } - // contact developer binding.settingsMetaButtonContact.setOnClickListener { openNewTabWindow( diff --git a/app/src/main/java/de/jrpie/android/launcher/tutorial/TutorialActivity.kt b/app/src/main/java/de/jrpie/android/launcher/tutorial/TutorialActivity.kt index 62df8b6..0c0e75b 100644 --- a/app/src/main/java/de/jrpie/android/launcher/tutorial/TutorialActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/tutorial/TutorialActivity.kt @@ -8,10 +8,10 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.google.android.material.tabs.TabLayout -import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.R import de.jrpie.android.launcher.REQUEST_CHOOSE_APP import de.jrpie.android.launcher.UIObject +import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.resetSettings import de.jrpie.android.launcher.saveListActivityChoice import de.jrpie.android.launcher.tutorial.tabs.TutorialFragmentConcept @@ -27,7 +27,7 @@ import de.jrpie.android.launcher.tutorial.tabs.TutorialFragmentUsage * It tells the user about the concept behind launcher * and helps with the setup process (on new installations) */ -class TutorialActivity: AppCompatActivity(), UIObject { +class TutorialActivity : AppCompatActivity(), UIObject { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -36,7 +36,7 @@ class TutorialActivity: AppCompatActivity(), UIObject { setContentView(R.layout.tutorial) // Check if the app was started before - if(!LauncherPreferences.internal().started()) + if (!LauncherPreferences.internal().started()) resetSettings(this) // set up tabs and swiping in settings @@ -54,7 +54,7 @@ class TutorialActivity: AppCompatActivity(), UIObject { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { when (requestCode) { - REQUEST_CHOOSE_APP -> saveListActivityChoice(this,data) + REQUEST_CHOOSE_APP -> saveListActivityChoice(this, data) else -> super.onActivityResult(requestCode, resultCode, data) } } @@ -73,11 +73,11 @@ class TutorialActivity: AppCompatActivity(), UIObject { * * Tabs: (Start | Concept | Usage | Setup | Finish) */ -class TutorialSectionsPagerAdapter(fm: FragmentManager) - : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { +class TutorialSectionsPagerAdapter(fm: FragmentManager) : + FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { override fun getItem(position: Int): Fragment { - return when (position){ + return when (position) { 0 -> TutorialFragmentStart() 1 -> TutorialFragmentConcept() 2 -> TutorialFragmentUsage() @@ -88,6 +88,11 @@ class TutorialSectionsPagerAdapter(fm: FragmentManager) } /* We don't use titles here, as we have the dots */ - override fun getPageTitle(position: Int): CharSequence { return "" } - override fun getCount(): Int { return 5 } + override fun getPageTitle(position: Int): CharSequence { + return "" + } + + override fun getCount(): Int { + return 5 + } } diff --git a/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentConcept.kt b/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentConcept.kt index ffeb464..4296e3d 100644 --- a/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentConcept.kt +++ b/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentConcept.kt @@ -8,6 +8,7 @@ import androidx.fragment.app.Fragment import de.jrpie.android.launcher.BuildConfig import de.jrpie.android.launcher.UIObject import de.jrpie.android.launcher.databinding.TutorialConceptBinding + /** * The [TutorialFragmentConcept] is a used as a tab in the TutorialActivity. * @@ -25,7 +26,7 @@ class TutorialFragmentConcept : Fragment(), UIObject { return binding.root } - override fun onStart(){ + override fun onStart() { super.onStart() super.onStart() } diff --git a/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentFinish.kt b/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentFinish.kt index f4598b1..94940f5 100644 --- a/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentFinish.kt +++ b/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentFinish.kt @@ -1,14 +1,15 @@ package de.jrpie.android.launcher.tutorial.tabs import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import de.jrpie.android.launcher.* +import androidx.fragment.app.Fragment import de.jrpie.android.launcher.BuildConfig.VERSION_CODE +import de.jrpie.android.launcher.UIObject import de.jrpie.android.launcher.databinding.TutorialFinishBinding import de.jrpie.android.launcher.preferences.LauncherPreferences +import de.jrpie.android.launcher.setDefaultHomeScreen /** * The [TutorialFragmentFinish] is a used as a tab in the TutorialActivity. @@ -34,11 +35,11 @@ class TutorialFragmentFinish : Fragment(), UIObject { override fun setOnClicks() { super.setOnClicks() - binding.tutorialFinishButtonStart.setOnClickListener{ finishTutorial() } + binding.tutorialFinishButtonStart.setOnClickListener { finishTutorial() } } private fun finishTutorial() { - if(!LauncherPreferences.internal().started()) { + if (!LauncherPreferences.internal().started()) { LauncherPreferences.internal().started(true) LauncherPreferences.internal().startedTime(System.currentTimeMillis() / 1000L) LauncherPreferences.internal().versionCode(VERSION_CODE) diff --git a/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentSetup.kt b/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentSetup.kt index a71088d..2aab7c9 100644 --- a/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentSetup.kt +++ b/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentSetup.kt @@ -22,7 +22,7 @@ class TutorialFragmentSetup : Fragment(), UIObject { return inflater.inflate(R.layout.tutorial_setup, container, false) } - override fun onStart(){ + override fun onStart() { super.onStart() super.onStart() } diff --git a/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentStart.kt b/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentStart.kt index 433da9b..40b5e7c 100644 --- a/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentStart.kt +++ b/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentStart.kt @@ -1,11 +1,12 @@ package de.jrpie.android.launcher.tutorial.tabs import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import de.jrpie.android.launcher.* +import androidx.fragment.app.Fragment +import de.jrpie.android.launcher.UIObject +import de.jrpie.android.launcher.blink import de.jrpie.android.launcher.databinding.TutorialStartBinding /** @@ -25,7 +26,7 @@ class TutorialFragmentStart : Fragment(), UIObject { return binding.root } - override fun onStart(){ + override fun onStart() { super.onStart() super.onStart() } diff --git a/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentUsage.kt b/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentUsage.kt index 00cd9d3..8cd7f9d 100644 --- a/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentUsage.kt +++ b/app/src/main/java/de/jrpie/android/launcher/tutorial/tabs/TutorialFragmentUsage.kt @@ -22,7 +22,7 @@ class TutorialFragmentUsage : Fragment(), UIObject { return inflater.inflate(R.layout.tutorial_usage, container, false) } - override fun onStart(){ + override fun onStart() { super.onStart() super.onStart() } diff --git a/app/src/main/res/anim/bottom_up.xml b/app/src/main/res/anim/bottom_up.xml index 1a128eb..50889e5 100644 --- a/app/src/main/res/anim/bottom_up.xml +++ b/app/src/main/res/anim/bottom_up.xml @@ -2,9 +2,9 @@ + android:toYDelta="0%p" /> \ No newline at end of file diff --git a/app/src/main/res/anim/left_right.xml b/app/src/main/res/anim/left_right.xml index 1dd2cb4..7b5eb38 100644 --- a/app/src/main/res/anim/left_right.xml +++ b/app/src/main/res/anim/left_right.xml @@ -2,9 +2,9 @@ + android:toXDelta="0%p" /> \ No newline at end of file diff --git a/app/src/main/res/anim/right_left.xml b/app/src/main/res/anim/right_left.xml index 58e2060..ecccc1f 100644 --- a/app/src/main/res/anim/right_left.xml +++ b/app/src/main/res/anim/right_left.xml @@ -2,9 +2,9 @@ + android:toXDelta="0%p" /> \ No newline at end of file diff --git a/app/src/main/res/anim/top_down.xml b/app/src/main/res/anim/top_down.xml index 239c475..84798ce 100644 --- a/app/src/main/res/anim/top_down.xml +++ b/app/src/main/res/anim/top_down.xml @@ -2,9 +2,9 @@ + android:toYDelta="0%p" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_close_24.xml b/app/src/main/res/drawable/baseline_close_24.xml index 6633ab1..fcfb043 100644 --- a/app/src/main/res/drawable/baseline_close_24.xml +++ b/app/src/main/res/drawable/baseline_close_24.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/baseline_menu_24.xml b/app/src/main/res/drawable/baseline_menu_24.xml index bb74ee9..4802bd8 100644 --- a/app/src/main/res/drawable/baseline_menu_24.xml +++ b/app/src/main/res/drawable/baseline_menu_24.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/baseline_more_horiz_24.xml b/app/src/main/res/drawable/baseline_more_horiz_24.xml index 5cf9689..c9007c6 100644 --- a/app/src/main/res/drawable/baseline_more_horiz_24.xml +++ b/app/src/main/res/drawable/baseline_more_horiz_24.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/baseline_not_interested_24.xml b/app/src/main/res/drawable/baseline_not_interested_24.xml index ae05a1b..6cc4b8c 100644 --- a/app/src/main/res/drawable/baseline_not_interested_24.xml +++ b/app/src/main/res/drawable/baseline_not_interested_24.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/baseline_notifications_24.xml b/app/src/main/res/drawable/baseline_notifications_24.xml index 9425400..fd97353 100644 --- a/app/src/main/res/drawable/baseline_notifications_24.xml +++ b/app/src/main/res/drawable/baseline_notifications_24.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/baseline_search_24.xml b/app/src/main/res/drawable/baseline_search_24.xml index 309824f..c599843 100644 --- a/app/src/main/res/drawable/baseline_search_24.xml +++ b/app/src/main/res/drawable/baseline_search_24.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/baseline_settings_24.xml b/app/src/main/res/drawable/baseline_settings_24.xml index 0916edd..5f1bc1c 100644 --- a/app/src/main/res/drawable/baseline_settings_24.xml +++ b/app/src/main/res/drawable/baseline_settings_24.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/baseline_settings_applications_24.xml b/app/src/main/res/drawable/baseline_settings_applications_24.xml index 854b024..0f3525c 100644 --- a/app/src/main/res/drawable/baseline_settings_applications_24.xml +++ b/app/src/main/res/drawable/baseline_settings_applications_24.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/baseline_skip_next_24.xml b/app/src/main/res/drawable/baseline_skip_next_24.xml index 53ea058..164be15 100644 --- a/app/src/main/res/drawable/baseline_skip_next_24.xml +++ b/app/src/main/res/drawable/baseline_skip_next_24.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/baseline_skip_previous_24.xml b/app/src/main/res/drawable/baseline_skip_previous_24.xml index 76574ae..ef93ccf 100644 --- a/app/src/main/res/drawable/baseline_skip_previous_24.xml +++ b/app/src/main/res/drawable/baseline_skip_previous_24.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/baseline_volume_down_24.xml b/app/src/main/res/drawable/baseline_volume_down_24.xml index c20ea79..15840c2 100644 --- a/app/src/main/res/drawable/baseline_volume_down_24.xml +++ b/app/src/main/res/drawable/baseline_volume_down_24.xml @@ -1,5 +1,13 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/baseline_volume_up_24.xml b/app/src/main/res/drawable/baseline_volume_up_24.xml index e9a1ba5..95b0f36 100644 --- a/app/src/main/res/drawable/baseline_volume_up_24.xml +++ b/app/src/main/res/drawable/baseline_volume_up_24.xml @@ -1,5 +1,13 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/tutorial_default_dot.xml b/app/src/main/res/drawable/tutorial_default_dot.xml index 29ebcd3..d870a0f 100644 --- a/app/src/main/res/drawable/tutorial_default_dot.xml +++ b/app/src/main/res/drawable/tutorial_default_dot.xml @@ -6,7 +6,7 @@ android:shape="ring" android:thickness="5dp" android:useLevel="false"> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/tutorial_selected_dot.xml b/app/src/main/res/drawable/tutorial_selected_dot.xml index 1adc83c..68a3299 100644 --- a/app/src/main/res/drawable/tutorial_selected_dot.xml +++ b/app/src/main/res/drawable/tutorial_selected_dot.xml @@ -6,7 +6,7 @@ android:shape="ring" android:thickness="5dp" android:useLevel="false"> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/tutorial_tab_selector.xml b/app/src/main/res/drawable/tutorial_tab_selector.xml index 67dbf34..2171911 100644 --- a/app/src/main/res/drawable/tutorial_tab_selector.xml +++ b/app/src/main/res/drawable/tutorial_tab_selector.xml @@ -1,8 +1,7 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/layout/home.xml b/app/src/main/res/layout/home.xml index b213078..598c57b 100644 --- a/app/src/main/res/layout/home.xml +++ b/app/src/main/res/layout/home.xml @@ -1,8 +1,6 @@ - - - - - - + custom:type="solid" /> + app:layout_constraintTop_toTopOf="parent" /> - + app:layout_constraintTop_toTopOf="parent" /> - - + app:layout_constraintStart_toStartOf="parent" + app:tabBackground="@drawable/tutorial_tab_selector" + app:tabGravity="center" + app:tabIndicatorHeight="0dp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/tutorial_concept.xml b/app/src/main/res/layout/tutorial_concept.xml index c04f7c9..93fb3e1 100644 --- a/app/src/main/res/layout/tutorial_concept.xml +++ b/app/src/main/res/layout/tutorial_concept.xml @@ -1,13 +1,12 @@ - - - - - - diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 036d09b..c9ad5f9 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 036d09b..c9ad5f9 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 152016a..db4c077 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,6 +1,6 @@ - - - V3RYR4ND0MK3YCR4P - startedBefore - firstStartup - version_code - settings.general.select_launcher - - Swipe Up - Double Up - Swipe Down - Double Down - Swipe Left - 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 - Long Click - Click on Date - Click on Time + μLauncher + + V3RYR4ND0MK3YCR4P + startedBefore + firstStartup + version_code + settings.general.select_launcher + + Swipe Up + Double Up + Swipe Down + Double Down + Swipe Left + 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 + Long Click + Click on Date + Click on Time - - theme.color_theme - - DEFAULT - DARK - - - theme.background - - TRANSPARENT - DIM - BLUR - SOLID - - theme.wallpaper - theme.font - - HACK - SYSTEM_DEFAULT - - theme.monochrome_icons - - timeVisible - dateVisible - dateLocalized - dateTimeFlip + + theme.color_theme + + DEFAULT + DARK + + + theme.background + + TRANSPARENT + DIM + BLUR + SOLID + + theme.wallpaper + theme.font + + HACK + SYSTEM_DEFAULT + + theme.monochrome_icons + + timeVisible + dateVisible + dateLocalized + dateTimeFlip - - disableTimeout - useFullScreen + + disableTimeout + useFullScreen - enableDoubleActions - enableEdgeActions - searchAutoLaunch - searchAutoKeyboard + enableDoubleActions + enableEdgeActions + searchAutoLaunch + searchAutoKeyboard - - - https://github.com/jrpie/Launcher - https://github.com/jrpie/Launcher/issues/new - https://s.jrpie.de/contact - https://s.jrpie.de/android-legal - https://www.finnmglas.com/contact/ - https://discord.com/invite/jV2AhF8 + + https://github.com/jrpie/Launcher + https://github.com/jrpie/Launcher/issues/new + https://s.jrpie.de/contact + https://s.jrpie.de/android-legal + https://www.finnmglas.com/contact/ + https://discord.com/invite/jV2AhF8 - - >>>>>]]> + + >>>>>]]> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2f4bd22..9c3218b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,9 +1,9 @@ - + Can\'t open app Want to change its settings? @@ -185,7 +185,6 @@ Start - Settings More options Error: Can\'t expand status bar.\nThis action is using functionality that is not part of the published Android API. Unfortunately, it does not seem to work on your device. diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index db2f80f..ea7d1f7 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -28,6 +28,7 @@ @color/darkTheme_background_color @color/darkTheme_text_color + + - - diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 7a32795..14334d3 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -1,66 +1,65 @@ - + + android:title="@string/settings_general_choose_home_screen" /> + android:title="@string/settings_launcher_section_appearance" + app:allowDividerAbove="false"> + android:title="@string/settings_theme_wallpaper" /> + android:summary="%s" + android:title="@string/settings_theme_color_theme" /> + android:title="@string/settings_theme_font" /> + android:key="@string/settings_theme_background_key" + android:summary="%s" + android:title="@string/settings_theme_background" /> + android:title="@string/settings_theme_monochrome_icons" /> - + @@ -69,21 +68,21 @@ app:allowDividerAbove="false"> + android:title="@string/settings_enabled_gestures_double_swipe" /> + android:key="@string/settings_enabled_gestures_edge_swipe_key" + android:title="@string/settings_enabled_gestures_edge_swipe" /> @@ -92,10 +91,10 @@ app:allowDividerAbove="false"> + android:title="@string/settings_display_full_screen" /> + android:title="@string/settings_display_screen_timeout_disabled" />