27
27
28
28
package com.owncloud.android.ui.activity
29
29
30
+ import android.Manifest.permission.POST_NOTIFICATIONS
30
31
import android.accounts.Account
31
32
import android.content.BroadcastReceiver
32
33
import android.content.Context
33
34
import android.content.Intent
34
35
import android.content.IntentFilter
36
+ import android.content.pm.PackageManager
35
37
import android.net.Uri
38
+ import android.os.Build
36
39
import android.os.Bundle
37
40
import android.os.RemoteException
38
41
import android.view.Menu
39
42
import android.view.MenuItem
40
43
import android.view.View
41
44
import android.widget.FrameLayout
45
+ import androidx.activity.result.contract.ActivityResultContracts
46
+ import androidx.core.content.ContextCompat
42
47
import androidx.core.view.isVisible
43
48
import androidx.fragment.app.Fragment
44
49
import androidx.localbroadcastmanager.content.LocalBroadcastManager
@@ -47,6 +52,7 @@ import com.owncloud.android.AppRater
47
52
import com.owncloud.android.BuildConfig
48
53
import com.owncloud.android.MainApp
49
54
import com.owncloud.android.R
55
+ import com.owncloud.android.data.preferences.datasources.SharedPreferencesProvider
50
56
import com.owncloud.android.databinding.ActivityMainBinding
51
57
import com.owncloud.android.domain.camerauploads.model.UploadBehavior
52
58
import com.owncloud.android.domain.capabilities.model.OCCapability
@@ -164,6 +170,8 @@ class FileDisplayActivity : FileActivity(),
164
170
private val fileOperationsViewModel: FileOperationsViewModel by viewModel()
165
171
private val transfersViewModel: TransfersViewModel by viewModel()
166
172
173
+ private val sharedPreferences: SharedPreferencesProvider by inject()
174
+
167
175
var filesUploadHelper: FilesUploadHelper ? = null
168
176
internal set
169
177
@@ -246,9 +254,34 @@ class FileDisplayActivity : FileActivity(),
246
254
AppRater .appLaunched(this , packageName)
247
255
}
248
256
257
+ checkNotificationPermission()
249
258
Timber .v(" onCreate() end" )
250
259
}
251
260
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
+
252
285
override fun onPostCreate (savedInstanceState : Bundle ? ) {
253
286
super .onPostCreate(savedInstanceState)
254
287
@@ -1535,6 +1568,7 @@ class FileDisplayActivity : FileActivity(),
1535
1568
private const val KEY_UPLOAD_HELPER = " FILE_UPLOAD_HELPER"
1536
1569
private const val KEY_FILE_LIST_OPTION = " FILE_LIST_OPTION"
1537
1570
1571
+ private const val PREFERENCE_NOTIFICATION_PERMISSION_REQUESTED = " PREFERENCE_NOTIFICATION_PERMISSION_REQUESTED"
1538
1572
const val ALL_FILES_SAF_REGEX = " */*"
1539
1573
1540
1574
const val ACTION_DETAILS = " com.owncloud.android.ui.activity.action.DETAILS"
0 commit comments