diff --git a/app/src/main/java/com/gh/common/util/DialogUtils.java b/app/src/main/java/com/gh/common/util/DialogUtils.java index 930f288810..14e0173690 100644 --- a/app/src/main/java/com/gh/common/util/DialogUtils.java +++ b/app/src/main/java/com/gh/common/util/DialogUtils.java @@ -29,6 +29,12 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.core.content.ContextCompat; +import androidx.databinding.DataBindingUtil; +import androidx.recyclerview.widget.RecyclerView; + import com.facebook.drawee.generic.GenericDraweeHierarchy; import com.gh.common.AppExecutor; import com.gh.common.constant.Config; @@ -58,12 +64,6 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.core.content.ContextCompat; -import androidx.databinding.DataBindingUtil; -import androidx.recyclerview.widget.RecyclerView; - public class DialogUtils { public static Dialog showWaitDialog(Context context, String msg) { @@ -1368,6 +1368,35 @@ public class DialogUtils { dialog.show(); } + public static void showUnzipFailureDialog(Context context, ConfirmListener confirmListener) { + context = checkDialogContext(context); + + final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); + Window window = dialog.getWindow(); + if (window != null) { + window.setBackgroundDrawableResource(android.R.color.transparent); + } + + View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_unzip_failure, null); + + View cancelBtn = contentView.findViewById(R.id.cancel); + View confirmBtn = contentView.findViewById(R.id.confirm); + + + cancelBtn.setOnClickListener(v -> { + dialog.dismiss(); + }); + + confirmBtn.setOnClickListener(v -> { + dialog.dismiss(); + confirmListener.onConfirm(); + }); + + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setContentView(contentView); + dialog.show(); + } + /** * @param context may be is application context * @return activity context diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java index 9192a32ca6..7230203598 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java @@ -263,6 +263,7 @@ public class DownloadItemUtils { boolean isShowPlatform, boolean isNormal) { updateItemViewStatus(holder, true, null); + holder.gameProgressbar.setProgressDrawable(context.getResources().getDrawable(R.drawable.progressbar_bg_style)); String platform = PlatformUtils.getInstance(context).getPlatformName(downloadEntity.getPlatform()); @@ -327,9 +328,10 @@ public class DownloadItemUtils { if (XapkUnzipStatus.UNZIPPING.name().equals(xapkStatus)) { String percent = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_PERCENT); holder.gameProgressbar.setProgressDrawable(context.getResources().getDrawable(R.drawable.progressbar_xapk_style)); - holder.gameDownloadSpeed.setText("解压中"); + holder.gameDownloadSpeed.setText(R.string.unzipping); holder.gameProgressbar.setProgress((int) (Float.valueOf(percent) * 10)); holder.gameDownloadPercentage.setText(percent + "%"); + holder.gameDownloadBtn.setText(R.string.unzipping); return; } @@ -571,10 +573,6 @@ public class DownloadItemUtils { } DataUtils.onGameLaunchEvent(context, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), location); PackageUtils.launchApplicationByPackageName(context, gameEntity.getApk().get(0).getPackageName()); - } else if (str.equals(context.getString(R.string.waiting)) - || str.equals(context.getString(R.string.downloading))) { - context.startActivity(DownloadManagerActivity.getDownloadMangerIntent(context, - apk.getUrl(), entrance + "+(" + location.split(":")[0] + ")")); } else if (str.equals(context.getString(R.string.update))) { if (entrance.contains("我的游戏")) { MtaHelper.onEvent("我的游戏_启动", "更新", gameEntity.getName()); @@ -583,6 +581,9 @@ public class DownloadItemUtils { DialogUtils.checkDownload(context, apk.getSize(), isSubscribe -> update(context, gameEntity, entrance, location, isSubscribe, traceEvent)); }); + } else { + context.startActivity(DownloadManagerActivity.getDownloadMangerIntent(context, + apk.getUrl(), entrance + "+(" + location.split(":")[0] + ")")); } } diff --git a/app/src/main/java/com/gh/common/util/DownloadNotificationHelper.kt b/app/src/main/java/com/gh/common/util/DownloadNotificationHelper.kt index 51e1d0990a..380c1a0176 100644 --- a/app/src/main/java/com/gh/common/util/DownloadNotificationHelper.kt +++ b/app/src/main/java/com/gh/common/util/DownloadNotificationHelper.kt @@ -10,6 +10,8 @@ import android.os.Build import androidx.core.app.NotificationCompat import com.gh.common.AppExecutor import com.gh.common.constant.Constants +import com.gh.common.xapk.XapkInstaller +import com.gh.common.xapk.XapkUnzipStatus import com.gh.gamecenter.R import com.halo.assistant.HaloApp import com.lightgame.download.DownloadEntity @@ -38,9 +40,10 @@ object DownloadNotificationHelper { var requireUpdateNotificationGroupDelay = false val notificationManager = getNotificationManager() val downloadNotificationId = (entity.gameId + entity.packageName).hashCode() + val xapkStatus = entity.meta[XapkInstaller.XAPK_UNZIP_STATUS] val intent = Intent() - if (entity.status == DownloadStatus.done) { + if (entity.status == DownloadStatus.done && xapkStatus != XapkUnzipStatus.FAILURE.name) { intent.putExtra(EntranceUtils.KEY_DATA, entity.toJson()) intent.putExtra(EntranceUtils.KEY_PATH, entity.path) intent.action = ACTION_INSTALL @@ -65,18 +68,23 @@ object DownloadNotificationHelper { .setContentIntent(pendingIntent) .setGroup(DOWNLOAD_GROUP_KEY) .setWhen(whenTime) - .setProgress(PROGRESS_MAX, entity.percent.toInt(), false) - when (entity.status) { - DownloadStatus.downloading -> builder.setContentText(String.format("%s(剩%s)", - SpeedUtils.getSpeed(entity.speed), - SpeedUtils.getRemainTime(entity.size, entity.progress, entity.speed * 1024))) - DownloadStatus.done -> builder.setContentText("下载完成,点击立即安装") - DownloadStatus.waiting -> builder.setContentText("等待中") - DownloadStatus.subscribe, - DownloadStatus.timeout, - DownloadStatus.neterror -> builder.setContentText("已暂停,连接WiFi自动下载") - else -> builder.setContentText("暂停中") + + if (xapkStatus == XapkUnzipStatus.FAILURE.name) { + builder.setContentText("《" + entity.name + "》解压失败,点击查看详情~") + } else { + when (entity.status) { + DownloadStatus.downloading -> builder.setContentText(String.format("%s(剩%s)", + SpeedUtils.getSpeed(entity.speed), + SpeedUtils.getRemainTime(entity.size, entity.progress, entity.speed * 1024))) + DownloadStatus.done -> builder.setContentText("下载完成,点击立即安装") + DownloadStatus.waiting -> builder.setContentText("等待中") + DownloadStatus.subscribe, + DownloadStatus.timeout, + DownloadStatus.neterror -> builder.setContentText("已暂停,连接WiFi自动下载") + else -> builder.setContentText("暂停中") + } + builder.setProgress(PROGRESS_MAX, entity.percent.toInt(), false) } when { @@ -91,6 +99,11 @@ object DownloadNotificationHelper { tryCatchInRelease { val notification = builder.build() // 可能会抛出异常 notification.flags = notification.flags or Notification.FLAG_NO_CLEAR + if (xapkStatus == XapkUnzipStatus.FAILURE.name) { + notification.flags = notification.flags or Notification.FLAG_AUTO_CANCEL + } else { + notification.flags = notification.flags or Notification.FLAG_NO_CLEAR + } if (entity.status == DownloadStatus.delete || entity.status == DownloadStatus.cancel @@ -98,7 +111,8 @@ object DownloadNotificationHelper { || entity.status == DownloadStatus.notfound || entity.status == DownloadStatus.overflow || (entity.status == DownloadStatus.done // 触发安装事件以后也 cancel 掉通知 - && !entity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION].isNullOrEmpty())) { + && !entity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION].isNullOrEmpty() + && xapkStatus != XapkUnzipStatus.FAILURE.name)) { requireUpdateNotificationGroupDelay = true notificationManager.cancel(entity.path, DOWNLOAD_NOTIFICATION_ID) } else { diff --git a/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt b/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt index 43d8dd2bf9..4361387c8f 100644 --- a/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt +++ b/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt @@ -2,6 +2,7 @@ package com.gh.common.xapk import com.gh.common.AppExecutor import com.gh.common.util.* +import com.gh.download.DownloadManager import com.halo.assistant.HaloApp import com.lightgame.download.DataChanger import com.lightgame.download.DownloadEntity @@ -101,6 +102,7 @@ object XapkInstaller : IXapkUnzipListener { downloadEntity.meta[XAPK_UNZIP_PERCENT] = "0.0" downloadEntity.meta[XAPK_UNZIP_STATUS] = XapkUnzipStatus.CANCEL.name DataChanger.notifyDataChanged(downloadEntity) + DownloadManager.getInstance(mApplicationContext).updateDownloadEntity(downloadEntity) } } @@ -109,12 +111,11 @@ object XapkInstaller : IXapkUnzipListener { AppExecutor.uiExecutor.execute { downloadEntity.meta[XAPK_UNZIP_STATUS] = XapkUnzipStatus.FAILURE.name + DownloadNotificationHelper.addOrUpdateDownloadNotification(downloadEntity) DataChanger.notifyDataChanged(downloadEntity) + DownloadManager.getInstance(mApplicationContext).updateDownloadEntity(downloadEntity) } - // todo handle ???????? - // todo 通知栏提示解压失败 - debugOnly { Utils.log("unzip", "onFailure->$exception") } @@ -130,6 +131,7 @@ object XapkInstaller : IXapkUnzipListener { downloadEntity.meta[XAPK_UNZIP_PERCENT] = "100.0" downloadEntity.meta[XAPK_UNZIP_STATUS] = XapkUnzipStatus.SUCCESS.name DataChanger.notifyDataChanged(downloadEntity) + DownloadManager.getInstance(mApplicationContext).updateDownloadEntity(downloadEntity) } debugOnly { @@ -139,8 +141,13 @@ object XapkInstaller : IXapkUnzipListener { } @JvmStatic - fun cancelUnzipTask(zipPath: String) { - mXapkUnzipThreadMap[zipPath]?.canceled = true + fun cancelUnzipTask(downloadEntity: DownloadEntity) { + val xapkUnzipThread = mXapkUnzipThreadMap[downloadEntity.path] + if (xapkUnzipThread != null) { + xapkUnzipThread.canceled = true + } else { + onCancel(downloadEntity) // 刷新页面 + } } } diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java index ab7946001b..6f8f350ee9 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java @@ -28,7 +28,6 @@ import com.gh.common.util.PackageUtils; import com.gh.common.util.PermissionHelper; import com.gh.common.util.ReservationHelper; import com.gh.common.util.StringUtils; -import com.gh.common.xapk.XapkInstaller; import com.gh.common.view.DownloadProgressBar; import com.gh.download.DownloadManager; import com.gh.download.dialog.DownloadDialog; @@ -137,16 +136,8 @@ public class DetailViewHolder { MtaHelper.onEvent("游戏详情_新", "更新", mGameEntity.getName()); } - String autoDownloadPlatform = v.getTag() instanceof String ? (String) v.getTag() : ""; v.setTag(null); switch (mViewHolder.mDownloadPb.getDownloadType()) { - case DOWNLOADING_PLUGIN: - case DOWNLOADING_NORMAL: - Intent intent = DownloadManagerActivity.getDownloadMangerIntent(mViewHolder.context, - mGameEntity.getApk().get(0).getUrl(), - StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])")); - mViewHolder.context.startActivity(intent); - break; case NONE_WITH_HINT: case NONE: String offStatus = mGameEntity.getDownloadOffStatus(); @@ -259,8 +250,11 @@ public class DetailViewHolder { mViewHolder.context.startActivity(i); break; - case XAPK_SUCCESS: - XapkInstaller.install(mDownloadEntity); + default: + Intent intent = DownloadManagerActivity.getDownloadMangerIntent(mViewHolder.context, + mGameEntity.getApk().get(0).getUrl(), + StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])")); + mViewHolder.context.startActivity(intent); break; } } diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameDownloadViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameDownloadViewHolder.java index 3ea5713e13..efc0f1e21f 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameDownloadViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameDownloadViewHolder.java @@ -37,6 +37,9 @@ public class GameDownloadViewHolder extends BaseRecyclerViewHolder { @BindView(R.id.dm_item_tv_startorpause) public TextView dmStartorpause; + @BindView(R.id.unzip_failure_hint) + public View unzipFailureHint; + public GameDownloadViewHolder(View itemView) { super(itemView); } diff --git a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java index 24437dda8c..36ec4ff076 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java @@ -7,6 +7,7 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; @@ -75,10 +76,10 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi private DataWatcher dataWatcher = new DataWatcher() { @Override public void onDataChanged(DownloadEntity downloadEntity) { - Integer location = adapter.getLocation(downloadEntity.getUrl()); - + @Nullable Integer location = adapter.getLocation(downloadEntity.getUrl()); String xapkStatus = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_STATUS); - if (XapkUnzipStatus.UNZIPPING.name().equals(xapkStatus)) { + if (location != null && XapkUnzipStatus.UNZIPPING.name().equals(xapkStatus)) { + adapter.getDoneList().set(location, downloadEntity); adapter.notifyItemChanged(location + 1); return; } diff --git a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java index 7ebbf355e6..65d92012df 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java @@ -26,10 +26,12 @@ import com.gh.common.xapk.XapkInstaller; import com.gh.common.xapk.XapkUnzipStatus; import com.gh.download.DownloadManager; import com.gh.gamecenter.R; +import com.gh.gamecenter.SuggestionActivity; import com.gh.gamecenter.adapter.viewholder.DownloadHeadViewHolder; import com.gh.gamecenter.adapter.viewholder.GameDownloadViewHolder; import com.gh.gamecenter.eventbus.EBDownloadChanged; import com.gh.gamecenter.manager.PackagesManager; +import com.gh.gamecenter.suggest.SuggestType; import com.lightgame.adapter.BaseRecyclerAdapter; import com.lightgame.download.DownloadConfig; import com.lightgame.download.DownloadEntity; @@ -154,16 +156,7 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter { viewHolder.dmDelete.setVisibility(View.VISIBLE); viewHolder.dmStartorpause.setTextColor(Color.WHITE); - String xapkStatus = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_STATUS); - - if (XapkUnzipStatus.UNZIPPING.name().equals(xapkStatus)) { - viewHolder.dmStartorpause.setText("取消"); - viewHolder.dmStartorpause.setBackgroundResource(R.drawable.download_button_normal_style); - - String percent = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_PERCENT); - viewHolder.dmProgressbar.setProgress((int) (Float.parseFloat(percent == null ? "0" : percent) * 10)); - viewHolder.dmSpeed.setText((percent + "%")); - } else if (downloadEntity.isPluggable() + if (downloadEntity.isPluggable() && PackagesManager.INSTANCE.isInstalled(downloadEntity.getPackageName())) { viewHolder.dmStartorpause.setText("安装"); viewHolder.dmStartorpause.setBackgroundResource(R.drawable.download_button_pluggable_style); @@ -234,7 +227,29 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter { viewHolder.dmSpeed.setText(downloadEntity.getPercent() + "%"); } - viewHolder.dmProgressbar.setProgress((int) (downloadEntity.getPercent() * 10)); + String xapkStatus = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_STATUS); + if (XapkUnzipStatus.UNZIPPING.name().equals(xapkStatus)) { + viewHolder.dmStartorpause.setText("取消"); + + String percent = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_PERCENT); + viewHolder.dmProgressbar.setProgress((int) (Float.parseFloat(percent == null ? "0" : percent) * 10)); + viewHolder.dmProgressbar.setProgressDrawable(mContext.getResources().getDrawable(R.drawable.progressbar_xapk_style)); + + viewHolder.dmSpeed.setText((percent + "%")); + + viewHolder.dmDownloads.setText("解压中"); + viewHolder.unzipFailureHint.setVisibility(View.GONE); + } else if (XapkUnzipStatus.FAILURE.name().equals(xapkStatus)) { + viewHolder.dmProgressbar.setProgress((int) (downloadEntity.getPercent() * 10)); + viewHolder.dmProgressbar.setProgressDrawable(mContext.getResources().getDrawable(R.drawable.progressbar_bg_style)); + viewHolder.dmDownloads.setTextColor(ContextCompat.getColor(mContext, R.color.text_F10000)); + viewHolder.unzipFailureHint.setVisibility(View.VISIBLE); + viewHolder.dmDownloads.setText("解压失败"); + } else { + viewHolder.dmProgressbar.setProgress((int) (downloadEntity.getPercent() * 10)); + viewHolder.dmProgressbar.setProgressDrawable(mContext.getResources().getDrawable(R.drawable.progressbar_bg_style)); + viewHolder.unzipFailureHint.setVisibility(View.GONE); + } viewHolder.dmStartorpause.setOnClickListener(v -> { String str = ((TextView) v).getText().toString(); @@ -324,7 +339,7 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter { , "知道了", null, null, null); break; case "取消": - XapkInstaller.cancelUnzipTask(downloadEntity.getPath()); + XapkInstaller.cancelUnzipTask(downloadEntity); break; } @@ -332,7 +347,12 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter { }); viewHolder.dmDownloads.setOnClickListener(v -> { - if (viewHolder.dmDelete.getVisibility() == View.VISIBLE) { + if (viewHolder.unzipFailureHint.getVisibility() == View.VISIBLE) { + DialogUtils.showUnzipFailureDialog(mContext, () -> { + String hint = "《" + downloadEntity.getName() + "》游戏安装包解压失败,问题反馈:"; + SuggestionActivity.startSuggestionActivity(mContext, SuggestType.normal, null, hint); + }); + } else if (viewHolder.dmDelete.getVisibility() == View.VISIBLE) { showDeleteDialog(downloadEntity, viewHolder.getPosition()); } }); @@ -545,8 +565,11 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter { // 显示删除提示框 private void showDeleteDialog(final DownloadEntity entry, final int position) { + String xapkStatus = entry.getMeta().get(XapkInstaller.XAPK_UNZIP_STATUS); String msg; - if (doneList.size() != 0 && position <= doneList.size()) { + if (XapkUnzipStatus.UNZIPPING.name().equals(xapkStatus)) { + msg = "游戏正在解压安装哦,确定删除?"; + } else if (doneList.size() != 0 && position <= doneList.size()) { msg = "游戏还没安装哦,确定删除?"; } else { msg = "游戏还没下载完,确定删除?"; diff --git a/app/src/main/res/drawable-xxhdpi/unzip_failure_hint.png b/app/src/main/res/drawable-xxhdpi/unzip_failure_hint.png new file mode 100644 index 0000000000..3c4b1238ae Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/unzip_failure_hint.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/dialog_unzip_failure_head_background.png b/app/src/main/res/drawable-xxxhdpi/dialog_unzip_failure_head_background.png new file mode 100644 index 0000000000..60306b300a Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/dialog_unzip_failure_head_background.png differ diff --git a/app/src/main/res/drawable/progressbar_bg_style.xml b/app/src/main/res/drawable/progressbar_bg_style.xml index c0e83ab0ed..89eed7d21e 100644 --- a/app/src/main/res/drawable/progressbar_bg_style.xml +++ b/app/src/main/res/drawable/progressbar_bg_style.xml @@ -1,28 +1,28 @@ - + - - - + + + - - + android:endColor="@color/btn_pause" + android:startColor="@color/btn_pause" /> + + - - - - + + + + - - - + android:endColor="@color/theme" + android:startColor="@color/theme" /> + + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/drawable/unzip_failure_dialog_background.xml b/app/src/main/res/drawable/unzip_failure_dialog_background.xml new file mode 100644 index 0000000000..e10816f10d --- /dev/null +++ b/app/src/main/res/drawable/unzip_failure_dialog_background.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_unzip_failure.xml b/app/src/main/res/layout/dialog_unzip_failure.xml new file mode 100644 index 0000000000..3403b5449c --- /dev/null +++ b/app/src/main/res/layout/dialog_unzip_failure.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fm_downloadmanager_item.xml b/app/src/main/res/layout/fm_downloadmanager_item.xml index cd0ec958b5..2b32040463 100644 --- a/app/src/main/res/layout/fm_downloadmanager_item.xml +++ b/app/src/main/res/layout/fm_downloadmanager_item.xml @@ -50,6 +50,14 @@ android:gravity="center_vertical" android:orientation="horizontal"> + + 打开 试玩 展开 > + 解压中 已淘号:%1$s]]> 已领取:%1$s]]>