Skip to content

Commit 905a487

Browse files
committed
Feat: Add WebDAV UI
Bug: #191
1 parent b9e8471 commit 905a487

File tree

15 files changed

+864
-9
lines changed

15 files changed

+864
-9
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@
217217
android:label="@string/storage_edit_smb_server_title_edit"
218218
android:theme="@style/Theme.MaterialFiles" />
219219

220+
<activity
221+
android:name="me.zhanghai.android.files.storage.EditWebDavServerActivity"
222+
android:label="@string/storage_edit_webdav_server_title_edit"
223+
android:theme="@style/Theme.MaterialFiles" />
224+
220225
<activity
221226
android:name="me.zhanghai.android.files.navigation.EditBookmarkDirectoryDialogActivity"
222227
android:label="@string/navigation_edit_bookmark_directory_title"

app/src/main/java/me/zhanghai/android/files/app/AppInitializers.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@ import me.zhanghai.android.files.storage.FtpServerAuthenticator
2222
import me.zhanghai.android.files.storage.SftpServerAuthenticator
2323
import me.zhanghai.android.files.storage.SmbServerAuthenticator
2424
import me.zhanghai.android.files.storage.StorageVolumeListLiveData
25+
import me.zhanghai.android.files.storage.WebDavServerAuthenticator
2526
import me.zhanghai.android.files.theme.custom.CustomThemeHelper
2627
import me.zhanghai.android.files.theme.night.NightModeHelper
2728
import java.util.Properties
2829
import me.zhanghai.android.files.provider.ftp.client.Client as FtpClient
2930
import me.zhanghai.android.files.provider.sftp.client.Client as SftpClient
3031
import me.zhanghai.android.files.provider.smb.client.Client as SmbClient
32+
import me.zhanghai.android.files.provider.webdav.client.Client as WebDavClient
3133

3234
val appInitializers = listOf(
3335
::initializeCrashlytics, ::disableHiddenApiChecks, ::initializeThreeTen,
@@ -75,6 +77,7 @@ private fun initializeFileSystemProviders() {
7577
FtpClient.authenticator = FtpServerAuthenticator
7678
SftpClient.authenticator = SftpServerAuthenticator
7779
SmbClient.authenticator = SmbServerAuthenticator
80+
WebDavClient.authenticator = WebDavServerAuthenticator
7881
}
7982

8083
private fun initializeLiveDataObjects() {

app/src/main/java/me/zhanghai/android/files/provider/webdav/WebDavFileSystemProvider.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ object WebDavFileSystemProvider : FileSystemProvider(), PathObservableProvider,
110110
get() {
111111
val protocol = Protocol.fromScheme(scheme)
112112
val port = if (port != -1) port else protocol.defaultPort
113-
return Authority(protocol, host, port, userInfo)
113+
val username = userInfo.orEmpty()
114+
return Authority(protocol, host, port, username)
114115
}
115116

116117
@Throws(IOException::class)

app/src/main/java/me/zhanghai/android/files/provider/webdav/client/Authentication.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ data class PasswordAuthentication(
4040
override fun createAuthenticatorInterceptor(authority: Authority): AuthenticatorInterceptor =
4141
object : AuthenticatorInterceptor {
4242
private val basicDigestAuthHandler = BasicDigestAuthHandler(
43-
UrlUtils.hostToDomain(authority.host), authority.username!!, password
43+
UrlUtils.hostToDomain(authority.host), authority.username, password
4444
)
4545

4646
override fun authenticate(route: Route?, response: Response): Request? =

app/src/main/java/me/zhanghai/android/files/provider/webdav/client/Authority.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,19 @@ package me.zhanghai.android.files.provider.webdav.client
88
import android.os.Parcelable
99
import kotlinx.parcelize.Parcelize
1010
import me.zhanghai.android.files.provider.common.UriAuthority
11+
import me.zhanghai.android.files.util.takeIfNotEmpty
1112

1213
@Parcelize
1314
data class Authority(
1415
val protocol: Protocol,
1516
val host: String,
1617
val port: Int,
17-
val username: String?
18+
val username: String
1819
) : Parcelable {
19-
init {
20-
require(username == null || username.isNotEmpty()) { "Username cannot be empty" }
21-
}
22-
2320
fun toUriAuthority(): UriAuthority {
21+
val userInfo = username.takeIfNotEmpty()
2422
val uriPort = port.takeIf { it != protocol.defaultPort }
25-
return UriAuthority(username, host, uriPort)
23+
return UriAuthority(userInfo, host, uriPort)
2624
}
2725

2826
override fun toString(): String = toUriAuthority().toString()

app/src/main/java/me/zhanghai/android/files/storage/AddStorageDialogFragment.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,11 @@ class AddStorageDialogFragment : AppCompatDialogFragment() {
6464
EditFtpServerActivity::class.createIntent().putArgs(EditFtpServerFragment.Args()),
6565
R.string.storage_add_storage_sftp_server to
6666
EditSftpServerActivity::class.createIntent().putArgs(EditSftpServerFragment.Args()),
67-
R.string.storage_add_storage_smb_server to AddLanSmbServerActivity::class.createIntent()
67+
R.string.storage_add_storage_smb_server to
68+
AddLanSmbServerActivity::class.createIntent(),
69+
R.string.storage_add_storage_webdav_server to
70+
EditWebDavServerActivity::class.createIntent()
71+
.putArgs(EditWebDavServerFragment.Args()),
6872
)
6973
}
7074
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright (c) 2024 Hai Zhang <[email protected]>
3+
* All Rights Reserved.
4+
*/
5+
6+
package me.zhanghai.android.files.storage
7+
8+
import android.os.Bundle
9+
import android.view.View
10+
import androidx.fragment.app.commit
11+
import me.zhanghai.android.files.app.AppActivity
12+
import me.zhanghai.android.files.util.args
13+
import me.zhanghai.android.files.util.putArgs
14+
15+
class EditWebDavServerActivity : AppActivity() {
16+
private val args by args<EditWebDavServerFragment.Args>()
17+
18+
override fun onCreate(savedInstanceState: Bundle?) {
19+
super.onCreate(savedInstanceState)
20+
21+
// Calls ensureSubDecor().
22+
findViewById<View>(android.R.id.content)
23+
if (savedInstanceState == null) {
24+
val fragment = EditWebDavServerFragment().putArgs(args)
25+
supportFragmentManager.commit { add(android.R.id.content, fragment) }
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)