) {
+ throw NotImplementedError()
+ }
open fun flattenKey(key: K) = key.toString()
abstract fun unflattenKey(key: String): K
@@ -371,7 +375,9 @@ sealed class BasePreferenceManager(private val context: Context) : SharedPrefere
editSp { putString(key, obj.toString()) }
}
- operator fun get(key: K): V? = valueMap[key]
+ operator fun get(key: K): V? {
+ return valueMap[key]
+ }
fun clear() {
valueMap.clear()
diff --git a/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt b/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt
index bbcee0b1a81..f73146f0fe4 100644
--- a/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt
+++ b/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt
@@ -118,7 +118,9 @@ private fun getAdapter(
}
@Composable
-fun Preference.getAdapter(): PreferenceAdapter = createStateAdapter(state = asState(), set = this::set)
+fun Preference.getAdapter(): PreferenceAdapter {
+ return createStateAdapter(state = asState(), set = this::set)
+}
@Composable
fun IdpPreference.getAdapter(): PreferenceAdapter {
@@ -152,7 +154,9 @@ fun rememberTransformAdapter(
}
@Composable
-fun MutableState.asPreferenceAdapter(): PreferenceAdapter = remember(this) { MutableStatePreferenceAdapter(this) }
+fun MutableState.asPreferenceAdapter(): PreferenceAdapter {
+ return remember(this) { MutableStatePreferenceAdapter(this) }
+}
private class TransformPreferenceAdapter(
private val parent: PreferenceAdapter,
@@ -179,4 +183,6 @@ fun customPreferenceAdapter(value: T, onValueChange: (T) -> Unit): Preferenc
}
@Composable
-operator fun PreferenceAdapter.not(): PreferenceAdapter = rememberTransformAdapter(adapter = this, transformGet = { !it }, transformSet = { !it })
+operator fun PreferenceAdapter.not(): PreferenceAdapter {
+ return rememberTransformAdapter(adapter = this, transformGet = { !it }, transformSet = { !it })
+}
diff --git a/lawnchair/src/app/lawnchair/preferences2/PreferenceManager2.kt b/lawnchair/src/app/lawnchair/preferences2/PreferenceManager2.kt
index f86206f83b7..495b4c5542c 100644
--- a/lawnchair/src/app/lawnchair/preferences2/PreferenceManager2.kt
+++ b/lawnchair/src/app/lawnchair/preferences2/PreferenceManager2.kt
@@ -273,6 +273,16 @@ class PreferenceManager2 private constructor(private val context: Context) :
val lockHomeScreen = preference(
key = booleanPreferencesKey(name = "lock_home_screen"),
defaultValue = context.resources.getBoolean(R.bool.config_default_lock_home_screen),
+ onSet = {
+ if (it) {
+ LauncherOptionsPopup.disableUnavailableItems(context)
+ }
+ },
+ )
+
+ val legacyPopupOptionsMigrated = preference(
+ key = booleanPreferencesKey(name = "legacy_popup_options_migrated"),
+ defaultValue = false,
)
val launcherPopupOrder = preference(
diff --git a/lawnchair/src/app/lawnchair/root/RootHelperManager.kt b/lawnchair/src/app/lawnchair/root/RootHelperManager.kt
index 6c76e925eaa..c4a6fcabaab 100644
--- a/lawnchair/src/app/lawnchair/root/RootHelperManager.kt
+++ b/lawnchair/src/app/lawnchair/root/RootHelperManager.kt
@@ -45,19 +45,21 @@ class RootHelperManager(private val context: Context) {
return rootHelperDeferred!!.await()
}
- private suspend fun bindImpl(onDisconnected: () -> Unit): IRootHelper = withContext(Dispatchers.IO) {
- val intent = Intent(context, RootHelper::class.java)
- suspendCoroutine {
- val connection = object : ServiceConnection {
- override fun onServiceConnected(name: ComponentName, service: IBinder) {
- it.resume(IRootHelper.Stub.asInterface(service))
- }
+ private suspend fun bindImpl(onDisconnected: () -> Unit): IRootHelper {
+ return withContext(Dispatchers.IO) {
+ val intent = Intent(context, RootHelper::class.java)
+ suspendCoroutine {
+ val connection = object : ServiceConnection {
+ override fun onServiceConnected(name: ComponentName, service: IBinder) {
+ it.resume(IRootHelper.Stub.asInterface(service))
+ }
- override fun onServiceDisconnected(name: ComponentName) {
- onDisconnected()
+ override fun onServiceDisconnected(name: ComponentName) {
+ onDisconnected()
+ }
}
+ RootService.bind(intent, connection)
}
- RootService.bind(intent, connection)
}
}
diff --git a/lawnchair/src/app/lawnchair/search/LawnchairSearchUiDelegate.kt b/lawnchair/src/app/lawnchair/search/LawnchairSearchUiDelegate.kt
index 9f7636f8ec5..f956c66b016 100644
--- a/lawnchair/src/app/lawnchair/search/LawnchairSearchUiDelegate.kt
+++ b/lawnchair/src/app/lawnchair/search/LawnchairSearchUiDelegate.kt
@@ -7,5 +7,7 @@ import com.android.launcher3.views.ActivityContext
class LawnchairSearchUiDelegate(private val appsView: ActivityAllAppsContainerView<*>) : AllAppsSearchUiDelegate(appsView) {
- override fun createMainAdapterProvider(): SearchAdapterProvider<*> = LawnchairSearchAdapterProvider(ActivityContext.lookupContext(appsView.context), appsView)
+ override fun createMainAdapterProvider(): SearchAdapterProvider<*> {
+ return LawnchairSearchAdapterProvider(ActivityContext.lookupContext(appsView.context), appsView)
+ }
}
diff --git a/lawnchair/src/app/lawnchair/search/adapter/SearchTargetFactory.kt b/lawnchair/src/app/lawnchair/search/adapter/SearchTargetFactory.kt
index e6460402357..143b89dd141 100644
--- a/lawnchair/src/app/lawnchair/search/adapter/SearchTargetFactory.kt
+++ b/lawnchair/src/app/lawnchair/search/adapter/SearchTargetFactory.kt
@@ -57,15 +57,17 @@ class SearchTargetFactory(
}.build()
}
- fun createShortcutTarget(shortcutInfo: ShortcutInfo): SearchTargetCompat = SearchTargetCompat.Builder(
- SearchTargetCompat.RESULT_TYPE_SHORTCUT,
- LayoutType.SMALL_ICON_HORIZONTAL_TEXT,
- "shortcut_" + generateHashKey("${shortcutInfo.`package`}|${shortcutInfo.userHandle}|${shortcutInfo.id}"),
- ).apply {
- setShortcutInfo(shortcutInfo)
- setUserHandle(shortcutInfo.userHandle)
- setExtras(Bundle())
- }.build()
+ fun createShortcutTarget(shortcutInfo: ShortcutInfo): SearchTargetCompat {
+ return SearchTargetCompat.Builder(
+ SearchTargetCompat.RESULT_TYPE_SHORTCUT,
+ LayoutType.SMALL_ICON_HORIZONTAL_TEXT,
+ "shortcut_" + generateHashKey("${shortcutInfo.`package`}|${shortcutInfo.userHandle}|${shortcutInfo.id}"),
+ ).apply {
+ setShortcutInfo(shortcutInfo)
+ setUserHandle(shortcutInfo.userHandle)
+ setExtras(Bundle())
+ }.build()
+ }
fun createWebSuggestionsTarget(suggestion: String, suggestionProvider: String): SearchTargetCompat {
val url = WebSearchProvider.fromString(suggestionProvider).getSearchUrl(suggestion)
@@ -196,16 +198,18 @@ class SearchTargetFactory(
action: SearchActionCompat,
pkg: String,
extras: Bundle = Bundle(),
- ): SearchTargetCompat = SearchTargetCompat.Builder(
- SearchTargetCompat.RESULT_TYPE_REDIRECTION,
- LayoutType.ICON_HORIZONTAL_TEXT,
- generateHashKey(id),
- )
- .setPackageName(pkg)
- .setUserHandle(Process.myUserHandle())
- .setSearchAction(action)
- .setExtras(extras)
- .build()
+ ): SearchTargetCompat {
+ return SearchTargetCompat.Builder(
+ SearchTargetCompat.RESULT_TYPE_REDIRECTION,
+ LayoutType.ICON_HORIZONTAL_TEXT,
+ generateHashKey(id),
+ )
+ .setPackageName(pkg)
+ .setUserHandle(Process.myUserHandle())
+ .setSearchAction(action)
+ .setExtras(extras)
+ .build()
+ }
internal fun createMarketSearchTarget(query: String): SearchTargetCompat? {
val marketSearchComponent = SearchLinksTarget.resolveMarketSearchActivity(context) ?: return null
@@ -320,16 +324,18 @@ class SearchTargetFactory(
targetCompat: Int,
pkg: String,
extras: Bundle = Bundle(),
- ): SearchTargetCompat = SearchTargetCompat.Builder(
- targetCompat,
- layoutType,
- generateHashKey(id),
- ).apply {
- setPackageName(pkg)
- setUserHandle(Process.myUserHandle())
- setSearchAction(action)
- setExtras(extras)
- }.build()
+ ): SearchTargetCompat {
+ return SearchTargetCompat.Builder(
+ targetCompat,
+ layoutType,
+ generateHashKey(id),
+ ).apply {
+ setPackageName(pkg)
+ setUserHandle(Process.myUserHandle())
+ setSearchAction(action)
+ setExtras(extras)
+ }.build()
+ }
}
}
@@ -386,13 +392,15 @@ object SettingsTarget {
return resolveInfo?.activityInfo?.exported == true
}
- fun formatSettingTitle(rawTitle: String?): String = rawTitle?.replace('_', ' ')
- ?.replace("ACTION", "")
- ?.lowercase()
- ?.split(' ')
- ?.joinToString(" ") {
- it.replaceFirstChar { char -> char.uppercase(Locale.ROOT) }
- }.orEmpty()
+ fun formatSettingTitle(rawTitle: String?): String {
+ return rawTitle?.replace('_', ' ')
+ ?.replace("ACTION", "")
+ ?.lowercase()
+ ?.split(' ')
+ ?.joinToString(" ") {
+ it.replaceFirstChar { char -> char.uppercase(Locale.ROOT) }
+ }.orEmpty()
+ }
}
// keys used in `pkg` param
diff --git a/lawnchair/src/app/lawnchair/search/algorithms/LawnchairLocalSearchAlgorithm.kt b/lawnchair/src/app/lawnchair/search/algorithms/LawnchairLocalSearchAlgorithm.kt
index 9f835823270..3acf9221517 100644
--- a/lawnchair/src/app/lawnchair/search/algorithms/LawnchairLocalSearchAlgorithm.kt
+++ b/lawnchair/src/app/lawnchair/search/algorithms/LawnchairLocalSearchAlgorithm.kt
@@ -422,5 +422,7 @@ class LawnchairLocalSearchAlgorithm(context: Context) : LawnchairSearchAlgorithm
results
}
- private fun filterByType(results: List, type: String): List = results.filter { it.resultType == type }
+ private fun filterByType(results: List, type: String): List {
+ return results.filter { it.resultType == type }
+ }
}
diff --git a/lawnchair/src/app/lawnchair/search/algorithms/LawnchairSearchAlgorithm.kt b/lawnchair/src/app/lawnchair/search/algorithms/LawnchairSearchAlgorithm.kt
index e2917a7be76..9ce375e561d 100644
--- a/lawnchair/src/app/lawnchair/search/algorithms/LawnchairSearchAlgorithm.kt
+++ b/lawnchair/src/app/lawnchair/search/algorithms/LawnchairSearchAlgorithm.kt
@@ -126,8 +126,10 @@ sealed class LawnchairSearchAlgorithm(
}
}
- private fun findIndices(filtered: List, layoutType: String): List = filtered.indices.filter {
- filtered[it].layoutType == layoutType && !filtered[it].isApp
+ private fun findIndices(filtered: List, layoutType: String): List {
+ return filtered.indices.filter {
+ filtered[it].layoutType == layoutType && !filtered[it].isApp
+ }
}
private fun findAppAndShorcutIndices(filtered: List): List {
diff --git a/lawnchair/src/app/lawnchair/search/algorithms/SearchUtils.kt b/lawnchair/src/app/lawnchair/search/algorithms/SearchUtils.kt
index fca7e6006f6..8d18a3f0324 100644
--- a/lawnchair/src/app/lawnchair/search/algorithms/SearchUtils.kt
+++ b/lawnchair/src/app/lawnchair/search/algorithms/SearchUtils.kt
@@ -54,17 +54,19 @@ fun Sequence.filterHiddenApps(
query: String,
hiddenApps: Set,
hiddenAppsInSearch: String,
-): Sequence = when (hiddenAppsInSearch) {
- HiddenAppsInSearch.ALWAYS -> {
- this
- }
- HiddenAppsInSearch.IF_NAME_TYPED -> {
- filter {
- it.toComponentKey().toString() !in hiddenApps ||
- it.title.toString().lowercase(Locale.getDefault()) == query
+): Sequence {
+ return when (hiddenAppsInSearch) {
+ HiddenAppsInSearch.ALWAYS -> {
+ this
+ }
+ HiddenAppsInSearch.IF_NAME_TYPED -> {
+ filter {
+ it.toComponentKey().toString() !in hiddenApps ||
+ it.title.toString().lowercase(Locale.getDefault()) == query
+ }
+ }
+ else -> {
+ filter { it.toComponentKey().toString() !in hiddenApps }
}
- }
- else -> {
- filter { it.toComponentKey().toString() !in hiddenApps }
}
}
diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/Calculation.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/Calculation.kt
index 797f6cc605a..e05585b32f0 100644
--- a/lawnchair/src/app/lawnchair/search/algorithms/data/Calculation.kt
+++ b/lawnchair/src/app/lawnchair/search/algorithms/data/Calculation.kt
@@ -12,28 +12,30 @@ data class Calculation(
fun calculateEquationFromString(
query: String,
-): Calculation = try {
- val evaluatedValue = Expressions().eval(query)
- val roundedValue = evaluatedValue.round(MathContext.DECIMAL64)
- val formattedValue = roundedValue.stripTrailingZeros()
- val absoluteValue = formattedValue.abs()
- val threshold = BigDecimal("9999999999999999")
+): Calculation {
+ return try {
+ val evaluatedValue = Expressions().eval(query)
+ val roundedValue = evaluatedValue.round(MathContext.DECIMAL64)
+ val formattedValue = roundedValue.stripTrailingZeros()
+ val absoluteValue = formattedValue.abs()
+ val threshold = BigDecimal("9999999999999999")
- val result = if (absoluteValue > threshold) {
- formattedValue.toString()
- } else {
- formattedValue.toPlainString()
- }
+ val result = if (absoluteValue > threshold) {
+ formattedValue.toString()
+ } else {
+ formattedValue.toPlainString()
+ }
- Calculation(
- equation = query,
- result = result,
- isValid = true,
- )
-} catch (_: Exception) {
- Calculation(
- equation = "",
- result = "",
- isValid = false,
- )
+ Calculation(
+ equation = query,
+ result = result,
+ isValid = true,
+ )
+ } catch (_: Exception) {
+ Calculation(
+ equation = "",
+ result = "",
+ isValid = false,
+ )
+ }
}
diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/History.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/History.kt
index 665f369aa65..2608fdae0d0 100644
--- a/lawnchair/src/app/lawnchair/search/algorithms/data/History.kt
+++ b/lawnchair/src/app/lawnchair/search/algorithms/data/History.kt
@@ -12,7 +12,9 @@ import kotlinx.coroutines.withContext
data class RecentKeyword(
val data: Map,
) {
- fun getValueByKey(key: String): String? = data[key]
+ fun getValueByKey(key: String): String? {
+ return data[key]
+ }
}
suspend fun getRecentKeyword(context: Context, query: String, max: Int, callback: SearchCallback) {
diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/SettingInfo.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/SettingInfo.kt
index 5545c1f830e..fbf2c5c8ebf 100644
--- a/lawnchair/src/app/lawnchair/search/algorithms/data/SettingInfo.kt
+++ b/lawnchair/src/app/lawnchair/search/algorithms/data/SettingInfo.kt
@@ -26,9 +26,9 @@ suspend fun findSettingsByNameAndAction(query: String, max: Int): List
diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/Expressions.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/Expressions.kt
index 63b27f91791..a0817c37023 100644
--- a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/Expressions.kt
+++ b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/Expressions.kt
@@ -163,7 +163,9 @@ class Expressions {
return this
}
- fun eval(expression: String): BigDecimal = evaluator.eval(parse(expression))
+ fun eval(expression: String): BigDecimal {
+ return evaluator.eval(parse(expression))
+ }
/**
* eval an expression then round it with {@link Evaluator#mathContext} and call toEngineeringString
@@ -171,16 +173,24 @@ class Expressions {
* @param expression String
* @return String
*/
- fun evalToString(expression: String): String = try {
- evaluator.eval(parse(expression)).round(evaluator.mathContext).stripTrailingZeros()
- .toEngineeringString()
- } catch (e: Throwable) {
- e.cause?.message ?: e.message ?: "unknown error"
+ fun evalToString(expression: String): String {
+ return try {
+ evaluator.eval(parse(expression)).round(evaluator.mathContext).stripTrailingZeros()
+ .toEngineeringString()
+ } catch (e: Throwable) {
+ e.cause?.message ?: e.message ?: "unknown error"
+ }
}
- private fun parse(expression: String): Expr = parse(scan(expression))
+ private fun parse(expression: String): Expr {
+ return parse(scan(expression))
+ }
- private fun parse(tokens: List): Expr = Parser(tokens).parse()
+ private fun parse(tokens: List): Expr {
+ return Parser(tokens).parse()
+ }
- private fun scan(expression: String): List = Scanner(expression, evaluator.mathContext).scanTokens()
+ private fun scan(expression: String): List {
+ return Scanner(expression, evaluator.mathContext).scanTokens()
+ }
}
diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Evaluator.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Evaluator.kt
index 069a1350090..8e9ff478ae6 100644
--- a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Evaluator.kt
+++ b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Evaluator.kt
@@ -44,7 +44,9 @@ internal class Evaluator : ExprVisitor {
return this
}
- fun eval(expr: Expr): BigDecimal = expr.accept(this)
+ fun eval(expr: Expr): BigDecimal {
+ return expr.accept(this)
+ }
override fun visitAssignExpr(expr: AssignExpr): BigDecimal {
val value = eval(expr.value)
@@ -112,7 +114,9 @@ internal class Evaluator : ExprVisitor {
return function.call(expr.arguments.map { eval(it) })
}
- override fun visitLiteralExpr(expr: LiteralExpr): BigDecimal = expr.value
+ override fun visitLiteralExpr(expr: LiteralExpr): BigDecimal {
+ return expr.value
+ }
override fun visitVariableExpr(expr: VariableExpr): BigDecimal {
val name = expr.name.lexeme
@@ -121,7 +125,9 @@ internal class Evaluator : ExprVisitor {
?: throw ExpressionException("Undefined variable '$name'")
}
- override fun visitGroupingExpr(expr: GroupingExpr): BigDecimal = eval(expr.expression)
+ override fun visitGroupingExpr(expr: GroupingExpr): BigDecimal {
+ return eval(expr.expression)
+ }
private infix fun Expr.or(right: Expr): BigDecimal {
val left = eval(this)
@@ -141,9 +147,13 @@ internal class Evaluator : ExprVisitor {
return eval(right).isTruthy().toBigDecimal()
}
- private fun BigDecimal.isTruthy(): Boolean = this != BigDecimal.ZERO
+ private fun BigDecimal.isTruthy(): Boolean {
+ return this != BigDecimal.ZERO
+ }
- private fun Boolean.toBigDecimal(): BigDecimal = if (this) BigDecimal.ONE else BigDecimal.ZERO
+ private fun Boolean.toBigDecimal(): BigDecimal {
+ return if (this) BigDecimal.ONE else BigDecimal.ZERO
+ }
private infix fun BigDecimal.pow(n: BigDecimal): BigDecimal {
var right = n
diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Expr.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Expr.kt
index c6fc5f0de54..f5c58a0fc0e 100644
--- a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Expr.kt
+++ b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Expr.kt
@@ -12,7 +12,9 @@ internal class AssignExpr(
val value: Expr,
) : Expr() {
- override fun accept(visitor: ExprVisitor): R = visitor.visitAssignExpr(this)
+ override fun accept(visitor: ExprVisitor): R {
+ return visitor.visitAssignExpr(this)
+ }
}
internal class LogicalExpr(
@@ -21,7 +23,9 @@ internal class LogicalExpr(
val right: Expr,
) : Expr() {
- override fun accept(visitor: ExprVisitor): R = visitor.visitLogicalExpr(this)
+ override fun accept(visitor: ExprVisitor): R {
+ return visitor.visitLogicalExpr(this)
+ }
}
internal class BinaryExpr(
@@ -30,7 +34,9 @@ internal class BinaryExpr(
val right: Expr,
) : Expr() {
- override fun accept(visitor: ExprVisitor): R = visitor.visitBinaryExpr(this)
+ override fun accept(visitor: ExprVisitor): R {
+ return visitor.visitBinaryExpr(this)
+ }
}
internal class UnaryExpr(
@@ -38,7 +44,9 @@ internal class UnaryExpr(
val right: Expr,
) : Expr() {
- override fun accept(visitor: ExprVisitor): R = visitor.visitUnaryExpr(this)
+ override fun accept(visitor: ExprVisitor): R {
+ return visitor.visitUnaryExpr(this)
+ }
}
internal class CallExpr(
@@ -46,22 +54,30 @@ internal class CallExpr(
val arguments: List,
) : Expr() {
- override fun accept(visitor: ExprVisitor): R = visitor.visitCallExpr(this)
+ override fun accept(visitor: ExprVisitor): R {
+ return visitor.visitCallExpr(this)
+ }
}
internal class LiteralExpr(val value: BigDecimal) : Expr() {
- override fun accept(visitor: ExprVisitor): R = visitor.visitLiteralExpr(this)
+ override fun accept(visitor: ExprVisitor): R {
+ return visitor.visitLiteralExpr(this)
+ }
}
internal class VariableExpr(val name: Token) : Expr() {
- override fun accept(visitor: ExprVisitor): R = visitor.visitVariableExpr(this)
+ override fun accept(visitor: ExprVisitor): R {
+ return visitor.visitVariableExpr(this)
+ }
}
internal class GroupingExpr(val expression: Expr) : Expr() {
- override fun accept(visitor: ExprVisitor): R = visitor.visitGroupingExpr(this)
+ override fun accept(visitor: ExprVisitor): R {
+ return visitor.visitGroupingExpr(this)
+ }
}
internal interface ExprVisitor {
diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Parser.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Parser.kt
index 17353392deb..412856fb0cf 100644
--- a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Parser.kt
+++ b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Parser.kt
@@ -39,7 +39,9 @@ internal class Parser(private val tokens: List) {
return expr
}
- private fun expression(): Expr = assignment()
+ private fun expression(): Expr {
+ return assignment()
+ }
private fun assignment(): Expr {
val expr = or()
@@ -235,10 +237,12 @@ internal class Parser(private val tokens: List) {
return false
}
- private fun check(tokenType: TokenType): Boolean = if (isAtEnd()) {
- false
- } else {
- peek().type === tokenType
+ private fun check(tokenType: TokenType): Boolean {
+ return if (isAtEnd()) {
+ false
+ } else {
+ peek().type === tokenType
+ }
}
private fun consume(type: TokenType, message: String): Token {
diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Scanner.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Scanner.kt
index f87d5dcccc6..5190cce396d 100644
--- a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Scanner.kt
+++ b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Scanner.kt
@@ -25,7 +25,9 @@ import app.lawnchair.search.algorithms.data.calculator.internal.TokenType.SQUARE
import app.lawnchair.search.algorithms.data.calculator.internal.TokenType.STAR
import java.math.MathContext
-private fun invalidToken(c: Char): Unit = throw ExpressionException("Invalid token '$c'")
+private fun invalidToken(c: Char) {
+ throw ExpressionException("Invalid token '$c'")
+}
internal class Scanner(
private val source: String,
@@ -45,7 +47,9 @@ internal class Scanner(
return tokens
}
- private fun isAtEnd(): Boolean = current >= source.length
+ private fun isAtEnd(): Boolean {
+ return current >= source.length
+ }
private fun scanToken() {
start = current
@@ -56,7 +60,6 @@ internal class Scanner(
-> {
// Ignore whitespace.
}
-
'+' -> addToken(PLUS)
'-' -> addToken(MINUS)
'*' -> addToken(STAR)
@@ -87,13 +90,15 @@ internal class Scanner(
char: Char,
previousChar: Char = '\u0000',
nextChar: Char = '\u0000',
- ): Boolean = char.isDigit() ||
- when (char) {
- '.' -> true
- 'e', 'E' -> previousChar.isDigit() && (nextChar.isDigit() || nextChar == '+' || nextChar == '-')
- '+', '-' -> (previousChar == 'e' || previousChar == 'E') && nextChar.isDigit()
- else -> false
- }
+ ): Boolean {
+ return char.isDigit() ||
+ when (char) {
+ '.' -> true
+ 'e', 'E' -> previousChar.isDigit() && (nextChar.isDigit() || nextChar == '+' || nextChar == '-')
+ '+', '-' -> (previousChar == 'e' || previousChar == 'E') && nextChar.isDigit()
+ else -> false
+ }
+ }
private fun number() {
while (peek().isDigit()) advance()
@@ -118,18 +123,22 @@ internal class Scanner(
private fun advance() = source[current++]
- private fun peek(): Char = if (isAtEnd()) {
- '\u0000'
- } else {
- source[current]
+ private fun peek(): Char {
+ return if (isAtEnd()) {
+ '\u0000'
+ } else {
+ source[current]
+ }
}
private fun peekPrevious(): Char = if (current > 0) source[current - 1] else '\u0000'
- private fun peekNext(): Char = if (current + 1 >= source.length) {
- '\u0000'
- } else {
- source[current + 1]
+ private fun peekNext(): Char {
+ return if (current + 1 >= source.length) {
+ '\u0000'
+ } else {
+ source[current + 1]
+ }
}
private fun match(expected: Char): Boolean {
diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Token.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Token.kt
index c1780c9e313..ee03386d2a8 100644
--- a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Token.kt
+++ b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Token.kt
@@ -6,5 +6,7 @@ internal class Token(
val literal: Any?,
) {
- override fun toString(): String = "$type $lexeme $literal"
+ override fun toString(): String {
+ return "$type $lexeme $literal"
+ }
}
diff --git a/lawnchair/src/app/lawnchair/smartspace/BcSmartSpaceUtil.kt b/lawnchair/src/app/lawnchair/smartspace/BcSmartSpaceUtil.kt
index 1c5b47eccd7..c5ef9804418 100644
--- a/lawnchair/src/app/lawnchair/smartspace/BcSmartSpaceUtil.kt
+++ b/lawnchair/src/app/lawnchair/smartspace/BcSmartSpaceUtil.kt
@@ -45,10 +45,12 @@ object BcSmartSpaceUtil {
}
}
- fun getOpenCalendarIntent(): Intent = Intent(Intent.ACTION_VIEW).setData(
- ContentUris.appendId(
- CalendarContract.CONTENT_URI.buildUpon().appendPath("time"),
- System.currentTimeMillis(),
- ).build(),
- ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
+ fun getOpenCalendarIntent(): Intent {
+ return Intent(Intent.ACTION_VIEW).setData(
+ ContentUris.appendId(
+ CalendarContract.CONTENT_URI.buildUpon().appendPath("time"),
+ System.currentTimeMillis(),
+ ).build(),
+ ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
+ }
}
diff --git a/lawnchair/src/app/lawnchair/smartspace/CardPagerAdapter.kt b/lawnchair/src/app/lawnchair/smartspace/CardPagerAdapter.kt
index 12868feed9b..4129f31d4d4 100644
--- a/lawnchair/src/app/lawnchair/smartspace/CardPagerAdapter.kt
+++ b/lawnchair/src/app/lawnchair/smartspace/CardPagerAdapter.kt
@@ -76,7 +76,9 @@ class CardPagerAdapter(context: Context) : PagerAdapter() {
override fun getCount() = smartspaceTargets.size
- override fun isViewFromObject(view: View, obj: Any): Boolean = view === (obj as ViewHolder).card
+ override fun isViewFromObject(view: View, obj: Any): Boolean {
+ return view === (obj as ViewHolder).card
+ }
private fun createBaseCard(
container: ViewGroup,
diff --git a/lawnchair/src/app/lawnchair/smartspace/InterceptingViewPager.kt b/lawnchair/src/app/lawnchair/smartspace/InterceptingViewPager.kt
index 4f7acb94b62..5c8e488cd5e 100644
--- a/lawnchair/src/app/lawnchair/smartspace/InterceptingViewPager.kt
+++ b/lawnchair/src/app/lawnchair/smartspace/InterceptingViewPager.kt
@@ -55,10 +55,14 @@ class InterceptingViewPager @JvmOverloads constructor(
}
}
- override fun onInterceptTouchEvent(ev: MotionEvent): Boolean = handleTouchOverride(ev, superOnIntercept)
+ override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
+ return handleTouchOverride(ev, superOnIntercept)
+ }
@SuppressLint("ClickableViewAccessibility")
- override fun onTouchEvent(ev: MotionEvent): Boolean = handleTouchOverride(ev, superOnTouch)
+ override fun onTouchEvent(ev: MotionEvent): Boolean {
+ return handleTouchOverride(ev, superOnTouch)
+ }
private fun cancelScheduledLongPress() {
if (hasPostedLongPress) {
diff --git a/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceDataSource.kt b/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceDataSource.kt
index 08f705192b1..47e62c6ccf0 100644
--- a/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceDataSource.kt
+++ b/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceDataSource.kt
@@ -80,9 +80,11 @@ sealed class SmartspaceDataSource(
val targets: List = emptyList(),
val requiresSetup: List = emptyList(),
) {
- operator fun plus(other: State): State = State(
- targets = this.targets + other.targets,
- requiresSetup = this.requiresSetup + other.requiresSetup,
- )
+ operator fun plus(other: State): State {
+ return State(
+ targets = this.targets + other.targets,
+ requiresSetup = this.requiresSetup + other.requiresSetup,
+ )
+ }
}
}
diff --git a/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceWidgetReader.kt b/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceWidgetReader.kt
index 849f4ce6d0e..cac8168b080 100644
--- a/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceWidgetReader.kt
+++ b/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceWidgetReader.kt
@@ -141,7 +141,9 @@ class SmartspaceWidgetReader(context: Context) :
)
}
- private fun extractBitmap(imageView: ImageView?): Bitmap? = (imageView?.drawable as? BitmapDrawable)?.bitmap
+ private fun extractBitmap(imageView: ImageView?): Bitmap? {
+ return (imageView?.drawable as? BitmapDrawable)?.bitmap
+ }
data class WeatherData(
val icon: Bitmap,
@@ -151,7 +153,9 @@ class SmartspaceWidgetReader(context: Context) :
val pendingIntent: PendingIntent? = null,
) {
- fun getTitle(unit: Temperature.Unit = temperature.unit): String = "${temperature.inUnit(unit)}${unit.suffix}"
+ fun getTitle(unit: Temperature.Unit = temperature.unit): String {
+ return "${temperature.inUnit(unit)}${unit.suffix}"
+ }
}
companion object {
@@ -165,29 +169,31 @@ class SmartspaceWidgetReader(context: Context) :
featureType = SmartspaceTarget.FeatureType.FEATURE_WEATHER,
)
- fun parseWeatherData(weatherIcon: Bitmap?, temperature: String?, intent: PendingIntent? = null): WeatherData? = if (weatherIcon != null && temperature != null) {
- try {
- val value = temperature.substring(0, temperature.indexOfFirst { (it < '0' || it > '9') && it != '-' }).toInt()
- WeatherData(
- weatherIcon,
- Temperature(
- value,
- when {
- temperature.contains("C") -> Temperature.Unit.Celsius
- temperature.contains("F") -> Temperature.Unit.Fahrenheit
- temperature.contains("K") -> Temperature.Unit.Kelvin
- else -> throw IllegalArgumentException("only supports C, F and K")
- },
- ),
- pendingIntent = intent,
- )
- } catch (_: NumberFormatException) {
- null
- } catch (_: IllegalArgumentException) {
+ fun parseWeatherData(weatherIcon: Bitmap?, temperature: String?, intent: PendingIntent? = null): WeatherData? {
+ return if (weatherIcon != null && temperature != null) {
+ try {
+ val value = temperature.substring(0, temperature.indexOfFirst { (it < '0' || it > '9') && it != '-' }).toInt()
+ WeatherData(
+ weatherIcon,
+ Temperature(
+ value,
+ when {
+ temperature.contains("C") -> Temperature.Unit.Celsius
+ temperature.contains("F") -> Temperature.Unit.Fahrenheit
+ temperature.contains("K") -> Temperature.Unit.Kelvin
+ else -> throw IllegalArgumentException("only supports C, F and K")
+ },
+ ),
+ pendingIntent = intent,
+ )
+ } catch (_: NumberFormatException) {
+ null
+ } catch (_: IllegalArgumentException) {
+ null
+ }
+ } else {
null
}
- } else {
- null
}
}
}
diff --git a/lawnchair/src/app/lawnchair/theme/ThemeProvider.kt b/lawnchair/src/app/lawnchair/theme/ThemeProvider.kt
index 165ddaada1c..c6f539fd2d5 100644
--- a/lawnchair/src/app/lawnchair/theme/ThemeProvider.kt
+++ b/lawnchair/src/app/lawnchair/theme/ThemeProvider.kt
@@ -136,8 +136,10 @@ class ThemeProvider(private val context: Context) : SafeCloseable {
}
}
-fun Color.toAndroidColor(): Int = when (this) {
- is AndroidColor -> color
- is Srgb -> ColorUtils.setAlphaComponent(toRgb8(), 255)
- else -> convert().toAndroidColor()
+fun Color.toAndroidColor(): Int {
+ return when (this) {
+ is AndroidColor -> color
+ is Srgb -> ColorUtils.setAlphaComponent(toRgb8(), 255)
+ else -> convert().toAndroidColor()
+ }
}
diff --git a/lawnchair/src/app/lawnchair/theme/color/tokens/ColorStateListToken.kt b/lawnchair/src/app/lawnchair/theme/color/tokens/ColorStateListToken.kt
index 1c04dea3b03..a33aef09ac8 100644
--- a/lawnchair/src/app/lawnchair/theme/color/tokens/ColorStateListToken.kt
+++ b/lawnchair/src/app/lawnchair/theme/color/tokens/ColorStateListToken.kt
@@ -12,7 +12,9 @@ data class NewColorStateList(
private val factory: (context: Context, scheme: ColorScheme, uiColorMode: UiColorMode) -> ColorStateList,
) : ColorStateListToken {
- override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): ColorStateList = factory(context, scheme, uiColorMode)
+ override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): ColorStateList {
+ return factory(context, scheme, uiColorMode)
+ }
}
class DayNightColorStateList(
@@ -20,9 +22,11 @@ class DayNightColorStateList(
private val darkToken: ColorStateListToken,
) : ColorStateListToken {
- override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): ColorStateList = if (uiColorMode.isDarkTheme) {
- darkToken.resolve(context, scheme, uiColorMode)
- } else {
- lightToken.resolve(context, scheme, uiColorMode)
+ override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): ColorStateList {
+ return if (uiColorMode.isDarkTheme) {
+ darkToken.resolve(context, scheme, uiColorMode)
+ } else {
+ lightToken.resolve(context, scheme, uiColorMode)
+ }
}
}
diff --git a/lawnchair/src/app/lawnchair/theme/color/tokens/ColorToken.kt b/lawnchair/src/app/lawnchair/theme/color/tokens/ColorToken.kt
index 0f04bda24de..6610b9f265d 100644
--- a/lawnchair/src/app/lawnchair/theme/color/tokens/ColorToken.kt
+++ b/lawnchair/src/app/lawnchair/theme/color/tokens/ColorToken.kt
@@ -20,11 +20,13 @@ sealed interface ColorToken : ResourceToken {
val themeProvider = ThemeProvider.INSTANCE.get(context)
return resolveColor(context, themeProvider.colorScheme, uiColorMode)
}
- fun resolveColor(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Int = try {
- resolve(context, scheme, uiColorMode).toAndroidColor()
- } catch (t: Throwable) {
- Log.e("ColorToken", "failed to resolve color", t)
- android.graphics.Color.WHITE
+ fun resolveColor(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Int {
+ return try {
+ resolve(context, scheme, uiColorMode).toAndroidColor()
+ } catch (t: Throwable) {
+ Log.e("ColorToken", "failed to resolve color", t)
+ android.graphics.Color.WHITE
+ }
}
}
@@ -50,13 +52,17 @@ data class DayNightColorToken(
private val darkToken: ColorToken,
) : ColorToken {
- override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color = if (uiColorMode.isDarkTheme) {
- darkToken.resolve(context, scheme, uiColorMode)
- } else {
- lightToken.resolve(context, scheme, uiColorMode)
+ override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color {
+ return if (uiColorMode.isDarkTheme) {
+ darkToken.resolve(context, scheme, uiColorMode)
+ } else {
+ lightToken.resolve(context, scheme, uiColorMode)
+ }
}
- fun inverse(): DayNightColorToken = DayNightColorToken(darkToken, lightToken)
+ fun inverse(): DayNightColorToken {
+ return DayNightColorToken(darkToken, lightToken)
+ }
}
data class DarkTextColorToken(
@@ -64,10 +70,12 @@ data class DarkTextColorToken(
private val darkToken: ColorToken,
) : ColorToken {
- override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color = if (uiColorMode.isDarkText) {
- darkToken.resolve(context, scheme, uiColorMode)
- } else {
- lightToken.resolve(context, scheme, uiColorMode)
+ override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color {
+ return if (uiColorMode.isDarkText) {
+ darkToken.resolve(context, scheme, uiColorMode)
+ } else {
+ lightToken.resolve(context, scheme, uiColorMode)
+ }
}
}
@@ -75,7 +83,9 @@ data class StaticColorToken(
private val color: Long,
) : ColorToken {
- override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color = AndroidColor(color.toInt())
+ override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color {
+ return AndroidColor(color.toInt())
+ }
}
data class SetAlphaColorToken(
@@ -106,7 +116,9 @@ class WithContextColorToken(
private val transform: ColorToken.(Context) -> ColorToken,
) : ColorToken {
- override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color = transform(token, context).resolve(context, scheme, uiColorMode)
+ override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color {
+ return transform(token, context).resolve(context, scheme, uiColorMode)
+ }
}
enum class Swatch { Neutral1, Neutral2, Accent1, Accent2, Accent3 }
diff --git a/lawnchair/src/app/lawnchair/theme/drawable/DrawableToken.kt b/lawnchair/src/app/lawnchair/theme/drawable/DrawableToken.kt
index e9c8bb7606e..12ee52800c8 100644
--- a/lawnchair/src/app/lawnchair/theme/drawable/DrawableToken.kt
+++ b/lawnchair/src/app/lawnchair/theme/drawable/DrawableToken.kt
@@ -19,7 +19,9 @@ interface DrawableToken : ResourceToken
data class ResourceDrawableToken(@DrawableRes private val resId: Int) : DrawableToken {
@Suppress("UNCHECKED_CAST")
- override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): T = AppCompatResources.getDrawable(context, resId) as T
+ override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): T {
+ return AppCompatResources.getDrawable(context, resId) as T
+ }
}
data class AttributeDrawableToken(@AttrRes private val attr: Int) : DrawableToken {
@@ -46,7 +48,9 @@ data class NewDrawable(
private val factory: (context: Context, scheme: ColorScheme, uiColorMode: UiColorMode) -> T,
) : DrawableToken {
- override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): T = factory(context, scheme, uiColorMode)
+ override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): T {
+ return factory(context, scheme, uiColorMode)
+ }
}
fun DrawableToken.mutate(
diff --git a/lawnchair/src/app/lawnchair/ui/AndroidText.kt b/lawnchair/src/app/lawnchair/ui/AndroidText.kt
index 7d40739f722..736655275f0 100644
--- a/lawnchair/src/app/lawnchair/ui/AndroidText.kt
+++ b/lawnchair/src/app/lawnchair/ui/AndroidText.kt
@@ -54,7 +54,9 @@ fun AndroidText(
}
@Composable
-fun toIntColor(color: Color): Int = remember(color) {
- val (r, g, b, a) = color.convert(ColorSpaces.Srgb)
- android.graphics.Color.argb((a * 255).toInt(), (r * 255).toInt(), (g * 255).toInt(), (b * 255).toInt())
+fun toIntColor(color: Color): Int {
+ return remember(color) {
+ val (r, g, b, a) = color.convert(ColorSpaces.Srgb)
+ android.graphics.Color.argb((a * 255).toInt(), (r * 255).toInt(), (g * 255).toInt(), (b * 255).toInt())
+ }
}
diff --git a/lawnchair/src/app/lawnchair/ui/StretchRecyclerViewContainer.kt b/lawnchair/src/app/lawnchair/ui/StretchRecyclerViewContainer.kt
index 41c23f90967..44bfca94896 100644
--- a/lawnchair/src/app/lawnchair/ui/StretchRecyclerViewContainer.kt
+++ b/lawnchair/src/app/lawnchair/ui/StretchRecyclerViewContainer.kt
@@ -38,10 +38,12 @@ open class StretchRecyclerViewContainer @JvmOverloads constructor(
override fun createEdgeEffectFactory(): RecyclerView.EdgeEffectFactory {
if (Utilities.ATLEAST_S) return super.createEdgeEffectFactory()
return object : RecyclerView.EdgeEffectFactory() {
- override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect = when (direction) {
- DIRECTION_TOP -> edgeEffectTop
- DIRECTION_BOTTOM -> childEffect
- else -> super.createEdgeEffect(view, direction)
+ override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect {
+ return when (direction) {
+ DIRECTION_TOP -> edgeEffectTop
+ DIRECTION_BOTTOM -> childEffect
+ else -> super.createEdgeEffect(view, direction)
+ }
}
}
}
diff --git a/lawnchair/src/app/lawnchair/ui/StretchRelativeLayout.kt b/lawnchair/src/app/lawnchair/ui/StretchRelativeLayout.kt
index e3c3ef33df1..933815d1d99 100644
--- a/lawnchair/src/app/lawnchair/ui/StretchRelativeLayout.kt
+++ b/lawnchair/src/app/lawnchair/ui/StretchRelativeLayout.kt
@@ -51,10 +51,12 @@ sealed class StretchRelativeLayout @JvmOverloads constructor(
override fun createEdgeEffectFactory(): RecyclerView.EdgeEffectFactory {
if (Utilities.ATLEAST_S) return super.createEdgeEffectFactory()
return object : RecyclerView.EdgeEffectFactory() {
- override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect = when (direction) {
- DIRECTION_TOP -> edgeEffectTop
- DIRECTION_BOTTOM -> edgeEffectBottom
- else -> super.createEdgeEffect(view, direction)
+ override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect {
+ return when (direction) {
+ DIRECTION_TOP -> edgeEffectTop
+ DIRECTION_BOTTOM -> edgeEffectBottom
+ else -> super.createEdgeEffect(view, direction)
+ }
}
}
}
diff --git a/lawnchair/src/app/lawnchair/ui/popup/LauncherOptionsPopup.kt b/lawnchair/src/app/lawnchair/ui/popup/LauncherOptionsPopup.kt
index 3a70297ab7c..bc72b731d47 100644
--- a/lawnchair/src/app/lawnchair/ui/popup/LauncherOptionsPopup.kt
+++ b/lawnchair/src/app/lawnchair/ui/popup/LauncherOptionsPopup.kt
@@ -1,5 +1,6 @@
package app.lawnchair.ui.popup
+import android.content.Context
import android.view.View
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
@@ -13,7 +14,25 @@ import com.patrykmichalik.opto.core.firstBlocking
import com.patrykmichalik.opto.core.setBlocking
object LauncherOptionsPopup {
- const val DEFAULT_ORDER = "-lock|-edit_mode|+wallpaper|+widgets|+home_settings|-sys_settings"
+ const val DEFAULT_ORDER = "+carousel|-lock|-edit_mode|+wallpaper|+widgets|+home_settings|-sys_settings"
+
+ fun disableUnavailableItems(
+ context: Context,
+ ) {
+ val prefs2 = getInstance(context)
+ val optionOrder = prefs2.launcherPopupOrder.firstBlocking()
+
+ prefs2.launcherPopupOrder.setBlocking(
+ optionOrder.split("|")
+ .joinToString("|") { item ->
+ when (item) {
+ "+edit_mode" -> "-edit_mode"
+ "+widgets" -> "-widgets"
+ else -> item
+ }
+ },
+ )
+ }
/**
* Returns the list of supported actions
@@ -31,18 +50,7 @@ object LauncherOptionsPopup {
val lockHomeScreen = prefs2.lockHomeScreen.firstBlocking()
val optionOrder = prefs2.launcherPopupOrder.firstBlocking()
- if (lockHomeScreen) {
- prefs2.launcherPopupOrder.setBlocking(
- optionOrder.split("|")
- .joinToString("|") { item ->
- when (item) {
- "+edit_mode" -> "-edit_mode"
- "+widgets" -> "-widgets"
- else -> item
- }
- },
- )
- }
+ migrateLegacyPreferences(launcher)
val wallpaperResString =
if (Utilities.existsStyleWallpapers(launcher)) R.string.styles_wallpaper_button_text else R.string.wallpapers
@@ -101,7 +109,7 @@ object LauncherOptionsPopup {
item.startsWith("-") -> item.drop(1) to false
else -> item to true // Default to enabled if no prefix
}
- if (isEnabled) {
+ if (isEnabled && identifier != "carousel") {
optionsList[identifier]?.let { option ->
options.add(option)
}
@@ -111,32 +119,72 @@ object LauncherOptionsPopup {
return options
}
- fun getMetadataForOption(identifier: String): LauncherOptionMetadata = when (identifier) {
- "lock" -> LauncherOptionMetadata(
- label = R.string.home_screen_lock,
- icon = R.drawable.ic_lock,
- )
- "sys_settings" -> LauncherOptionMetadata(
- label = R.string.system_settings,
- icon = R.drawable.ic_setting,
- )
- "edit_mode" -> LauncherOptionMetadata(
- label = R.string.edit_home_screen,
- icon = R.drawable.enter_home_gardening_icon,
- )
- "wallpaper" -> LauncherOptionMetadata(
- label = R.string.styles_wallpaper_button_text,
- icon = R.drawable.ic_palette,
- )
- "widgets" -> LauncherOptionMetadata(
- label = R.string.widget_button_text,
- icon = R.drawable.ic_widget,
- )
- "home_settings" -> LauncherOptionMetadata(
- label = R.string.settings_button_text,
- icon = R.drawable.ic_home_screen,
- )
- else -> throw IllegalArgumentException("invalid popup option")
+ fun getMetadataForOption(identifier: String): LauncherOptionMetadata {
+ return when (identifier) {
+ "carousel" -> LauncherOptionMetadata(
+ label = R.string.wallpaper_quick_picker,
+ icon = R.drawable.ic_wallpaper,
+ isCarousel = true,
+ )
+ "lock" -> LauncherOptionMetadata(
+ label = R.string.home_screen_lock,
+ icon = R.drawable.ic_lock,
+ )
+ "sys_settings" -> LauncherOptionMetadata(
+ label = R.string.system_settings,
+ icon = R.drawable.ic_setting,
+ )
+ "edit_mode" -> LauncherOptionMetadata(
+ label = R.string.edit_home_screen,
+ icon = R.drawable.enter_home_gardening_icon,
+ )
+ "wallpaper" -> LauncherOptionMetadata(
+ label = R.string.styles_wallpaper_button_text,
+ icon = R.drawable.ic_palette,
+ )
+ "widgets" -> LauncherOptionMetadata(
+ label = R.string.widget_button_text,
+ icon = R.drawable.ic_widget,
+ )
+ "home_settings" -> LauncherOptionMetadata(
+ label = R.string.settings_button_text,
+ icon = R.drawable.ic_home_screen,
+ )
+ else -> throw IllegalArgumentException("invalid popup option")
+ }
+ }
+
+ private fun migrateLegacyPreferences(
+ launcher: Launcher,
+ ) {
+ val prefs2 = getInstance(launcher)
+
+ val lockHomeScreenButtonOnPopUp = prefs2.lockHomeScreenButtonOnPopUp.firstBlocking()
+ val editHomeScreenButtonOnPopUp = prefs2.editHomeScreenButtonOnPopUp.firstBlocking()
+ val showSystemSettingsEntryOnPopUp = prefs2.showSystemSettingsEntryOnPopUp.firstBlocking()
+
+ val optionOrder = prefs2.launcherPopupOrder
+ val legacyPopupOptionsMigrated = prefs2.legacyPopupOptionsMigrated.firstBlocking()
+
+ if (!legacyPopupOptionsMigrated) {
+ prefs2.legacyPopupOptionsMigrated.setBlocking(true)
+
+ val options = optionOrder.firstBlocking().toLauncherOptions()
+
+ options.forEachIndexed { index, item ->
+ if (item.identifier == "lock") {
+ options[index].isEnabled = lockHomeScreenButtonOnPopUp
+ }
+ if (item.identifier == "edit_mode") {
+ options[index].isEnabled = editHomeScreenButtonOnPopUp
+ }
+ if (item.identifier == "sys_settings") {
+ options[index].isEnabled = showSystemSettingsEntryOnPopUp
+ }
+ }
+
+ optionOrder.setBlocking(options.toOptionOrderString())
+ }
}
}
@@ -148,17 +196,22 @@ data class LauncherOptionPopupItem(
data class LauncherOptionMetadata(
@StringRes val label: Int,
@DrawableRes val icon: Int,
+ val isCarousel: Boolean = false,
)
-fun String.toLauncherOptions(): List = this.split("|").map { item ->
- val (identifier, isEnabled) = when {
- item.startsWith("+") -> item.drop(1) to true
- item.startsWith("-") -> item.drop(1) to false
- else -> item to true // Default to enabled if no prefix
+fun String.toLauncherOptions(): List {
+ return this.split("|").map { item ->
+ val (identifier, isEnabled) = when {
+ item.startsWith("+") -> item.drop(1) to true
+ item.startsWith("-") -> item.drop(1) to false
+ else -> item to true // Default to enabled if no prefix
+ }
+ LauncherOptionPopupItem(identifier, isEnabled)
}
- LauncherOptionPopupItem(identifier, isEnabled)
}
-fun List.toOptionOrderString(): String = this.joinToString("|") {
- if (it.isEnabled) "+${it.identifier}" else "-${it.identifier}"
+fun List.toOptionOrderString(): String {
+ return this.joinToString("|") {
+ if (it.isEnabled) "+${it.identifier}" else "-${it.identifier}"
+ }
}
diff --git a/lawnchair/src/app/lawnchair/ui/popup/LawnchairPopupDialog.kt b/lawnchair/src/app/lawnchair/ui/popup/LawnchairPopupDialog.kt
new file mode 100644
index 00000000000..19fe1eb6c02
--- /dev/null
+++ b/lawnchair/src/app/lawnchair/ui/popup/LawnchairPopupDialog.kt
@@ -0,0 +1,16 @@
+package app.lawnchair.ui.popup
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.View
+import com.android.launcher3.R
+import com.android.launcher3.views.ActivityContext
+import com.android.launcher3.views.OptionsPopupView
+
+class LawnchairPopupDialog {
+ class LawnchairOptionsPopUp(context: T, attributeSet: AttributeSet) : OptionsPopupView(context, attributeSet)
+ where T : Context, T : ActivityContext {
+
+ override fun isShortcutOrWrapper(view: View): Boolean = view.id == R.id.wallpaper_container || super.isShortcutOrWrapper(view)
+ }
+}
diff --git a/lawnchair/src/app/lawnchair/ui/popup/WallpaperCarouselView.kt b/lawnchair/src/app/lawnchair/ui/popup/WallpaperCarouselView.kt
new file mode 100644
index 00000000000..d88960058e9
--- /dev/null
+++ b/lawnchair/src/app/lawnchair/ui/popup/WallpaperCarouselView.kt
@@ -0,0 +1,218 @@
+package app.lawnchair.ui.popup
+
+import android.animation.ValueAnimator
+import android.annotation.SuppressLint
+import android.app.WallpaperManager
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.BitmapFactory
+import android.util.AttributeSet
+import android.util.Log
+import android.view.Gravity
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.ProgressBar
+import androidx.cardview.widget.CardView
+import androidx.core.content.ContextCompat
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.ViewModelStoreOwner
+import app.lawnchair.LawnchairLauncher
+import app.lawnchair.views.component.IconFrame
+import app.lawnchair.wallpaper.model.WallpaperViewModel
+import app.lawnchair.wallpaper.model.WallpaperViewModelFactory
+import app.lawnchair.wallpaper.service.Wallpaper
+import com.android.launcher3.R
+import com.android.launcher3.util.Themes
+import com.android.launcher3.views.ActivityContext
+import java.io.File
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+class WallpaperCarouselView @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0,
+) : LinearLayout(context, attrs, defStyleAttr) {
+
+ private val viewModel: WallpaperViewModel
+ private val deviceProfile = ActivityContext.lookupContext(context).deviceProfile
+ private var currentItemIndex = 0
+ private val iconFrame = IconFrame(context).apply {
+ setIcon(R.drawable.ic_tick)
+ setBackgroundWithRadius(Themes.getColorAccent(context), 100F)
+ }
+ private val loadingView = ProgressBar(context).apply { isIndeterminate = true }
+
+ init {
+ orientation = HORIZONTAL
+ addView(loadingView)
+ viewModel = ViewModelProvider(
+ context as ViewModelStoreOwner,
+ WallpaperViewModelFactory(context),
+ )[WallpaperViewModel::class.java]
+
+ observeWallpapers()
+ }
+
+ private fun observeWallpapers() {
+ viewModel.wallpapers.observe(context as LifecycleOwner) { wallpapers ->
+ visibility = if (wallpapers.isEmpty()) GONE else VISIBLE
+ loadingView.visibility = if (wallpapers.isEmpty()) GONE else VISIBLE
+ if (wallpapers.isNotEmpty()) displayWallpapers(wallpapers)
+ }
+ }
+
+ private fun displayWallpapers(wallpapers: List) {
+ removeAllViews()
+ val totalWidth = calculateTotalWidth()
+ val firstItemWidth = totalWidth * 0.4
+ val itemWidth = calculateItemWidth(totalWidth, wallpapers.size, firstItemWidth)
+ val margin = (totalWidth * 0.03).toInt()
+
+ wallpapers.forEachIndexed { index, wallpaper ->
+ val cardView = createCardView(index, firstItemWidth, itemWidth, margin, wallpaper)
+ addView(cardView)
+ loadWallpaperImage(wallpaper, cardView, index == currentItemIndex)
+ }
+ loadingView.visibility = GONE
+ }
+
+ private fun calculateTotalWidth(): Int {
+ return width.takeIf { it > 0 } ?: (deviceProfile.widthPx * if (deviceProfile.isLandscape || deviceProfile.isTablet) 0.5 else 0.8).toInt()
+ }
+
+ private fun calculateItemWidth(totalWidth: Int, itemCount: Int, firstItemWidth: Double): Double {
+ val remainingWidth = totalWidth - firstItemWidth
+ val marginBetweenItems = totalWidth * 0.03
+ return (remainingWidth - (marginBetweenItems * (itemCount - 1))) / (itemCount - 1)
+ }
+
+ @SuppressLint("ClickableViewAccessibility")
+ private fun createCardView(
+ index: Int,
+ firstItemWidth: Double,
+ itemWidth: Double,
+ margin: Int,
+ wallpaper: Wallpaper,
+ ): CardView {
+ return CardView(context).apply {
+ radius = Themes.getDialogCornerRadius(context) / 2
+ layoutParams = LayoutParams(
+ if (index == currentItemIndex) firstItemWidth.toInt() else itemWidth.toInt(),
+ LayoutParams.MATCH_PARENT,
+ ).apply { setMargins(if (index > 0) margin else 0, 0, 0, 0) }
+
+ setOnTouchListener { _, _ ->
+ if (index != currentItemIndex) {
+ animateWidthTransition(index, firstItemWidth, itemWidth)
+ } else {
+ setWallpaper(wallpaper)
+ }
+ true
+ }
+ }
+ }
+
+ private fun loadWallpaperImage(wallpaper: Wallpaper, cardView: CardView, isCurrent: Boolean) {
+ CoroutineScope(Dispatchers.IO).launch {
+ val bitmap = File(wallpaper.imagePath).takeIf { it.exists() }?.let { BitmapFactory.decodeFile(it.path) }
+ withContext(Dispatchers.Main) { addImageView(cardView, bitmap, isCurrent) }
+ }
+ }
+
+ private fun addImageView(cardView: CardView, bitmap: Bitmap?, isCurrent: Boolean) {
+ val imageView = ImageView(context).apply {
+ setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_deepshortcut_placeholder))
+ scaleType = ImageView.ScaleType.CENTER_CROP
+ alpha = 0f
+ }
+ cardView.addView(imageView)
+ if (bitmap != null) {
+ imageView.setImageBitmap(bitmap)
+ imageView.animate().alpha(1f).setDuration(200L).withEndAction {
+ if (isCurrent) addIconFrameToCenter(cardView)
+ }.start()
+ }
+ }
+
+ private fun setWallpaper(wallpaper: Wallpaper) {
+ val currentCardView = getChildAt(currentItemIndex) as CardView
+ val spinner = createLoadingSpinner()
+
+ currentCardView.removeView(iconFrame)
+ currentCardView.addView(spinner)
+
+ CoroutineScope(Dispatchers.IO).launch {
+ try {
+ WallpaperManager.getInstance(context).setBitmap(
+ BitmapFactory.decodeFile(wallpaper.imagePath),
+ null,
+ true,
+ WallpaperManager.FLAG_SYSTEM,
+ )
+ viewModel.updateWallpaperRank(wallpaper)
+ } catch (e: Exception) {
+ Log.e("WallpaperCarouselView", "Failed to set wallpaper: ${e.message}")
+ } finally {
+ withContext(Dispatchers.Main) {
+ currentCardView.removeView(spinner)
+ addIconFrameToCenter(currentCardView)
+ }
+ }
+ }
+ }
+
+ private fun createLoadingSpinner() = ProgressBar(context).apply {
+ isIndeterminate = true
+ layoutParams = FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).apply {
+ gravity = Gravity.CENTER
+ }
+ }
+
+ private fun addIconFrameToCenter(cardView: CardView? = getChildAt(currentItemIndex) as CardView) {
+ (iconFrame.parent as? ViewGroup)?.removeView(iconFrame)
+ cardView?.addView(
+ iconFrame,
+ FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).apply {
+ gravity = Gravity.CENTER
+ },
+ )
+ }
+
+ override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
+ super.onSizeChanged(w, h, oldw, oldh)
+ viewModel.wallpapers.value?.let { displayWallpapers(it) }
+ }
+
+ override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
+ super.onMeasure(
+ MeasureSpec.makeMeasureSpec(calculateTotalWidth(), MeasureSpec.EXACTLY),
+ heightMeasureSpec,
+ )
+ }
+
+ private fun animateWidthTransition(newIndex: Int, firstItemWidth: Double, itemWidth: Double) {
+ currentItemIndex = newIndex
+ for (i in 0 until childCount) {
+ (getChildAt(i) as? CardView)?.let { cardView ->
+ val targetWidth = if (i == currentItemIndex) firstItemWidth.toInt() else itemWidth.toInt()
+ if (cardView.layoutParams.width != targetWidth) {
+ ValueAnimator.ofInt(cardView.layoutParams.width, targetWidth).apply {
+ duration = 300L
+ addUpdateListener {
+ cardView.layoutParams.width = it.animatedValue as Int
+ cardView.requestLayout()
+ }
+ start()
+ }
+ }
+ if (i == currentItemIndex) addIconFrameToCenter(cardView)
+ }
+ }
+ }
+}
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt
index 02d690d51e9..e9c48bc2083 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt
@@ -178,9 +178,11 @@ private fun AnnouncementItemContent(
}
}
-private fun calculateAlpha(progress: Float): Float = when {
- progress < 0.5f -> 1f // Fully opaque until halfway
- else -> 1f - (progress - 0.5f) * 2 // Fade out linearly from halfway to the end
+private fun calculateAlpha(progress: Float): Float {
+ return when {
+ progress < 0.5f -> 1f // Fully opaque until halfway
+ else -> 1f - (progress - 0.5f) * 2 // Fade out linearly from halfway to the end
+ }
}
@Composable
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/DraggablePreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/DraggablePreference.kt
index fef79b4cfbd..404b91a0be4 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/components/DraggablePreference.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/components/DraggablePreference.kt
@@ -41,6 +41,7 @@ import app.lawnchair.ui.preferences.components.layout.ExpandAndShrink
import app.lawnchair.ui.preferences.components.layout.PreferenceGroup
import app.lawnchair.ui.preferences.components.layout.PreferenceGroupHeading
import app.lawnchair.ui.preferences.components.layout.PreferenceTemplate
+import app.lawnchair.ui.util.addIf
import com.android.launcher3.R
import com.android.launcher3.Utilities
import sh.calvin.reorderable.ReorderableColumn
@@ -53,7 +54,12 @@ fun DraggablePreferenceGroup(
defaultList: List,
onOrderChange: (List) -> Unit,
modifier: Modifier = Modifier,
- itemContent: @Composable ReorderableScope.(item: T, index: Int, isDragging: Boolean, onDraggingChange: (Boolean) -> Unit) -> Unit,
+ itemContent: @Composable ReorderableScope.(
+ item: T,
+ index: Int,
+ isDragging: Boolean,
+ onDraggingChange: (Boolean) -> Unit,
+ ) -> Unit,
) {
var localItems = items
var isAnyDragging by remember { mutableStateOf(false) }
@@ -95,17 +101,20 @@ fun DraggablePreferenceGroup(
key(item) {
Column {
DraggablePreferenceContainer(
- index = index,
- items = localItems,
isDragging = isDragging,
- onMoveUp = {
- localItems = it
- },
- onMoveDown = {
- localItems = it
- },
+ modifier = Modifier
+ .a11yDrag(
+ index = index,
+ items = items,
+ onMoveUp = { localItems = it },
+ onMoveDown = { localItems = it },
+ ),
) {
- itemContent(item, index, isDragging) {
+ itemContent(
+ item,
+ index,
+ isDragging,
+ ) {
isAnyDragging = it
}
}
@@ -128,12 +137,8 @@ fun DraggablePreferenceGroup(
}
@Composable
-fun DraggablePreferenceContainer(
- index: Int,
- items: List,
+fun DraggablePreferenceContainer(
isDragging: Boolean,
- onMoveUp: (List) -> Unit,
- onMoveDown: (List) -> Unit,
modifier: Modifier = Modifier,
content: @Composable () -> Unit,
) {
@@ -152,13 +157,7 @@ fun DraggablePreferenceContainer(
Color.Transparent,
)
},
- modifier = modifier
- .a11yDrag(
- index = index,
- items = items,
- onMoveUp = onMoveUp,
- onMoveDown = onMoveDown,
- ),
+ modifier = modifier,
) {
content()
}
@@ -213,25 +212,29 @@ fun DragHandle(
scope: ReorderableScope,
interactionSource: MutableInteractionSource,
modifier: Modifier = Modifier,
+ isDraggable: Boolean = true,
onDragStop: () -> Unit = {},
) {
val view = LocalView.current
IconButton(
modifier = with(scope) {
- modifier.longPressDraggableHandle(
- onDragStarted = {
- if (Utilities.ATLEAST_U) {
- view.performHapticFeedback(HapticFeedbackConstants.DRAG_START)
- }
- },
- onDragStopped = {
- if (Utilities.ATLEAST_R) {
- view.performHapticFeedback(HapticFeedbackConstants.GESTURE_END)
- }
- onDragStop()
- },
- )
+ modifier.addIf(isDraggable) {
+ longPressDraggableHandle(
+ onDragStarted = {
+ if (Utilities.ATLEAST_U) {
+ view.performHapticFeedback(HapticFeedbackConstants.DRAG_START)
+ }
+ },
+ onDragStopped = {
+ if (Utilities.ATLEAST_R) {
+ view.performHapticFeedback(HapticFeedbackConstants.GESTURE_END)
+ }
+ onDragStop()
+ },
+ )
+ }
},
+ enabled = isDraggable,
onClick = {},
interactionSource = interactionSource,
) {
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/LauncherPreview.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/LauncherPreview.kt
index 3a0369a71ee..58294f0d743 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/components/LauncherPreview.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/components/LauncherPreview.kt
@@ -90,25 +90,29 @@ fun createPreviewView(idp: InvariantDeviceProfile = invariantDeviceProfile()): V
return remember(idp) { previewManager.createPreviewView(idp) }
}
-fun Modifier.clipToPercentage(percentage: Float): Modifier = this.then(
- Modifier.layout { measurable, constraints ->
- val placeable = measurable.measure(constraints)
- val height = (placeable.height * percentage).toInt()
- layout(placeable.width, height) {
- placeable.place(0, 0)
- }
- },
-)
+fun Modifier.clipToPercentage(percentage: Float): Modifier {
+ return this.then(
+ Modifier.layout { measurable, constraints ->
+ val placeable = measurable.measure(constraints)
+ val height = (placeable.height * percentage).toInt()
+ layout(placeable.width, height) {
+ placeable.place(0, 0)
+ }
+ },
+ )
+}
-fun Modifier.clipToVisiblePercentage(percentage: Float): Modifier = this.then(
- Modifier.layout { measurable, constraints ->
- val placeable = measurable.measure(constraints)
- val totalHeight = placeable.height
- val visibleHeight = (totalHeight * percentage).toInt()
- val offsetY = totalHeight - visibleHeight
+fun Modifier.clipToVisiblePercentage(percentage: Float): Modifier {
+ return this.then(
+ Modifier.layout { measurable, constraints ->
+ val placeable = measurable.measure(constraints)
+ val totalHeight = placeable.height
+ val visibleHeight = (totalHeight * percentage).toInt()
+ val offsetY = totalHeight - visibleHeight
- layout(placeable.width, visibleHeight) {
- placeable.place(0, -offsetY)
- }
- },
-)
+ layout(placeable.width, visibleHeight) {
+ placeable.place(0, -offsetY)
+ }
+ },
+ )
+}
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/DividerColumn.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/DividerColumn.kt
index f437435e56f..d6b915a9756 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/DividerColumn.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/DividerColumn.kt
@@ -78,13 +78,15 @@ private fun Modifier.drawDividers(
thickness: Float,
startIndentPx: Float,
endIndentPx: Float,
-): Modifier = drawBehind {
- state.dividerPositions.forEach { yPos ->
- drawRect(
- color = color,
- topLeft = Offset(startIndentPx, yPos.toFloat()),
- size = Size(size.width - startIndentPx - endIndentPx, thickness),
- )
+): Modifier {
+ return drawBehind {
+ state.dividerPositions.forEach { yPos ->
+ drawRect(
+ color = color,
+ topLeft = Offset(startIndentPx, yPos.toFloat()),
+ size = Size(size.width - startIndentPx - endIndentPx, thickness),
+ )
+ }
}
}
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/FontSelectionPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/FontSelectionPreference.kt
index 87d7eccdb34..70dfc48bf42 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/FontSelectionPreference.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/FontSelectionPreference.kt
@@ -269,7 +269,9 @@ private val VariantButtonContentPadding = PaddingValues(
private fun removeFamilyPrefix(
familyName: CharSequence,
fontName: CharSequence,
-): String = fontName.removePrefix(familyName).trim().toString()
+): String {
+ return fontName.removePrefix(familyName).trim().toString()
+}
@Composable
private fun VariantDropdown(
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/LauncherPopupPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/LauncherPopupPreference.kt
index 853d896936a..a53cbe881f8 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/LauncherPopupPreference.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/LauncherPopupPreference.kt
@@ -1,7 +1,9 @@
package app.lawnchair.ui.preferences.destinations
import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.foundation.background
import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
@@ -90,7 +92,7 @@ fun LauncherPopupPreference(
optionsPref.onChange(it.toOptionOrderString())
},
) { item, index, _, onDraggingChange ->
- val label = LauncherOptionsPopup.getMetadataForOption(item.identifier).label
+ val metadata = LauncherOptionsPopup.getMetadataForOption(item.identifier)
val enabled = when (item.identifier) {
"edit_mode", "widgets" -> (!isHomeScreenLocked)
@@ -101,7 +103,7 @@ fun LauncherPopupPreference(
val interactionSource = remember { MutableInteractionSource() }
DraggableSwitchPreference(
- label = stringResource(label),
+ label = stringResource(metadata.label),
description = if (!enabled && item.identifier != "home_settings") stringResource(R.string.home_screen_locked) else null,
checked = item.isEnabled,
onCheckedChange = {
@@ -111,7 +113,8 @@ fun LauncherPopupPreference(
dragIndicator = {
DragHandle(
scope = this,
- interactionSource = interactionSource,
+ interactionSource = if (!metadata.isCarousel) interactionSource else remember { MutableInteractionSource() },
+ isDraggable = !metadata.isCarousel,
onDragStop = {
onDraggingChange(false)
},
@@ -175,10 +178,14 @@ private fun LauncherPopupPreview(optionsList: List) {
modifier = Modifier
.widthIn(max = 240.dp),
) {
- OptionsItemRow(
- icon = painterResource(metadata.icon),
- label = stringResource(metadata.label),
- )
+ if (metadata.isCarousel) {
+ WallpaperCarouselPreview()
+ } else {
+ OptionsItemRow(
+ icon = painterResource(metadata.icon),
+ label = stringResource(metadata.label),
+ )
+ }
}
}
if (!isLast && enabledItems.indexOf(it) != -1) {
@@ -190,6 +197,42 @@ private fun LauncherPopupPreview(optionsList: List) {
}
}
+@Composable
+private fun WallpaperCarouselPreview(modifier: Modifier = Modifier) {
+ val height = 100.dp
+ val width = 50.dp
+
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ modifier = modifier
+ .padding(16.dp)
+ .fillMaxWidth(),
+ ) {
+ Box(
+ Modifier
+ .clip(MaterialTheme.shapes.medium)
+ .background(MaterialTheme.colorScheme.surfaceVariant)
+ .size(height),
+ ) {}
+ Spacer(Modifier.width(8.dp))
+ Box(
+ Modifier
+ .clip(MaterialTheme.shapes.medium)
+ .background(MaterialTheme.colorScheme.surfaceVariant)
+ .height(height)
+ .width(width),
+ ) {}
+ Spacer(Modifier.width(8.dp))
+ Box(
+ Modifier
+ .clip(MaterialTheme.shapes.medium)
+ .background(MaterialTheme.colorScheme.surfaceVariant)
+ .height(height)
+ .width(width),
+ ) {}
+ }
+}
+
@Composable
private fun OptionsItemRow(
icon: Painter,
diff --git a/lawnchair/src/app/lawnchair/ui/theme/Color.kt b/lawnchair/src/app/lawnchair/ui/theme/Color.kt
index 2baa585c895..ca4e829b781 100644
--- a/lawnchair/src/app/lawnchair/ui/theme/Color.kt
+++ b/lawnchair/src/app/lawnchair/ui/theme/Color.kt
@@ -15,7 +15,9 @@ import com.android.launcher3.Utilities
import com.android.launcher3.util.Themes
@JvmOverloads
-fun Context.getAccentColor(darkTheme: Boolean = Themes.getAttrBoolean(this, R.attr.isMainColorDark)): Int = ColorTokens.ColorAccent.resolveColor(this, if (darkTheme) UiColorMode.Dark else UiColorMode.Light)
+fun Context.getAccentColor(darkTheme: Boolean = Themes.getAttrBoolean(this, R.attr.isMainColorDark)): Int {
+ return ColorTokens.ColorAccent.resolveColor(this, if (darkTheme) UiColorMode.Dark else UiColorMode.Light)
+}
@ColorInt
fun lightenColor(@ColorInt color: Int): Int {
diff --git a/lawnchair/src/app/lawnchair/ui/util/ViewPool.kt b/lawnchair/src/app/lawnchair/ui/util/ViewPool.kt
index 4f2e485d5d1..1e43d06bdd8 100644
--- a/lawnchair/src/app/lawnchair/ui/util/ViewPool.kt
+++ b/lawnchair/src/app/lawnchair/ui/util/ViewPool.kt
@@ -13,7 +13,9 @@ class ViewPool(
private val factory: (Context) -> T,
) : RecyclerView.RecycledViewPool() where T : View, T : ViewPool.Recyclable {
- private fun getOrCreateHolder(): RecyclerView.ViewHolder = getRecycledView(RecyclerView.INVALID_TYPE) ?: ViewHolder(factory(context))
+ private fun getOrCreateHolder(): RecyclerView.ViewHolder {
+ return getRecycledView(RecyclerView.INVALID_TYPE) ?: ViewHolder(factory(context))
+ }
@Composable
fun rememberView(): T {
diff --git a/lawnchair/src/app/lawnchair/util/FileExtensions.kt b/lawnchair/src/app/lawnchair/util/FileExtensions.kt
index d5154953aba..89dd48d4f65 100644
--- a/lawnchair/src/app/lawnchair/util/FileExtensions.kt
+++ b/lawnchair/src/app/lawnchair/util/FileExtensions.kt
@@ -12,14 +12,16 @@ internal fun Path.list(
fileSystem: FileSystem = FileSystem.SYSTEM,
isShowHidden: Boolean = false,
isRecursively: Boolean = false,
-): Sequence = runCatching {
- if (isRecursively) {
- fileSystem.listRecursively(this)
- } else {
- fileSystem.list(this).asSequence()
+): Sequence {
+ return runCatching {
+ if (isRecursively) {
+ fileSystem.listRecursively(this)
+ } else {
+ fileSystem.list(this).asSequence()
+ }
+ }.getOrDefault(emptySequence()).filter {
+ if (isShowHidden) true else !it.isHidden
}
-}.getOrDefault(emptySequence()).filter {
- if (isShowHidden) true else !it.isHidden
}
internal fun Path.getMetadata(fileSystem: FileSystem = FileSystem.SYSTEM): FileMetadata? = fileSystem.metadataOrNull(this)
diff --git a/lawnchair/src/app/lawnchair/util/FileUilts.kt b/lawnchair/src/app/lawnchair/util/FileUilts.kt
index a1820d8cc84..1aeceb63767 100644
--- a/lawnchair/src/app/lawnchair/util/FileUilts.kt
+++ b/lawnchair/src/app/lawnchair/util/FileUilts.kt
@@ -19,17 +19,19 @@ fun File.subscribeFiles() = callbackFlow> {
awaitClose { observer.stopWatching() }
}
-fun createFileObserver(file: File, events: Int, onEvent: (event: Int, path: String?) -> Unit): FileObserver = if (Utilities.ATLEAST_Q) {
- object : FileObserver(file, events) {
- override fun onEvent(event: Int, path: String?) {
- onEvent(event, path)
+fun createFileObserver(file: File, events: Int, onEvent: (event: Int, path: String?) -> Unit): FileObserver {
+ return if (Utilities.ATLEAST_Q) {
+ object : FileObserver(file, events) {
+ override fun onEvent(event: Int, path: String?) {
+ onEvent(event, path)
+ }
}
- }
-} else {
- @Suppress("DEPRECATION")
- object : FileObserver(file.path, events) {
- override fun onEvent(event: Int, path: String?) {
- onEvent(event, path)
+ } else {
+ @Suppress("DEPRECATION")
+ object : FileObserver(file.path, events) {
+ override fun onEvent(event: Int, path: String?) {
+ onEvent(event, path)
+ }
}
}
}
diff --git a/lawnchair/src/app/lawnchair/util/FlagUtils.kt b/lawnchair/src/app/lawnchair/util/FlagUtils.kt
index e0eca3e1ec0..7c3a3a9b171 100644
--- a/lawnchair/src/app/lawnchair/util/FlagUtils.kt
+++ b/lawnchair/src/app/lawnchair/util/FlagUtils.kt
@@ -1,15 +1,25 @@
package app.lawnchair.util
-fun Int.hasFlag(flag: Int): Boolean = (this and flag) == flag
+fun Int.hasFlag(flag: Int): Boolean {
+ return (this and flag) == flag
+}
-fun Int.addFlag(flag: Int): Int = this or flag
+fun Int.addFlag(flag: Int): Int {
+ return this or flag
+}
-fun Int.removeFlag(flag: Int): Int = this and flag.inv()
+fun Int.removeFlag(flag: Int): Int {
+ return this and flag.inv()
+}
-fun Int.toggleFlag(flag: Int): Int = if (hasFlag(flag)) removeFlag(flag) else addFlag(flag)
+fun Int.toggleFlag(flag: Int): Int {
+ return if (hasFlag(flag)) removeFlag(flag) else addFlag(flag)
+}
-fun Int.setFlag(flag: Int, value: Boolean): Int = if (value) {
- addFlag(flag)
-} else {
- removeFlag(flag)
+fun Int.setFlag(flag: Int, value: Boolean): Int {
+ return if (value) {
+ addFlag(flag)
+ } else {
+ removeFlag(flag)
+ }
}
diff --git a/lawnchair/src/app/lawnchair/util/LawnchairLockedStateController.kt b/lawnchair/src/app/lawnchair/util/LawnchairLockedStateController.kt
index c555fa352b2..f92024690f0 100644
--- a/lawnchair/src/app/lawnchair/util/LawnchairLockedStateController.kt
+++ b/lawnchair/src/app/lawnchair/util/LawnchairLockedStateController.kt
@@ -124,7 +124,9 @@ object LawnchairLockedStateController {
}
}
- fun getTaskLockState(taskIdentifier: String, userId: Int): Boolean = lockedListWithUserId.contains(appendUserWithBrace(taskIdentifier, userId.toString()))
+ fun getTaskLockState(taskIdentifier: String, userId: Int): Boolean {
+ return lockedListWithUserId.contains(appendUserWithBrace(taskIdentifier, userId.toString()))
+ }
// TODO Implement this, when the app is uninstalled
fun removeTaskLockState(taskIdentifier: String, userId: Int) {
@@ -145,13 +147,21 @@ object LawnchairLockedStateController {
}
}
- fun isTaskLocked(taskIdentifier: String): Boolean = lockedPackageNameListWithUserId.contains(taskIdentifier)
+ fun isTaskLocked(taskIdentifier: String): Boolean {
+ return lockedPackageNameListWithUserId.contains(taskIdentifier)
+ }
- private fun appendUserWithoutBrace(input: String, userId: String): String = input.replace("{", "") + "#$userId"
+ private fun appendUserWithoutBrace(input: String, userId: String): String {
+ return input.replace("{", "") + "#$userId"
+ }
- private fun appendUserWithBrace(input: String, userId: String): String = input.replace("}", "") + "#$userId}"
+ private fun appendUserWithBrace(input: String, userId: String): String {
+ return input.replace("}", "") + "#$userId}"
+ }
- private fun removeUserWithBrace(input: String): String = input.substring(0, input.lastIndexOf("#")) + "}"
+ private fun removeUserWithBrace(input: String): String {
+ return input.substring(0, input.lastIndexOf("#")) + "}"
+ }
private fun writeToProvider() {
val sb = StringBuilder()
diff --git a/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt b/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt
index f2a159d1ccd..42bf46f69c8 100644
--- a/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt
+++ b/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt
@@ -53,6 +53,7 @@ import com.android.launcher3.util.Executors.MAIN_EXECUTOR
import com.android.launcher3.util.Themes
import com.android.systemui.shared.system.QuickStepContract
import com.patrykmichalik.opto.core.firstBlocking
+import java.io.ByteArrayOutputStream
import java.util.concurrent.Callable
import java.util.concurrent.ExecutionException
import kotlin.math.max
@@ -110,10 +111,12 @@ fun killLauncher() {
exitProcess(0)
}
-fun getPrefsIfUnlocked(context: Context): PreferenceManager? = if (UserManagerCompat.isUserUnlocked(context)) {
- PreferenceManager.getInstance(context)
-} else {
- null
+fun getPrefsIfUnlocked(context: Context): PreferenceManager? {
+ return if (UserManagerCompat.isUserUnlocked(context)) {
+ PreferenceManager.getInstance(context)
+ } else {
+ null
+ }
}
fun getWindowCornerRadius(context: Context): Float {
@@ -252,6 +255,12 @@ fun Size.scaleDownTo(maxSize: Int): Size {
}
}
+fun bitmapToByteArray(bitmap: Bitmap): ByteArray {
+ val stream = ByteArrayOutputStream()
+ bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream)
+ return stream.toByteArray()
+}
+
fun Context.isDefaultLauncher(): Boolean = getDefaultLauncherPackageName() == packageName
fun Context.getDefaultLauncherPackageName(): String? = runCatching { getDefaultResolveInfo()?.activityInfo?.packageName }.getOrNull()
@@ -289,19 +298,21 @@ fun createRoundedBitmap(color: Int, cornerRadius: Float): Bitmap {
return bitmap
}
-fun getSignatureHash(context: Context, packageName: String): Long? = try {
- val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
- context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES)
- } else {
- context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
- }
+fun getSignatureHash(context: Context, packageName: String): Long? {
+ return try {
+ val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES)
+ } else {
+ context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
+ }
- val signatures = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
- packageInfo.signingInfo?.apkContentsSigners
- } else {
- packageInfo.signatures
+ val signatures = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ packageInfo.signingInfo?.apkContentsSigners
+ } else {
+ packageInfo.signatures
+ }
+ signatures?.firstOrNull()?.hashCode()?.toLong()
+ } catch (_: PackageManager.NameNotFoundException) {
+ null
}
- signatures?.firstOrNull()?.hashCode()?.toLong()
-} catch (_: PackageManager.NameNotFoundException) {
- null
}
diff --git a/lawnchair/src/app/lawnchair/util/LawnchairWindowManagerProxy.kt b/lawnchair/src/app/lawnchair/util/LawnchairWindowManagerProxy.kt
index d46319a8a96..c63afa9fb64 100644
--- a/lawnchair/src/app/lawnchair/util/LawnchairWindowManagerProxy.kt
+++ b/lawnchair/src/app/lawnchair/util/LawnchairWindowManagerProxy.kt
@@ -181,18 +181,20 @@ class LawnchairWindowManagerProxy(context: Context) : WindowManagerProxy(Utiliti
return 0
}
- override fun getDisplay(displayInfoContext: Context): Display? = try {
- if (Utilities.ATLEAST_R) {
- displayInfoContext.display
- } else {
+ override fun getDisplay(displayInfoContext: Context): Display? {
+ return try {
+ if (Utilities.ATLEAST_R) {
+ displayInfoContext.display
+ } else {
+ displayInfoContext.getSystemService(DisplayManager::class.java)?.getDisplay(
+ DEFAULT_DISPLAY,
+ )
+ }
+ } catch (e: UnsupportedOperationException) {
displayInfoContext.getSystemService(DisplayManager::class.java)?.getDisplay(
DEFAULT_DISPLAY,
)
}
- } catch (e: UnsupportedOperationException) {
- displayInfoContext.getSystemService(DisplayManager::class.java)?.getDisplay(
- DEFAULT_DISPLAY,
- )
}
override fun getRotation(context: Context): Int {
@@ -200,5 +202,7 @@ class LawnchairWindowManagerProxy(context: Context) : WindowManagerProxy(Utiliti
return display?.rotation ?: Surface.ROTATION_0
}
- private fun dpToPx(resources: Resources, dp: Int): Int = (dp * resources.displayMetrics.density).toInt()
+ private fun dpToPx(resources: Resources, dp: Int): Int {
+ return (dp * resources.displayMetrics.density).toInt()
+ }
}
diff --git a/lawnchair/src/app/lawnchair/util/Lifecycle.kt b/lawnchair/src/app/lawnchair/util/Lifecycle.kt
index beba77a159d..26892079868 100644
--- a/lawnchair/src/app/lawnchair/util/Lifecycle.kt
+++ b/lawnchair/src/app/lawnchair/util/Lifecycle.kt
@@ -45,8 +45,10 @@ private fun observeLifecycleState(): Lifecycle.State {
return state
}
-fun Context.lookupLifecycleOwner(): LifecycleOwner? = when (this) {
- is LifecycleOwner -> this
- is ContextWrapper -> baseContext.lookupLifecycleOwner()
- else -> null
+fun Context.lookupLifecycleOwner(): LifecycleOwner? {
+ return when (this) {
+ is LifecycleOwner -> this
+ is ContextWrapper -> baseContext.lookupLifecycleOwner()
+ else -> null
+ }
}
diff --git a/lawnchair/src/app/lawnchair/util/PackagePermissionManager.kt b/lawnchair/src/app/lawnchair/util/PackagePermissionManager.kt
index 7fc00788333..88b94d3530b 100644
--- a/lawnchair/src/app/lawnchair/util/PackagePermissionManager.kt
+++ b/lawnchair/src/app/lawnchair/util/PackagePermissionManager.kt
@@ -38,7 +38,9 @@ fun requestContactPermissionGranted(context: Context, prefs: PreferenceManager):
return isGranted
}
-fun contactPermissionGranted(context: Context): Boolean = context.checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED
+fun contactPermissionGranted(context: Context): Boolean {
+ return context.checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED
+}
fun checkAndRequestFilesPermission(context: Context, prefs: PreferenceManager): Boolean {
when {
@@ -71,11 +73,13 @@ fun checkAndRequestFilesPermission(context: Context, prefs: PreferenceManager):
return true
}
-fun filesAndStorageGranted(context: Context): Boolean = when {
- Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU ->
- Environment.isExternalStorageManager() && hasReadMediaImagesPermission(context)
- Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> Environment.isExternalStorageManager()
- else -> hasReadExternalStoragePermission(context)
+fun filesAndStorageGranted(context: Context): Boolean {
+ return when {
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU ->
+ Environment.isExternalStorageManager() && hasReadMediaImagesPermission(context)
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> Environment.isExternalStorageManager()
+ else -> hasReadExternalStoragePermission(context)
+ }
}
@RequiresApi(Build.VERSION_CODES.R)
@@ -85,10 +89,12 @@ private fun requestManageAllFilesAccessPermission(context: Context) {
context.startActivity(intent)
}
-private fun hasReadExternalStoragePermission(context: Context): Boolean = ContextCompat.checkSelfPermission(
- context,
- Manifest.permission.READ_EXTERNAL_STORAGE,
-) == PackageManager.PERMISSION_GRANTED
+private fun hasReadExternalStoragePermission(context: Context): Boolean {
+ return ContextCompat.checkSelfPermission(
+ context,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ ) == PackageManager.PERMISSION_GRANTED
+}
private fun requestReadExternalStoragePermission(context: Context) {
ActivityCompat.requestPermissions(
@@ -99,10 +105,12 @@ private fun requestReadExternalStoragePermission(context: Context) {
}
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
-private fun hasReadMediaImagesPermission(context: Context): Boolean = ContextCompat.checkSelfPermission(
- context,
- Manifest.permission.READ_MEDIA_IMAGES,
-) == PackageManager.PERMISSION_GRANTED
+private fun hasReadMediaImagesPermission(context: Context): Boolean {
+ return ContextCompat.checkSelfPermission(
+ context,
+ Manifest.permission.READ_MEDIA_IMAGES,
+ ) == PackageManager.PERMISSION_GRANTED
+}
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
private fun requestReadMediaImagesPermission(context: Context) {
diff --git a/lawnchair/src/app/lawnchair/util/Padding.kt b/lawnchair/src/app/lawnchair/util/Padding.kt
index f0477bd79a9..a81afd024ca 100644
--- a/lawnchair/src/app/lawnchair/util/Padding.kt
+++ b/lawnchair/src/app/lawnchair/util/Padding.kt
@@ -29,19 +29,27 @@ fun Modifier.navigationBarsOrDisplayCutoutPadding(): Modifier = composed {
@Composable
fun max(a: PaddingValues, b: PaddingValues) = remember(a, b) {
object : PaddingValues {
- override fun calculateLeftPadding(layoutDirection: LayoutDirection): Dp = max(
- a.calculateLeftPadding(layoutDirection),
- b.calculateLeftPadding(layoutDirection),
- )
+ override fun calculateLeftPadding(layoutDirection: LayoutDirection): Dp {
+ return max(
+ a.calculateLeftPadding(layoutDirection),
+ b.calculateLeftPadding(layoutDirection),
+ )
+ }
- override fun calculateTopPadding(): Dp = max(a.calculateTopPadding(), b.calculateTopPadding())
+ override fun calculateTopPadding(): Dp {
+ return max(a.calculateTopPadding(), b.calculateTopPadding())
+ }
- override fun calculateRightPadding(layoutDirection: LayoutDirection): Dp = max(
- a.calculateRightPadding(layoutDirection),
- b.calculateRightPadding(layoutDirection),
- )
+ override fun calculateRightPadding(layoutDirection: LayoutDirection): Dp {
+ return max(
+ a.calculateRightPadding(layoutDirection),
+ b.calculateRightPadding(layoutDirection),
+ )
+ }
- override fun calculateBottomPadding(): Dp = max(a.calculateBottomPadding(), b.calculateBottomPadding())
+ override fun calculateBottomPadding(): Dp {
+ return max(a.calculateBottomPadding(), b.calculateBottomPadding())
+ }
}
}
diff --git a/lawnchair/src/app/lawnchair/util/Serializers.kt b/lawnchair/src/app/lawnchair/util/Serializers.kt
index 26a87de6b2f..1113fa10664 100644
--- a/lawnchair/src/app/lawnchair/util/Serializers.kt
+++ b/lawnchair/src/app/lawnchair/util/Serializers.kt
@@ -18,7 +18,9 @@ import kotlinx.serialization.encoding.Encoder
object ComponentKeySerializer : KSerializer {
override val descriptor = PrimitiveSerialDescriptor("ComponentKey", PrimitiveKind.STRING)
- override fun deserialize(decoder: Decoder): ComponentKey = ComponentKey.fromString(decoder.decodeString())!!
+ override fun deserialize(decoder: Decoder): ComponentKey {
+ return ComponentKey.fromString(decoder.decodeString())!!
+ }
override fun serialize(encoder: Encoder, value: ComponentKey) {
encoder.encodeString(value.toString())
@@ -29,16 +31,24 @@ object ComponentKeySerializer : KSerializer {
object IntentSerializer : KSerializer {
override val descriptor = PrimitiveSerialDescriptor("Intent", PrimitiveKind.STRING)
- override fun deserialize(decoder: Decoder): Intent = Intent.parseUri(decoder.decodeString(), 0)
+ override fun deserialize(decoder: Decoder): Intent {
+ return Intent.parseUri(decoder.decodeString(), 0)
+ }
- override fun serialize(encoder: Encoder, value: Intent) = encoder.encodeString(value.toUri(0))
+ override fun serialize(encoder: Encoder, value: Intent) {
+ return encoder.encodeString(value.toUri(0))
+ }
}
@Serializer(forClass = UserHandle::class)
object UserHandlerSerializer : KSerializer {
override val descriptor = PrimitiveSerialDescriptor("UserHandle", PrimitiveKind.INT)
- override fun deserialize(decoder: Decoder): UserHandle = UserHandleCompat.getUserHandleForUid(decoder.decodeInt())
+ override fun deserialize(decoder: Decoder): UserHandle {
+ return UserHandleCompat.getUserHandleForUid(decoder.decodeInt())
+ }
- override fun serialize(encoder: Encoder, value: UserHandle) = encoder.encodeInt(value.hashCode())
+ override fun serialize(encoder: Encoder, value: UserHandle) {
+ return encoder.encodeInt(value.hashCode())
+ }
}
diff --git a/lawnchair/src/app/lawnchair/util/TaskUtilLockState.kt b/lawnchair/src/app/lawnchair/util/TaskUtilLockState.kt
index 25ee633b558..0e82aaa7944 100644
--- a/lawnchair/src/app/lawnchair/util/TaskUtilLockState.kt
+++ b/lawnchair/src/app/lawnchair/util/TaskUtilLockState.kt
@@ -27,7 +27,9 @@ object TaskUtilLockState {
}
}
- private fun toFormatLockedAppStr(packageName: String, userId: Int): String = "$packageName$SEPARATOR$userId"
+ private fun toFormatLockedAppStr(packageName: String, userId: Int): String {
+ return "$packageName$SEPARATOR$userId"
+ }
private fun saveLockedApps(lockedApps: List?) {
lockedApps?.let {
@@ -56,7 +58,9 @@ object TaskUtilLockState {
}
}
- fun getTaskLockState(context: Context, componentName: ComponentName, taskKey: Task.TaskKey): Boolean = updateSpecifiedTaskLockState(context, componentName, taskKey)
+ fun getTaskLockState(context: Context, componentName: ComponentName, taskKey: Task.TaskKey): Boolean {
+ return updateSpecifiedTaskLockState(context, componentName, taskKey)
+ }
private fun updateSpecifiedTaskLockState(context: Context, componentName: ComponentName, taskKey: Task.TaskKey): Boolean {
val taskLockState = LawnchairLockedStateController.initialize(context)
diff --git a/lawnchair/src/app/lawnchair/util/Temperature.kt b/lawnchair/src/app/lawnchair/util/Temperature.kt
index 48b4b0d0917..7c3609bce07 100644
--- a/lawnchair/src/app/lawnchair/util/Temperature.kt
+++ b/lawnchair/src/app/lawnchair/util/Temperature.kt
@@ -28,27 +28,31 @@ class Temperature(val value: Int, val unit: Unit) {
// TODO: Use Unit directly after https://github.com/pinterest/ktlint/issues/2353 is fixed.
@Suppress("RemoveRedundantQualifierName")
- fun unitFromString(unit: String): Temperature.Unit = when (unit) {
- "metric" -> Unit.Celsius
- "imperial" -> Unit.Fahrenheit
- "kelvin" -> Unit.Kelvin
- "rakine" -> Unit.Rakine
- "delisle" -> Unit.Delisle
- "newton" -> Unit.Newton
- "reaumur" -> Unit.Reaumur
- "romer" -> Unit.Romer
- else -> throw IllegalArgumentException("unknown unit $unit")
+ fun unitFromString(unit: String): Temperature.Unit {
+ return when (unit) {
+ "metric" -> Unit.Celsius
+ "imperial" -> Unit.Fahrenheit
+ "kelvin" -> Unit.Kelvin
+ "rakine" -> Unit.Rakine
+ "delisle" -> Unit.Delisle
+ "newton" -> Unit.Newton
+ "reaumur" -> Unit.Reaumur
+ "romer" -> Unit.Romer
+ else -> throw IllegalArgumentException("unknown unit $unit")
+ }
}
- fun unitToString(unit: Unit): String = when (unit) {
- Unit.Celsius -> "metric"
- Unit.Fahrenheit -> "imperial"
- Unit.Kelvin -> "kelvin"
- Unit.Rakine -> "rakine"
- Unit.Delisle -> "delisle"
- Unit.Newton -> "newton"
- Unit.Reaumur -> "reaumur"
- Unit.Romer -> "romer"
+ fun unitToString(unit: Unit): String {
+ return when (unit) {
+ Unit.Celsius -> "metric"
+ Unit.Fahrenheit -> "imperial"
+ Unit.Kelvin -> "kelvin"
+ Unit.Rakine -> "rakine"
+ Unit.Delisle -> "delisle"
+ Unit.Newton -> "newton"
+ Unit.Reaumur -> "reaumur"
+ Unit.Romer -> "romer"
+ }
}
}
}
diff --git a/lawnchair/src/app/lawnchair/views/ComposeBottomSheet.kt b/lawnchair/src/app/lawnchair/views/ComposeBottomSheet.kt
index 51b8e2bd395..d12ba71f47d 100644
--- a/lawnchair/src/app/lawnchair/views/ComposeBottomSheet.kt
+++ b/lawnchair/src/app/lawnchair/views/ComposeBottomSheet.kt
@@ -109,9 +109,13 @@ class ComposeBottomSheet(context: Context) : AbstractSlideInView(context,
setSystemUiFlags(0)
}
- override fun isOfType(type: Int): Boolean = type and TYPE_COMPOSE_VIEW != 0
+ override fun isOfType(type: Int): Boolean {
+ return type and TYPE_COMPOSE_VIEW != 0
+ }
- override fun getScrimColor(context: Context): Int = ColorTokens.WidgetsPickerScrim.resolveColor(context)
+ override fun getScrimColor(context: Context): Int {
+ return ColorTokens.WidgetsPickerScrim.resolveColor(context)
+ }
override fun setTranslationShift(translationShift: Float) {
mTranslationShift = translationShift
diff --git a/lawnchair/src/app/lawnchair/views/component/IconFrame.kt b/lawnchair/src/app/lawnchair/views/component/IconFrame.kt
new file mode 100644
index 00000000000..e95ffc2a570
--- /dev/null
+++ b/lawnchair/src/app/lawnchair/views/component/IconFrame.kt
@@ -0,0 +1,73 @@
+package app.lawnchair.views.component
+
+import android.content.Context
+import android.graphics.drawable.GradientDrawable
+import android.util.AttributeSet
+import android.widget.FrameLayout
+import android.widget.ImageView
+import androidx.annotation.DrawableRes
+import androidx.core.content.ContextCompat
+import com.android.launcher3.R
+import com.android.launcher3.util.Themes
+
+class IconFrame @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0,
+) : FrameLayout(context, attrs, defStyleAttr) {
+
+ private val imageView: ImageView
+
+ init {
+ layoutParams = LayoutParams(
+ LayoutParams.WRAP_CONTENT,
+ LayoutParams.WRAP_CONTENT,
+ )
+
+ imageView = ImageView(context).apply {
+ layoutParams = LayoutParams(
+ LayoutParams.WRAP_CONTENT,
+ LayoutParams.WRAP_CONTENT,
+ )
+ setPadding(12.dpToPx(context), 12.dpToPx(context), 12.dpToPx(context), 12.dpToPx(context))
+ }
+ addView(imageView)
+
+ setBackgroundWithRadius(
+ bgColor = ContextCompat.getColor(context, R.color.accent_primary_device_default),
+ cornerRadius = Themes.getDialogCornerRadius(context),
+ )
+ }
+
+ /**
+ * Convert dp to pixels for consistent padding across devices.
+ */
+ private fun Int.dpToPx(context: Context): Int {
+ val density = context.resources.displayMetrics.density
+ return (this * density).toInt()
+ }
+
+ /**
+ * Set the vector drawable for the ImageView.
+ *
+ * @param drawableRes The resource ID of the vector drawable.
+ */
+ fun setIcon(@DrawableRes drawableRes: Int) {
+ imageView.setImageResource(drawableRes)
+ }
+
+ /**
+ * Set the background color and corner radius of the FrameLayout.
+ *
+ * @param bgColor The background color.
+ * @param cornerRadius The corner radius in pixels.
+ */
+ fun setBackgroundWithRadius(bgColor: Int, cornerRadius: Float) {
+ val backgroundDrawable = GradientDrawable().apply {
+ shape = GradientDrawable.RECTANGLE
+ setColor(bgColor)
+ this.cornerRadius = cornerRadius
+ }
+ background = backgroundDrawable
+ }
+}
diff --git a/lawnchair/src/app/lawnchair/wallpaper/WallpaperManagerCompat.kt b/lawnchair/src/app/lawnchair/wallpaper/WallpaperManagerCompat.kt
index 2aa6ac266ef..79a84cfaccb 100644
--- a/lawnchair/src/app/lawnchair/wallpaper/WallpaperManagerCompat.kt
+++ b/lawnchair/src/app/lawnchair/wallpaper/WallpaperManagerCompat.kt
@@ -5,13 +5,18 @@ import android.content.Context
import app.lawnchair.util.MainThreadInitializedObject
import app.lawnchair.util.requireSystemService
import app.lawnchair.wallpaper.WallpaperColorsCompat.Companion.HINT_SUPPORTS_DARK_THEME
+import app.lawnchair.wallpaper.service.WallpaperService
import com.android.launcher3.Utilities
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
sealed class WallpaperManagerCompat(val context: Context) {
private val listeners = mutableListOf()
private val colorHints: Int get() = wallpaperColors?.colorHints ?: 0
- protected val wallpaperManager: WallpaperManager = context.requireSystemService()
+ val wallpaperManager: WallpaperManager = context.requireSystemService()
+ val service = WallpaperService(context)
abstract val wallpaperColors: WallpaperColorsCompat?
@@ -26,6 +31,12 @@ sealed class WallpaperManagerCompat(val context: Context) {
}
protected fun notifyChange() {
+ if (service.getTopWallpapers().isEmpty()) {
+ CoroutineScope(Dispatchers.IO).launch {
+ service.saveWallpaper(wallpaperManager)
+ }
+ }
+
listeners.toTypedArray().forEach {
it.onColorsChanged()
}
diff --git a/lawnchair/src/app/lawnchair/wallpaper/model/WallpaperViewModel.kt b/lawnchair/src/app/lawnchair/wallpaper/model/WallpaperViewModel.kt
new file mode 100644
index 00000000000..cc0b1053a33
--- /dev/null
+++ b/lawnchair/src/app/lawnchair/wallpaper/model/WallpaperViewModel.kt
@@ -0,0 +1,60 @@
+package app.lawnchair.wallpaper.model
+
+import android.app.WallpaperManager
+import android.content.Context
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import app.lawnchair.wallpaper.WallpaperManagerCompat
+import app.lawnchair.wallpaper.service.Wallpaper
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.sync.Mutex
+import kotlinx.coroutines.sync.withLock
+
+class WallpaperViewModel(context: Context) : ViewModel() {
+ private val wallpaperManagerCompat = WallpaperManagerCompat.INSTANCE.get(context)
+
+ private val _wallpapers = MutableLiveData>()
+ val wallpapers: LiveData> = _wallpapers
+
+ private val mutex = Mutex()
+
+ private val listener = object : WallpaperManagerCompat.OnColorsChangedListener {
+ override fun onColorsChanged() {
+ viewModelScope.launch {
+ mutex.withLock {
+ saveWallpaper(wallpaperManagerCompat.wallpaperManager)
+ }
+ }
+ }
+ }
+
+ init {
+ loadTopWallpapers()
+ wallpaperManagerCompat.addOnChangeListener(listener)
+ }
+
+ private suspend fun saveWallpaper(wallpaperManager: WallpaperManager) {
+ wallpaperManagerCompat.service.saveWallpaper(wallpaperManager)
+ refreshWallpapers()
+ }
+
+ private suspend fun refreshWallpapers() {
+ val topWallpapers = wallpaperManagerCompat.service.dao.getTopWallpapers()
+ _wallpapers.postValue(topWallpapers)
+ }
+
+ private fun loadTopWallpapers() {
+ viewModelScope.launch {
+ mutex.withLock {
+ refreshWallpapers()
+ }
+ }
+ }
+
+ suspend fun updateWallpaperRank(wallpaper: Wallpaper) {
+ wallpaperManagerCompat.service.updateWallpaperRank(wallpaper)
+ loadTopWallpapers()
+ }
+}
diff --git a/lawnchair/src/app/lawnchair/wallpaper/model/WallpaperViewModelFactory.kt b/lawnchair/src/app/lawnchair/wallpaper/model/WallpaperViewModelFactory.kt
new file mode 100644
index 00000000000..805eae11189
--- /dev/null
+++ b/lawnchair/src/app/lawnchair/wallpaper/model/WallpaperViewModelFactory.kt
@@ -0,0 +1,15 @@
+package app.lawnchair.wallpaper.model
+
+import android.content.Context
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+
+class WallpaperViewModelFactory(private val context: Context) : ViewModelProvider.Factory {
+ override fun create(modelClass: Class): T {
+ if (modelClass.isAssignableFrom(WallpaperViewModel::class.java)) {
+ @Suppress("UNCHECKED_CAST")
+ return WallpaperViewModel(context) as T
+ }
+ throw IllegalArgumentException("Unknown ViewModel class")
+ }
+}
diff --git a/lawnchair/src/app/lawnchair/wallpaper/service/Wallpaper.kt b/lawnchair/src/app/lawnchair/wallpaper/service/Wallpaper.kt
new file mode 100644
index 00000000000..df8aa46b2b9
--- /dev/null
+++ b/lawnchair/src/app/lawnchair/wallpaper/service/Wallpaper.kt
@@ -0,0 +1,13 @@
+package app.lawnchair.wallpaper.service
+
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity(tableName = "wallpapers")
+data class Wallpaper(
+ @PrimaryKey(autoGenerate = true) val id: Long = 0,
+ val imagePath: String,
+ val rank: Int,
+ val timestamp: Long,
+ val checksum: String? = null,
+)
diff --git a/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperDao.kt b/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperDao.kt
new file mode 100644
index 00000000000..56c3a66df1c
--- /dev/null
+++ b/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperDao.kt
@@ -0,0 +1,28 @@
+package app.lawnchair.wallpaper.service
+
+import androidx.room.Dao
+import androidx.room.Insert
+import androidx.room.Query
+import androidx.room.RawQuery
+import androidx.sqlite.db.SupportSQLiteQuery
+
+@Dao
+interface WallpaperDao {
+ @Insert
+ suspend fun insert(wallpaper: Wallpaper)
+
+ @Query("SELECT * FROM wallpapers ORDER BY timestamp DESC LIMIT 4")
+ suspend fun getTopWallpapers(): List
+
+ @Query("UPDATE wallpapers SET rank = rank + 1 WHERE rank >= :rank")
+ suspend fun updateRank(rank: Int)
+
+ @Query("UPDATE wallpapers SET rank = :rank, timestamp = :timestamp WHERE id = :id")
+ suspend fun updateWallpaper(id: Long, rank: Int, timestamp: Long)
+
+ @Query("DELETE FROM wallpapers WHERE id = :id")
+ suspend fun deleteWallpaper(id: Long)
+
+ @RawQuery
+ suspend fun checkpoint(supportSQLiteQuery: SupportSQLiteQuery): Int
+}
diff --git a/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperDatabase.kt b/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperDatabase.kt
new file mode 100644
index 00000000000..af7bf1cb8bf
--- /dev/null
+++ b/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperDatabase.kt
@@ -0,0 +1,41 @@
+package app.lawnchair.wallpaper.service
+
+import androidx.room.Database
+import androidx.room.Room
+import androidx.room.RoomDatabase
+import androidx.room.migration.Migration
+import androidx.sqlite.db.SimpleSQLiteQuery
+import androidx.sqlite.db.SupportSQLiteDatabase
+import app.lawnchair.util.MainThreadInitializedObject
+import kotlinx.coroutines.runBlocking
+
+@Database(entities = [Wallpaper::class], version = 2, exportSchema = false)
+abstract class WallpaperDatabase : RoomDatabase() {
+
+ abstract fun wallpaperDao(): WallpaperDao
+
+ private suspend fun checkpoint() {
+ wallpaperDao().checkpoint(SimpleSQLiteQuery("pragma wal_checkpoint(full)"))
+ }
+
+ fun checkpointSync() {
+ runBlocking {
+ checkpoint()
+ }
+ }
+
+ companion object {
+ private val MIGRATION_1_2 = object : Migration(1, 2) {
+ override fun migrate(db: SupportSQLiteDatabase) {
+ db.execSQL("ALTER TABLE wallpapers ADD COLUMN checksum TEXT DEFAULT 'undefined'")
+ }
+ }
+ val INSTANCE = MainThreadInitializedObject { context ->
+ Room.databaseBuilder(
+ context,
+ WallpaperDatabase::class.java,
+ "wallpaper_database",
+ ).addMigrations(MIGRATION_1_2).build()
+ }
+ }
+}
diff --git a/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperService.kt b/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperService.kt
new file mode 100644
index 00000000000..5b0fb77c11c
--- /dev/null
+++ b/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperService.kt
@@ -0,0 +1,123 @@
+package app.lawnchair.wallpaper.service
+
+import android.app.WallpaperManager
+import android.content.Context
+import android.graphics.drawable.BitmapDrawable
+import android.util.Log
+import androidx.core.graphics.drawable.toBitmap
+import app.lawnchair.util.bitmapToByteArray
+import com.android.launcher3.util.MainThreadInitializedObject
+import com.android.launcher3.util.SafeCloseable
+import java.io.File
+import java.io.FileOutputStream
+import java.security.MessageDigest
+import kotlinx.coroutines.runBlocking
+
+class WallpaperService(val context: Context) : SafeCloseable {
+
+ val dao = WallpaperDatabase.INSTANCE.get(context).wallpaperDao()
+
+ suspend fun saveWallpaper(wallpaperManager: WallpaperManager) {
+ try {
+ val wallpaperDrawable = wallpaperManager.drawable
+ val currentBitmap = (wallpaperDrawable as BitmapDrawable).toBitmap()
+
+ val byteArray = bitmapToByteArray(currentBitmap)
+
+ saveWallpaper(byteArray)
+ } catch (e: Exception) {
+ Log.e("WallpaperChange", "Error detecting wallpaper change: ${e.message}")
+ }
+ }
+
+ private fun calculateChecksum(imageData: ByteArray): String {
+ return MessageDigest.getInstance("MD5")
+ .digest(imageData)
+ .joinToString("") { "%02x".format(it) }
+ }
+
+ private suspend fun saveWallpaper(imageData: ByteArray) {
+ val timestamp = System.currentTimeMillis()
+
+ val checksum = calculateChecksum(imageData)
+
+ val existingWallpapers = dao.getTopWallpapers()
+
+ if (existingWallpapers.any { it.checksum == checksum }) {
+ Log.d("WallpaperService", "Wallpaper already exists with checksum: $checksum")
+ return
+ }
+ val imagePath = saveImageToAppStorage(imageData)
+ if (existingWallpapers.size < 4) {
+ val wallpaper = Wallpaper(imagePath = imagePath, rank = existingWallpapers.size, timestamp = timestamp, checksum = checksum)
+ dao.insert(wallpaper)
+ } else {
+ val lowestRankedWallpaper = existingWallpapers.minByOrNull { it.timestamp }
+
+ if (lowestRankedWallpaper != null) {
+ dao.deleteWallpaper(lowestRankedWallpaper.id)
+ deleteWallpaperFile(lowestRankedWallpaper.imagePath)
+ }
+
+ for (wallpaper in existingWallpapers) {
+ if (wallpaper.rank >= (lowestRankedWallpaper?.rank ?: 0)) {
+ dao.updateRank(wallpaper.rank)
+ }
+ }
+
+ val wallpaper = Wallpaper(imagePath = imagePath, rank = 0, timestamp = timestamp, checksum = checksum)
+ dao.insert(wallpaper)
+ }
+ }
+
+ suspend fun updateWallpaperRank(selectedWallpaper: Wallpaper) {
+ val topWallpapers = dao.getTopWallpapers()
+ val currentTime = System.currentTimeMillis()
+
+ dao.updateWallpaper(selectedWallpaper.id, rank = 0, timestamp = currentTime)
+
+ for (wallpaper in topWallpapers) {
+ if (wallpaper.id != selectedWallpaper.id) {
+ dao.updateRank(wallpaper.rank)
+ }
+ }
+ }
+
+ fun getTopWallpapers(): List = runBlocking {
+ val wallpapers = dao.getTopWallpapers()
+ wallpapers.ifEmpty { emptyList() }
+ }
+
+ private fun deleteWallpaperFile(imagePath: String) {
+ val file = File(imagePath)
+ if (file.exists()) {
+ file.delete()
+ }
+ }
+
+ private fun saveImageToAppStorage(imageData: ByteArray): String {
+ val storageDir = File(context.filesDir, "wallpapers")
+ if (!storageDir.exists()) {
+ storageDir.mkdirs()
+ }
+
+ val imageHash = imageData.hashCode().toString()
+ val imageFile = File(storageDir, "wallpaper_$imageHash.jpg")
+
+ if (!imageFile.exists()) {
+ FileOutputStream(imageFile).use { fos ->
+ fos.write(imageData)
+ }
+ }
+
+ return imageFile.absolutePath
+ }
+
+ override fun close() {
+ TODO("Not yet implemented")
+ }
+ companion object {
+ @JvmField
+ val INSTANCE = MainThreadInitializedObject(::WallpaperService)
+ }
+}
diff --git a/lawnchair/src/com/android/systemui/monet/ColorScheme.kt b/lawnchair/src/com/android/systemui/monet/ColorScheme.kt
index 72f8eab2056..14847295064 100644
--- a/lawnchair/src/com/android/systemui/monet/ColorScheme.kt
+++ b/lawnchair/src/com/android/systemui/monet/ColorScheme.kt
@@ -60,15 +60,21 @@ internal interface Hue {
}
internal class HueSource : Hue {
- override fun get(sourceColor: Cam): Double = sourceColor.hue.toDouble()
+ override fun get(sourceColor: Cam): Double {
+ return sourceColor.hue.toDouble()
+ }
}
internal class HueAdd(val amountDegrees: Double) : Hue {
- override fun get(sourceColor: Cam): Double = ColorScheme.wrapDegreesDouble(sourceColor.hue.toDouble() + amountDegrees)
+ override fun get(sourceColor: Cam): Double {
+ return ColorScheme.wrapDegreesDouble(sourceColor.hue.toDouble() + amountDegrees)
+ }
}
internal class HueSubtract(val amountDegrees: Double) : Hue {
- override fun get(sourceColor: Cam): Double = ColorScheme.wrapDegreesDouble(sourceColor.hue.toDouble() - amountDegrees)
+ override fun get(sourceColor: Cam): Double {
+ return ColorScheme.wrapDegreesDouble(sourceColor.hue.toDouble() - amountDegrees)
+ }
}
internal class HueVibrantSecondary : Hue {
@@ -85,7 +91,9 @@ internal class HueVibrantSecondary : Hue {
Pair(360, 12),
)
- override fun get(sourceColor: Cam): Double = getHueRotation(sourceColor.hue, hueToRotations)
+ override fun get(sourceColor: Cam): Double {
+ return getHueRotation(sourceColor.hue, hueToRotations)
+ }
}
internal class HueVibrantTertiary : Hue {
@@ -102,7 +110,9 @@ internal class HueVibrantTertiary : Hue {
Pair(360, 25),
)
- override fun get(sourceColor: Cam): Double = getHueRotation(sourceColor.hue, hueToRotations)
+ override fun get(sourceColor: Cam): Double {
+ return getHueRotation(sourceColor.hue, hueToRotations)
+ }
}
internal class HueExpressiveSecondary : Hue {
@@ -119,7 +129,9 @@ internal class HueExpressiveSecondary : Hue {
Pair(360, 45),
)
- override fun get(sourceColor: Cam): Double = getHueRotation(sourceColor.hue, hueToRotations)
+ override fun get(sourceColor: Cam): Double {
+ return getHueRotation(sourceColor.hue, hueToRotations)
+ }
}
internal class HueExpressiveTertiary : Hue {
@@ -136,7 +148,9 @@ internal class HueExpressiveTertiary : Hue {
Pair(360, 120),
)
- override fun get(sourceColor: Cam): Double = getHueRotation(sourceColor.hue, hueToRotations)
+ override fun get(sourceColor: Cam): Double {
+ return getHueRotation(sourceColor.hue, hueToRotations)
+ }
}
internal interface Chroma {
@@ -157,11 +171,15 @@ internal class ChromaMaxOut : Chroma {
}
internal class ChromaMultiple(val multiple: Double) : Chroma {
- override fun get(sourceColor: Cam): Double = sourceColor.chroma * multiple
+ override fun get(sourceColor: Cam): Double {
+ return sourceColor.chroma * multiple
+ }
}
internal class ChromaAdd(val amount: Double) : Chroma {
- override fun get(sourceColor: Cam): Double = sourceColor.chroma + amount
+ override fun get(sourceColor: Cam): Double {
+ return sourceColor.chroma + amount
+ }
}
internal class ChromaBound(
@@ -176,11 +194,15 @@ internal class ChromaBound(
}
internal class ChromaConstant(val chroma: Double) : Chroma {
- override fun get(sourceColor: Cam): Double = chroma
+ override fun get(sourceColor: Cam): Double {
+ return chroma
+ }
}
internal class ChromaSource : Chroma {
- override fun get(sourceColor: Cam): Double = sourceColor.chroma.toDouble()
+ override fun get(sourceColor: Cam): Double {
+ return sourceColor.chroma.toDouble()
+ }
}
internal class TonalSpec(val hue: Hue = HueSource(), val chroma: Chroma) {
@@ -404,45 +426,53 @@ class ColorScheme(
val seedTone: Float
get() = 1000f - CamUtils.lstarFromInt(seed) * 10f
- override fun toString(): String = "ColorScheme {\n" +
- " seed color: ${stringForColor(seed)}\n" +
- " style: $style\n" +
- " palettes: \n" +
- " ${humanReadable("PRIMARY", accent1.allShades)}\n" +
- " ${humanReadable("SECONDARY", accent2.allShades)}\n" +
- " ${humanReadable("TERTIARY", accent3.allShades)}\n" +
- " ${humanReadable("NEUTRAL", neutral1.allShades)}\n" +
- " ${humanReadable("NEUTRAL VARIANT", neutral2.allShades)}\n" +
- "}"
+ override fun toString(): String {
+ return "ColorScheme {\n" +
+ " seed color: ${stringForColor(seed)}\n" +
+ " style: $style\n" +
+ " palettes: \n" +
+ " ${humanReadable("PRIMARY", accent1.allShades)}\n" +
+ " ${humanReadable("SECONDARY", accent2.allShades)}\n" +
+ " ${humanReadable("TERTIARY", accent3.allShades)}\n" +
+ " ${humanReadable("NEUTRAL", neutral1.allShades)}\n" +
+ " ${humanReadable("NEUTRAL VARIANT", neutral2.allShades)}\n" +
+ "}"
+ }
companion object {
- private fun wrapDegrees(degrees: Int): Int = when {
- degrees < 0 -> {
- (degrees % 360) + 360
- }
- degrees >= 360 -> {
- degrees % 360
- }
- else -> {
- degrees
+ private fun wrapDegrees(degrees: Int): Int {
+ return when {
+ degrees < 0 -> {
+ (degrees % 360) + 360
+ }
+ degrees >= 360 -> {
+ degrees % 360
+ }
+ else -> {
+ degrees
+ }
}
}
- public fun wrapDegreesDouble(degrees: Double): Double = when {
- degrees < 0 -> {
- (degrees % 360) + 360
- }
+ public fun wrapDegreesDouble(degrees: Double): Double {
+ return when {
+ degrees < 0 -> {
+ (degrees % 360) + 360
+ }
- degrees >= 360 -> {
- degrees % 360
- }
+ degrees >= 360 -> {
+ degrees % 360
+ }
- else -> {
- degrees
+ else -> {
+ degrees
+ }
}
}
- private fun hueDiff(a: Float, b: Float): Float = 180f - ((a - b).absoluteValue - 180f).absoluteValue
+ private fun hueDiff(a: Float, b: Float): Float {
+ return 180f - ((a - b).absoluteValue - 180f).absoluteValue
+ }
private fun stringForColor(color: Int): String {
val width = 4
@@ -454,8 +484,10 @@ class ColorScheme(
return "$h$c$t = #$hex"
}
- private fun humanReadable(paletteName: String, colors: List): String = "$paletteName\n" +
- colors.map { stringForColor(it) }.joinToString(separator = "\n") { it }
+ private fun humanReadable(paletteName: String, colors: List): String {
+ return "$paletteName\n" +
+ colors.map { stringForColor(it) }.joinToString(separator = "\n") { it }
+ }
private fun score(cam: Cam, proportion: Double): Double {
val proportionScore = 0.7 * 100.0 * proportion
diff --git a/lawnchair/src/dev/kdrag0n/monet/theme/DynamicColorScheme.kt b/lawnchair/src/dev/kdrag0n/monet/theme/DynamicColorScheme.kt
index 69fe602de01..4f73c299461 100644
--- a/lawnchair/src/dev/kdrag0n/monet/theme/DynamicColorScheme.kt
+++ b/lawnchair/src/dev/kdrag0n/monet/theme/DynamicColorScheme.kt
@@ -51,17 +51,19 @@ class DynamicColorScheme(
swatch: ColorSwatch,
seed: Zcam,
referenceSwatch: ColorSwatch,
- ): ColorSwatch = swatch.map { (shade, color) ->
- val target = color as? Zcam
- ?: color.convert().toAbs(cond.referenceWhite.y).toZcam(cond, include2D = false)
- val reference = referenceSwatch[shade]!! as? Zcam
- ?: color.convert().toAbs(cond.referenceWhite.y).toZcam(cond, include2D = false)
- val newLch = transformColor(target, seed, reference)
- val newSrgb = newLch.convert()
-
- Log.d(TAG, "Transform: [$shade] $target => $newLch => ${newSrgb.toHex()}")
- shade to newSrgb
- }.toMap()
+ ): ColorSwatch {
+ return swatch.map { (shade, color) ->
+ val target = color as? Zcam
+ ?: color.convert().toAbs(cond.referenceWhite.y).toZcam(cond, include2D = false)
+ val reference = referenceSwatch[shade]!! as? Zcam
+ ?: color.convert().toAbs(cond.referenceWhite.y).toZcam(cond, include2D = false)
+ val newLch = transformColor(target, seed, reference)
+ val newSrgb = newLch.convert()
+
+ Log.d(TAG, "Transform: [$shade] $target => $newLch => ${newSrgb.toHex()}")
+ shade to newSrgb
+ }.toMap()
+ }
private fun transformColor(target: Zcam, seed: Zcam, reference: Zcam): Color {
// Keep target lightness.
@@ -92,11 +94,13 @@ class DynamicColorScheme(
}
}
- override fun equals(other: Any?): Boolean = other is DynamicColorScheme &&
- other.seedColor == seedColor &&
- other.chromaFactor == chromaFactor &&
- other.cond == cond &&
- other.accurateShades == accurateShades
+ override fun equals(other: Any?): Boolean {
+ return other is DynamicColorScheme &&
+ other.seedColor == seedColor &&
+ other.chromaFactor == chromaFactor &&
+ other.cond == cond &&
+ other.accurateShades == accurateShades
+ }
override fun hashCode() = Objects.hash(seedColor, chromaFactor, cond, accurateShades)
diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java
index 191b662946b..e2cf536ad68 100644
--- a/src/com/android/launcher3/config/FeatureFlags.java
+++ b/src/com/android/launcher3/config/FeatureFlags.java
@@ -347,7 +347,7 @@ public static boolean enableHomeTransitionListener() {
// TODO(Block 26): Clean up flags
public static final BooleanFlag ENABLE_WIDGET_HOST_IN_BACKGROUND = getDebugFlag(270394384,
- "ENABLE_WIDGET_HOST_IN_BACKGROUND", DISABLED,
+ "ENABLE_WIDGET_HOST_IN_BACKGROUND", ENABLED,
"Enable background widget updates listening for widget holder");
// TODO(Block 27): Clean up flags
diff --git a/src/com/android/launcher3/popup/ArrowPopup.java b/src/com/android/launcher3/popup/ArrowPopup.java
index b1b05127081..51caf99ffb1 100644
--- a/src/com/android/launcher3/popup/ArrowPopup.java
+++ b/src/com/android/launcher3/popup/ArrowPopup.java
@@ -150,8 +150,6 @@ public ArrowPopup(Context context, AttributeSet attrs, int defStyleAttr) {
// Initialize arrow view
final Resources resources = getResources();
- mArrowColor = getColorStateList(getContext(), R.color.popup_color_background)
- .getDefaultColor();
mChildContainerMargin = resources.getDimensionPixelSize(R.dimen.popup_margin);
mArrowWidth = resources.getDimensionPixelSize(R.dimen.popup_arrow_width);
mArrowHeight = resources.getDimensionPixelSize(R.dimen.popup_arrow_height);
diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java
index e577b332c7d..4f3ec7d8c88 100644
--- a/src/com/android/launcher3/views/OptionsPopupView.java
+++ b/src/com/android/launcher3/views/OptionsPopupView.java
@@ -56,6 +56,7 @@
import app.lawnchair.preferences2.PreferenceManager2;
import app.lawnchair.ui.popup.LauncherOptionsPopup;
+import app.lawnchair.wallpaper.service.WallpaperService;
/**
* Popup shown on long pressing an empty space in launcher
@@ -71,7 +72,7 @@ public class OptionsPopupView extends Arrow
// An intent extra to indicate the launch source by launcher.
private static final String EXTRA_WALLPAPER_LAUNCH_SOURCE = "com.android.wallpaper.LAUNCH_SOURCE";
- private final ArrayMap mItemMap = new ArrayMap<>();
+ public final ArrayMap mItemMap = new ArrayMap<>();
private RectF mTargetRect;
private boolean mShouldAddArrow;
@@ -171,6 +172,7 @@ private static OptionsPopupView show(
if (activityContext == null) {
return null;
}
+
OptionsPopupView popup = (OptionsPopupView) activityContext.getLayoutInflater()
.inflate(R.layout.longpress_options_menu, activityContext.getDragLayer(), false);
popup.mTargetRect = targetRect;