Skip to content

Commit 6ae54a6

Browse files
committed
fix(backup-fragment): lifecycle, permission management
Signed-off-by: alperozturk96 <alper_ozturk@proton.me>
1 parent 3393948 commit 6ae54a6

1 file changed

Lines changed: 102 additions & 92 deletions

File tree

app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupFragment.kt

Lines changed: 102 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,22 @@ import android.content.Context
1515
import android.content.Intent
1616
import android.os.Bundle
1717
import android.view.LayoutInflater
18+
import android.view.Menu
19+
import android.view.MenuInflater
1820
import android.view.MenuItem
1921
import android.view.View
2022
import android.view.ViewGroup
2123
import android.widget.CompoundButton
2224
import android.widget.DatePicker
23-
import androidx.core.app.ActivityCompat
25+
import androidx.activity.result.contract.ActivityResultContracts
26+
import androidx.core.view.MenuProvider
27+
import androidx.lifecycle.Lifecycle
2428
import androidx.lifecycle.lifecycleScope
2529
import com.nextcloud.client.account.User
2630
import com.nextcloud.client.di.Injectable
2731
import com.nextcloud.client.jobs.BackgroundJobManager
2832
import com.nextcloud.utils.extensions.getSerializableArgument
33+
import com.nextcloud.utils.extensions.getTypedActivity
2934
import com.nextcloud.utils.extensions.setVisibleIf
3035
import com.owncloud.android.R
3136
import com.owncloud.android.databinding.BackupFragmentBinding
@@ -116,8 +121,6 @@ class BackupFragment :
116121

117122
val view: View = binding.root
118123

119-
setHasOptionsMenu(true)
120-
121124
if (arguments != null) {
122125
showSidebar = requireArguments().getBoolean(ARG_SHOW_SIDEBAR)
123126
}
@@ -139,7 +142,7 @@ class BackupFragment :
139142

140143
setupDates(savedInstanceState)
141144
applyUserColor()
142-
145+
addMenuProvider()
143146
return view
144147
}
145148

@@ -320,28 +323,92 @@ class BackupFragment :
320323
}
321324
}
322325

323-
@Deprecated("Deprecated in Java")
324-
override fun onOptionsItemSelected(item: MenuItem): Boolean {
325-
val contactsPreferenceActivity = activity as ContactsPreferenceActivity?
326+
private fun addMenuProvider() {
327+
requireActivity().addMenuProvider(
328+
object : MenuProvider {
329+
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
330+
}
326331

327-
if (item.itemId == android.R.id.home) {
328-
if (showSidebar) {
329-
if (contactsPreferenceActivity!!.isDrawerOpen) {
330-
contactsPreferenceActivity.closeDrawer()
331-
} else {
332-
contactsPreferenceActivity.openDrawer()
332+
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
333+
val activity = getTypedActivity(ContactsPreferenceActivity::class.java)
334+
335+
if (menuItem.itemId == android.R.id.home) {
336+
if (showSidebar) {
337+
if (activity?.isDrawerOpen == true) {
338+
activity.closeDrawer()
339+
} else {
340+
activity?.openDrawer()
341+
}
342+
} else if (activity != null) {
343+
activity.finish()
344+
} else {
345+
val settingsIntent = Intent(context, SettingsActivity::class.java)
346+
startActivity(settingsIntent)
347+
}
348+
return true
349+
}
350+
351+
return false
333352
}
334-
} else if (contactsPreferenceActivity != null) {
335-
contactsPreferenceActivity.finish()
353+
},
354+
viewLifecycleOwner,
355+
Lifecycle.State.RESUMED
356+
)
357+
}
358+
359+
// region permission handling
360+
private fun checkAndAskForContactsReadPermission(): Boolean {
361+
return if (checkSelfPermission(requireActivity(), Manifest.permission.READ_CONTACTS)) {
362+
true
363+
} else {
364+
requestContactsPermissionLauncher.launch(Manifest.permission.READ_CONTACTS)
365+
false
366+
}
367+
}
368+
369+
private fun checkAndAskForCalendarReadPermission(): Boolean {
370+
return if (checkCalendarBackupPermission(requireActivity())) {
371+
true
372+
} else {
373+
requestCalendarPermissionLauncher.launch(
374+
arrayOf(
375+
Manifest.permission.READ_CALENDAR,
376+
Manifest.permission.WRITE_CALENDAR
377+
)
378+
)
379+
false
380+
}
381+
}
382+
383+
private val requestContactsPermissionLauncher =
384+
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
385+
if (isGranted) {
386+
isContactsBackupEnabled = true
336387
} else {
337-
val settingsIntent = Intent(context, SettingsActivity::class.java)
338-
startActivity(settingsIntent)
388+
binding.contacts.setOnCheckedChangeListener(null)
389+
binding.contacts.isChecked = false
390+
binding.contacts.setOnCheckedChangeListener(contactsCheckedListener)
339391
}
340-
return true
392+
setBackupNowButtonVisibility()
393+
setAutomaticBackup(binding.dailyBackup.isChecked)
341394
}
342395

343-
return super.onOptionsItemSelected(item)
344-
}
396+
private val requestCalendarPermissionLauncher =
397+
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
398+
val readGranted = permissions[Manifest.permission.READ_CALENDAR] == true
399+
val writeGranted = permissions[Manifest.permission.WRITE_CALENDAR] == true
400+
401+
if (readGranted && writeGranted) {
402+
isCalendarBackupEnabled = true
403+
} else {
404+
binding.calendar.setOnCheckedChangeListener(null)
405+
binding.calendar.isChecked = false
406+
binding.calendar.setOnCheckedChangeListener(calendarCheckedListener)
407+
}
408+
setBackupNowButtonVisibility()
409+
setAutomaticBackup(binding.dailyBackup.isChecked)
410+
}
411+
// endregion
345412

