Skip to content
This repository was archived by the owner on Jun 23, 2026. It is now read-only.

Commit 054b898

Browse files
committed
feat: 支持查看文件夹详情,检查剪切板中的文件
1 parent 710586b commit 054b898

27 files changed

Lines changed: 516 additions & 39 deletions

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# SplitLanzou
22

3-
## 提交 Issue 之前,不要用老板式口吻对我说话,草泥马了个逼,你他妈是我谁啊!我不为任何人服务,不用就滚蛋,别浪费时间,你觉得自己牛逼提交 PR
3+
## 提交 Issue 之前,不要用老板式口吻对我说话,我不为任何人服务,不用就滚蛋,别浪费时间,你觉得自己牛逼提交 PR
44

55
> 恢复迭代中...
66

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
android:label="下载信息" />
7878
<activity
7979
android:name=".ui.activity.ResolveFileActivity"
80+
android:theme="@style/Theme.SplitLanzou.Dialog.Activity"
8081
android:exported="true"
8182
android:label="解析文件">
8283
<intent-filter>

app/src/main/assets/litepal.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<litepal>
33
<dbname value="lanzou" />
4-
<version value="5" />
4+
<version value="6" />
55
<list>
66
<mapping class="com.lanzou.cloud.data.User"/>
77
<mapping class="com.lanzou.cloud.data.Download"/>
88
<mapping class="com.lanzou.cloud.data.Upload"/>
99
<mapping class="com.lanzou.cloud.data.SplitFile" />
1010
<mapping class="com.lanzou.cloud.data.LanzouPage" />
11+
<mapping class="com.lanzou.cloud.model.FileFavoritesModel" />
12+
<mapping class="com.lanzou.cloud.model.FavoriteItem" />
1113
</list>
1214
</litepal>

