package com.nodka.zysjtest;
|
|
import android.content.Context;
|
import android.os.Handler;
|
import android.os.Looper;
|
import android.view.LayoutInflater;
|
import android.view.View;
|
import android.view.ViewGroup;
|
import android.view.ViewGroup.LayoutParams;
|
import android.view.Gravity;
|
import android.widget.EditText;
|
import android.widget.LinearLayout;
|
import android.widget.TextView;
|
|
import androidx.annotation.NonNull;
|
import androidx.appcompat.app.AlertDialog;
|
import androidx.recyclerview.widget.RecyclerView;
|
|
import com.google.android.material.button.MaterialButton;
|
import com.google.android.material.materialswitch.MaterialSwitch;
|
|
import java.util.List;
|
|
class TestItemAdapter extends RecyclerView.Adapter<TestItemAdapter.TestItemViewHolder> {
|
private final List<TestItem> items;
|
private final Handler handler = new Handler(Looper.getMainLooper());
|
|
TestItemAdapter(List<TestItem> items) {
|
this.items = items;
|
}
|
|
@NonNull
|
@Override
|
public TestItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
View view = LayoutInflater.from(parent.getContext())
|
.inflate(R.layout.item_test_item, parent, false);
|
return new TestItemViewHolder(view);
|
}
|
|
@Override
|
public void onBindViewHolder(@NonNull TestItemViewHolder holder, int position) {
|
TestItem item = items.get(position);
|
holder.chineseNameTextView.setText(item.chineseName);
|
holder.methodNameTextView.setText(item.methodName);
|
holder.descriptionTextView.setText(item.description);
|
holder.resultTextView.setText(item.result);
|
bindSwitch(holder, item);
|
bindInputs(holder, item);
|
|
holder.testButton.setOnClickListener(v -> {
|
int adapterPosition = holder.getAdapterPosition();
|
if (adapterPosition == RecyclerView.NO_POSITION) {
|
return;
|
}
|
if (item.requiresConfirmation) {
|
showConfirmation(v.getContext(), item, () -> runTest(adapterPosition, holder));
|
return;
|
}
|
runTest(adapterPosition, holder);
|
});
|
}
|
|
@Override
|
public int getItemCount() {
|
return items.size();
|
}
|
|
private void bindInputs(TestItemViewHolder holder, TestItem item) {
|
holder.inputContainer.removeAllViews();
|
holder.inputEditText.setText(null);
|
|
if (!item.hasInput) {
|
holder.inputEditText.setVisibility(View.GONE);
|
holder.inputContainer.setVisibility(View.GONE);
|
return;
|
}
|
|
holder.inputEditText.setVisibility(View.VISIBLE);
|
holder.inputContainer.setVisibility(item.inputFields.length > 1 ? View.VISIBLE : View.GONE);
|
bindInputField(holder.inputEditText, item.inputFields[0]);
|
|
if (item.inputFields.length > 1) {
|
Context context = holder.itemView.getContext();
|
for (int i = 1; i < item.inputFields.length; i++) {
|
EditText extraInput = createInputEditText(context, item.inputFields[i], true);
|
holder.inputContainer.addView(extraInput);
|
}
|
}
|
}
|
|
private void bindSwitch(TestItemViewHolder holder, TestItem item) {
|
if (!item.hasSwitch) {
|
holder.switchView.setVisibility(View.GONE);
|
holder.switchView.setOnCheckedChangeListener(null);
|
return;
|
}
|
|
holder.switchView.setVisibility(View.VISIBLE);
|
holder.switchView.setText(item.switchLabel);
|
holder.switchView.setOnCheckedChangeListener(null);
|
holder.switchView.setChecked(item.switchChecked);
|
holder.switchView.setOnCheckedChangeListener((buttonView, isChecked) -> item.switchChecked = isChecked);
|
}
|
|
private void bindInputField(EditText editText, TestItem.InputField inputField) {
|
editText.setHint(inputField.hint);
|
editText.setInputType(inputField.inputType);
|
editText.setText(inputField.value);
|
}
|
|
private EditText createInputEditText(Context context, TestItem.InputField inputField, boolean addTopMargin) {
|
EditText editText = new EditText(context);
|
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
|
LayoutParams.MATCH_PARENT,
|
dpToPx(context, 40));
|
if (addTopMargin) {
|
params.topMargin = dpToPx(context, 8);
|
}
|
editText.setLayoutParams(params);
|
editText.setBackgroundResource(R.drawable.bg_result_panel);
|
editText.setGravity(Gravity.CENTER_VERTICAL | Gravity.START);
|
editText.setHint(inputField.hint);
|
editText.setInputType(inputField.inputType);
|
editText.setMaxLines(1);
|
editText.setSingleLine(true);
|
editText.setPadding(dpToPx(context, 8), dpToPx(context, 6), dpToPx(context, 8), dpToPx(context, 6));
|
editText.setText(inputField.value);
|
editText.setTextColor(context.getResources().getColor(R.color.text_primary, context.getTheme()));
|
editText.setHintTextColor(context.getResources().getColor(R.color.text_secondary, context.getTheme()));
|
editText.setTextSize(13f);
|
return editText;
|
}
|
|
private void showConfirmation(Context context, TestItem item, Runnable onConfirmed) {
|
new AlertDialog.Builder(context)
|
.setMessage(item.confirmationMessage)
|
.setNegativeButton(android.R.string.cancel, null)
|
.setPositiveButton(android.R.string.ok, (dialog, which) -> onConfirmed.run())
|
.show();
|
}
|
|
private void runTest(int position, TestItemViewHolder holder) {
|
if (position == RecyclerView.NO_POSITION) {
|
return;
|
}
|
|
TestItem item = items.get(position);
|
String[] inputs = collectInputs(item, holder);
|
|
item.result = "开始测试...";
|
notifyItemChanged(position);
|
|
if (item.testAction == null) {
|
handler.postDelayed(() -> {
|
item.result = "测试通过:当前接口待接入真实 API";
|
notifyItemChanged(position);
|
}, 500);
|
return;
|
}
|
|
try {
|
item.result = item.testAction.run(item, inputs);
|
} catch (Exception e) {
|
String message = e.getMessage();
|
if (message == null || message.isEmpty()) {
|
message = e.getClass().getSimpleName();
|
} else {
|
message = e.getClass().getSimpleName() + ": " + message;
|
}
|
item.result = "调用失败:" + message;
|
}
|
notifyItemChanged(position);
|
}
|
|
private String[] collectInputs(TestItem item, TestItemViewHolder holder) {
|
if (!item.hasInput) {
|
return new String[0];
|
}
|
|
String[] inputs = new String[item.inputFields.length];
|
inputs[0] = readFieldValue(holder.inputEditText, item.inputFields[0]);
|
item.setInputValue(0, inputs[0]);
|
|
for (int i = 1; i < item.inputFields.length; i++) {
|
EditText extraInput = (EditText) holder.inputContainer.getChildAt(i - 1);
|
inputs[i] = readFieldValue(extraInput, item.inputFields[i]);
|
item.setInputValue(i, inputs[i]);
|
}
|
|
return inputs;
|
}
|
|
private String readFieldValue(EditText editText, TestItem.InputField inputField) {
|
String value = editText.getText().toString().trim();
|
if (value.isEmpty()) {
|
value = inputField.defaultValue;
|
editText.setText(value);
|
}
|
return value;
|
}
|
|
private int dpToPx(Context context, int dp) {
|
float density = context.getResources().getDisplayMetrics().density;
|
return Math.round(dp * density);
|
}
|
|
static class TestItemViewHolder extends RecyclerView.ViewHolder {
|
private final TextView chineseNameTextView;
|
private final TextView methodNameTextView;
|
private final TextView descriptionTextView;
|
private final MaterialSwitch switchView;
|
private final EditText inputEditText;
|
private final LinearLayout inputContainer;
|
private final TextView resultTextView;
|
private final MaterialButton testButton;
|
|
TestItemViewHolder(@NonNull View itemView) {
|
super(itemView);
|
chineseNameTextView = itemView.findViewById(R.id.test_item_chinese_name_text);
|
methodNameTextView = itemView.findViewById(R.id.test_item_method_name_text);
|
descriptionTextView = itemView.findViewById(R.id.test_item_description_text);
|
switchView = itemView.findViewById(R.id.test_item_switch);
|
inputEditText = itemView.findViewById(R.id.test_item_input_edit);
|
inputContainer = itemView.findViewById(R.id.test_item_input_container);
|
resultTextView = itemView.findViewById(R.id.test_item_result_text);
|
testButton = itemView.findViewById(R.id.test_item_button);
|
}
|
}
|
}
|