2727
2828package com.owncloud.android.ui.activity
2929
30+ import android.Manifest.permission.POST_NOTIFICATIONS
3031import android.accounts.Account
3132import android.content.BroadcastReceiver
3233import android.content.Context
3334import android.content.Intent
3435import android.content.IntentFilter
36+ import android.content.pm.PackageManager
3537import android.net.Uri
38+ import android.os.Build
3639import android.os.Bundle
3740import android.os.RemoteException
3841import android.view.Menu
3942import android.view.MenuItem
4043import android.view.View
4144import android.widget.FrameLayout
45+ import androidx.activity.result.contract.ActivityResultContracts
46+ import androidx.core.content.ContextCompat
4247import androidx.core.view.isVisible
4348import androidx.fragment.app.Fragment
4449import androidx.localbroadcastmanager.content.LocalBroadcastManager
@@ -47,6 +52,7 @@ import com.owncloud.android.AppRater
4752import com.owncloud.android.BuildConfig
4853import com.owncloud.android.MainApp
4954import com.owncloud.android.R
55+ import com.owncloud.android.data.preferences.datasources.SharedPreferencesProvider
5056import com.owncloud.android.databinding.ActivityMainBinding
5157import com.owncloud.android.domain.camerauploads.model.UploadBehavior
5258import com.owncloud.android.domain.capabilities.model.OCCapability
@@ -164,6 +170,8 @@ class FileDisplayActivity : FileActivity(),
164170 private val fileOperationsViewModel: FileOperationsViewModel by viewModel()
165171 private val transfersViewModel: TransfersViewModel by viewModel()
166172
173+ private val sharedPreferences: SharedPreferencesProvider by inject()
174+
167175 var filesUploadHelper: FilesUploadHelper ? = null
168176 internal set
169177
@@ -246,9 +254,34 @@ class FileDisplayActivity : FileActivity(),
246254 AppRater .appLaunched(this , packageName)
247255 }
248256
257+ checkNotificationPermission()
249258 Timber .v(" onCreate() end" )
250259 }
251260
261+ private fun checkNotificationPermission () {
262+ // Ask for permission only in case it's api >= 33 and notifications are not granted.
263+ if (Build .VERSION .SDK_INT < Build .VERSION_CODES .TIRAMISU ||
264+ ContextCompat .checkSelfPermission(this , POST_NOTIFICATIONS ) == PackageManager .PERMISSION_GRANTED
265+ ) return
266+
267+ // Permission denied. Can be because notifications are off by default or because they were denied by the user.
268+ val alreadyRequested = sharedPreferences.getBoolean(PREFERENCE_NOTIFICATION_PERMISSION_REQUESTED , false )
269+ val shouldShowPermissionRequest = shouldShowRequestPermissionRationale(POST_NOTIFICATIONS )
270+ Timber .d(" Already requested notification permission $alreadyRequested and should ask again $shouldShowPermissionRequest " )
271+ if (! alreadyRequested || shouldShowPermissionRequest) {
272+ // Not requested yet or system considers we can request the permission again.
273+ val requestPermissionLauncher =
274+ registerForActivityResult(ActivityResultContracts .RequestPermission ()) { isGranted: Boolean ->
275+ Timber .d(" Permission to send notifications granted: $isGranted " )
276+ if (! isGranted) {
277+ showSnackMessage(getString(R .string.notifications_permission_denied))
278+ }
279+ sharedPreferences.putBoolean(PREFERENCE_NOTIFICATION_PERMISSION_REQUESTED , true )
280+ }
281+ requestPermissionLauncher.launch(POST_NOTIFICATIONS )
282+ }
283+ }
284+
252285 override fun onPostCreate (savedInstanceState : Bundle ? ) {
253286 super .onPostCreate(savedInstanceState)
254287
@@ -1535,6 +1568,7 @@ class FileDisplayActivity : FileActivity(),
15351568 private const val KEY_UPLOAD_HELPER = " FILE_UPLOAD_HELPER"
15361569 private const val KEY_FILE_LIST_OPTION = " FILE_LIST_OPTION"
15371570
1571+ private const val PREFERENCE_NOTIFICATION_PERMISSION_REQUESTED = " PREFERENCE_NOTIFICATION_PERMISSION_REQUESTED"
15381572 const val ALL_FILES_SAF_REGEX = " */*"
15391573
15401574 const val ACTION_DETAILS = " com.owncloud.android.ui.activity.action.DETAILS"
0 commit comments