Skip to content

Commit 31ab3d0

Browse files
Merge pull request #17265 from nextcloud/fix/e2ee-exclude-office-files
fix(e2ee): file and folder actions
2 parents 7b51a44 + 2eab077 commit 31ab3d0

5 files changed

Lines changed: 124 additions & 98 deletions

File tree

app/src/main/java/com/nextcloud/ui/fileactions/FileActionsBottomSheet.kt

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import androidx.annotation.IdRes
2020
import androidx.appcompat.content.res.AppCompatResources
2121
import androidx.core.os.BundleCompat
2222
import androidx.core.os.bundleOf
23-
import androidx.core.view.isEmpty
23+
import androidx.core.view.isNotEmpty
2424
import androidx.core.view.isVisible
2525
import androidx.fragment.app.FragmentManager
2626
import androidx.fragment.app.setFragmentResult
@@ -126,17 +126,17 @@ class FileActionsBottomSheet :
126126
if (state.lockInfo != null) {
127127
displayLockInfo(state.lockInfo)
128128
}
129-
displayActions(state.actions)
129+
displayActions(state.titleFile, state.actions)
130130
displayTitle(state.titleFile)
131131
}
132132

133133
is FileActionsViewModel.UiState.LoadedForMultipleFiles -> {
134134
setMultipleFilesThumbnail()
135-
displayActions(state.actions)
135+
displayActions(state.firstFile, state.actions)
136136
displayTitle(state.fileCount)
137137
}
138138

139-
FileActionsViewModel.UiState.Loading -> {}
139+
FileActionsViewModel.UiState.Loading -> Unit
140140

141141
FileActionsViewModel.UiState.Error -> {
142142
activity?.let {
@@ -210,26 +210,32 @@ class FileActionsBottomSheet :
210210
}
211211
}
212212

213-
private fun displayActions(actions: List<FileAction>) {
214-
if (binding.fileActionsList.isEmpty()) {
215-
actions.forEach { action ->
216-
val view = inflateActionView(action)
217-
binding.fileActionsList.addView(view)
218-
}
213+
private fun displayActions(file: OCFile?, actions: List<FileAction>) {
214+
if (binding.fileActionsList.isNotEmpty()) {
215+
return
216+
}
219217

220-
// add client integration
221-
if (endpoints != null) {
222-
for (val e in endpoints) {
223-
val ui = clientIntegration.inflateClientIntegrationActionView(
224-
e,
225-
layoutInflater,
226-
binding,
227-
viewModel,
228-
viewThemeUtils
229-
)
230-
binding.fileActionsList.addView(ui)
231-
}
232-
}
218+
actions.forEach { action ->
219+
val view = inflateActionView(action)
220+
binding.fileActionsList.addView(view)
221+
}
222+
223+
val parentDir = file?.parentId?.let { storageManager.getFileById(it) }
224+
225+
if (endpoints.isNullOrEmpty() || parentDir?.isEncrypted == true) {
226+
return
227+
}
228+
229+
// add client integration
230+
endpoints?.forEach {
231+
val view = clientIntegration.inflateClientIntegrationActionView(
232+
it,
233+
layoutInflater,
234+
binding,
235+
viewModel,
236+
viewThemeUtils
237+
)
238+
binding.fileActionsList.addView(view)
233239
}
234240
}
235241

app/src/main/java/com/nextcloud/ui/fileactions/FileActionsViewModel.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ class FileActionsViewModel @Inject constructor(
4141
val lockInfo: LockInfo? = null
4242
) : UiState
4343

44-
data class LoadedForMultipleFiles(val actions: List<FileAction>, val fileCount: Int) : UiState
44+
data class LoadedForMultipleFiles(val firstFile: OCFile, val actions: List<FileAction>, val fileCount: Int) :
45+
UiState
4546
}
4647

4748
private val _uiState: MutableLiveData<UiState> = MutableLiveData(UiState.Loading)
@@ -110,7 +111,10 @@ class FileActionsViewModel @Inject constructor(
110111
UiState.LoadedForSingleFile(availableActions, file, getLockInfo(file))
111112
}
112113

113-
else -> UiState.LoadedForMultipleFiles(availableActions, files.size)
114+
else -> {
115+
val file = files.first()
116+
UiState.LoadedForMultipleFiles(file, availableActions, files.size)
117+
}
114118
}
115119
_uiState.postValue(state)
116120
}

app/src/main/java/com/nextcloud/utils/extensions/OCCapabilityExtensions.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,9 @@ fun jsonToList(json: String?): List<String> {
6666
emptyList()
6767
}
6868
}
69+
70+
fun OCCapability.isTemplateAvailable(): Boolean = (
71+
richDocuments.isTrue &&
72+
richDocumentsDirectEditing.isTrue &&
73+
richDocumentsTemplatesAvailable.isTrue
74+
)

