From cd131797cc62b8c948782631cc9b8eec0f80c261 Mon Sep 17 00:00:00 2001 From: Varun Patil Date: Sun, 7 May 2023 18:57:29 -0700 Subject: [PATCH] Update tq --- app/build.gradle | 20 ++-- .../memories/service/TimelineQuery.java | 102 ++++++++++-------- 2 files changed, 67 insertions(+), 55 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f601e620..6fe672e1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,12 +4,12 @@ plugins { android { namespace 'gallery.memories' - compileSdk 32 + compileSdk 33 defaultConfig { applicationId "gallery.memories" minSdk 27 - targetSdk 32 + targetSdk 33 versionCode 1 versionName "1.0" @@ -32,13 +32,13 @@ android { } dependencies { - - implementation 'androidx.appcompat:appcompat:1.4.1' - implementation 'com.google.android.material:material:1.5.0' - implementation 'androidx.constraintlayout:constraintlayout:2.1.3' - implementation 'androidx.navigation:navigation-fragment:2.4.1' - implementation 'androidx.navigation:navigation-ui:2.4.1' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.8.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'androidx.navigation:navigation-fragment:2.5.3' + implementation 'androidx.navigation:navigation-ui:2.5.3' + implementation 'androidx.exifinterface:exifinterface:1.3.6' testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' } \ No newline at end of file diff --git a/app/src/main/java/gallery/memories/service/TimelineQuery.java b/app/src/main/java/gallery/memories/service/TimelineQuery.java index 767cfb17..155eac60 100644 --- a/app/src/main/java/gallery/memories/service/TimelineQuery.java +++ b/app/src/main/java/gallery/memories/service/TimelineQuery.java @@ -4,9 +4,10 @@ import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.icu.text.SimpleDateFormat; -import android.media.ExifInterface; +import androidx.exifinterface.media.ExifInterface; import android.net.Uri; import android.provider.MediaStore; +import android.text.TextUtils; import android.util.Log; import org.json.JSONArray; @@ -16,7 +17,8 @@ import org.json.JSONObject; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; -import java.util.TimeZone; +import java.util.HashMap; +import java.util.Map; public class TimelineQuery { final static String TAG = "TimelineQuery"; @@ -31,47 +33,56 @@ public class TimelineQuery { } public JSONArray getByDayId(final long dayId) { - Uri collection = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + // Get list of images from DB + final ArrayList imageIds = new ArrayList(); + final Map datesTaken = new HashMap<>(); + try (Cursor cursor = mDb.rawQuery( + "SELECT local_id, date_taken FROM images WHERE dayid = ?", + new String[] { Long.toString(dayId) } + )) { + while (cursor.moveToNext()) { + final long localId = cursor.getLong(0); + final long dateTaken = cursor.getLong(1); + imageIds.add(localId); + datesTaken.put(localId, dateTaken); + } + } - // Offset of current timezone from UTC - long utcOffset = TimeZone.getDefault().getOffset(System.currentTimeMillis()); + // Nothing to do + if (imageIds.size() == 0) { + return new JSONArray(); + } + + // All external storage images + Uri collection = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; // Same fields as server response String[] projection = new String[] { - MediaStore.Images.Media._ID, - MediaStore.Images.Media.DISPLAY_NAME, - MediaStore.Images.Media.MIME_TYPE, - MediaStore.Images.Media.DATE_TAKEN, - MediaStore.Images.Media.HEIGHT, - MediaStore.Images.Media.WIDTH, - MediaStore.Images.Media.SIZE, + MediaStore.Images.Media._ID, + MediaStore.Images.Media.DISPLAY_NAME, + MediaStore.Images.Media.MIME_TYPE, + MediaStore.Images.Media.HEIGHT, + MediaStore.Images.Media.WIDTH, + MediaStore.Images.Media.SIZE, }; // Filter for given day - String selection = MediaStore.Images.Media.DATE_TAKEN + " >= ? AND " - + MediaStore.Images.Media.DATE_TAKEN + " <= ?"; - String[] selectionArgs = new String[] { - Long.toString(dayId * 86400000L - utcOffset), - Long.toString(((dayId+1) * 86400000L - utcOffset)), - }; - - // Sort by name? TODO: fix this - String sortOrder = MediaStore.Images.Media.DISPLAY_NAME + " ASC"; + String selection = MediaStore.Images.Media._ID + + " IN (" + TextUtils.join(",", imageIds) + ")"; // Make list of files ArrayList files = new ArrayList<>(); try (Cursor cursor = mCtx.getContentResolver().query( - collection, - projection, - selection, - selectionArgs, - sortOrder + collection, + projection, + selection, + null, + null )) { int idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID); int nameColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME); int mimeColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.MIME_TYPE); - int dateColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_TAKEN); int heightColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.HEIGHT); int widthColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.WIDTH); int sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE); @@ -80,20 +91,21 @@ public class TimelineQuery { long id = cursor.getLong(idColumn); String name = cursor.getString(nameColumn); String mime = cursor.getString(mimeColumn); - long dateTaken = cursor.getLong(dateColumn); long height = cursor.getLong(heightColumn); long width = cursor.getLong(widthColumn); long size = cursor.getLong(sizeColumn); + long dateTaken = datesTaken.get(id); try { JSONObject file = new JSONObject() - .put("fileid", id) - .put("basename", name) - .put("mimetype", mime) - .put("dayid", (dateTaken / 86400000)) - .put("h", height) - .put("w", width) - .put("size", size); + .put("fileid", id) + .put("basename", name) + .put("mimetype", mime) + .put("dayid", dayId) + .put("datetaken", dateTaken) + .put("h", height) + .put("w", width) + .put("size", size); files.add(file); } catch (JSONException e) { Log.e(TAG, "JSON error"); @@ -113,19 +125,19 @@ public class TimelineQuery { // Same fields as server response String[] projection = new String[] { - MediaStore.Images.Media._ID, - MediaStore.Images.Media.DATA, - MediaStore.Images.Media.DISPLAY_NAME, - MediaStore.Images.Media.DATE_TAKEN, - MediaStore.Images.Media.DATE_MODIFIED, + MediaStore.Images.Media._ID, + MediaStore.Images.Media.DATA, + MediaStore.Images.Media.DISPLAY_NAME, + MediaStore.Images.Media.DATE_TAKEN, + MediaStore.Images.Media.DATE_MODIFIED, }; try (Cursor cursor = mCtx.getContentResolver().query( - collection, - projection, - null, - null, - null + collection, + projection, + null, + null, + null )) { int idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID); int uriColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);