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
Original file line number Diff line number Diff line change
Expand Up @@ -60,48 +60,45 @@ class ActivitiesFragment :
@Inject
lateinit var userAccountManager: UserAccountManager

private var _binding: FragmentActivitiesBinding? = null
internal val binding get() = _binding!!
private var binding: FragmentActivitiesBinding? = null

private var adapter: ActivityListAdapter? = null
private var lastGiven: Long = 0
private var isLoadingActivities = false
private var actionListener: ActivitiesContract.ActionListener? = null

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentActivitiesBinding.inflate(inflater, container, false)
binding = FragmentActivitiesBinding.inflate(inflater, container, false)
val binding = binding!!
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
actionListener = ActivitiesPresenter(activitiesRepository, filesRepository, this)
viewThemeUtils.androidx.themeSwipeRefreshLayout(binding.swipeContainingList)
binding.swipeContainingList.setOnRefreshListener {
binding?.swipeContainingList?.let { viewThemeUtils.androidx.themeSwipeRefreshLayout(it) }
binding?.swipeContainingList?.setOnRefreshListener {
lastGiven = ActivitiesContract.ActionListener.UNDEFINED.toLong()
actionListener?.loadActivities(lifecycleScope, lastGiven)
}
setupContent()
}

private fun setupContent() {
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_activity)

binding?.emptyList?.emptyListIcon?.setImageResource(R.drawable.ic_activity)
adapter = ActivityListAdapter(
requireActivity(),
userAccountManager,
this,
false,
viewThemeUtils
)
binding.list.adapter = adapter

binding?.list?.adapter = adapter
val layoutManager = LinearLayoutManager(requireContext())
binding.list.run {
binding?.list?.run {
setLayoutManager(layoutManager)
addOnScrollListener(getOnScrollListener(layoutManager))
}

actionListener?.loadActivities(lifecycleScope, ActivitiesContract.ActionListener.UNDEFINED.toLong())
}

Expand Down Expand Up @@ -138,6 +135,7 @@ class ActivitiesFragment :
}

override fun showActivities(activities: List<Any>, client: NextcloudClient, lastGiven: Long) {
val binding = binding ?: return
val clear = this.lastGiven == ActivitiesContract.ActionListener.UNDEFINED.toLong()
adapter?.setActivityItems(activities, client, clear)
this.lastGiven = lastGiven
Expand All @@ -157,6 +155,7 @@ class ActivitiesFragment :
}

