Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 28 additions & 1 deletion app/src/main/java/com/tunjid/androidx/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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?) {
Expand All @@ -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?) {
Expand All @@ -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)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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() } }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,12 @@ class MultipleStacksFragment : Fragment(R.layout.fragment_multiple_stack) {

private val navigator by activityNavigatorController<MultiStackNavigator>()
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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -46,6 +53,7 @@ class RouteFragment : Fragment(R.layout.fragment_route) {
private val navigator by activityNavigatorController<MultiStackNavigator>()

private var tabIndex: Int by fragmentArgs()
private var launchStressTest: Boolean by fragmentArgs()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Expand Down Expand Up @@ -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) {
Expand All @@ -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 { }
}
Expand All @@ -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

Expand Down Expand Up @@ -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
}
}
}

Expand Down
4 changes: 4 additions & 0 deletions app/src/main/res/menu/menu_route.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
android:icon="@drawable/ic_baseline_fire_24"
android:title="@string/menu_stress_test"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_stress_test_intent"
android:title="@string/menu_stress_test_intent"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_reset"
android:title="@string/menu_reset_navigation"
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
<string name="menu_reset_navigation">Reset Navigation</string>
<string name="menu_theme">Toggle theme</string>
<string name="menu_stress_test">Stress Test</string>
<string name="menu_stress_test_intent">Stress Test Intent</string>
<string name="menu_scan">Scan</string>
<string name="menu_stop">Stop</string>
<string name="menu_refresh">Refresh</string>
Expand Down Expand Up @@ -148,4 +149,9 @@
<string name="inevitable">I am inevitable</string>
<string name="survivor">I a survivor</string>

<!-- Notifications -->
<string name="notification_channel_id">android_extensions</string>
<string name="notification_channel_name">Android Extensions</string>
<string name="stress_test_intent_title">Navigation Stress Test Intent</string>
<string name="stress_test_intent_message">Enable Don\'t Keep Activities in Developer Options and open this</string>
</resources>