Skip to content

Commit 9c683aa

Browse files
committed
add new UI component to allows user to manage partially access photos
Implement using composeView
1 parent 8ec9118 commit 9c683aa

File tree

2 files changed

+134
-2
lines changed

2 files changed

+134
-2
lines changed

app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt

Lines changed: 125 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,49 @@
11
package fr.free.nrw.commons.customselector.ui.selector
22

3+
import android.Manifest
34
import android.app.Activity
45
import android.app.Dialog
56
import android.content.Intent
67
import android.content.SharedPreferences
8+
import android.content.pm.PackageManager
9+
import android.os.Build
710
import android.os.Bundle
11+
import android.util.Log
812
import android.view.View
913
import android.view.Window
1014
import android.widget.Button
1115
import android.widget.ImageButton
1216
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
1345
import androidx.constraintlayout.widget.ConstraintLayout
46+
import androidx.core.content.ContextCompat
1447
import androidx.lifecycle.ViewModelProvider
1548
import fr.free.nrw.commons.R
1649
import fr.free.nrw.commons.customselector.database.NotForUploadStatus
@@ -24,10 +57,12 @@ import fr.free.nrw.commons.databinding.ActivityCustomSelectorBinding
2457
import fr.free.nrw.commons.databinding.CustomSelectorBottomLayoutBinding
2558
import fr.free.nrw.commons.databinding.CustomSelectorToolbarBinding
2659
import fr.free.nrw.commons.filepicker.Constants
60+
import fr.free.nrw.commons.filepicker.FilePicker
2761
import fr.free.nrw.commons.media.ZoomableActivity
2862
import fr.free.nrw.commons.theme.BaseActivity
2963
import fr.free.nrw.commons.upload.FileUtilsWrapper
3064
import fr.free.nrw.commons.utils.CustomSelectorUtils
65+
import fr.free.nrw.commons.utils.PermissionUtils
3166
import kotlinx.coroutines.*
3267
import java.io.File
3368
import java.lang.Integer.max
@@ -114,14 +149,37 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
114149

115150
private var progressDialogText:String=""
116151

152+
private var showPartialAccessIndicator by mutableStateOf(false)
153+
117154
/**
118155
* onCreate Activity, sets theme, initialises the view model, setup view.
119156
*/
120157
override fun onCreate(savedInstanceState: Bundle?) {
121158
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+
122167
binding = ActivityCustomSelectorBinding.inflate(layoutInflater)
123168
toolbarBinding = CustomSelectorToolbarBinding.bind(binding.root)
124169
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+
}
125183
val view = binding.root
126184
setContentView(view)
127185

@@ -147,6 +205,24 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
147205
}
148206
}
149207

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+
150226
/**
151227
* When data will be send from full screen mode, it will be passed to fragment
152228
*/
@@ -181,7 +257,6 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
181257
supportFragmentManager.beginTransaction()
182258
.replace(R.id.fragment_container, FolderFragment.newInstance())
183259
.commit()
184-
fetchData()
185260
setUpToolbar()
186261
setUpBottomLayout()
187262
}
@@ -498,3 +573,52 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
498573
const val ITEM_ID: String = "ItemId"
499574
}
500575
}
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+
}

app/src/main/res/layout/activity_custom_selector.xml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,25 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
45
android:layout_width="match_parent"
56
android:layout_height="match_parent">
67

78
<include layout="@layout/custom_selector_toolbar" />
89

10+
<androidx.compose.ui.platform.ComposeView
11+
android:id="@+id/partial_access_indicator"
12+
android:layout_width="match_parent"
13+
android:layout_height="0dp"
14+
app:layout_constraintTop_toBottomOf="@id/toolbar_layout"/>
15+
916
<androidx.fragment.app.FragmentContainerView
1017
android:id="@+id/fragment_container"
1118
android:layout_width="match_parent"
1219
android:layout_height="0dp"
1320
app:layout_constraintBottom_toTopOf="@id/bottom_layout"
14-
app:layout_constraintTop_toBottomOf="@+id/toolbar_layout" />
21+
app:layout_constraintTop_toBottomOf="@+id/partial_access_indicator"
22+
tools:layout_editor_absoluteX="-16dp" />
1523

1624
<include layout="@layout/custom_selector_bottom_layout" />
1725

0 commit comments

Comments
 (0)