346413
@Deprecated("Deprecated in Java")
347414
@Suppress("NestedBlockDepth")
@@ -398,45 +465,27 @@ class BackupFragment :
398465
}
399466

400467
private fun backupNow() {
468+
val activity = getTypedActivity(ContactsPreferenceActivity::class.java) ?: return
469+
val user = activity.user?.takeIf { it.isPresent }?.get() ?: return
470+
401471
if (isContactsBackupEnabled && checkContactBackupPermission()) {
402-
startContactsBackupJob()
472+
backgroundJobManager.startImmediateContactsBackup(user)
403473
}
474+
404475
if (showCalendarBackup && isCalendarBackupEnabled && checkCalendarBackupPermission(requireContext())) {
405-
startCalendarBackupJob()
476+
backgroundJobManager.startImmediateCalendarBackup(user)
406477
}
478+
407479
DisplayUtils.showSnackMessage(
408-
requireView().findViewById<View>(R.id.contacts_linear_layout),
480+
this,
409481
R.string.contacts_preferences_backup_scheduled
410482
)
411483
}
412484

413-
private fun startContactsBackupJob() {
414-
val activity = activity as ContactsPreferenceActivity?
415-
if (activity != null) {
416-
val optionalUser = activity.user
417-
if (optionalUser.isPresent) {
418-
backgroundJobManager.startImmediateContactsBackup(optionalUser.get())
419-
}
420-
}
421-
}
422-
423-
private fun startCalendarBackupJob() {
424-
val activity = activity as ContactsPreferenceActivity?
425-
if (activity != null) {
426-
val optionalUser = activity.user
427-
if (optionalUser.isPresent) {
428-
backgroundJobManager.startImmediateCalendarBackup(optionalUser.get())
429-
}
430-
}
431-
}
432-
433485
private fun setAutomaticBackup(enabled: Boolean) {
434-
val activity = activity as ContactsPreferenceActivity? ?: return
435-
val optionalUser = activity.user
436-
if (!optionalUser.isPresent) {
437-
return
438-
}
439-
val user = optionalUser.get()
486+
val activity = getTypedActivity(ContactsPreferenceActivity::class.java) ?: return
487+
val user = activity.user?.takeIf { it.isPresent }?.get() ?: return
488+
440489
if (enabled) {
441490
if (isContactsBackupEnabled) {
442491
Log_OC.d(TAG, "Scheduling contacts backup job")
@@ -464,43 +513,6 @@ class BackupFragment :
464513
)
465514
}
466515

467-
private fun checkAndAskForContactsReadPermission(): Boolean {
468-
val contactsPreferenceActivity = activity as ContactsPreferenceActivity?
469-
470-
// check permissions
471-
return if (checkSelfPermission(contactsPreferenceActivity!!, Manifest.permission.READ_CONTACTS)) {
472-
true
473-
} else {
474-
// No explanation needed, request the permission.
475-
ActivityCompat.requestPermissions(
476-
requireActivity(),
477-
arrayOf(Manifest.permission.READ_CONTACTS),
478-
PermissionUtil.PERMISSIONS_READ_CONTACTS_AUTOMATIC
479-
)
480-
false
481-
}
482-
}
483-
484-
private fun checkAndAskForCalendarReadPermission(): Boolean {
485-
val contactsPreferenceActivity = activity as ContactsPreferenceActivity?
486-
487-
// check permissions
488-
return if (contactsPreferenceActivity?.let { checkCalendarBackupPermission(it) } == true) {
489-
true
490-
} else {
491-
// No explanation needed, request the permission.
492-
ActivityCompat.requestPermissions(
493-
requireActivity(),
494-
arrayOf(
495-
Manifest.permission.READ_CALENDAR,
496-
Manifest.permission.WRITE_CALENDAR
497-
),
498-
PermissionUtil.PERMISSIONS_READ_CALENDAR_AUTOMATIC
499-
)
500-
false
501-
}
502-
}
503-
504516
private fun checkCalendarBackupPermission(context: Context): Boolean =
505517
checkSelfPermission(context, Manifest.permission.READ_CALENDAR) &&
506518
checkSelfPermission(
@@ -660,12 +672,10 @@ class BackupFragment :
660672
const val PREFERENCE_CALENDAR_BACKUP_ENABLED = "PREFERENCE_CALENDAR_BACKUP_ENABLED"
661673

662674
@JvmStatic
663-
fun create(showSidebar: Boolean): BackupFragment {
664-
val fragment = BackupFragment()
665-
val bundle = Bundle()
666-
bundle.putBoolean(ARG_SHOW_SIDEBAR, showSidebar)
667-
fragment.arguments = bundle
668-
return fragment
675+
fun create(showSidebar: Boolean): BackupFragment = BackupFragment().apply {
676+
arguments = Bundle().apply {
677+
putBoolean(ARG_SHOW_SIDEBAR, showSidebar)
678+
}
669679
}
670680
}
671681
}

0 commit comments

Comments
 (0)