Compare commits
8 Commits
gallery-v1
...
gallery-v1
| Author | SHA1 | Date | |
|---|---|---|---|
| c2618672bb | |||
| 6d9bd175f6 | |||
| ffbecaa31d | |||
| e26df437c5 | |||
| 248fd9d8d8 | |||
| 5b631710a9 | |||
| cda85feddd | |||
| ecad4a7913 |
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Sat Apr 25 05:49:42 HKT 2026
|
#Sat Apr 25 20:05:35 HKT 2026
|
||||||
stageCount=1
|
stageCount=4
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.0
|
baseVersion=15.0
|
||||||
publishVersion=15.0.0
|
publishVersion=15.0.3
|
||||||
buildCount=0
|
buildCount=0
|
||||||
baseBetaVersion=15.0.1
|
baseBetaVersion=15.0.4
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ public class AlbumActivity extends AppCompatActivity {
|
|||||||
recyclerView = findViewById(R.id.recycler_view);
|
recyclerView = findViewById(R.id.recycler_view);
|
||||||
recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
|
recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
|
||||||
adapter = new ImageAdapter();
|
adapter = new ImageAdapter();
|
||||||
|
adapter.setContext(this);
|
||||||
recyclerView.setAdapter(adapter);
|
recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
adapter.setOnImageClickListener(new OnImageClickListener() {
|
adapter.setOnImageClickListener(new OnImageClickListener() {
|
||||||
@@ -149,5 +150,8 @@ public class AlbumActivity extends AppCompatActivity {
|
|||||||
if (checkPermission()) {
|
if (checkPermission()) {
|
||||||
loadImages();
|
loadImages();
|
||||||
}
|
}
|
||||||
|
if (adapter != null) {
|
||||||
|
adapter.refreshBg();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -20,6 +20,21 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
|
|||||||
public static final String TAG = "AlbumAdapter";
|
public static final String TAG = "AlbumAdapter";
|
||||||
private ArrayList<Album> albums = new ArrayList<>();
|
private ArrayList<Album> albums = new ArrayList<>();
|
||||||
private OnAlbumClickListener listener;
|
private OnAlbumClickListener listener;
|
||||||
|
private Preferences prefs;
|
||||||
|
private int bgType = 0;
|
||||||
|
|
||||||
|
private int getBgRes() {
|
||||||
|
switch (bgType) {
|
||||||
|
case 0:
|
||||||
|
return R.drawable.bg_checkerboard;
|
||||||
|
case 1:
|
||||||
|
return R.drawable.bg_white;
|
||||||
|
case 2:
|
||||||
|
return R.drawable.bg_black;
|
||||||
|
default:
|
||||||
|
return R.drawable.bg_checkerboard;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public interface OnAlbumClickListener {
|
public interface OnAlbumClickListener {
|
||||||
void onAlbumClick(Album album);
|
void onAlbumClick(Album album);
|
||||||
@@ -34,6 +49,18 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
|
|||||||
LogUtils.d(TAG, "setData: " + albums.size() + " albums");
|
LogUtils.d(TAG, "setData: " + albums.size() + " albums");
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setContext(android.content.Context context) {
|
||||||
|
prefs = new Preferences(context);
|
||||||
|
bgType = prefs.getBgType();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void refreshBg() {
|
||||||
|
if (prefs != null) {
|
||||||
|
bgType = prefs.getBgType();
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
@@ -48,6 +75,8 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
|
|||||||
final Album album = albums.get(position);
|
final Album album = albums.get(position);
|
||||||
LogUtils.d(TAG, "bind: " + album.getName() + ", cover=" + album.getCoverUri());
|
LogUtils.d(TAG, "bind: " + album.getName() + ", cover=" + album.getCoverUri());
|
||||||
|
|
||||||
|
holder.coverImage.setBackgroundResource(getBgRes());
|
||||||
|
|
||||||
holder.albumName.setText(album.getName());
|
holder.albumName.setText(album.getName());
|
||||||
holder.imageCount.setText(album.getImageCount() + " photos");
|
holder.imageCount.setText(album.getImageCount() + " photos");
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,21 @@ public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ViewHolder>
|
|||||||
private ArrayList<Uri> imageUrls = new ArrayList<>();
|
private ArrayList<Uri> imageUrls = new ArrayList<>();
|
||||||
private ArrayList<String> imagePaths = new ArrayList<>();
|
private ArrayList<String> imagePaths = new ArrayList<>();
|
||||||
private OnImageClickListener listener;
|
private OnImageClickListener listener;
|
||||||
|
private int bgType = 0;
|
||||||
|
private Preferences prefs;
|
||||||
|
|
||||||
|
private int getBgRes() {
|
||||||
|
switch (bgType) {
|
||||||
|
case 0:
|
||||||
|
return R.drawable.bg_checkerboard;
|
||||||
|
case 1:
|
||||||
|
return R.drawable.bg_white;
|
||||||
|
case 2:
|
||||||
|
return R.drawable.bg_black;
|
||||||
|
default:
|
||||||
|
return R.drawable.bg_checkerboard;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public interface OnImageClickListener {
|
public interface OnImageClickListener {
|
||||||
void onImageClick(int position, ArrayList<Uri> urls, ArrayList<String> paths);
|
void onImageClick(int position, ArrayList<Uri> urls, ArrayList<String> paths);
|
||||||
@@ -33,6 +48,18 @@ public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ViewHolder>
|
|||||||
LogUtils.d(TAG, "setData: " + urls.size() + " images");
|
LogUtils.d(TAG, "setData: " + urls.size() + " images");
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setContext(android.content.Context context) {
|
||||||
|
prefs = new Preferences(context);
|
||||||
|
bgType = prefs.getBgType();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void refreshBg() {
|
||||||
|
if (prefs != null) {
|
||||||
|
bgType = prefs.getBgType();
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
@@ -44,6 +71,8 @@ public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ViewHolder>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
|
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
|
||||||
|
holder.imageView.setBackgroundResource(getBgRes());
|
||||||
|
|
||||||
Glide.with(holder.imageView.getContext())
|
Glide.with(holder.imageView.getContext())
|
||||||
.load(imageUrls.get(position))
|
.load(imageUrls.get(position))
|
||||||
.centerCrop()
|
.centerCrop()
|
||||||
|
|||||||
@@ -16,10 +16,25 @@ import cc.winboll.studio.libappbase.LogUtils;
|
|||||||
public class ImagePagerAdapter extends PagerAdapter {
|
public class ImagePagerAdapter extends PagerAdapter {
|
||||||
public static final String TAG = "ImagePagerAdapter";
|
public static final String TAG = "ImagePagerAdapter";
|
||||||
private ArrayList<Uri> imageUrls;
|
private ArrayList<Uri> imageUrls;
|
||||||
|
private int bgType;
|
||||||
|
|
||||||
public ImagePagerAdapter(ArrayList<Uri> imageUrls) {
|
public ImagePagerAdapter(ArrayList<Uri> imageUrls, int bgType) {
|
||||||
this.imageUrls = imageUrls;
|
this.imageUrls = imageUrls;
|
||||||
LogUtils.d(TAG, "ImagePagerAdapter created with " + imageUrls.size() + " images");
|
this.bgType = bgType;
|
||||||
|
LogUtils.d(TAG, "ImagePagerAdapter created with " + imageUrls.size() + " images, bgType=" + bgType);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getBgRes() {
|
||||||
|
switch (bgType) {
|
||||||
|
case 0:
|
||||||
|
return R.drawable.bg_checkerboard;
|
||||||
|
case 1:
|
||||||
|
return R.drawable.bg_white;
|
||||||
|
case 2:
|
||||||
|
return R.drawable.bg_black;
|
||||||
|
default:
|
||||||
|
return R.drawable.bg_checkerboard;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -32,6 +47,7 @@ public class ImagePagerAdapter extends PagerAdapter {
|
|||||||
public Object instantiateItem(@NonNull ViewGroup container, int position) {
|
public Object instantiateItem(@NonNull ViewGroup container, int position) {
|
||||||
View view = LayoutInflater.from(container.getContext())
|
View view = LayoutInflater.from(container.getContext())
|
||||||
.inflate(R.layout.item_image_pager, container, false);
|
.inflate(R.layout.item_image_pager, container, false);
|
||||||
|
view.setBackgroundResource(getBgRes());
|
||||||
ImageView imageView = view.findViewById(R.id.image);
|
ImageView imageView = view.findViewById(R.id.image);
|
||||||
|
|
||||||
Glide.with(imageView.getContext())
|
Glide.with(imageView.getContext())
|
||||||
|
|||||||
@@ -32,8 +32,12 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
|
|||||||
private ImageButton btnBack;
|
private ImageButton btnBack;
|
||||||
private ImageButton btnDelete;
|
private ImageButton btnDelete;
|
||||||
private ImageButton btnShare;
|
private ImageButton btnShare;
|
||||||
|
private ImageButton btnInfo;
|
||||||
|
private ImageButton btnBg;
|
||||||
|
private int bgType = 0;
|
||||||
private GestureDetector gestureDetector;
|
private GestureDetector gestureDetector;
|
||||||
private TrashManager trashManager;
|
private TrashManager trashManager;
|
||||||
|
private Preferences prefs;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
@@ -48,14 +52,20 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
|
|||||||
currentPosition = getIntent().getIntExtra(EXTRA_POSITION, 0);
|
currentPosition = getIntent().getIntExtra(EXTRA_POSITION, 0);
|
||||||
|
|
||||||
trashManager = new TrashManager(this);
|
trashManager = new TrashManager(this);
|
||||||
|
prefs = new Preferences(this);
|
||||||
|
bgType = prefs.getBgType();
|
||||||
|
|
||||||
viewPager = findViewById(R.id.view_pager);
|
viewPager = findViewById(R.id.view_pager);
|
||||||
toolbar = findViewById(R.id.toolbar);
|
toolbar = findViewById(R.id.toolbar);
|
||||||
btnBack = findViewById(R.id.btn_back);
|
btnBack = findViewById(R.id.btn_back);
|
||||||
btnDelete = findViewById(R.id.btn_delete);
|
btnDelete = findViewById(R.id.btn_delete);
|
||||||
btnShare = findViewById(R.id.btn_share);
|
btnShare = findViewById(R.id.btn_share);
|
||||||
|
btnInfo = findViewById(R.id.btn_info);
|
||||||
|
btnBg = findViewById(R.id.btn_bg);
|
||||||
|
|
||||||
ImagePagerAdapter adapter = new ImagePagerAdapter(imageUrls);
|
applyBg();
|
||||||
|
|
||||||
|
ImagePagerAdapter adapter = new ImagePagerAdapter(imageUrls, bgType);
|
||||||
viewPager.setAdapter(adapter);
|
viewPager.setAdapter(adapter);
|
||||||
viewPager.setCurrentItem(currentPosition);
|
viewPager.setCurrentItem(currentPosition);
|
||||||
viewPager.addOnPageChangeListener(this);
|
viewPager.addOnPageChangeListener(this);
|
||||||
@@ -95,6 +105,20 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
|
|||||||
shareCurrentImage();
|
shareCurrentImage();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
btnInfo.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
showImageInfo();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
btnBg.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
switchBg();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toggleToolbar() {
|
private void toggleToolbar() {
|
||||||
@@ -105,6 +129,52 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void applyBg() {
|
||||||
|
int bgRes;
|
||||||
|
switch (bgType) {
|
||||||
|
case 0:
|
||||||
|
bgRes = R.drawable.bg_checkerboard;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
bgRes = R.drawable.bg_white;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
bgRes = R.drawable.bg_black;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
bgRes = R.drawable.bg_checkerboard;
|
||||||
|
}
|
||||||
|
View container = findViewById(R.id.container);
|
||||||
|
if (container != null) {
|
||||||
|
container.setBackgroundResource(bgRes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void switchBg() {
|
||||||
|
final String[] bgNames = {"灰白相间", "全白", "全黑"};
|
||||||
|
final int[] bgResources = {R.drawable.bg_checkerboard, R.drawable.bg_white, R.drawable.bg_black};
|
||||||
|
|
||||||
|
new AlertDialog.Builder(this)
|
||||||
|
.setTitle("选择背景")
|
||||||
|
.setSingleChoiceItems(bgNames, bgType, new android.content.DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(android.content.DialogInterface dialog, int which) {
|
||||||
|
bgType = which;
|
||||||
|
prefs.setBgType(which);
|
||||||
|
int currentItem = viewPager.getCurrentItem();
|
||||||
|
View container = findViewById(R.id.container);
|
||||||
|
if (container != null) {
|
||||||
|
container.setBackgroundResource(bgResources[which]);
|
||||||
|
}
|
||||||
|
viewPager.setAdapter(new ImagePagerAdapter(imageUrls, bgType));
|
||||||
|
viewPager.setCurrentItem(currentItem);
|
||||||
|
dialog.dismiss();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setNegativeButton("取消", null)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
|
||||||
private void showDeleteDialog() {
|
private void showDeleteDialog() {
|
||||||
new AlertDialog.Builder(this)
|
new AlertDialog.Builder(this)
|
||||||
.setMessage("Delete to trash?")
|
.setMessage("Delete to trash?")
|
||||||
@@ -169,7 +239,7 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
|
|||||||
if (currentPosition >= imageUrls.size()) {
|
if (currentPosition >= imageUrls.size()) {
|
||||||
currentPosition = imageUrls.size() - 1;
|
currentPosition = imageUrls.size() - 1;
|
||||||
}
|
}
|
||||||
viewPager.setAdapter(new ImagePagerAdapter(imageUrls));
|
viewPager.setAdapter(new ImagePagerAdapter(imageUrls, bgType));
|
||||||
viewPager.setCurrentItem(currentPosition);
|
viewPager.setCurrentItem(currentPosition);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -201,6 +271,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
|
@Override
|
||||||
public void onPageSelected(int position) {
|
public void onPageSelected(int position) {
|
||||||
currentPosition = position;
|
currentPosition = position;
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
recyclerView = findViewById(R.id.recycler_view);
|
recyclerView = findViewById(R.id.recycler_view);
|
||||||
recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
|
recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
|
||||||
adapter = new AlbumAdapter();
|
adapter = new AlbumAdapter();
|
||||||
|
adapter.setContext(this);
|
||||||
recyclerView.setAdapter(adapter);
|
recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
adapter.setOnAlbumClickListener(new OnAlbumClickListener() {
|
adapter.setOnAlbumClickListener(new OnAlbumClickListener() {
|
||||||
@@ -138,9 +139,9 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
LogUtils.d(TAG, "baseFolder: " + baseFolder.getAbsolutePath() + ", exists=" + baseFolder.exists());
|
LogUtils.d(TAG, "baseFolder: " + baseFolder.getAbsolutePath() + ", exists=" + baseFolder.exists());
|
||||||
|
|
||||||
if (!baseFolder.exists() || !baseFolder.isDirectory()) {
|
if (!baseFolder.exists() || !baseFolder.isDirectory()) {
|
||||||
folderPath = Environment.getExternalStorageDirectory() + "/DCIM";
|
folderPath = Preferences.getDefaultPath();
|
||||||
baseFolder = new File(folderPath);
|
baseFolder = new File(folderPath);
|
||||||
LogUtils.d(TAG, "try DCIM: " + baseFolder.getAbsolutePath() + ", exists=" + baseFolder.exists());
|
LogUtils.d(TAG, "try default: " + baseFolder.getAbsolutePath() + ", exists=" + baseFolder.exists());
|
||||||
if (!baseFolder.exists()) {
|
if (!baseFolder.exists()) {
|
||||||
folderPath = Environment.getExternalStorageDirectory() + "/Pictures";
|
folderPath = Environment.getExternalStorageDirectory() + "/Pictures";
|
||||||
baseFolder = new File(folderPath);
|
baseFolder = new File(folderPath);
|
||||||
@@ -244,6 +245,9 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
scanMediaStore();
|
scanMediaStore();
|
||||||
loadAlbums();
|
loadAlbums();
|
||||||
}
|
}
|
||||||
|
if (adapter != null) {
|
||||||
|
adapter.refreshBg();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void scanMediaStore() {
|
private void scanMediaStore() {
|
||||||
|
|||||||
@@ -8,7 +8,9 @@ public class Preferences {
|
|||||||
public static final String TAG = "Preferences";
|
public static final String TAG = "Preferences";
|
||||||
private static final String PREF_NAME = "gallery_prefs";
|
private static final String PREF_NAME = "gallery_prefs";
|
||||||
private static final String KEY_FOLDER_PATH = "folder_path";
|
private static final String KEY_FOLDER_PATH = "folder_path";
|
||||||
private static final String DEFAULT_PATH = "/storage/emulated/0/DCIM";
|
private static final String KEY_BG_TYPE = "bg_type";
|
||||||
|
private static final int DEFAULT_BG_TYPE = 0;
|
||||||
|
private static final String DEFAULT_PATH = "/storage/emulated/0/Pictures/Gallery/owner";
|
||||||
|
|
||||||
public static String getDefaultPath() {
|
public static String getDefaultPath() {
|
||||||
return DEFAULT_PATH;
|
return DEFAULT_PATH;
|
||||||
@@ -30,4 +32,13 @@ public class Preferences {
|
|||||||
LogUtils.d(TAG, "setFolderPath: " + path);
|
LogUtils.d(TAG, "setFolderPath: " + path);
|
||||||
prefs.edit().putString(KEY_FOLDER_PATH, path).apply();
|
prefs.edit().putString(KEY_FOLDER_PATH, path).apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getBgType() {
|
||||||
|
return prefs.getInt(KEY_BG_TYPE, DEFAULT_BG_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBgType(int type) {
|
||||||
|
LogUtils.d(TAG, "setBgType: " + type);
|
||||||
|
prefs.edit().putInt(KEY_BG_TYPE, type).apply();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
5
gallery/src/main/res/drawable/bg_black.xml
Normal file
5
gallery/src/main/res/drawable/bg_black.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<solid android:color="#000000"/>
|
||||||
|
</shape>
|
||||||
30
gallery/src/main/res/drawable/bg_checkerboard.xml
Normal file
30
gallery/src/main/res/drawable/bg_checkerboard.xml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="10dp"
|
||||||
|
android:height="10dp"
|
||||||
|
android:viewportWidth="10"
|
||||||
|
android:viewportHeight="10">
|
||||||
|
<path
|
||||||
|
android:fillColor="#808080"
|
||||||
|
android:pathData="M0,0h1v1h-1z M2,0h1v1h-1z M4,0h1v1h-1z M6,0h1v1h-1z M8,0h1v1h-1z
|
||||||
|
M1,1h1v1h-1z M3,1h1v1h-1z M5,1h1v1h-1z M7,1h1v1h-1z M9,1h1v1h-1z
|
||||||
|
M0,2h1v1h-1z M2,2h1v1h-1z M4,2h1v1h-1z M6,2h1v1h-1z M8,2h1v1h-1z
|
||||||
|
M1,3h1v1h-1z M3,3h1v1h-1z M5,3h1v1h-1z M7,3h1v1h-1z M9,3h1v1h-1z
|
||||||
|
M0,4h1v1h-1z M2,4h1v1h-1z M4,4h1v1h-1z M6,4h1v1h-1z M8,4h1v1h-1z
|
||||||
|
M1,5h1v1h-1z M3,5h1v1h-1z M5,5h1v1h-1z M7,5h1v1h-1z M9,5h1v1h-1z
|
||||||
|
M0,6h1v1h-1z M2,6h1v1h-1z M4,6h1v1h-1z M6,6h1v1h-1z M8,6h1v1h-1z
|
||||||
|
M1,7h1v1h-1z M3,7h1v1h-1z M5,7h1v1h-1z M7,7h1v1h-1z M9,7h1v1h-1z
|
||||||
|
M0,8h1v1h-1z M2,8h1v1h-1z M4,8h1v1h-1z M6,8h1v1h-1z M8,8h1v1h-1z
|
||||||
|
M1,9h1v1h-1z M3,9h1v1h-1z M5,9h1v1h-1z M7,9h1v1h-1z M9,9h1v1h-1z"/>
|
||||||
|
<path
|
||||||
|
android:fillColor="#FFFFFF"
|
||||||
|
android:pathData="M1,0h1v1h-1z M3,0h1v1h-1z M5,0h1v1h-1z M7,0h1v1h-1z M9,0h1v1h-1z
|
||||||
|
M0,1h1v1h-1z M2,1h1v1h-1z M4,1h1v1h-1z M6,1h1v1h-1z M8,1h1v1h-1z
|
||||||
|
M1,2h1v1h-1z M3,2h1v1h-1z M5,2h1v1h-1z M7,2h1v1h-1z M9,2h1v1h-1z
|
||||||
|
M0,3h1v1h-1z M2,3h1v1h-1z M4,3h1v1h-1z M6,3h1v1h-1z M8,3h1v1h-1z
|
||||||
|
M1,4h1v1h-1z M3,4h1v1h-1z M5,4h1v1h-1z M7,4h1v1h-1z M9,4h1v1h-1z
|
||||||
|
M0,5h1v1h-1z M2,5h1v1h-1z M4,5h1v1h-1z M6,5h1v1h-1z M8,5h1v1h-1z
|
||||||
|
M1,6h1v1h-1z M3,6h1v1h-1z M5,6h1v1h-1z M7,6h1v1h-1z M9,6h1v1h-1z
|
||||||
|
M0,7h1v1h-1z M2,7h1v1h-1z M4,7h1v1h-1z M6,7h1v1h-1z M8,7h1v1h-1z
|
||||||
|
M1,8h1v1h-1z M3,8h1v1h-1z M5,8h1v1h-1z M7,8h1v1h-1z M9,8h1v1h-1z
|
||||||
|
M0,9h1v1h-1z M2,9h1v1h-1z M4,9h1v1h-1z M6,9h1v1h-1z M8,9h1v1h-1z"/>
|
||||||
|
</vector>
|
||||||
5
gallery/src/main/res/drawable/bg_white.xml
Normal file
5
gallery/src/main/res/drawable/bg_white.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<solid android:color="#FFFFFF"/>
|
||||||
|
</shape>
|
||||||
12
gallery/src/main/res/drawable/ic_bg.xml
Normal file
12
gallery/src/main/res/drawable/ic_bg.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FFFFFF"
|
||||||
|
android:pathData="M4,4h7v7h-7z M13,4h7v7h-7z M4,13h7v7h-7z M13,13h7v7h-7z"/>
|
||||||
|
<path
|
||||||
|
android:fillColor="#808080"
|
||||||
|
android:pathData="M11,4h2v7h-2z M4,11h7v2h-7z M13,11h7v2h-7z M11,13h2v7h-2z M13,4h2v7h-2z M4,13h7v2h-7z"/>
|
||||||
|
</vector>
|
||||||
9
gallery/src/main/res/drawable/ic_info.xml
Normal file
9
gallery/src/main/res/drawable/ic_info.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FFFFFF"
|
||||||
|
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z"/>
|
||||||
|
</vector>
|
||||||
@@ -44,6 +44,22 @@
|
|||||||
android:src="@drawable/ic_share"
|
android:src="@drawable/ic_share"
|
||||||
android:contentDescription="Share"/>
|
android:contentDescription="Share"/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/btn_info"
|
||||||
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:src="@drawable/ic_info"
|
||||||
|
android:contentDescription="Info"/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/btn_bg"
|
||||||
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:src="@drawable/ic_bg"
|
||||||
|
android:contentDescription="Background"/>
|
||||||
|
|
||||||
<ImageButton
|
<ImageButton
|
||||||
android:id="@+id/btn_delete"
|
android:id="@+id/btn_delete"
|
||||||
android:layout_width="48dp"
|
android:layout_width="48dp"
|
||||||
|
|||||||
@@ -2,8 +2,7 @@
|
|||||||
<FrameLayout
|
<FrameLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent">
|
||||||
android:background="@color/black">
|
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/image"
|
android:id="@+id/image"
|
||||||
|
|||||||
Reference in New Issue
Block a user