From e31072002150b048b6ae8bd5c93f059800ec0307 Mon Sep 17 00:00:00 2001 From: George Polak Date: Sat, 23 May 2026 18:27:32 -0400 Subject: [PATCH 1/2] demo --- demos/stack-nav/build.gradle.kts | 33 ++++ demos/stack-nav/src/main/AndroidManifest.xml | 18 ++ .../com/uber/rib/stacknav/RootActivity.kt | 32 ++++ .../uber/rib/stacknav/root/RootInteractor.kt | 48 ++++++ .../com/uber/rib/stacknav/root/RootRouter.kt | 90 ++++++++++ .../com/uber/rib/stacknav/root/RootView.kt | 22 +++ .../com/uber/rib/stacknav/root/ScreenState.kt | 23 +++ .../stacknav/root/screen/ScreenInteractor.kt | 47 ++++++ .../rib/stacknav/root/screen/ScreenRouter.kt | 24 +++ .../rib/stacknav/root/screen/ScreenView.kt | 156 ++++++++++++++++++ .../res/drawable-hdpi/ub__ic_launcher.png | Bin 0 -> 4865 bytes .../res/drawable-mdpi/ub__ic_launcher.png | Bin 0 -> 4341 bytes .../res/drawable-xhdpi/ub__ic_launcher.png | Bin 0 -> 5299 bytes .../res/drawable-xxhdpi/ub__ic_launcher.png | Bin 0 -> 6304 bytes .../res/drawable-xxxhdpi/ub__ic_launcher.png | Bin 0 -> 7263 bytes .../stack-nav/src/main/res/values/strings.xml | 3 + .../stack-nav/src/main/res/values/styles.xml | 3 + settings.gradle | 1 + 18 files changed, 500 insertions(+) create mode 100644 demos/stack-nav/build.gradle.kts create mode 100644 demos/stack-nav/src/main/AndroidManifest.xml create mode 100644 demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/RootActivity.kt create mode 100644 demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/RootInteractor.kt create mode 100644 demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/RootRouter.kt create mode 100644 demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/RootView.kt create mode 100644 demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/ScreenState.kt create mode 100644 demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/screen/ScreenInteractor.kt create mode 100644 demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/screen/ScreenRouter.kt create mode 100644 demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/screen/ScreenView.kt create mode 100644 demos/stack-nav/src/main/res/drawable-hdpi/ub__ic_launcher.png create mode 100644 demos/stack-nav/src/main/res/drawable-mdpi/ub__ic_launcher.png create mode 100644 demos/stack-nav/src/main/res/drawable-xhdpi/ub__ic_launcher.png create mode 100644 demos/stack-nav/src/main/res/drawable-xxhdpi/ub__ic_launcher.png create mode 100644 demos/stack-nav/src/main/res/drawable-xxxhdpi/ub__ic_launcher.png create mode 100644 demos/stack-nav/src/main/res/values/strings.xml create mode 100644 demos/stack-nav/src/main/res/values/styles.xml diff --git a/demos/stack-nav/build.gradle.kts b/demos/stack-nav/build.gradle.kts new file mode 100644 index 000000000..d256a6854 --- /dev/null +++ b/demos/stack-nav/build.gradle.kts @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2025. Uber Technologies + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +plugins { + id("ribs.android.application") +} + +android { + namespace = "com.uber.rib.stacknav" + + defaultConfig { + applicationId = "com.uber.rib.stacknav" + targetSdk = 36 + } +} + +dependencies { + implementation(project(":libraries:rib-android")) + implementation(project(":libraries:rib-router-navigator")) + implementation(libs.androidx.appcompat) +} diff --git a/demos/stack-nav/src/main/AndroidManifest.xml b/demos/stack-nav/src/main/AndroidManifest.xml new file mode 100644 index 000000000..ecc1c4ada --- /dev/null +++ b/demos/stack-nav/src/main/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/RootActivity.kt b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/RootActivity.kt new file mode 100644 index 000000000..e13dce1ca --- /dev/null +++ b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/RootActivity.kt @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2025. Uber Technologies + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.uber.rib.stacknav + +import android.view.ViewGroup +import com.uber.rib.core.RibActivity +import com.uber.rib.core.ViewRouter +import com.uber.rib.stacknav.root.RootInteractor +import com.uber.rib.stacknav.root.RootRouter +import com.uber.rib.stacknav.root.RootView + +class RootActivity : RibActivity() { + + override fun createRouter(parentViewGroup: ViewGroup): ViewRouter<*, *> { + val rootView = RootView(this) + val interactor = RootInteractor() + return RootRouter(rootView, interactor) + } +} diff --git a/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/RootInteractor.kt b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/RootInteractor.kt new file mode 100644 index 000000000..6c2c28c29 --- /dev/null +++ b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/RootInteractor.kt @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2025. Uber Technologies + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.uber.rib.stacknav.root + +import com.uber.rib.core.Bundle +import com.uber.rib.core.EmptyPresenter +import com.uber.rib.core.Interactor +import com.uber.rib.stacknav.root.screen.ScreenInteractor + +/** + * Orchestrates the navigation stack. Pushes the first screen on start, and reacts to each + * screen's request to push the next one. + */ +class RootInteractor : + Interactor(EmptyPresenter()), ScreenInteractor.Listener { + + override fun didBecomeActive(savedInstanceState: Bundle?) { + super.didBecomeActive(savedInstanceState) + router.pushScreen(1) + } + + override fun onPushNextScreen(currentNumber: Int) { + if (currentNumber < MAX_SCREENS) { + router.pushScreen(currentNumber + 1) + } + } + + override fun onBackRequested() { + router.popScreen() + } + + companion object { + const val MAX_SCREENS = 5 + } +} diff --git a/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/RootRouter.kt b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/RootRouter.kt new file mode 100644 index 000000000..b0f5cdace --- /dev/null +++ b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/RootRouter.kt @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2025. Uber Technologies + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.uber.rib.stacknav.root + +import com.uber.rib.core.BasicViewRouter +import com.uber.rib.core.RouterNavigator +import com.uber.rib.core.StackRouterNavigator +import com.uber.rib.stacknav.root.screen.ScreenInteractor +import com.uber.rib.stacknav.root.screen.ScreenRouter +import com.uber.rib.stacknav.root.screen.ScreenView + +/** + * Manages the screen stack using [StackRouterNavigator]. Each call to [pushScreen] pushes a new + * [ScreenRouter] on top; [handleBackPress] pops it. + */ +class RootRouter( + view: RootView, + interactor: RootInteractor, +) : BasicViewRouter(view, interactor) { + + private val navigator: RouterNavigator = StackRouterNavigator(this) + + fun pushScreen(number: Int) { + val listener = interactor as ScreenInteractor.Listener + navigator.pushState( + ScreenState(number), + object : RouterNavigator.AttachTransition { + override fun buildRouter(): ScreenRouter { + val screenView = ScreenView(view.context, number, RootInteractor.MAX_SCREENS) + return ScreenRouter(screenView, ScreenInteractor(number, listener)) + } + + override fun willAttachToHost( + router: ScreenRouter, + previousState: ScreenState?, + newState: ScreenState, + isPush: Boolean, + ) { + view.addView( + router.view, + android.view.ViewGroup.LayoutParams( + android.view.ViewGroup.LayoutParams.MATCH_PARENT, + android.view.ViewGroup.LayoutParams.MATCH_PARENT, + ), + ) + } + }, + object : RouterNavigator.DetachTransition { + override fun willDetachFromHost( + router: ScreenRouter, + previousState: ScreenState, + newState: ScreenState?, + isPush: Boolean, + ) { + view.removeView(router.view) + } + }, + ) + } + + override fun handleBackPress(): Boolean { + if (navigator.size() > 1) { + navigator.popState() + return true + } + return false + } + + fun popScreen() { + navigator.popState() + } + + override fun willDetach() { + navigator.hostWillDetach() + super.willDetach() + } +} diff --git a/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/RootView.kt b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/RootView.kt new file mode 100644 index 000000000..a67d497c2 --- /dev/null +++ b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/RootView.kt @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2025. Uber Technologies + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.uber.rib.stacknav.root + +import android.content.Context +import android.widget.FrameLayout + +/** Container that holds whichever screen is currently on top of the stack. */ +class RootView(context: Context) : FrameLayout(context) diff --git a/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/ScreenState.kt b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/ScreenState.kt new file mode 100644 index 000000000..f33611e93 --- /dev/null +++ b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/ScreenState.kt @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2025. Uber Technologies + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.uber.rib.stacknav.root + +import com.uber.rib.core.RouterNavigatorState + +/** One entry in the navigation stack, identified by screen number. */ +data class ScreenState(val number: Int) : RouterNavigatorState { + override fun stateName() = "screen_$number" +} diff --git a/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/screen/ScreenInteractor.kt b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/screen/ScreenInteractor.kt new file mode 100644 index 000000000..72dd93e41 --- /dev/null +++ b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/screen/ScreenInteractor.kt @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2025. Uber Technologies + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.uber.rib.stacknav.root.screen + +import com.uber.rib.core.Bundle +import com.uber.rib.core.EmptyPresenter +import com.uber.rib.core.Interactor + +/** + * Interactor for a single screen. Wires the view's button to [Listener.onPushNextScreen] and + * cleans up on deactivation to avoid leaks. + */ +class ScreenInteractor( + private val screenNumber: Int, + private val listener: Listener, +) : Interactor(EmptyPresenter()) { + + interface Listener { + fun onPushNextScreen(currentNumber: Int) + fun onBackRequested() + } + + override fun didBecomeActive(savedInstanceState: Bundle?) { + super.didBecomeActive(savedInstanceState) + router.view.onNextClicked = { listener.onPushNextScreen(screenNumber) } + router.view.onBackClicked = { listener.onBackRequested() } + } + + override fun willResignActive() { + router.view.onNextClicked = null + router.view.onBackClicked = null + super.willResignActive() + } +} diff --git a/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/screen/ScreenRouter.kt b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/screen/ScreenRouter.kt new file mode 100644 index 000000000..3226e0298 --- /dev/null +++ b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/screen/ScreenRouter.kt @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2025. Uber Technologies + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.uber.rib.stacknav.root.screen + +import com.uber.rib.core.BasicViewRouter + +/** Leaf router for a single numbered screen. No children. */ +class ScreenRouter( + view: ScreenView, + interactor: ScreenInteractor, +) : BasicViewRouter(view, interactor) diff --git a/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/screen/ScreenView.kt b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/screen/ScreenView.kt new file mode 100644 index 000000000..54b6ad8b2 --- /dev/null +++ b/demos/stack-nav/src/main/kotlin/com/uber/rib/stacknav/root/screen/ScreenView.kt @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2025. Uber Technologies + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.uber.rib.stacknav.root.screen + +import android.content.Context +import android.graphics.Color +import android.graphics.Typeface +import android.util.TypedValue +import android.view.Gravity +import android.widget.Button +import android.widget.FrameLayout +import android.widget.LinearLayout +import android.widget.TextView +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat + +/** + * Full-screen view for a single stack entry. Includes a top navigation bar with an explicit back + * button (hidden on the root screen), the screen number in the centre, and a push button. + */ +class ScreenView(context: Context, screenNumber: Int, maxScreens: Int) : FrameLayout(context) { + + var onNextClicked: (() -> Unit)? = null + var onBackClicked: (() -> Unit)? = null + + private val screenColors = listOf( + Color.parseColor("#1565C0"), // deep blue + Color.parseColor("#2E7D32"), // deep green + Color.parseColor("#E65100"), // deep orange + Color.parseColor("#6A1B9A"), // deep purple + Color.parseColor("#B71C1C"), // deep red + ) + + init { + val bg = screenColors[(screenNumber - 1) % screenColors.size] + setBackgroundColor(bg) + + val dp = { n: Int -> + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, n.toFloat(), resources.displayMetrics).toInt() + } + + // ── Top navigation bar ────────────────────────────────────────────────── + val navBar = LinearLayout(context).apply { + orientation = LinearLayout.HORIZONTAL + gravity = Gravity.CENTER_VERTICAL + setBackgroundColor(Color.parseColor("#22000000")) + setPadding(dp(4), dp(4), dp(16), dp(4)) + } + + // Back button: a TextView styled as a tappable nav item + val backBtn = TextView(context).apply { + text = "‹ Back" + setTextColor(Color.WHITE) + setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f) + typeface = Typeface.DEFAULT_BOLD + setPadding(dp(12), dp(8), dp(16), dp(8)) + visibility = if (screenNumber > 1) VISIBLE else INVISIBLE + isClickable = true + isFocusable = true + setOnClickListener { onBackClicked?.invoke() } + background = null + } + + val navTitle = TextView(context).apply { + text = "Screen $screenNumber" + setTextColor(Color.WHITE) + setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f) + typeface = Typeface.DEFAULT_BOLD + gravity = Gravity.CENTER + layoutParams = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f) + } + + // Invisible placeholder mirrors the back button width so the title stays centred + val navEndSpacer = TextView(context).apply { + text = "‹ Back" + setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f) + setPadding(dp(12), dp(8), dp(16), dp(8)) + visibility = INVISIBLE + } + + navBar.addView(backBtn) + navBar.addView(navTitle) + navBar.addView(navEndSpacer) + + // ── Body content ──────────────────────────────────────────────────────── + val bigNumber = TextView(context).apply { + text = "$screenNumber" + setTextColor(Color.WHITE) + setTextSize(TypedValue.COMPLEX_UNIT_SP, 96f) + typeface = Typeface.DEFAULT_BOLD + gravity = Gravity.CENTER + } + + val depth = TextView(context).apply { + text = "Depth $screenNumber of $maxScreens" + setTextColor(Color.parseColor("#CCFFFFFF")) + setTextSize(TypedValue.COMPLEX_UNIT_SP, 16f) + gravity = Gravity.CENTER + setPadding(0, dp(4), 0, dp(40)) + } + + val nextButton = Button(context).apply { + text = if (screenNumber < maxScreens) "Push Screen ${screenNumber + 1} →" else "Stack is full" + isEnabled = screenNumber < maxScreens + setTextColor(Color.WHITE) + setBackgroundColor(Color.parseColor("#33FFFFFF")) + setPadding(dp(32), dp(12), dp(32), dp(12)) + setOnClickListener { onNextClicked?.invoke() } + } + + val body = LinearLayout(context).apply { + orientation = LinearLayout.VERTICAL + gravity = Gravity.CENTER + addView(bigNumber) + addView(depth) + addView(nextButton) + } + + // ── Root layout: nav bar pinned to top, body fills the rest ───────────── + val root = LinearLayout(context).apply { + orientation = LinearLayout.VERTICAL + addView(navBar, LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)) + addView(body, LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1f)) + } + + addView(root, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)) + + // Push nav-bar content below the status bar on edge-to-edge displays (Android 15+). + // The background colour already extends behind the status bar, which looks intentional. + ViewCompat.setOnApplyWindowInsetsListener(this) { _, insets -> + val statusBarHeight = insets.getInsets(WindowInsetsCompat.Type.statusBars()).top + navBar.setPadding(dp(4), statusBarHeight + dp(4), dp(16), dp(4)) + insets + } + } + + // Insets are dispatched once at window-attach time. Screens pushed later onto the stack + // are attached after that initial dispatch, so we re-request here to guarantee delivery. + override fun onAttachedToWindow() { + super.onAttachedToWindow() + ViewCompat.requestApplyInsets(this) + } +} diff --git a/demos/stack-nav/src/main/res/drawable-hdpi/ub__ic_launcher.png b/demos/stack-nav/src/main/res/drawable-hdpi/ub__ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..807d48f3cefbf400d6b0baf31f849d70e217bf70 GIT binary patch literal 4865 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 CD8AzW literal 0 HcmV?d00001 diff --git a/demos/stack-nav/src/main/res/drawable-mdpi/ub__ic_launcher.png b/demos/stack-nav/src/main/res/drawable-mdpi/ub__ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..73900cc8327b25d27d71424c1fe46b02876458d5 GIT binary patch literal 4341 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 literal 0 HcmV?d00001 diff --git a/demos/stack-nav/src/main/res/drawable-xhdpi/ub__ic_launcher.png b/demos/stack-nav/src/main/res/drawable-xhdpi/ub__ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4450b84e511195a14032c40040972a02508f9298 GIT binary patch literal 5299 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 literal 0 HcmV?d00001 diff --git a/demos/stack-nav/src/main/res/drawable-xxhdpi/ub__ic_launcher.png b/demos/stack-nav/src/main/res/drawable-xxhdpi/ub__ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..0039c30c2d18b95d95ba92b700c42186a6f73c2c GIT binary patch literal 6304 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 literal 0 HcmV?d00001 diff --git a/demos/stack-nav/src/main/res/drawable-xxxhdpi/ub__ic_launcher.png b/demos/stack-nav/src/main/res/drawable-xxxhdpi/ub__ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e35a057e7162cceddedc93b0656d1cc0739fdbce GIT binary patch literal 7263 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 ML!T(Tm$L}_7a)r@v;Y7A literal 0 HcmV?d00001 diff --git a/demos/stack-nav/src/main/res/values/strings.xml b/demos/stack-nav/src/main/res/values/strings.xml new file mode 100644 index 000000000..fa946e9a7 --- /dev/null +++ b/demos/stack-nav/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Stack Nav Demo + diff --git a/demos/stack-nav/src/main/res/values/styles.xml b/demos/stack-nav/src/main/res/values/styles.xml new file mode 100644 index 000000000..74c694c31 --- /dev/null +++ b/demos/stack-nav/src/main/res/values/styles.xml @@ -0,0 +1,3 @@ + +