From 589750a4f7e16ce3b40ad8335bc0b02c58b42ffd Mon Sep 17 00:00:00 2001 From: Max Ammann Date: Tue, 14 Jun 2016 20:51:27 +0200 Subject: [PATCH] Cleanups and beautifies --- .../music_cyclon/RenameDialogFragment.java | 3 +- .../max/music_cyclon/SynchronizeActivity.java | 69 +++++++++++++------ .../max/music_cyclon/SynchronizeConfig.java | 67 ++++++++++++------ .../music_cyclon/service/BeetsFetcher.java | 2 +- .../music_cyclon/service/DownloadTask.java | 14 ++-- .../java/max/music_cyclon/service/Item.java | 4 +- .../music_cyclon/service/ProgressUpdater.java | 30 +++++--- .../main/res/layout/activity_synchronize.xml | 2 +- app/src/main/res/menu/menu_main.xml | 6 +- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 7 ++ app/src/main/res/values/style.xml | 2 +- app/src/main/res/xml/sync_config.xml | 12 ++-- 13 files changed, 143 insertions(+), 76 deletions(-) diff --git a/app/src/main/java/max/music_cyclon/RenameDialogFragment.java b/app/src/main/java/max/music_cyclon/RenameDialogFragment.java index 76feef7..8f5f90b 100644 --- a/app/src/main/java/max/music_cyclon/RenameDialogFragment.java +++ b/app/src/main/java/max/music_cyclon/RenameDialogFragment.java @@ -2,7 +2,6 @@ package max.music_cyclon; import android.app.Dialog; -import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; @@ -37,7 +36,7 @@ public class RenameDialogFragment extends DialogFragment { newName = new EditText(getActivity()); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) - .setTitle("Rename") + .setTitle(getActivity().getString(R.string.rename)) .setView(newName) .setPositiveButton(android.R.string.ok, new ApplyRename()) .setNegativeButton(android.R.string.cancel, STUB_CLICK); diff --git a/app/src/main/java/max/music_cyclon/SynchronizeActivity.java b/app/src/main/java/max/music_cyclon/SynchronizeActivity.java index f256da1..8a6145e 100644 --- a/app/src/main/java/max/music_cyclon/SynchronizeActivity.java +++ b/app/src/main/java/max/music_cyclon/SynchronizeActivity.java @@ -61,6 +61,8 @@ import max.music_cyclon.service.LibraryService; */ public class SynchronizeActivity extends AppCompatActivity { + public static final String DEFAULT_CONFIG_PATH = "configs.json"; + private PagerAdapter pagerAdapter; /** @@ -80,7 +82,9 @@ public class SynchronizeActivity extends AppCompatActivity { /** * Target we publish for clients to send messages to IncomingHandler. */ - private final Messenger mMessenger = new Messenger(new IncomingHandler(new WeakReference<>(this))); + private final Messenger mMessenger = new Messenger( + new IncomingHandler(new WeakReference<>(this)) + ); @Override protected void onCreate(Bundle savedInstanceState) { @@ -92,7 +96,7 @@ public class SynchronizeActivity extends AppCompatActivity { List configs = Collections.emptyList(); try { - FileInputStream in = openFileInput("configs.json"); + FileInputStream in = openFileInput(DEFAULT_CONFIG_PATH); configs = SynchronizeConfig.load(in); in.close(); } catch (IOException | JSONException e) { @@ -102,7 +106,7 @@ public class SynchronizeActivity extends AppCompatActivity { pagerAdapter = new PagerAdapter(configs, getSupportFragmentManager()); if (pagerAdapter.getCount() == 0) { - pagerAdapter.add("Default"); + pagerAdapter.add(getString(R.string.default_config_name)); } final ViewPager pager = (ViewPager) findViewById(R.id.container); @@ -176,7 +180,7 @@ public class SynchronizeActivity extends AppCompatActivity { unbindLibraryService(); try { - FileOutputStream fos = openFileOutput("configs.json", Context.MODE_PRIVATE); + FileOutputStream fos = openFileOutput(DEFAULT_CONFIG_PATH, Context.MODE_PRIVATE); getPagerAdapter().save(fos); fos.close(); } catch (IOException | JSONException e) { @@ -217,7 +221,7 @@ public class SynchronizeActivity extends AppCompatActivity { break; case R.id.action_sync: if (isServiceRunning(LibraryService.class)) { - Toast.makeText(this, "Already synchronizing!", Toast.LENGTH_LONG).show(); + Toast.makeText(this, R.string.already_synchronizing, Toast.LENGTH_LONG).show(); return false; } @@ -227,15 +231,18 @@ public class SynchronizeActivity extends AppCompatActivity { // Show sync control dialog syncProgress = new ProgressDialog(SynchronizeActivity.this); - syncProgress.setMessage("Synchronizing"); + syncProgress.setMessage(getString(R.string.synchronizing)); syncProgress.setCancelable(false); - syncProgress.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - syncProgress.show(); +// syncProgress.setButton( +// DialogInterface.BUTTON_NEGATIVE, +// getString(android.R.string.cancel), +// new DialogInterface.OnClickListener() { +// @Override +// public void onClick(DialogInterface dialog, int which) { +// dialog.dismiss(); +// } +// }); +// syncProgress.show(); return true; default: return super.onOptionsItemSelected(item); @@ -257,16 +264,21 @@ public class SynchronizeActivity extends AppCompatActivity { @Override public void handleMessage(Message msg) { + SynchronizeActivity activity = this.activity.get(); + if (activity == null) { + return; + } + switch (msg.what) { case LibraryService.MSG_FINISHED: - SynchronizeActivity activity = this.activity.get(); - if (activity != null) { - Dialog dialog = activity.getSyncProgress(); - if (dialog != null) { - dialog.dismiss(); - activity.clearSyncProgress(); - } + activity.unbindLibraryService(); + + Dialog dialog = activity.getSyncProgress(); + if (dialog != null) { + dialog.dismiss(); + activity.clearSyncProgress(); } + break; default: super.handleMessage(msg); @@ -301,17 +313,30 @@ public class SynchronizeActivity extends AppCompatActivity { private void startLibraryService() { Intent intent = new Intent(SynchronizeActivity.this, LibraryService.class); List configs = getPagerAdapter().getConfigs(); - intent.putExtra("configs", configs.toArray(new SynchronizeConfig[configs.size()])); + + // Update last updated + for (SynchronizeConfig config : configs) { + config.updateLastUpdated(); // fixme the result of LibraryService does not affect this (for example: Remote not available) + } + + intent.putExtra( + LibraryService.ARGUMENT_CONFIGS, + configs.toArray(new SynchronizeConfig[configs.size()]) + ); startService(intent); } private boolean isServiceRunning(Class serviceClass) { ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); - for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { + List services = + manager.getRunningServices(Integer.MAX_VALUE); + + for (ActivityManager.RunningServiceInfo service : services) { if (serviceClass.getName().equals(service.service.getClassName())) { return true; } } + return false; } diff --git a/app/src/main/java/max/music_cyclon/SynchronizeConfig.java b/app/src/main/java/max/music_cyclon/SynchronizeConfig.java index 9b52378..9558ee7 100644 --- a/app/src/main/java/max/music_cyclon/SynchronizeConfig.java +++ b/app/src/main/java/max/music_cyclon/SynchronizeConfig.java @@ -21,7 +21,16 @@ import java.util.Scanner; */ public class SynchronizeConfig implements Parcelable { - public static final Random RANDOM = new Random(); + private static final Random RANDOM = new Random(); + + private static final String ID_KEY = "id"; + private static final String SIZE_KEY = "size"; + private static final String RANDOM_KEY = "random"; + private static final String ALBUM_KEY = "use_albums"; + private static final String QUERY_KEY = "query"; + private static final String START_CHARGING_KEY = "start_charging"; + private static final String DOWNLOAD_INTERVAL_KEY = "download_interval"; + /** * The name of this config */ @@ -40,7 +49,7 @@ public class SynchronizeConfig implements Parcelable { public SynchronizeConfig(String name, long id) { this(name, new JSONObject()); try { - json.put("id", id); + json.put(ID_KEY, id); } catch (JSONException e) { throw new RuntimeException("Failed setting id!"); } @@ -52,7 +61,7 @@ public class SynchronizeConfig implements Parcelable { public long getID() { try { - return json.getLong("id"); + return json.getLong(ID_KEY); } catch (JSONException e) { throw new RuntimeException("Config has no id!"); } @@ -66,28 +75,41 @@ public class SynchronizeConfig implements Parcelable { this.name = name; } + public long getLastUpdated() { + return json.optLong("last_update", 0); + } + + public void updateLastUpdated() { + try { + json.put("last_update", System.currentTimeMillis()); + } catch (JSONException ignored) { + throw new RuntimeException("Failed to set last_update!"); + } + } + public int getSize(Resources resources) { - return json.optInt("size", resources.getInteger(R.integer.size)); + return json.optInt(SIZE_KEY, resources.getInteger(R.integer.size)); } public boolean isRandom(Resources resources) { - return json.optBoolean("size", resources.getBoolean(R.bool.random)); + return json.optBoolean(RANDOM_KEY, resources.getBoolean(R.bool.random)); } public boolean isAlbum(Resources resources) { - return json.optBoolean("use_albums", resources.getBoolean(R.bool.use_albums)); + return json.optBoolean(ALBUM_KEY, resources.getBoolean(R.bool.use_albums)); } public String getQuery(Resources resources) { - return json.optString("query", resources.getString(R.string.query)); + return json.optString(QUERY_KEY, resources.getString(R.string.query)); } public boolean isStartCharging(Resources resources) { - return json.optBoolean("start_charging", resources.getBoolean(R.bool.start_charging)); + return json.optBoolean(START_CHARGING_KEY, resources.getBoolean(R.bool.start_charging)); } public int getDownloadInterval(Resources resources) { - return json.optInt("download_interval", resources.getInteger(R.integer.download_interval)); + return json.optInt(DOWNLOAD_INTERVAL_KEY, + resources.getInteger(R.integer.download_interval)); } public JSONObject getJson() { @@ -105,19 +127,7 @@ public class SynchronizeConfig implements Parcelable { dest.writeString(json.toString()); } - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - public SynchronizeConfig createFromParcel(Parcel in) { - try { - return new SynchronizeConfig(in.readString(), new JSONObject(in.readString())); - } catch (JSONException e) { - return new SynchronizeConfig("none"); - } - } - - public SynchronizeConfig[] newArray(int size) { - return new SynchronizeConfig[size]; - } - }; + public static final Creator CREATOR = new SynchronizeConfigCreator(); public static List load(InputStream in) throws JSONException { String data = convertStreamToString(in); @@ -160,4 +170,17 @@ public class SynchronizeConfig implements Parcelable { return s.hasNext() ? s.next() : ""; } + private static class SynchronizeConfigCreator implements Creator { + public SynchronizeConfig createFromParcel(Parcel in) { + try { + return new SynchronizeConfig(in.readString(), new JSONObject(in.readString())); + } catch (JSONException e) { + return new SynchronizeConfig("none"); + } + } + + public SynchronizeConfig[] newArray(int size) { + return new SynchronizeConfig[size]; + } + } } diff --git a/app/src/main/java/max/music_cyclon/service/BeetsFetcher.java b/app/src/main/java/max/music_cyclon/service/BeetsFetcher.java index 557908c..ec6e3a4 100644 --- a/app/src/main/java/max/music_cyclon/service/BeetsFetcher.java +++ b/app/src/main/java/max/music_cyclon/service/BeetsFetcher.java @@ -142,7 +142,7 @@ public class BeetsFetcher { String tag = reader.nextName(); switch (tag) { case "id": - item.setId(reader.nextInt()); + item.setID(reader.nextInt()); break; case "path": item.setPath(reader.nextString()); diff --git a/app/src/main/java/max/music_cyclon/service/DownloadTask.java b/app/src/main/java/max/music_cyclon/service/DownloadTask.java index 308c8fe..70905f7 100644 --- a/app/src/main/java/max/music_cyclon/service/DownloadTask.java +++ b/app/src/main/java/max/music_cyclon/service/DownloadTask.java @@ -9,7 +9,6 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.net.URI; import java.util.concurrent.CountDownLatch; import java.util.zip.Adler32; @@ -22,18 +21,19 @@ import okhttp3.Response; public class DownloadTask implements Runnable { private final SynchronizeConfig config; - private final URI uri; + private final String url; private final String itemPath; private final FileTracker tracker; private final ProgressUpdater progressUpdater; private CountDownLatch itemsLeftLatch; + public static final OkHttpClient CLIENT = new OkHttpClient(); - public DownloadTask(SynchronizeConfig config, URI uri, String itemPath, + public DownloadTask(SynchronizeConfig config, String url, String itemPath, FileTracker tracker, ProgressUpdater progressUpdater) { this.config = config; - this.uri = uri; + this.url = url; this.itemPath = itemPath; this.tracker = tracker; @@ -41,13 +41,11 @@ public class DownloadTask implements Runnable { } private InputStream prepareConnection() throws IOException { - OkHttpClient client = new OkHttpClient(); - Request request = new Request.Builder() - .url(uri.toURL()) + .url(url) .build(); - Response response = client.newCall(request).execute(); + Response response = CLIENT.newCall(request).execute(); if (response.code() != 200) { Log.e("ERROR", "Server returned HTTP " + response.message()); diff --git a/app/src/main/java/max/music_cyclon/service/Item.java b/app/src/main/java/max/music_cyclon/service/Item.java index 99ad735..6d47458 100644 --- a/app/src/main/java/max/music_cyclon/service/Item.java +++ b/app/src/main/java/max/music_cyclon/service/Item.java @@ -5,11 +5,11 @@ public class Item { private int id; private String path; - public int getId() { + public int getID() { return id; } - public void setId(int id) { + public void setID(int id) { this.id = id; } diff --git a/app/src/main/java/max/music_cyclon/service/ProgressUpdater.java b/app/src/main/java/max/music_cyclon/service/ProgressUpdater.java index 03b2e07..192e16c 100644 --- a/app/src/main/java/max/music_cyclon/service/ProgressUpdater.java +++ b/app/src/main/java/max/music_cyclon/service/ProgressUpdater.java @@ -26,15 +26,28 @@ public class ProgressUpdater { this.notificationManager = NotificationManagerCompat.from(context); } - public void showMessage(String message, boolean persist, Object... args) { - showMessage(String.format(message, args), persist); + public void showMessage(String message, Object... args) { + showMessage(String.format(message, args)); } - public void showMessage(String message, boolean persist) { + public void showMessage(String message) { NotificationCompat.Builder builder = notificationBuilder(); builder.setContentTitle(message); - builder.setContentText(""); - builder.setProgress(0, 0, !persist); + + updateNotification(builder); + } + + public void showOngoingMessage(String message, Object... args) { + showOngoingMessage(String.format(message, args)); + } + + + public void showOngoingMessage(String message) { + NotificationCompat.Builder builder = notificationBuilder(); + builder.setContentTitle(message); + builder.setProgress(0, 0, true); + builder.setOngoing(true); + updateNotification(builder); } @@ -45,6 +58,7 @@ public class ProgressUpdater { builder.setContentTitle("Aktualisiere Musik"); builder.setContentText(downloadCount + "/" + maximum); builder.setProgress(maximum, downloadCount, false); + builder.setOngoing(true); updateNotification(builder); } @@ -52,13 +66,13 @@ public class ProgressUpdater { this.maximum = maximum; } - private void updateNotification(NotificationCompat.Builder builder) { + public void updateNotification(NotificationCompat.Builder builder) { notificationManager.notify(NOTIFICATION_ID, builder.build()); } - private NotificationCompat.Builder notificationBuilder() { + public NotificationCompat.Builder notificationBuilder() { return new NotificationCompat.Builder(context) - .setSmallIcon(R.mipmap.ic_launcher); + .setSmallIcon(R.drawable.ic_sync_white_24dp); } private NotificationCompat.Builder progressNotificationBuilder() { diff --git a/app/src/main/res/layout/activity_synchronize.xml b/app/src/main/res/layout/activity_synchronize.xml index dd5a9e3..02191fd 100644 --- a/app/src/main/res/layout/activity_synchronize.xml +++ b/app/src/main/res/layout/activity_synchronize.xml @@ -21,7 +21,7 @@ android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="#FF9800" /> + android:background="@color/colorPrimary" /> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 4f448ef..f91adee 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,4 +1,5 @@ #607D8B + #FF9800 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 40aad04..7eb7b29 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,4 +2,11 @@ music-cyclon Synchronizing Synchronize + Settings + Help + Version + Synchronizing + Already synchronizing! + Default + Rename diff --git a/app/src/main/res/values/style.xml b/app/src/main/res/values/style.xml index 29bfbdb..b416643 100644 --- a/app/src/main/res/values/style.xml +++ b/app/src/main/res/values/style.xml @@ -4,7 +4,7 @@