app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.kt

Lines changed: 73 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.nextcloud.client.di.Injectable
2424
import com.nextcloud.client.documentscan.AppScanOptionalFeature
2525
import com.nextcloud.utils.BuildHelper.isFlavourGPlay
2626
import com.nextcloud.utils.EditorUtils
27+
import com.nextcloud.utils.extensions.isTemplateAvailable
2728
import com.nextcloud.utils.extensions.setVisibleIf
2829
import com.owncloud.android.MainApp
2930
import com.owncloud.android.R
@@ -126,20 +127,21 @@ class OCFileListBottomSheetDialog(
126127
}
127128
}
128129

129-
@Suppress("ComplexCondition")
130130
private fun checkTemplateVisibility() {
131131
val optionalCapability = fileActivity.capabilities
132-
if (optionalCapability.isPresent) {
133-
val capability = optionalCapability.get()
134-
if (capability.richDocuments.isTrue &&
135-
capability.richDocumentsDirectEditing.isTrue &&
136-
capability.richDocumentsTemplatesAvailable.isTrue &&
137-
!file.isEncrypted
138-
) {
139-
binding.menuNewDocument.visibility = View.VISIBLE
140-
binding.menuNewSpreadsheet.visibility = View.VISIBLE
141-
binding.menuNewPresentation.visibility = View.VISIBLE
142-
}
132+
if (file.isEncrypted || optionalCapability.isEmpty) {
133+
return
134+
}
135+
136+
val capability = optionalCapability.get()
137+
if (!capability.isTemplateAvailable()) {
138+
return
139+
}
140+
141+
binding.run {
142+
menuNewDocument.visibility = View.VISIBLE
143+
menuNewSpreadsheet.visibility = View.VISIBLE
144+
menuNewPresentation.visibility = View.VISIBLE
143145
}
144146
}
145147

@@ -148,66 +150,68 @@ class OCFileListBottomSheetDialog(
148150
val json = ArbitraryDataProviderImpl(context)
149151
.getValue(user, ArbitraryDataProvider.DIRECT_EDITING)
150152

151-
if (json.isNotEmpty() && !file.isEncrypted) {
152-
val directEditing = Gson().fromJson(json, DirectEditing::class.java)
153-
if (directEditing.creators.isEmpty()) {
154-
return
155-
}
153+
if (json.isEmpty() || file.isEncrypted) {
154+
return
155+
}
156156

157-
binding.creatorsContainer.visibility = View.VISIBLE
158-
binding.creators.removeAllViews()
159-
160-
val itemHeight = context.resources.getDimensionPixelSize(R.dimen.bottom_sheet_item_height)
161-
val standardPadding = context.resources.getDimensionPixelSize(R.dimen.standard_padding)
162-
val iconSize = context.resources.getDimensionPixelSize(R.dimen.iconized_single_line_item_icon_size)
163-
164-
for (creator in directEditing.creators.values) {
165-
val creatorButton = MaterialButton(
166-
ContextThemeWrapper(
167-
context,
168-
R.style.ThemeOverlay_App_Button_BottomSheetItem
169-
),
170-
null,
171-
com.google.android.material.R.attr.materialButtonStyle
172-
).apply {
173-
id = View.generateViewId()
174-
layoutParams = LinearLayout.LayoutParams(
175-
LinearLayout.LayoutParams.MATCH_PARENT,
176-
itemHeight
177-
)
178-
179-
gravity = Gravity.START or Gravity.CENTER_VERTICAL
180-
setPaddingRelative(standardPadding, 0, standardPadding, 0)
181-
182-
val buttonText = String.format(
183-
fileActivity.getString(R.string.editor_placeholder),
184-
fileActivity.getString(R.string.create_new),
185-
creator.name
186-
)
187-
text = buttonText
188-
setTextColor(ContextCompat.getColor(context, R.color.text_color))
189-
textSize = 16f
190-
isAllCaps = false
191-
192-
icon = MimeTypeUtil.getFileTypeIcon(
193-
creator.mimetype,
194-
creator.extension,
195-
context,
196-
viewThemeUtils
197-
)
198-
this.iconSize = iconSize
199-
this.iconPadding = standardPadding
200-
iconGravity = MaterialButton.ICON_GRAVITY_START
201-
iconTint = null
202-
203-
setOnClickListener {
204-
actions.showTemplate(creator, buttonText)
205-
dismiss()
206-
}
207-
}
157+
val directEditing = Gson().fromJson(json, DirectEditing::class.java)
158+
if (directEditing.creators.isEmpty()) {
159+
return
160+
}
208161

209-
binding.creators.addView(creatorButton)
162+
binding.creatorsContainer.visibility = View.VISIBLE
163+
binding.creators.removeAllViews()
164+
165+
val itemHeight = context.resources.getDimensionPixelSize(R.dimen.bottom_sheet_item_height)
166+
val standardPadding = context.resources.getDimensionPixelSize(R.dimen.standard_padding)
167+
val iconSize = context.resources.getDimensionPixelSize(R.dimen.iconized_single_line_item_icon_size)
168+
169+
for (creator in directEditing.creators.values) {
170+
val creatorButton = MaterialButton(
171+
ContextThemeWrapper(
172+
context,
173+
R.style.ThemeOverlay_App_Button_BottomSheetItem
174+
),
175+
null,
176+
com.google.android.material.R.attr.materialButtonStyle
177+
).apply {
178+
id = View.generateViewId()
179+
layoutParams = LinearLayout.LayoutParams(
180+
LinearLayout.LayoutParams.MATCH_PARENT,
181+
itemHeight
182+
)
183+
184+
gravity = Gravity.START or Gravity.CENTER_VERTICAL
185+
setPaddingRelative(standardPadding, 0, standardPadding, 0)
186+
187+
val buttonText = String.format(
188+
fileActivity.getString(R.string.editor_placeholder),
189+
fileActivity.getString(R.string.create_new),
190+
creator.name
191+
)
192+
text = buttonText
193+
setTextColor(ContextCompat.getColor(context, R.color.text_color))
194+
textSize = 16f
195+
isAllCaps = false
196+
197+
icon = MimeTypeUtil.getFileTypeIcon(
198+
creator.mimetype,
199+
creator.extension,
200+
context,
201+
viewThemeUtils
202+
)
203+
this.iconSize = iconSize
204+
this.iconPadding = standardPadding
205+
iconGravity = MaterialButton.ICON_GRAVITY_START
206+
iconTint = null
207+
208+
setOnClickListener {
209+
actions.showTemplate(creator, buttonText)
210+
dismiss()
211+
}
210212
}
213+
214+
binding.creators.addView(creatorButton)
211215
}
212216
}
213217

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,11 +161,13 @@
161161
android:text="@string/create_new_document"
162162
android:textColor="@color/text_color"
163163
android:textSize="@dimen/bottom_sheet_text_size"
164+
android:visibility="gone"
164165
app:icon="@drawable/file_doc"
165166
app:iconGravity="start"
166167
app:iconPadding="@dimen/standard_padding"
167168
app:iconSize="@dimen/iconized_single_line_item_icon_size"
168-
app:iconTint="@null" />
169+
app:iconTint="@null"
170+
tools:visibility="visible" />
169171

170172
<com.google.android.material.button.MaterialButton
171173
android:id="@+id/menu_new_spreadsheet"
@@ -179,11 +181,13 @@
179181
android:text="@string/create_new_spreadsheet"
180182
android:textColor="@color/text_color"
181183
android:textSize="@dimen/bottom_sheet_text_size"
184+
android:visibility="gone"
182185
app:icon="@drawable/file_xls"
183186
app:iconGravity="start"
184187
app:iconPadding="@dimen/standard_padding"
185188
app:iconSize="@dimen/iconized_single_line_item_icon_size"
186-
app:iconTint="@null" />
189+
app:iconTint="@null"
190+
tools:visibility="visible" />
187191

188192
<com.google.android.material.button.MaterialButton
189193
android:id="@+id/menu_new_presentation"
@@ -197,11 +201,13 @@
197201
android:text="@string/create_new_presentation"
198202
android:textColor="@color/text_color"
199203
android:textSize="@dimen/bottom_sheet_text_size"
204+
android:visibility="gone"
200205
app:icon="@drawable/file_ppt"
201206
app:iconGravity="start"
202207
app:iconPadding="@dimen/standard_padding"
203208
app:iconSize="@dimen/iconized_single_line_item_icon_size"
204-
app:iconTint="@null" />
209+
app:iconTint="@null"
210+
tools:visibility="visible" />
205211

206212
<LinearLayout
207213
android:id="@+id/creators_container"
@@ -222,8 +228,8 @@
222228
android:id="@+id/menu_create_rich_workspace_divider"
223229
android:layout_width="match_parent"
224230
android:layout_height="wrap_content"
225-
android:layout_marginStart="@dimen/bottom_sheet_menu_item_divider_standard_margin"
226231
android:layout_marginVertical="@dimen/standard_half_margin"
232+
android:layout_marginStart="@dimen/bottom_sheet_menu_item_divider_standard_margin"
227233
app:dividerColor="@color/list_divider_background" />
228234

229235
<com.google.android.material.button.MaterialButton

0 commit comments

Comments
 (0)