override fun showActivitiesLoadError(error: String) {
val binding = binding ?: return
connectivityService.isNetworkAndServerAvailable {
if (it) {
DisplayUtils.showSnackMessage(requireView(), error)
Expand Down Expand Up @@ -192,11 +191,11 @@ class ActivitiesFragment :
}

override fun showLoadingMessage() {
binding.emptyList.emptyListView.visibility = View.GONE
binding?.emptyList?.emptyListView?.visibility = View.GONE
}

override fun showEmptyContent(headline: String, message: String) {
binding.run {
binding?.run {
emptyList.emptyListViewHeadline.text = headline
emptyList.emptyListViewText.text = message
loadingContent.visibility = View.GONE
Expand All @@ -208,6 +207,7 @@ class ActivitiesFragment :
}

override fun setProgressIndicatorState(isActive: Boolean) {
val binding = binding ?: return
isLoadingActivities = isActive
if (adapter?.isEmpty() == false) {
binding.swipeContainingList.post { binding.swipeContainingList.isRefreshing = isActive }
Expand All @@ -216,6 +216,6 @@ class ActivitiesFragment :

override fun onDestroyView() {
super.onDestroyView()
_binding = null
binding = null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,20 @@ import javax.inject.Inject

class CommunityFragment : Fragment() {

private var _binding: FragmentCommunityBinding? = null
private val binding get() = _binding!!
private var binding: FragmentCommunityBinding? = null

@Inject
lateinit var viewThemeUtils: ViewThemeUtils

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentCommunityBinding.inflate(inflater, container, false)
binding = FragmentCommunityBinding.inflate(inflater, container, false)
val binding = binding!!
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.communityReleaseCandidateText.movementMethod = LinkMovementMethod.getInstance()
binding?.communityReleaseCandidateText?.movementMethod = LinkMovementMethod.getInstance()
setupViews()
setOnClickListeners()
}
Expand All @@ -49,7 +49,7 @@ class CommunityFragment : Fragment() {
val contributingLink = getString(R.string.contributing_link)

listOf(
binding.communityContributeForumText to
binding?.communityContributeForumText to
"${getString(R.string.community_contribute_forum_text)} " +
getString(
R.string.community_contribute_forum_text_link,
Expand All @@ -58,15 +58,15 @@ class CommunityFragment : Fragment() {
forum
),

binding.communityContributeTranslateText to
binding?.communityContributeTranslateText to
getString(
R.string.community_contribute_translate_link,
primaryColor,
translationLink,
translate
) + " " + getString(R.string.community_contribute_translate_text),

binding.communityContributeGithubText to
binding?.communityContributeGithubText to
getString(
R.string.community_contribute_github_text,
getString(
Expand All @@ -76,11 +76,11 @@ class CommunityFragment : Fragment() {
)
)
).forEach { (view, content) ->
view.setHtmlContent(content)
view?.setHtmlContent(content)
}

viewThemeUtils.material.colorMaterialButtonPrimaryFilled(binding.communityTestingReport)
binding.communityTestingReport.setOnClickListener {
binding?.communityTestingReport?.let { viewThemeUtils.material.colorMaterialButtonPrimaryFilled(it) }
binding?.communityTestingReport?.setOnClickListener {
DisplayUtils.startLinkIntent(requireActivity(), R.string.report_issue_empty_link)
}
}
Expand All @@ -89,19 +89,19 @@ class CommunityFragment : Fragment() {
val activity = requireActivity()

listOf(
binding.communityBetaFdroid to R.string.fdroid_beta_link,
binding.communityReleaseCandidateFdroid to R.string.fdroid_link,
binding.communityReleaseCandidatePlaystore to R.string.play_store_register_beta,
binding.communityBetaApk to R.string.beta_apk_link
binding?.communityBetaFdroid to R.string.fdroid_beta_link,
binding?.communityReleaseCandidateFdroid to R.string.fdroid_link,
binding?.communityReleaseCandidatePlaystore to R.string.play_store_register_beta,
binding?.communityBetaApk to R.string.beta_apk_link
).forEach { (view, linkRes) ->
view.setOnClickListener {
view?.setOnClickListener {
DisplayUtils.startLinkIntent(activity, linkRes)
}
}
}

override fun onDestroyView() {
super.onDestroyView()
_binding = null
binding = null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,11 @@ class Navigator(private val fragmentManager: FragmentManager, private val fragme
fragmentManager.popBackStack()
return stack.lastOrNull()
}

fun getTopScreen(): NavigatorScreen? {
val topTag = fragmentManager
.getBackStackEntryAt(fragmentManager.backStackEntryCount - 1)
.name
return NavigatorScreen.fromTag(topTag)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import android.content.Intent
import android.os.Bundle
import android.view.MenuItem
import androidx.activity.OnBackPressedCallback
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentContainerView
import com.nextcloud.utils.extensions.getParcelableArgument
import com.owncloud.android.R
Expand All @@ -22,21 +23,50 @@ class NavigatorActivity : DrawerActivity() {

private lateinit var navigator: Navigator

// region Lifecycle Methods
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_navigator)

val screen = intent.getParcelableArgument(EXTRA_SCREEN, NavigatorScreen::class.java) ?: return
val fragmentContainerView = findViewById<FragmentContainerView>(R.id.fragment_container_view)
navigator = Navigator(supportFragmentManager, fragmentContainerView)

setupBackPressedHandler()
push(screen)
supportFragmentManager.addFragmentOnAttachListener { _, fragment ->
AndroidSupportInjection.inject(fragment)
pushOrRestoreScreen(savedInstanceState, screen)
}

// addFragmentOnAttachListener or via registerFragmentLifecycleCallbacks not providing same result
@Suppress("DEPRECATION")
@Deprecated("Deprecated in Java")
override fun onAttachFragment(fragment: Fragment) {
AndroidSupportInjection.inject(fragment)
super.onAttachFragment(fragment)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
if (isDrawerOpen) {
closeDrawer()
} else {
openDrawer()
}
return true
}
return super.onOptionsItemSelected(item)
}

override fun getMenuItemId(): Int {
val screen = intent.getParcelableArgument(EXTRA_SCREEN, NavigatorScreen::class.java)
return screen?.menuItemId() ?: super.getMenuItemId()
}

override fun onResume() {
super.onResume()
highlightOrRestoreNavigationViewItem()
}
// endregion

// region Public Methods
fun pop() {
val previousScreen = navigator.pop() ?: return
setupActionBar(previousScreen)
Expand All @@ -46,6 +76,18 @@ class NavigatorActivity : DrawerActivity() {
setupActionBar(screen)
navigator.push(screen)
}
// endregion

// region Private Methods
private fun pushOrRestoreScreen(savedInstanceState: Bundle?, screen: NavigatorScreen) {
if (savedInstanceState == null) {
push(screen)
} else {
val currentScreen = navigator.getTopScreen() ?: screen
setupActionBar(currentScreen)
highlightNavigationViewItem(currentScreen.menuItemId())
}
}

private fun setupActionBar(screen: NavigatorScreen) {
val (style, titleId) = screen.actionBarStyle()
Expand Down Expand Up @@ -73,27 +115,15 @@ class NavigatorActivity : DrawerActivity() {
)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
if (isDrawerOpen) {
closeDrawer()
} else {
openDrawer()
}
return true
private fun highlightOrRestoreNavigationViewItem() {
val currentScreen = navigator.getTopScreen()
if (currentScreen != null) {
highlightNavigationViewItem(currentScreen.menuItemId())
} else {
highlightNavigationViewItem(menuItemId)
}
return super.onOptionsItemSelected(item)
}

override fun getMenuItemId(): Int {
val screen = intent.getParcelableArgument(EXTRA_SCREEN, NavigatorScreen::class.java)
return screen?.menuItemId() ?: super.getMenuItemId()
}

override fun onResume() {
super.onResume()
highlightNavigationViewItem(menuItemId)
}
// endregion

companion object {
const val EXTRA_SCREEN = "extra_screen"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,21 @@ import kotlinx.parcelize.Parcelize
sealed class NavigatorScreen(val tag: String) : Parcelable {

@Parcelize
object Activities : NavigatorScreen("Activities")
object Activities : NavigatorScreen(ACTIVITIES_TAG)

@Parcelize
object Community : NavigatorScreen("Community")
object Community : NavigatorScreen(COMMUNITY_TAG)

companion object {
private const val ACTIVITIES_TAG = "Activities"
private const val COMMUNITY_TAG = "Community"

fun fromTag(tag: String?): NavigatorScreen? = when (tag) {
ACTIVITIES_TAG -> Activities
COMMUNITY_TAG -> Community
else -> null
}
}

fun menuItemId(): Int = when (this) {
Community -> R.id.nav_community
Expand Down
Loading