mod version rollback and info dialog

This commit is contained in:
Tungstend 2023-07-11 00:34:04 +08:00
parent 83fcf6423e
commit 6b4306acb4
5 changed files with 249 additions and 6 deletions

View File

@ -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();
}
}
}

View File

@ -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<LocalModFile> list;
private final ModRollbackDialog.Callback callback;
public ModOldVersionListAdapter(Context context, List<LocalModFile> 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;
}
}

View File

@ -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();
}
}

View File

@ -1,6 +1,93 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:padding="15dp"
android:layout_width="400dp"
android:layout_height="240dp">
<com.tungsten.fcllibrary.component.view.FCLLinearLayout
android:id="@+id/top"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintTop_toTopOf="parent">
<com.tungsten.fcllibrary.component.view.FCLImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:id="@+id/icon"/>
<com.tungsten.fcllibrary.component.view.FCLLinearLayout
android:layout_marginStart="10dp"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.tungsten.fcllibrary.component.view.FCLLinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.tungsten.fcllibrary.component.view.FCLTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textStyle="bold"
android:singleLine="true"
android:id="@+id/name"/>
<com.tungsten.fcllibrary.component.view.FCLTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="11sp"
android:layout_marginStart="10dp"
android:singleLine="true"
android:id="@+id/version"/>
</com.tungsten.fcllibrary.component.view.FCLLinearLayout>
<com.tungsten.fcllibrary.component.view.FCLTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:id="@+id/file_name"/>
</com.tungsten.fcllibrary.component.view.FCLLinearLayout>
</com.tungsten.fcllibrary.component.view.FCLLinearLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
app:layout_constraintTop_toBottomOf="@+id/top"
app:layout_constraintBottom_toTopOf="@+id/positive">
<com.tungsten.fcllibrary.component.view.FCLTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/description"/>
</ScrollView>
<com.tungsten.fcllibrary.component.view.FCLButton
android:id="@+id/website"
android:text="@string/mods_url"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<com.tungsten.fcllibrary.component.view.FCLButton
android:id="@+id/positive"
android:text="@string/dialog_positive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -17,13 +17,13 @@
app:layout_constraintTop_toTopOf="parent"/>
<ListView
android:layout_marginTop="5dp"
android:layout_marginTop="10dp"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/list"
android:layout_marginBottom="5dp"
android:layout_marginBottom="10dp"
app:layout_constraintTop_toBottomOf="@+id/title"
app:layout_constraintBottom_toTopOf="@+id/negative"/>