diff --git a/app/src/main/java/com/simplemobiletools/gallery/Config.java b/app/src/main/java/com/simplemobiletools/gallery/Config.java
index 89530e046..9d7e98bda 100644
--- a/app/src/main/java/com/simplemobiletools/gallery/Config.java
+++ b/app/src/main/java/com/simplemobiletools/gallery/Config.java
@@ -29,4 +29,12 @@ public class Config {
public void setIsDarkTheme(boolean isDarkTheme) {
mPrefs.edit().putBoolean(Constants.IS_DARK_THEME, isDarkTheme).apply();
}
+
+ public int getSorting() {
+ return mPrefs.getInt(Constants.SORT_ORDER, Constants.SORT_BY_DATE | Constants.SORT_DESCENDING);
+ }
+
+ public void setSorting(int order) {
+ mPrefs.edit().putInt(Constants.SORT_ORDER, order).apply();
+ }
}
diff --git a/app/src/main/java/com/simplemobiletools/gallery/Constants.java b/app/src/main/java/com/simplemobiletools/gallery/Constants.java
index 9f99435bf..0b572fcc4 100644
--- a/app/src/main/java/com/simplemobiletools/gallery/Constants.java
+++ b/app/src/main/java/com/simplemobiletools/gallery/Constants.java
@@ -11,4 +11,12 @@ public class Constants {
public static final String PREFS_KEY = "Gallery";
public static final String IS_FIRST_RUN = "is_first_run";
public static final String IS_DARK_THEME = "is_dark_theme";
+ public static final String SORT_ORDER = "sort_order";
+
+ // sorting
+ public static final int SORT_BY_NAME = 1;
+ public static final int SORT_BY_DATE = 2;
+ public static final int SORT_BY_SIZE = 4;
+
+ public static final int SORT_DESCENDING = 1024;
}
diff --git a/app/src/main/java/com/simplemobiletools/gallery/activities/MainActivity.java b/app/src/main/java/com/simplemobiletools/gallery/activities/MainActivity.java
index 8d4bd8031..b7f6f0954 100644
--- a/app/src/main/java/com/simplemobiletools/gallery/activities/MainActivity.java
+++ b/app/src/main/java/com/simplemobiletools/gallery/activities/MainActivity.java
@@ -334,8 +334,8 @@ public class MainActivity extends SimpleActivity
final TextView dirPath = (TextView) renameDirView.findViewById(R.id.directory_path);
dirPath.setText(dir.getParent() + "/");
- builder.setPositiveButton("OK", null);
- builder.setNegativeButton("Cancel", null);
+ builder.setPositiveButton(android.R.string.ok, null);
+ builder.setNegativeButton(android.R.string.cancel, null);
final AlertDialog alertDialog = builder.create();
alertDialog.show();
diff --git a/app/src/main/java/com/simplemobiletools/gallery/activities/MediaActivity.java b/app/src/main/java/com/simplemobiletools/gallery/activities/MediaActivity.java
index 19215de76..314453cec 100644
--- a/app/src/main/java/com/simplemobiletools/gallery/activities/MediaActivity.java
+++ b/app/src/main/java/com/simplemobiletools/gallery/activities/MediaActivity.java
@@ -1,6 +1,7 @@
package com.simplemobiletools.gallery.activities;
import android.app.WallpaperManager;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor;
@@ -14,6 +15,7 @@ import android.provider.MediaStore;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
@@ -24,6 +26,8 @@ import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.animation.GlideAnimation;
@@ -134,12 +138,63 @@ public class MediaActivity extends SimpleActivity
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.sort:
+ showSortingDialog();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
+ private void showSortingDialog() {
+ final View sortingView = getLayoutInflater().inflate(R.layout.change_sorting, null);
+
+ final AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle(getResources().getString(R.string.sort_by));
+ builder.setView(sortingView);
+
+ final int currSorting = mConfig.getSorting();
+ final RadioGroup sortingRadio = (RadioGroup) sortingView.findViewById(R.id.dialog_radio_sorting);
+ RadioButton sortBtn = (RadioButton) sortingRadio.findViewById(R.id.dialog_radio_name);
+ if ((currSorting & Constants.SORT_BY_DATE) != 0) {
+ sortBtn = (RadioButton) sortingRadio.findViewById(R.id.dialog_radio_date);
+ } else if ((currSorting & Constants.SORT_BY_SIZE) != 0) {
+ sortBtn = (RadioButton) sortingRadio.findViewById(R.id.dialog_radio_size);
+ }
+ sortBtn.setChecked(true);
+
+ final RadioGroup orderRadio = (RadioGroup) sortingView.findViewById(R.id.dialog_radio_order);
+ RadioButton orderBtn = (RadioButton) orderRadio.findViewById(R.id.dialog_radio_ascending);
+ if ((currSorting & Constants.SORT_DESCENDING) != 0) {
+ orderBtn = (RadioButton) orderRadio.findViewById(R.id.dialog_radio_descending);
+ }
+ orderBtn.setChecked(true);
+
+ builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ int sorting = Constants.SORT_BY_NAME;
+ switch (sortingRadio.getCheckedRadioButtonId()) {
+ case R.id.dialog_radio_date:
+ sorting = Constants.SORT_BY_DATE;
+ break;
+ case R.id.dialog_radio_size:
+ sorting = Constants.SORT_BY_SIZE;
+ break;
+ default:
+ break;
+ }
+
+ if (orderRadio.getCheckedRadioButtonId() == R.id.dialog_radio_descending) {
+ sorting |= Constants.SORT_DESCENDING;
+ }
+ mConfig.setSorting(sorting);
+ initializeGallery();
+ }
+ });
+ builder.setNegativeButton(android.R.string.cancel, null);
+ builder.show();
+ }
+
private void deleteDirectoryIfEmpty() {
final File file = new File(mPath);
if (file.isDirectory() && file.listFiles().length == 0) {
@@ -176,7 +231,7 @@ public class MediaActivity extends SimpleActivity
if (file.exists()) {
final int dateIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATE_TAKEN);
final long timestamp = cursor.getLong(dateIndex);
- media.add(new Medium(curPath, (i == 1), timestamp));
+ media.add(new Medium(curPath, (i == 1), timestamp, file.length()));
} else {
invalidFiles.add(file.getAbsolutePath());
}
@@ -186,6 +241,7 @@ public class MediaActivity extends SimpleActivity
}
}
+ Medium.mOrder = mConfig.getSorting();
Collections.sort(media);
final String[] invalids = invalidFiles.toArray(new String[invalidFiles.size()]);
diff --git a/app/src/main/java/com/simplemobiletools/gallery/activities/PhotoVideoActivity.java b/app/src/main/java/com/simplemobiletools/gallery/activities/PhotoVideoActivity.java
index 17a5e635e..eb6860196 100644
--- a/app/src/main/java/com/simplemobiletools/gallery/activities/PhotoVideoActivity.java
+++ b/app/src/main/java/com/simplemobiletools/gallery/activities/PhotoVideoActivity.java
@@ -15,6 +15,8 @@ import com.simplemobiletools.gallery.fragments.VideoFragment;
import com.simplemobiletools.gallery.fragments.ViewPagerFragment;
import com.simplemobiletools.gallery.models.Medium;
+import java.io.File;
+
public class PhotoVideoActivity extends SimpleActivity implements ViewPagerFragment.FragmentClickListener {
private static ActionBar mActionbar;
private static Uri mUri;
@@ -37,7 +39,8 @@ public class PhotoVideoActivity extends SimpleActivity implements ViewPagerFragm
hideSystemUI();
final Bundle bundle = new Bundle();
- final Medium medium = new Medium(mUri.toString(), mIsVideo, 0);
+ final File file = new File(mUri.toString());
+ final Medium medium = new Medium(mUri.toString(), mIsVideo, 0, file.length());
bundle.putSerializable(Constants.MEDIUM, medium);
if (savedInstanceState == null) {
diff --git a/app/src/main/java/com/simplemobiletools/gallery/activities/ViewPagerActivity.java b/app/src/main/java/com/simplemobiletools/gallery/activities/ViewPagerActivity.java
index 094115d16..b103ea266 100644
--- a/app/src/main/java/com/simplemobiletools/gallery/activities/ViewPagerActivity.java
+++ b/app/src/main/java/com/simplemobiletools/gallery/activities/ViewPagerActivity.java
@@ -70,9 +70,11 @@ public class ViewPagerActivity extends SimpleActivity
try {
final String[] proj = {MediaStore.Images.Media.DATA};
cursor = getContentResolver().query(uri, proj, null, null, null);
- final int dataIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
- cursor.moveToFirst();
- mPath = cursor.getString(dataIndex);
+ if (cursor != null) {
+ final int dataIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
+ cursor.moveToFirst();
+ mPath = cursor.getString(dataIndex);
+ }
} finally {
if (cursor != null) {
cursor.close();
@@ -226,8 +228,8 @@ public class ViewPagerActivity extends SimpleActivity
builder.setTitle(getResources().getString(R.string.rename_file));
builder.setView(renameFileView);
- builder.setPositiveButton("OK", null);
- builder.setNegativeButton("Cancel", null);
+ builder.setPositiveButton(android.R.string.ok, null);
+ builder.setNegativeButton(android.R.string.cancel, null);
final AlertDialog alertDialog = builder.create();
alertDialog.show();
@@ -246,7 +248,7 @@ public class ViewPagerActivity extends SimpleActivity
if (file.renameTo(newFile)) {
final int currItem = mPager.getCurrentItem();
- mMedia.set(currItem, new Medium(newFile.getAbsolutePath(), mMedia.get(currItem).getIsVideo(), 0));
+ mMedia.set(currItem, new Medium(newFile.getAbsolutePath(), mMedia.get(currItem).getIsVideo(), 0, file.length()));
final String[] changedFiles = {file.getAbsolutePath(), newFile.getAbsolutePath()};
MediaScannerConnection.scanFile(getApplicationContext(), changedFiles, null, null);
@@ -294,7 +296,7 @@ public class ViewPagerActivity extends SimpleActivity
}
final String where = MediaStore.Images.Media.DATA + " like ? ";
final String[] args = new String[]{mDirectory + "%"};
- final String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_TAKEN};
+ final String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_TAKEN, MediaStore.Images.Media.SIZE};
final Cursor cursor = getContentResolver().query(uri, columns, where, args, null);
final String pattern = Pattern.quote(mDirectory) + "/[^/]*";
@@ -305,13 +307,17 @@ public class ViewPagerActivity extends SimpleActivity
if (curPath.matches(pattern) && !curPath.equals(mToBeDeleted) && !curPath.equals(mBeingDeleted)) {
final int dateIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATE_TAKEN);
final long timestamp = cursor.getLong(dateIndex);
- media.add(new Medium(curPath, i == 1, timestamp));
+
+ final int sizeIndex = cursor.getColumnIndex(MediaStore.Images.Media.SIZE);
+ final long size = cursor.getLong(sizeIndex);
+ media.add(new Medium(curPath, i == 1, timestamp, size));
}
} while (cursor.moveToNext());
cursor.close();
}
}
+ Medium.mOrder = mConfig.getSorting();
Collections.sort(media);
int j = 0;
for (Medium medium : media) {
diff --git a/app/src/main/java/com/simplemobiletools/gallery/models/Medium.java b/app/src/main/java/com/simplemobiletools/gallery/models/Medium.java
index c443536ff..adc128057 100644
--- a/app/src/main/java/com/simplemobiletools/gallery/models/Medium.java
+++ b/app/src/main/java/com/simplemobiletools/gallery/models/Medium.java
@@ -1,5 +1,7 @@
package com.simplemobiletools.gallery.models;
+import com.simplemobiletools.gallery.Constants;
+
import java.io.Serializable;
public class Medium implements Serializable, Comparable {
@@ -7,11 +9,14 @@ public class Medium implements Serializable, Comparable {
private final String mPath;
private final boolean mIsVideo;
private final long mTimestamp;
+ private final long mSize;
+ public static int mOrder;
- public Medium(String path, boolean isVideo, long timestamp) {
+ public Medium(String path, boolean isVideo, long timestamp, long size) {
mPath = path;
mIsVideo = isVideo;
mTimestamp = timestamp;
+ mSize = size;
}
public String getPath() {
@@ -26,6 +31,10 @@ public class Medium implements Serializable, Comparable {
return mTimestamp;
}
+ public long getSize() {
+ return mSize;
+ }
+
public boolean isGif() {
return getPath().endsWith(".gif");
}
@@ -33,12 +42,19 @@ public class Medium implements Serializable, Comparable {
@Override
public int compareTo(Object object) {
final Medium medium = (Medium) object;
- if (mTimestamp < medium.getTimestamp()) {
- return 1;
- } else if (mTimestamp > medium.getTimestamp()) {
- return -1;
+ int res;
+ if ((mOrder & Constants.SORT_BY_NAME) == Constants.SORT_BY_NAME) {
+ res = mPath.compareTo(medium.getPath());
+ } else if ((mOrder & Constants.SORT_BY_DATE) == Constants.SORT_BY_DATE) {
+ res = (mTimestamp > medium.getTimestamp()) ? 1 : -1;
+ } else {
+ res = (mSize > medium.getSize()) ? 1 : -1;
}
- return 0;
+
+ if ((mOrder & Constants.SORT_DESCENDING) == Constants.SORT_DESCENDING) {
+ res *= -1;
+ }
+ return res;
}
@Override
diff --git a/app/src/main/res/layout/change_sorting.xml b/app/src/main/res/layout/change_sorting.xml
new file mode 100644
index 000000000..65a131705
--- /dev/null
+++ b/app/src/main/res/layout/change_sorting.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index a00e2ebf5..3fbae7ad2 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -7,4 +7,5 @@
#99ff6f00
#ff222222
#55000000
+ #aa888888
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 10e019eea..ce273a062 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -8,20 +8,20 @@
- @dimen/normal_text_size
+
+
-
-