From c5357031c4193c41b8f3a5fc1600abed9cf8b9d3 Mon Sep 17 00:00:00 2001 From: Kevin Block Date: Wed, 26 Feb 2025 13:27:09 -0500 Subject: [PATCH 1/6] Delete unused test files --- .../ExampleInstrumentedTest.java | 26 ------------------- .../material/ExampleInstrumentedTest.java | 26 ------------------- .../recyclerview/ExampleInstrumentedTest.java | 26 ------------------- .../savedstate/ExampleInstrumentedTest.kt | 22 ---------------- .../androidx/savedstate/ExampleUnitTest.kt | 16 ------------ .../view/ExampleInstrumentedTest.java | 26 ------------------- 6 files changed, 142 deletions(-) delete mode 100644 constraintlayout/src/androidTest/java/com/tunjid/androidx/constraintlayout/ExampleInstrumentedTest.java delete mode 100644 material/src/androidTest/java/com/tunjid/androidx/material/ExampleInstrumentedTest.java delete mode 100644 recyclerview/src/androidTest/java/com/tunjid/androidx/recyclerview/ExampleInstrumentedTest.java delete mode 100644 savedstate/src/androidTest/java/com/tunjid/androidx/savedstate/ExampleInstrumentedTest.kt delete mode 100644 savedstate/src/test/java/com/tunjid/androidx/savedstate/ExampleUnitTest.kt delete mode 100644 view/src/androidTest/java/com/tunjid/androidx/view/ExampleInstrumentedTest.java diff --git a/constraintlayout/src/androidTest/java/com/tunjid/androidx/constraintlayout/ExampleInstrumentedTest.java b/constraintlayout/src/androidTest/java/com/tunjid/androidx/constraintlayout/ExampleInstrumentedTest.java deleted file mode 100644 index 572f2f6d..00000000 --- a/constraintlayout/src/androidTest/java/com/tunjid/androidx/constraintlayout/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tunjid.androidx.constraintlayout; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.assertEquals; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("com.tunjid.androidx.constraintlayout.test", appContext.getPackageName()); - } -} diff --git a/material/src/androidTest/java/com/tunjid/androidx/material/ExampleInstrumentedTest.java b/material/src/androidTest/java/com/tunjid/androidx/material/ExampleInstrumentedTest.java deleted file mode 100644 index b3cd1357..00000000 --- a/material/src/androidTest/java/com/tunjid/androidx/material/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tunjid.androidx.material; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.assertEquals; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("com.tunjid.androidx.material.test", appContext.getPackageName()); - } -} diff --git a/recyclerview/src/androidTest/java/com/tunjid/androidx/recyclerview/ExampleInstrumentedTest.java b/recyclerview/src/androidTest/java/com/tunjid/androidx/recyclerview/ExampleInstrumentedTest.java deleted file mode 100644 index 394f7c4d..00000000 --- a/recyclerview/src/androidTest/java/com/tunjid/androidx/recyclerview/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tunjid.androidx.recyclerview; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.assertEquals; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("com.tunjid.androidx.recyclerview.test", appContext.getPackageName()); - } -} diff --git a/savedstate/src/androidTest/java/com/tunjid/androidx/savedstate/ExampleInstrumentedTest.kt b/savedstate/src/androidTest/java/com/tunjid/androidx/savedstate/ExampleInstrumentedTest.kt deleted file mode 100644 index 37e89ada..00000000 --- a/savedstate/src/androidTest/java/com/tunjid/androidx/savedstate/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.tunjid.androidx.savedstate - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.* -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.tunjid.androidx.savedstate.test", appContext.packageName) - } -} diff --git a/savedstate/src/test/java/com/tunjid/androidx/savedstate/ExampleUnitTest.kt b/savedstate/src/test/java/com/tunjid/androidx/savedstate/ExampleUnitTest.kt deleted file mode 100644 index 780350f9..00000000 --- a/savedstate/src/test/java/com/tunjid/androidx/savedstate/ExampleUnitTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.tunjid.androidx.savedstate - -import org.junit.Assert.* -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} diff --git a/view/src/androidTest/java/com/tunjid/androidx/view/ExampleInstrumentedTest.java b/view/src/androidTest/java/com/tunjid/androidx/view/ExampleInstrumentedTest.java deleted file mode 100644 index 2364857a..00000000 --- a/view/src/androidTest/java/com/tunjid/androidx/view/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tunjid.androidx.view; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.assertEquals; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("com.tunjid.androidx.view.test", appContext.getPackageName()); - } -} From e8c42597f924c77abfd20dce90db7fec673b9f90 Mon Sep 17 00:00:00 2001 From: Kevin Block Date: Wed, 26 Feb 2025 13:27:28 -0500 Subject: [PATCH 2/6] Bump runner versions --- build.gradle | 6 +++--- communications/build.gradle | 2 +- core/build.gradle | 8 ++++---- navigation/build.gradle | 6 +++--- recyclerview/build.gradle | 2 +- test/build.gradle | 10 +++++----- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/build.gradle b/build.gradle index a5d171b1..2f34660d 100644 --- a/build.gradle +++ b/build.gradle @@ -26,9 +26,9 @@ buildscript { constraintLayout = 'androidx.constraintlayout:constraintlayout:2.0.4' dynamicAnimations = 'androidx.dynamicanimation:dynamicanimation:1.1.0-alpha03' dynamicAnimationsKtx = 'androidx.dynamicanimation:dynamicanimation-ktx:1.0.0-alpha03' - espressoContrib = 'androidx.test.espresso:espresso-contrib:3.3.0' - espressoCore = 'androidx.test.espresso:espresso-core:3.3.0' - espressoIdlingResource = 'androidx.test.espresso.idling:idling-concurrent:3.3.0' + espressoContrib = 'androidx.test.espresso:espresso-contrib:3.5.1' + espressoCore = 'androidx.test.espresso:espresso-core:3.5.1' + espressoIdlingResource = 'androidx.test.espresso.idling:idling-concurrent:3.5.1' fragment = 'androidx.fragment:fragment:1.3.3' fragmentKtx = 'androidx.fragment:fragment-ktx:1.3.3' kotlin = "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/communications/build.gradle b/communications/build.gradle index acb62dae..ddbda4ce 100644 --- a/communications/build.gradle +++ b/communications/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation 'junit:junit:4.13.2' androidTestImplementation project(':test') - androidTestImplementation 'androidx.test:runner:1.3.0' + androidTestImplementation 'androidx.test:runner:1.5.0' } diff --git a/core/build.gradle b/core/build.gradle index e997fb5a..5677d367 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -47,11 +47,11 @@ dependencies { new Tuple2('com.google.android.material', 'material') ] - androidTestExclusions('androidx.test:core:1.3.0', exclusions) + androidTestExclusions('androidx.test:core:1.5.0', exclusions) androidTestExclusions('androidx.test.ext:junit:1.1.2', exclusions) - androidTestExclusions('androidx.test:runner:1.3.0', exclusions) - androidTestExclusions('androidx.test:rules:1.3.0', exclusions) - androidTestExclusions('androidx.test:runner:1.3.0', exclusions) + androidTestExclusions('androidx.test:runner:1.5.0', exclusions) + androidTestExclusions('androidx.test:rules:1.5.0', exclusions) + androidTestExclusions('androidx.test:runner:1.5.0', exclusions) androidTestExclusions('org.robolectric:robolectric:4.5.1', exclusions) androidTestExclusions('androidx.test.espresso:espresso-core:3.3.0', exclusions) androidTestExclusions('androidx.test.espresso:espresso-contrib:3.3.0', exclusions) diff --git a/navigation/build.gradle b/navigation/build.gradle index 6e63f5cf..c9a6653a 100644 --- a/navigation/build.gradle +++ b/navigation/build.gradle @@ -47,9 +47,9 @@ dependencies { ] androidTestExclusions('androidx.test.ext:junit:1.1.2', exclusions) - androidTestExclusions('androidx.test:runner:1.3.0', exclusions) - androidTestExclusions('androidx.test:rules:1.3.0', exclusions) - androidTestExclusions('androidx.test:runner:1.3.0', exclusions) + androidTestExclusions('androidx.test:runner:1.5.0', exclusions) + androidTestExclusions('androidx.test:rules:1.5.0', exclusions) + androidTestExclusions('androidx.test:runner:1.5.0', exclusions) androidTestExclusions('androidx.test.espresso:espresso-core:3.3.0', exclusions) androidTestExclusions('androidx.test.espresso:espresso-contrib:3.3.0', exclusions) androidTestExclusions('androidx.test.espresso:espresso-intents:3.3.0', exclusions) diff --git a/recyclerview/build.gradle b/recyclerview/build.gradle index da888b3c..d94633bf 100644 --- a/recyclerview/build.gradle +++ b/recyclerview/build.gradle @@ -25,6 +25,6 @@ dependencies { implementation project(':functions') testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test:runner:1.3.0' + androidTestImplementation 'androidx.test:runner:1.5.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' } \ No newline at end of file diff --git a/test/build.gradle b/test/build.gradle index 02379b19..c6e62037 100644 --- a/test/build.gradle +++ b/test/build.gradle @@ -35,9 +35,9 @@ dependencies { new Tuple2('com.google.android.material', 'material') ] - androidTestExclusions('androidx.test:runner:1.3.0', exclusions) - androidTestExclusions('androidx.test:rules:1.3.0', exclusions) - androidTestExclusions('androidx.test.espresso:espresso-core:3.3.0', exclusions) - androidTestExclusions('androidx.test.espresso:espresso-contrib:3.3.0', exclusions) - androidTestExclusions('androidx.test.espresso:espresso-intents:3.3.0', exclusions) + androidTestExclusions('androidx.test:runner:1.5.0', exclusions) + androidTestExclusions('androidx.test:rules:1.5.0', exclusions) + androidTestExclusions('androidx.test.espresso:espresso-core:3.5.1', exclusions) + androidTestExclusions('androidx.test.espresso:espresso-contrib:3.5.1', exclusions) + androidTestExclusions('androidx.test.espresso:espresso-intents:3.5.1', exclusions) } \ No newline at end of file From dd74c8521c1028efb77402a5898a06b01d7bc4c2 Mon Sep 17 00:00:00 2001 From: Kevin Block Date: Wed, 26 Feb 2025 13:27:40 -0500 Subject: [PATCH 3/6] Downgrade gradle due to protobuf issue --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2f34660d..8f94bfe7 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:7.3.0' + classpath 'com.android.tools.build:gradle:7.0.4' classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:2.0.0' classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" From 9556775368b5d828d154669b487b38b1ab665b9d Mon Sep 17 00:00:00 2001 From: Kevin Block Date: Wed, 26 Feb 2025 13:34:39 -0500 Subject: [PATCH 4/6] Test failure --- .../tunjid/androidx/navigation/MultiStackNavigatorTest.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/navigation/src/androidTest/java/com/tunjid/androidx/navigation/MultiStackNavigatorTest.kt b/navigation/src/androidTest/java/com/tunjid/androidx/navigation/MultiStackNavigatorTest.kt index 71092ac5..548ecea7 100644 --- a/navigation/src/androidTest/java/com/tunjid/androidx/navigation/MultiStackNavigatorTest.kt +++ b/navigation/src/androidTest/java/com/tunjid/androidx/navigation/MultiStackNavigatorTest.kt @@ -13,6 +13,7 @@ import org.junit.Assert.assertNotSame import org.junit.Assert.assertNull import org.junit.Assert.assertSame import org.junit.Assert.assertTrue +import org.junit.Assert.fail import org.junit.Before import org.junit.Rule import org.junit.Test @@ -86,6 +87,11 @@ class MultiStackNavigatorTest { } } + @Test + fun testFailure() { + fail() + } + @Test fun testIndependentStacks() { val multiStackNavigator = multiStackNavigator(MultiStackNavigator.BackStackType.UniqueEntries) From 5ddc208d6fcd71d04a1581b02456ebdb51c24893 Mon Sep 17 00:00:00 2001 From: Kevin Block Date: Wed, 26 Feb 2025 13:38:40 -0500 Subject: [PATCH 5/6] Revert "Test failure" This reverts commit 9556775368b5d828d154669b487b38b1ab665b9d. --- .../tunjid/androidx/navigation/MultiStackNavigatorTest.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/navigation/src/androidTest/java/com/tunjid/androidx/navigation/MultiStackNavigatorTest.kt b/navigation/src/androidTest/java/com/tunjid/androidx/navigation/MultiStackNavigatorTest.kt index 548ecea7..71092ac5 100644 --- a/navigation/src/androidTest/java/com/tunjid/androidx/navigation/MultiStackNavigatorTest.kt +++ b/navigation/src/androidTest/java/com/tunjid/androidx/navigation/MultiStackNavigatorTest.kt @@ -13,7 +13,6 @@ import org.junit.Assert.assertNotSame import org.junit.Assert.assertNull import org.junit.Assert.assertSame import org.junit.Assert.assertTrue -import org.junit.Assert.fail import org.junit.Before import org.junit.Rule import org.junit.Test @@ -87,11 +86,6 @@ class MultiStackNavigatorTest { } } - @Test - fun testFailure() { - fail() - } - @Test fun testIndependentStacks() { val multiStackNavigator = multiStackNavigator(MultiStackNavigator.BackStackType.UniqueEntries) From aeb3f9a33ba698a9ef355428557d27546c60f05f Mon Sep 17 00:00:00 2001 From: Kevin Block Date: Wed, 26 Feb 2025 14:09:53 -0500 Subject: [PATCH 6/6] Add a stress test notification --- .../java/com/tunjid/androidx/MainActivity.kt | 29 +++++++++++- .../navigator/IndependentStacksFragment.kt | 6 ++- .../navigator/MultipleStacksFragment.kt | 11 +++-- .../androidx/tabnav/routing/RouteFragment.kt | 46 ++++++++++++++++++- app/src/main/res/menu/menu_route.xml | 4 ++ app/src/main/res/values/strings.xml | 6 +++ 6 files changed, 93 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/tunjid/androidx/MainActivity.kt b/app/src/main/java/com/tunjid/androidx/MainActivity.kt index 982a06aa..aa336bf6 100644 --- a/app/src/main/java/com/tunjid/androidx/MainActivity.kt +++ b/app/src/main/java/com/tunjid/androidx/MainActivity.kt @@ -1,11 +1,15 @@ package com.tunjid.androidx +import android.app.NotificationChannel +import android.app.NotificationManager import android.content.Intent +import android.os.Build import android.os.Bundle import android.view.View import android.view.WindowInsets import androidx.activity.addCallback import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope import com.tunjid.androidx.core.delegates.activityIntent import com.tunjid.androidx.databinding.ActivityMainBinding import com.tunjid.androidx.navigation.MultiStackNavigator @@ -31,7 +35,7 @@ class MainActivity : AppCompatActivity(), GlobalUiHost, Navigator.Controller { stackCount = tabs.size, containerId = R.id.content_container, backStackType = MultiStackNavigator.BackStackType.Unlimited, - rootFunction = RouteFragment.Companion::newInstance + rootFunction = RouteFragment.Companion::newInstance, ) public override fun onCreate(savedInstanceState: Bundle?) { @@ -54,6 +58,7 @@ class MainActivity : AppCompatActivity(), GlobalUiHost, Navigator.Controller { setOnNavigationItemSelectedListener { navigator.show(tabs.indexOf(it.itemId)).let { true } } setOnNavigationItemReselectedListener { navigator.activeNavigator.clear() } } + createNotificationChannel() } override fun onNewIntent(intent: Intent?) { @@ -63,4 +68,26 @@ class MainActivity : AppCompatActivity(), GlobalUiHost, Navigator.Controller { ?.takeIf { it >= 0 } ?.let(navigator::show) } + + override fun onResume() { + super.onResume() + if (intent?.getBooleanExtra("stress_test", false) == true) { + navigator.performConsecutively(lifecycleScope) { + clearAll() + push(RouteFragment.newInstance(tabIndex = 0, launchStressTest = true)) + } + } + } + + private fun createNotificationChannel() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + NotificationChannel( + getString(R.string.notification_channel_id), + getString(R.string.notification_channel_name), + NotificationManager.IMPORTANCE_LOW + ).apply { + getSystemService(NotificationManager::class.java).createNotificationChannel(this) + } + } + } } diff --git a/app/src/main/java/com/tunjid/androidx/tabnav/navigator/IndependentStacksFragment.kt b/app/src/main/java/com/tunjid/androidx/tabnav/navigator/IndependentStacksFragment.kt index edcc68e7..65e41d41 100644 --- a/app/src/main/java/com/tunjid/androidx/tabnav/navigator/IndependentStacksFragment.kt +++ b/app/src/main/java/com/tunjid/androidx/tabnav/navigator/IndependentStacksFragment.kt @@ -35,7 +35,7 @@ import com.tunjid.androidx.uidrivers.InsetFlags import com.tunjid.androidx.uidrivers.crossFade import com.tunjid.androidx.uidrivers.uiState import com.tunjid.androidx.uidrivers.updatePartial -import java.util.* +import java.util.ArrayDeque class IndependentStacksFragment : Fragment(R.layout.fragment_independent_stack) { @@ -100,7 +100,9 @@ class IndependentStacksFragment : Fragment(R.layout.fragment_independent_stack) } private fun navigatorFor(id: Int) = navigators.getOrPut(id) { - val stackNavigator by childStackNavigationController(id) + val stackNavigator by childStackNavigationController( + containerId = id, + ) stackNavigator.apply { transactionModifier = { crossFade() } } } diff --git a/app/src/main/java/com/tunjid/androidx/tabnav/navigator/MultipleStacksFragment.kt b/app/src/main/java/com/tunjid/androidx/tabnav/navigator/MultipleStacksFragment.kt index b8ea1df1..e5f74c8a 100644 --- a/app/src/main/java/com/tunjid/androidx/tabnav/navigator/MultipleStacksFragment.kt +++ b/app/src/main/java/com/tunjid/androidx/tabnav/navigator/MultipleStacksFragment.kt @@ -54,11 +54,12 @@ class MultipleStacksFragment : Fragment(R.layout.fragment_multiple_stack) { private val navigator by activityNavigatorController() internal val innerNavigator: MultiStackNavigator by childMultiStackNavigationController( - DESTINATIONS.size, - R.id.inner_container - ) { index -> - MultipleStackChildFragment.newInstance(getChildName(index), 1) - } + stackCount = DESTINATIONS.size, + containerId = R.id.inner_container, + rootFunction = { index -> + MultipleStackChildFragment.newInstance(getChildName(index), 1) + } + ) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/tunjid/androidx/tabnav/routing/RouteFragment.kt b/app/src/main/java/com/tunjid/androidx/tabnav/routing/RouteFragment.kt index 4b57cd9a..a008ec3d 100644 --- a/app/src/main/java/com/tunjid/androidx/tabnav/routing/RouteFragment.kt +++ b/app/src/main/java/com/tunjid/androidx/tabnav/routing/RouteFragment.kt @@ -1,6 +1,10 @@ package com.tunjid.androidx.tabnav.routing import android.annotation.SuppressLint +import android.app.Notification +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Intent import android.graphics.Color import android.graphics.PorterDuff import android.os.Bundle @@ -10,6 +14,8 @@ import android.view.ViewGroup import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES +import androidx.core.app.NotificationCompat +import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -18,6 +24,7 @@ import androidx.transition.AutoTransition import androidx.transition.TransitionManager import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.tunjid.androidx.MainActivity import com.tunjid.androidx.R import com.tunjid.androidx.core.content.colorAt import com.tunjid.androidx.core.content.themeColorAt @@ -46,6 +53,7 @@ class RouteFragment : Fragment(R.layout.fragment_route) { private val navigator by activityNavigatorController() private var tabIndex: Int by fragmentArgs() + private var launchStressTest: Boolean by fragmentArgs() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -83,6 +91,10 @@ class RouteFragment : Fragment(R.layout.fragment_route) { ) OverScrollDecoratorHelper.setUpOverScroll(this, OverScrollDecoratorHelper.ORIENTATION_VERTICAL) } + + if (launchStressTest) { + stressTest() + } } private fun onMenuItemSelected(item: MenuItem) = when (item.itemId) { @@ -97,6 +109,7 @@ class RouteFragment : Fragment(R.layout.fragment_route) { .show() .let { } R.id.menu_reset -> navigator.clearAll() + R.id.menu_stress_test_intent -> createStressTestIntent() else -> requireActivity().onOptionsItemSelected(item).let { } } @@ -111,6 +124,31 @@ class RouteFragment : Fragment(R.layout.fragment_route) { push(route.fragment(isTopLevel = true)) } + private fun createStressTestIntent() { + val context = requireContext() + val intent = Intent(context, MainActivity::class.java).apply { + putExtra("stress_test", true) + } + + val pendingIntent = PendingIntent.getActivity( + context, + 0, + intent, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + + val notification = NotificationCompat.Builder(context, getString(R.string.notification_channel_id)) + .setSmallIcon(R.drawable.ic_android_24dp) + .setCategory(Notification.CATEGORY_MESSAGE) + .setContentTitle(getString(R.string.stress_test_intent_title)) + .setContentText(getString(R.string.stress_test_intent_message)) + .setContentIntent(pendingIntent) + .setAutoCancel(true) + .build() + + ContextCompat.getSystemService(context, NotificationManager::class.java)?.notify(0, notification) + } + private fun stressTest() = navigator.performConsecutively(requireActivity().lifecycleScope) { val nav = navigator @@ -138,7 +176,13 @@ class RouteFragment : Fragment(R.layout.fragment_route) { } companion object { - fun newInstance(tabIndex: Int): RouteFragment = RouteFragment().apply { this.tabIndex = tabIndex } + fun newInstance( + tabIndex: Int, + launchStressTest: Boolean = false, + ): RouteFragment = RouteFragment().apply { + this.tabIndex = tabIndex + this.launchStressTest = launchStressTest + } } } diff --git a/app/src/main/res/menu/menu_route.xml b/app/src/main/res/menu/menu_route.xml index 21895673..b88c1ab0 100644 --- a/app/src/main/res/menu/menu_route.xml +++ b/app/src/main/res/menu/menu_route.xml @@ -10,6 +10,10 @@ android:icon="@drawable/ic_baseline_fire_24" android:title="@string/menu_stress_test" app:showAsAction="ifRoom" /> + Reset Navigation Toggle theme Stress Test + Stress Test Intent Scan Stop Refresh @@ -148,4 +149,9 @@ I am inevitable I a survivor + + android_extensions + Android Extensions + Navigation Stress Test Intent + Enable Don\'t Keep Activities in Developer Options and open this