Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat:add upload api and optimize download code file scope #9

Merged
merged 1 commit into from
Mar 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ object AliyunpanApp {
// 配置
// 提示 因为appId绑定申请时的包名,当前demo项目在您本地无法成功授权 demo代码只做参考 需要在appId对应项目使用以下代码
val config = AliyunpanClientConfig.Builder(context, BuildConfig.APP_KEY)
// 云盘上传文件 需要写权限
.appendScope(AliyunpanClientConfig.SCOPE_FILE_WRITE)
.downFolder(
File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
Expand Down
47 changes: 27 additions & 20 deletions app/src/callback/java/com/alicloud/databox/demo/DownloadActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,26 @@ import android.widget.LinearLayout
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.alicloud.databox.demo.ViewHelper.appendWithTime
import com.alicloud.databox.demo.databinding.ActivityDownloadBinding
import com.alicloud.databox.demo.databinding.IncludeDownloadTaskBinding
import com.alicloud.databox.demo.databinding.ActivityTaskBinding
import com.alicloud.databox.demo.databinding.IncludeTaskBinding
import com.alicloud.databox.opensdk.AliyunpanClient
import com.alicloud.databox.opensdk.io.BaseTask

class DownloadActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityDownloadBinding.inflate(this.layoutInflater)
val binding = ActivityTaskBinding.inflate(this.layoutInflater)
setContentView(binding.root)

val driveId = intent.getStringExtra(KEY_DRIVE_ID)
val fileIds = intent.getStringArrayExtra(KEY_FILE_IDS)

val tvResult = binding.tvResult
val layoutGroup = binding.layoutGroup

binding.btnFileDownload.setOnClickListener {
startDownloadFileAll(driveId, fileIds, layoutGroup, tvResult)
binding.btnStartTask.apply {
text = "开始下载"
setOnClickListener {
startDownloadFileAll(driveId, fileIds, binding.layoutGroup, binding.tvResult)
}
}
}

Expand All @@ -41,7 +41,6 @@ class DownloadActivity : AppCompatActivity() {
}

val aliyunpanClient = AliyunpanApp.aliyunpanClient ?: return
layoutGroup.removeAllViews()
fileIds.forEach {
startDownloadFile(aliyunpanClient, driveId, it, layoutGroup, tvResult)
}
Expand All @@ -55,36 +54,42 @@ class DownloadActivity : AppCompatActivity() {
tvResult: TextView
) {
client.buildDownload(driveId, fileId, { task ->
val downloadTaskBinding = IncludeDownloadTaskBinding.inflate(layoutInflater, layoutGroup, true)
tvResult.appendWithTime("buildDownload success")

val taskBinding = IncludeTaskBinding.inflate(layoutInflater, layoutGroup, true)

downloadTaskBinding.tvTaskName.text = task.getTaskName()
downloadTaskBinding.tvTaskProcess.setOnClickListener {
task.cancel()
taskBinding.tvTaskName.text = task.getTaskName()
taskBinding.btnTaskOperate.apply {
text = "取消"
setOnClickListener {
task.cancel()
}
}

task.addStateChange { state ->
when (state) {
BaseTask.TaskState.Abort -> {
downloadTaskBinding.tvTaskProcess.text = "取消"
taskBinding.tvTaskProcess.text = "取消"
}

is BaseTask.TaskState.Completed -> {
downloadTaskBinding.progress.progress = 100
downloadTaskBinding.tvTaskProcess.text = "完成 ${state.filePath}"
taskBinding.progress.progress = 100
taskBinding.tvTaskProcess.text = "完成 下载文件路径=${state.filePath}"
}

is BaseTask.TaskState.Failed -> {
downloadTaskBinding.tvTaskProcess.text = "失败 ${state.exception}"
taskBinding.tvTaskProcess.text = "失败 ${state.exception}"
}

is BaseTask.TaskState.Running -> {
val progress = state.getProgress()
downloadTaskBinding.tvTaskProcess.text =
taskBinding.tvTaskProcess.text =
"下载中 ${SizeUtil.getFormatSize(state.completedSize)} / ${SizeUtil.getFormatSize(state.totalSize)}"
downloadTaskBinding.progress.progress = (progress * 100).toInt()
taskBinding.progress.progress = (progress * 100).toInt()
}

BaseTask.TaskState.Waiting -> {
downloadTaskBinding.tvTaskProcess.text = "等待"
taskBinding.tvTaskProcess.text = "等待"
}
}
}
Expand All @@ -100,6 +105,8 @@ class DownloadActivity : AppCompatActivity() {
private const val KEY_DRIVE_ID = "key_drive_id"
private const val KEY_FILE_IDS = "key_file_ids"

const val MAX_DOWNLOAD_FILE_COUNT = 3

fun launch(context: Activity, driveId: String, fileIds: Array<String>) {
context.startActivity(Intent(context, DownloadActivity::class.java).apply {
putExtra(KEY_DRIVE_ID, driveId)
Expand Down
15 changes: 14 additions & 1 deletion app/src/callback/java/com/alicloud/databox/demo/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ class MainActivity : AppCompatActivity() {
binding.btnFileDownload.setOnClickListener {
startDownloadFile(defaultDriveId, fileIdList, tvResult)
}

binding.btnFileUpload.setOnClickListener {
startUploadFile(defaultDriveId, tvResult)
}
}

private fun startOAuth(tvResult: TextView) {
Expand Down Expand Up @@ -77,7 +81,7 @@ class MainActivity : AppCompatActivity() {
driveId ?: "",
parentFileId = "root",
fields = "*",
limit = 3,
limit = DownloadActivity.MAX_DOWNLOAD_FILE_COUNT,
type = "file",
orderBy = "size",
orderDirection = "DESC"
Expand Down Expand Up @@ -109,4 +113,13 @@ class MainActivity : AppCompatActivity() {
}
DownloadActivity.launch(this, defaultDriveId, fileIdList.toTypedArray())
}

private fun startUploadFile(defaultDriveId: String?, tvResult: TextView) {
if (defaultDriveId.isNullOrEmpty()) {
tvResult.appendWithTime("startUploadFile defaultDriveId is null or empty")
return
}

UploadActivity.launch(this, defaultDriveId)
}
}
117 changes: 117 additions & 0 deletions app/src/callback/java/com/alicloud/databox/demo/UploadActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package com.alicloud.databox.demo

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import com.alicloud.databox.demo.ViewHelper.appendWithTime
import com.alicloud.databox.demo.databinding.ActivityTaskBinding
import com.alicloud.databox.demo.databinding.IncludeTaskBinding
import com.alicloud.databox.opensdk.io.BaseTask

class UploadActivity : AppCompatActivity() {

private val binding: ActivityTaskBinding by lazy { ActivityTaskBinding.inflate(this.layoutInflater) }

private val getContent = registerForActivityResult(ActivityResultContracts.GetContent()) {
if (it != null) {
val filePath = PathUtils.getPathFromUri(this, it)
startUploadFile(filePath)
}
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)

binding.btnStartTask.apply {
text = "开始上传"
setOnClickListener {
pickFile()
}
}
}

private fun pickFile() {
getContent.launch("*/*")
}

private fun startUploadFile(filePath: String?) {

val driveId = intent.getStringExtra(KEY_DRIVE_ID)

val layoutGroup = binding.layoutGroup
val tvResult = binding.tvResult

if (driveId.isNullOrEmpty()) {
tvResult.appendWithTime("driveId is null or empty")
return
}

if (filePath.isNullOrEmpty()) {
tvResult.appendWithTime("path is null or empty")
return
}

tvResult.appendWithTime("path = $filePath")
val aliyunpanClient = AliyunpanApp.aliyunpanClient ?: return
aliyunpanClient.buildUpload(driveId, filePath, { task ->
tvResult.appendWithTime("buildUpload success")

val taskBinding = IncludeTaskBinding.inflate(layoutInflater, layoutGroup, true)

taskBinding.tvTaskName.text = task.getTaskName()
taskBinding.btnTaskOperate.apply {
text = "取消"
setOnClickListener {
task.cancel()
}
}

task.addStateChange { state ->
when (state) {
BaseTask.TaskState.Abort -> {
taskBinding.tvTaskProcess.text = "取消"
}

is BaseTask.TaskState.Completed -> {
taskBinding.progress.progress = 100
taskBinding.tvTaskProcess.text = "完成 上传文件路径=${state.filePath}"
}

is BaseTask.TaskState.Failed -> {
taskBinding.tvTaskProcess.text = "失败 ${state.exception}"
}

is BaseTask.TaskState.Running -> {
val progress = state.getProgress()
taskBinding.tvTaskProcess.text =
"上传中 ${SizeUtil.getFormatSize(state.completedSize)} / ${SizeUtil.getFormatSize(state.totalSize)}"
taskBinding.progress.progress = (progress * 100).toInt()
}

BaseTask.TaskState.Waiting -> {
taskBinding.tvTaskProcess.text = "等待"
}
}
}

val startResult = task.start()
tvResult.appendWithTime("task startResult: $startResult")
}, {
tvResult.appendWithTime("buildUpload failed $it")
})
}

companion object {

private const val KEY_DRIVE_ID = "key_drive_id"

fun launch(context: Activity, driveId: String) {
context.startActivity(Intent(context, UploadActivity::class.java).apply {
putExtra(KEY_DRIVE_ID, driveId)
})
}
}
}
2 changes: 2 additions & 0 deletions app/src/callback/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<resources>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,14 @@ object AliyunpanApp {

fun initApp(context: Context) {
// 配置
// 提示 因为appId绑定申请时的包名,当前demo项目在您本地无法成功授权 demo代码只做参考 需要在appId对应项目使用以下代码
val config = AliyunpanClientConfig.Builder(context, BuildConfig.APP_KEY)
// 云盘上传文件 需要写权限
.appendScope(AliyunpanClientConfig.SCOPE_FILE_WRITE)
.downFolder(
File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
"Aliyunpan-Sdk"
"Aliyunpan"
)
)
.build()
Expand Down
Loading
Loading