Skip to content

Commit 07e6919

Browse files
feat(sharing): Show expiration date state in share list
Signed-off-by: Andy Scherzinger <[email protected]>
1 parent 37702f2 commit 07e6919

File tree

10 files changed

+84
-24
lines changed

10 files changed

+84
-24
lines changed

app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@
5858
NotesListWidgetData.class,
5959
ShareEntity.class,
6060
Capabilities.class
61-
}, version = 27,
61+
}, version = 28,
6262
autoMigrations = {
6363
@AutoMigration(from = 25, to = 26),
6464
@AutoMigration(from = 26, to = 27),
65+
@AutoMigration(from = 27, to = 28),
6566
}
6667
)
6768
@TypeConverters({Converters.class})

app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/ShareEntity.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,6 @@ data class ShareEntity(
2424
val displayname_file_owner: String? = null,
2525
val uid_owner: String? = null,
2626
val displayname_owner: String? = null,
27-
val url: String? = null
27+
val url: String? = null,
28+
val expiration_date: Long? = null
2829
)

app/src/main/java/it/niedermann/owncloud/notes/share/adapter/holder/LinkShareViewHolder.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,19 @@
77
package it.niedermann.owncloud.notes.share.adapter.holder;
88

99
import android.content.Context;
10-
import android.graphics.PorterDuff;
1110
import android.text.TextUtils;
1211
import android.view.View;
1312

14-
import androidx.annotation.ColorInt;
1513
import androidx.annotation.NonNull;
1614
import androidx.core.content.res.ResourcesCompat;
1715

1816
import com.nextcloud.android.common.ui.theme.utils.ColorRole;
1917
import com.owncloud.android.lib.resources.shares.OCShare;
2018
import com.owncloud.android.lib.resources.shares.ShareType;
2119

20+
import java.text.SimpleDateFormat;
21+
import java.util.Date;
22+
2223
import it.niedermann.owncloud.notes.R;
2324
import it.niedermann.owncloud.notes.branding.BrandedViewHolder;
2425
import it.niedermann.owncloud.notes.branding.BrandingUtil;
@@ -83,6 +84,19 @@ public void bind(OCShare publicShare, ShareeListAdapterListener listener) {
8384
binding.shareByLinkContainer.setOnClickListener(v -> listener.showPermissionsDialog(publicShare));
8485
}
8586

87+
if (publicShare.getExpirationDate() > 0) {
88+
binding.expirationStatus.setContentDescription(
89+
context.getString(
90+
R.string.share_expires,
91+
SimpleDateFormat.getDateInstance().format(new Date(publicShare.getExpirationDate()))
92+
)
93+
);
94+
binding.expirationStatus.setVisibility(View.VISIBLE);
95+
} else {
96+
binding.expirationStatus.setContentDescription(null);
97+
binding.expirationStatus.setVisibility(View.GONE);
98+
}
99+
86100
binding.copyLink.setOnClickListener(v -> listener.copyLink(publicShare));
87101
}
88102

app/src/main/java/it/niedermann/owncloud/notes/share/model/CreateShareResponse.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,5 +139,9 @@ data class CreateShareResponse(
139139

140140
@Expose
141141
@SerializedName("password")
142-
val password: String?
142+
val password: String?,
143+
144+
@Expose
145+
@SerializedName("expiration")
146+
val expirationDate: String?
143147
)

app/src/main/java/it/niedermann/owncloud/notes/share/model/CreateShareResponseExtensions.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@ package it.niedermann.owncloud.notes.share.model
88

99
import com.owncloud.android.lib.resources.shares.OCShare
1010
import com.owncloud.android.lib.resources.shares.ShareType
11+
import it.niedermann.owncloud.notes.shared.util.extensions.toExpirationDateLong
1112

12-
fun List<CreateShareResponse>.toOCShareList(): List<OCShare> {
13-
return map { response ->
14-
response.toOCShare()
15-
}.filter { it.id != -1L }
16-
}
13+
fun List<CreateShareResponse>.toOCShareList(): List<OCShare> = map { response ->
14+
response.toOCShare()
15+
}.filter { it.id != -1L }
1716

1817
fun CreateShareResponse.toOCShare(): OCShare {
1918
val response = this
@@ -31,13 +30,14 @@ fun CreateShareResponse.toOCShare(): OCShare {
3130
sharedWithDisplayName = response.shareWithDisplayname
3231
isFolder = response.itemType == "folder"
3332
userId = response.uidOwner
34-
shareLink = response.url
33+
shareLink = response.url
3534
isPasswordProtected = !response.password.isNullOrEmpty()
3635
note = response.note
3736
isHideFileDownload = (response.hideDownload == 1L)
3837
label = response.label
3938
isHasPreview = response.hasPreview
4039
mimetype = response.mimetype
4140
ownerDisplayName = response.displaynameOwner
41+
expirationDate = response.expirationDate?.toExpirationDateLong() ?: 0L
4242
}
4343
}

app/src/main/java/it/niedermann/owncloud/notes/share/repository/ShareRepository.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import it.niedermann.owncloud.notes.shared.model.NotesSettings
3333
import it.niedermann.owncloud.notes.shared.model.OcsResponse
3434
import it.niedermann.owncloud.notes.shared.util.StringConstants
3535
import it.niedermann.owncloud.notes.shared.util.extensions.getErrorMessage
36+
import it.niedermann.owncloud.notes.shared.util.extensions.toExpirationDateLong
3637
import it.niedermann.owncloud.notes.shared.util.extensions.toExpirationDateString
3738
import org.json.JSONObject
3839
import java.util.Date
@@ -109,6 +110,7 @@ class ShareRepository(private val applicationContext: Context, private val accou
109110
val uidOwner = map?.get("uid_owner") as? String
110111
val displayNameOwner = map?.get("displayname_owner") as? String
111112
val url = map?.get("url") as? String
113+
val expirationDateString = map?.get("expiration") as? String
112114

113115
id?.toInt()?.let {
114116
val entity = ShareEntity(
@@ -122,7 +124,8 @@ class ShareRepository(private val applicationContext: Context, private val accou
122124
displayname_file_owner = displayNameFileOwner,
123125
uid_owner = uidOwner,
124126
displayname_owner = displayNameOwner,
125-
url = url
127+
url = url,
128+
expiration_date = expirationDateString?.toExpirationDateLong()
126129
)
127130

128131
entities.add(entity)

app/src/main/java/it/niedermann/owncloud/notes/shared/util/extensions/DateExtensions.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import java.text.SimpleDateFormat
1010
import java.util.Date
1111
import java.util.Locale
1212

13-
fun Date.toExpirationDateString(): String {
14-
return SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(this)
15-
}
13+
fun Date.toExpirationDateString(): String = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(this)
14+
15+
fun String.toExpirationDateLong(): Long =
16+
SimpleDateFormat("yyyy-MM-dd 00:00:00", Locale.getDefault()).parse(this)?.time ?: 0L
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<!--
2+
~ Nextcloud Notes - Android Client
3+
~
4+
~ SPDX-FileCopyrightText: 2018-2025 Google LLC
5+
~ SPDX-License-Identifier: Apache-2.0
6+
-->
7+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
8+
android:width="24dp"
9+
android:height="24dp"
10+
android:tint="@color/icon_color_default"
11+
android:viewportWidth="960"
12+
android:viewportHeight="960">
13+
<path
14+
android:fillColor="@android:color/white"
15+
android:pathData="M612,668L668,612L520,464L520,280L440,280L440,496L612,668ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480ZM480,800Q613,800 706.5,706.5Q800,613 800,480Q800,347 706.5,253.5Q613,160 480,160Q347,160 253.5,253.5Q160,347 160,480Q160,613 253.5,706.5Q347,800 480,800Z" />
16+
</vector>

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

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,36 @@
1414
android:layout_marginVertical="@dimen/spacer_1x"
1515
android:orientation="horizontal">
1616

17-
<ImageView
18-
android:id="@+id/icon"
19-
android:layout_width="@dimen/default_icon_size"
20-
android:layout_height="@dimen/default_icon_size"
17+
<FrameLayout
18+
android:id="@+id/dialogAvatarFrameLayout"
19+
android:layout_width="@dimen/minimum_size_for_touchable_area"
20+
android:layout_height="@dimen/minimum_size_for_touchable_area"
2121
android:layout_marginStart="@dimen/spacer_2x"
2222
android:layout_marginTop="@dimen/spacer_1hx"
23-
android:layout_marginEnd="@dimen/spacer_2x"
24-
android:background="@drawable/round_bgnd"
25-
android:contentDescription="@string/note_share_activity_share_icon_content_description"
26-
android:padding="@dimen/spacer_1x"
27-
android:src="@drawable/shared_via_link" />
23+
android:layout_marginEnd="@dimen/spacer_1x"
24+
android:layout_centerVertical="true">
25+
26+
<ImageView
27+
android:id="@+id/icon"
28+
android:layout_width="@dimen/default_icon_size"
29+
android:layout_height="@dimen/default_icon_size"
30+
android:background="@drawable/round_bgnd"
31+
android:contentDescription="@string/note_share_activity_share_icon_content_description"
32+
android:padding="@dimen/spacer_1x"
33+
android:src="@drawable/shared_via_link" />
34+
35+
<ImageView
36+
android:id="@+id/expiration_status"
37+
android:layout_width="18dp"
38+
android:layout_height="18dp"
39+
android:layout_gravity="bottom|end"
40+
android:background="@drawable/round_bgnd"
41+
android:contentDescription="@null"
42+
android:padding="1dp"
43+
android:layout_margin="@dimen/spacer_1hx"
44+
android:src="@drawable/schedule_24px"
45+
android:tint="@color/text_color" />
46+
</FrameLayout>
2847

2948
<LinearLayout
3049
android:id="@+id/share_name_layout"

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,4 +517,5 @@
517517
<string name="ecosystem_apps_more">More Nextcloud Apps</string>
518518
<string name="ecosystem_apps_display_more">More</string>
519519
<string name="activity_sharing_title">Sharing</string>
520+
<string name="share_expires">Share expires on %1$s</string>
520521
</resources>

0 commit comments

Comments
 (0)