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"> + - + + - + + + + + + + + + + +