app/src/main/java/com/lanzou/cloud/LanzouApplication.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ class LanzouApplication : Application() {
5757
*/
5858
const val DOWNLOAD_API_URL = "https://lz.qaiu.top"
5959

60+
/**
61+
* 蓝奏通用的分享 BASE_URL
62+
*/
63+
const val LANZOU_SHARE_BASE_URL = "https://www.lanzoui.com/"
64+
6065
const val SHARE_URL = "http://lz.jdynb.xyz/index.html"
6166

6267
/**

app/src/main/java/com/lanzou/cloud/MainActivity.kt

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,26 @@ import android.content.pm.PackageManager
1010
import android.os.Build
1111
import android.os.Bundle
1212
import android.os.Environment
13+
import android.os.Handler
1314
import android.os.IBinder
15+
import android.os.Looper
1416
import android.provider.Settings
17+
import android.util.Log
1518
import android.view.View
1619
import androidx.activity.result.ActivityResult
1720
import androidx.activity.result.ActivityResultCallback
1821
import androidx.activity.result.ActivityResultLauncher
1922
import androidx.activity.result.contract.ActivityResultContracts
23+
import androidx.activity.viewModels
2024
import androidx.appcompat.app.AppCompatActivity
2125
import androidx.core.app.ActivityCompat
2226
import androidx.core.content.ContextCompat
2327
import androidx.core.net.toUri
2428
import androidx.core.view.WindowCompat
2529
import androidx.fragment.app.Fragment
30+
import androidx.lifecycle.lifecycleScope
2631
import androidx.viewpager2.widget.ViewPager2
32+
import com.drake.engine.utils.ClipboardUtils
2733
import com.drake.tooltip.toast
2834
import com.google.android.material.bottomnavigation.BottomNavigationView
2935
import com.google.android.material.dialog.MaterialAlertDialogBuilder
@@ -34,11 +40,14 @@ import com.lanzou.cloud.databinding.ActivityMainBinding
3440
import com.lanzou.cloud.network.Repository
3541
import com.lanzou.cloud.service.DownloadService
3642
import com.lanzou.cloud.service.UploadService
43+
import com.lanzou.cloud.ui.activity.ResolveFileActivity
3744
import com.lanzou.cloud.ui.cloud.file.FileFragment
3845
import com.lanzou.cloud.ui.cloud.selector.FileSelectorActivity
3946
import com.lanzou.cloud.ui.cloud.selector.PhoneFileActivity
47+
import com.lanzou.cloud.ui.dialog.FileResolveViewModel
4048
import com.lanzou.cloud.utils.SpJavaUtils
4149
import com.lanzou.cloud.utils.UpdateUtils
50+
import kotlinx.coroutines.launch
4251

4352
/**
4453
* SplitLanzou
@@ -49,12 +58,29 @@ import com.lanzou.cloud.utils.UpdateUtils
4958
*/
5059
class MainActivity : AppCompatActivity(), ServiceConnection {
5160

61+
companion object {
62+
63+
private const val TAG = "MainActivity"
64+
65+
}
66+
5267
private lateinit var binding: ActivityMainBinding
5368

5469
private var uploadService: UploadService? = null
5570

5671
private var downloadService: DownloadService? = null
5772

73+
private val fileResolveViewModel by viewModels<FileResolveViewModel>()
74+
75+
private val handler = Handler(Looper.getMainLooper())
76+
77+
private val clipboardRunnable = Runnable {
78+
// 获取剪切板中的文件
79+
val text = ClipboardUtils.getText()
80+
Log.i(TAG, "剪切板数据: $text")
81+
fileResolveViewModel.setClipData(text)
82+
}
83+
5884
@SuppressLint("NonConstantResourceId")
5985
override fun onCreate(savedInstanceState: Bundle?) {
6086
super.onCreate(savedInstanceState)
@@ -123,6 +149,16 @@ class MainActivity : AppCompatActivity(), ServiceConnection {
123149
if (SpJavaUtils.getBoolean(SPConfig.CHECK_UPDATE, true)) {
124150
UpdateUtils.checkUpdate(this)
125151
}
152+
153+
lifecycleScope.launch {
154+
fileResolveViewModel.fileShareUrl.collect { url ->
155+
if (url.isBlank()) {
156+
return@collect
157+
}
158+
toast("发现文件分享链接: $url")
159+
ResolveFileActivity.actionStart(url)
160+
}
161+
}
126162
}
127163

128164
private val fileFragment: FileFragment
@@ -177,6 +213,16 @@ class MainActivity : AppCompatActivity(), ServiceConnection {
177213
.show()
178214
}
179215

216+
override fun onResume() {
217+
super.onResume()
218+
handler.postDelayed(clipboardRunnable, 500)
219+
}
220+
221+
override fun onStop() {
222+
super.onStop()
223+
handler.removeCallbacks(clipboardRunnable)
224+
}
225+
180226
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
181227
if (service is UploadService.UploadBinder) {
182228
uploadService = service.service

app/src/main/java/com/lanzou/cloud/config/Api.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.lanzou.cloud.config
22

3-
import com.lanzou.cloud.LanzouApplication
4-
53
/**
64
* 接口管理
75
*/
@@ -17,7 +15,7 @@ object Api {
1715
/**
1816
* 获取分享文件夹
1917
*/
20-
const val GET_SHARE_FOLDERS = "${LanzouApplication.DOWNLOAD_API_URL}/v2/getFileList"
18+
const val GET_SHARE_FOLDERS = "/v2/getFileList"
2119

2220
/**
2321
* 操作文件相关

app/src/main/java/com/lanzou/cloud/event/FileAction.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.lanzou.cloud.event
22

33
import com.lanzou.cloud.model.FileInfoModel
44
import com.lanzou.cloud.model.FilterSortModel
5+
import okio.IOException
56

67
/**
78
* 一些文件操作的接口
@@ -136,7 +137,9 @@ interface FileAction : Searchable {
136137
* @param current 当前文件
137138
* @param targetPath 目标路径
138139
* @return 新文件
140+
* @throws IOException 如果移动失败则抛出异常
139141
*/
142+
@Throws(IOException::class)
140143
suspend fun moveFile(position: Int, current: FileInfoModel, targetPath: String?): FileInfoModel?
141144

142145
/**
@@ -145,9 +148,11 @@ interface FileAction : Searchable {
145148
* @param current 当前文件
146149
* @param targetPath 目标路径
147150
*
148-
* @return 新文件
151+
* @return 新文件,如果为空则表示失败
152+
* @throws IOException 如果复制失败则抛出异常
149153
*/
150-
fun copyFile(position: Int, current: FileInfoModel, targetPath: String?): FileInfoModel?
154+
@Throws(IOException::class)
155+
suspend fun copyFile(position: Int, current: FileInfoModel, targetPath: String?): FileInfoModel?
151156

152157
/**
153158
* 分享文件
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package com.lanzou.cloud.model
2+
3+
import org.litepal.annotation.Column
4+
import org.litepal.crud.LitePalSupport
5+
6+
/**
7+
* 收藏夹
8+
*/
9+
data class FileFavoritesModel(
10+
/**
11+
* 收藏夹名称
12+
*/
13+
@Column(nullable = false)
14+
val name: String = "",
15+
/**
16+
* 收藏项列表
17+
*/
18+
val items: List<FavoriteItem> = emptyList(),
19+
20+
/**
21+
* 备注
22+
*/
23+
@Column(nullable = true)
24+
val remark: String? = null,
25+
/**
26+
* 创建时间
27+
*/
28+
val createAt: Long = System.currentTimeMillis(),
29+
) : LitePalSupport() {
30+
31+
val id: Long = 0L
32+
}
33+
34+
/**
35+
* 收藏项
36+
*/
37+
data class FavoriteItem(
38+
/**
39+
* 文件名
40+
*/
41+
@Column(nullable = false)
42+
val name: String = "",
43+
/**
44+
* 文件 id
45+
*/
46+
@Column(nullable = false, unique = true)
47+
val fileId: String = "",
48+
/**
49+
* 是否是文件
50+
*/
51+
val isFile: Boolean = false,
52+
/**
53+
* 分享地址
54+
*/
55+
@Column(nullable = false, unique = true)
56+
val url: String = "",
57+
/**
58+
* 文件密码
59+
*/
60+
@Column(nullable = true)
61+
val pwd: String? = null,
62+
/**
63+
* 文件大小
64+
*/
65+
@Column(nullable = true)
66+
val size: String? = null,
67+
/**
68+
* 文件扩展名
69+
*/
70+
@Column(nullable = true)
71+
val extension: String? = null,
72+
/**
73+
* 分享时间
74+
*/
75+
val time: String = "",
76+
/**
77+
* 备注
78+
*/
79+
@Column(nullable = true)
80+
val remark: String? = null,
81+
val createAt: Long = System.currentTimeMillis(),
82+
val updateAt: Long = System.currentTimeMillis(),
83+
val favoritesModel: FileFavoritesModel = FileFavoritesModel(),
84+
) : LitePalSupport() {
85+
86+
val id: Long = 0L
87+
88+
}

app/src/main/java/com/lanzou/cloud/model/LanzouUrlModel.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ package com.lanzou.cloud.model
22

33

44
import com.lanzou.cloud.LanzouApplication
5+
import com.lanzou.cloud.network.Repository
56
import kotlinx.serialization.SerialName
67
import kotlinx.serialization.Serializable
7-
import java.net.URLEncoder
88

99
@Serializable
1010
data class LanzouUrlModel(
@@ -40,10 +40,6 @@ data class LanzouUrlModel(
4040

4141
val downloadUrl: String
4242
get() {
43-
var str = "${LanzouApplication.DOWNLOAD_API_URL}/parser?url=${URLEncoder.encode(shareUrl)}"
44-
if (hasPwd == 1) {
45-
str += "&pwd=$pwd"
46-
}
47-
return str
43+
return Repository.getInstance().getDownloadUrl(shareUrl, if (hasPwd == 1) pwd else null)
4844
}
4945
}

app/src/main/java/com/lanzou/cloud/network/LanzouRepository.kt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ import com.drake.net.Post
55
import com.lanzou.cloud.LanzouApplication
66
import com.lanzou.cloud.R
77
import com.lanzou.cloud.config.Api
8+
import com.lanzou.cloud.config.SPConfig
89
import com.lanzou.cloud.model.BaseLanzouResponse
910
import com.lanzou.cloud.model.FileInfoModel
1011
import com.lanzou.cloud.model.LanzouShareFolderModel
1112
import com.lanzou.cloud.model.LanzouUrlModel
1213
import com.lanzou.cloud.model.ProfileModel
1314
import com.lanzou.cloud.service.UploadService
15+
import com.lanzou.cloud.utils.SpUtils.getRequired
1416
import com.lanzou.cloud.utils.converter.SerializationConverter
1517
import com.lanzou.cloud.utils.formatBytes
1618
import kotlinx.coroutines.coroutineScope
@@ -138,7 +140,11 @@ object LanzouRepository {
138140
* @param pwd 文件密码(没有留空)
139141
*/
140142
suspend fun getShareFolders(url: String, pwd: String? = null) = coroutineScope {
141-
Get<List<LanzouShareFolderModel>>(Api.GET_SHARE_FOLDERS) {
143+
Get<List<LanzouShareFolderModel>>(
144+
SPConfig.DOWNLOAD_API_URL.getRequired<String>(
145+
LanzouApplication.DOWNLOAD_API_URL
146+
) + Api.GET_SHARE_FOLDERS
147+
) {
142148
converter =
143149
SerializationConverter(
144150
success = arrayOf("200"),
@@ -246,6 +252,16 @@ object LanzouRepository {
246252
}.await().zt == 1
247253
}
248254

255+
/**
256+
* 解析文件
257+
*
258+
* @param url 文件地址
259+
*/
260+
fun parseFile(url: String) {
261+
val document = Jsoup.connect(url).userAgent(Repository.USER_AGENT).get()
262+
263+
}
264+
249265
private fun getFileRealName(fileInfoModel: FileInfoModel) {
250266
val ext = fileInfoModel.extension
251267
val name = fileInfoModel.nameAll

0 commit comments

Comments
 (0)