From cf45387c0a218500ff73468e1cf7801d2e6c6d68 Mon Sep 17 00:00:00 2001 From: Stefan Wienert Date: Mon, 16 May 2016 10:35:41 +0800 Subject: [PATCH 1/8] Wrapped okclient in try finally to remove warning about closing the response body --- src/fr/s13d/photobackup/PBMediaSender.java | 26 ++++++++++++++-------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/fr/s13d/photobackup/PBMediaSender.java b/src/fr/s13d/photobackup/PBMediaSender.java index 8dfa26a..fc046ff 100644 --- a/src/fr/s13d/photobackup/PBMediaSender.java +++ b/src/fr/s13d/photobackup/PBMediaSender.java @@ -127,11 +127,15 @@ private void sendMedia(final PBMedia media) { getOkClient().newCall(request).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) throws IOException { - Log.i(LOG_TAG, "Get response with code " + response.code()); - if (response.code() == 200) { - sendDidSucceed(media); - } else { - sendDidFail(media, new Throwable(response.message())); + try { + Log.i(LOG_TAG, "Get response with code " + response.code()); + if (response.code() == 200) { + sendDidSucceed(media); + } else { + sendDidFail(media, new Throwable(response.message())); + } + } finally { + response.body().close(); } response.body().close(); } @@ -163,10 +167,14 @@ public void test() { getOkClient().newCall(request).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) throws IOException { - if (response.isSuccessful() || response.code() == 409) { - testDidSucceed(toast); - } else { - testDidFail(toast, response.message()); + try { + if (response.isSuccessful() || response.code() == 409) { + testDidSucceed(toast); + } else { + testDidFail(toast, response.message()); + } + } finally { + response.body().close(); } response.body().close(); } From 40ffe39e5e2e1283f136497a6c19493a66b274ac Mon Sep 17 00:00:00 2001 From: Stefan Wienert Date: Mon, 16 May 2016 14:21:33 +0800 Subject: [PATCH 2/8] User can now select the buckets which should be uploaded - New Preference which loads bucket names ordered by containing photo count - All SQL cursor creation into new Class PBMediaStoreQueries - Also: Fixed the 409 - was only on TestCall but not the real upload call --- res/values-de/strings.xml | 3 +- res/values/arrays.xml | 2 + res/values/strings.xml | 2 + res/xml/preferences.xml | 10 ++ src/fr/s13d/photobackup/PBMediaSender.java | 4 +- src/fr/s13d/photobackup/PBMediaStore.java | 67 ++++--- .../s13d/photobackup/PBMediaStoreQueries.java | 165 ++++++++++++++++++ src/fr/s13d/photobackup/PBService.java | 10 +- .../preferences/PBPreferenceFragment.java | 54 +++++- .../PBServerPreferenceFragment.java | 2 - 10 files changed, 270 insertions(+), 49 deletions(-) create mode 100644 src/fr/s13d/photobackup/PBMediaStoreQueries.java diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 40c54e5..e2a420b 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -8,7 +8,7 @@ Um deinen eigenen Server zu installieren und konfigurieren, schaue bitte hier:PhotoBackup Version %1$s Abbrechen Informationen - Gespeichert + Fertig Fehler Starte erst den Dienst um das Protokoll zu sehen Upload Protokoll @@ -42,4 +42,5 @@ Um deinen eigenen Server zu installieren und konfigurieren, schaue bitte hier:Passwort darf nicht leer sein! Server testen Die Serveradresse ist ungültig. + Ordner zur Sicherung auswählen diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 1cedda6..afe6f9c 100755 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -31,4 +31,6 @@ @string/not_only_recent_upload + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 751d44e..9e4f5ac 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -60,5 +60,7 @@ Thumbnail of the photo Manual backup Save this picture now! + Select photo folder to backup + diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index ae02581..f725806 100755 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -37,6 +37,16 @@ android:entryValues="@array/pref_upload_values" android:defaultValue="@string/only_recent_upload" /> + + diff --git a/src/fr/s13d/photobackup/PBMediaSender.java b/src/fr/s13d/photobackup/PBMediaSender.java index fc046ff..97a7f25 100644 --- a/src/fr/s13d/photobackup/PBMediaSender.java +++ b/src/fr/s13d/photobackup/PBMediaSender.java @@ -129,7 +129,7 @@ private void sendMedia(final PBMedia media) { public void onResponse(Call call, Response response) throws IOException { try { Log.i(LOG_TAG, "Get response with code " + response.code()); - if (response.code() == 200) { + if (response.isSuccessful() || response.code() == 409) { sendDidSucceed(media); } else { sendDidFail(media, new Throwable(response.message())); @@ -168,7 +168,7 @@ public void test() { @Override public void onResponse(Call call, Response response) throws IOException { try { - if (response.isSuccessful() || response.code() == 409) { + if (response.isSuccessful()) { testDidSucceed(toast); } else { testDidFail(toast, response.message()); diff --git a/src/fr/s13d/photobackup/PBMediaStore.java b/src/fr/s13d/photobackup/PBMediaStore.java index f55dc2a..12cfa9e 100644 --- a/src/fr/s13d/photobackup/PBMediaStore.java +++ b/src/fr/s13d/photobackup/PBMediaStore.java @@ -18,6 +18,7 @@ */ package fr.s13d.photobackup; +import android.content.ContentResolver; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; @@ -42,6 +43,8 @@ public class PBMediaStore { private static SyncMediaStoreTask syncTask; private static SharedPreferences picturesPreferences; private static SharedPreferences.Editor picturesPreferencesEditor; + public static final String PhotoBackupPicturesSharedPreferences = "PhotoBackupPicturesSharedPreferences"; + private static PBMediaStoreQueries queries; private List interfaces = new ArrayList<>(); @@ -51,7 +54,7 @@ public PBMediaStore(Context theContext) { picturesPreferences = context.getSharedPreferences(PBApplication.PB_PICTURES_SHARED_PREFS, Context.MODE_PRIVATE); picturesPreferencesEditor = picturesPreferences.edit(); picturesPreferencesEditor.apply(); - + queries = new PBMediaStoreQueries(context); } @@ -65,6 +68,14 @@ private static void setPicturesPreferencesEditorToNull(){ picturesPreferencesEditor = null; } + public PBMedia getLastMediaInStore() { + int id = queries.getLastMediaIdInStore(); + return getMedia(id); + } + + public PBMediaStoreQueries getQueries() { + return queries; + } public void addInterface(PBMediaStoreInterface storeInterface) { interfaces.add(storeInterface); @@ -83,27 +94,30 @@ public void close() { public PBMedia getMedia(int id) { - PBMedia media = null; - if (id != 0) { - final Cursor cursor = context.getContentResolver().query(uri, null, "_id = " + id, null, null); - if (cursor != null && cursor.moveToFirst()) { - media = new PBMedia(context, cursor); + if (id == 0) { + return null; + } + Cursor cursor = queries.getMediaById(id); + if (cursor == null) { + Log.i(LOG_TAG, "Photo not returned. Probably filtered by Bucket or deleted"); + return null; + } + Integer idCol = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID); + queries.isSelectedBucket(cursor.getString(idCol)); - try { - String stateString = picturesPreferences.getString(String.valueOf(media.getId()), PBMedia.PBMediaState.WAITING.name()); - media.setState(PBMedia.PBMediaState.valueOf(stateString)); - } - catch (Exception e) { - Log.e(LOG_TAG, "Explosion!!"); - } - } - if (cursor != null && !cursor.isClosed()) { - cursor.close(); - } + media = new PBMedia(context, cursor); + try { + String stateString = picturesPreferences.getString(String.valueOf(media.getId()), PBMedia.PBMediaState.WAITING.name()); + media.setState(PBMedia.PBMediaState.valueOf(stateString)); + } catch (Exception e) { + Log.e(LOG_TAG, "Explosion!!"); } + if (!cursor.isClosed()) { + cursor.close(); + } return media; } @@ -113,17 +127,6 @@ public List getMedias() { } - public PBMedia getLastMediaInStore() { - int id = 0; - final String[] projection = new String[] { "_id" }; - final Cursor cursor = context.getContentResolver().query(uri, projection, null, null, "date_added DESC"); - if (cursor != null && cursor.moveToFirst()) { - int idColumn = cursor.getColumnIndexOrThrow("_id"); - id = cursor.getInt(idColumn); - cursor.close(); - } - return getMedia(id); - } ///////////////////////////////// @@ -153,13 +156,7 @@ protected Void doInBackground(Void... voids) { Set inCursor = new HashSet<>(); // Get all pictures on device - final String[] projection = new String[] { "_id", "_data", "date_added" }; - Cursor cursor = null; - try { - cursor = context.getContentResolver().query(uri, projection, null, null, "date_added DESC"); - } catch(SecurityException e) { - Log.w(LOG_TAG, e.toString()); - } + Cursor cursor = queries.getAllMedia(); // loop through them to sync PBMedia media; diff --git a/src/fr/s13d/photobackup/PBMediaStoreQueries.java b/src/fr/s13d/photobackup/PBMediaStoreQueries.java new file mode 100644 index 0000000..50096b7 --- /dev/null +++ b/src/fr/s13d/photobackup/PBMediaStoreQueries.java @@ -0,0 +1,165 @@ +/** + * Copyright (C) 2013-2015 Stéphane Péchard. + * + * This file is part of PhotoBackup. + * + * PhotoBackup is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PhotoBackup is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package fr.s13d.photobackup; + +import android.content.Context; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.net.Uri; +import android.preference.PreferenceManager; +import android.provider.MediaStore; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Set; +import java.util.SortedMap; + +import fr.s13d.photobackup.preferences.PBPreferenceFragment; + + +public class PBMediaStoreQueries { + + private static final String LOG_TAG = "PBMediaStoreQueries"; + private static String where; + private static Context context; + private static final Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + private final SharedPreferences prefs; + + + public PBMediaStoreQueries(Context theContext) { + context = theContext; + HashMap bucketNames = getAllBucketNames(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + } + + public boolean isSelectedBucket(String bucketId) { + Set buckets = prefs.getStringSet(PBPreferenceFragment.PREF_BUCKETS, null); + // User has selected nothing - all buckets ok! + if (buckets == null || buckets.size() == 0) { + return true; + } + Log.d(LOG_TAG, "Checking if " + bucketId + " is selected by user.."); + + for (String bucket: buckets) { + Log.d(LOG_TAG, "Selected bucket: " + bucket); + if(bucket.equals(bucketId)) { + Log.d(LOG_TAG, "Is selected bucket! Continuing"); + return true; + } + }; + Log.i(LOG_TAG, "Is not in selected buckets - Ignoring"); + return false; + } + + public Cursor getAllMedia() { + Cursor cursor = null; + final String[] projection = new String[] { "_id", "_data", "date_added" }; + try { + cursor = context.getContentResolver().query(uri, projection, where, null, "date_added DESC"); + } catch(SecurityException e) { + e.printStackTrace(); + } + return cursor; + } + + public Integer getLastMediaIdInStore() { + int id = 0; + String bucketId = ""; + final String[] projection = new String[] { "_id", MediaStore.Images.Media.BUCKET_ID }; + final Cursor cursor = context.getContentResolver().query(uri, projection, null, null, "date_added DESC"); + if (cursor != null && cursor.moveToFirst()) { + int idColumn = cursor.getColumnIndexOrThrow("_id"); + id = cursor.getInt(idColumn); + int bucketColumn = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID); + bucketId = cursor.getString(bucketColumn); + Log.i(LOG_TAG, "BucketId: " + cursor.getString(bucketColumn) ); + } + closeCursor(cursor); + isSelectedBucket(bucketId); + return id; + } + + public Cursor getMediaById(Integer id) { + String localWhere = "_id = " + id; + final Cursor cursor = context.getContentResolver().query(uri, null, localWhere, null, null); + if (cursor != null && cursor.moveToFirst()) { + return cursor; + } else { + return null; + } + } + public LinkedHashMap getAllBucketNames() { + // which image properties are we querying + String[] PROJECTION_BUCKET = { + MediaStore.Images.ImageColumns.BUCKET_ID, + MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, + "count(*) as photo_count" + }; + // We want to order the albums by reverse chronological order. We abuse the + // "WHERE" parameter to insert a "GROUP BY" clause into the SQL statement. + // The template for "WHERE" parameter is like: + // SELECT ... FROM ... WHERE (%s) + // and we make it look like: + // SELECT ... FROM ... WHERE (1) GROUP BY 1,(2) + // The "(1)" means true. The "1,(2)" means the first two columns specified + // after SELECT. Note that because there is a ")" in the template, we use + // "(2" to match it. + String BUCKET_GROUP_BY = + "1) GROUP BY 1,(2"; + + // Get the base URI for the People table in the Contacts content provider. + Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + + Cursor cur = context.getContentResolver().query( + images, PROJECTION_BUCKET, BUCKET_GROUP_BY, null, "photo_count desc"); + + LinkedHashMap imageBuckets = new LinkedHashMap(); + if (cur != null && cur.moveToFirst()) { + String bucket; + String id; + String bucketCount; + int bucketColumn = cur.getColumnIndex( + MediaStore.Images.Media.BUCKET_DISPLAY_NAME); + int bucketIdColumn = cur.getColumnIndex( + MediaStore.Images.Media.BUCKET_ID); + int bucketCountColumn = cur.getColumnIndex("photo_count"); + + do { + // Get the field values + bucket = cur.getString(bucketColumn); + id = cur.getString(bucketIdColumn); + bucketCount = cur.getString(bucketCountColumn); + + Log.d(LOG_TAG, "Bucket=" + bucket + ", count=" + bucketCount); + imageBuckets.put(id, bucket + " (" + bucketCount + ")"); + // Do something with the values. + //Log.i("Bucket", " bucket=" + bucket); + } while (cur.moveToNext()); + } + closeCursor(cur); + return imageBuckets; + } + + private void closeCursor(Cursor cursor) { + if (cursor != null && !cursor.isClosed()) { + cursor.close(); + } + } + +} diff --git a/src/fr/s13d/photobackup/PBService.java b/src/fr/s13d/photobackup/PBService.java index b8a55f1..d682da8 100644 --- a/src/fr/s13d/photobackup/PBService.java +++ b/src/fr/s13d/photobackup/PBService.java @@ -19,6 +19,8 @@ package fr.s13d.photobackup; import android.app.Service; +import android.content.ContentResolver; +import android.content.Context; import android.content.Intent; import android.database.ContentObserver; import android.net.Uri; @@ -50,7 +52,9 @@ public void onCreate() { mediaStore.addInterface(this); mediaSender = new PBMediaSender(this); mediaSender.addInterface(this); - this.getApplicationContext().getContentResolver().registerContentObserver( + ContentResolver contentResolver = this.getApplicationContext().getContentResolver(); + + contentResolver.registerContentObserver( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false, newMediaContentObserver); Log.i(LOG_TAG, "PhotoBackup service is created"); @@ -143,11 +147,15 @@ public void onChange(boolean selfChange) { public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange); Log.i(LOG_TAG, "MediaContentObserver:onChange()"); + Log.i(LOG_TAG, "Content-URI: " + uri); if (uri.toString().equals("content://media/external/images/media")) { try { final PBMedia media = mediaStore.getLastMediaInStore(); + if (media == null) { + return; + } media.setState(PBMedia.PBMediaState.WAITING); mediaSender.send(media, false); //mediaStore.sync(); diff --git a/src/fr/s13d/photobackup/preferences/PBPreferenceFragment.java b/src/fr/s13d/photobackup/preferences/PBPreferenceFragment.java index 2fc94d1..ee2b69e 100644 --- a/src/fr/s13d/photobackup/preferences/PBPreferenceFragment.java +++ b/src/fr/s13d/photobackup/preferences/PBPreferenceFragment.java @@ -32,21 +32,30 @@ import android.os.Bundle; import android.os.IBinder; import android.preference.ListPreference; +import android.preference.MultiSelectListPreference; import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.preference.SwitchPreference; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; +import android.support.v4.content.LocalBroadcastManager; +import android.text.TextUtils; +import android.util.ArraySet; import android.webkit.URLUtil; import android.widget.Toast; +import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.Map; +import java.util.Set; +import java.util.zip.CheckedInputStream; import fr.s13d.photobackup.Log; import fr.s13d.photobackup.PBActivity; import fr.s13d.photobackup.PBMediaSender; +import fr.s13d.photobackup.PBMediaStoreQueries; import fr.s13d.photobackup.PBService; import fr.s13d.photobackup.R; import fr.s13d.photobackup.interfaces.PBMediaSenderInterface; @@ -76,6 +85,7 @@ public void onServiceConnected(ComponentName className, IBinder binder) { currentService.getMediaStore().addInterface(self); updateUploadJournalPreference(); // update journal serverKeys number Log.i(LOG_TAG, "Connected to service"); + fillBuckets(); } public void onServiceDisconnected(ComponentName className) { @@ -89,7 +99,8 @@ public void onServiceDisconnected(ComponentName className) { public static final String PREF_SERVER = "PREF_SERVER"; public static final String PREF_WIFI_ONLY = "PREF_WIFI_ONLY"; public static final String PREF_RECENT_UPLOAD_ONLY = "PREF_RECENT_UPLOAD_ONLY"; - + public static final String PREF_BUCKETS = "PREF_BUCKETS"; + private HashMap bucketNames; ////////////////// // Constructors // @@ -111,8 +122,23 @@ public void onCreate(final Bundle savedInstanceState) { preferencesEditor.apply(); } migratePreferences(); - addPreferencesFromResource(R.xml.preferences); + + } + + private void fillBuckets() { + HashMap buckets = currentService.getMediaStore().getQueries().getAllBucketNames(); + this.bucketNames = buckets; + + CharSequence[] entries = buckets.values().toArray(new CharSequence[buckets.size()]); + CharSequence[] entryValues = buckets.keySet().toArray(new CharSequence[buckets.size()]); + + MultiSelectListPreference lp = (MultiSelectListPreference)findPreference("PREF_BUCKETS"); + lp.setEntries(entries); + lp.setEnabled(true); + lp.setEntryValues(entryValues); + + setSummaries(); } @@ -152,13 +178,8 @@ public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, Log.i(LOG_TAG, "onSharedPreferenceChanged: " + key); if (key.equals(PREF_SERVICE_RUNNING)) { startOrStopService(sharedPreferences); - - } else if (key.equals(PREF_WIFI_ONLY)) { + } else if (key.equals(PREF_WIFI_ONLY) || key.equals(PREF_RECENT_UPLOAD_ONLY) || key.equals(PREF_BUCKETS)) { setSummaries(); - - } else if (key.equals(PREF_RECENT_UPLOAD_ONLY)) { - setSummaries(); - } else if (sharedPreferences == null) { Log.e(LOG_TAG, "Error: preferences == null"); } @@ -200,6 +221,23 @@ private void initPreferences() { private void setSummaries() { + + String buckets = ""; + Set selectedBuckets = preferences.getStringSet(PREF_BUCKETS, null); + if (selectedBuckets != null && bucketNames != null) { + ArrayList selectedBucketNames = new ArrayList(); + for(String entry: selectedBuckets) { + String oneName = bucketNames.get(entry); + if (oneName != null) { + selectedBucketNames.add(oneName); + } + } + buckets = TextUtils.join(", ", selectedBucketNames); + } + MultiSelectListPreference bucketPreference = (MultiSelectListPreference)findPreference(PREF_BUCKETS); + bucketPreference.setSummary(buckets); + + final String wifiOnly = preferences.getString(PREF_WIFI_ONLY, getResources().getString(R.string.only_wifi_default)); // default final ListPreference wifiPreference = (ListPreference) findPreference(PREF_WIFI_ONLY); diff --git a/src/fr/s13d/photobackup/preferences/PBServerPreferenceFragment.java b/src/fr/s13d/photobackup/preferences/PBServerPreferenceFragment.java index 278e911..4d13d52 100755 --- a/src/fr/s13d/photobackup/preferences/PBServerPreferenceFragment.java +++ b/src/fr/s13d/photobackup/preferences/PBServerPreferenceFragment.java @@ -118,7 +118,6 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin } else if (sharedPreferences == null) { Log.e(LOG_TAG, "Error: preferences == null"); } - } @@ -146,7 +145,6 @@ private void configurePreference() { Preference pref = findPreference(param); screen.removePreference(pref); } - } From 3fe8709fcb3cf4fed47f6d08eef6871024a21a61 Mon Sep 17 00:00:00 2001 From: Stefan Wienert Date: Mon, 16 May 2016 14:31:02 +0800 Subject: [PATCH 3/8] Code linting + Tidy Up --- src/fr/s13d/photobackup/PBMediaSender.java | 1 - src/fr/s13d/photobackup/PBMediaStore.java | 1 - src/fr/s13d/photobackup/PBMediaStoreQueries.java | 10 ++-------- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/fr/s13d/photobackup/PBMediaSender.java b/src/fr/s13d/photobackup/PBMediaSender.java index 97a7f25..c0902ac 100644 --- a/src/fr/s13d/photobackup/PBMediaSender.java +++ b/src/fr/s13d/photobackup/PBMediaSender.java @@ -203,7 +203,6 @@ private Request makePostRequest(RequestBody requestBody, String pathSuffix) { return requestBuilder.build(); } - ///////////////////// // Private methods // ///////////////////// diff --git a/src/fr/s13d/photobackup/PBMediaStore.java b/src/fr/s13d/photobackup/PBMediaStore.java index 12cfa9e..fe619e0 100644 --- a/src/fr/s13d/photobackup/PBMediaStore.java +++ b/src/fr/s13d/photobackup/PBMediaStore.java @@ -18,7 +18,6 @@ */ package fr.s13d.photobackup; -import android.content.ContentResolver; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; diff --git a/src/fr/s13d/photobackup/PBMediaStoreQueries.java b/src/fr/s13d/photobackup/PBMediaStoreQueries.java index 50096b7..cf55851 100644 --- a/src/fr/s13d/photobackup/PBMediaStoreQueries.java +++ b/src/fr/s13d/photobackup/PBMediaStoreQueries.java @@ -28,7 +28,6 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Set; -import java.util.SortedMap; import fr.s13d.photobackup.preferences.PBPreferenceFragment; @@ -36,7 +35,6 @@ public class PBMediaStoreQueries { private static final String LOG_TAG = "PBMediaStoreQueries"; - private static String where; private static Context context; private static final Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; private final SharedPreferences prefs; @@ -44,7 +42,6 @@ public class PBMediaStoreQueries { public PBMediaStoreQueries(Context theContext) { context = theContext; - HashMap bucketNames = getAllBucketNames(); prefs = PreferenceManager.getDefaultSharedPreferences(context); } @@ -62,7 +59,7 @@ public boolean isSelectedBucket(String bucketId) { Log.d(LOG_TAG, "Is selected bucket! Continuing"); return true; } - }; + } Log.i(LOG_TAG, "Is not in selected buckets - Ignoring"); return false; } @@ -71,7 +68,7 @@ public Cursor getAllMedia() { Cursor cursor = null; final String[] projection = new String[] { "_id", "_data", "date_added" }; try { - cursor = context.getContentResolver().query(uri, projection, where, null, "date_added DESC"); + cursor = context.getContentResolver().query(uri, projection, null, null, "date_added DESC"); } catch(SecurityException e) { e.printStackTrace(); } @@ -141,15 +138,12 @@ public LinkedHashMap getAllBucketNames() { int bucketCountColumn = cur.getColumnIndex("photo_count"); do { - // Get the field values bucket = cur.getString(bucketColumn); id = cur.getString(bucketIdColumn); bucketCount = cur.getString(bucketCountColumn); Log.d(LOG_TAG, "Bucket=" + bucket + ", count=" + bucketCount); imageBuckets.put(id, bucket + " (" + bucketCount + ")"); - // Do something with the values. - //Log.i("Bucket", " bucket=" + bucket); } while (cur.moveToNext()); } closeCursor(cur); From 12a1c57da8d0a2e5cb2db713bd633d5da0c907d2 Mon Sep 17 00:00:00 2001 From: Stefan Wienert Date: Thu, 19 May 2016 16:26:40 +0800 Subject: [PATCH 4/8] Choosing buckets also filters the upload journal on change --- src/fr/s13d/photobackup/PBMediaStore.java | 2 +- src/fr/s13d/photobackup/PBMediaStoreQueries.java | 12 ++++++++++-- .../preferences/PBPreferenceFragment.java | 7 ++++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/fr/s13d/photobackup/PBMediaStore.java b/src/fr/s13d/photobackup/PBMediaStore.java index fe619e0..792c7b5 100644 --- a/src/fr/s13d/photobackup/PBMediaStore.java +++ b/src/fr/s13d/photobackup/PBMediaStore.java @@ -99,7 +99,7 @@ public PBMedia getMedia(int id) { } Cursor cursor = queries.getMediaById(id); if (cursor == null) { - Log.i(LOG_TAG, "Photo not returned. Probably filtered by Bucket or deleted"); + Log.e(LOG_TAG, "Photo not returned. Probably filtered by Bucket or deleted"); return null; } Integer idCol = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID); diff --git a/src/fr/s13d/photobackup/PBMediaStoreQueries.java b/src/fr/s13d/photobackup/PBMediaStoreQueries.java index cf55851..c096e06 100644 --- a/src/fr/s13d/photobackup/PBMediaStoreQueries.java +++ b/src/fr/s13d/photobackup/PBMediaStoreQueries.java @@ -24,6 +24,7 @@ import android.net.Uri; import android.preference.PreferenceManager; import android.provider.MediaStore; +import android.text.TextUtils; import java.util.HashMap; import java.util.LinkedHashMap; @@ -54,7 +55,6 @@ public boolean isSelectedBucket(String bucketId) { Log.d(LOG_TAG, "Checking if " + bucketId + " is selected by user.."); for (String bucket: buckets) { - Log.d(LOG_TAG, "Selected bucket: " + bucket); if(bucket.equals(bucketId)) { Log.d(LOG_TAG, "Is selected bucket! Continuing"); return true; @@ -65,10 +65,18 @@ public boolean isSelectedBucket(String bucketId) { } public Cursor getAllMedia() { + String where; Cursor cursor = null; final String[] projection = new String[] { "_id", "_data", "date_added" }; + Set buckets = prefs.getStringSet(PBPreferenceFragment.PREF_BUCKETS, null); + if (buckets != null && buckets.size() > 0) { + String args = TextUtils.join(", ", buckets); + where = "bucket_id in (" + args + ")"; + } else { + where = null; + } try { - cursor = context.getContentResolver().query(uri, projection, null, null, "date_added DESC"); + cursor = context.getContentResolver().query(uri, projection, where, null, "date_added DESC"); } catch(SecurityException e) { e.printStackTrace(); } diff --git a/src/fr/s13d/photobackup/preferences/PBPreferenceFragment.java b/src/fr/s13d/photobackup/preferences/PBPreferenceFragment.java index ee2b69e..fcc946e 100644 --- a/src/fr/s13d/photobackup/preferences/PBPreferenceFragment.java +++ b/src/fr/s13d/photobackup/preferences/PBPreferenceFragment.java @@ -178,7 +178,12 @@ public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, Log.i(LOG_TAG, "onSharedPreferenceChanged: " + key); if (key.equals(PREF_SERVICE_RUNNING)) { startOrStopService(sharedPreferences); - } else if (key.equals(PREF_WIFI_ONLY) || key.equals(PREF_RECENT_UPLOAD_ONLY) || key.equals(PREF_BUCKETS)) { + } else if (key.equals(PREF_WIFI_ONLY) || key.equals(PREF_RECENT_UPLOAD_ONLY)) { + setSummaries(); + } else if (key.equals(PREF_BUCKETS)) { + if (currentService != null) { + currentService.getMediaStore().sync(); + } setSummaries(); } else if (sharedPreferences == null) { Log.e(LOG_TAG, "Error: preferences == null"); From 772a639fbb888509decbc842904681896425e829 Mon Sep 17 00:00:00 2001 From: Stefan Wienert Date: Thu, 19 May 2016 16:32:37 +0800 Subject: [PATCH 5/8] Removed some debug statements --- src/fr/s13d/photobackup/PBMediaStoreQueries.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/fr/s13d/photobackup/PBMediaStoreQueries.java b/src/fr/s13d/photobackup/PBMediaStoreQueries.java index c096e06..4fbbfe2 100644 --- a/src/fr/s13d/photobackup/PBMediaStoreQueries.java +++ b/src/fr/s13d/photobackup/PBMediaStoreQueries.java @@ -93,7 +93,6 @@ public Integer getLastMediaIdInStore() { id = cursor.getInt(idColumn); int bucketColumn = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID); bucketId = cursor.getString(bucketColumn); - Log.i(LOG_TAG, "BucketId: " + cursor.getString(bucketColumn) ); } closeCursor(cursor); isSelectedBucket(bucketId); @@ -149,8 +148,6 @@ public LinkedHashMap getAllBucketNames() { bucket = cur.getString(bucketColumn); id = cur.getString(bucketIdColumn); bucketCount = cur.getString(bucketCountColumn); - - Log.d(LOG_TAG, "Bucket=" + bucket + ", count=" + bucketCount); imageBuckets.put(id, bucket + " (" + bucketCount + ")"); } while (cur.moveToNext()); } From d373316f99772e285b4d45dd7895e48b2603d6c3 Mon Sep 17 00:00:00 2001 From: Stefan Wienert Date: Fri, 20 May 2016 10:51:32 +0800 Subject: [PATCH 6/8] Removed duplicate body close --- src/fr/s13d/photobackup/PBMediaSender.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/fr/s13d/photobackup/PBMediaSender.java b/src/fr/s13d/photobackup/PBMediaSender.java index c0902ac..a1cdac9 100644 --- a/src/fr/s13d/photobackup/PBMediaSender.java +++ b/src/fr/s13d/photobackup/PBMediaSender.java @@ -137,7 +137,6 @@ public void onResponse(Call call, Response response) throws IOException { } finally { response.body().close(); } - response.body().close(); } @Override @@ -176,7 +175,6 @@ public void onResponse(Call call, Response response) throws IOException { } finally { response.body().close(); } - response.body().close(); } @Override From 76cf0cd57e9418cb12597f8680c107d0b1c87e9d Mon Sep 17 00:00:00 2001 From: Stefan Wienert Date: Sat, 21 May 2016 16:16:10 +0800 Subject: [PATCH 7/8] Added button to upload log: Retry failed/waiting items now (max. 100 at once) --- res/layout/activity_journal.xml | 26 +++++++++++++--- res/values-de/strings.xml | 3 ++ res/values/strings.xml | 5 ++- .../s13d/photobackup/PBJournalActivity.java | 31 +++++++++++++++++++ 4 files changed, 60 insertions(+), 5 deletions(-) diff --git a/res/layout/activity_journal.xml b/res/layout/activity_journal.xml index fe0693a..3b1f6a4 100644 --- a/res/layout/activity_journal.xml +++ b/res/layout/activity_journal.xml @@ -61,10 +61,28 @@ android:layout_height="1px" android:background="?android:attr/listDivider" /> - + android:layout_height="match_parent"> + + + +