bugfixes:修复不能下载视频
update:修改下载列表样式,文件位置统一
This commit is contained in:
2026-02-06 15:39:11 +08:00
parent 3eb281f930
commit d5ba38e04e
13 changed files with 223 additions and 45 deletions

View File

@@ -1,6 +1,5 @@
package com.hainaos.vc.activity.category.local; package com.hainaos.vc.activity.category.local;
import android.os.Environment;
import android.util.Log; import android.util.Log;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
@@ -44,7 +43,7 @@ public class LocalCategoryViewModel extends BaseViewModel<ActivityCategoryLocalB
public MutableLiveData<ArrayList<LocalVideoInfo>> mLocalVideoInfosData = new MutableLiveData<>(); public MutableLiveData<ArrayList<LocalVideoInfo>> mLocalVideoInfosData = new MutableLiveData<>();
public void getViedoList(String dir) { public void getViedoList(String dir) {
File file = new File(Environment.getExternalStorageDirectory() + File.separator + "haina" + File.separator + dir); File file = new File(FileUtils.getHainaVideoPath(getCtx()) + dir);
Observable Observable
.fromCallable(new Callable<List<String>>() { .fromCallable(new Callable<List<String>>() {
@Override @Override

View File

@@ -3,8 +3,11 @@ package com.hainaos.vc.activity.category.online;
import android.content.Intent; import android.content.Intent;
import android.view.View; import android.view.View;
import androidx.annotation.NonNull;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.hainaos.vc.R; import com.hainaos.vc.R;
@@ -20,7 +23,6 @@ import com.hainaos.vc.utils.FileUtils;
import com.hainaos.vc.utils.ScreenUtils; import com.hainaos.vc.utils.ScreenUtils;
import com.hainaos.vc.view.CustomDialog; import com.hainaos.vc.view.CustomDialog;
import com.hainaos.vc.view.EquallyDividedItemDecoration; import com.hainaos.vc.view.EquallyDividedItemDecoration;
import com.hainaos.vc.view.RecycleGridLayoutManager;
import com.hjq.toast.Toaster; import com.hjq.toast.Toaster;
import java.io.File; import java.io.File;
@@ -50,7 +52,9 @@ public class CategoryVideoActivity extends BaseMvvmActivity<CategoryVideoViewMod
@Override @Override
protected void initView() { protected void initView() {
RecycleGridLayoutManager manager = new RecycleGridLayoutManager(CategoryVideoActivity.this, SPAN_COUNT); // RecycleGridLayoutManager manager = new RecycleGridLayoutManager(CategoryVideoActivity.this, SPAN_COUNT);
LinearLayoutManager manager = new LinearLayoutManager(CategoryVideoActivity.this);
manager.setOrientation(RecyclerView.VERTICAL);
mViewDataBinding.rvVideo.setLayoutManager(manager); mViewDataBinding.rvVideo.setLayoutManager(manager);
EquallyDividedItemDecoration equallyDividedItemDecoration = new EquallyDividedItemDecoration(SPAN_COUNT, ScreenUtils.dip2px(CategoryVideoActivity.this, 1)); EquallyDividedItemDecoration equallyDividedItemDecoration = new EquallyDividedItemDecoration(SPAN_COUNT, ScreenUtils.dip2px(CategoryVideoActivity.this, 1));
@@ -68,6 +72,16 @@ public class CategoryVideoActivity extends BaseMvvmActivity<CategoryVideoViewMod
mViewModel.getVideoList(mCategoryInfo.getUuid(), mPasswd); mViewModel.getVideoList(mCategoryInfo.getUuid(), mPasswd);
} }
}); });
mViewDataBinding.rvVideo.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
// canScrollVertically(-1) 检查是否可以往下拉(即是否不在顶部)
// 如果返回 true说明不在顶部此时禁用 SwipeRefreshLayout 的下拉手势
mViewDataBinding.swipeRefreshLayout.setEnabled(!recyclerView.canScrollVertically(-1));
}
});
} }
@Override @Override
@@ -106,6 +120,7 @@ public class CategoryVideoActivity extends BaseMvvmActivity<CategoryVideoViewMod
} else { } else {
mViewDataBinding.clNodata.setVisibility(View.GONE); mViewDataBinding.clNodata.setVisibility(View.GONE);
mViewDataBinding.rvVideo.setVisibility(View.VISIBLE); mViewDataBinding.rvVideo.setVisibility(View.VISIBLE);
mViewDataBinding.tvTotal.setText(String.format(getString(R.string.video_total), categoryVideoInfos.size()));
} }
} else { } else {
Toaster.show(baseResponse.msg); Toaster.show(baseResponse.msg);

View File

@@ -1,6 +1,5 @@
package com.hainaos.vc.activity.category.online; package com.hainaos.vc.activity.category.online;
import android.os.Environment;
import android.util.Log; import android.util.Log;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
@@ -45,7 +44,7 @@ public class CategoryVideoViewModel extends BaseViewModel<ActivityCategoryVideoB
@Deprecated @Deprecated
public void getViedoList(String dir) { public void getViedoList(String dir) {
File file = new File(Environment.getExternalStorageDirectory() + File.separator + "haina" + File.separator + dir); File file = new File(FileUtils.getHainaVideoPath(getCtx()) + dir);
if (file.exists()) { if (file.exists()) {
String[] strings = file.list(); String[] strings = file.list();
Log.e(TAG, "getViedoList: " + Arrays.toString(strings)); Log.e(TAG, "getViedoList: " + Arrays.toString(strings));

View File

@@ -27,6 +27,7 @@ import com.hainaos.vc.base.BaseFragmentPagerAdapter;
import com.hainaos.vc.base.mvvm.BaseMvvmActivity; import com.hainaos.vc.base.mvvm.BaseMvvmActivity;
import com.hainaos.vc.bean.uiuios.AppUpdateInfo; import com.hainaos.vc.bean.uiuios.AppUpdateInfo;
import com.hainaos.vc.config.CommonConfig; import com.hainaos.vc.config.CommonConfig;
import com.hainaos.vc.config.Permissions;
import com.hainaos.vc.databinding.ActivityMainBinding; import com.hainaos.vc.databinding.ActivityMainBinding;
import com.hainaos.vc.dialog.PermissionsDialog; import com.hainaos.vc.dialog.PermissionsDialog;
import com.hainaos.vc.dialog.PrivacyPolicyDialog; import com.hainaos.vc.dialog.PrivacyPolicyDialog;
@@ -61,11 +62,6 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
private static final int REQUEST_PERMISSION_CODE = 200; private static final int REQUEST_PERMISSION_CODE = 200;
String[] permissions = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
@Override @Override
public boolean setNightMode() { public boolean setNightMode() {
return true; return true;
@@ -205,7 +201,7 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
} }
private void checkSelfPermission() { private void checkSelfPermission() {
if (XXPermissions.isGranted(MainActivity.this, permissions)) { if (XXPermissions.isGranted(MainActivity.this, Permissions.STORAGE_PERMISSIONS)) {
initDatas(); initDatas();
} else { } else {
showPermissionsDialog(); showPermissionsDialog();
@@ -226,7 +222,7 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
public void onGranted() { public void onGranted() {
mPermissionsDialog.dismiss(); mPermissionsDialog.dismiss();
XXPermissions.with(MainActivity.this) XXPermissions.with(MainActivity.this)
.permission(permissions) .permission(Permissions.STORAGE_PERMISSIONS)
.request(new OnPermissionCallback() { .request(new OnPermissionCallback() {
@Override @Override
public void onGranted(@androidx.annotation.NonNull List<String> permissions, boolean allGranted) { public void onGranted(@androidx.annotation.NonNull List<String> permissions, boolean allGranted) {

View File

@@ -1,6 +1,7 @@
package com.hainaos.vc.adapter; package com.hainaos.vc.adapter;
import android.app.Activity; import android.app.Activity;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever; import android.media.MediaMetadataRetriever;
@@ -11,6 +12,7 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
@@ -23,9 +25,16 @@ import com.arialyy.aria.core.task.DownloadTask;
import com.hainaos.vc.R; import com.hainaos.vc.R;
import com.hainaos.vc.activity.preview.VideoPreviewActivity; import com.hainaos.vc.activity.preview.VideoPreviewActivity;
import com.hainaos.vc.bean.CategoryVideoInfo; import com.hainaos.vc.bean.CategoryVideoInfo;
import com.hainaos.vc.config.Permissions;
import com.hainaos.vc.dialog.PermissionsDialog;
import com.hainaos.vc.utils.FileUtils; import com.hainaos.vc.utils.FileUtils;
import com.hainaos.vc.utils.GlideLoadUtils; import com.hainaos.vc.utils.GlideLoadUtils;
import com.hainaos.vc.utils.TimeUtils; import com.hainaos.vc.utils.TimeUtils;
import com.hainaos.vc.utils.ToastUtil;
import com.hainaos.vc.view.CustomDialog;
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.XXPermissions;
import com.hjq.toast.Toaster;
import com.shehuan.niv.NiceImageView; import com.shehuan.niv.NiceImageView;
import java.io.File; import java.io.File;
@@ -75,15 +84,31 @@ public class CategoryVideoAdapter extends RecyclerView.Adapter<CategoryVideoAdap
String fileName = FileUtils.getFileNamefromURL(url); String fileName = FileUtils.getFileNamefromURL(url);
File file = new File(FileUtils.getHainaVideoPath(mContext) + mDirName + File.separator + fileName); File file = new File(FileUtils.getHainaVideoPath(mContext) + mDirName + File.separator + fileName);
if (file.exists()) { if (file.exists()) {
holder.iv_status.setVisibility(View.GONE); holder.tv_download.setText("删除");
holder.tv_download.setBackground(mContext.getDrawable(R.drawable.bg_delete_button));
} else { } else {
holder.iv_status.setVisibility(View.VISIBLE); holder.tv_download.setText("下载");
holder.tv_download.setBackground(mContext.getDrawable(R.drawable.bg_download_button));
} }
String cover = categoryVideoInfo.getCover(); String cover = categoryVideoInfo.getCover();
GlideLoadUtils.getInstance().glideLoad(mContext, cover, holder.video_image); GlideLoadUtils.getInstance().glideLoad(mContext, cover, holder.video_image);
holder.duration.setText(TimeUtils.TimeFormat(categoryVideoInfo.getDuration() * 1000)); holder.duration.setText(TimeUtils.TimeFormat(categoryVideoInfo.getDuration() * 1000));
holder.tv_download.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (file.exists()) {
showDialog(file.getAbsolutePath(), position);
} else {
if (XXPermissions.isGranted(mContext, Permissions.STORAGE_PERMISSIONS)) {
FileUtils.ariaDownload(mContext, mDirName, url, md5);
} else {
showPermissionsDialog(mContext);
}
}
}
});
holder.video_image.setOnClickListener(new View.OnClickListener() { holder.video_image.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@@ -93,12 +118,86 @@ public class CategoryVideoAdapter extends RecyclerView.Adapter<CategoryVideoAdap
intent.putExtra("url", file.getAbsolutePath()); intent.putExtra("url", file.getAbsolutePath());
mContext.startActivity(intent); mContext.startActivity(intent);
} else { } else {
FileUtils.ariaDownload(mContext, mDirName, url, md5); Toaster.show("请先下载视频");
} }
} }
}); });
} }
private PermissionsDialog mPermissionsDialog;
private void showPermissionsDialog(Context context) {
if (mPermissionsDialog != null) {
mPermissionsDialog.dismiss();
mPermissionsDialog = null;
}
mPermissionsDialog = new PermissionsDialog(context);
mPermissionsDialog.setPermissionsCallback(new PermissionsDialog.PermissionsCallback() {
@Override
public void onGranted() {
mPermissionsDialog.dismiss();
XXPermissions.with(context)
.permission(Permissions.STORAGE_PERMISSIONS)
.request(new OnPermissionCallback() {
@Override
public void onGranted(@androidx.annotation.NonNull List<String> permissions, boolean allGranted) {
Log.e(TAG, "onGranted: permissions = " + permissions + " allGranted = " + allGranted);
if (!allGranted) {
Toast.makeText(context, "存储权限未正常授予", Toast.LENGTH_SHORT).show();
return;
}
Log.e(TAG, "onGranted: 获取存储权限成功");
}
@Override
public void onDenied(@androidx.annotation.NonNull List<String> permissions, boolean doNotAskAgain) {
Log.e(TAG, "onDenied: permissions = " + permissions + " doNotAskAgain = " + doNotAskAgain);
if (doNotAskAgain) {
Toast.makeText(context, "被永久拒绝授权,请手动授予存储权限", Toast.LENGTH_SHORT).show();
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(context, permissions);
} else {
Log.e(TAG, "onGranted: 获取存储权限失败");
}
}
});
}
@Override
public void onDenied() {
mPermissionsDialog.dismiss();
}
});
mPermissionsDialog.setContent("本软件需要获取存储权限保存照片和视频,授权之后才可以正常使用");
mPermissionsDialog.show();
}
private void showDialog(String path, int position) {
CustomDialog dialog = new CustomDialog(mContext);
dialog.setTitle("删除文件")
.setMessage("确定要删除文件 " + FileUtils.getFileName(path) + "")
.setPositive("确定")
.setNegtive("取消")
.setOnClickBottomListener(new CustomDialog.OnClickBottomListener() {
@Override
public void onPositiveClick() {
dialog.dismiss();
File file = new File(path);
if (file.delete()) {
removeItem(position);
ToastUtil.show("删除成功");
} else {
ToastUtil.show("删除失败,检查权限是否开启");
}
}
@Override
public void onNegtiveClick() {
dialog.dismiss();
}
});
dialog.show();
}
public void removeItem(int position) { public void removeItem(int position) {
if (null != mLocalVideoInfos.get(position)) { if (null != mLocalVideoInfos.get(position)) {
@@ -123,16 +222,16 @@ public class CategoryVideoAdapter extends RecyclerView.Adapter<CategoryVideoAdap
} }
static class VideoHolder extends RecyclerView.ViewHolder { static class VideoHolder extends RecyclerView.ViewHolder {
NiceImageView video_image, iv_status; NiceImageView video_image;
TextView title, duration; TextView title, duration, tv_download;
ConstraintLayout root; ConstraintLayout root;
public VideoHolder(@NonNull View itemView) { public VideoHolder(@NonNull View itemView) {
super(itemView); super(itemView);
video_image = itemView.findViewById(R.id.video_image); video_image = itemView.findViewById(R.id.video_image);
iv_status = itemView.findViewById(R.id.iv_status);
title = itemView.findViewById(R.id.title_text); title = itemView.findViewById(R.id.title_text);
duration = itemView.findViewById(R.id.duration); duration = itemView.findViewById(R.id.duration);
tv_download = itemView.findViewById(R.id.tv_download);
root = itemView.findViewById(R.id.root); root = itemView.findViewById(R.id.root);
} }
@@ -180,7 +279,7 @@ public class CategoryVideoAdapter extends RecyclerView.Adapter<CategoryVideoAdap
try { try {
Log.e(TAG, "taskFail: e " + e.getMessage()); Log.e(TAG, "taskFail: e " + e.getMessage());
} catch (Exception ex) { } catch (Exception ex) {
Log.e(TAG, "taskFail: ex " + e.getMessage()); Log.e(TAG, "taskFail: ex " + ex.getMessage());
} }
notifyDataSetChanged(); notifyDataSetChanged();

View File

@@ -0,0 +1,10 @@
package com.hainaos.vc.config;
import android.Manifest;
public class Permissions {
public static final String[] STORAGE_PERMISSIONS = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
}

View File

@@ -6,6 +6,8 @@ import android.os.Environment;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import androidx.core.content.ContextCompat;
import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.Aria;
import com.hainaos.vc.bean.AppInfo; import com.hainaos.vc.bean.AppInfo;
import com.hainaos.vc.bean.uiuios.AppUpdateInfo; import com.hainaos.vc.bean.uiuios.AppUpdateInfo;
@@ -76,7 +78,8 @@ public class FileUtils {
} }
public static String getHainaVideoPath(Context context) { public static String getHainaVideoPath(Context context) {
String path = Environment.getExternalStorageDirectory() + File.separator + "haina"; // String path = Environment.getExternalStorageDirectory() + File.separator + "haina";
String path = ContextCompat.getExternalFilesDirs(context, Environment.DIRECTORY_DOWNLOADS)[0].getAbsolutePath() + File.separator + "haina";
return path + File.separator; return path + File.separator;
} }
@@ -90,7 +93,7 @@ public class FileUtils {
String downLoadPath = getHainaVideoPath(context) + dirName + File.separator; String downLoadPath = getHainaVideoPath(context) + dirName + File.separator;
File dirFile = new File(downLoadPath); File dirFile = new File(downLoadPath);
if (!dirFile.exists()) { if (!dirFile.exists()) {
dirFile.mkdirs(); Log.e(TAG, "ariaDownload: mkdirs = " + dirFile.mkdirs());
} }
String fileName = getFileNamefromURL(url); String fileName = getFileNamefromURL(url);
File file = new File(downLoadPath + fileName); File file = new File(downLoadPath + fileName);

View File

@@ -79,9 +79,9 @@ public class LenovoCsdkUtil {
} }
public String getSerial() { public String getSerial() {
if (BuildConfig.DEBUG) { // if (BuildConfig.DEBUG) {
return "T98005H1024GB32GB"; // return "T98005H1024GB32GB";
} // }
String sn = mCSDKManager.getDeviceInfo(2); String sn = mCSDKManager.getDeviceInfo(2);
return sn; return sn;

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/red" />
<corners android:radius="16dp" />
<padding
android:bottom="4dp"
android:left="12dp"
android:right="12dp"
android:top="4dp" />
</shape>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#0084FF" />
<corners android:radius="16dp" />
<padding
android:bottom="4dp"
android:left="12dp"
android:right="12dp"
android:top="4dp" />
</shape>

View File

@@ -28,6 +28,7 @@
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout2"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:onClick="@{click::exit}" android:onClick="@{click::exit}"
@@ -51,18 +52,34 @@
<TextView <TextView
android:id="@+id/tv_title" android:id="@+id/tv_title"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="16dp"
android:text="@{title}" android:text="@{title}"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="18sp" android:textSize="18sp"
android:textStyle="bold" android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toStartOf="@+id/tv_total"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toEndOf="@+id/constraintLayout2"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:text="海纳美业学习机" /> tools:text="海纳美业学习机" />
<TextView
android:id="@+id/tv_total"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="视频:0个"
android:textColor="@color/white"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="@string/video_total" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
@@ -87,9 +104,9 @@
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_nodata" android:id="@+id/cl_nodata"
android:visibility="gone"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:visibility="gone">
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@@ -10,41 +10,50 @@
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout" android:id="@+id/constraintLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="200dp" android:layout_height="88dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<com.shehuan.niv.NiceImageView <com.shehuan.niv.NiceImageView
android:id="@+id/video_image" android:id="@+id/video_image"
android:layout_width="match_parent" android:layout_width="80dp"
android:layout_height="match_parent" android:layout_height="80dp"
android:layout_marginStart="8dp"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:scaleType="centerCrop" android:scaleType="centerCrop"
app:is_cover_src="true" /> app:is_cover_src="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.shehuan.niv.NiceImageView <TextView
android:id="@+id/iv_status" android:id="@+id/tv_download"
android:layout_width="32dp" android:layout_width="wrap_content"
android:layout_height="32dp" android:layout_height="wrap_content"
android:src="@drawable/status_download" android:layout_marginEnd="16dp"
android:background="@drawable/bg_download_button"
android:text="下载"
android:textColor="@color/white"
android:textSize="10sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/title_text" android:id="@+id/title_text"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="4dp" android:layout_marginHorizontal="8dp"
android:layout_marginTop="4dp"
android:maxLines="3" android:maxLines="3"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="12sp" android:textSize="15sp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@+id/tv_download"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/video_image"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.15"
tools:text="标题" /> tools:text="标题" />
<TextView <TextView

View File

@@ -11,4 +11,5 @@
<string name="privacy_agreement_content">\t\t\t\t请你务必审慎阅读、充分理解“用户协议”包括但不限于为了向你提供即时通讯内容分享等服务 <string name="privacy_agreement_content">\t\t\t\t请你务必审慎阅读、充分理解“用户协议”包括但不限于为了向你提供即时通讯内容分享等服务
我们需要收集你的设备信息、操作日志等个人信息。 我们需要收集你的设备信息、操作日志等个人信息。
\n\t\t\t\t你可阅读《用户协议》了解详细信息。如你同意请点击“同意”开始接受我们的服务</string> \n\t\t\t\t你可阅读《用户协议》了解详细信息。如你同意请点击“同意”开始接受我们的服务</string>
<string name="video_total">视频:%d个</string>
</resources> </resources>