Android: 完善本地模式收藏与笔记逻辑,并优化 UML 查看

main
SLMS Development Team 5 months ago
parent 2e924a2ca5
commit 0894c789a3

@ -1895,6 +1895,12 @@ public class MainActivity extends AppCompatActivity {
}
private void reserveBookOnServer(final Book book) {
if (useLocalMode) {
Toast.makeText(MainActivity.this,
"本地模式暂不支持预约功能,请切换到网络模式使用。",
Toast.LENGTH_SHORT).show();
return;
}
final String userId = currentUserId;
if (userId == null) return;
progressBar.setVisibility(View.VISIBLE);
@ -1956,6 +1962,12 @@ public class MainActivity extends AppCompatActivity {
}
private void loadReservationsAndShowDialog() {
if (useLocalMode) {
Toast.makeText(MainActivity.this,
"本地模式暂不支持预约功能,请切换到网络模式使用。",
Toast.LENGTH_SHORT).show();
return;
}
final String userId = currentUserId;
if (userId == null) return;
progressBar.setVisibility(View.VISIBLE);
@ -2161,6 +2173,12 @@ public class MainActivity extends AppCompatActivity {
}
private void loadNotificationsAndShowDialog() {
if (useLocalMode) {
Toast.makeText(MainActivity.this,
"本地模式暂不支持通知中心,请切换到网络模式使用。",
Toast.LENGTH_SHORT).show();
return;
}
final String userId = currentUserId;
if (userId == null) return;
progressBar.setVisibility(View.VISIBLE);
@ -2387,63 +2405,55 @@ public class MainActivity extends AppCompatActivity {
} finally {
if (conn != null) conn.disconnect();
}
sb.append("\n");
}
}
}).start();
}
final EditText input = new EditText(MainActivity.this);
input.setHint("输入图书ID用于添加或取消收藏");
private void removeFavoriteOnServer(final String bookId) {
final String userId = currentUserId;
if (userId == null) return;
progressBar.setVisibility(View.VISIBLE);
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("我的收藏(本地)");
builder.setMessage(sb.length() > 0 ? sb.toString() : "暂无收藏");
builder.setView(input);
builder.setPositiveButton("添加收藏", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String bookId = input.getText().toString().trim();
if (!bookId.isEmpty()) {
addFavoriteLocal(bookId);
}
}
});
builder.setNeutralButton("取消收藏", new DialogInterface.OnClickListener() {
new Thread(new Runnable() {
@Override
public void onClick(DialogInterface dialog, int which) {
String bookId = input.getText().toString().trim();
if (!bookId.isEmpty()) {
removeFavoriteLocal(bookId);
}
}
});
builder.setNegativeButton("关闭", null);
builder.show();
}
public void run() {
HttpURLConnection conn = null;
try {
URL url = new URL(baseUrl + "/api/favorites?userId=" + userId + "&bookId=" + bookId);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("DELETE");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
private void addFavoriteLocal(final String bookId) {
if (dataManager == null) {
Toast.makeText(MainActivity.this, "本地数据未初始化", Toast.LENGTH_SHORT).show();
return;
}
if (currentUserId == null) {
Toast.makeText(MainActivity.this, "请先登录", Toast.LENGTH_SHORT).show();
return;
}
dataManager.addFavorite(currentUserId, bookId);
Toast.makeText(MainActivity.this, "收藏成功(本地)", Toast.LENGTH_SHORT).show();
}
final JSONObject json = readJson(conn);
final boolean success = json.optBoolean("success", false);
final String message = json.optString("message", "");
private void removeFavoriteLocal(final String bookId) {
if (dataManager == null) {
Toast.makeText(MainActivity.this, "本地数据未初始化", Toast.LENGTH_SHORT).show();
return;
}
if (currentUserId == null) {
Toast.makeText(MainActivity.this, "请先登录", Toast.LENGTH_SHORT).show();
return;
}
dataManager.removeFavorite(currentUserId, bookId);
Toast.makeText(MainActivity.this, "取消收藏成功(本地)", Toast.LENGTH_SHORT).show();
runOnUiThread(new Runnable() {
@Override
public void run() {
progressBar.setVisibility(View.GONE);
Toast.makeText(MainActivity.this,
message != null && !message.isEmpty() ? message : (success ? "取消收藏成功" : "取消收藏失败"),
Toast.LENGTH_SHORT).show();
}
});
} catch (Exception e) {
final String err = e.getMessage();
runOnUiThread(new Runnable() {
@Override
public void run() {
progressBar.setVisibility(View.GONE);
Toast.makeText(MainActivity.this,
"取消收藏失败: " + err,
Toast.LENGTH_SHORT).show();
}
});
} finally {
if (conn != null) conn.disconnect();
}
}
}).start();
}
private void loadNotesAndShowDialog() {
@ -2514,28 +2524,37 @@ public class MainActivity extends AppCompatActivity {
public void onClick(DialogInterface dialog, int which) {
showDeleteNoteDialog();
}
});
builder.setNegativeButton("关闭", null);
builder.show();
}
});
} catch (final Exception e) {
final String err = e.getMessage();
runOnUiThread(new Runnable() {
@Override
public void run() {
progressBar.setVisibility(View.GONE);
Toast.makeText(MainActivity.this,
"加载笔记失败: " + err,
Toast.LENGTH_SHORT).show();
}
});
} finally {
if (conn != null) conn.disconnect();
}
}
}).start();
}
private void loadNotesAndShowDialog() {
private void showAddNoteDialog() {
final String userId = currentUserId;
if (userId == null) return;
if (useLocalMode) {
loadNotesAndShowDialogLocal();
if (userId == null) {
Toast.makeText(MainActivity.this, "请先登录", Toast.LENGTH_SHORT).show();
return;
}
progressBar.setVisibility(View.VISIBLE);
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection conn = null;
try {
URL url = new URL(baseUrl + "/api/notes?userId=" + userId);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
final LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setPadding(50, 20, 50, 0);
@ -2726,6 +2745,12 @@ public class MainActivity extends AppCompatActivity {
}
private void showCommentsBookIdInputDialog() {
if (useLocalMode) {
Toast.makeText(MainActivity.this,
"本地模式暂不支持图书评论功能,请切换到网络模式使用。",
Toast.LENGTH_SHORT).show();
return;
}
final EditText input = new EditText(this);
input.setHint("输入要查看的图书ID");
@ -2746,6 +2771,12 @@ public class MainActivity extends AppCompatActivity {
}
private void loadCommentsAndShowDialog(final String bookId) {
if (useLocalMode) {
Toast.makeText(MainActivity.this,
"本地模式暂不支持图书评论功能,请切换到网络模式使用。",
Toast.LENGTH_SHORT).show();
return;
}
progressBar.setVisibility(View.VISIBLE);
new Thread(new Runnable() {
@ -2866,6 +2897,12 @@ public class MainActivity extends AppCompatActivity {
}
private void addCommentOnServer(final String userId, final String bookId, final String content, final int rating) {
if (useLocalMode) {
Toast.makeText(MainActivity.this,
"本地模式暂不支持图书评论功能,请切换到网络模式使用。",
Toast.LENGTH_SHORT).show();
return;
}
progressBar.setVisibility(View.VISIBLE);
new Thread(new Runnable() {
@ -2921,6 +2958,12 @@ public class MainActivity extends AppCompatActivity {
}
private void loadFeedbackAndShowDialog() {
if (useLocalMode) {
Toast.makeText(MainActivity.this,
"本地模式暂不支持意见反馈列表,请切换到网络模式使用。",
Toast.LENGTH_SHORT).show();
return;
}
final String userId = currentUserId;
if (userId == null) return;
progressBar.setVisibility(View.VISIBLE);
@ -3055,6 +3098,12 @@ public class MainActivity extends AppCompatActivity {
private void submitFeedbackOnServer(final String userId, final String type,
final String title, final String content, final String contact) {
if (useLocalMode) {
Toast.makeText(MainActivity.this,
"本地模式暂不支持意见反馈提交,请切换到网络模式使用。",
Toast.LENGTH_SHORT).show();
return;
}
progressBar.setVisibility(View.VISIBLE);
new Thread(new Runnable() {
@ -3111,6 +3160,12 @@ public class MainActivity extends AppCompatActivity {
}
private void loadStatsAndShowDialog() {
if (useLocalMode) {
Toast.makeText(MainActivity.this,
"本地模式暂不支持服务器统计概览,请切换到网络模式使用。",
Toast.LENGTH_SHORT).show();
return;
}
progressBar.setVisibility(View.VISIBLE);
new Thread(new Runnable() {
@ -3187,6 +3242,12 @@ public class MainActivity extends AppCompatActivity {
}
private void loadAiAnalysisAndShowDialog() {
if (useLocalMode) {
Toast.makeText(MainActivity.this,
"本地模式暂不支持服务器 AI 阅读分析,请切换到网络模式使用。",
Toast.LENGTH_SHORT).show();
return;
}
progressBar.setVisibility(View.VISIBLE);
new Thread(new Runnable() {
@ -3240,6 +3301,12 @@ public class MainActivity extends AppCompatActivity {
}
private void loadSystemStatusAndShowDialog() {
if (useLocalMode) {
Toast.makeText(MainActivity.this,
"本地模式暂不支持服务器系统状态查询,请切换到网络模式使用。",
Toast.LENGTH_SHORT).show();
return;
}
progressBar.setVisibility(View.VISIBLE);
new Thread(new Runnable() {
@ -3303,6 +3370,12 @@ public class MainActivity extends AppCompatActivity {
}
private void showAiAssistant() {
if (useLocalMode) {
Toast.makeText(MainActivity.this,
"本地模式下请使用增强 AI 助手界面,或切换到网络模式使用服务器 AI。",
Toast.LENGTH_LONG).show();
return;
}
final LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setPadding(50, 20, 50, 0);
@ -3334,6 +3407,12 @@ public class MainActivity extends AppCompatActivity {
}
private void callAiBackend(final String question) {
if (useLocalMode) {
Toast.makeText(MainActivity.this,
"本地模式暂不支持服务器 AI 助手,请切换到网络模式使用,或使用本地增强 AI 助手。",
Toast.LENGTH_SHORT).show();
return;
}
progressBar.setVisibility(View.VISIBLE);
new Thread(new Runnable() {

@ -183,13 +183,7 @@ public class UMLViewerActivity extends AppCompatActivity {
saveButton.setEnabled(false);
dialogLayout.addView(saveButton);
final Button openButton = new Button(this);
openButton.setText("用系统查看器打开");
openButton.setEnabled(false);
dialogLayout.addView(openButton);
final byte[][] imageDataHolder = new byte[1][];
final File[] savedFileHolder = new File[1];
androidx.appcompat.app.AlertDialog.Builder builder =
new androidx.appcompat.app.AlertDialog.Builder(this);
@ -236,10 +230,9 @@ public class UMLViewerActivity extends AppCompatActivity {
public void run() {
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
statusView.setText("加载完成,可保存或用系统查看器查看。");
statusView.setText("加载完成,可在应用内查看或保存到本地。");
imageDataHolder[0] = data;
saveButton.setEnabled(true);
openButton.setEnabled(true);
} else {
statusView.setText("加载失败:图片数据无效。");
}
@ -282,7 +275,6 @@ public class UMLViewerActivity extends AppCompatActivity {
fos = new FileOutputStream(outFile);
fos.write(data);
fos.flush();
savedFileHolder[0] = outFile;
Toast.makeText(UMLViewerActivity.this,
"已保存到: " + outFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
} catch (IOException e) {
@ -297,57 +289,6 @@ public class UMLViewerActivity extends AppCompatActivity {
}
}
});
openButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
byte[] data = imageDataHolder[0];
if (data == null) {
Toast.makeText(UMLViewerActivity.this, "图片尚未加载完成", Toast.LENGTH_SHORT).show();
return;
}
File file = savedFileHolder[0];
if (file == null) {
File cacheDir = getExternalCacheDir();
if (cacheDir == null) {
Toast.makeText(UMLViewerActivity.this, "无法访问缓存目录", Toast.LENGTH_SHORT).show();
return;
}
if (!cacheDir.exists()) {
cacheDir.mkdirs();
}
file = new File(cacheDir, "uml_preview.png");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
fos.write(data);
fos.flush();
savedFileHolder[0] = file;
} catch (IOException e) {
Toast.makeText(UMLViewerActivity.this, "写入缓存失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
return;
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException ignored) {
}
}
}
}
try {
Uri uri = FileProvider.getUriForFile(UMLViewerActivity.this,
getPackageName() + ".fileprovider", file);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "image/png");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
} catch (Exception e) {
Toast.makeText(UMLViewerActivity.this, "无法打开图片查看器", Toast.LENGTH_SHORT).show();
}
}
});
}
/**

Loading…
Cancel
Save