diff --git a/app/build.gradle b/app/build.gradle index 4b19ac2..730aaed 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,8 +7,8 @@ plugins { id 'com.google.android.gms.oss-licenses-plugin' } -def tagName = '2.6.4' -def tagCode = 264 +def tagName = '2.6.5' +def tagCode = 265 def getKeystoreProperties() { def properties = new Properties() @@ -29,12 +29,12 @@ def getKeystoreProperties() { } android { - compileSdk 34 + compileSdk 35 defaultConfig { applicationId "com.kieronquinn.app.pixellaunchermods" minSdk 31 - targetSdk 34 + targetSdk 35 versionCode tagCode versionName tagName @@ -76,26 +76,26 @@ android { dependencies { implementation 'androidx.core:core-ktx:1.13.1' - implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.appcompat:appcompat:1.7.0' implementation 'com.google.android.material:material:1.12.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version" implementation 'androidx.recyclerview:recyclerview:1.3.2' implementation 'androidx.palette:palette-ktx:1.0.0' - implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.7.0" - implementation "androidx.lifecycle:lifecycle-service:2.7.0" - implementation "androidx.fragment:fragment-ktx:1.7.0" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.3" + implementation "androidx.lifecycle:lifecycle-service:2.8.3" + implementation "androidx.fragment:fragment-ktx:1.8.1" implementation "androidx.activity:activity-ktx:1.9.0" implementation "com.simplecityapps:recyclerview-fastscroll:2.0.1" - implementation 'me.zhanghai.android.appiconloader:appiconloader:1.3.1' + implementation 'me.zhanghai.android.appiconloader:appiconloader:1.5.0' implementation 'androidx.core:core-splashscreen:1.0.1' implementation "io.noties.markwon:core:4.6.2" - implementation 'com.google.android.gms:play-services-oss-licenses:17.0.1' - implementation 'com.squareup.retrofit2:retrofit:2.9.0' - implementation 'com.squareup.retrofit2:converter-gson:2.9.0' + implementation 'com.google.android.gms:play-services-oss-licenses:17.1.0' + implementation 'com.squareup.retrofit2:retrofit:2.11.0' + implementation 'com.squareup.retrofit2:converter-gson:2.11.0' - implementation "io.insert-koin:koin-android:3.5.3" + implementation "io.insert-koin:koin-android:3.5.6" implementation files('libs/apksigner.jar') implementation 'androidx.work:work-runtime-ktx:2.9.0' compileOnly project(path: ':systemstubs') @@ -111,7 +111,7 @@ dependencies { implementation "com.github.topjohnwu.libsu:service:${libsuVersion}" implementation 'com.github.graviton57:sqlite-android:1.0.1' - implementation 'com.google.code.gson:gson:2.10.1' + implementation 'com.google.code.gson:gson:2.11.0' def room_version = "2.6.1" implementation "androidx.room:room-runtime:$room_version" @@ -123,6 +123,6 @@ dependencies { implementation 'com.arasthel:spannedgridlayoutmanager:3.0.2' testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.5' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + androidTestImplementation 'androidx.test.ext:junit:1.2.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' } \ No newline at end of file diff --git a/app/release/baselineProfiles/0/app-release.dm b/app/release/baselineProfiles/0/app-release.dm index 1bcf0f1..38ac715 100644 Binary files a/app/release/baselineProfiles/0/app-release.dm and b/app/release/baselineProfiles/0/app-release.dm differ diff --git a/app/release/baselineProfiles/1/app-release.dm b/app/release/baselineProfiles/1/app-release.dm index 3b6ec5e..ec51dea 100644 Binary files a/app/release/baselineProfiles/1/app-release.dm and b/app/release/baselineProfiles/1/app-release.dm differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 049e52e..78d0812 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -11,8 +11,8 @@ "type": "SINGLE", "filters": [], "attributes": [], - "versionCode": 264, - "versionName": "2.6.4", + "versionCode": 265, + "versionName": "2.6.5", "outputFile": "app-release.apk" } ], diff --git a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/repositories/ProxyAppWidgetRepository.kt b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/repositories/ProxyAppWidgetRepository.kt index d002db3..d1ea581 100644 --- a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/repositories/ProxyAppWidgetRepository.kt +++ b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/repositories/ProxyAppWidgetRepository.kt @@ -9,7 +9,10 @@ import android.content.Context import android.content.Intent import android.content.IntentSender import android.os.Bundle +import android.util.Log +import android.util.SizeF import androidx.activity.result.ActivityResultLauncher +import com.kieronquinn.app.pixellaunchermods.utils.extensions.dp import com.kieronquinn.app.pixellaunchermods.utils.extensions.getIntentSenderForConfigureActivity import com.kieronquinn.app.pixellaunchermods.utils.widget.LauncherProxyAppWidgetHost import com.kieronquinn.app.pixellaunchermods.utils.widget.PreviewAppWidgetHost @@ -88,15 +91,31 @@ class ProxyAppWidgetRepositoryImpl( } } - /** - * Rejects size bundles that would render the widget down to 0x0 (making it invisible) - */ private fun AppWidgetHostView.updateAppWidgetOptionsIfValid(options: Bundle) { - if(options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT) == 0) return - if(options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH) == 0) return - if(options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH) == 0) return - if(options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT) == 0) return - updateAppWidgetOptions(options) + val sizes = ArrayList().apply { + val minWidth = options.getIntOrNull(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH) + ?: return@apply + val minHeight = options.getIntOrNull(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT) + ?: return@apply + val maxWidth = options.getIntOrNull(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH) + ?: return@apply + val maxHeight = options.getIntOrNull(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT) + ?: return@apply + add(SizeF(minWidth.dp.toFloat(), minHeight.dp.toFloat())) + add(SizeF(maxWidth.dp.toFloat(), maxHeight.dp.toFloat())) + } + Log.d("PA", "Setting size: $sizes from $options") + updateAppWidgetSize(Bundle.EMPTY, sizes) + } + + private fun Bundle.getIntOrNull(key: String): Int? { + return getInt(key).takeIf { it >= 0 } + } + + private fun Bundle.copy(to: Bundle, key: String) { + if(getInt(key) != 0) { + to.putInt(key, getInt(key)) + } } override fun setListening(listening: Boolean) { diff --git a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/service/PixelLauncherModsRootService.kt b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/service/PixelLauncherModsRootService.kt index 413f80d..9d1f708 100644 --- a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/service/PixelLauncherModsRootService.kt +++ b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/service/PixelLauncherModsRootService.kt @@ -109,6 +109,7 @@ class PixelLauncherModsRootServiceImpl: IPixelLauncherModsRootService.Stub() { ) private const val SEARCH_PROVIDER_SETTINGS_KEY = "SEARCH_PROVIDER_PACKAGE_NAME" + private const val SEARCH_PROVIDER_SETTINGS_KEY_VARIANT = "selected_search_engine" } private val context by lazy { @@ -763,12 +764,21 @@ class PixelLauncherModsRootServiceImpl: IPixelLauncherModsRootService.Stub() { } override fun setSearchWidgetPackageEnabled(enabled: Boolean) { + val key: String + val table: String + if(Build.VERSION.SDK_INT >= 35) { + key = SEARCH_PROVIDER_SETTINGS_KEY_VARIANT + table = "secure" + }else{ + key = SEARCH_PROVIDER_SETTINGS_KEY + table = "global" + } if(enabled) { //Set it to PLM package name so it uses our Proxy Widget - execRootCommand("settings put global $SEARCH_PROVIDER_SETTINGS_KEY ${BuildConfig.APPLICATION_ID}") + execRootCommand("settings put $table $key ${BuildConfig.APPLICATION_ID}") }else{ //Delete to set it back to default (null) - execRootCommand("settings delete global $SEARCH_PROVIDER_SETTINGS_KEY") + execRootCommand("settings delete $table $key") } } diff --git a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/ui/base/FragmentOptions.kt b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/ui/base/FragmentOptions.kt index 740708b..c0140b9 100644 --- a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/ui/base/FragmentOptions.kt +++ b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/ui/base/FragmentOptions.kt @@ -11,6 +11,7 @@ interface Root interface ProvidesBack { fun onBackPressed(): Boolean + fun interceptBack() = true } interface ProvidesTitle { diff --git a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/ui/screens/container/ContainerFragment.kt b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/ui/screens/container/ContainerFragment.kt index 22a7a74..47ab1c8 100644 --- a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/ui/screens/container/ContainerFragment.kt +++ b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/ui/screens/container/ContainerFragment.kt @@ -1,10 +1,11 @@ package com.kieronquinn.app.pixellaunchermods.ui.screens.container +import android.annotation.SuppressLint import android.graphics.drawable.GradientDrawable import android.os.Bundle import android.view.MenuInflater import android.view.View -import androidx.activity.addCallback +import androidx.activity.OnBackPressedCallback import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat @@ -17,7 +18,6 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.NavigationUI -import com.google.android.material.appbar.AppBarLayout import com.google.android.material.elevation.ElevationOverlayProvider import com.google.android.material.snackbar.Snackbar import com.kieronquinn.app.pixellaunchermods.R @@ -26,8 +26,26 @@ import com.kieronquinn.app.pixellaunchermods.components.navigation.setupWithNavi import com.kieronquinn.app.pixellaunchermods.components.notifications.requestNotificationPermission import com.kieronquinn.app.pixellaunchermods.databinding.FragmentContainerBinding import com.kieronquinn.app.pixellaunchermods.repositories.RemoteAppsRepository -import com.kieronquinn.app.pixellaunchermods.ui.base.* -import com.kieronquinn.app.pixellaunchermods.utils.extensions.* +import com.kieronquinn.app.pixellaunchermods.ui.base.BackAvailable +import com.kieronquinn.app.pixellaunchermods.ui.base.BoundFragment +import com.kieronquinn.app.pixellaunchermods.ui.base.CanShowSnackbar +import com.kieronquinn.app.pixellaunchermods.ui.base.LockCollapsed +import com.kieronquinn.app.pixellaunchermods.ui.base.ProvidesBack +import com.kieronquinn.app.pixellaunchermods.ui.base.ProvidesOverflow +import com.kieronquinn.app.pixellaunchermods.ui.base.ProvidesTitle +import com.kieronquinn.app.pixellaunchermods.utils.extensions.awaitPost +import com.kieronquinn.app.pixellaunchermods.utils.extensions.collapsedState +import com.kieronquinn.app.pixellaunchermods.utils.extensions.getRememberedAppBarCollapsed +import com.kieronquinn.app.pixellaunchermods.utils.extensions.getTopFragment +import com.kieronquinn.app.pixellaunchermods.utils.extensions.onApplyInsets +import com.kieronquinn.app.pixellaunchermods.utils.extensions.onDestinationChanged +import com.kieronquinn.app.pixellaunchermods.utils.extensions.onNavDestinationSelected +import com.kieronquinn.app.pixellaunchermods.utils.extensions.onNavigationIconClicked +import com.kieronquinn.app.pixellaunchermods.utils.extensions.onSwipeDismissed +import com.kieronquinn.app.pixellaunchermods.utils.extensions.rememberAppBarCollapsed +import com.kieronquinn.app.pixellaunchermods.utils.extensions.setOnBackPressedCallback +import com.kieronquinn.app.pixellaunchermods.utils.extensions.setTypeface +import com.kieronquinn.app.pixellaunchermods.utils.extensions.whenResumed import kotlinx.coroutines.launch import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel @@ -92,6 +110,11 @@ class ContainerFragment: BoundFragment(FragmentContain setupApplyState() setupUpdateSnackbar() NavigationUI.setupWithNavController(binding.containerBottomNavigation, navController) + binding.containerBottomNavigation.setOnItemSelectedListener { item -> + //Clear the back stack back to the root, to prevent going back between tabs + navController.popBackStack(R.id.nav_graph_main, false) + navController.onNavDestinationSelected(item) + } requireActivity().requestNotificationPermission() } @@ -138,34 +161,38 @@ class ContainerFragment: BoundFragment(FragmentContain } } + @SuppressLint("RestrictedApi") private fun setupBack() { - val callback = requireActivity().onBackPressedDispatcher.addCallback( - this, - shouldBackDispatcherBeEnabled() - ) { - (navHostFragment.getTopFragment() as? ProvidesBack)?.let { - if(it.onBackPressed()) return@addCallback - } - if(!navController.popBackStack()) { - requireActivity().finish() + val callback = object: OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + (navHostFragment.getTopFragment() as? ProvidesBack)?.let { + if(!it.interceptBack()) return@let + if(it.onBackPressed()) return + } + if(!navController.popBackStack()) { + requireActivity().finish() + } } } - viewLifecycleOwner.lifecycleScope.launchWhenResumed { + navController.setOnBackPressedCallback(callback) + navController.enableOnBackPressed(shouldBackDispatcherBeEnabled()) + navController.setOnBackPressedDispatcher(requireActivity().onBackPressedDispatcher) + whenResumed { navController.onDestinationChanged().collect { - callback.isEnabled = shouldBackDispatcherBeEnabled() + navController.enableOnBackPressed(shouldBackDispatcherBeEnabled()) } } } private fun shouldBackDispatcherBeEnabled(): Boolean { val top = navHostFragment.getTopFragment() - return top is ProvidesBack || top !is Root + return top is ProvidesBack && top.interceptBack() } private fun setupAppBar() { - binding.containerAppBar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset -> + binding.containerAppBar.addOnOffsetChangedListener { appBarLayout, verticalOffset -> binding.navHostFragment.updatePadding(bottom = appBarLayout.totalScrollRange + verticalOffset) - }) + } } private fun setupApplyState() { diff --git a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+ActivityOptionsCompat.kt b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+ActivityOptionsCompat.kt index b939f1b..45b09f8 100644 --- a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+ActivityOptionsCompat.kt +++ b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+ActivityOptionsCompat.kt @@ -14,7 +14,6 @@ fun ActivityOptionsCompat.allowBackground() = apply { }.get(this) as ActivityOptions inner.apply { pendingIntentBackgroundActivityStartMode = MODE_BACKGROUND_ACTIVITY_START_ALLOWED - pendingIntentCreatorBackgroundActivityStartMode = MODE_BACKGROUND_ACTIVITY_START_ALLOWED } } } \ No newline at end of file diff --git a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Fragment.kt b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Fragment.kt index 149ee27..014f930 100644 --- a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Fragment.kt +++ b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Fragment.kt @@ -2,6 +2,7 @@ package com.kieronquinn.app.pixellaunchermods.utils.extensions import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.callbackFlow @@ -19,4 +20,11 @@ fun Fragment.childBackStackTopFragment() = callbackFlow { fun Fragment.getTopFragment(): Fragment? { if(!isAdded) return null return childFragmentManager.fragments.firstOrNull() +} + +/** + * Helper for [LifecycleOwner].[whenResumed] + */ +fun Fragment.whenResumed(block: suspend CoroutineScope.() -> Unit) { + viewLifecycleOwner.whenResumed(block) } \ No newline at end of file diff --git a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Lifecycle.kt b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Lifecycle.kt index 2059d22..bc0f3b2 100644 --- a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Lifecycle.kt +++ b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Lifecycle.kt @@ -2,7 +2,13 @@ package com.kieronquinn.app.pixellaunchermods.utils.extensions import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleObserver +import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.OnLifecycleEvent +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch fun Lifecycle.runOnDestroy(block: () -> Unit) { addObserver(object: LifecycleObserver { @@ -11,4 +17,12 @@ fun Lifecycle.runOnDestroy(block: () -> Unit) { block() } }) +} + +fun LifecycleOwner.whenResumed(block: suspend CoroutineScope.() -> Unit): Job { + return lifecycleScope.launch { + lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) { + block() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Navigation.kt b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Navigation.kt index df01d21..03a44af 100644 --- a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Navigation.kt +++ b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Navigation.kt @@ -1,6 +1,16 @@ package com.kieronquinn.app.pixellaunchermods.utils.extensions +import android.annotation.SuppressLint +import android.util.Log +import android.view.Menu +import android.view.MenuItem +import androidx.activity.OnBackPressedCallback +import androidx.annotation.IdRes import androidx.navigation.NavController +import androidx.navigation.NavDestination +import androidx.navigation.NavDestination.Companion.hierarchy +import androidx.navigation.NavGraph.Companion.findStartDestination +import androidx.navigation.NavOptions import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.debounce @@ -16,4 +26,45 @@ fun NavController.onDestinationChanged() = callbackFlow { awaitClose { removeOnDestinationChangedListener(listener) } -}.debounce(TAP_DEBOUNCE) \ No newline at end of file +}.debounce(TAP_DEBOUNCE) + +fun NavController.setOnBackPressedCallback(callback: OnBackPressedCallback) { + NavController::class.java.getDeclaredField("onBackPressedCallback").apply { + isAccessible = true + }.set(this, callback) +} + +/** + * Copy of [NavigationUI.onNavDestinationSelected] but without the force unwrap on the animation + * which breaks if the stack is cleared before it is used. + */ +@SuppressLint("RestrictedApi") +fun NavController.onNavDestinationSelected(item: MenuItem): Boolean { + val builder = NavOptions.Builder().setLaunchSingleTop(true).setRestoreState(true) + if (item.order and Menu.CATEGORY_SECONDARY == 0) { + builder.setPopUpTo( + graph.findStartDestination().id, + inclusive = false, + saveState = true + ) + } + val options = builder.build() + return try { + // TODO provide proper API instead of using Exceptions as Control-Flow. + navigate(item.itemId, null, options) + // Return true only if the destination we've navigated to matches the MenuItem + currentDestination?.matchDestination(item.itemId) == true + } catch (e: IllegalArgumentException) { + val name = NavDestination.getDisplayName(context, item.itemId) + Log.i( + "NavigationUI", + "Ignoring onNavDestinationSelected for MenuItem $name as it cannot be found " + + "from the current destination $currentDestination", + e + ) + false + } +} + +internal fun NavDestination.matchDestination(@IdRes destId: Int): Boolean = + hierarchy.any { it.id == destId } \ No newline at end of file diff --git a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Resources.kt b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Resources.kt index 621b224..b633d02 100644 --- a/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Resources.kt +++ b/app/src/main/java/com/kieronquinn/app/pixellaunchermods/utils/extensions/Extensions+Resources.kt @@ -31,4 +31,14 @@ fun Resources.getResourceIdArray(@ArrayRes resourceId: Int): Array { } array.recycle() return items.toTypedArray() -} \ No newline at end of file +} + +fun Resources.px(value: Int): Int = (value / displayMetrics.density).toInt() + +val Int.px + get() = Resources.getSystem().px(this) + +fun Resources.dip(value: Int): Int = (value * displayMetrics.density).toInt() + +val Int.dp + get() = Resources.getSystem().dip(this) \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 45eb9d9..c2f474e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:fitsSystemWindows="false" tools:context=".ui.activities.MainActivity"> @@ -11,6 +12,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/fragment_root" - android:name="com.kieronquinn.app.pixellaunchermods.ui.screens.root.RootFragment"/> + android:name="androidx.navigation.fragment.NavHostFragment" + app:defaultNavHost="true" + app:navGraph="@navigation/nav_graph_activity" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_root.xml b/app/src/main/res/layout/fragment_root.xml index 1bed0c1..65d6e74 100644 --- a/app/src/main/res/layout/fragment_root.xml +++ b/app/src/main/res/layout/fragment_root.xml @@ -10,6 +10,7 @@ android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" + app:defaultNavHost="true" app:navGraph="@navigation/nav_graph_root" /> \ No newline at end of file diff --git a/app/src/main/res/layout/widget_wrapper.xml b/app/src/main/res/layout/widget_wrapper.xml index c3c802a..2880df5 100644 --- a/app/src/main/res/layout/widget_wrapper.xml +++ b/app/src/main/res/layout/widget_wrapper.xml @@ -2,4 +2,5 @@ \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph_activity.xml b/app/src/main/res/navigation/nav_graph_activity.xml new file mode 100644 index 0000000..d1b10d1 --- /dev/null +++ b/app/src/main/res/navigation/nav_graph_activity.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file