Skip to content

Commit 1847e34

Browse files
Merge pull request #185 from PermanentOrg/feature/VSP-857
Feature/vsp 857
2 parents 0624737 + bfb3de2 commit 1847e34

35 files changed

+1046
-252
lines changed

app/build.gradle

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ android {
1616
applicationId "org.permanent.PermanentArchive"
1717
minSdkVersion 26
1818
targetSdkVersion 32
19-
versionCode 40
20-
versionName "1.5.0"
19+
versionCode 41
20+
versionName "1.6.0"
2121

2222
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
2323
}
@@ -45,6 +45,7 @@ android {
4545
buildConfigField "String", "BASE_API_URL", "\"https://www.permanent.org/api/\""
4646
buildConfigField "String", "PAYMENT_INTENT_URL", "\"https://us-central1-prpledgeprod.cloudfunctions.net/donation/payment-sheet\""
4747
buildConfigField "String", "ADD_STORAGE_URL", "\"https://www.permanent.org/add-storage/\""
48+
buildConfigField "String", "ACCESS_ROLES_URL", "\"https://desk.zoho.com/portal/permanent/en/kb/articles/roles-for-collaboration-and-sharing/\""
4849
buildConfigField "String", "HELP_URL", "\"https://desk.zoho.com/portal/permanent/en/home/\""
4950
buildConfigField "String", "TERMS_URL", "\"https://www.permanent.org/terms/\""
5051
manifestPlaceholders = ['appAuthRedirectScheme': "${applicationId.toLowerCase()}"]
@@ -56,6 +57,7 @@ android {
5657
buildConfigField "String", "BASE_API_URL", "\"https://staging.permanent.org/api/\""
5758
buildConfigField "String", "PAYMENT_INTENT_URL", "\"https://us-central1-prpledgestaging.cloudfunctions.net/donation/payment-sheet\""
5859
buildConfigField "String", "ADD_STORAGE_URL", "\"https://staging.permanent.org/add-storage/\""
60+
buildConfigField "String", "ACCESS_ROLES_URL", "\"https://desk.zoho.com/portal/permanent/en/kb/articles/roles-for-collaboration-and-sharing/\""
5961
buildConfigField "String", "HELP_URL", "\"https://desk.zoho.com/portal/permanent/en/home/\""
6062
buildConfigField "String", "TERMS_URL", "\"https://www.permanent.org/terms/\""
6163
manifestPlaceholders = ['appAuthRedirectScheme': "${applicationId}"]

app/src/main/java/org/permanent/permanent/CurrentArchivePermissionsManager.kt

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import org.permanent.permanent.ui.PreferencesHelper
88
class CurrentArchivePermissionsManager private constructor() {
99

1010
private var accessRole: AccessRole
11+
1112
companion object {
1213
val instance = CurrentArchivePermissionsManager()
1314
}
@@ -47,24 +48,5 @@ class CurrentArchivePermissionsManager private constructor() {
4748

4849
fun isOwnershipAvailable() = accessRole.isOwnershipAvailable()
4950

50-
fun getPermissionsEnumerated(): String {
51-
var enumeratedPermissions = ""
52-
val currentArchivePermissions = accessRole.getPermissions().toMutableList()
53-
currentArchivePermissions.remove(ArchivePermission.ARCHIVE_SHARE)
54-
currentArchivePermissions.map { it.toLowerCase() }
55-
currentArchivePermissions.forEachIndexed { index, permission ->
56-
enumeratedPermissions += when {
57-
currentArchivePermissions.size == 1 -> {
58-
permission.toUIString()
59-
}
60-
index != currentArchivePermissions.size - 1 -> {
61-
"${permission.toUIString()}, "
62-
}
63-
else -> {
64-
"and ${permission.toUIString()}"
65-
}
66-
}
67-
}
68-
return enumeratedPermissions
69-
}
51+
fun getPermissionsEnumerated(): String = accessRole.getPermissionsEnumerated()
7052
}

app/src/main/java/org/permanent/permanent/models/AccessRole.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,27 @@ enum class AccessRole(val backendString: String) : Parcelable {
119119
return if (otherAccessRole in inferiors()) otherAccessRole else this
120120
}
121121

122+
fun getPermissionsEnumerated(): String {
123+
var enumeratedPermissions = ""
124+
val currentArchivePermissions = getPermissions().toMutableList()
125+
currentArchivePermissions.remove(ArchivePermission.ARCHIVE_SHARE)
126+
currentArchivePermissions.map { it.toLowerCase() }
127+
currentArchivePermissions.forEachIndexed { index, permission ->
128+
enumeratedPermissions += when {
129+
currentArchivePermissions.size == 1 -> {
130+
permission.toUIString()
131+
}
132+
index != currentArchivePermissions.size - 1 -> {
133+
"${permission.toUIString()}, "
134+
}
135+
else -> {
136+
"and ${permission.toUIString()}"
137+
}
138+
}
139+
}
140+
return enumeratedPermissions
141+
}
142+
122143
override fun writeToParcel(parcel: Parcel, flags: Int) {
123144
parcel.writeInt(ordinal)
124145
}

app/src/main/java/org/permanent/permanent/models/ShareByUrl.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package org.permanent.permanent.models
33
import android.os.Parcel
44
import android.os.Parcelable
55
import org.permanent.permanent.network.models.Shareby_urlVO
6-
import org.permanent.permanent.models.AccessRole
76

87
class ShareByUrl() : Parcelable {
98
var shareUrl: String? = null
@@ -13,7 +12,6 @@ class ShareByUrl() : Parcelable {
1312
var defaultAccessRole: String? = null
1413
var expiresDT: String? = null // can be null for no expiration
1514
var maxUses: Int? = null // can be 0 for unlimited uses
16-
var defaultAccessRole: AccessRole? = null
1715
var byAccountId: Int? = null
1816
var byArchiveId: Int? = null
1917

@@ -25,7 +23,6 @@ class ShareByUrl() : Parcelable {
2523
defaultAccessRole = shareByUrlVO.defaultAccessRole
2624
expiresDT = shareByUrlVO.expiresDT
2725
maxUses = shareByUrlVO.maxUses
28-
defaultAccessRole = AccessRole.createFromBackendString(shareByUrlVO.defaultAccessRole)
2926
byAccountId = shareByUrlVO.byAccountId
3027
byArchiveId = shareByUrlVO.byArchiveId
3128
}
@@ -38,7 +35,6 @@ class ShareByUrl() : Parcelable {
3835
defaultAccessRole = parcel.readString()
3936
expiresDT = parcel.readString()
4037
maxUses = parcel.readValue(Int::class.java.classLoader) as? Int
41-
defaultAccessRole = parcel.readValue(AccessRole::class.java.classLoader) as? AccessRole
4238
byAccountId = parcel.readValue(Int::class.java.classLoader) as? Int
4339
byArchiveId = parcel.readValue(Int::class.java.classLoader) as? Int
4440
}
@@ -51,7 +47,6 @@ class ShareByUrl() : Parcelable {
5147
parcel.writeString(defaultAccessRole)
5248
parcel.writeString(expiresDT)
5349
parcel.writeValue(maxUses)
54-
parcel.writeValue(defaultAccessRole)
5550
parcel.writeValue(byAccountId)
5651
parcel.writeValue(byArchiveId)
5752
}

app/src/main/java/org/permanent/permanent/network/models/Shareby_urlVO.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package org.permanent.permanent.network.models
33
import android.os.Parcel
44
import android.os.Parcelable
55
import org.permanent.permanent.models.ShareByUrl
6-
import org.permanent.permanent.models.AccessRole
76

87
class Shareby_urlVO() : Parcelable {
98
var shareUrl: String? = null
@@ -13,7 +12,6 @@ class Shareby_urlVO() : Parcelable {
1312
var defaultAccessRole: String? = null
1413
var expiresDT: String? = null // can be null for no expiration
1514
var maxUses: Int? = null // can be 0 for unlimited uses
16-
var defaultAccessRole: String? = null
1715
var byAccountId: Int? = null
1816
var byArchiveId: Int? = null
1917
var urlToken: String? = null
@@ -44,7 +42,6 @@ class Shareby_urlVO() : Parcelable {
4442
defaultAccessRole = shareByUrl.defaultAccessRole
4543
expiresDT = shareByUrl.expiresDT
4644
maxUses = shareByUrl.maxUses
47-
defaultAccessRole = shareByUrl.defaultAccessRole?.backendString
4845
byAccountId = shareByUrl.byAccountId
4946
byArchiveId = shareByUrl.byArchiveId
5047
}
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
package org.permanent.permanent.ui
2+
3+
import android.app.Dialog
4+
import android.content.DialogInterface
5+
import android.content.Intent
6+
import android.graphics.Typeface
7+
import android.net.Uri
8+
import android.os.Bundle
9+
import android.view.LayoutInflater
10+
import android.view.View
11+
import android.view.ViewGroup
12+
import android.widget.FrameLayout
13+
import android.widget.TextView
14+
import androidx.core.content.ContextCompat
15+
import androidx.lifecycle.MutableLiveData
16+
import androidx.lifecycle.Observer
17+
import androidx.lifecycle.ViewModelProvider
18+
import com.google.android.material.bottomsheet.BottomSheetBehavior
19+
import com.google.android.material.bottomsheet.BottomSheetDialog
20+
import com.google.android.material.snackbar.Snackbar
21+
import org.permanent.permanent.BuildConfig
22+
import org.permanent.permanent.R
23+
import org.permanent.permanent.databinding.FragmentAccessRolesBinding
24+
import org.permanent.permanent.models.AccessRole
25+
import org.permanent.permanent.models.Share
26+
import org.permanent.permanent.network.models.Shareby_urlVO
27+
import org.permanent.permanent.ui.shareManagement.ShareManagementFragment
28+
import org.permanent.permanent.viewmodels.AccessRolesViewModel
29+
import org.permanent.permanent.viewmodels.SingleLiveEvent
30+
31+
class AccessRolesFragment : PermanentBottomSheetFragment() {
32+
private lateinit var binding: FragmentAccessRolesBinding
33+
private lateinit var viewModel: AccessRolesViewModel
34+
private val onAccessRoleUpdated = SingleLiveEvent<AccessRole?>()
35+
36+
fun setBundleArguments(
37+
shareByUrlVo: Shareby_urlVO,
38+
) {
39+
val bundle = Bundle()
40+
bundle.putParcelable(ShareManagementFragment.SHARE_BY_URL_VO_KEY, shareByUrlVo)
41+
this.arguments = bundle
42+
}
43+
44+
fun setBundleArguments(
45+
share: Share,
46+
) {
47+
val bundle = Bundle()
48+
bundle.putParcelable(ShareManagementFragment.PARCELABLE_SHARE_KEY, share)
49+
this.arguments = bundle
50+
}
51+
52+
override fun onCreateView(
53+
inflater: LayoutInflater,
54+
container: ViewGroup?,
55+
savedInstanceState: Bundle?
56+
): View {
57+
viewModel = ViewModelProvider(this)[AccessRolesViewModel::class.java]
58+
binding = FragmentAccessRolesBinding.inflate(inflater, container, false)
59+
binding.executePendingBindings()
60+
binding.lifecycleOwner = this
61+
binding.viewModel = viewModel
62+
viewModel.setShareLink(arguments?.getParcelable(ShareManagementFragment.SHARE_BY_URL_VO_KEY))
63+
viewModel.setShare(arguments?.getParcelable(ShareManagementFragment.PARCELABLE_SHARE_KEY))
64+
initCurrentAccessRole()
65+
66+
return binding.root
67+
}
68+
69+
private fun initCurrentAccessRole() {
70+
when (viewModel.getCheckedAccessRole().value) {
71+
AccessRole.CONTRIBUTOR -> binding.radioGroup.check(R.id.rbContributor)
72+
AccessRole.EDITOR -> binding.radioGroup.check(R.id.rbEditor)
73+
AccessRole.CURATOR -> binding.radioGroup.check(R.id.rbCurator)
74+
AccessRole.OWNER -> binding.radioGroup.check(R.id.rbOwner)
75+
else -> {
76+
binding.radioGroup.check(R.id.rbViewer)
77+
}
78+
}
79+
}
80+
81+
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
82+
val bottomSheetDialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog
83+
bottomSheetDialog.setOnShowListener { dialog: DialogInterface ->
84+
val dialogc = dialog as BottomSheetDialog
85+
val bottomSheet =
86+
dialogc.findViewById<FrameLayout>(com.google.android.material.R.id.design_bottom_sheet)
87+
BottomSheetBehavior.from(bottomSheet as FrameLayout)
88+
.setState(BottomSheetBehavior.STATE_EXPANDED)
89+
}
90+
return bottomSheetDialog
91+
}
92+
93+
private val showSnackbarSuccess = Observer<String> { message ->
94+
dialog?.window?.decorView?.let {
95+
val snackBar = Snackbar.make(it, message, Snackbar.LENGTH_LONG)
96+
val view: View = snackBar.view
97+
context?.let {
98+
view.setBackgroundColor(ContextCompat.getColor(it, R.color.paleGreen))
99+
snackBar.setTextColor(ContextCompat.getColor(it, R.color.green))
100+
}
101+
val snackbarTextTextView = view.findViewById(R.id.snackbar_text) as TextView
102+
snackbarTextTextView.setTypeface(snackbarTextTextView.typeface, Typeface.BOLD)
103+
snackBar.show()
104+
}
105+
}
106+
107+
private val showSnackbar = Observer<String> { message ->
108+
dialog?.window?.decorView?.let {
109+
Snackbar.make(it, message, Snackbar.LENGTH_LONG).show()
110+
}
111+
}
112+
113+
private val onCloseSheetObserver = Observer<Void> {
114+
dismiss()
115+
}
116+
117+
private val onAccessRoleUpdatedObserver = Observer<AccessRole?> {
118+
onAccessRoleUpdated.value = it
119+
dismiss()
120+
}
121+
122+
private val showAccessRolesDocObserver = Observer<Void> {
123+
val intent = Intent(Intent.ACTION_VIEW)
124+
intent.data = Uri.parse(BuildConfig.ACCESS_ROLES_URL)
125+
startActivity(intent)
126+
}
127+
128+
fun getOnAccessRoleUpdated(): MutableLiveData<AccessRole?> = onAccessRoleUpdated
129+
130+
override fun connectViewModelEvents() {
131+
viewModel.getShowAccessRolesDocumentation().observe(this, showAccessRolesDocObserver)
132+
viewModel.getOnAccessRoleUpdated().observe(this, onAccessRoleUpdatedObserver)
133+
viewModel.getOnCloseSheetRequest().observe(this, onCloseSheetObserver)
134+
viewModel.getShowSnackbar().observe(this, showSnackbar)
135+
viewModel.getShowSnackbarSuccess().observe(this, showSnackbarSuccess)
136+
}
137+
138+
override fun disconnectViewModelEvents() {
139+
viewModel.getShowAccessRolesDocumentation().removeObserver(showAccessRolesDocObserver)
140+
viewModel.getOnAccessRoleUpdated().removeObserver(onAccessRoleUpdatedObserver)
141+
viewModel.getOnCloseSheetRequest().removeObserver(onCloseSheetObserver)
142+
viewModel.getShowSnackbar().observe(this, showSnackbar)
143+
viewModel.getShowSnackbarSuccess().observe(this, showSnackbarSuccess)
144+
}
145+
146+
override fun onResume() {
147+
super.onResume()
148+
connectViewModelEvents()
149+
}
150+
151+
override fun onPause() {
152+
super.onPause()
153+
disconnectViewModelEvents()
154+
}
155+
}

app/src/main/java/org/permanent/permanent/ui/activities/MainActivity.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -283,10 +283,6 @@ class MainActivity : PermanentBaseActivity(), Toolbar.OnMenuItemClickListener {
283283
// Toolbar back press
284284
override fun onSupportNavigateUp(): Boolean {
285285
return when (navController.currentDestination?.id) {
286-
R.id.linkSettingsFragment -> {
287-
navController.popBackStack(R.id.shareLinkFragment, true)
288-
true
289-
}
290286
R.id.publicFolderFragment -> {
291287
val publicFolderFragment =
292288
supportFragmentManager.primaryNavigationFragment?.childFragmentManager

app/src/main/java/org/permanent/permanent/ui/fileView/FileActivity.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import androidx.navigation.fragment.NavHostFragment
99
import androidx.navigation.ui.AppBarConfiguration
1010
import androidx.navigation.ui.NavigationUI
1111
import androidx.navigation.ui.navigateUp
12-
import kotlinx.android.synthetic.main.activity_file.*
1312
import org.permanent.permanent.R
1413
import org.permanent.permanent.databinding.ActivityFileBinding
1514
import org.permanent.permanent.ui.activities.PermanentBaseActivity
@@ -52,11 +51,6 @@ class FileActivity : PermanentBaseActivity() {
5251
this@FileActivity.finish()
5352
true
5453
}
55-
R.id.linkSettingsFragment -> {
56-
navController.popBackStack(R.id.shareLinkFragment, true)
57-
setToolbarAndStatusBarColor(R.color.black)
58-
true
59-
}
6054
R.id.shareLinkFragment -> {
6155
navController.navigateUp(appBarConfig) || super.onSupportNavigateUp()
6256
setToolbarAndStatusBarColor(R.color.black)

0 commit comments

Comments
 (0)