From 6b4306acb4896e6531bc154c4ef9cc319ad81fd7 Mon Sep 17 00:00:00 2001 From: Tungstend Date: Tue, 11 Jul 2023 00:34:04 +0800 Subject: [PATCH] mod version rollback and info dialog --- .../tungsten/fcl/ui/manage/ModInfoDialog.java | 84 ++++++++++++++++- .../ui/manage/ModOldVersionListAdapter.java | 67 ++++++++++++++ .../fcl/ui/manage/ModRollbackDialog.java | 9 +- FCL/src/main/res/layout/dialog_mod_info.xml | 91 ++++++++++++++++++- .../main/res/layout/dialog_rollback_mod.xml | 4 +- 5 files changed, 249 insertions(+), 6 deletions(-) create mode 100644 FCL/src/main/java/com/tungsten/fcl/ui/manage/ModOldVersionListAdapter.java diff --git a/FCL/src/main/java/com/tungsten/fcl/ui/manage/ModInfoDialog.java b/FCL/src/main/java/com/tungsten/fcl/ui/manage/ModInfoDialog.java index a0065223..de178d5f 100644 --- a/FCL/src/main/java/com/tungsten/fcl/ui/manage/ModInfoDialog.java +++ b/FCL/src/main/java/com/tungsten/fcl/ui/manage/ModInfoDialog.java @@ -1,14 +1,96 @@ package com.tungsten.fcl.ui.manage; +import android.annotation.SuppressLint; import android.content.Context; +import android.graphics.BitmapFactory; +import android.view.View; import androidx.annotation.NonNull; +import com.tungsten.fcl.R; +import com.tungsten.fcl.util.AndroidUtils; +import com.tungsten.fclcore.task.Schedulers; +import com.tungsten.fclcore.task.Task; +import com.tungsten.fclcore.util.StringUtils; +import com.tungsten.fclcore.util.io.CompressingUtils; +import com.tungsten.fclcore.util.io.FileUtils; import com.tungsten.fcllibrary.component.dialog.FCLDialog; +import com.tungsten.fcllibrary.component.view.FCLButton; +import com.tungsten.fcllibrary.component.view.FCLImageView; +import com.tungsten.fcllibrary.component.view.FCLTextView; -public class ModInfoDialog extends FCLDialog { +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.nio.file.FileSystem; +import java.nio.file.Files; +import java.nio.file.Path; +public class ModInfoDialog extends FCLDialog implements View.OnClickListener { + + private final ModListPage.ModInfoObject modInfoObject; + + private FCLImageView icon; + private FCLTextView name; + private FCLTextView version; + private FCLTextView fileName; + private FCLTextView description; + + private FCLButton website; + private FCLButton positive; + + @SuppressLint("UseCompatLoadingForDrawables") public ModInfoDialog(@NonNull Context context, ModListPage.ModInfoObject modInfoObject) { super(context); + this.modInfoObject = modInfoObject; + setCancelable(false); + setContentView(R.layout.dialog_mod_info); + + icon = findViewById(R.id.icon); + name = findViewById(R.id.name); + version = findViewById(R.id.version); + fileName = findViewById(R.id.file_name); + description = findViewById(R.id.description); + + website = findViewById(R.id.website); + positive = findViewById(R.id.positive); + website.setOnClickListener(this); + positive.setOnClickListener(this); + + if (StringUtils.isNotBlank(modInfoObject.getModInfo().getLogoPath())) { + Task.supplyAsync(() -> { + try (FileSystem fs = CompressingUtils.createReadOnlyZipFileSystem(modInfoObject.getModInfo().getFile())) { + Path iconPath = fs.getPath(modInfoObject.getModInfo().getLogoPath()); + if (Files.exists(iconPath)) { + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + Files.copy(iconPath, stream); + return new ByteArrayInputStream(stream.toByteArray()); + } + } + return null; + }).whenComplete(Schedulers.androidUIThread(), (stream, exception) -> { + if (stream != null) { + icon.setImageBitmap(BitmapFactory.decodeStream(stream)); + } else { + icon.setImageDrawable(getContext().getDrawable(R.drawable.img_command)); + } + }).start(); + } + + name.setText(modInfoObject.getModInfo().getName()); + version.setText(modInfoObject.getModInfo().getVersion()); + fileName.setText(FileUtils.getName(modInfoObject.getModInfo().getFile())); + description.setText(modInfoObject.getModInfo().getDescription().toString()); + + website.setVisibility(StringUtils.isNotBlank(modInfoObject.getModInfo().getUrl()) ? View.VISIBLE : View.GONE); + } + + @Override + public void onClick(View v) { + if (v == website && StringUtils.isNotBlank(modInfoObject.getModInfo().getUrl())) { + AndroidUtils.openLink(getContext(), modInfoObject.getModInfo().getUrl()); + } + if (v == positive) { + dismiss(); + } } } diff --git a/FCL/src/main/java/com/tungsten/fcl/ui/manage/ModOldVersionListAdapter.java b/FCL/src/main/java/com/tungsten/fcl/ui/manage/ModOldVersionListAdapter.java new file mode 100644 index 00000000..73ce148c --- /dev/null +++ b/FCL/src/main/java/com/tungsten/fcl/ui/manage/ModOldVersionListAdapter.java @@ -0,0 +1,67 @@ +package com.tungsten.fcl.ui.manage; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; + +import com.tungsten.fcl.R; +import com.tungsten.fclcore.mod.LocalModFile; +import com.tungsten.fcllibrary.component.FCLAdapter; +import com.tungsten.fcllibrary.component.view.FCLLinearLayout; +import com.tungsten.fcllibrary.component.view.FCLTextView; +import com.tungsten.fcllibrary.util.ConvertUtils; + +import java.util.List; + +public class ModOldVersionListAdapter extends FCLAdapter { + + private final List list; + private final ModRollbackDialog.Callback callback; + + public ModOldVersionListAdapter(Context context, List list, ModRollbackDialog.Callback callback) { + super(context); + this.list = list; + this.callback = callback; + } + + private static class ViewHolder { + FCLLinearLayout parent; + FCLTextView version; + } + + @Override + public int getCount() { + return list.size(); + } + + @Override + public Object getItem(int i) { + return list.get(i); + } + + @SuppressLint("UseCompatLoadingForDrawables") + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + final ViewHolder viewHolder; + if (view == null) { + viewHolder = new ViewHolder(); + view = new FCLLinearLayout(getContext()); + viewHolder.parent = new FCLLinearLayout(getContext()); + viewHolder.version = new FCLTextView(getContext()); + ((FCLLinearLayout) view).addView(viewHolder.parent, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + int padding = ConvertUtils.dip2px(getContext(), 10); + viewHolder.parent.setPadding(padding, padding, padding, padding); + viewHolder.parent.setBackground(getContext().getDrawable(R.drawable.bg_container_transparent_clickable)); + viewHolder.parent.addView(viewHolder.version, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + viewHolder.version.setSingleLine(true); + view.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) view.getTag(); + } + LocalModFile localModFile = list.get(i); + viewHolder.parent.setOnClickListener(v -> callback.onOldVersionSelect(localModFile)); + viewHolder.version.setText(localModFile.getVersion()); + return view; + } +} diff --git a/FCL/src/main/java/com/tungsten/fcl/ui/manage/ModRollbackDialog.java b/FCL/src/main/java/com/tungsten/fcl/ui/manage/ModRollbackDialog.java index 0bc92104..e87ba563 100644 --- a/FCL/src/main/java/com/tungsten/fcl/ui/manage/ModRollbackDialog.java +++ b/FCL/src/main/java/com/tungsten/fcl/ui/manage/ModRollbackDialog.java @@ -23,12 +23,19 @@ public class ModRollbackDialog extends FCLDialog implements View.OnClickListener super(context); setCancelable(false); setContentView(R.layout.dialog_rollback_mod); + + listView = findViewById(R.id.list); + negative = findViewById(R.id.negative); + negative.setOnClickListener(this); + + ModOldVersionListAdapter adapter = new ModOldVersionListAdapter(getContext(), list, callback); + listView.setAdapter(adapter); } @Override public void onClick(View v) { if (v == negative) { - + dismiss(); } } diff --git a/FCL/src/main/res/layout/dialog_mod_info.xml b/FCL/src/main/res/layout/dialog_mod_info.xml index 77d9ef65..199690a6 100644 --- a/FCL/src/main/res/layout/dialog_mod_info.xml +++ b/FCL/src/main/res/layout/dialog_mod_info.xml @@ -1,6 +1,93 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:padding="15dp" + android:layout_width="400dp" + android:layout_height="240dp"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FCL/src/main/res/layout/dialog_rollback_mod.xml b/FCL/src/main/res/layout/dialog_rollback_mod.xml index 9956ff2c..e052e0d4 100644 --- a/FCL/src/main/res/layout/dialog_rollback_mod.xml +++ b/FCL/src/main/res/layout/dialog_rollback_mod.xml @@ -17,13 +17,13 @@ app:layout_constraintTop_toTopOf="parent"/>