reformat code

This commit is contained in:
Josia Pietsch 2024-09-10 19:54:53 +02:00
parent 99acdba262
commit 5dc2ee3901
Signed by: jrpie
GPG key ID: E70B571D66986A2D
68 changed files with 842 additions and 543 deletions

View file

@ -23,8 +23,8 @@ android {
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 35 targetSdkVersion 35
compileSdk 35 compileSdk 35
versionCode 22 versionCode 23
versionName "j-0.0.9" versionName "j-0.0.10-beta1"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
@ -41,8 +41,6 @@ android {
} }
buildTypes { buildTypes {
release { release {
minifyEnabled true minifyEnabled true

View file

@ -3,7 +3,8 @@
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" <uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" /> tools:ignore="QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.ACCESS_HIDDEN_PROFILES" /> <uses-permission android:name="android.permission.ACCESS_HIDDEN_PROFILES" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" /> <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
@ -20,14 +21,15 @@
<activity <activity
android:name=".HomeActivity" android:name=".HomeActivity"
android:exported="true"
android:excludeFromRecents="true"
android:clearTaskOnLaunch="true" android:clearTaskOnLaunch="true"
android:excludeFromRecents="true"
android:exported="true"
android:launchMode="singleTask" android:launchMode="singleTask"
android:screenOrientation="portrait" android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"> tools:ignore="LockedOrientationActivity">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
@ -36,22 +38,20 @@
<activity <activity
android:name=".tutorial.TutorialActivity" android:name=".tutorial.TutorialActivity"
android:screenOrientation="portrait" android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"> tools:ignore="LockedOrientationActivity"></activity>
</activity>
<activity <activity
android:name=".list.ListActivity" android:name=".list.ListActivity"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize" android:windowSoftInputMode="adjustResize"
tools:ignore="LockedOrientationActivity"> tools:ignore="LockedOrientationActivity"></activity>
</activity>
<activity <activity
android:name=".settings.SettingsActivity" android:name=".settings.SettingsActivity"
android:exported="true" android:exported="true"
android:screenOrientation="portrait" android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"> tools:ignore="LockedOrientationActivity">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.APPLICATION_PREFERENCES"/> <action android:name="android.intent.action.APPLICATION_PREFERENCES" />
<category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>

View file

@ -3,7 +3,7 @@ package de.jrpie.android.launcher
import android.content.Context import android.content.Context
import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.LauncherPreferences
class Application: android.app.Application() { class Application : android.app.Application() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()

View file

@ -10,12 +10,8 @@ import android.content.pm.ApplicationInfo
import android.content.pm.LauncherActivityInfo import android.content.pm.LauncherActivityInfo
import android.content.pm.LauncherApps import android.content.pm.LauncherApps
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.BlendMode
import android.graphics.BlendModeColorFilter
import android.graphics.ColorMatrix import android.graphics.ColorMatrix
import android.graphics.ColorMatrixColorFilter import android.graphics.ColorMatrixColorFilter
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import android.graphics.Rect import android.graphics.Rect
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.media.AudioManager import android.media.AudioManager
@ -30,16 +26,11 @@ import android.util.DisplayMetrics
import android.util.Log import android.util.Log
import android.view.KeyEvent import android.view.KeyEvent
import android.view.View import android.view.View
import android.view.Window
import android.view.WindowManager
import android.view.animation.AlphaAnimation import android.view.animation.AlphaAnimation
import android.view.animation.Animation import android.view.animation.Animation
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import android.widget.Button
import android.widget.ImageView import android.widget.ImageView
import android.widget.Switch
import android.widget.Toast import android.widget.Toast
import androidx.annotation.RequiresApi
import de.jrpie.android.launcher.list.ListActivity import de.jrpie.android.launcher.list.ListActivity
import de.jrpie.android.launcher.list.apps.AppInfo import de.jrpie.android.launcher.list.apps.AppInfo
import de.jrpie.android.launcher.list.apps.AppsRecyclerAdapter import de.jrpie.android.launcher.list.apps.AppsRecyclerAdapter
@ -87,19 +78,23 @@ fun setDefaultHomeScreen(context: Context, checkDefault: Boolean = false) {
if (checkDefault if (checkDefault
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
&& context is Activity) { && context is Activity
) {
val roleManager = context.getSystemService(RoleManager::class.java) val roleManager = context.getSystemService(RoleManager::class.java)
if(!roleManager.isRoleHeld(RoleManager.ROLE_HOME)) { if (!roleManager.isRoleHeld(RoleManager.ROLE_HOME)) {
context.startActivityForResult(roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME), REQUEST_SET_DEFAULT_HOME) context.startActivityForResult(
roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME),
REQUEST_SET_DEFAULT_HOME
)
} }
return return
} }
if(checkDefault) { if (checkDefault) {
val testIntent = Intent(Intent.ACTION_MAIN) val testIntent = Intent(Intent.ACTION_MAIN)
testIntent.addCategory(Intent.CATEGORY_HOME) testIntent.addCategory(Intent.CATEGORY_HOME)
val defaultHome = testIntent.resolveActivity(context.packageManager)?.packageName val defaultHome = testIntent.resolveActivity(context.packageManager)?.packageName
if(defaultHome == context.packageName){ if (defaultHome == context.packageName) {
// Launcher is already the default home app // Launcher is already the default home app
return return
} }
@ -116,7 +111,8 @@ fun isInstalled(uri: String, context: Context): Boolean {
try { try {
context.packageManager.getPackageInfo(uri, PackageManager.GET_ACTIVITIES) context.packageManager.getPackageInfo(uri, PackageManager.GET_ACTIVITIES)
return true return true
} catch (_: PackageManager.NameNotFoundException) { } } catch (_: PackageManager.NameNotFoundException) {
}
return false return false
} }
@ -133,9 +129,8 @@ fun launch(
) { ) {
if (LauncherAction.isOtherAction(data)) { // [type]:[info] if (LauncherAction.isOtherAction(data)) { // [type]:[info]
LauncherAction.byId(data)?.let {it.launch(activity) } LauncherAction.byId(data)?.let { it.launch(activity) }
} } else launchApp(data, user, activity) // app
else launchApp(data, user, activity) // app
activity.overridePendingTransition(animationIn, animationOut) activity.overridePendingTransition(animationIn, animationOut)
} }
@ -148,7 +143,8 @@ fun audioNextTrack(activity: Activity) {
val eventTime: Long = SystemClock.uptimeMillis() 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) mAudioManager.dispatchMediaKeyEvent(downEvent)
val upEvent = KeyEvent(eventTime, eventTime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT, 0) 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) KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS, 0)
mAudioManager.dispatchMediaKeyEvent(downEvent) 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) mAudioManager.dispatchMediaKeyEvent(upEvent)
} }
@ -199,7 +196,11 @@ fun expandNotificationsPanel(context: Context) {
val showStatusBar = statusBarManager.getMethod("expandNotificationsPanel") val showStatusBar = statusBarManager.getMethod("expandNotificationsPanel")
showStatusBar.invoke(statusBarService) showStatusBar.invoke(statusBarService)
} catch (e: Exception) { } 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 val userManager = context.getSystemService(Service.USER_SERVICE) as UserManager
return userManager.userProfiles.firstOrNull { it.hashCode() == user } 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 val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps
return getUserFromId(user,context)?.let { return getUserFromId(user, context)?.let { userHandle ->
userHandle -> launcherApps.getActivityList(packageName, userHandle).firstOrNull() launcherApps.getActivityList(packageName, userHandle).firstOrNull()
} }
} }
fun uninstallApp(packageName: String, user: Int?, activity: Activity) { fun uninstallApp(packageName: String, user: Int?, activity: Activity) {
Log.i("Launcher", "uninstalling $packageName ($user)") Log.i("Launcher", "uninstalling $packageName ($user)")
val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE) val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE)
intent.data = Uri.parse("package:$packageName") intent.data = Uri.parse("package:$packageName")
getUserFromId(user, activity)?.let { getUserFromId(user, activity)?.let { user ->
user -> intent.putExtra(Intent.EXTRA_USER, user) intent.putExtra(Intent.EXTRA_USER, user)
} }
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true) intent.putExtra(Intent.EXTRA_RETURN_RESULT, true)
activity.startActivityForResult(intent, activity.startActivityForResult(
intent,
REQUEST_UNINSTALL REQUEST_UNINSTALL
) )
} }
fun launchApp(packageName: String, user: Int?, context: Context, rect: Rect? = null) { 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) { if (user != null) {
val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps
getLauncherActivityInfo(packageName,user,context)?.let { getLauncherActivityInfo(packageName, user, context)?.let { app ->
app -> launcherApps.startMainActivity(app.componentName, app.user, rect, null) launcherApps.startMainActivity(app.componentName, app.user, rect, null)
return return
} }
} }
@ -244,7 +252,7 @@ fun launchApp(packageName: String, user: Int?, context: Context, rect: Rect? = n
if (intent != null) { if (intent != null) {
context.startActivity(intent) context.startActivity(intent)
} else { } else {
if (isInstalled(packageName, context)){ if (isInstalled(packageName, context)) {
AlertDialog.Builder( AlertDialog.Builder(
context, 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)) .setTitle(context.getString(R.string.alert_cant_open_title))
.setMessage(context.getString(R.string.alert_cant_open_message)) .setMessage(context.getString(R.string.alert_cant_open_message))
.setPositiveButton(android.R.string.ok .setPositiveButton(
android.R.string.ok
) { _, _ -> ) { _, _ ->
openAppSettings( openAppSettings(
packageName, 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 val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps
getLauncherActivityInfo(packageName, user, context)?.let { getLauncherActivityInfo(packageName, user, context)?.let { app ->
app -> launcherApps.startAppDetailsActivity(app.componentName, app.user, sourceBounds, opts) launcherApps.startAppDetailsActivity(app.componentName, app.user, sourceBounds, opts)
} }
} }
@ -294,11 +309,11 @@ fun openSettings(activity: Activity) {
activity.startActivity(Intent(activity, SettingsActivity::class.java)) activity.startActivity(Intent(activity, SettingsActivity::class.java))
} }
fun openTutorial(activity: Activity){ fun openTutorial(activity: Activity) {
activity.startActivity(Intent(activity, TutorialActivity::class.java)) activity.startActivity(Intent(activity, TutorialActivity::class.java))
} }
fun openAppsList(activity: Activity){ fun openAppsList(activity: Activity) {
val intent = Intent(activity, ListActivity::class.java) val intent = Intent(activity, ListActivity::class.java)
intent.putExtra("intention", ListActivity.ListActivityIntention.VIEW.toString()) intent.putExtra("intention", ListActivity.ListActivityIntention.VIEW.toString())
activity.startActivity(intent) activity.startActivity(intent)
@ -307,9 +322,9 @@ fun openAppsList(activity: Activity){
fun getAppIcon(context: Context, packageName: String, user: Int?): Drawable { fun getAppIcon(context: Context, packageName: String, user: Int?): Drawable {
if (user != null) { if (user != null) {
val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps
getUserFromId(user,context)?.let { getUserFromId(user, context)?.let { userHandle ->
userHandle -> launcherApps.getActivityList(packageName, userHandle).firstOrNull()?.let { launcherApps.getActivityList(packageName, userHandle).firstOrNull()?.let { app ->
app -> return app.getBadgedIcon(0) return app.getBadgedIcon(0)
} }
} }
} }
@ -328,21 +343,22 @@ fun loadApps(packageManager: PackageManager, context: Context) {
// TODO: shortcuts - launcherApps.getShortcuts() // TODO: shortcuts - launcherApps.getShortcuts()
val users = userManager.userProfiles val users = userManager.userProfiles
for(user in users) { for (user in users) {
for (activityInfo in launcherApps.getActivityList(null,user)) { for (activityInfo in launcherApps.getActivityList(null, user)) {
val app = AppInfo() val app = AppInfo()
app.label = activityInfo.label app.label = activityInfo.label
app.packageName = activityInfo.applicationInfo.packageName app.packageName = activityInfo.applicationInfo.packageName
app.icon = activityInfo.getBadgedIcon(0) app.icon = activityInfo.getBadgedIcon(0)
app.user = user.hashCode() 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) loadList.add(app)
} }
} }
// fallback option // fallback option
if(loadList.isEmpty()){ if (loadList.isEmpty()) {
Log.i("Launcher", "using fallback option to load packages") Log.i("Launcher", "using fallback option to load packages")
val i = Intent(Intent.ACTION_MAIN, null) val i = Intent(Intent.ACTION_MAIN, null)
i.addCategory(Intent.CATEGORY_LAUNCHER) i.addCategory(Intent.CATEGORY_LAUNCHER)
@ -365,7 +381,7 @@ fun loadApps(packageManager: PackageManager, context: Context) {
fun saveListActivityChoice(context: Context, data: Intent?) { fun saveListActivityChoice(context: Context, data: Intent?) {
val value = data?.getStringExtra("value") val value = data?.getStringExtra("value")
var user = data?.getIntExtra("user", INVALID_USER) var user = data?.getIntExtra("user", INVALID_USER)
user = user?.let{ if(it == INVALID_USER) null else it } user = user?.let { if (it == INVALID_USER) null else it }
val forGesture = data?.getStringExtra("forGesture") ?: return val forGesture = data?.getStringExtra("forGesture") ?: return
@ -381,7 +397,7 @@ fun openSoftKeyboard(context: Context, view: View) {
} }
// Taken from: https://stackoverflow.com/a/30340794/12787264 // Taken from: https://stackoverflow.com/a/30340794/12787264
fun transformGrayscale(imageView: ImageView){ fun transformGrayscale(imageView: ImageView) {
val matrix = ColorMatrix() val matrix = ColorMatrix()
matrix.setSaturation(0f) matrix.setSaturation(0f)

View file

@ -11,34 +11,135 @@ import de.jrpie.android.launcher.preferences.LauncherPreferences
* @param animationIn res id of transition animation (in) when using the gesture to launch an app. * @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. * @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, enum class Gesture(
val id: String, private val labelResource: Int,
private val defaultsResource: Int, private val defaultsResource: Int,
private val animationIn: Int = android.R.anim.fade_in, private val animationIn: Int = android.R.anim.fade_in,
private val animationOut: Int = android.R.anim.fade_out){ 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), 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), TIME("action_timeApp", R.string.settings_gesture_time, R.array.default_time),
DATE("action_dateApp", R.string.settings_gesture_date, R.array.default_date), 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), LONG_CLICK(
DOUBLE_CLICK("action_doubleClickApp", R.string.settings_gesture_double_click, R.array.default_double_click,0,0), "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("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_LEFT_EDGE(
SWIPE_UP_RIGHT_EDGE("action_up_rightApp", R.string.settings_gesture_up_right_edge, R.array.default_up_right, R.anim.bottom_up), "action_up_leftApp",
SWIPE_UP_DOUBLE( "action_doubleUpApp", R.string.settings_gesture_double_up, R.array.default_double_up, R.anim.bottom_up), R.string.settings_gesture_up_left_edge,
SWIPE_DOWN("action_downApp", R.string.settings_gesture_down, R.array.default_down, R.anim.top_down), R.array.default_up_left,
SWIPE_DOWN_LEFT_EDGE("action_down_leftApp", R.string.settings_gesture_down_left_edge, R.array.default_down_left, R.anim.top_down), R.anim.bottom_up
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_UP_RIGHT_EDGE(
SWIPE_LEFT("action_leftApp", R.string.settings_gesture_left, R.array.default_left, R.anim.right_left), "action_up_rightApp",
SWIPE_LEFT_TOP_EDGE("action_left_topApp", R.string.settings_gesture_left_top_edge, R.array.default_left_top, R.anim.right_left), R.string.settings_gesture_up_right_edge,
SWIPE_LEFT_BOTTOM_EDGE("action_left_bottomApp", R.string.settings_gesture_left_bottom_edge, R.array.default_left_bottom, R.anim.right_left), R.array.default_up_right,
SWIPE_LEFT_DOUBLE("action_doubleLeftApp", R.string.settings_gesture_double_left, R.array.default_double_left, R.anim.right_left), R.anim.bottom_up
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_UP_DOUBLE(
SWIPE_RIGHT_BOTTOM_EDGE("action_right_bottomApp", R.string.settings_gesture_right_bottom_edge, R.array.default_right_bottom, R.anim.left_right), "action_doubleUpApp",
SWIPE_RIGHT_DOUBLE("action_doubleRightApp", R.string.settings_gesture_double_right, R.array.default_double_right, R.anim.left_right); 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{ enum class Edge {
TOP, BOTTOM, LEFT, RIGHT TOP, BOTTOM, LEFT, RIGHT
} }
@ -46,8 +147,8 @@ enum class Gesture (val id: String, private val labelResource: Int,
val preferences = LauncherPreferences.getSharedPreferences() val preferences = LauncherPreferences.getSharedPreferences()
var packageName = preferences.getString(this.id, "")!! var packageName = preferences.getString(this.id, "")!!
var u: Int? = preferences.getInt(this.id + "_user", INVALID_USER) var u: Int? = preferences.getInt(this.id + "_user", INVALID_USER)
u = if(u == INVALID_USER) null else u u = if (u == INVALID_USER) null else u
return Pair(packageName,u) return Pair(packageName, u)
} }
fun removeApp(context: Context) { fun removeApp(context: Context) {
@ -61,7 +162,7 @@ enum class Gesture (val id: String, private val labelResource: Int,
.putString(this.id, app) .putString(this.id, app)
.apply() .apply()
val u = user?: INVALID_USER val u = user ?: INVALID_USER
LauncherPreferences.getSharedPreferences().edit() LauncherPreferences.getSharedPreferences().edit()
.putInt(this.id + "_user", u) .putInt(this.id + "_user", u)
.apply() .apply()
@ -71,7 +172,7 @@ enum class Gesture (val id: String, private val labelResource: Int,
return context.resources.getString(this.labelResource) return context.resources.getString(this.labelResource)
} }
fun pickDefaultApp(context: Context) : String { fun pickDefaultApp(context: Context): String {
return context.resources return context.resources
.getStringArray(this.defaultsResource) .getStringArray(this.defaultsResource)
.firstOrNull { isInstalled(it, context) } .firstOrNull { isInstalled(it, context) }
@ -79,7 +180,7 @@ enum class Gesture (val id: String, private val labelResource: Int,
} }
fun getDoubleVariant(): Gesture { fun getDoubleVariant(): Gesture {
return when(this) { return when (this) {
SWIPE_UP -> SWIPE_UP_DOUBLE SWIPE_UP -> SWIPE_UP_DOUBLE
SWIPE_DOWN -> SWIPE_DOWN_DOUBLE SWIPE_DOWN -> SWIPE_DOWN_DOUBLE
SWIPE_LEFT -> SWIPE_LEFT_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 { fun getEdgeVariant(edge: Edge): Gesture {
return when(edge) { return when (edge) {
Edge.TOP -> Edge.TOP ->
when(this) { when (this) {
SWIPE_LEFT -> SWIPE_LEFT_TOP_EDGE SWIPE_LEFT -> SWIPE_LEFT_TOP_EDGE
SWIPE_RIGHT -> SWIPE_RIGHT_TOP_EDGE SWIPE_RIGHT -> SWIPE_RIGHT_TOP_EDGE
else -> this else -> this
} }
Edge.BOTTOM -> Edge.BOTTOM ->
when(this) { when (this) {
SWIPE_LEFT -> SWIPE_LEFT_BOTTOM_EDGE SWIPE_LEFT -> SWIPE_LEFT_BOTTOM_EDGE
SWIPE_RIGHT -> SWIPE_RIGHT_BOTTOM_EDGE SWIPE_RIGHT -> SWIPE_RIGHT_BOTTOM_EDGE
else -> this else -> this
} }
Edge.LEFT -> Edge.LEFT ->
when(this) { when (this) {
SWIPE_UP -> SWIPE_UP_LEFT_EDGE SWIPE_UP -> SWIPE_UP_LEFT_EDGE
SWIPE_DOWN -> SWIPE_DOWN_LEFT_EDGE SWIPE_DOWN -> SWIPE_DOWN_LEFT_EDGE
else -> this else -> this
} }
Edge.RIGHT -> Edge.RIGHT ->
when(this) { when (this) {
SWIPE_UP -> SWIPE_UP_RIGHT_EDGE SWIPE_UP -> SWIPE_UP_RIGHT_EDGE
SWIPE_DOWN -> SWIPE_DOWN_RIGHT_EDGE SWIPE_DOWN -> SWIPE_DOWN_RIGHT_EDGE
else -> this else -> this
@ -118,17 +222,18 @@ enum class Gesture (val id: String, private val labelResource: Int,
} }
fun isDoubleVariant(): Boolean { fun isDoubleVariant(): Boolean {
return when(this){ return when (this) {
SWIPE_UP_DOUBLE, SWIPE_UP_DOUBLE,
SWIPE_DOWN_DOUBLE, SWIPE_DOWN_DOUBLE,
SWIPE_LEFT_DOUBLE, SWIPE_LEFT_DOUBLE,
SWIPE_RIGHT_DOUBLE -> true SWIPE_RIGHT_DOUBLE -> true
else -> false else -> false
} }
} }
fun isEdgeVariant(): Boolean { fun isEdgeVariant(): Boolean {
return when(this){ return when (this) {
SWIPE_UP_RIGHT_EDGE, SWIPE_UP_RIGHT_EDGE,
SWIPE_UP_LEFT_EDGE, SWIPE_UP_LEFT_EDGE,
SWIPE_DOWN_LEFT_EDGE, SWIPE_DOWN_LEFT_EDGE,
@ -137,6 +242,7 @@ enum class Gesture (val id: String, private val labelResource: Int,
SWIPE_LEFT_BOTTOM_EDGE, SWIPE_LEFT_BOTTOM_EDGE,
SWIPE_RIGHT_TOP_EDGE, SWIPE_RIGHT_TOP_EDGE,
SWIPE_RIGHT_BOTTOM_EDGE -> true SWIPE_RIGHT_BOTTOM_EDGE -> true
else -> false else -> false
} }
} }
@ -148,7 +254,7 @@ enum class Gesture (val id: String, private val labelResource: Int,
companion object { companion object {
fun byId(id: String): Gesture? { fun byId(id: String): Gesture? {
return Gesture.values().firstOrNull {it.id == id } return Gesture.values().firstOrNull { it.id == id }
} }
} }

View file

@ -35,7 +35,7 @@ import kotlin.math.min
* - Setting global variables (preferences etc.) * - Setting global variables (preferences etc.)
* - Opening the [TutorialActivity] on new installations * - Opening the [TutorialActivity] on new installations
*/ */
class HomeActivity: UIObject, AppCompatActivity(), class HomeActivity : UIObject, AppCompatActivity(),
GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {
private lateinit var binding: HomeBinding private lateinit var binding: HomeBinding
@ -70,7 +70,7 @@ class HomeActivity: UIObject, AppCompatActivity(),
setContentView(binding.root) setContentView(binding.root)
} }
override fun onStart(){ override fun onStart() {
super<AppCompatActivity>.onStart() super<AppCompatActivity>.onStart()
mDetector = GestureDetectorCompat(this, this) mDetector = GestureDetectorCompat(this, this)
@ -97,7 +97,7 @@ class HomeActivity: UIObject, AppCompatActivity(),
var upperVisible = dateVisible var upperVisible = dateVisible
var lowerVisible = timeVisible var lowerVisible = timeVisible
if(LauncherPreferences.clock().flipDateTime()) { if (LauncherPreferences.clock().flipDateTime()) {
upperFormat = lowerFormat.also { lowerFormat = upperFormat } upperFormat = lowerFormat.also { lowerFormat = upperFormat }
upperVisible = lowerVisible.also { lowerVisible = upperVisible } upperVisible = lowerVisible.also { lowerVisible = upperVisible }
} }
@ -161,7 +161,7 @@ class HomeActivity: UIObject, AppCompatActivity(),
val edgeActions = LauncherPreferences.enabled_gestures().edgeSwipe() val edgeActions = LauncherPreferences.enabled_gestures().edgeSwipe()
val edgeStrictness = 0.15 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) if (diffX > width / 4)
Gesture.SWIPE_LEFT Gesture.SWIPE_LEFT
else if (diffX < -width / 4) else if (diffX < -width / 4)
@ -181,16 +181,16 @@ class HomeActivity: UIObject, AppCompatActivity(),
} }
if (edgeActions) { if (edgeActions) {
if(max(e1.x, e2.x) < edgeStrictness * width){ if (max(e1.x, e2.x) < edgeStrictness * width) {
gesture = gesture?.let{it.getEdgeVariant(Gesture.Edge.LEFT)} gesture = gesture?.let { it.getEdgeVariant(Gesture.Edge.LEFT) }
} else if (min(e1.x, e2.x) > (1-edgeStrictness) * width){ } else if (min(e1.x, e2.x) > (1 - edgeStrictness) * width) {
gesture = gesture?.let{it.getEdgeVariant(Gesture.Edge.RIGHT)} gesture = gesture?.let { it.getEdgeVariant(Gesture.Edge.RIGHT) }
} }
if(max(e1.y, e2.y) < edgeStrictness * height){ if (max(e1.y, e2.y) < edgeStrictness * height) {
gesture = gesture?.let{it.getEdgeVariant(Gesture.Edge.TOP)} gesture = gesture?.let { it.getEdgeVariant(Gesture.Edge.TOP) }
} else if (min(e1.y, e2.y) > (1-edgeStrictness) * height){ } else if (min(e1.y, e2.y) > (1 - edgeStrictness) * height) {
gesture = gesture?.let{it.getEdgeVariant(Gesture.Edge.BOTTOM)} gesture = gesture?.let { it.getEdgeVariant(Gesture.Edge.BOTTOM) }
} }
} }
gesture?.invoke(this) 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() { override fun setOnClicks() {
binding.homeUpperView.setOnClickListener { binding.homeUpperView.setOnClickListener {
if(LauncherPreferences.clock().flipDateTime()) { if (LauncherPreferences.clock().flipDateTime()) {
Gesture.TIME(this) Gesture.TIME(this)
} else { } else {
Gesture.DATE(this) Gesture.DATE(this)
@ -238,7 +242,7 @@ class HomeActivity: UIObject, AppCompatActivity(),
} }
binding.homeLowerView.setOnClickListener { binding.homeLowerView.setOnClickListener {
if(LauncherPreferences.clock().flipDateTime()) { if (LauncherPreferences.clock().flipDateTime()) {
Gesture.DATE(this) Gesture.DATE(this)
} else { } else {
Gesture.TIME(this) Gesture.TIME(this)
@ -248,11 +252,22 @@ class HomeActivity: UIObject, AppCompatActivity(),
/* TODO: Remove those. For now they are necessary /* TODO: Remove those. For now they are necessary
* because this inherits from GestureDetector.OnGestureListener */ * because this inherits from GestureDetector.OnGestureListener */
override fun onDoubleTapEvent(event: MotionEvent): Boolean { return false } override fun onDoubleTapEvent(event: MotionEvent): Boolean {
override fun onDown(event: MotionEvent): Boolean { return false } return false
override fun onScroll(e1: MotionEvent?, e2: MotionEvent, dX: Float, dY: Float): 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 onShowPress(event: MotionEvent) {}
override fun onSingleTapUp(event: MotionEvent): Boolean { return false } override fun onSingleTapUp(event: MotionEvent): Boolean {
return false
}
override fun isHomeScreen(): Boolean { override fun isHomeScreen(): Boolean {
return true return true

View file

@ -2,7 +2,6 @@ package de.jrpie.android.launcher
import android.app.Activity import android.app.Activity
import android.content.res.Resources import android.content.res.Resources
import android.os.Build
import android.view.Window import android.view.Window
import android.view.WindowManager import android.view.WindowManager
import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.LauncherPreferences
@ -43,6 +42,7 @@ interface UIObject {
setOnClicks() setOnClicks()
adjustLayout() adjustLayout()
} }
fun modifyTheme(theme: Resources.Theme): Resources.Theme { fun modifyTheme(theme: Resources.Theme): Resources.Theme {
LauncherPreferences.theme().colorTheme().applyToTheme(theme) LauncherPreferences.theme().colorTheme().applyToTheme(theme)
LauncherPreferences.theme().background().applyToTheme(theme) LauncherPreferences.theme().background().applyToTheme(theme)
@ -52,8 +52,8 @@ interface UIObject {
} }
// fun applyTheme() { } // fun applyTheme() { }
fun setOnClicks() { } fun setOnClicks() {}
fun adjustLayout() { } fun adjustLayout() {}
fun isHomeScreen(): Boolean { fun isHomeScreen(): Boolean {
return false return false

View file

@ -44,6 +44,7 @@ class ListActivity : AppCompatActivity(), UIObject {
VIEW(R.string.list_title_view), /* view list of apps */ 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 */ PICK(R.string.list_title_pick) /* choose app or action to associate to a gesture */
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -66,7 +67,8 @@ class ListActivity : AppCompatActivity(), UIObject {
binding.listContainer.context.resources.displayMetrics.heightPixels binding.listContainer.context.resources.displayMetrics.heightPixels
val diff = height - r.bottom val diff = height - r.bottom
if (diff != 0 && if (diff != 0 &&
LauncherPreferences.display().fullScreen()) { LauncherPreferences.display().fullScreen()
) {
if (binding.listContainer.paddingBottom !== diff) { if (binding.listContainer.paddingBottom !== diff) {
binding.listContainer.setPadding(0, 0, 0, diff) binding.listContainer.setPadding(0, 0, 0, diff)
} }
@ -80,7 +82,7 @@ class ListActivity : AppCompatActivity(), UIObject {
} }
override fun onStart(){ override fun onStart() {
super<AppCompatActivity>.onStart() super<AppCompatActivity>.onStart()
super<UIObject>.onStart() super<UIObject>.onStart()
} }
@ -146,11 +148,11 @@ private val TAB_TITLES = arrayOf(
* The [ListSectionsPagerAdapter] returns the fragment, * The [ListSectionsPagerAdapter] returns the fragment,
* which corresponds to the selected tab in [ListActivity]. * which corresponds to the selected tab in [ListActivity].
*/ */
class ListSectionsPagerAdapter(private val context: Context, fm: FragmentManager) class ListSectionsPagerAdapter(private val context: Context, fm: FragmentManager) :
: FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
override fun getItem(position: Int): Fragment { override fun getItem(position: Int): Fragment {
return when (position){ return when (position) {
0 -> ListFragmentApps() 0 -> ListFragmentApps()
1 -> ListFragmentOther() 1 -> ListFragmentOther()
else -> Fragment() else -> Fragment()

View file

@ -34,10 +34,12 @@ import kotlin.text.Regex.Companion.escapeReplacement
* @param intention - why the list is displayed ("view", "pick") * @param intention - why the list is displayed ("view", "pick")
* @param forGesture - the action which an app is chosen for (when the intention is "pick") * @param forGesture - the action which an app is chosen for (when the intention is "pick")
*/ */
class AppsRecyclerAdapter(val activity: Activity, class AppsRecyclerAdapter(
val activity: Activity,
private val intention: ListActivity.ListActivityIntention private val intention: ListActivity.ListActivityIntention
= ListActivity.ListActivityIntention.VIEW, = ListActivity.ListActivityIntention.VIEW,
private val forGesture: String? = ""): private val forGesture: String? = ""
) :
RecyclerView.Adapter<AppsRecyclerAdapter.ViewHolder>() { RecyclerView.Adapter<AppsRecyclerAdapter.ViewHolder>() {
private val appsListDisplayed: MutableList<AppInfo> private val appsListDisplayed: MutableList<AppInfo>
@ -53,7 +55,9 @@ class AppsRecyclerAdapter(val activity: Activity,
selectItem(adapterPosition, rect) selectItem(adapterPosition, rect)
} }
init { itemView.setOnClickListener(this) } init {
itemView.setOnClickListener(this)
}
} }
override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { 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 // decide when to show the options popup menu about
if (intention == ListActivity.ListActivityIntention.VIEW) { if (intention == ListActivity.ListActivityIntention.VIEW) {
viewHolder.textView.setOnLongClickListener{ showOptionsPopup(viewHolder, appPackageName, appUser, isSystemApp) } viewHolder.textView.setOnLongClickListener {
viewHolder.img.setOnLongClickListener{ showOptionsPopup(viewHolder, appPackageName, appUser, isSystemApp) } showOptionsPopup(
viewHolder,
appPackageName,
appUser,
isSystemApp
)
}
viewHolder.img.setOnLongClickListener {
showOptionsPopup(
viewHolder,
appPackageName,
appUser,
isSystemApp
)
}
// ensure onClicks are actually caught // ensure onClicks are actually caught
viewHolder.textView.setOnClickListener{ viewHolder.onClick(viewHolder.textView) } viewHolder.textView.setOnClickListener { viewHolder.onClick(viewHolder.textView) }
viewHolder.img.setOnClickListener{ viewHolder.onClick(viewHolder.img) } viewHolder.img.setOnClickListener { viewHolder.onClick(viewHolder.img) }
} }
} }
@Suppress("SameReturnValue") @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 //create the popup menu
val popup = PopupMenu(activity, viewHolder.img) val popup = PopupMenu(activity, viewHolder.img)
@ -97,10 +120,12 @@ class AppsRecyclerAdapter(val activity: Activity,
uninstallApp(appPackageName, user, activity) uninstallApp(appPackageName, user, activity)
true true
} }
R.id.app_menu_info -> { R.id.app_menu_info -> {
openAppSettings(appPackageName, user, activity) openAppSettings(appPackageName, user, activity)
true true
} }
else -> false else -> false
} }
} }
@ -109,7 +134,9 @@ class AppsRecyclerAdapter(val activity: Activity,
return true return true
} }
override fun getItemCount(): Int { return appsListDisplayed.size } override fun getItemCount(): Int {
return appsListDisplayed.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(parent.context) val inflater = LayoutInflater.from(parent.context)
@ -131,19 +158,20 @@ class AppsRecyclerAdapter(val activity: Activity,
} }
fun selectItem(pos: Int, rect: Rect = Rect()) { fun selectItem(pos: Int, rect: Rect = Rect()) {
if(pos >= appsListDisplayed.size) { if (pos >= appsListDisplayed.size) {
return return
} }
val appPackageName = appsListDisplayed[pos].packageName.toString() val appPackageName = appsListDisplayed[pos].packageName.toString()
val appUser = appsListDisplayed[pos].user val appUser = appsListDisplayed[pos].user
when (intention){ when (intention) {
ListActivity.ListActivityIntention.VIEW -> { ListActivity.ListActivityIntention.VIEW -> {
launchApp(appPackageName, appUser, activity, rect) launchApp(appPackageName, appUser, activity, rect)
} }
ListActivity.ListActivityIntention.PICK -> { ListActivity.ListActivityIntention.PICK -> {
val returnIntent = Intent() val returnIntent = Intent()
returnIntent.putExtra("value", appPackageName) returnIntent.putExtra("value", appPackageName)
appUser?.let{ returnIntent.putExtra("user", it) } appUser?.let { returnIntent.putExtra("user", it) }
returnIntent.putExtra("forGesture", forGesture) returnIntent.putExtra("forGesture", forGesture)
activity.setResult(REQUEST_CHOOSE_APP, returnIntent) activity.setResult(REQUEST_CHOOSE_APP, returnIntent)
activity.finish() activity.finish()
@ -160,12 +188,12 @@ class AppsRecyclerAdapter(val activity: Activity,
.lowercase(Locale.ROOT) .lowercase(Locale.ROOT)
.toCharArray() .toCharArray()
.distinct() .distinct()
.filter { c -> ! ((c in 'a'..'z') || (c in '0'..'9')) } .filter { c -> !((c in 'a'..'z') || (c in '0'..'9')) }
.map { c -> escapeReplacement(c.toString())} .map { c -> escapeReplacement(c.toString()) }
.fold("") { x,y -> x+y } .fold("") { x, y -> x + y }
var disallowedCharsRegex = "[^a-z0-9$allowedSpecialCharacters]".toRegex() var disallowedCharsRegex = "[^a-z0-9$allowedSpecialCharacters]".toRegex()
fun normalize(text: String): String{ fun normalize(text: String): String {
return text.lowercase(Locale.ROOT).replace(disallowedCharsRegex, "") return text.lowercase(Locale.ROOT).replace(disallowedCharsRegex, "")
} }
appsListDisplayed.clear() appsListDisplayed.clear()
@ -179,7 +207,7 @@ class AppsRecyclerAdapter(val activity: Activity,
if (itemLabel.startsWith(normalizedText)) { if (itemLabel.startsWith(normalizedText)) {
appsListDisplayed.add(item) appsListDisplayed.add(item)
}else if(itemLabel.contains(normalizedText)){ } else if (itemLabel.contains(normalizedText)) {
appsSecondary.add(item) appsSecondary.add(item)
} }
} }
@ -187,11 +215,13 @@ class AppsRecyclerAdapter(val activity: Activity,
} }
if (appsListDisplayed.size == 1 && intention == ListActivity.ListActivityIntention.VIEW if (appsListDisplayed.size == 1 && intention == ListActivity.ListActivityIntention.VIEW
&& LauncherPreferences.functionality().searchAutoLaunch()) { && LauncherPreferences.functionality().searchAutoLaunch()
) {
val info = appsListDisplayed[0] val info = appsListDisplayed[0]
launch(info.packageName.toString(), info.user, activity) 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) inputMethodManager.hideSoftInputFromWindow(View(activity).windowToken, 0)
} }

View file

@ -36,7 +36,7 @@ class ListFragmentApps : Fragment(), UIObject {
super<UIObject>.onStart() super<UIObject>.onStart()
} }
override fun setOnClicks() { } override fun setOnClicks() {}
override fun adjustLayout() { override fun adjustLayout() {
@ -66,7 +66,8 @@ class ListFragmentApps : Fragment(), UIObject {
}) })
if (intention == ListActivity.ListActivityIntention.VIEW if (intention == ListActivity.ListActivityIntention.VIEW
&& LauncherPreferences.functionality().searchAutoOpenKeyboard()){ && LauncherPreferences.functionality().searchAutoOpenKeyboard()
) {
openSoftKeyboard(requireContext(), binding.listAppsSearchview) openSoftKeyboard(requireContext(), binding.listAppsSearchview)
} }
} }

View file

@ -10,25 +10,50 @@ import de.jrpie.android.launcher.expandNotificationsPanel
import de.jrpie.android.launcher.openAppsList import de.jrpie.android.launcher.openAppsList
import de.jrpie.android.launcher.openSettings import de.jrpie.android.launcher.openSettings
enum class LauncherAction(val id: String, val label: Int, val icon: Int, val launch: (Activity) -> Unit) { enum class LauncherAction(
SETTINGS("launcher:settings", R.string.list_other_settings, R.drawable.baseline_settings_24, ::openSettings), val id: String,
CHOOSE("launcher:choose", R.string.list_other_list, R.drawable.baseline_menu_24, ::openAppsList), val label: Int,
VOLUME_UP("launcher:volumeUp", 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.string.list_other_volume_up,
R.drawable.baseline_volume_up_24, ::audioVolumeUp), R.drawable.baseline_volume_up_24, ::audioVolumeUp
VOLUME_DOWN("launcher:volumeDown", ),
VOLUME_DOWN(
"launcher:volumeDown",
R.string.list_other_volume_down, R.string.list_other_volume_down,
R.drawable.baseline_volume_down_24, ::audioVolumeDown), R.drawable.baseline_volume_down_24, ::audioVolumeDown
TRACK_NEXT("launcher:nextTrack", ),
TRACK_NEXT(
"launcher:nextTrack",
R.string.list_other_track_next, R.string.list_other_track_next,
R.drawable.baseline_skip_next_24, ::audioNextTrack), R.drawable.baseline_skip_next_24, ::audioNextTrack
TRACK_PREV("launcher:previousTrack", ),
TRACK_PREV(
"launcher:previousTrack",
R.string.list_other_track_previous, R.string.list_other_track_previous,
R.drawable.baseline_skip_previous_24, ::audioPreviousTrack), R.drawable.baseline_skip_previous_24, ::audioPreviousTrack
EXPAND_NOTIFICATIONS_PANEL("launcher:expandNotificationsPanel", ),
EXPAND_NOTIFICATIONS_PANEL(
"launcher:expandNotificationsPanel",
R.string.list_other_expand_notifications_panel, R.string.list_other_expand_notifications_panel,
R.drawable.baseline_notifications_24, R.drawable.baseline_notifications_24,
::expandNotificationsPanel), ::expandNotificationsPanel
),
NOP("launcher:nop", R.string.list_other_nop, R.drawable.baseline_not_interested_24, {}); NOP("launcher:nop", R.string.list_other_nop, R.drawable.baseline_not_interested_24, {});
companion object { companion object {

View file

@ -6,7 +6,6 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.databinding.ListOtherBinding import de.jrpie.android.launcher.databinding.ListOtherBinding
/** /**

View file

@ -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, * It lists `other` things to be launched that are not really represented by a URI,
* rather by Launcher- internal conventions. * rather by Launcher- internal conventions.
*/ */
class OtherRecyclerAdapter(val activity: Activity): class OtherRecyclerAdapter(val activity: Activity) :
RecyclerView.Adapter<OtherRecyclerAdapter.ViewHolder>() { RecyclerView.Adapter<OtherRecyclerAdapter.ViewHolder>() {
private val othersList: Array<LauncherAction> = LauncherAction.values() private val othersList: Array<LauncherAction> = LauncherAction.values()
@ -38,7 +38,9 @@ class OtherRecyclerAdapter(val activity: Activity):
forGesture?.let { returnChoiceIntent(it, content.id) } forGesture?.let { returnChoiceIntent(it, content.id) }
} }
init { itemView.setOnClickListener(this) } init {
itemView.setOnClickListener(this)
}
} }
override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) {
@ -49,7 +51,9 @@ class OtherRecyclerAdapter(val activity: Activity):
viewHolder.iconView.setImageResource(icon) 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 { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(parent.context) val inflater = LayoutInflater.from(parent.context)

View file

@ -18,7 +18,7 @@ import eu.jonahbauer.android.preference.annotations.Preferences;
@Preference(name = "started_time", type = long.class), @Preference(name = "started_time", type = long.class),
@Preference(name = "version_code", type = int.class, defaultValue = "-1"), @Preference(name = "version_code", type = int.class, defaultValue = "-1"),
}), }),
@PreferenceGroup( name = "gestures", prefix = "settings_gesture_", suffix = "_key", value = { @PreferenceGroup(name = "gestures", prefix = "settings_gesture_", suffix = "_key", value = {
}), }),
@PreferenceGroup(name = "general", prefix = "settings_general_", suffix = "_key", value = { @PreferenceGroup(name = "general", prefix = "settings_general_", suffix = "_key", value = {
@Preference(name = "choose_home_screen", type = void.class) @Preference(name = "choose_home_screen", type = void.class)
@ -40,7 +40,7 @@ import eu.jonahbauer.android.preference.annotations.Preferences;
@Preference(name = "screen_timeout_disabled", type = boolean.class, defaultValue = "false"), @Preference(name = "screen_timeout_disabled", type = boolean.class, defaultValue = "false"),
@Preference(name = "full_screen", type = boolean.class, defaultValue = "true"), @Preference(name = "full_screen", type = boolean.class, defaultValue = "true"),
}), }),
@PreferenceGroup( name = "functionality", prefix = "settings_functionality_", suffix = "_key", value = { @PreferenceGroup(name = "functionality", prefix = "settings_functionality_", suffix = "_key", value = {
@Preference(name = "search_auto_launch", type = boolean.class, defaultValue = "true"), @Preference(name = "search_auto_launch", type = boolean.class, defaultValue = "true"),
@Preference(name = "search_auto_open_keyboard", type = boolean.class, defaultValue = "true"), @Preference(name = "search_auto_open_keyboard", type = boolean.class, defaultValue = "true"),
}), }),

View file

@ -13,10 +13,14 @@ fun migrateToNewVersion(activity: Activity) {
when (LauncherPreferences.internal().versionCode()) { when (LauncherPreferences.internal().versionCode()) {
// Check versions, make sure transitions between versions go well // Check versions, make sure transitions between versions go well
VERSION_CODE -> { /* the version installed and used previously are the same */ } VERSION_CODE -> { /* the version installed and used previously are the same */
21,22,23 -> { }
21, 22, 23 -> {
// TODO // 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 */ as version tracking started then */
/* /*

View file

@ -7,14 +7,17 @@ import android.content.res.Resources
import android.os.Bundle import android.os.Bundle
import android.provider.Settings import android.provider.Settings
import androidx.appcompat.app.AppCompatActivity 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.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter 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.preferences.LauncherPreferences
import de.jrpie.android.launcher.saveListActivityChoice
import de.jrpie.android.launcher.settings.actions.SettingsFragmentActions import de.jrpie.android.launcher.settings.actions.SettingsFragmentActions
import de.jrpie.android.launcher.settings.launcher.SettingsFragmentLauncher import de.jrpie.android.launcher.settings.launcher.SettingsFragmentLauncher
import de.jrpie.android.launcher.settings.meta.SettingsFragmentMeta 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. * Settings are closed automatically if the activity goes `onPause` unexpectedly.
*/ */
class SettingsActivity: AppCompatActivity(), UIObject { class SettingsActivity : AppCompatActivity(), UIObject {
private var sharedPreferencesListener = private var sharedPreferencesListener =
SharedPreferences.OnSharedPreferenceChangeListener { _,prefKey -> SharedPreferences.OnSharedPreferenceChangeListener { _, prefKey ->
if(prefKey?.startsWith("theme.") == true) { if (prefKey?.startsWith("theme.") == true) {
recreate() recreate()
} }
} }
@ -56,11 +59,13 @@ class SettingsActivity: AppCompatActivity(), UIObject {
override fun onStart() { override fun onStart() {
super<AppCompatActivity>.onStart() super<AppCompatActivity>.onStart()
super<UIObject>.onStart() super<UIObject>.onStart()
LauncherPreferences.getSharedPreferences().registerOnSharedPreferenceChangeListener(sharedPreferencesListener) LauncherPreferences.getSharedPreferences()
.registerOnSharedPreferenceChangeListener(sharedPreferencesListener)
} }
override fun onPause() { override fun onPause() {
LauncherPreferences.getSharedPreferences().unregisterOnSharedPreferenceChangeListener(sharedPreferencesListener) LauncherPreferences.getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(sharedPreferencesListener)
super.onPause() super.onPause()
} }
@ -68,7 +73,7 @@ class SettingsActivity: AppCompatActivity(), UIObject {
return modifyTheme(super.getTheme()) return modifyTheme(super.getTheme())
} }
override fun setOnClicks(){ override fun setOnClicks() {
// As older APIs somehow do not recognize the xml defined onClick // As older APIs somehow do not recognize the xml defined onClick
binding.settingsClose.setOnClickListener { finish() } binding.settingsClose.setOnClickListener { finish() }
// open device settings (see https://stackoverflow.com/a/62092663/12787264) // open device settings (see https://stackoverflow.com/a/62092663/12787264)
@ -91,11 +96,11 @@ private val TAB_TITLES = arrayOf(
R.string.settings_tab_meta R.string.settings_tab_meta
) )
class SettingsSectionsPagerAdapter(private val context: Context, fm: FragmentManager) class SettingsSectionsPagerAdapter(private val context: Context, fm: FragmentManager) :
: FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
override fun getItem(position: Int): Fragment { override fun getItem(position: Int): Fragment {
return when (position){ return when (position) {
0 -> SettingsFragmentActions() 0 -> SettingsFragmentActions()
1 -> SettingsFragmentLauncher() 1 -> SettingsFragmentLauncher()
2 -> SettingsFragmentMeta() 2 -> SettingsFragmentMeta()
@ -107,5 +112,7 @@ class SettingsSectionsPagerAdapter(private val context: Context, fm: FragmentMan
return context.resources.getString(TAB_TITLES[position]) return context.resources.getString(TAB_TITLES[position])
} }
override fun getCount(): Int { return 3 } override fun getCount(): Int {
return 3
}
} }

View file

@ -44,18 +44,22 @@ SettingsFragmentActions : Fragment(), UIObject {
override fun setOnClicks() { override fun setOnClicks() {
// App management buttons // App management buttons
binding!!.settingsActionsButtonViewApps.setOnClickListener{ binding!!.settingsActionsButtonViewApps.setOnClickListener {
val intent = Intent(this.context, ListActivity::class.java) val intent = Intent(this.context, ListActivity::class.java)
intent.putExtra("intention", ListActivity.ListActivityIntention.VIEW.toString()) intent.putExtra("intention", ListActivity.ListActivityIntention.VIEW.toString())
startActivity(intent) startActivity(intent)
} }
binding!!.settingsActionsButtonInstallApps.setOnClickListener{ binding!!.settingsActionsButtonInstallApps.setOnClickListener {
try { try {
val intent = Intent(Intent.ACTION_MAIN) val intent = Intent(Intent.ACTION_MAIN)
intent.addCategory(Intent.CATEGORY_APP_MARKET) intent.addCategory(Intent.CATEGORY_APP_MARKET)
startActivity(intent) startActivity(intent)
} catch (e: ActivityNotFoundException) { } 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()
} }
} }
} }

View file

@ -1,25 +1,28 @@
package de.jrpie.android.launcher.settings.actions 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.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup 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.Button
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView 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.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 de.jrpie.android.launcher.preferences.LauncherPreferences
import java.lang.Exception import de.jrpie.android.launcher.transformGrayscale
/** /**
* The [SettingsFragmentActionsRecycler] is a fragment containing the [ActionsRecyclerAdapter], * The [SettingsFragmentActionsRecycler] is a fragment containing the [ActionsRecyclerAdapter],
@ -49,7 +52,7 @@ class SettingsFragmentActionsRecycler : Fragment(), UIObject {
// set up the list / recycler // set up the list / recycler
val actionViewManager = LinearLayoutManager(context) val actionViewManager = LinearLayoutManager(context)
actionViewAdapter = ActionsRecyclerAdapter( requireActivity() ) actionViewAdapter = ActionsRecyclerAdapter(requireActivity())
binding.settingsActionsRview.apply { binding.settingsActionsRview.apply {
// improve performance (since content changes don't change the layout size) // improve performance (since content changes don't change the layout size)
@ -57,19 +60,21 @@ class SettingsFragmentActionsRecycler : Fragment(), UIObject {
layoutManager = actionViewManager layoutManager = actionViewManager
adapter = actionViewAdapter adapter = actionViewAdapter
} }
LauncherPreferences.getSharedPreferences().registerOnSharedPreferenceChangeListener(sharedPreferencesListener) LauncherPreferences.getSharedPreferences()
.registerOnSharedPreferenceChangeListener(sharedPreferencesListener)
super<UIObject>.onStart() super<UIObject>.onStart()
} }
override fun onDestroy() { override fun onDestroy() {
LauncherPreferences.getSharedPreferences().unregisterOnSharedPreferenceChangeListener(sharedPreferencesListener) LauncherPreferences.getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(sharedPreferencesListener)
super.onDestroy() super.onDestroy()
} }
} }
class ActionsRecyclerAdapter(val activity: Activity): class ActionsRecyclerAdapter(val activity: Activity) :
RecyclerView.Adapter<ActionsRecyclerAdapter.ViewHolder>() { RecyclerView.Adapter<ActionsRecyclerAdapter.ViewHolder>() {
private val gesturesList: ArrayList<Gesture> private val gesturesList: ArrayList<Gesture>
@ -81,9 +86,11 @@ class ActionsRecyclerAdapter(val activity: Activity):
var chooseButton: Button = itemView.findViewById(R.id.settings_actions_row_button_choose) var chooseButton: Button = itemView.findViewById(R.id.settings_actions_row_button_choose)
var removeAction: ImageView = itemView.findViewById(R.id.settings_actions_row_remove) 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) { private fun updateViewHolder(gesture: Gesture, viewHolder: ViewHolder) {
@ -92,12 +99,11 @@ class ActionsRecyclerAdapter(val activity: Activity):
viewHolder.img.visibility = View.VISIBLE viewHolder.img.visibility = View.VISIBLE
viewHolder.removeAction.visibility = View.VISIBLE viewHolder.removeAction.visibility = View.VISIBLE
viewHolder.chooseButton.visibility = View.INVISIBLE viewHolder.chooseButton.visibility = View.INVISIBLE
if (content.isEmpty()){ if (content.isEmpty()) {
viewHolder.img.visibility = View.INVISIBLE viewHolder.img.visibility = View.INVISIBLE
viewHolder.removeAction.visibility = View.GONE viewHolder.removeAction.visibility = View.GONE
viewHolder.chooseButton.visibility = View.VISIBLE viewHolder.chooseButton.visibility = View.VISIBLE
} } else if (LauncherAction.isOtherAction(content)) {
else if (LauncherAction.isOtherAction(content)) {
LauncherAction.byId(content)?.let { LauncherAction.byId(content)?.let {
viewHolder.img.setImageResource(it.icon) viewHolder.img.setImageResource(it.icon)
} }
@ -105,7 +111,7 @@ class ActionsRecyclerAdapter(val activity: Activity):
// Set image icon (by packageName) // Set image icon (by packageName)
try { try {
viewHolder.img.setImageDrawable(getAppIcon(activity, content, app.second)) viewHolder.img.setImageDrawable(getAppIcon(activity, content, app.second))
} catch (e : Exception) { } catch (e: Exception) {
// Probably the app was uninstalled // Probably the app was uninstalled
// the button is shown, user asked to select an action // the button is shown, user asked to select an action
viewHolder.img.visibility = View.INVISIBLE viewHolder.img.visibility = View.INVISIBLE
@ -119,14 +125,16 @@ class ActionsRecyclerAdapter(val activity: Activity):
val gesture = gesturesList[i] val gesture = gesturesList[i]
viewHolder.textView.text = gesture.getLabel(activity) viewHolder.textView.text = gesture.getLabel(activity)
if (LauncherPreferences.theme().monochromeIcons()) if (LauncherPreferences.theme().monochromeIcons())
transformGrayscale( viewHolder.img ) transformGrayscale(viewHolder.img)
updateViewHolder(gesture, viewHolder) updateViewHolder(gesture, viewHolder)
viewHolder.img.setOnClickListener{ chooseApp(gesture) } viewHolder.img.setOnClickListener { chooseApp(gesture) }
viewHolder.chooseButton.setOnClickListener{ chooseApp(gesture) } viewHolder.chooseButton.setOnClickListener { chooseApp(gesture) }
viewHolder.removeAction.setOnClickListener{ gesture.removeApp(activity) } 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 { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(parent.context) val inflater = LayoutInflater.from(parent.context)
@ -139,7 +147,8 @@ class ActionsRecyclerAdapter(val activity: Activity):
val edgeActions = LauncherPreferences.enabled_gestures().edgeSwipe() val edgeActions = LauncherPreferences.enabled_gestures().edgeSwipe()
gesturesList = Gesture.values().filter { gesturesList = Gesture.values().filter {
(doubleActions || !it.isDoubleVariant()) (doubleActions || !it.isDoubleVariant())
&& (edgeActions || !it.isEdgeVariant())} as ArrayList<Gesture> && (edgeActions || !it.isEdgeVariant())
} as ArrayList<Gesture>
} }
fun updateActions() { fun updateActions() {
@ -148,7 +157,8 @@ class ActionsRecyclerAdapter(val activity: Activity):
this.gesturesList.clear() this.gesturesList.clear()
gesturesList.addAll(Gesture.values().filter { gesturesList.addAll(Gesture.values().filter {
(doubleActions || !it.isDoubleVariant()) (doubleActions || !it.isDoubleVariant())
&& (edgeActions || !it.isEdgeVariant())}) && (edgeActions || !it.isEdgeVariant())
})
notifyDataSetChanged() notifyDataSetChanged()
} }
@ -158,7 +168,8 @@ class ActionsRecyclerAdapter(val activity: Activity):
val intent = Intent(activity, ListActivity::class.java) val intent = Intent(activity, ListActivity::class.java)
intent.putExtra("intention", ListActivity.ListActivityIntention.PICK.toString()) intent.putExtra("intention", ListActivity.ListActivityIntention.PICK.toString())
intent.putExtra("forGesture", gesture.id) // for which action we choose the app intent.putExtra("forGesture", gesture.id) // for which action we choose the app
activity.startActivityForResult(intent, activity.startActivityForResult(
intent,
REQUEST_CHOOSE_APP REQUEST_CHOOSE_APP
) )
} }

View file

@ -4,8 +4,8 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.R import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.setDefaultHomeScreen import de.jrpie.android.launcher.setDefaultHomeScreen
@ -21,7 +21,9 @@ class SettingsFragmentLauncher : PreferenceFragmentCompat() {
preferenceManager.sharedPreferencesMode = Context.MODE_PRIVATE preferenceManager.sharedPreferencesMode = Context.MODE_PRIVATE
setPreferencesFromResource(R.xml.preferences, rootKey) setPreferencesFromResource(R.xml.preferences, rootKey)
val selectWallpaper = findPreference<androidx.preference.Preference>(LauncherPreferences.theme().keys().wallpaper()) val selectWallpaper = findPreference<androidx.preference.Preference>(
LauncherPreferences.theme().keys().wallpaper()
)
selectWallpaper?.setOnPreferenceClickListener { selectWallpaper?.setOnPreferenceClickListener {
// https://github.com/LineageOS/android_packages_apps_Trebuchet/blob/6caab89b21b2b91f0a439e1fd8c4510dcb255819/src/com/android/launcher3/views/OptionsPopupView.java#L271 // 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) val intent = Intent(Intent.ACTION_SET_WALLPAPER)
@ -30,7 +32,9 @@ class SettingsFragmentLauncher : PreferenceFragmentCompat() {
startActivity(intent) startActivity(intent)
true true
} }
val chooseHomeScreen = findPreference<androidx.preference.Preference>(LauncherPreferences.general().keys().chooseHomeScreen()) val chooseHomeScreen = findPreference<androidx.preference.Preference>(
LauncherPreferences.general().keys().chooseHomeScreen()
)
chooseHomeScreen?.setOnPreferenceClickListener { chooseHomeScreen?.setOnPreferenceClickListener {
setDefaultHomeScreen(requireContext(), checkDefault = false) setDefaultHomeScreen(requireContext(), checkDefault = false)
true true

View file

@ -10,10 +10,10 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import de.jrpie.android.launcher.R import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.UIObject import de.jrpie.android.launcher.UIObject
import de.jrpie.android.launcher.databinding.SettingsMetaBinding
import de.jrpie.android.launcher.openNewTabWindow import de.jrpie.android.launcher.openNewTabWindow
import de.jrpie.android.launcher.preferences.resetSettings import de.jrpie.android.launcher.preferences.resetSettings
import de.jrpie.android.launcher.tutorial.TutorialActivity 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. * 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) AlertDialog.Builder(this.requireContext(), R.style.AlertDialogCustom)
.setTitle(getString(R.string.settings_meta_reset)) .setTitle(getString(R.string.settings_meta_reset))
.setMessage(getString(R.string.settings_meta_reset_confirm)) .setMessage(getString(R.string.settings_meta_reset_confirm))
.setPositiveButton(android.R.string.ok .setPositiveButton(
android.R.string.ok
) { _, _ -> ) { _, _ ->
resetSettings(this.requireContext()) resetSettings(this.requireContext())
requireActivity().finish() requireActivity().finish()
@ -85,7 +86,6 @@ class SettingsFragmentMeta : Fragment(), UIObject {
} }
// contact developer // contact developer
binding.settingsMetaButtonContact.setOnClickListener { binding.settingsMetaButtonContact.setOnClickListener {
openNewTabWindow( openNewTabWindow(

View file

@ -8,10 +8,10 @@ import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter import androidx.fragment.app.FragmentPagerAdapter
import androidx.viewpager.widget.ViewPager import androidx.viewpager.widget.ViewPager
import com.google.android.material.tabs.TabLayout 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.R
import de.jrpie.android.launcher.REQUEST_CHOOSE_APP import de.jrpie.android.launcher.REQUEST_CHOOSE_APP
import de.jrpie.android.launcher.UIObject 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.preferences.resetSettings
import de.jrpie.android.launcher.saveListActivityChoice import de.jrpie.android.launcher.saveListActivityChoice
import de.jrpie.android.launcher.tutorial.tabs.TutorialFragmentConcept 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 * It tells the user about the concept behind launcher
* and helps with the setup process (on new installations) * and helps with the setup process (on new installations)
*/ */
class TutorialActivity: AppCompatActivity(), UIObject { class TutorialActivity : AppCompatActivity(), UIObject {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -36,7 +36,7 @@ class TutorialActivity: AppCompatActivity(), UIObject {
setContentView(R.layout.tutorial) setContentView(R.layout.tutorial)
// Check if the app was started before // Check if the app was started before
if(!LauncherPreferences.internal().started()) if (!LauncherPreferences.internal().started())
resetSettings(this) resetSettings(this)
// set up tabs and swiping in settings // set up tabs and swiping in settings
@ -54,7 +54,7 @@ class TutorialActivity: AppCompatActivity(), UIObject {
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) { when (requestCode) {
REQUEST_CHOOSE_APP -> saveListActivityChoice(this,data) REQUEST_CHOOSE_APP -> saveListActivityChoice(this, data)
else -> super.onActivityResult(requestCode, resultCode, data) else -> super.onActivityResult(requestCode, resultCode, data)
} }
} }
@ -73,11 +73,11 @@ class TutorialActivity: AppCompatActivity(), UIObject {
* *
* Tabs: (Start | Concept | Usage | Setup | Finish) * Tabs: (Start | Concept | Usage | Setup | Finish)
*/ */
class TutorialSectionsPagerAdapter(fm: FragmentManager) class TutorialSectionsPagerAdapter(fm: FragmentManager) :
: FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
override fun getItem(position: Int): Fragment { override fun getItem(position: Int): Fragment {
return when (position){ return when (position) {
0 -> TutorialFragmentStart() 0 -> TutorialFragmentStart()
1 -> TutorialFragmentConcept() 1 -> TutorialFragmentConcept()
2 -> TutorialFragmentUsage() 2 -> TutorialFragmentUsage()
@ -88,6 +88,11 @@ class TutorialSectionsPagerAdapter(fm: FragmentManager)
} }
/* We don't use titles here, as we have the dots */ /* We don't use titles here, as we have the dots */
override fun getPageTitle(position: Int): CharSequence { return "" } override fun getPageTitle(position: Int): CharSequence {
override fun getCount(): Int { return 5 } return ""
}
override fun getCount(): Int {
return 5
}
} }

View file

@ -8,6 +8,7 @@ import androidx.fragment.app.Fragment
import de.jrpie.android.launcher.BuildConfig import de.jrpie.android.launcher.BuildConfig
import de.jrpie.android.launcher.UIObject import de.jrpie.android.launcher.UIObject
import de.jrpie.android.launcher.databinding.TutorialConceptBinding import de.jrpie.android.launcher.databinding.TutorialConceptBinding
/** /**
* The [TutorialFragmentConcept] is a used as a tab in the TutorialActivity. * The [TutorialFragmentConcept] is a used as a tab in the TutorialActivity.
* *
@ -25,7 +26,7 @@ class TutorialFragmentConcept : Fragment(), UIObject {
return binding.root return binding.root
} }
override fun onStart(){ override fun onStart() {
super<Fragment>.onStart() super<Fragment>.onStart()
super<UIObject>.onStart() super<UIObject>.onStart()
} }

View file

@ -1,14 +1,15 @@
package de.jrpie.android.launcher.tutorial.tabs package de.jrpie.android.launcher.tutorial.tabs
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup 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.BuildConfig.VERSION_CODE
import de.jrpie.android.launcher.UIObject
import de.jrpie.android.launcher.databinding.TutorialFinishBinding import de.jrpie.android.launcher.databinding.TutorialFinishBinding
import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.setDefaultHomeScreen
/** /**
* The [TutorialFragmentFinish] is a used as a tab in the TutorialActivity. * The [TutorialFragmentFinish] is a used as a tab in the TutorialActivity.
@ -34,11 +35,11 @@ class TutorialFragmentFinish : Fragment(), UIObject {
override fun setOnClicks() { override fun setOnClicks() {
super.setOnClicks() super.setOnClicks()
binding.tutorialFinishButtonStart.setOnClickListener{ finishTutorial() } binding.tutorialFinishButtonStart.setOnClickListener { finishTutorial() }
} }
private fun finishTutorial() { private fun finishTutorial() {
if(!LauncherPreferences.internal().started()) { if (!LauncherPreferences.internal().started()) {
LauncherPreferences.internal().started(true) LauncherPreferences.internal().started(true)
LauncherPreferences.internal().startedTime(System.currentTimeMillis() / 1000L) LauncherPreferences.internal().startedTime(System.currentTimeMillis() / 1000L)
LauncherPreferences.internal().versionCode(VERSION_CODE) LauncherPreferences.internal().versionCode(VERSION_CODE)

View file

@ -22,7 +22,7 @@ class TutorialFragmentSetup : Fragment(), UIObject {
return inflater.inflate(R.layout.tutorial_setup, container, false) return inflater.inflate(R.layout.tutorial_setup, container, false)
} }
override fun onStart(){ override fun onStart() {
super<Fragment>.onStart() super<Fragment>.onStart()
super<UIObject>.onStart() super<UIObject>.onStart()
} }

View file

@ -1,11 +1,12 @@
package de.jrpie.android.launcher.tutorial.tabs package de.jrpie.android.launcher.tutorial.tabs
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup 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 import de.jrpie.android.launcher.databinding.TutorialStartBinding
/** /**
@ -25,7 +26,7 @@ class TutorialFragmentStart : Fragment(), UIObject {
return binding.root return binding.root
} }
override fun onStart(){ override fun onStart() {
super<Fragment>.onStart() super<Fragment>.onStart()
super<UIObject>.onStart() super<UIObject>.onStart()
} }

View file

@ -22,7 +22,7 @@ class TutorialFragmentUsage : Fragment(), UIObject {
return inflater.inflate(R.layout.tutorial_usage, container, false) return inflater.inflate(R.layout.tutorial_usage, container, false)
} }
override fun onStart(){ override fun onStart() {
super<Fragment>.onStart() super<Fragment>.onStart()
super<UIObject>.onStart() super<UIObject>.onStart()
} }

View file

@ -2,9 +2,9 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"> <set xmlns:android="http://schemas.android.com/apk/res/android">
<translate <translate
android:duration="100"
android:fromYDelta="75%p" android:fromYDelta="75%p"
android:toYDelta="0%p"
android:interpolator="@android:anim/decelerate_interpolator" android:interpolator="@android:anim/decelerate_interpolator"
android:duration="100"/> android:toYDelta="0%p" />
</set> </set>

View file

@ -2,9 +2,9 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"> <set xmlns:android="http://schemas.android.com/apk/res/android">
<translate <translate
android:duration="100"
android:fromXDelta="-75%p" android:fromXDelta="-75%p"
android:toXDelta="0%p"
android:interpolator="@android:anim/decelerate_interpolator" android:interpolator="@android:anim/decelerate_interpolator"
android:duration="100"/> android:toXDelta="0%p" />
</set> </set>

View file

@ -2,9 +2,9 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"> <set xmlns:android="http://schemas.android.com/apk/res/android">
<translate <translate
android:duration="100"
android:fromXDelta="75%p" android:fromXDelta="75%p"
android:toXDelta="0%p"
android:interpolator="@android:anim/decelerate_interpolator" android:interpolator="@android:anim/decelerate_interpolator"
android:duration="100"/> android:toXDelta="0%p" />
</set> </set>

View file

@ -2,9 +2,9 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"> <set xmlns:android="http://schemas.android.com/apk/res/android">
<translate <translate
android:duration="100"
android:fromYDelta="-75%p" android:fromYDelta="-75%p"
android:toYDelta="0%p"
android:interpolator="@android:anim/decelerate_interpolator" android:interpolator="@android:anim/decelerate_interpolator"
android:duration="100"/> android:toYDelta="0%p" />
</set> </set>

View file

@ -1,5 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="?android:textColor" android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/> <path
android:fillColor="?android:textColor"
android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z" />
</vector> </vector>

View file

@ -1,5 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="?android:textColor" android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z"/> <path
android:fillColor="?android:textColor"
android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z" />
</vector> </vector>

View file

@ -1,5 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="?android:textColor" android:pathData="M6,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/> <path
android:fillColor="?android:textColor"
android:pathData="M6,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" />
</vector> </vector>

View file

@ -1,5 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="?android:textColor" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8 0,-1.85 0.63,-3.55 1.69,-4.9L16.9,18.31C15.55,19.37 13.85,20 12,20zM18.31,16.9L7.1,5.69C8.45,4.63 10.15,4 12,4c4.42,0 8,3.58 8,8 0,1.85 -0.63,3.55 -1.69,4.9z"/> <path
android:fillColor="?android:textColor"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8 0,-1.85 0.63,-3.55 1.69,-4.9L16.9,18.31C15.55,19.37 13.85,20 12,20zM18.31,16.9L7.1,5.69C8.45,4.63 10.15,4 12,4c4.42,0 8,3.58 8,8 0,1.85 -0.63,3.55 -1.69,4.9z" />
</vector> </vector>

View file

@ -1,5 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="?android:textColor" android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2z"/> <path
android:fillColor="?android:textColor"
android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2z" />
</vector> </vector>

View file

@ -1,5 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="?android:textColor" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/> <path
android:fillColor="?android:textColor"
android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z" />
</vector> </vector>

View file

@ -1,5 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="?android:textColor" android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z"/> <path
android:fillColor="?android:textColor"
android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z" />
</vector> </vector>

View file

@ -1,5 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="?android:textColor" android:pathData="M12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM17.25,12c0,0.23 -0.02,0.46 -0.05,0.68l1.48,1.16c0.13,0.11 0.17,0.3 0.08,0.45l-1.4,2.42c-0.09,0.15 -0.27,0.21 -0.43,0.15l-1.74,-0.7c-0.36,0.28 -0.76,0.51 -1.18,0.69l-0.26,1.85c-0.03,0.17 -0.18,0.3 -0.35,0.3h-2.8c-0.17,0 -0.32,-0.13 -0.35,-0.29l-0.26,-1.85c-0.43,-0.18 -0.82,-0.41 -1.18,-0.69l-1.74,0.7c-0.16,0.06 -0.34,0 -0.43,-0.15l-1.4,-2.42c-0.09,-0.15 -0.05,-0.34 0.08,-0.45l1.48,-1.16c-0.03,-0.23 -0.05,-0.46 -0.05,-0.69 0,-0.23 0.02,-0.46 0.05,-0.68l-1.48,-1.16c-0.13,-0.11 -0.17,-0.3 -0.08,-0.45l1.4,-2.42c0.09,-0.15 0.27,-0.21 0.43,-0.15l1.74,0.7c0.36,-0.28 0.76,-0.51 1.18,-0.69l0.26,-1.85c0.03,-0.17 0.18,-0.3 0.35,-0.3h2.8c0.17,0 0.32,0.13 0.35,0.29l0.26,1.85c0.43,0.18 0.82,0.41 1.18,0.69l1.74,-0.7c0.16,-0.06 0.34,0 0.43,0.15l1.4,2.42c0.09,0.15 0.05,0.34 -0.08,0.45l-1.48,1.16c0.03,0.23 0.05,0.46 0.05,0.69z"/> <path
android:fillColor="?android:textColor"
android:pathData="M12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM17.25,12c0,0.23 -0.02,0.46 -0.05,0.68l1.48,1.16c0.13,0.11 0.17,0.3 0.08,0.45l-1.4,2.42c-0.09,0.15 -0.27,0.21 -0.43,0.15l-1.74,-0.7c-0.36,0.28 -0.76,0.51 -1.18,0.69l-0.26,1.85c-0.03,0.17 -0.18,0.3 -0.35,0.3h-2.8c-0.17,0 -0.32,-0.13 -0.35,-0.29l-0.26,-1.85c-0.43,-0.18 -0.82,-0.41 -1.18,-0.69l-1.74,0.7c-0.16,0.06 -0.34,0 -0.43,-0.15l-1.4,-2.42c-0.09,-0.15 -0.05,-0.34 0.08,-0.45l1.48,-1.16c-0.03,-0.23 -0.05,-0.46 -0.05,-0.69 0,-0.23 0.02,-0.46 0.05,-0.68l-1.48,-1.16c-0.13,-0.11 -0.17,-0.3 -0.08,-0.45l1.4,-2.42c0.09,-0.15 0.27,-0.21 0.43,-0.15l1.74,0.7c0.36,-0.28 0.76,-0.51 1.18,-0.69l0.26,-1.85c0.03,-0.17 0.18,-0.3 0.35,-0.3h2.8c0.17,0 0.32,0.13 0.35,0.29l0.26,1.85c0.43,0.18 0.82,0.41 1.18,0.69l1.74,-0.7c0.16,-0.06 0.34,0 0.43,0.15l1.4,2.42c0.09,0.15 0.05,0.34 -0.08,0.45l-1.48,1.16c0.03,0.23 0.05,0.46 0.05,0.69z" />
</vector> </vector>

View file

@ -1,5 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="?android:textColor" android:pathData="M6,18l8.5,-6L6,6v12zM16,6v12h2V6h-2z"/> <path
android:fillColor="?android:textColor"
android:pathData="M6,18l8.5,-6L6,6v12zM16,6v12h2V6h-2z" />
</vector> </vector>

View file

@ -1,5 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="?android:textColor" android:pathData="M6,6h2v12L6,18zM9.5,12l8.5,6L18,6z"/> <path
android:fillColor="?android:textColor"
android:pathData="M6,6h2v12L6,18zM9.5,12l8.5,6L18,6z" />
</vector> </vector>

View file

@ -1,5 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="?android:textColor" android:pathData="M18.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM5,9v6h4l5,5V4L9,9H5z"/> <path
android:fillColor="?android:textColor"
android:pathData="M18.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM5,9v6h4l5,5V4L9,9H5z" />
</vector> </vector>

View file

@ -1,5 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="?android:textColor" android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z"/> <path
android:fillColor="?android:textColor"
android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z" />
</vector> </vector>

View file

@ -6,7 +6,7 @@
android:shape="ring" android:shape="ring"
android:thickness="5dp" android:thickness="5dp"
android:useLevel="false"> android:useLevel="false">
<solid android:color="#777"/> <solid android:color="#777" />
</shape> </shape>
</item> </item>
</layer-list> </layer-list>

View file

@ -6,7 +6,7 @@
android:shape="ring" android:shape="ring"
android:thickness="5dp" android:thickness="5dp"
android:useLevel="false"> android:useLevel="false">
<solid android:color="#ddd"/> <solid android:color="#ddd" />
</shape> </shape>
</item> </item>
</layer-list> </layer-list>

View file

@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/tutorial_selected_dot" <item android:drawable="@drawable/tutorial_selected_dot" android:state_selected="true" />
android:state_selected="true"/>
<item android:drawable="@drawable/tutorial_default_dot"/> <item android:drawable="@drawable/tutorial_default_dot" />
</selector> </selector>

View file

@ -1,8 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:custom="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/home_container" android:id="@+id/home_container"
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:custom="http://schemas.android.com/apk/res-auto" xmlns:custom="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
@ -14,9 +13,9 @@
android:id="@+id/list_appbar" android:id="@+id/list_appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center"
android:background="@null" android:background="@null"
android:gravity="center"
app:elevation="0dp" app:elevation="0dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"

View file

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list_apps_container" android:id="@+id/list_apps_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list_apps_row_container" android:id="@+id/list_apps_row_container"

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/list_other_container" android:id="@+id/list_other_container"
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/list_other_row_container" android:id="@+id/list_other_row_container"
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:custom="http://schemas.android.com/apk/res-auto" xmlns:custom="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
@ -11,9 +10,9 @@
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:id="@+id/settings_appbar" android:id="@+id/settings_appbar"
android:background="@null"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@null"
app:elevation="0dp"> app:elevation="0dp">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
@ -54,6 +53,7 @@
android:id="@+id/settings_system" android:id="@+id/settings_system"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp" android:layout_marginLeft="8dp"
android:gravity="center" android:gravity="center"
android:includeFontPadding="true" android:includeFontPadding="true"
@ -63,8 +63,7 @@
custom:layout_constraintBottom_toBottomOf="parent" custom:layout_constraintBottom_toBottomOf="parent"
custom:layout_constraintStart_toStartOf="parent" custom:layout_constraintStart_toStartOf="parent"
custom:layout_constraintTop_toTopOf="parent" custom:layout_constraintTop_toTopOf="parent"
custom:type="solid" custom:type="solid" />
android:layout_marginStart="8dp" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.tabs.TabLayout <com.google.android.material.tabs.TabLayout

View file

@ -17,7 +17,7 @@
app:layout_constraintBottom_toTopOf="@+id/settings_actions_buttons" app:layout_constraintBottom_toTopOf="@+id/settings_actions_buttons"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/> app:layout_constraintTop_toTopOf="parent" />
<LinearLayout <LinearLayout
android:id="@+id/settings_actions_buttons" android:id="@+id/settings_actions_buttons"

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/settings_actions_row_container" android:id="@+id/settings_actions_row_container"
@ -30,8 +29,7 @@
android:visibility="invisible" android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent" />
/>
<ImageView <ImageView
android:id="@+id/settings_actions_row_icon_img" android:id="@+id/settings_actions_row_icon_img"

View file

@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/settings_meta_container" android:id="@+id/settings_meta_container"
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -1,8 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:custom="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/tutorial_container" android:id="@+id/tutorial_container"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -26,11 +24,11 @@
android:id="@+id/tutorial_tabs" android:id="@+id/tutorial_tabs"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:tabBackground="@drawable/tutorial_tab_selector"
app:tabGravity="center"
app:tabIndicatorHeight="0dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent"
app:tabBackground="@drawable/tutorial_tab_selector"
app:tabGravity="center"
app:tabIndicatorHeight="0dp" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -1,13 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/tutorial_concept_container" android:id="@+id/tutorial_concept_container"
android:paddingLeft="32sp"
android:paddingRight="32sp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:paddingLeft="32sp"
android:paddingRight="32sp"
tools:context=".tutorial.tabs.TutorialFragmentConcept"> tools:context=".tutorial.tabs.TutorialFragmentConcept">
<TextView <TextView
@ -54,8 +53,8 @@
android:layout_marginLeft="32dp" android:layout_marginLeft="32dp"
android:layout_marginEnd="32dp" android:layout_marginEnd="32dp"
android:layout_marginRight="32dp" android:layout_marginRight="32dp"
android:textSize="32sp"
android:gravity="center" android:gravity="center"
android:textSize="32sp"
app:layout_constraintBottom_toTopOf="@+id/tutorial_concept_text_2" app:layout_constraintBottom_toTopOf="@+id/tutorial_concept_text_2"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

View file

@ -1,14 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:custom="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/tutorial_finish_container" android:id="@+id/tutorial_finish_container"
android:paddingLeft="32sp"
android:paddingRight="32sp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:paddingLeft="32sp"
android:paddingRight="32sp"
tools:context=".tutorial.tabs.TutorialFragmentFinish"> tools:context=".tutorial.tabs.TutorialFragmentFinish">
<TextView <TextView

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/tutorial_setup_container" android:id="@+id/tutorial_setup_container"

View file

@ -1,13 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/tutorial_start_container" android:id="@+id/tutorial_start_container"
android:paddingLeft="32sp"
android:paddingRight="32sp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:paddingLeft="32sp"
android:paddingRight="32sp"
tools:context=".tutorial.tabs.TutorialFragmentStart"> tools:context=".tutorial.tabs.TutorialFragmentStart">
<TextView <TextView

View file

@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/app_menu_delete" <item
android:id="@+id/app_menu_delete"
android:title="@string/list_app_delete" /> android:title="@string/list_app_delete" />
<item android:id="@+id/app_menu_info" <item
android:id="@+id/app_menu_info"
android:title="@string/list_app_info" /> android:title="@string/list_app_info" />
</menu> </menu>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/> <background android:drawable="@color/ic_launcher_background" />
<foreground android:drawable="@mipmap/ic_launcher_foreground"/> <foreground android:drawable="@mipmap/ic_launcher_foreground" />
</adaptive-icon> </adaptive-icon>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/> <background android:drawable="@color/ic_launcher_background" />
<foreground android:drawable="@mipmap/ic_launcher_foreground"/> <foreground android:drawable="@mipmap/ic_launcher_foreground" />
</adaptive-icon> </adaptive-icon>

View file

@ -89,7 +89,6 @@
<string name="settings_functionality_search_auto_open_keyboard_key" translatable="false">searchAutoKeyboard</string> <string name="settings_functionality_search_auto_open_keyboard_key" translatable="false">searchAutoKeyboard</string>
<!-- <!--
- -
- URLs - URLs

View file

@ -185,7 +185,6 @@
<string name="tutorial_finish_button">Start</string> <string name="tutorial_finish_button">Start</string>
<string name="settings">Settings</string> <string name="settings">Settings</string>
<string name="ic_menu_alt">More options</string> <string name="ic_menu_alt">More options</string>
<string name="alert_cant_expand_notifications_panel">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.</string> <string name="alert_cant_expand_notifications_panel">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.</string>

View file

@ -28,6 +28,7 @@
<item name="android:colorBackground">@color/darkTheme_background_color</item> <item name="android:colorBackground">@color/darkTheme_background_color</item>
<item name="android:textColor">@color/darkTheme_text_color</item> <item name="android:textColor">@color/darkTheme_text_color</item>
</style> </style>
<style name="colorThemeDefault"> <style name="colorThemeDefault">
<item name="colorPrimary">@color/finnmglasTheme_background_color</item> <item name="colorPrimary">@color/finnmglasTheme_background_color</item>
<item name="colorPrimaryDark">@color/finnmglasTheme_background_color</item> <item name="colorPrimaryDark">@color/finnmglasTheme_background_color</item>
@ -61,14 +62,13 @@
<style name="fontSystemDefault"> <style name="fontSystemDefault">
<!--<item name="android:textSize">18sp</item>--> <!--<item name="android:textSize">18sp</item>-->
</style> </style>
<style name="fontHack"> <style name="fontHack">
<item name="android:fontFamily">@font/hack</item> <item name="android:fontFamily">@font/hack</item>
<!--<item name="android:textSize">18sp</item>--> <!--<item name="android:textSize">18sp</item>-->
</style> </style>
<style name="PopupMenuCustom" parent="@android:style/Widget.PopupMenu"> <style name="PopupMenuCustom" parent="@android:style/Widget.PopupMenu">
<item name="android:popupBackground">#252827</item> <item name="android:popupBackground">#252827</item>
</style> </style>

View file

@ -1,45 +1,44 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory <PreferenceCategory app:allowDividerAbove="false"> <!-- general -->
app:allowDividerAbove="false" > <!-- general -->
<Preference <Preference
android:key="@string/settings_general_choose_home_screen_key" android:key="@string/settings_general_choose_home_screen_key"
android:title="@string/settings_general_choose_home_screen"/> android:title="@string/settings_general_choose_home_screen" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
app:allowDividerAbove="false" android:title="@string/settings_launcher_section_appearance"
android:title="@string/settings_launcher_section_appearance"> app:allowDividerAbove="false">
<Preference <Preference
android:key="@string/settings_theme_wallpaper_key" android:key="@string/settings_theme_wallpaper_key"
android:title="@string/settings_theme_wallpaper"/> android:title="@string/settings_theme_wallpaper" />
<DropDownPreference <DropDownPreference
android:defaultValue="DEFAULT"
android:entries="@array/settings_theme_color_theme_items" android:entries="@array/settings_theme_color_theme_items"
android:entryValues="@array/settings_theme_color_theme_values" android:entryValues="@array/settings_theme_color_theme_values"
android:summary="%s"
android:defaultValue="DEFAULT"
android:key="@string/settings_theme_color_theme_key" android:key="@string/settings_theme_color_theme_key"
android:title="@string/settings_theme_color_theme"/> android:summary="%s"
android:title="@string/settings_theme_color_theme" />
<DropDownPreference <DropDownPreference
android:key="@string/settings_theme_font_key" android:defaultValue="HACK"
android:title="@string/settings_theme_font"
android:entryValues="@array/settings_theme_font_values"
android:entries="@array/settings_theme_font_items" android:entries="@array/settings_theme_font_items"
android:entryValues="@array/settings_theme_font_values"
android:key="@string/settings_theme_font_key"
android:summary="%s" android:summary="%s"
android:defaultValue="HACK"/> android:title="@string/settings_theme_font" />
<DropDownPreference <DropDownPreference
android:key="@string/settings_theme_background_key" android:defaultValue="BLUR"
android:title="@string/settings_theme_background"
android:summary="%s"
android:entries="@array/settings_theme_background_items" android:entries="@array/settings_theme_background_items"
android:entryValues="@array/settings_theme_background_values" android:entryValues="@array/settings_theme_background_values"
android:defaultValue="BLUR"/> android:key="@string/settings_theme_background_key"
android:summary="%s"
android:title="@string/settings_theme_background" />
<SwitchPreference <SwitchPreference
android:defaultValue="false"
android:key="@string/settings_theme_monochrome_icons_key" android:key="@string/settings_theme_monochrome_icons_key"
android:title="@string/settings_theme_monochrome_icons" android:title="@string/settings_theme_monochrome_icons" />
android:defaultValue="false" />
</PreferenceCategory> </PreferenceCategory>
@ -47,20 +46,20 @@
android:title="@string/settings_launcher_section_date_time" android:title="@string/settings_launcher_section_date_time"
app:allowDividerAbove="false"> app:allowDividerAbove="false">
<SwitchPreference <SwitchPreference
android:key="@string/settings_clock_localized_key"
android:defaultValue="false" android:defaultValue="false"
android:key="@string/settings_clock_localized_key"
android:title="@string/settings_clock_localized" /> android:title="@string/settings_clock_localized" />
<SwitchPreference <SwitchPreference
android:key="@string/settings_clock_time_visible_key"
android:defaultValue="true" android:defaultValue="true"
android:key="@string/settings_clock_time_visible_key"
android:title="@string/settings_clock_time_visible" /> android:title="@string/settings_clock_time_visible" />
<SwitchPreference <SwitchPreference
android:key="@string/settings_clock_date_visible_key"
android:defaultValue="true" android:defaultValue="true"
android:key="@string/settings_clock_date_visible_key"
android:title="@string/settings_clock_date_visible" /> android:title="@string/settings_clock_date_visible" />
<SwitchPreference <SwitchPreference
android:key="@string/settings_clock_flip_date_time_key"
android:defaultValue="false" android:defaultValue="false"
android:key="@string/settings_clock_flip_date_time_key"
android:title="@string/settings_clock_flip_date_time" /> android:title="@string/settings_clock_flip_date_time" />
</PreferenceCategory> </PreferenceCategory>
@ -69,21 +68,21 @@
app:allowDividerAbove="false"> app:allowDividerAbove="false">
<SwitchPreference <SwitchPreference
android:key="@string/settings_functionality_search_auto_launch_key"
android:defaultValue="true" android:defaultValue="true"
android:key="@string/settings_functionality_search_auto_launch_key"
android:title="@string/settings_functionality_auto_launch" /> android:title="@string/settings_functionality_auto_launch" />
<SwitchPreference <SwitchPreference
android:key="@string/settings_functionality_search_auto_open_keyboard_key"
android:defaultValue="true" android:defaultValue="true"
android:key="@string/settings_functionality_search_auto_open_keyboard_key"
android:title="@string/settings_functionality_auto_keyboard" /> android:title="@string/settings_functionality_auto_keyboard" />
<SwitchPreference <SwitchPreference
android:defaultValue="true"
android:key="@string/settings_enabled_gestures_double_swipe_key" android:key="@string/settings_enabled_gestures_double_swipe_key"
android:defaultValue="true" android:title="@string/settings_enabled_gestures_double_swipe" />
android:title="@string/settings_enabled_gestures_double_swipe"/>
<SwitchPreference <SwitchPreference
android:key="@string/settings_enabled_gestures_edge_swipe_key"
android:defaultValue="true" android:defaultValue="true"
android:title="@string/settings_enabled_gestures_edge_swipe"/> android:key="@string/settings_enabled_gestures_edge_swipe_key"
android:title="@string/settings_enabled_gestures_edge_swipe" />
</PreferenceCategory> </PreferenceCategory>
@ -92,10 +91,10 @@
app:allowDividerAbove="false"> app:allowDividerAbove="false">
<SwitchPreference <SwitchPreference
android:key="@string/settings_display_full_screen_key" android:key="@string/settings_display_full_screen_key"
android:title="@string/settings_display_full_screen"/> android:title="@string/settings_display_full_screen" />
<SwitchPreference <SwitchPreference
android:key="@string/settings_display_screen_timeout_disabled_key" android:key="@string/settings_display_screen_timeout_disabled_key"
android:title="@string/settings_display_screen_timeout_disabled"/> android:title="@string/settings_display_screen_timeout_disabled" />
</PreferenceCategory> </PreferenceCategory>