@@ -15,17 +15,22 @@ import android.content.Context
1515import android.content.Intent
1616import android.os.Bundle
1717import android.view.LayoutInflater
18+ import android.view.Menu
19+ import android.view.MenuInflater
1820import android.view.MenuItem
1921import android.view.View
2022import android.view.ViewGroup
2123import android.widget.CompoundButton
2224import 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
2428import androidx.lifecycle.lifecycleScope
2529import com.nextcloud.client.account.User
2630import com.nextcloud.client.di.Injectable
2731import com.nextcloud.client.jobs.BackgroundJobManager
2832import com.nextcloud.utils.extensions.getSerializableArgument
33+ import com.nextcloud.utils.extensions.getTypedActivity
2934import com.nextcloud.utils.extensions.setVisibleIf
3035import com.owncloud.android.R
3136import 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