From 7830527e6293bad453657de64ed79bc058f3fc27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E6=9D=89?= Date: Tue, 19 Dec 2023 12:38:16 +0800 Subject: [PATCH] feat:add download api --- app/build.gradle | 4 +- .../com/alicloud/databox/demo/AliyunpanApp.kt | 8 + .../com/alicloud/databox/demo/MainActivity.kt | 62 ++- app/src/main/AndroidManifest.xml | 2 + app/src/main/res/layout/activity_main.xml | 6 + opensdk/build.gradle | 3 +- .../databox/opensdk/AliyunpanClient.kt | 51 +- .../databox/opensdk/AliyunpanClientConfig.kt | 25 +- .../databox/opensdk/AliyunpanException.kt | 2 + .../databox/opensdk/http/OKHttpHelper.kt | 70 ++- .../databox/opensdk/io/AliyunpanDownloader.kt | 481 ++++++++++++++++++ .../alicloud/databox/opensdk/io/BaseTask.kt | 73 +++ .../opensdk/io/BufferRandomAccessFile.kt | 54 ++ .../opensdk/io/AliyunpanDownloaderTest.kt | 29 ++ 14 files changed, 857 insertions(+), 13 deletions(-) create mode 100644 opensdk/src/main/java/com/alicloud/databox/opensdk/io/AliyunpanDownloader.kt create mode 100644 opensdk/src/main/java/com/alicloud/databox/opensdk/io/BaseTask.kt create mode 100644 opensdk/src/main/java/com/alicloud/databox/opensdk/io/BufferRandomAccessFile.kt create mode 100644 opensdk/src/test/java/com/alicloud/databox/opensdk/io/AliyunpanDownloaderTest.kt diff --git a/app/build.gradle b/app/build.gradle index aba6cd3..fd7ae15 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,9 +64,9 @@ android { } dependencies { -// implementation project(":opensdk") + implementation project(":opensdk") +// implementation 'com.github.alibaba:aliyunpan-android-sdk:v0.1.4' implementation "com.squareup.okhttp3:okhttp:4.11.0" - implementation 'com.github.alibaba:aliyunpan-android-sdk:v0.1.4' implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.6.1' diff --git a/app/src/callback/java/com/alicloud/databox/demo/AliyunpanApp.kt b/app/src/callback/java/com/alicloud/databox/demo/AliyunpanApp.kt index 8b7c965..42e79bc 100644 --- a/app/src/callback/java/com/alicloud/databox/demo/AliyunpanApp.kt +++ b/app/src/callback/java/com/alicloud/databox/demo/AliyunpanApp.kt @@ -1,8 +1,10 @@ package com.alicloud.databox.demo import android.content.Context +import android.os.Environment import com.alicloud.databox.opensdk.AliyunpanClient import com.alicloud.databox.opensdk.AliyunpanClientConfig +import java.io.File object AliyunpanApp { @@ -11,6 +13,12 @@ object AliyunpanApp { fun initApp(context: Context) { // 配置 val config = AliyunpanClientConfig.Builder(context, BuildConfig.APP_KEY) + .downFolder( + File( + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), + "Aliyunpan-Sdk" + ) + ) .build() // 初始化client aliyunpanClient = AliyunpanClient.init(config) diff --git a/app/src/callback/java/com/alicloud/databox/demo/MainActivity.kt b/app/src/callback/java/com/alicloud/databox/demo/MainActivity.kt index 628366c..505e3c6 100644 --- a/app/src/callback/java/com/alicloud/databox/demo/MainActivity.kt +++ b/app/src/callback/java/com/alicloud/databox/demo/MainActivity.kt @@ -5,12 +5,14 @@ import android.view.View import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import com.alicloud.databox.demo.ViewHelper.appendWithTime +import com.alicloud.databox.opensdk.io.BaseTask import com.alicloud.databox.opensdk.scope.AliyunpanFileScope import com.alicloud.databox.opensdk.scope.AliyunpanUserScope class MainActivity : AppCompatActivity() { private var defaultDriveId: String? = null + private var fileId: String? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -33,6 +35,10 @@ class MainActivity : AppCompatActivity() { findViewById(R.id.btnFileListInfo).setOnClickListener { getFileList(defaultDriveId, tvResult) } + + findViewById(R.id.btnFileDownload).setOnClickListener { + startDownloadFile(defaultDriveId, fileId, tvResult) + } } private fun startOAuth(tvResult: TextView) { @@ -66,10 +72,56 @@ class MainActivity : AppCompatActivity() { return } AliyunpanApp.aliyunpanClient - ?.send(AliyunpanFileScope.GetFileList(driveId, parentFileId = "root", fields = "*", limit = 2), { - tvResult.appendWithTime("GetFileList success: $it") - }, { - tvResult.appendWithTime("GetFileList failed: $it") - }) + ?.send( + AliyunpanFileScope.GetFileList( + driveId, + parentFileId = "root", + fields = "*", + limit = 2, + type = "file", + orderBy = "size", + orderDirection = "ASC" + ), { + tvResult.appendWithTime("GetFileList success: $it") + + val items = it.data.asJSONObject().optJSONArray("items") + fileId = items.getJSONObject(0).optString("file_id") + + }, { + tvResult.appendWithTime("GetFileList failed: $it") + }) + } + + private fun startDownloadFile(defaultDriveId: String?, fileId: String?, tvResult: TextView) { + AliyunpanApp.aliyunpanClient?.buildDownload(defaultDriveId ?: "", fileId ?: "", { task -> + tvResult.appendWithTime("buildDownload success $task") + task.addStateChange { taskState -> + when (taskState) { + BaseTask.TaskState.Abort -> { + tvResult.appendWithTime("taskState Abort ") + } + + is BaseTask.TaskState.Completed -> { + tvResult.appendWithTime("taskState Completed ${taskState.filePath}") + } + + is BaseTask.TaskState.Failed -> { + tvResult.appendWithTime("taskState Failed ${taskState.exception}") + } + + is BaseTask.TaskState.Running -> { + tvResult.appendWithTime("taskState Running ${taskState.completedChunkSize}/${taskState.totalChunkSize} Progress=${taskState.getProgress()}") + } + + BaseTask.TaskState.Waiting -> { + tvResult.appendWithTime("taskState Waiting") + } + } + } + val startResult = task.start() + tvResult.appendWithTime("start task = $task startResult = $startResult") + }, { + tvResult.appendWithTime("buildDownload failed $it") + }) } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f77ef3..07e770a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + +