diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 97a6d711d..558268068 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -159,6 +159,14 @@
android:theme="@style/SaveAppTheme.NoActionBar"
android:windowSoftInputMode="adjustPan" />
+
+
{
- navGraph.setStartDestination(R.id.snowbird_nav_graph)
- }
else -> {
navGraph.setStartDestination(R.id.fragment_space_setup)
}
diff --git a/app/src/main/java/net/opendasharchive/openarchive/features/settings/SpaceSetupFragment.kt b/app/src/main/java/net/opendasharchive/openarchive/features/settings/SpaceSetupFragment.kt
index 9fdf4a624..b2ce32696 100644
--- a/app/src/main/java/net/opendasharchive/openarchive/features/settings/SpaceSetupFragment.kt
+++ b/app/src/main/java/net/opendasharchive/openarchive/features/settings/SpaceSetupFragment.kt
@@ -4,6 +4,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.content.Intent
import androidx.fragment.compose.content
import androidx.navigation.fragment.findNavController
import net.opendasharchive.openarchive.R
@@ -13,6 +14,7 @@ import net.opendasharchive.openarchive.features.core.BaseFragment
import net.opendasharchive.openarchive.features.settings.passcode.AppConfig
import net.opendasharchive.openarchive.features.spaces.SpaceSetupScreen
import org.koin.android.ext.android.inject
+import net.opendasharchive.openarchive.services.snowbird.SnowbirdActivity
class SpaceSetupFragment : BaseFragment() {
@@ -39,9 +41,8 @@ class SpaceSetupFragment : BaseFragment() {
// Show/hide Snowbird based on config
val isDwebEnabled = appConfig.isDwebEnabled
val onDwebClicked = {
- val action =
- SpaceSetupFragmentDirections.actionFragmentSpaceSetupToFragmentSnowbird()
- findNavController().navigate(action)
+ val intent = Intent(requireContext(), SnowbirdActivity::class.java)
+ startActivity(intent)
}
SaveAppTheme {
@@ -59,4 +60,4 @@ class SpaceSetupFragment : BaseFragment() {
override fun getToolbarTitle() = getString(R.string.space_setup_title)
override fun getToolbarSubtitle(): String? = null
override fun shouldShowBackButton() = true
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/net/opendasharchive/openarchive/features/settings/SpaceSetupSuccessFragment.kt b/app/src/main/java/net/opendasharchive/openarchive/features/settings/SpaceSetupSuccessFragment.kt
index 411b5d7ab..e2ce15d1b 100644
--- a/app/src/main/java/net/opendasharchive/openarchive/features/settings/SpaceSetupSuccessFragment.kt
+++ b/app/src/main/java/net/opendasharchive/openarchive/features/settings/SpaceSetupSuccessFragment.kt
@@ -3,21 +3,12 @@ package net.opendasharchive.openarchive.features.settings
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
-import android.view.Menu
-import android.view.MenuInflater
-import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
-import androidx.core.os.bundleOf
import androidx.core.view.WindowInsetsCompat
-import androidx.core.view.MenuProvider
-import androidx.fragment.app.setFragmentResult
-import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
-import androidx.navigation.navOptions
import net.opendasharchive.openarchive.R
import net.opendasharchive.openarchive.databinding.FragmentSpaceSetupSuccessBinding
-import net.opendasharchive.openarchive.db.Space
import net.opendasharchive.openarchive.features.core.BaseFragment
import net.opendasharchive.openarchive.features.main.MainActivity
import net.opendasharchive.openarchive.util.extensions.applyEdgeToEdgeInsets
@@ -50,62 +41,15 @@ class SpaceSetupSuccessFragment : BaseFragment() {
}
binding.btAuthenticate.setOnClickListener { _ ->
- if (args.spaceType == Space.Type.RAVEN) {
- val navController = findNavController()
- // Navigate to Snowbird as the new root of this nav graph so Back exits to MainActivity
- navController.navigate(
- R.id.action_fragment_space_setup_success_to_fragment_snowbird,
- null,
- navOptions {
- // Clear the entire Space Setup nav graph back stack
- popUpTo(R.id.space_setup_navigation) { inclusive = true }
- launchSingleTop = true
- restoreState = false
- }
- )
- } else {
val intent = Intent(requireActivity(), MainActivity::class.java)
intent.flags =
Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK // Clears backstack
startActivity(intent)
- }
}
return binding.root
}
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
-
- if (args.spaceType == Space.Type.RAVEN) {
- // Add the menu provider
- requireActivity().addMenuProvider(object : MenuProvider {
- override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
- menuInflater.inflate(R.menu.menu_space_setup_success, menu)
- }
-
- override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
- return when (menuItem.itemId) {
- R.id.action_share_group -> {
- if (args.dwebGroupKey != null) {
- val action =
- SpaceSetupSuccessFragmentDirections.actionFragmentSpaceSetupSuccessToFragmentSnowbirdShareGroup(
- dwebGroupKey = args.dwebGroupKey!!,
- isSetupOngoing = true
- )
-
- findNavController().navigate(action)
- }
- true
- }
-
- else -> false
- }
- }
- }, viewLifecycleOwner)
- }
- }
-
override fun getToolbarTitle() = getString(R.string.space_setup_success_title)
override fun shouldShowBackButton() = false
}
\ No newline at end of file
diff --git a/app/src/main/java/net/opendasharchive/openarchive/features/settings/passcode/AppConfig.kt b/app/src/main/java/net/opendasharchive/openarchive/features/settings/passcode/AppConfig.kt
index 7b8d8d7b5..7b7c1fa79 100644
--- a/app/src/main/java/net/opendasharchive/openarchive/features/settings/passcode/AppConfig.kt
+++ b/app/src/main/java/net/opendasharchive/openarchive/features/settings/passcode/AppConfig.kt
@@ -6,7 +6,7 @@ data class AppConfig(
val maxRetryLimitEnabled: Boolean = false,
val biometricAuthEnabled: Boolean = false,
val maxFailedAttempts: Int = 5,
- val isDwebEnabled: Boolean = true,
+ val isDwebEnabled: Boolean = false,
val multipleProjectSelectionMode: Boolean = false,
val useCustomCamera: Boolean = false,
)
\ No newline at end of file
diff --git a/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/BaseSnowbirdFragment.kt b/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/BaseSnowbirdFragment.kt
index 1d88e4d2d..5e926c027 100644
--- a/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/BaseSnowbirdFragment.kt
+++ b/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/BaseSnowbirdFragment.kt
@@ -5,26 +5,37 @@ import android.os.Bundle
import android.view.View
import android.view.inputmethod.InputMethodManager
import androidx.fragment.app.Fragment
-import androidx.fragment.app.activityViewModels
+import androidx.lifecycle.lifecycleScope
+import kotlinx.coroutines.launch
import net.opendasharchive.openarchive.R
+import net.opendasharchive.openarchive.analytics.api.AnalyticsManager
+import net.opendasharchive.openarchive.analytics.api.session.SessionTracker
+import net.opendasharchive.openarchive.core.logger.AppLogger
import net.opendasharchive.openarchive.db.SnowbirdError
import net.opendasharchive.openarchive.extensions.androidViewModel
import net.opendasharchive.openarchive.features.core.BaseActivity
-import net.opendasharchive.openarchive.features.core.BaseFragment
import net.opendasharchive.openarchive.features.core.ToolbarConfigurable
import net.opendasharchive.openarchive.features.core.UiText
import net.opendasharchive.openarchive.features.core.dialog.DialogStateManager
import net.opendasharchive.openarchive.features.core.dialog.showDialog
-import net.opendasharchive.openarchive.features.onboarding.SpaceSetupActivity
-import net.opendasharchive.openarchive.services.snowbird.SnowbirdGroupViewModel
-import net.opendasharchive.openarchive.services.snowbird.SnowbirdRepoViewModel
import net.opendasharchive.openarchive.util.FullScreenOverlayManager
+import org.koin.android.ext.android.inject
+import org.koin.androidx.viewmodel.ext.android.activityViewModel
-abstract class BaseSnowbirdFragment : BaseFragment() {
+abstract class BaseSnowbirdFragment : Fragment(), ToolbarConfigurable {
+
+ protected val dialogManager: DialogStateManager by activityViewModel()
+ protected val analyticsManager: AnalyticsManager by inject()
+ protected val sessionTracker: SessionTracker by inject()
+
+ private var screenStartTime: Long = 0
+ private var previousScreen: String = ""
val snowbirdGroupViewModel: SnowbirdGroupViewModel by androidViewModel()
val snowbirdRepoViewModel: SnowbirdRepoViewModel by androidViewModel()
+ protected open fun getScreenName(): String = this::class.simpleName ?: "UnknownSnowbirdFragment"
+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
ensureComposeDialogHost()
@@ -59,6 +70,33 @@ abstract class BaseSnowbirdFragment : BaseFragment() {
override fun onResume() {
super.onResume()
- (activity as? SpaceSetupActivity)?.updateToolbarFromFragment(this)
+ (activity as? SnowbirdActivity)?.updateToolbarFromFragment(this)
+
+ screenStartTime = System.currentTimeMillis()
+ val screenName = getScreenName()
+ AppLogger.setCurrentScreen(screenName)
+
+ lifecycleScope.launch {
+ analyticsManager.trackScreenView(screenName, null, previousScreen)
+ }
+ sessionTracker.setCurrentScreen(screenName)
+
+ if (previousScreen.isNotEmpty() && previousScreen != screenName) {
+ lifecycleScope.launch {
+ analyticsManager.trackNavigation(previousScreen, screenName)
+ }
+ }
+ }
+
+ override fun onPause() {
+ super.onPause()
+ val timeSpent = (System.currentTimeMillis() - screenStartTime) / 1000
+ val screenName = getScreenName()
+
+ lifecycleScope.launch {
+ analyticsManager.trackScreenView(screenName, timeSpent, previousScreen)
+ }
+
+ previousScreen = screenName
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdActivity.kt b/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdActivity.kt
new file mode 100644
index 000000000..9b9ae0824
--- /dev/null
+++ b/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdActivity.kt
@@ -0,0 +1,65 @@
+package net.opendasharchive.openarchive.services.snowbird
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import androidx.navigation.NavController
+import androidx.navigation.NavGraph
+import androidx.navigation.fragment.NavHostFragment
+import androidx.navigation.ui.AppBarConfiguration
+import androidx.navigation.ui.setupActionBarWithNavController
+import net.opendasharchive.openarchive.R
+import net.opendasharchive.openarchive.databinding.ActivitySnowbirdBinding
+import net.opendasharchive.openarchive.features.core.BaseActivity
+import net.opendasharchive.openarchive.features.core.ToolbarConfigurable
+
+
+class SnowbirdActivity : BaseActivity() {
+
+ private lateinit var binding: ActivitySnowbirdBinding
+ private lateinit var navController: NavController
+ private lateinit var navGraph: NavGraph
+ private lateinit var appBarConfiguration: AppBarConfiguration
+
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ binding = ActivitySnowbirdBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ setupToolbar(showBackButton = true)
+ initSnowbirdNavigation()
+ }
+
+ private fun initSnowbirdNavigation() {
+ val navHostFragment = supportFragmentManager.findFragmentById(R.id.snowbird_nav_host_fragment) as NavHostFragment
+
+ navController = navHostFragment.navController
+ navGraph = navController.navInflater.inflate(R.navigation.snowbird_nav_graph)
+
+ appBarConfiguration = AppBarConfiguration(emptySet())
+ setupActionBarWithNavController(navController, appBarConfiguration)
+ }
+
+ fun updateToolbarFromFragment(fragment: Fragment) {
+ if (fragment is ToolbarConfigurable) {
+ val title = fragment.getToolbarTitle()
+ val subtitle = fragment.getToolbarSubtitle()
+ val showBackButton = fragment.shouldShowBackButton()
+ setupToolbar(title = title, showBackButton = showBackButton)
+ supportActionBar?.subtitle = subtitle
+ } else {
+ setupToolbar(title = getString(R.string.dweb_title), showBackButton = true)
+ supportActionBar?.subtitle = null
+ }
+ }
+
+ override fun onSupportNavigateUp(): Boolean {
+ return if (::navController.isInitialized && navController.currentDestination?.id == R.id.snowbird_dashboard) {
+ finish()
+ true
+ } else {
+ navController.navigateUp() || super.onSupportNavigateUp()
+ }
+ }
+}
diff --git a/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdCreateGroupFragment.kt b/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdCreateGroupFragment.kt
index c139ae991..b763a2486 100644
--- a/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdCreateGroupFragment.kt
+++ b/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdCreateGroupFragment.kt
@@ -21,8 +21,6 @@ import net.opendasharchive.openarchive.databinding.FragmentSnowbirdCreateGroupBi
import net.opendasharchive.openarchive.db.SnowbirdError
import net.opendasharchive.openarchive.db.SnowbirdGroup
import net.opendasharchive.openarchive.db.SnowbirdRepo
-import net.opendasharchive.openarchive.db.Space
-import net.opendasharchive.openarchive.features.core.BaseFragment
import net.opendasharchive.openarchive.util.FullScreenOverlayCreateGroupManager
import net.opendasharchive.openarchive.util.extensions.applyEdgeToEdgeInsets
import java.io.File
@@ -158,9 +156,8 @@ class SnowbirdCreateGroupFragment : BaseSnowbirdFragment() {
}
val action = SnowbirdCreateGroupFragmentDirections
- .actionFragmentSnowbirdCreateGroupToFragmentSpaceSetupSuccess(
+ .actionFragmentSnowbirdCreateGroupToFragmentSnowbirdSetupSuccess(
message = getString(R.string.you_have_successfully_created_dweb),
- spaceType = Space.Type.RAVEN,
dwebGroupKey = group.key,
)
findNavController().navigate(action)
diff --git a/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdJoinGroupFragment.kt b/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdJoinGroupFragment.kt
index 1757cc8fe..4bea58c02 100644
--- a/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdJoinGroupFragment.kt
+++ b/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdJoinGroupFragment.kt
@@ -17,10 +17,8 @@ import net.opendasharchive.openarchive.databinding.FragmentSnowbirdJoinGroupBind
import net.opendasharchive.openarchive.db.SnowbirdError
import net.opendasharchive.openarchive.db.SnowbirdGroup
import net.opendasharchive.openarchive.db.SnowbirdRepo
-import net.opendasharchive.openarchive.db.Space
import net.opendasharchive.openarchive.extensions.getQueryParameter
import net.opendasharchive.openarchive.extensions.showKeyboard
-import net.opendasharchive.openarchive.features.core.BaseFragment
import net.opendasharchive.openarchive.features.core.UiText
import net.opendasharchive.openarchive.features.core.dialog.DialogType
import net.opendasharchive.openarchive.features.core.dialog.showDialog
@@ -138,9 +136,8 @@ class SnowbirdJoinGroupFragment: BaseSnowbirdFragment() {
text = UiText.StringResource(R.string.label_got_it)
action = {
- val action = SnowbirdJoinGroupFragmentDirections.actionFragmentSnowbirdJoinGroupToFragmentSpaceSetupSuccess(
+ val action = SnowbirdJoinGroupFragmentDirections.actionFragmentSnowbirdJoinGroupToFragmentSnowbirdSetupSuccess(
message = getString(R.string.you_have_successfully_joined_dweb),
- spaceType = Space.Type.RAVEN,
dwebGroupKey = groupKey
)
diff --git a/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdSetupSuccessFragment.kt b/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdSetupSuccessFragment.kt
new file mode 100644
index 000000000..d7a82575d
--- /dev/null
+++ b/app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdSetupSuccessFragment.kt
@@ -0,0 +1,95 @@
+package net.opendasharchive.openarchive.services.snowbird
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.Menu
+import android.view.MenuInflater
+import android.view.MenuItem
+import android.view.View
+import android.view.ViewGroup
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.MenuProvider
+import androidx.navigation.fragment.findNavController
+import androidx.navigation.fragment.navArgs
+import androidx.navigation.navOptions
+import net.opendasharchive.openarchive.R
+import net.opendasharchive.openarchive.databinding.FragmentSpaceSetupSuccessBinding
+import net.opendasharchive.openarchive.util.extensions.applyEdgeToEdgeInsets
+
+class SnowbirdSetupSuccessFragment : BaseSnowbirdFragment() {
+
+ private lateinit var binding: FragmentSpaceSetupSuccessBinding
+ private val args: SnowbirdSetupSuccessFragmentArgs by navArgs()
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ binding = FragmentSpaceSetupSuccessBinding.inflate(inflater)
+
+ binding.mainContainer.applyEdgeToEdgeInsets(
+ typeMask = WindowInsetsCompat.Type.navigationBars()
+ ) { insets ->
+ bottomMargin = insets.bottom
+ }
+
+ binding.buttonBar.applyEdgeToEdgeInsets(
+ typeMask = WindowInsetsCompat.Type.navigationBars()
+ ) { insets ->
+ bottomMargin = insets.bottom
+ }
+
+ if (args.message.isNotEmpty()) {
+ binding.successMessage.text = args.message
+ }
+
+ binding.btAuthenticate.setOnClickListener { _ ->
+ val navController = findNavController()
+ // Navigate to Snowbird Dashboard and clear this success screen from back stack
+ navController.navigate(
+ R.id.snowbird_dashboard,
+ null,
+ navOptions {
+ // Clear the entire Snowbird graph so dashboard becomes the new root
+ popUpTo(R.id.snowbird_nav_graph) { inclusive = true }
+ launchSingleTop = true
+ }
+ )
+ }
+
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+
+ // Add the menu provider
+ requireActivity().addMenuProvider(object : MenuProvider {
+ override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
+ menuInflater.inflate(R.menu.menu_space_setup_success, menu)
+ }
+
+ override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
+ return when (menuItem.itemId) {
+ R.id.action_share_group -> {
+ val action = SnowbirdSetupSuccessFragmentDirections.actionFragmentSnowbirdSetupSuccessToFragmentSnowbirdShareGroup(
+ dwebGroupKey = args.dwebGroupKey,
+ isSetupOngoing = true
+ )
+
+ findNavController().navigate(action)
+ true
+ }
+
+ else -> false
+ }
+ }
+ }, viewLifecycleOwner)
+
+ }
+
+ override fun getToolbarTitle() = getString(R.string.space_setup_success_title)
+ override fun shouldShowBackButton() = false
+
+}
diff --git a/app/src/main/jniLibs/arm64-v8a/libsave.so b/app/src/main/jniLibs/arm64-v8a/libsave.so
deleted file mode 100755
index f94bc1241..000000000
Binary files a/app/src/main/jniLibs/arm64-v8a/libsave.so and /dev/null differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libsave.so b/app/src/main/jniLibs/armeabi-v7a/libsave.so
deleted file mode 100755
index 461dff16a..000000000
Binary files a/app/src/main/jniLibs/armeabi-v7a/libsave.so and /dev/null differ
diff --git a/app/src/main/res/layout/activity_snowbird.xml b/app/src/main/res/layout/activity_snowbird.xml
new file mode 100644
index 000000000..88601d3e8
--- /dev/null
+++ b/app/src/main/res/layout/activity_snowbird.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/navigation/app_nav_graph.xml b/app/src/main/res/navigation/app_nav_graph.xml
index ec1fc3430..16baab2df 100644
--- a/app/src/main/res/navigation/app_nav_graph.xml
+++ b/app/src/main/res/navigation/app_nav_graph.xml
@@ -22,13 +22,6 @@
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
-
-
-
@@ -142,25 +127,7 @@
-
-
-
-
-
-
+
@@ -237,7 +204,4 @@
android:name="net.opendasharchive.openarchive.features.settings.SettingsFragment"
/>
-
-
-
diff --git a/app/src/main/res/navigation/snowbird_nav_graph.xml b/app/src/main/res/navigation/snowbird_nav_graph.xml
index d655e0512..ffa8ef5d0 100644
--- a/app/src/main/res/navigation/snowbird_nav_graph.xml
+++ b/app/src/main/res/navigation/snowbird_nav_graph.xml
@@ -7,29 +7,29 @@
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right"
- app:startDestination="@id/fragment_snowbird">
+ app:startDestination="@id/snowbird_dashboard">
+
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+