diff --git a/gallery/build.properties b/gallery/build.properties
index eee0e01..d316f57 100644
--- a/gallery/build.properties
+++ b/gallery/build.properties
@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
-#Sat Apr 25 05:59:24 HKT 2026
+#Sat Apr 25 06:37:38 CST 2026
stageCount=2
libraryProject=
baseVersion=15.0
publishVersion=15.0.1
-buildCount=0
+buildCount=5
baseBetaVersion=15.0.2
diff --git a/gallery/src/main/java/cc/winboll/studio/gallery/ImageViewerActivity.java b/gallery/src/main/java/cc/winboll/studio/gallery/ImageViewerActivity.java
index 445be56..13208a5 100644
--- a/gallery/src/main/java/cc/winboll/studio/gallery/ImageViewerActivity.java
+++ b/gallery/src/main/java/cc/winboll/studio/gallery/ImageViewerActivity.java
@@ -32,6 +32,7 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
private ImageButton btnBack;
private ImageButton btnDelete;
private ImageButton btnShare;
+ private ImageButton btnInfo;
private GestureDetector gestureDetector;
private TrashManager trashManager;
@@ -54,6 +55,7 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
btnBack = findViewById(R.id.btn_back);
btnDelete = findViewById(R.id.btn_delete);
btnShare = findViewById(R.id.btn_share);
+ btnInfo = findViewById(R.id.btn_info);
ImagePagerAdapter adapter = new ImagePagerAdapter(imageUrls);
viewPager.setAdapter(adapter);
@@ -95,6 +97,13 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
shareCurrentImage();
}
});
+
+ btnInfo.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showImageInfo();
+ }
+ });
}
private void toggleToolbar() {
@@ -201,6 +210,155 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
}
}
+ private void showImageInfo() {
+ if (currentPosition < 0 || currentPosition >= imageUrls.size()) {
+ return;
+ }
+
+ String imagePath = "";
+ if (imagePaths != null && currentPosition < imagePaths.size()) {
+ imagePath = imagePaths.get(currentPosition);
+ } else {
+ imagePath = getPathFromUri(imageUrls.get(currentPosition));
+ }
+
+ File imageFile = new File(imagePath);
+ if (!imageFile.exists()) {
+ imageFile = new File(imagePath);
+ }
+
+ android.widget.LinearLayout layout = new android.widget.LinearLayout(this);
+ layout.setOrientation(android.widget.LinearLayout.VERTICAL);
+ layout.setPadding(48, 32, 48, 32);
+
+ android.widget.TextView labelPath = new android.widget.TextView(this);
+ labelPath.setText("Path:");
+ labelPath.setTextColor(getColor(android.R.color.darker_gray));
+ labelPath.setTextSize(14);
+ labelPath.setTypeface(null, android.graphics.Typeface.BOLD);
+ layout.addView(labelPath);
+
+ android.widget.TextView valuePath = new android.widget.TextView(this);
+ valuePath.setText(imagePath);
+ valuePath.setTextColor(getColor(android.R.color.black));
+ valuePath.setTextSize(14);
+ valuePath.setTextIsSelectable(true);
+ layout.addView(valuePath);
+
+ if (imageFile.exists()) {
+ long sizeBytes = imageFile.length();
+ String size;
+ if (sizeBytes < 1024) {
+ size = sizeBytes + " B";
+ } else if (sizeBytes < 1024 * 1024) {
+ size = String.format("%.2f KB", sizeBytes / 1024.0);
+ } else {
+ size = String.format("%.2f MB", sizeBytes / (1024.0 * 1024.0));
+ }
+
+ android.widget.TextView labelSize = new android.widget.TextView(this);
+ labelSize.setText("Size:");
+ labelSize.setTextColor(getColor(android.R.color.darker_gray));
+ labelSize.setTextSize(14);
+ labelSize.setTypeface(null, android.graphics.Typeface.BOLD);
+ layout.addView(labelSize);
+
+ android.widget.TextView valueSize = new android.widget.TextView(this);
+ valueSize.setText(size);
+ valueSize.setTextColor(getColor(android.R.color.black));
+ valueSize.setTextSize(14);
+ valueSize.setTextIsSelectable(true);
+ layout.addView(valueSize);
+ }
+
+ try {
+ android.graphics.BitmapFactory.Options options = new android.graphics.BitmapFactory.Options();
+ options.inJustDecodeBounds = true;
+ android.graphics.BitmapFactory.decodeFile(imagePath, options);
+ if (options.outWidth > 0 && options.outHeight > 0) {
+ android.widget.TextView labelPixels = new android.widget.TextView(this);
+ labelPixels.setText("Pixels:");
+ labelPixels.setTextColor(getColor(android.R.color.darker_gray));
+ labelPixels.setTextSize(14);
+ labelPixels.setTypeface(null, android.graphics.Typeface.BOLD);
+ layout.addView(labelPixels);
+
+ android.widget.TextView valuePixels = new android.widget.TextView(this);
+ valuePixels.setText(options.outWidth + " x " + options.outHeight);
+ valuePixels.setTextColor(getColor(android.R.color.black));
+ valuePixels.setTextSize(14);
+ valuePixels.setTextIsSelectable(true);
+ layout.addView(valuePixels);
+ }
+ } catch (Exception e) {
+ LogUtils.e(TAG, "get pixels error: " + e.getMessage());
+ }
+
+ try {
+ String[] projection = {
+ MediaStore.Images.Media.DATE_ADDED,
+ MediaStore.Images.Media.DATE_MODIFIED,
+ MediaStore.Images.Media.DATE_TAKEN
+ };
+ android.database.Cursor cursor = getContentResolver().query(
+ imageUrls.get(currentPosition), projection, null, null, null);
+ if (cursor != null) {
+ if (cursor.moveToFirst()) {
+ int dateAddedCol = cursor.getColumnIndex(MediaStore.Images.Media.DATE_ADDED);
+ int dateTakenCol = cursor.getColumnIndex(MediaStore.Images.Media.DATE_TAKEN);
+
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+ if (dateTakenCol >= 0) {
+ long dateTaken = cursor.getLong(dateTakenCol);
+ if (dateTaken > 0) {
+ android.widget.TextView labelTaken = new android.widget.TextView(this);
+ labelTaken.setText("Date Taken:");
+ labelTaken.setTextColor(getColor(android.R.color.darker_gray));
+ labelTaken.setTextSize(14);
+ labelTaken.setTypeface(null, android.graphics.Typeface.BOLD);
+ layout.addView(labelTaken);
+
+ android.widget.TextView valueTaken = new android.widget.TextView(this);
+ valueTaken.setText(sdf.format(new java.util.Date(dateTaken)));
+ valueTaken.setTextColor(getColor(android.R.color.black));
+ valueTaken.setTextSize(14);
+ valueTaken.setTextIsSelectable(true);
+ layout.addView(valueTaken);
+ }
+ }
+ if (dateAddedCol >= 0) {
+ long dateAdded = cursor.getLong(dateAddedCol);
+ if (dateAdded > 0) {
+ android.widget.TextView labelAdded = new android.widget.TextView(this);
+ labelAdded.setText("Date Added:");
+ labelAdded.setTextColor(getColor(android.R.color.darker_gray));
+ labelAdded.setTextSize(14);
+ labelAdded.setTypeface(null, android.graphics.Typeface.BOLD);
+ layout.addView(labelAdded);
+
+ android.widget.TextView valueAdded = new android.widget.TextView(this);
+ valueAdded.setText(sdf.format(new java.util.Date(dateAdded * 1000)));
+ valueAdded.setTextColor(getColor(android.R.color.black));
+ valueAdded.setTextSize(14);
+ valueAdded.setTextIsSelectable(true);
+ layout.addView(valueAdded);
+ }
+ }
+ }
+ cursor.close();
+ }
+ } catch (Exception e) {
+ LogUtils.e(TAG, "get date error: " + e.getMessage());
+ }
+
+ new AlertDialog.Builder(this)
+ .setTitle("Image Info")
+ .setView(layout)
+ .setPositiveButton("OK", null)
+ .show();
+ }
+
@Override
public void onPageSelected(int position) {
currentPosition = position;
diff --git a/gallery/src/main/res/drawable/ic_info.xml b/gallery/src/main/res/drawable/ic_info.xml
new file mode 100644
index 0000000..b49a72b
--- /dev/null
+++ b/gallery/src/main/res/drawable/ic_info.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/gallery/src/main/res/layout/activity_image_viewer.xml b/gallery/src/main/res/layout/activity_image_viewer.xml
index 3d7ef55..3e6971e 100644
--- a/gallery/src/main/res/layout/activity_image_viewer.xml
+++ b/gallery/src/main/res/layout/activity_image_viewer.xml
@@ -44,6 +44,14 @@
android:src="@drawable/ic_share"
android:contentDescription="Share"/>
+
+