1
1
package fr.free.nrw.commons.customselector.ui.selector
2
2
3
+ import android.Manifest
3
4
import android.app.Activity
4
5
import android.app.Dialog
5
6
import android.content.Intent
6
7
import android.content.SharedPreferences
8
+ import android.content.pm.PackageManager
9
+ import android.os.Build
7
10
import android.os.Bundle
11
+ import android.util.Log
8
12
import android.view.View
9
13
import android.view.Window
10
14
import android.widget.Button
11
15
import android.widget.ImageButton
12
16
import android.widget.TextView
17
+ import androidx.compose.foundation.BorderStroke
18
+ import androidx.compose.foundation.background
19
+ import androidx.compose.foundation.clickable
20
+ import androidx.compose.foundation.layout.Arrangement
21
+ import androidx.compose.foundation.layout.Box
22
+ import androidx.compose.foundation.layout.Row
23
+ import androidx.compose.foundation.layout.fillMaxWidth
24
+ import androidx.compose.foundation.layout.height
25
+ import androidx.compose.foundation.layout.padding
26
+ import androidx.compose.foundation.shape.RoundedCornerShape
27
+ import androidx.compose.material3.Button
28
+ import androidx.compose.material3.ButtonDefaults
29
+ import androidx.compose.material3.CardDefaults
30
+ import androidx.compose.material3.MaterialTheme
31
+ import androidx.compose.material3.OutlinedCard
32
+ import androidx.compose.material3.Surface
33
+ import androidx.compose.material3.Text
34
+ import androidx.compose.material3.TextButton
35
+ import androidx.compose.runtime.Composable
36
+ import androidx.compose.runtime.getValue
37
+ import androidx.compose.runtime.mutableStateOf
38
+ import androidx.compose.runtime.setValue
39
+ import androidx.compose.ui.Alignment
40
+ import androidx.compose.ui.Modifier
41
+ import androidx.compose.ui.draw.clip
42
+ import androidx.compose.ui.res.colorResource
43
+ import androidx.compose.ui.tooling.preview.Preview
44
+ import androidx.compose.ui.unit.dp
13
45
import androidx.constraintlayout.widget.ConstraintLayout
46
+ import androidx.core.content.ContextCompat
14
47
import androidx.lifecycle.ViewModelProvider
15
48
import fr.free.nrw.commons.R
16
49
import fr.free.nrw.commons.customselector.database.NotForUploadStatus
@@ -24,10 +57,12 @@ import fr.free.nrw.commons.databinding.ActivityCustomSelectorBinding
24
57
import fr.free.nrw.commons.databinding.CustomSelectorBottomLayoutBinding
25
58
import fr.free.nrw.commons.databinding.CustomSelectorToolbarBinding
26
59
import fr.free.nrw.commons.filepicker.Constants
60
+ import fr.free.nrw.commons.filepicker.FilePicker
27
61
import fr.free.nrw.commons.media.ZoomableActivity
28
62
import fr.free.nrw.commons.theme.BaseActivity
29
63
import fr.free.nrw.commons.upload.FileUtilsWrapper
30
64
import fr.free.nrw.commons.utils.CustomSelectorUtils
65
+ import fr.free.nrw.commons.utils.PermissionUtils
31
66
import kotlinx.coroutines.*
32
67
import java.io.File
33
68
import java.lang.Integer.max
@@ -114,14 +149,37 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
114
149
115
150
private var progressDialogText: String = " "
116
151
152
+ private var showPartialAccessIndicator by mutableStateOf(false )
153
+
117
154
/* *
118
155
* onCreate Activity, sets theme, initialises the view model, setup view.
119
156
*/
120
157
override fun onCreate (savedInstanceState : Bundle ? ) {
121
158
super .onCreate(savedInstanceState)
159
+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .UPSIDE_DOWN_CAKE &&
160
+ ContextCompat .checkSelfPermission(
161
+ this , Manifest .permission.READ_MEDIA_IMAGES
162
+ ) == PackageManager .PERMISSION_DENIED
163
+ ) {
164
+ showPartialAccessIndicator = true
165
+ }
166
+
122
167
binding = ActivityCustomSelectorBinding .inflate(layoutInflater)
123
168
toolbarBinding = CustomSelectorToolbarBinding .bind(binding.root)
124
169
bottomSheetBinding = CustomSelectorBottomLayoutBinding .bind(binding.root)
170
+ binding.partialAccessIndicator.setContent {
171
+ PartialStorageAccessIndicator (
172
+ isVisible = showPartialAccessIndicator,
173
+ onManage = {
174
+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .UPSIDE_DOWN_CAKE ) {
175
+ requestPermissions(arrayOf(Manifest .permission.READ_MEDIA_IMAGES ), 1 )
176
+ }
177
+ },
178
+ modifier = Modifier
179
+ .padding(vertical = 8 .dp, horizontal = 4 .dp)
180
+ .fillMaxWidth()
181
+ )
182
+ }
125
183
val view = binding.root
126
184
setContentView(view)
127
185
@@ -147,6 +205,24 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
147
205
}
148
206
}
149
207
208
+ override fun onRequestPermissionsResult (
209
+ requestCode : Int ,
210
+ permissions : Array <out String >,
211
+ grantResults : IntArray
212
+ ) {
213
+ super .onRequestPermissionsResult(requestCode, permissions, grantResults)
214
+ if (requestCode == 1 && Build .VERSION .SDK_INT >= Build .VERSION_CODES .UPSIDE_DOWN_CAKE ) {
215
+ if (grantResults.isNotEmpty() && grantResults[0 ] == PackageManager .PERMISSION_GRANTED ) {
216
+ showPartialAccessIndicator = false
217
+ }
218
+ }
219
+ }
220
+
221
+ override fun onResume () {
222
+ super .onResume()
223
+ fetchData()
224
+ }
225
+
150
226
/* *
151
227
* When data will be send from full screen mode, it will be passed to fragment
152
228
*/
@@ -181,7 +257,6 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
181
257
supportFragmentManager.beginTransaction()
182
258
.replace(R .id.fragment_container, FolderFragment .newInstance())
183
259
.commit()
184
- fetchData()
185
260
setUpToolbar()
186
261
setUpBottomLayout()
187
262
}
@@ -498,3 +573,52 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
498
573
const val ITEM_ID : String = " ItemId"
499
574
}
500
575
}
576
+ @Composable
577
+ fun PartialStorageAccessIndicator (
578
+ isVisible : Boolean ,
579
+ onManage : ()-> Unit ,
580
+ modifier : Modifier = Modifier
581
+ ) {
582
+ if (isVisible) {
583
+ OutlinedCard (
584
+ modifier = modifier,
585
+ colors = CardDefaults .cardColors(
586
+ containerColor = colorResource(R .color.primarySuperLightColor)
587
+ ),
588
+ border = BorderStroke (0.5 .dp, color = colorResource(R .color.primaryColor)),
589
+ shape = RoundedCornerShape (8 .dp)
590
+ ) {
591
+ Row (modifier = Modifier .padding(16 .dp).fillMaxWidth()) {
592
+ Text (
593
+ text = " You've given access to a select number of photos" ,
594
+ modifier = Modifier .weight(1f )
595
+ )
596
+ TextButton (
597
+ onClick = onManage,
598
+ modifier = Modifier .align(Alignment .Bottom ),
599
+ colors = ButtonDefaults .buttonColors(
600
+ containerColor = colorResource(R .color.primaryColor)
601
+ ),
602
+ shape = RoundedCornerShape (8 .dp)
603
+ ) {
604
+ Text (
605
+ text = " Manage" ,
606
+ style = MaterialTheme .typography.labelMedium,
607
+ color = colorResource(R .color.primaryTextColor)
608
+ )
609
+ }
610
+ }
611
+ }
612
+ }
613
+ }
614
+
615
+ @Preview
616
+ @Composable
617
+ fun PartialStorageAccessIndicatorPreview () {
618
+ Surface {
619
+ PartialStorageAccessIndicator (isVisible = true , onManage = {}, modifier = Modifier
620
+ .padding(vertical = 8 .dp, horizontal = 4 .dp)
621
+ .fillMaxWidth()
622
+ )
623
+ }
624
+ }
0 commit comments