From 2cf009d025ff15667ab34e7581c27cff0fe4a6bd Mon Sep 17 00:00:00 2001 From: Kurt Himebauch <136133082+xXJSONDeruloXx@users.noreply.github.com> Date: Sun, 18 Oct 2026 22:54:50 -0400 Subject: [PATCH] feat: add light launcher icon option (#1104) --- app/src/main/AndroidManifest.xml | 30 ++++++++++--- .../com/droiddeck/launcher/LauncherIcon.kt | 42 ++++++++++++++++++ .../com/droiddeck/launcher/MainActivity.kt | 20 ++++++++- .../launcher/frontend/GameShortcuts.kt | 3 +- .../droiddeck/launcher/ui/FrontEndScreen.kt | 3 ++ .../droiddeck/launcher/ui/FrontEndSetup.kt | 13 +++++- .../mipmap-anydpi-v26/ic_launcher_light.xml | 5 +++ .../ic_launcher_background_light.png | Bin 0 -> 370 bytes .../ic_launcher_foreground_light.png | Bin 0 -> 2059 bytes .../ic_launcher_background_light.png | Bin 0 -> 235 bytes .../ic_launcher_foreground_light.png | Bin 0 -> 1331 bytes .../ic_launcher_background_light.png | Bin 0 -> 511 bytes .../ic_launcher_foreground_light.png | Bin 0 -> 2822 bytes .../ic_launcher_background_light.png | Bin 0 -> 898 bytes .../ic_launcher_foreground_light.png | Bin 0 -> 4528 bytes .../ic_launcher_background_light.png | Bin 0 -> 1352 bytes .../ic_launcher_foreground_light.png | Bin 0 -> 6162 bytes app/src/main/res/values-ar/strings.xml | 3 ++ app/src/main/res/values-b+es+419/strings.xml | 3 ++ app/src/main/res/values-bg/strings.xml | 3 ++ app/src/main/res/values-cs/strings.xml | 3 ++ app/src/main/res/values-da/strings.xml | 3 ++ app/src/main/res/values-de/strings.xml | 3 ++ app/src/main/res/values-el/strings.xml | 3 ++ app/src/main/res/values-es/strings.xml | 3 ++ app/src/main/res/values-fi/strings.xml | 3 ++ app/src/main/res/values-fr/strings.xml | 3 ++ app/src/main/res/values-hi/strings.xml | 3 ++ app/src/main/res/values-hu/strings.xml | 3 ++ app/src/main/res/values-in/strings.xml | 3 ++ app/src/main/res/values-it/strings.xml | 3 ++ app/src/main/res/values-ja/strings.xml | 3 ++ app/src/main/res/values-ko/strings.xml | 3 ++ app/src/main/res/values-ms/strings.xml | 3 ++ app/src/main/res/values-nb/strings.xml | 3 ++ app/src/main/res/values-nl/strings.xml | 3 ++ app/src/main/res/values-pl/strings.xml | 3 ++ app/src/main/res/values-pt-rPT/strings.xml | 3 ++ app/src/main/res/values-pt/strings.xml | 3 ++ app/src/main/res/values-ro/strings.xml | 3 ++ app/src/main/res/values-ru/strings.xml | 3 ++ app/src/main/res/values-sv/strings.xml | 3 ++ app/src/main/res/values-th/strings.xml | 3 ++ app/src/main/res/values-tr/strings.xml | 3 ++ app/src/main/res/values-uk/strings.xml | 3 ++ app/src/main/res/values-vi/strings.xml | 3 ++ app/src/main/res/values-zh-rCN/strings.xml | 3 ++ app/src/main/res/values-zh-rHK/strings.xml | 3 ++ app/src/main/res/values-zh-rTW/strings.xml | 3 ++ app/src/main/res/values/strings.xml | 3 ++ .../launcher/frontend/GameLaunchLinkTest.kt | 15 ++++++- artwork/README.md | 2 +- 52 files changed, 222 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/com/droiddeck/launcher/LauncherIcon.kt create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_light.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_background_light.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground_light.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_background_light.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground_light.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_background_light.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground_light.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_background_light.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground_light.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_background_light.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground_light.png diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 81b3adcf4..095abb5bb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -65,11 +65,6 @@ android:exported="true" android:screenOrientation="sensorLandscape" android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize|density|keyboard|keyboardHidden|navigation"> - - - - - @@ -88,6 +83,31 @@ + + + + + + + + + + + + + + + + > = listOf( + DARK to R.string.setup_launcher_icon_dark, + LIGHT to R.string.setup_launcher_icon_light, + ) + + private fun component(context: Context, style: String) = + ComponentName(context, aliases.getValue(style)) + + private fun enabled(context: Context, style: String): Boolean = + when (context.packageManager.getComponentEnabledSetting(component(context, style))) { + PackageManager.COMPONENT_ENABLED_STATE_ENABLED -> true + PackageManager.COMPONENT_ENABLED_STATE_DEFAULT -> style == DARK + else -> false + } + + fun current(context: Context): String = aliases.keys.firstOrNull { enabled(context, it) } ?: DARK + + fun activity(context: Context): ComponentName = component(context, current(context)) + + fun set(context: Context, style: String) { + if (style !in aliases || style == current(context)) return + val pm = context.packageManager + pm.setComponentEnabledSetting(component(context, style), + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP) + aliases.keys.filter { it != style }.forEach { + pm.setComponentEnabledSetting(component(context, it), + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP) + } + } +} diff --git a/app/src/main/java/com/droiddeck/launcher/MainActivity.kt b/app/src/main/java/com/droiddeck/launcher/MainActivity.kt index 279692714..ec5ff76c4 100644 --- a/app/src/main/java/com/droiddeck/launcher/MainActivity.kt +++ b/app/src/main/java/com/droiddeck/launcher/MainActivity.kt @@ -164,6 +164,7 @@ class MainActivity : ComponentActivity() { private var downloadMirror by mutableStateOf("") private var downloadPrefix by mutableStateOf("") private var animationsEnabled by mutableStateOf(true) + private var launcherIcon by mutableStateOf(LauncherIcon.DARK) private var gameStoresEnabled by mutableStateOf(true) private var gameStoresSpeedTier by mutableStateOf("fast") private var storesOpenTab by mutableStateOf(SessionPrefs.STORES_OPEN_LIBRARY) @@ -484,6 +485,20 @@ class MainActivity : ComponentActivity() { pickSaveDir.launch(InAppFilePicker.buildDirIntent(this, getString(R.string.game_file_folder), gameSyncFolder)) } + private fun switchLauncherIcon(style: String): Boolean { + val before = LauncherIcon.current(this) + LauncherIcon.set(this, style) + launcherIcon = LauncherIcon.current(this) + if (launcherIcon == before) return false + // Android finishes activities started through the alias that was just disabled. + startActivity(Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER) + .setComponent(LauncherIcon.activity(this)) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_MULTIPLE_TASK) + .putExtra(com.droiddeck.launcher.stores.download.StoreDownloadService.EXTRA_NAV, "setup:launcher")) + finishAndRemoveTask() + return true + } + private fun readGameIntent(request: Intent) { request.getStringExtra(com.droiddeck.launcher.stores.download.StoreDownloadService.EXTRA_NAV)?.let { navRequest = it; request.removeExtra(com.droiddeck.launcher.stores.download.StoreDownloadService.EXTRA_NAV) } shortcutPicker = request.action == Intent.ACTION_CREATE_SHORTCUT @@ -739,6 +754,7 @@ class MainActivity : ComponentActivity() { downloadPrefix = DownloadSource.custom(this) DownloadSource.probe() animationsEnabled = SessionPrefs.animationsEnabled(this) + launcherIcon = LauncherIcon.current(this) gameStoresEnabled = SessionPrefs.gameStoresEnabled(this) gameStoresSpeedTier = SessionPrefs.gameStoresSpeedTier(this) storesOpenTab = SessionPrefs.storesOpenTab(this) @@ -799,6 +815,7 @@ class MainActivity : ComponentActivity() { downloadMirror = downloadMirror, downloadPrefix = downloadPrefix, animationsEnabled = animationsEnabled, + launcherIcon = launcherIcon, gameStoresEnabled = gameStoresEnabled, gameStoresSpeedTier = gameStoresSpeedTier, storesOpenTab = storesOpenTab, @@ -952,6 +969,7 @@ class MainActivity : ComponentActivity() { onPageBack = { showPerformance = false; showComponents = false; showMapping = false }, onGameStoresEnabled = { on -> SessionPrefs.setGameStoresEnabled(this, on); gameStoresEnabled = on }, onTheme = { id -> SessionPrefs.setTheme(this, id); theme = id }, + onLauncherIcon = { style -> switchLauncherIcon(style) }, onLanguage = { tag -> if (tag != com.droiddeck.launcher.core.AppLanguage.chosen(this)) { com.droiddeck.launcher.core.AppLanguage.setChosen(this, tag) @@ -2045,7 +2063,7 @@ class MainActivity : ComponentActivity() { com.droiddeck.launcher.core.AppLanguage.setChosen(this, com.droiddeck.launcher.core.AppLanguage.SYSTEM) if (!ok) android.widget.Toast.makeText(this, R.string.setup_reset_settings_partial, android.widget.Toast.LENGTH_LONG).show() com.droiddeck.launcher.ui.Motion.refresh(this) - recreate() + if (!switchLauncherIcon(LauncherIcon.DARK)) recreate() } }, "reset-settings").start() } diff --git a/app/src/main/java/com/droiddeck/launcher/frontend/GameShortcuts.kt b/app/src/main/java/com/droiddeck/launcher/frontend/GameShortcuts.kt index d5ca08be2..80cdd93c1 100644 --- a/app/src/main/java/com/droiddeck/launcher/frontend/GameShortcuts.kt +++ b/app/src/main/java/com/droiddeck/launcher/frontend/GameShortcuts.kt @@ -10,6 +10,7 @@ import android.graphics.BitmapFactory import android.graphics.drawable.Icon import android.net.Uri import android.widget.Toast +import com.droiddeck.launcher.LauncherIcon import com.droiddeck.launcher.MainActivity import com.droiddeck.launcher.R import java.io.File @@ -23,7 +24,7 @@ object GameShortcuts { val name = game.name.ifBlank { context.getString(R.string.app_name) } val icon = iconBitmap(game)?.let(Icon::createWithBitmap) ?: Icon.createWithResource(context, R.mipmap.ic_launcher) return ShortcutInfo.Builder(context, "game:${game.gameIdString}") - .setActivity(android.content.ComponentName(context, MainActivity::class.java)) + .setActivity(LauncherIcon.activity(context)) .setShortLabel(name.take(40)).setLongLabel(name).setIcon(icon) .setIntent(launchIntent(context, game.gameIdString)).build() } diff --git a/app/src/main/java/com/droiddeck/launcher/ui/FrontEndScreen.kt b/app/src/main/java/com/droiddeck/launcher/ui/FrontEndScreen.kt index 543778b34..0b9e784e5 100644 --- a/app/src/main/java/com/droiddeck/launcher/ui/FrontEndScreen.kt +++ b/app/src/main/java/com/droiddeck/launcher/ui/FrontEndScreen.kt @@ -138,6 +138,7 @@ class FrontEndState( val downloadMirror: String = "", val downloadPrefix: String = "", val animationsEnabled: Boolean = true, + val launcherIcon: String = com.droiddeck.launcher.LauncherIcon.DARK, val gameStoresEnabled: Boolean = true, val gameStoresSpeedTier: String = "fast", val storesOpenTab: String = SessionPrefs.STORES_OPEN_LIBRARY, @@ -205,6 +206,7 @@ class FrontEndActions( val onTheme: (String) -> Unit = {}, val onLanguage: (String) -> Unit = {}, val onAppScale: (Int) -> Unit = {}, + val onLauncherIcon: (String) -> Unit = {}, val onOrientation: (Int) -> Unit = {}, val onLauncherFullscreen: (Boolean) -> Unit = {}, val onAnimationsEnabled: (Boolean) -> Unit = {}, @@ -386,6 +388,7 @@ private fun FrontEndScreenBody(s: FrontEndState, a: FrontEndActions, page: (@Com when (target) { "stores:downloads" -> { com.droiddeck.launcher.stores.StoresState.openDownloads = true; selected = "stores" } "components" -> a.onComponents(true) + "setup:launcher" -> { SetupTabs.openLauncher = true; selected = "setup" } else -> selected = target } a.onNavigated() diff --git a/app/src/main/java/com/droiddeck/launcher/ui/FrontEndSetup.kt b/app/src/main/java/com/droiddeck/launcher/ui/FrontEndSetup.kt index 359450dae..42eb27d69 100644 --- a/app/src/main/java/com/droiddeck/launcher/ui/FrontEndSetup.kt +++ b/app/src/main/java/com/droiddeck/launcher/ui/FrontEndSetup.kt @@ -86,6 +86,11 @@ import com.droiddeck.launcher.R private enum class CheckState { OK, WARN, BUSY } private const val STORAGE_TAB = 3 +private const val LAUNCHER_TAB = 2 + +internal object SetupTabs { + var openLauncher = false +} private const val GLASSES_TAB = 5 @Composable @@ -177,7 +182,8 @@ internal fun SetupPanel( onSave = { a.onDownloadPrefix(it); editDownloadPrefix = false }, ) val tabs = listOf(stringResource(R.string.setup_tab_overview), stringResource(R.string.setup_tab_controller), stringResource(R.string.setup_tab_launcher), stringResource(R.string.setup_tab_storage), stringResource(R.string.setup_tab_diagnostics), stringResource(R.string.setup_tab_glasses)) - var tab by rememberSaveable { mutableStateOf(0) } + var tab by rememberSaveable { mutableStateOf(if (SetupTabs.openLauncher) LAUNCHER_TAB else 0) } + SetupTabs.openLauncher = false val chipFocus = remember { List(tabs.size) { FocusRequester() } } var tabTurned by remember { mutableStateOf(false) } val pick: (Int) -> Unit = { i -> tab = i; tabTurned = true } @@ -362,6 +368,11 @@ internal fun SetupPanel( ) }, s.appScale, onPick = a.onAppScale, ) + ChoiceRow( + host, "launcher-icon", stringResource(R.string.setup_launcher_icon), null, + com.droiddeck.launcher.LauncherIcon.options.map { (style, label) -> style to stringResource(label) }, + s.launcherIcon, onPick = a.onLauncherIcon, + ) ToggleRow(host, "launcher-animations", stringResource(R.string.setup_animations), null, s.animationsEnabled, onChange = a.onAnimationsEnabled) LanguageRow(host, s.language, a.onLanguage) diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light.xml new file mode 100644 index 000000000..275b9dfdd --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_background_light.png b/app/src/main/res/mipmap-hdpi/ic_launcher_background_light.png new file mode 100644 index 0000000000000000000000000000000000000000..0ed586fceea38f753381df03ab525ef2c006b13d GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^i$Iuz4M-mPBqq(kz-Z~|;uunK>+K~+K?Vkn!v+WT zKUZvK?`(;)_T=j8Wswl<=@2~FK{A!#(!=3)q=O8~K*^0oImv}Ys!7mLNkUMW42lfT e0Yl?NIk)3ER)@8JjFW+3$>8bg=d#Wzp$Pz18E!WK literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground_light.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground_light.png new file mode 100644 index 0000000000000000000000000000000000000000..e89aa93ddee4e301c0568c4de84e66122de01c1d GIT binary patch literal 2059 zcma)-`#TegAIIl5Vq@K0!igNoHRk>`w9M@!l-r~eBRId`TY8R-mgq|S4Xh)DQN%z0CsjlTs_pM z|Ev`7@OEv=D+2(MW6lV;X9D{xC;EXGMx<|Jy=fH~u5&E)HeTH++}n(+c-(N}gu_B; zW})=i@LOQh35yO^g?rQLlN^xg2J=*#^0|3e$|UI6`2cF12>P)uOtDN;~BAx*{?EWDk^8M$RTx46Xz2(AJtJadLoYW1xmc zh9t4gvS5$9+;L0)AaS*V!%rmS0Y+%yz0SJx5_9KdLzWgXpz@$%LrY4wYItI-qnccbi6uF zgQ%3oP7IQ1_^<7I&PSz0w?7t}x31n8(A@6bT9<54ZLC<8cu}j^m4qJPT`ipfcFOSI z!byg^k4Mz_duD>jByE2;a$$$S%84x@tocgY5{-Btb&fO++1I!=$6JVr>f436jbULY ztZy1b5!Z5$`Dw-V%6TG})|aE1`=_?Q6*}y-P1M8RC<)M$cXO}4fp+ynT4Ud(N=nf4 zbjCSXvI^I-VBq9NrID;5#hwWUSL+R1)iF*lZw4@V-@R|Rh8V+O=Pqp6v~z37rgxC& zXWVOP$Ye*NeMv}H+8~(N8=$Cz6}c!iHE}1y%@esW5awGKbJB2BP5yJ<*dhf@#rzf% zOdyf=W*ytl7R+OmvTxHd&mENc&S}W&LSoV%;eGn~6AUHGf@QL|KzoN-KQdPrRzjWM zoN|Hx^!EPd)OSMuzI&0dzdEUe#x_b%SIXY5!n|O*oQg<}Z4x)4#F|+!1*G{u5gq=7 z&6LQWc1Cq~o1ywvUa{q6k&x^V8Gir9`PZ)-EX2<~IQaTJ^SQp>S>ZPKk&gK-h|HHv z>FE7OUCEGqs-(yEIA1>P698W7nPn{VJv5KOYj)}LbNnus2+fe#bVKf8b?R_mwjaz#qf?tIs%55JwcG zL=_mgtzoyh4K=@432gMeTkPqbsO|r}Eg)O~jLEpGC`Ofu50izNzhiH)R7^5@q3L8l zd?Nu(&@HG{E%xkPe68FwpTp@`6euKFbw|JZlK&8GkBPrV=ML53e(v4`2W||$!~%c# z5<3jsK=jqpX+lyO(r|sC9dw4xuhoOm2O)WX^)v7mAgKO$E&j91_(=BSNTD${f z3t(nixQtapk51{FA8;hxRPG6Ee-d=2485g-3L~!$Z$z|KF99wY%a@5IxAYH1xps#_ zv=<{>wQ|EctW}OQs1;f1=kG(>GCz0cOQWeHwYUMdK&!wC4&1@RX(TcLZ5fnXRab{Y z1^i=}PcskGHR>jdZU)cKlGT-3rzxYQ<6f=?Gu_88wsy7{$9f4|9(klJkzRe+_B2Yf zaIuk|DtlGlVyq_`m6dN7H+3+FL;1JA)QcDM`Pi^mn2`N4VCo@oQ{1{NVB*3or%^Tq zfDZb2LB=@A_GG(mJuYr>{G8$kPJtFU5dC)jq-U{Z`AcKi&X3gAdQd!5{fkQeWWPe8 zA6`iF>wcnJf7^!dl=FmT9`;^~X(p`9exhDdT#d_VJJA=5hyoLp3A(^PO`2%$9{Y&e z(v3?aew{91oDHXrW32ezX`hPW;t7R3Gd9!XxyA1P6N2$3O?EtMgn>9cozc8i-y-%2 zj!FW-ILf;V+Fd)gJ^&7b8V-{+A7jY<-nXp3Z|lQa!krU_jHP_Mwx7d91r5Poi4@y_ zFf`hluIy;hmt$zdP5K30vAUX(d)Xe&r>FymMXBk4;<-t;k%KPwUAy65?X2E1TlL_w z`Q9CXxN<0UJBImg0!Stw zH9T4cubLxS*LTlV^|RmQ^-lKj8oX literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground_light.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground_light.png new file mode 100644 index 0000000000000000000000000000000000000000..ebb44b431e803b2c962c2031c7205c1855ebe512 GIT binary patch literal 1331 zcmV-31cvKeP(d1!5|jl6fkBjEAz{v~^u>||rf8IND<}pg^up#7*->FC-+9Cak8txLXqa5ms((_vytwcRTmbw&(8NyL(Ujec+<=}%QAlVzQ#TW zdVqht^*4Y4;AgMdzt zBG%Gx;F}T4@!x7pBu%-m0*4&iViZ;hlm3-=9<@tCqcj1v#!P+1Yb{X> zhodFz{dJSMmh|>ZKnHF^Q-{1ueg!s#_krExOWk%}xSx7sc-v&yPqJ_wOT$1FAMu14 z^}Th_F^Io`JG?*D4@=`D@YeWJr!5U%VSmWbY-Z4@HL%ba_Ak9cGo7~7_ttjctV0pE z02|bCp8UL32Snp5!b3EM;Po7QwbX})X!Nc67pMV79X8*rz|w2=I=!)TR-1h>1iNzh zpWhYkuNQz!G%< zgT52THlREY^(-A5Vr$Y-cFJKp1(u{I>GCdb=M7_1t`55#He0E{CJ8LuZYwb?&tvCi zdAQwHPP((CSE;}f_4+>Kidkrg73u1p!XgDW;ZJXLBi`A~``(;X$FO(NgYG!H87#op zPi2~&Mu9oHsYtpN3d~VBsnat^{s&bDr}_*EZ2BW?f$#j1_phgDVqlAkV zV_^RH1;|wzv2^F4?5`tN6YeL*C*uWS2v}^Cfo#Ss&-I+3~?dLITdTYGBT<2 zlA_A~=SIhXXK{O2%3@%>x6Mp`Zgjt*%I$MHE&xZ99+q;K_Z50E%d+bfQ*k_4#pTt4 zZm$H!sY3ozMS*3e1-DWASs(h5L?gh~LJmJEFn2!!n}GA^NjOFAIKmtH425~L6Qe+=)PrOU_9pO;uunK>+NMnUIqq^BL)Zd zKX+!8zvLCM$!`*qUk^)yfq?`FOYnd&4;u)xF@tb3BM>(pWPsuW2@MAiBqSJsFs2r) z+K{zi*M?*h!Zu`W$Ts0|AVdp32SRK@^B1N~gEA;STxLqmW?eI5<>D{Eh-L6}^>bP0 Hl+XkKrtF4? literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground_light.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground_light.png new file mode 100644 index 0000000000000000000000000000000000000000..2e96d09347fa6f2ed086a8b80b91b57dfa09c555 GIT binary patch literal 2822 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground_light.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground_light.png new file mode 100644 index 0000000000000000000000000000000000000000..134c0842ad7ff7bb14134a67c4ffb12d18943699 GIT binary patch literal 4528 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 3381ca393..fcc1b2258 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -741,6 +741,9 @@ %1$d%% (افتراضي) المظهر مظهر المشغّل + أيقونة التطبيق + داكنة + فاتحة استخدام كشاشة رئيسية يمكن أن يكون DroidDeck تطبيق الشاشة الرئيسية لا يُعرَض DroidDeck أبدًا كتطبيق للشاشة الرئيسية diff --git a/app/src/main/res/values-b+es+419/strings.xml b/app/src/main/res/values-b+es+419/strings.xml index 3ff6b8521..877992f59 100644 --- a/app/src/main/res/values-b+es+419/strings.xml +++ b/app/src/main/res/values-b+es+419/strings.xml @@ -752,6 +752,9 @@ %1$d%% (predeterminada) Tema Apariencia del launcher + Ícono de la app + Oscuro + Claro Usar como pantalla de inicio DroidDeck puede ser la app de inicio DroidDeck nunca se ofrece como app de inicio diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index f562b8bb8..4e14e9940 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -729,6 +729,9 @@ %1$d%% (по подразбиране) Тема Облик на лаунчъра + Икона на приложението + Тъмна + Светла Използване като начален екран DroidDeck може да бъде приложението за начален екран DroidDeck никога не се предлага като приложение за начален екран diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index df75b0192..366be9edc 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -735,6 +735,9 @@ %1$d %% (výchozí) Téma Vzhled spouštěče + Ikona aplikace + Tmavá + Světlá Použít jako domovskou obrazovku DroidDeck může být domovská aplikace DroidDeck se nikdy nenabízí jako domovská aplikace diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 931534a37..46d435398 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -729,6 +729,9 @@ %1$d%% (standard) Tema Launcherens udseende + Appikon + Mørk + Lys Brug som startskærm DroidDeck kan være Home-appen DroidDeck tilbydes aldrig som Home-app diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index dfaa30fed..66b18fde8 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -718,6 +718,9 @@ %1$d %% (Standard) Design Aussehen des Launchers + App-Symbol + Dunkel + Hell Als Startbildschirm verwenden DroidDeck kann die Startbildschirm-App sein DroidDeck wird nie als Startbildschirm-App angeboten diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 7efafb770..786b4ddb5 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -729,6 +729,9 @@ %1$d%% (Προεπιλογή) Θέμα Εμφάνιση εκκινητή + Εικονίδιο εφαρμογής + Σκούρο + Ανοιχτό Χρήση ως αρχική οθόνη Το DroidDeck μπορεί να είναι η εφαρμογή αρχικής οθόνης Το DroidDeck δεν προτείνεται ποτέ ως εφαρμογή αρχικής οθόνης diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ccc1e9e37..7db317747 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -729,6 +729,9 @@ %1$d%% (predeterminada) Tema Apariencia del launcher + Icono de la app + Oscuro + Claro Usar como pantalla de inicio DroidDeck puede ser la app de inicio DroidDeck nunca se ofrece como app de inicio diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 9b156663c..de265dcab 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -729,6 +729,9 @@ %1$d %% (Oletus) Teema Käynnistimen ulkoasu + Sovelluskuvake + Tumma + Vaalea Käytä Aloitusnäyttönä DroidDeck voi olla kotisovellus DroidDeckiä ei koskaan tarjota kotisovellukseksi diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index fc79c4e3c..1d09298d5 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -729,6 +729,9 @@ %1$d%% (par défaut) Thème Apparence du lanceur + Icône de l\'app + Sombre + Clair Utiliser comme écran d\'accueil DroidDeck peut être utilisé comme application d\'écran d\'accueil DroidDeck ne sera pas proposé comme application d\'écran d\'accueil diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index a9cbd38f3..90c47ff45 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -729,6 +729,9 @@ %1$d%% (डिफ़ॉल्ट) थीम लॉन्चर की दिखावट + ऐप आइकन + गहरा + हल्का होम स्क्रीन के तौर पर इस्तेमाल करें DroidDeck होम ऐप हो सकता है DroidDeck को होम ऐप के तौर पर कभी नहीं दिखाया जाता diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 747aac900..96cb5ed36 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -729,6 +729,9 @@ %1$d%% (Alapértelmezett) Téma Az indítóalkalmazás megjelenése + Alkalmazásikon + Sötét + Világos Használat kezdőképernyőként A DroidDeck lehet a kezdőképernyő alkalmazás A DroidDeck soha nem jelenik meg kezdőképernyő alkalmazásként diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 2c695930b..9ab984dce 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -726,6 +726,9 @@ %1$d%% (Default) Tema Tampilan peluncur + Ikon aplikasi + Gelap + Terang Gunakan sebagai Layar Utama DroidDeck dapat menjadi aplikasi Utama DroidDeck tidak pernah ditawarkan sebagai aplikasi Utama diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 4d6cb901c..cd769f615 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -721,6 +721,9 @@ %1$d%% (predefinita) Tema Aspetto del launcher + Icona dell\'app + Scura + Chiara Usa come schermata Home DroidDeck può essere l\'app Home DroidDeck non viene mai proposta come app Home diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 2df5383a9..b350ede00 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -726,6 +726,9 @@ %1$d%%(デフォルト) テーマ ランチャーの外観 + アプリアイコン + ダーク + ライト ホーム画面として使用 DroidDeckをホームアプリとして使用できます DroidDeckはホームアプリとして提供されません diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 0705efab9..f076dc4fb 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -726,6 +726,9 @@ %1$d%%(기본값) 테마 런처 외관 + 앱 아이콘 + 다크 + 라이트 홈 화면으로 사용 DroidDeck을 홈 앱으로 사용할 수 있습니다 DroidDeck은 홈 앱으로 제공되지 않습니다 diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 6729d1e58..344e02520 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -726,6 +726,9 @@ %1$d%% (Lalai) Tema Rupa pelancar + Ikon apl + Gelap + Cerah Gunakan sebagai skrin Utama DroidDeck boleh menjadi apl Utama DroidDeck tidak sekali-kali ditawarkan sebagai apl Utama diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 42962f25a..3b316f00e 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -729,6 +729,9 @@ %1$d%% (Standard) Tema Launcherens utseende + Appikon + Mørk + Lys Bruk som Hjem-skjerm DroidDeck kan være Hjem-appen DroidDeck tilbys aldri som en Hjem-app diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 46389acca..ec1b209ab 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -729,6 +729,9 @@ %1$d%% (Standaard) Thema Uiterlijk van de launcher + App-pictogram + Donker + Licht Als startscherm gebruiken DroidDeck kan de startschermapp zijn DroidDeck wordt nooit aangeboden als startschermapp diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 32634d99b..35a3afaef 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -735,6 +735,9 @@ %1$d%% (domyślnie) Motyw Wygląd aplikacji + Ikona aplikacji + Ciemna + Jasna Użyj jako ekranu głównego DroidDeck może być aplikacją ekranu głównego DroidDeck nigdy nie jest proponowany jako aplikacja ekranu głównego diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 13412341a..614ece612 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -721,6 +721,9 @@ %1$d%% (padrão) Tema Aspeto do iniciador + Ícone da app + Escuro + Claro Utilizar como página inicial O DroidDeck pode ser a app de página inicial O DroidDeck nunca é proposto como app de página inicial diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index b3d775666..b5c4889e3 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -721,6 +721,9 @@ %1$d%% (padrão) Tema Aparência do inicializador + Ícone do app + Escuro + Claro Usar como tela inicial O DroidDeck pode ser o app de início O DroidDeck nunca é oferecido como app de início diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 0453831e3..840d1dfb3 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -732,6 +732,9 @@ %1$d%% (Implicit) Temă Aspectul launcherului + Pictograma aplicației + Întunecată + Luminoasă Folosește ca ecran Acasă DroidDeck poate fi aplicația Acasă DroidDeck nu este niciodată oferit ca aplicație Acasă diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 78d237c6c..f939fd97f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -732,6 +732,9 @@ %1$d%% (по умолчанию) Тема Внешний вид лаунчера + Значок приложения + Тёмный + Светлый Использовать как главный экран DroidDeck может использоваться как приложение главного экрана DroidDeck не будет доступен как приложение главного экрана diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 4ddc7eacc..58279d36b 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -729,6 +729,9 @@ %1$d %% (Standard) Tema Startprogrammets utseende + Appikon + Mörk + Ljus Använd som startskärm DroidDeck kan vara startskärmsappen DroidDeck erbjuds aldrig som startskärmsapp diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 4bda3c786..f13ce19aa 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -726,6 +726,9 @@ %1$d%% (ค่าเริ่มต้น) ธีม รูปลักษณ์ของตัวเปิดแอป + ไอคอนแอป + มืด + สว่าง ใช้เป็นหน้าจอหลัก DroidDeck สามารถเป็นแอปหน้าจอหลักได้ DroidDeck จะไม่ถูกเสนอให้เป็นแอปหน้าจอหลัก diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 3322f1c92..7a7e40f23 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -718,6 +718,9 @@ %%%1$d (Varsayılan) Tema Başlatıcı görünümü + Uygulama simgesi + Koyu + Açık Ana ekran olarak kullan DroidDeck ana ekran uygulaması olabilir DroidDeck hiçbir zaman ana ekran uygulaması olarak sunulmaz diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index fb30a8e4e..6a19b33c9 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -735,6 +735,9 @@ %1$d%% (стандартно) Тема Вигляд лаунчера + Значок застосунку + Темний + Світлий Використовувати як головний екран DroidDeck може бути додатком головного екрана DroidDeck ніколи не пропонується як додаток головного екрана diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 64c63421b..e1f58f9e8 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -726,6 +726,9 @@ %1$d%% (Mặc định) Giao diện Giao diện launcher + Biểu tượng ứng dụng + Tối + Sáng Dùng làm màn hình chính DroidDeck có thể là ứng dụng Màn hình chính DroidDeck không bao giờ được đề xuất làm ứng dụng Màn hình chính diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c0acbc778..caf528050 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -726,6 +726,9 @@ %1$d%%(默认) 主题 启动器外观 + 应用图标 + 深色 + 浅色 用作主屏幕 DroidDeck 可以设为主屏幕应用 系统不会把 DroidDeck 作为主屏幕应用提供 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index a8978f454..252446f85 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -726,6 +726,9 @@ %1$d%%(預設) 主題 啟動器外觀 + 應用程式圖示 + 深色 + 淺色 用作主畫面 DroidDeck 可用作主畫面應用程式 DroidDeck 不會作為主畫面應用程式的選項 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 84195dcd7..10865ff6d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -726,6 +726,9 @@ %1$d%%(預設) 佈景主題 啟動器外觀 + 應用程式圖示 + 深色 + 淺色 用作主螢幕 DroidDeck 可以作為主螢幕應用程式 DroidDeck 不會作為主螢幕應用程式提供 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d1f8c0203..424d8e35b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -760,6 +760,9 @@ %1$d%% (Default) Theme Launcher appearance + App icon + Dark + Light Use as Home screen DroidDeck can be the Home app DroidDeck is never offered as a Home app diff --git a/app/src/test/java/com/droiddeck/launcher/frontend/GameLaunchLinkTest.kt b/app/src/test/java/com/droiddeck/launcher/frontend/GameLaunchLinkTest.kt index e23faaf69..9493a630b 100644 --- a/app/src/test/java/com/droiddeck/launcher/frontend/GameLaunchLinkTest.kt +++ b/app/src/test/java/com/droiddeck/launcher/frontend/GameLaunchLinkTest.kt @@ -3,6 +3,7 @@ package com.droiddeck.launcher.frontend import android.content.Intent import android.net.Uri import android.app.Activity +import com.droiddeck.launcher.LauncherIcon import com.droiddeck.launcher.MainActivity import com.droiddeck.launcher.frontend.Library import org.junit.Assert.assertEquals @@ -68,12 +69,24 @@ class GameShortcutIntentTest { val launch = requireNotNull(shortcut.intent) assertEquals("game:8400", shortcut.id) assertEquals("Geometry Wars: Retro Evolved", shortcut.shortLabel.toString()) - assertEquals(MainActivity::class.java.name, shortcut.activity?.className) + assertEquals("com.droiddeck.launcher.LauncherDark", shortcut.activity?.className) + assertEquals(MainActivity::class.java.name, launch.component?.className) assertEquals(Intent.ACTION_VIEW, launch.action) assertEquals(Uri.parse("droiddeck://game/8400"), launch.data) assertEquals(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP, launch.flags) } + @Test fun pinnedShortcutFollowsTheLightLauncherIcon() { + val activity = Robolectric.buildActivity(Activity::class.java).setup().get() + LauncherIcon.set(activity, LauncherIcon.LIGHT) + + GameShortcuts.pin(activity, Library.SteamGame(8400, "Geometry Wars: Retro Evolved", null, "steam", 8400L)) + + val shortcut = activity.getSystemService(android.content.pm.ShortcutManager::class.java).pinnedShortcuts.single() + assertEquals(LauncherIcon.LIGHT, LauncherIcon.current(activity)) + assertEquals("com.droiddeck.launcher.LauncherLight", shortcut.activity?.className) + } + @Test fun actionCreateShortcutUsesAndroidsShortcutResultIntentApi() { val activity = Robolectric.buildActivity(Activity::class.java).setup().get() val game = Library.SteamGame(8400, "Geometry Wars: Retro Evolved", null, "steam", 8400L) diff --git a/artwork/README.md b/artwork/README.md index 6b2f7de2e..7f4f24ec9 100644 --- a/artwork/README.md +++ b/artwork/README.md @@ -2,4 +2,4 @@ `droiddeck-mark.svg` is the editable source for the white split-D mark. The blue orb is `#1A9FFF`; its halo and the two separator bars are transparent cutouts. The bars are centered on x=63.97, the endpoint of the curved half in the original Steam Deck symbol, and use the halo's 15.83-unit thickness. The mark is optically centered in its view box with a small rightward offset to balance its asymmetric silhouette. Place it on black when a background is needed. -Android currently consumes raster resources for the launcher layers and the Compose logo. The `mipmap-*/ic_launcher_foreground.png` files are density-sized exports of the SVG, with the mark kept inside the adaptive icon safe area. The matching backgrounds are black. `drawable-nodpi/logo.png` composes the same mark on a black circular badge. +Android currently consumes raster resources for the launcher layers and the Compose logo. The `mipmap-*/ic_launcher_foreground.png` files are density-sized exports of the SVG, with the mark kept inside the adaptive icon safe area. The matching backgrounds are black. The `_light` variants recolor the mark black on a white background and back the light launcher icon users can pick in Settings. `drawable-nodpi/logo.png` composes the same mark on a black circular badge.