From 2e339814fde397de890cd637fef8ec3fbe44e376 Mon Sep 17 00:00:00 2001 From: Kayos Date: Mon, 25 May 2026 11:43:38 -0700 Subject: [PATCH] vc=28: edge-to-edge player, nav-bar inset, video-track reset, app icon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three layout/playback fixes on vc=26-27 feedback plus the long-deferred app icon. Layout — VideoDetailScreen Player surface now fills the screen width (no 16dp side gutters). Outer Column dropped its 16dp padding; the player Box hangs off the full width with no rounded corners — NewPipe/YouTube look. Everything below (title, chips, button row, description, related list) goes back into an inner Column with 16dp horizontal + 12dp vertical padding so the body still reads correctly. Bottom inset: Spacer(windowInsetsBottomHeight(WindowInsets.navigationBars)) appended at the end of the scrollable column. Last related video can scroll up past the gesture pill / 3-button nav instead of being obscured by it. (Plain navigationBarsPadding would have pushed the whole surface up and left a dead band.) Black-video fix vc=27's Background button disabled the video track on the controller via setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, true) and that override is sticky. Returning to a video left it audio-only with a black surface. Added a LaunchedEffect(controller, streamUrl) that resets TrackSelectionParameters to defaults on every entry into detail — if the user opened a video page, they want video. The audio-only fullscreen toggle and the Background button still set the override for the duration of that session; they just no longer leak. App icon Replaced the Android default placeholder (sym_def_app_icon, which fdroid was failing to render anyway) with a proper adaptive icon: Background: #166534 deep green (sulkta.com brand) Foreground: tilted lime parallelogram + white play triangle (literal "straw" nod + video-app affordance) Adaptive XML in mipmap-anydpi-v26/. PNG fallbacks rendered via rsvg-convert at all five mipmap densities (mdpi/hdpi/xhdpi/xxhdpi/ xxxhdpi) for pre-API-26 devices. Manifest now points at @mipmap/ic_launcher and @mipmap/ic_launcher_round. --- buildSrc/src/main/kotlin/ProjectConfig.kt | 4 +- strawApp/src/main/AndroidManifest.xml | 4 +- .../straw/feature/detail/VideoDetailScreen.kt | 84 +++++++++++------- .../res/drawable/ic_launcher_background.xml | 5 ++ .../res/drawable/ic_launcher_foreground.xml | 25 ++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 ++ .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 ++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 987 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 987 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 740 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 740 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 1355 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 1355 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1809 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 1809 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 2477 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 2477 bytes 17 files changed, 94 insertions(+), 38 deletions(-) create mode 100644 strawApp/src/main/res/drawable/ic_launcher_background.xml create mode 100644 strawApp/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 strawApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 strawApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 strawApp/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 strawApp/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 strawApp/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 strawApp/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 strawApp/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 strawApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 strawApp/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 strawApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 strawApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 strawApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/buildSrc/src/main/kotlin/ProjectConfig.kt b/buildSrc/src/main/kotlin/ProjectConfig.kt index a20dca091..225345b66 100644 --- a/buildSrc/src/main/kotlin/ProjectConfig.kt +++ b/buildSrc/src/main/kotlin/ProjectConfig.kt @@ -55,6 +55,6 @@ const val NEWPIPE_APPLICATION_ID_NEW = "net.newpipe.app" // vc=19 / 0.1.0-AE — rust pipeline cutover. Extraction via // strawcore-core (Sulkta-Coop/strawcore) via the UniFFI wrapper; no // NewPipeExtractor in the runtime path. -const val STRAW_VERSION_CODE = 27 -const val STRAW_VERSION_NAME = "0.1.0-AM" +const val STRAW_VERSION_CODE = 28 +const val STRAW_VERSION_NAME = "0.1.0-AN" const val STRAW_APPLICATION_ID = "com.sulkta.straw" diff --git a/strawApp/src/main/AndroidManifest.xml b/strawApp/src/main/AndroidManifest.xml index 46abc05b7..87ff57336 100644 --- a/strawApp/src/main/AndroidManifest.xml +++ b/strawApp/src/main/AndroidManifest.xml @@ -14,8 +14,8 @@ diff --git a/strawApp/src/main/kotlin/com/sulkta/straw/feature/detail/VideoDetailScreen.kt b/strawApp/src/main/kotlin/com/sulkta/straw/feature/detail/VideoDetailScreen.kt index 7b552764e..502314b25 100644 --- a/strawApp/src/main/kotlin/com/sulkta/straw/feature/detail/VideoDetailScreen.kt +++ b/strawApp/src/main/kotlin/com/sulkta/straw/feature/detail/VideoDetailScreen.kt @@ -25,14 +25,17 @@ import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape @@ -118,6 +121,16 @@ fun VideoDetailScreen( var inlinePlaying by remember(streamUrl) { mutableStateOf(false) } LaunchedEffect(streamUrl) { vm.load(streamUrl) } + // The Background button (and the fullscreen audio-only toggle) + // disable the video track on the shared controller, and that state + // sticks. Entering detail = user wants to watch the video — wipe the + // override and let DASH pick the highest renderable video again. + LaunchedEffect(controller, streamUrl) { + controller?.let { + it.trackSelectionParameters = TrackSelectionParameters.Builder(context).build() + } + } + // Swipe-down to minimize. The drag handle is the inline player surface // (the 16:9 box at the top); we translate the WHOLE page with it so the // motion reads as "the video is being tucked away" rather than "this @@ -127,6 +140,25 @@ fun VideoDetailScreen( val dismissThresholdPx = with(density) { 140.dp.toPx() } val dragY = remember { Animatable(0f) } val scope = rememberCoroutineScope() + val playerDragModifier = Modifier.pointerInput(Unit) { + detectVerticalDragGestures( + onDragEnd = { + if (dragY.value > dismissThresholdPx) { + onMinimize() + } else { + scope.launch { dragY.animateTo(0f, spring()) } + } + }, + onDragCancel = { + scope.launch { dragY.animateTo(0f, spring()) } + }, + onVerticalDrag = { _, dy -> + scope.launch { + dragY.snapTo((dragY.value + dy).coerceAtLeast(0f)) + } + }, + ) + } Column( modifier = Modifier @@ -141,49 +173,27 @@ fun VideoDetailScreen( scaleY = s } .statusBarsPadding() - .verticalScroll(rememberScrollState()) - .padding(16.dp), + .verticalScroll(rememberScrollState()), ) { when { state.loading -> Box( - modifier = Modifier.fillMaxWidth().padding(top = 64.dp), + modifier = Modifier + .fillMaxWidth() + .padding(top = 64.dp), contentAlignment = Alignment.Center, ) { CircularProgressIndicator() } state.error != null -> Text( "error: ${state.error}", color = MaterialTheme.colorScheme.error, + modifier = Modifier.padding(16.dp), ) else -> { val d = state.detail ?: return@Column - // Drag-to-minimize gesture lives on the player surface - // itself — same pattern YouTube/NewPipe use. Outside the - // 16:9 box the page scrolls normally, so the drag never - // fights with description scrolling. - val playerDragModifier = Modifier.pointerInput(Unit) { - detectVerticalDragGestures( - onDragEnd = { - if (dragY.value > dismissThresholdPx) { - onMinimize() - } else { - scope.launch { - dragY.animateTo(0f, spring()) - } - } - }, - onDragCancel = { - scope.launch { dragY.animateTo(0f, spring()) } - }, - onVerticalDrag = { _, dy -> - scope.launch { - dragY.snapTo( - (dragY.value + dy).coerceAtLeast(0f), - ) - } - }, - ) - } + // Player surface — edge-to-edge, NewPipe/YouTube style. + // Lives outside the 16dp horizontal padding so the + // thumbnail fills the screen width with no gutters. if (inlinePlaying) { InlinePlayer( streamUrl = streamUrl, @@ -194,7 +204,6 @@ fun VideoDetailScreen( modifier = Modifier .fillMaxWidth() .aspectRatio(16f / 9f) - .clip(RoundedCornerShape(8.dp)) .background(Color.Black) .then(playerDragModifier), ) @@ -203,7 +212,7 @@ fun VideoDetailScreen( modifier = Modifier .fillMaxWidth() .aspectRatio(16f / 9f) - .clip(RoundedCornerShape(8.dp)) + .background(Color.Black) .clickable { inlinePlaying = true } .then(playerDragModifier), contentAlignment = Alignment.Center, @@ -229,8 +238,9 @@ fun VideoDetailScreen( } } } - Spacer(modifier = Modifier.height(12.dp)) - + // Everything below the player gets the side gutters + // back; player itself remains edge-to-edge. + Column(modifier = Modifier.padding(horizontal = 16.dp, vertical = 12.dp)) { Text( text = d.title, style = MaterialTheme.typography.titleLarge, @@ -492,8 +502,14 @@ fun VideoDetailScreen( }, ) } + } // close inner Column (padded body) } } + // Leave room at the bottom for the system nav bar so the last + // related video doesn't tuck under the gesture pill / 3-button + // nav. Compose's `navigationBarsPadding` would push the whole + // surface up; we want the scroll to extend past it instead. + Spacer(modifier = Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars)) } } diff --git a/strawApp/src/main/res/drawable/ic_launcher_background.xml b/strawApp/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..7d786ca64 --- /dev/null +++ b/strawApp/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,5 @@ + + + + diff --git a/strawApp/src/main/res/drawable/ic_launcher_foreground.xml b/strawApp/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 000000000..9bb57a385 --- /dev/null +++ b/strawApp/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/strawApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/strawApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..6b78462d6 --- /dev/null +++ b/strawApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/strawApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/strawApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..6b78462d6 --- /dev/null +++ b/strawApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/strawApp/src/main/res/mipmap-hdpi/ic_launcher.png b/strawApp/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f3906f9b9faa3c8659b6a600e32c9e5be5082d GIT binary patch literal 987 zcmV<110?*3P)7l-Tg>9vTe6WkVN8(H0c9I6g?ebxRiL%8zo(_9pIhm} z^X(^j==1UmD17fK@jqfS`T=lZiJ1*c%xqXaup5{izjK|d)=Q~;IrXc- z)?hm~Ow1b#y2kmunX;0Bx3?USnKCjTA zu$BP{(p$_o8FqM_a(DSwo7p@B3DR4POenoJO1pXPqz)3KtC)RgFmNfX(11?Dj6*_a zvC#B5vdJbk*jnX#0V+#ZF>*%fwZW_(@NFI{3zt}QxO2$4qr8^lbKX!||v><6<%mn~r_kBIvFD z+egen4%M?Xzccr z$lWWhi_*_&h*fU~1}uU*^lHp;HOqjf7QQun0GqweF!=aw${Blp^FhbN0774! zD@rE@s6P8bOaNA|kHiF^^!iQ=3L}rWd$N*Rd$RcA%l3-Ke)>oZN=X2h7?MAS>IPOx z0GF7;iH#H-N&>jV2K_GO2KbZ&u!s$Kop$-E!d5Nw_}#PjOCNDWi(nB8&W!i`jS1V9 zmE7j~=TA6trC<>YO?RFGNOxj%GR^ZCmc4%hFXoK}T_KNn*|E9gd7fU+f`@hkFD8~M zd+wLneY#OT0T1m4SWGNczGOboT&24K;92iqo&>f#u~ga9s#R~6cJi=^asZ3zP^wf3 zq?kUXN|iv0g%U9xN|h=B6GI4fPhV1?N|h=B6Z1`m2fTWeDpdj|rd+B#+RZ_gDpdj| zcARC{Oi^yFq~~ix0BnNJE$`))_iO`p??fm-jrysxkqKL>R0;6Pqut=jseCz=ClE0- z>i1t5@lB3Y(?!5irAma_zeSEVxB$t@-P4Z002ov JPDHLkV1jmc(98e; literal 0 HcmV?d00001 diff --git a/strawApp/src/main/res/mipmap-hdpi/ic_launcher_round.png b/strawApp/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f3906f9b9faa3c8659b6a600e32c9e5be5082d GIT binary patch literal 987 zcmV<110?*3P)7l-Tg>9vTe6WkVN8(H0c9I6g?ebxRiL%8zo(_9pIhm} z^X(^j==1UmD17fK@jqfS`T=lZiJ1*c%xqXaup5{izjK|d)=Q~;IrXc- z)?hm~Ow1b#y2kmunX;0Bx3?USnKCjTA zu$BP{(p$_o8FqM_a(DSwo7p@B3DR4POenoJO1pXPqz)3KtC)RgFmNfX(11?Dj6*_a zvC#B5vdJbk*jnX#0V+#ZF>*%fwZW_(@NFI{3zt}QxO2$4qr8^lbKX!||v><6<%mn~r_kBIvFD z+egen4%M?Xzccr z$lWWhi_*_&h*fU~1}uU*^lHp;HOqjf7QQun0GqweF!=aw${Blp^FhbN0774! zD@rE@s6P8bOaNA|kHiF^^!iQ=3L}rWd$N*Rd$RcA%l3-Ke)>oZN=X2h7?MAS>IPOx z0GF7;iH#H-N&>jV2K_GO2KbZ&u!s$Kop$-E!d5Nw_}#PjOCNDWi(nB8&W!i`jS1V9 zmE7j~=TA6trC<>YO?RFGNOxj%GR^ZCmc4%hFXoK}T_KNn*|E9gd7fU+f`@hkFD8~M zd+wLneY#OT0T1m4SWGNczGOboT&24K;92iqo&>f#u~ga9s#R~6cJi=^asZ3zP^wf3 zq?kUXN|iv0g%U9xN|h=B6GI4fPhV1?N|h=B6Z1`m2fTWeDpdj|rd+B#+RZ_gDpdj| zcARC{Oi^yFq~~ix0BnNJE$`))_iO`p??fm-jrysxkqKL>R0;6Pqut=jseCz=ClE0- z>i1t5@lB3Y(?!5irAma_zeSEVxB$t@-P4Z002ov JPDHLkV1jmc(98e; literal 0 HcmV?d00001 diff --git a/strawApp/src/main/res/mipmap-mdpi/ic_launcher.png b/strawApp/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..fcfab8700211002e656f1e323500fa314802beda GIT binary patch literal 740 zcmV^nG9!0O7 z^empd@1Q499Ak$KREA8LAj~gh2r|Kq&SioYOI^FQUDGuwZPzquJOpaZDru6pi--JA z%|m$dj6(B|~0+z1PKXb)z`{fkXWe3Qwj0pKri>Y;K#qGWeqwb)m`woyn-bg@N5(J7& zci#af2=ls~{(ec3Nm2E~sy-lJ^w{zMP>Am;Y61;}AP5nbg7|u)^dqYe2tPAuaoQwB ziri~9czr#(*T+AxSsp!y?c_{2Sy>RnhYs>2o5+iPTrL3M$ zjIoL6%(XjHW0PIp4}W58&)#AF;p@ePwdHz)?Kud6P0QG!#qroa|m|~o?5GHw-@PTo-H3~2dOz2J)MU` z2+IRhfDjW(g#3~sS7S?wygs1*vqNUPRZ^t3(*mz-n1=@HJj`#wd0#*UsPHvi+{tjY zKSy6BOIPy@ERf=FS&_^X$qa%bj^Vz(aUVW5P}ov4%>OHh@jtap43Jz5kX#IqTz&(M WZvJ&>7YL020000^nG9!0O7 z^empd@1Q499Ak$KREA8LAj~gh2r|Kq&SioYOI^FQUDGuwZPzquJOpaZDru6pi--JA z%|m$dj6(B|~0+z1PKXb)z`{fkXWe3Qwj0pKri>Y;K#qGWeqwb)m`woyn-bg@N5(J7& zci#af2=ls~{(ec3Nm2E~sy-lJ^w{zMP>Am;Y61;}AP5nbg7|u)^dqYe2tPAuaoQwB ziri~9czr#(*T+AxSsp!y?c_{2Sy>RnhYs>2o5+iPTrL3M$ zjIoL6%(XjHW0PIp4}W58&)#AF;p@ePwdHz)?Kud6P0QG!#qroa|m|~o?5GHw-@PTo-H3~2dOz2J)MU` z2+IRhfDjW(g#3~sS7S?wygs1*vqNUPRZ^t3(*mz-n1=@HJj`#wd0#*UsPHvi+{tjY zKSy6BOIPy@ERf=FS&_^X$qa%bj^Vz(aUVW5P}ov4%>OHh@jtap43Jz5kX#IqTz&(M WZvJ&>7YL0200000Xz-GbXQ>yrg-Vm!V==>xyy4 z@-mybi}KbaA}5_>8KE4C8p5em$a2?z_ndpqJW!&e4q3D^(i__a@JJWR|fz< zljwr?QfTncR8v;e*sa-kg{X$QIpcwypTQ9~Facl}K*ZyG(%38P;dq#n!Q;q@lAsGP ztS#@wONur;`pR2)&Lx#1EXc&f2#PDChpZ>V5B@Ve4^Vx^_4~D)8}dA$kEHB>+<1e9>(dZk%K`k$d5D2*+=z8msEY} z5XatKCbKkX0#2<14muB2KBT6!KQH?~ZTk8Yg`eSoH0xxpJy)>RCvRP|Yn~B) z(0($#=~~ZeM>%p^4-H{;z7FN|#9t$>W?_FL9L!*JR|-#g5oUnp{giZ*9Dx@8NCIKC zt>|)Lxvps!doIcM8-v^5%1LIRY~HOK%$|3Q^)sPPzK#ol%X^ zOPzVJTTU9N!He3_g4qMU`%nnCV*#{m??28@ADB?((m=REgIhl|=Kh{)3MXWxuJtu? zW9H>w{RnU5^d$)ixaos|qTp=lgpQG5u_~rS2zpP$FWFZBju!bCqs~D{qYivhNVK zx0MCpz3k9=9f6d>_vJ76NaO$?R98Rpm3s07W^uhEp@budu#7QR=7XpoA1<&wgb&hJ z`$Q8FPo+GHF2<#qR2njAnKD1+%Xw{%F51Zjt(#c4rg}_zTazIJ_tw zU|pbenil%&s*ngZ3BRas zX;U$L5qZXS#(jmf|Tpi9;9DTOiCg>CwU z2X~Ens)z{Cz-aCsl+;0>Woj?#Id-zR{=zUeOTLJiNJ5BT+XUa@h<4yZ2s9J|>g+%D zFbBOO(V%WN=DsUWba9~4JU6WTx$YRoKIM!ifT|5EKdUnaGhF7X0uBf43&7`a*XLVhFX3qD zR^{hh4x$le`2F72_mwGePc+ah(=%HK5k-u(G3=fE2id5Xw#KjO48zwG+E=WDY{=EBeCH#BQv%_K>S}{$;dE@O|?^T0}E9u zZ-|fk&op8;-aLY|zNNFwIvbd5Xb#rn(y<-p2E^`vaq=(9Y`_v&I!mK_S)mF#0z@Yg JUg#K1`v-WEY~KI? literal 0 HcmV?d00001 diff --git a/strawApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/strawApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..717e67c8cf3c1db79d750e434ede4f7e94fcde80 GIT binary patch literal 1355 zcmaKseKgYx7{`BDGUGOd9P={w$jhjfHj7?nnlUnY>0Xz-GbXQ>yrg-Vm!V==>xyy4 z@-mybi}KbaA}5_>8KE4C8p5em$a2?z_ndpqJW!&e4q3D^(i__a@JJWR|fz< zljwr?QfTncR8v;e*sa-kg{X$QIpcwypTQ9~Facl}K*ZyG(%38P;dq#n!Q;q@lAsGP ztS#@wONur;`pR2)&Lx#1EXc&f2#PDChpZ>V5B@Ve4^Vx^_4~D)8}dA$kEHB>+<1e9>(dZk%K`k$d5D2*+=z8msEY} z5XatKCbKkX0#2<14muB2KBT6!KQH?~ZTk8Yg`eSoH0xxpJy)>RCvRP|Yn~B) z(0($#=~~ZeM>%p^4-H{;z7FN|#9t$>W?_FL9L!*JR|-#g5oUnp{giZ*9Dx@8NCIKC zt>|)Lxvps!doIcM8-v^5%1LIRY~HOK%$|3Q^)sPPzK#ol%X^ zOPzVJTTU9N!He3_g4qMU`%nnCV*#{m??28@ADB?((m=REgIhl|=Kh{)3MXWxuJtu? zW9H>w{RnU5^d$)ixaos|qTp=lgpQG5u_~rS2zpP$FWFZBju!bCqs~D{qYivhNVK zx0MCpz3k9=9f6d>_vJ76NaO$?R98Rpm3s07W^uhEp@budu#7QR=7XpoA1<&wgb&hJ z`$Q8FPo+GHF2<#qR2njAnKD1+%Xw{%F51Zjt(#c4rg}_zTazIJ_tw zU|pbenil%&s*ngZ3BRas zX;U$L5qZXS#(jmf|Tpi9;9DTOiCg>CwU z2X~Ens)z{Cz-aCsl+;0>Woj?#Id-zR{=zUeOTLJiNJ5BT+XUa@h<4yZ2s9J|>g+%D zFbBOO(V%WN=DsUWba9~4JU6WTx$YRoKIM!ifT|5EKdUnaGhF7X0uBf43&7`a*XLVhFX3qD zR^{hh4x$le`2F72_mwGePc+ah(=%HK5k-u(G3=fE2id5Xw#KjO48zwG+E=WDY{=EBeCH#BQv%_K>S}{$;dE@O|?^T0}E9u zZ-|fk&op8;-aLY|zNNFwIvbd5Xb#rn(y<-p2E^`vaq=(9Y`_v&I!mK_S)mF#0z@Yg JUg#K1`v-WEY~KI? literal 0 HcmV?d00001 diff --git a/strawApp/src/main/res/mipmap-xxhdpi/ic_launcher.png b/strawApp/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..455be2a69ba7453ef56a9f1e6f1f46b9546bb285 GIT binary patch literal 1809 zcmb7Fc{m%`7FR@KYrW1`Dos_HMy;t1QktN)+7hLf1|!9nmYGS=;ZY5mSh`r+YG@*K z(T0qsG`6ZG!U!hHH`J1n7A@6@SfZpU;-xcx%s=ms_rCj``}^+i-gEA`_ndprwE&ct zwuYgGl9H0P_bK;41>XEBAZ0~=!8CbU0cz2{UhYaeU)%lms$vDf^LBSVlS&s0`2?`X z{?5eOcN3`n&ahWq@SXS$|bjxWS%7Qs*-fYFUj}Eu&s&UBkDe?q-4tof~oV=#B1g7{*jx*SB`v!8Z>|T}gFLBxFsdz-B zO|a@#U~x!1e1GAh?VTtNEp|7<%;&S=PHmLeq#$Pf)b!=-o5#ZzhI2CR<)y=` z|5|~YpHHg9IEVSG)AP-S)kM-X+GsbzeO8{Y*Z9(C1Q zY@GP5$cVT;(i_F$tl(S6;ligg7BN#h?sAV8DX9a9tu|v#p5=FX9NEfRilFOaB@r)& z(t=?QrQs*{<;Rs;MbB>6WkkIE`H??byx({?Z-JebN0eWKNzp-}DGlG~?3rvZ>BoUe z#H*eX`CzTc=gQ`XY73pxN>s6_LH(Vu2p>zN6=C~k=1O(Lm}q78hmJeQ6Ghk5O@m?c zzy4cNDAn__w^J9*C;9GGi@EfYF$xw`>4c^yKhowI45ieSC^yTJ-M$*)B;lSE-NtLn5rU6 z$H=&*ve1$zG!=jwkKr41`2fL`^I5iJ!{?lZ12u4<>@!*bkuu6Wm(&Qb(skovvZ&V| zV9&dtdIIW7r>mmP3}|QaS>zd?o`ah61zPH|;|4)T`$#ey$+F+M6-G1+aPdWCN1_~S z(ZWG)Zuqt_4g9!@5TNvj;_cGuVtM;AHY3yr4FkNJzz8m58x(P1k>6nAbZFRiJnI!= zQZw_%$F3Jh9(qs+uS39?8(CXv4l&F&x%<%UUn)_L#_^dN*A+K217bKeN`lLq_db|V zXcuB39j9tVID}=mh4x9ECqgDgt+_i|pqL_IXVSKr6vWT)A(!n#2qcJ9EY8%IDcZwc^Eppc8N`J$}yi`PZ%V2i`L& z64u6_S(^4bYfh;)w<^Uy9q-B5EnpVMRWDiq|N9MYpfPjXQx?4TP>R$|6y|-vR#}u>v^fg(p-wsljQcr z&I-j*7O+(xty?=qe_#(Gzei5B{ms&_{xA8~>j{;aePDVa02lpc`rw4Z!@${QLKp%# ntdd|P@;?86eEk2dOl$!s6W1};0Z$thHBQOf1LgkoB$o6aJD_A_ literal 0 HcmV?d00001 diff --git a/strawApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/strawApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..455be2a69ba7453ef56a9f1e6f1f46b9546bb285 GIT binary patch literal 1809 zcmb7Fc{m%`7FR@KYrW1`Dos_HMy;t1QktN)+7hLf1|!9nmYGS=;ZY5mSh`r+YG@*K z(T0qsG`6ZG!U!hHH`J1n7A@6@SfZpU;-xcx%s=ms_rCj``}^+i-gEA`_ndprwE&ct zwuYgGl9H0P_bK;41>XEBAZ0~=!8CbU0cz2{UhYaeU)%lms$vDf^LBSVlS&s0`2?`X z{?5eOcN3`n&ahWq@SXS$|bjxWS%7Qs*-fYFUj}Eu&s&UBkDe?q-4tof~oV=#B1g7{*jx*SB`v!8Z>|T}gFLBxFsdz-B zO|a@#U~x!1e1GAh?VTtNEp|7<%;&S=PHmLeq#$Pf)b!=-o5#ZzhI2CR<)y=` z|5|~YpHHg9IEVSG)AP-S)kM-X+GsbzeO8{Y*Z9(C1Q zY@GP5$cVT;(i_F$tl(S6;ligg7BN#h?sAV8DX9a9tu|v#p5=FX9NEfRilFOaB@r)& z(t=?QrQs*{<;Rs;MbB>6WkkIE`H??byx({?Z-JebN0eWKNzp-}DGlG~?3rvZ>BoUe z#H*eX`CzTc=gQ`XY73pxN>s6_LH(Vu2p>zN6=C~k=1O(Lm}q78hmJeQ6Ghk5O@m?c zzy4cNDAn__w^J9*C;9GGi@EfYF$xw`>4c^yKhowI45ieSC^yTJ-M$*)B;lSE-NtLn5rU6 z$H=&*ve1$zG!=jwkKr41`2fL`^I5iJ!{?lZ12u4<>@!*bkuu6Wm(&Qb(skovvZ&V| zV9&dtdIIW7r>mmP3}|QaS>zd?o`ah61zPH|;|4)T`$#ey$+F+M6-G1+aPdWCN1_~S z(ZWG)Zuqt_4g9!@5TNvj;_cGuVtM;AHY3yr4FkNJzz8m58x(P1k>6nAbZFRiJnI!= zQZw_%$F3Jh9(qs+uS39?8(CXv4l&F&x%<%UUn)_L#_^dN*A+K217bKeN`lLq_db|V zXcuB39j9tVID}=mh4x9ECqgDgt+_i|pqL_IXVSKr6vWT)A(!n#2qcJ9EY8%IDcZwc^Eppc8N`J$}yi`PZ%V2i`L& z64u6_S(^4bYfh;)w<^Uy9q-B5EnpVMRWDiq|N9MYpfPjXQx?4TP>R$|6y|-vR#}u>v^fg(p-wsljQcr z&I-j*7O+(xty?=qe_#(Gzei5B{ms&_{xA8~>j{;aePDVa02lpc`rw4Z!@${QLKp%# ntdd|P@;?86eEk2dOl$!s6W1};0Z$thHBQOf1LgkoB$o6aJD_A_ literal 0 HcmV?d00001 diff --git a/strawApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/strawApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..edd54e2eb2689cbca5a3480edd8988a69be8cf5e GIT binary patch literal 2477 zcmcImi9gg^6gNW|TO<(~M)rzcmSmkDO~%@gl&ob!6U8eA6EkQ*XtG2jj246B2}AZN z$rdvrGMHpbWQiI(^M2lY|HAv+&%NhXml&*yXQ_uLcja0)FZEGNvz$0ufOg*pw& zH`@~i1y@ePx&tV7dfTE=e7x-i3ZmW6kpO zl`0{=#zaMlK%v?&SQX-b00~IqJZ-QA!LR@IF>mDap4DK4T!1{aa{BHd`ja~3wKyPI zNO4!$OMX5&#ePg(r=1T!f3Uc$*>yd?+PE4Puc{zHijTP*|n>4;@%gs(`gMM%gkj4ZSD4I=cSX1c@fQxU*$_kWb98^`eGL9Y^rf?$%d|b zQy5|>Q-4(IgDTGN3Xk&?-tP}f$|7gB_;tnML<`^;s(Yacbq`Ogr02zjawmBb55y?%>nsSXEqeBw$rp<9We|w7FEE`QyGwG? z`%pETt2VH>-qzxeT|sGhT2~-d3l_I`b-K{eP^);hhdF~3Xi||7Qx$0{${#4RGGKWL zLXNg|U|tY0!zLs+s60_mAe4E$R7k`5)j%O3G9Og2&)(5>D||+V&D;T-BLLu00P&g*8MPm}hY3w`y@jWNCNkh7Lr6Z&E)=@C%<_R1h%EN@^qhM*W}l6x zB}h1^!z&eT*trpuM$LfF=0NtV08`%tTxQK-2I;(sRM%!8Z{<)4r+h(R-HjaL?1?PM zD5C3fCZ0q!=xyFXZjLW2Zq0}fSFJmzxBLn)#ly{!wLQ_X(6YMoE)nx+hHqQk#_Wyq zfv}1iv~f>Jj!0{_zB1|fqb%AN!puS?4#pr5qS5?i!L0@AZsd3p7-G(@*6Ti&_5Fky zR6%jeKBZjUS=oy}j^g{(*K}VdDqLalhBjD?Lq%t>Cx-}$yP-9W-gtr|h3G!GhMmHu zB%=O3?Q>TlAs3~sEe~8XZH7TY-cplu-N;8R0J|`q?uFSF$p=)%mDv0q~m-B}#Ph?LMk3pcmBC4ugml7>Fb=Hkhp8s`{@>(ZSKZE9P{k zAs)wT_~tTIG3(gQ&36Fo@+(-{{T&c7;gRlA1Y%hz69m=P--8dsTH%t%3#FsWo?|tOXASQA zOQF?;DExBO`f_sj@kG&^MtzXf!TjTT;a2+{5OOxs zmL(g91gBhnqmOi?2MiB(S`S3&{7QYn8(qd5gP~4+2wRUxu7h~Ennp5K$aw>VcL7HG z!^)gq&Sg}SZI4~w2^L0>zcR#?+?r-xr@8s08+Odi=xf0d>odTI%hJ@DE@s-T+mJ$# z#@xqr-Gu*WEUzM}p`R*(iVGw)|M(oDA{sY7N5ykbbHkkSvo*!oP~oJeyEGlJF67zw zG%Zf`UJ}u${log^uR2_2)kaUWJEYLYH)mzJ9*ZWlQ({$`>Z4-RtNpc*+%Yfr*WY=0?*eXDaLjNtnx!AHC;CxEs_7lbq|yAaDwOA>{IG=zVNUUMw2BLc=wXB!2j5@XTVydrPZ*^Seh zdq()D-}hlxW;BgQ_-$Bw7?EZJMlYvY=(?)k$ivDF>*cK96EbM(bTdvlE$%_Uv+DJQ z@^;&ZwU~!LsqL5bGbhA~>z-WQysDaYFG;F7A70fyvB}XDb0EE24~WLzRs?s34jDuj%-& cpV<(feB~KiITJAk_FsI~Cr_dNvbYfQHxo3P)&Kwi literal 0 HcmV?d00001 diff --git a/strawApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/strawApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..edd54e2eb2689cbca5a3480edd8988a69be8cf5e GIT binary patch literal 2477 zcmcImi9gg^6gNW|TO<(~M)rzcmSmkDO~%@gl&ob!6U8eA6EkQ*XtG2jj246B2}AZN z$rdvrGMHpbWQiI(^M2lY|HAv+&%NhXml&*yXQ_uLcja0)FZEGNvz$0ufOg*pw& zH`@~i1y@ePx&tV7dfTE=e7x-i3ZmW6kpO zl`0{=#zaMlK%v?&SQX-b00~IqJZ-QA!LR@IF>mDap4DK4T!1{aa{BHd`ja~3wKyPI zNO4!$OMX5&#ePg(r=1T!f3Uc$*>yd?+PE4Puc{zHijTP*|n>4;@%gs(`gMM%gkj4ZSD4I=cSX1c@fQxU*$_kWb98^`eGL9Y^rf?$%d|b zQy5|>Q-4(IgDTGN3Xk&?-tP}f$|7gB_;tnML<`^;s(Yacbq`Ogr02zjawmBb55y?%>nsSXEqeBw$rp<9We|w7FEE`QyGwG? z`%pETt2VH>-qzxeT|sGhT2~-d3l_I`b-K{eP^);hhdF~3Xi||7Qx$0{${#4RGGKWL zLXNg|U|tY0!zLs+s60_mAe4E$R7k`5)j%O3G9Og2&)(5>D||+V&D;T-BLLu00P&g*8MPm}hY3w`y@jWNCNkh7Lr6Z&E)=@C%<_R1h%EN@^qhM*W}l6x zB}h1^!z&eT*trpuM$LfF=0NtV08`%tTxQK-2I;(sRM%!8Z{<)4r+h(R-HjaL?1?PM zD5C3fCZ0q!=xyFXZjLW2Zq0}fSFJmzxBLn)#ly{!wLQ_X(6YMoE)nx+hHqQk#_Wyq zfv}1iv~f>Jj!0{_zB1|fqb%AN!puS?4#pr5qS5?i!L0@AZsd3p7-G(@*6Ti&_5Fky zR6%jeKBZjUS=oy}j^g{(*K}VdDqLalhBjD?Lq%t>Cx-}$yP-9W-gtr|h3G!GhMmHu zB%=O3?Q>TlAs3~sEe~8XZH7TY-cplu-N;8R0J|`q?uFSF$p=)%mDv0q~m-B}#Ph?LMk3pcmBC4ugml7>Fb=Hkhp8s`{@>(ZSKZE9P{k zAs)wT_~tTIG3(gQ&36Fo@+(-{{T&c7;gRlA1Y%hz69m=P--8dsTH%t%3#FsWo?|tOXASQA zOQF?;DExBO`f_sj@kG&^MtzXf!TjTT;a2+{5OOxs zmL(g91gBhnqmOi?2MiB(S`S3&{7QYn8(qd5gP~4+2wRUxu7h~Ennp5K$aw>VcL7HG z!^)gq&Sg}SZI4~w2^L0>zcR#?+?r-xr@8s08+Odi=xf0d>odTI%hJ@DE@s-T+mJ$# z#@xqr-Gu*WEUzM}p`R*(iVGw)|M(oDA{sY7N5ykbbHkkSvo*!oP~oJeyEGlJF67zw zG%Zf`UJ}u${log^uR2_2)kaUWJEYLYH)mzJ9*ZWlQ({$`>Z4-RtNpc*+%Yfr*WY=0?*eXDaLjNtnx!AHC;CxEs_7lbq|yAaDwOA>{IG=zVNUUMw2BLc=wXB!2j5@XTVydrPZ*^Seh zdq()D-}hlxW;BgQ_-$Bw7?EZJMlYvY=(?)k$ivDF>*cK96EbM(bTdvlE$%_Uv+DJQ z@^;&ZwU~!LsqL5bGbhA~>z-WQysDaYFG;F7A70fyvB}XDb0EE24~WLzRs?s34jDuj%-& cpV<(feB~KiITJAk_FsI~Cr_dNvbYfQHxo3P)&Kwi literal 0 HcmV?d00001