Merge branch 'release/v0.9.3'

This commit is contained in:
Jan Christian Grünhage 2017-01-19 00:45:03 +01:00
commit 4ba762107f
Signed by: jcgruenhage
GPG key ID: 321A67D9EE8BC3E1
14 changed files with 152 additions and 67 deletions

View file

@ -63,13 +63,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
@ -77,6 +70,13 @@
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />

View file

@ -77,6 +77,7 @@ public class CrashHandler implements Thread.UncaughtExceptionHandler {
logBuilder.append("----------- Exception ------------\n");
logBuilder.append(ex.getMessage()).append("\n");
logBuilder.append(ex.getClass().getCanonicalName()).append(" at \n");
// Log stack trace
for (StackTraceElement stackTraceElement : ex.getStackTrace())

View file

@ -33,8 +33,8 @@ android {
minSdkVersion 21
targetSdkVersion 25
// TODO Change Version with releases
versionCode 104
versionName '0.9.2'
versionCode 105
versionName '0.9.3'
vectorDrawables.useSupportLibrary = true
jackOptions {

View file

@ -13,13 +13,13 @@ import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.support.v7.app.ActionBar;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.MenuItem;
import android.support.v4.app.NavUtils;
import re.jcg.playmusicexporter.BuildConfig;
import re.jcg.playmusicexporter.R;
import re.jcg.playmusicexporter.services.ExportAllJob;
import re.jcg.playmusicexporter.services.ExportAllService;
import re.jcg.playmusicexporter.settings.PlayMusicExporterPreferences;
@ -40,6 +40,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
private static final String TAG = "MusicExporter_Settings";
private static final int REQUEST_CODE_OPEN_DOCUMENT_TREE_ALBA_PATH = 0;
private static final int REQUEST_CODE_OPEN_DOCUMENT_TREE_GROUPS_PATH = 1;
private static final int REQUEST_CODE_OPEN_DOCUMENT_TREE_AUTO_PATH = 2;
/**
* A preference value change listener that updates the preference's summary
* to reflect its new value.
@ -129,7 +130,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
// Remove the Debug Fragment
if (!BuildConfig.DEBUG) {
for (int i = 0; i < target.size(); i++) {
if ("Debug".equals(target.get(i).title)){
if ("Debug".equals(target.get(i).title)) {
target.remove(i);
break;
}
@ -214,11 +215,77 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
}
public static class AutomationPreferenceFragment extends PreferenceFragment {
/**
* Little helper method to get the context.
* If the Android version is high enough, the newer {@link PreferenceFragment#getContext()} is used,
* else, the older {@link PreferenceFragment#getActivity()}, since activities are contexts too.
*
* @return The context.
*/
@Override
public Context getContext() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return super.getContext();
} else {
return super.getActivity();
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_automation);
setHasOptionsMenu(true);
//Schedules an export with the current settings.
ExportAllJob.scheduleExport(getContext());
setupOnClickListeners();
}
private void setupOnClickListeners() {
findPreference(PlayMusicExporterPreferences.AUTO_EXPORT_PATH).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
startActivityForResult(new Intent("android.intent.action.OPEN_DOCUMENT_TREE"), REQUEST_CODE_OPEN_DOCUMENT_TREE_AUTO_PATH);
return true;
}
});
//For every setting that is used to define the export job, setup a listener that
setupRescheduler(PlayMusicExporterPreferences.AUTO_EXPORT_REQUIRE_CHARGING);
setupRescheduler(PlayMusicExporterPreferences.AUTO_EXPORT_REQUIRE_UNMETERED);
setupRescheduler(PlayMusicExporterPreferences.AUTO_EXPORT_ENABLED);
setupRescheduler(PlayMusicExporterPreferences.AUTO_EXPORT_FREQUENCY);
}
private void setupRescheduler(String preference) {
findPreference(preference).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
ExportAllJob.scheduleExport(getContext());
return false;
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
switch (requestCode) {
case REQUEST_CODE_OPEN_DOCUMENT_TREE_AUTO_PATH:
if (resultCode == RESULT_OK) {
Uri treeUri = resultData.getData();
PlayMusicExporterPreferences.init(getActivity());
PlayMusicExporterPreferences.setAutoExportPath(treeUri);
getActivity().getContentResolver().takePersistableUriPermission(treeUri,
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Log.i(TAG, "Selected " + treeUri.toString());
}
break;
default:
Log.i(TAG, "Received activityResult with unknown requestCode");
}
}
@Override

View file

@ -6,7 +6,6 @@ import android.app.job.JobScheduler;
import android.app.job.JobService;
import android.content.ComponentName;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import re.jcg.playmusicexporter.settings.PlayMusicExporterPreferences;
@ -15,17 +14,13 @@ public class ExportAllJob extends JobService {
public static final String TAG = "AutoGPME_ExportJob";
/**
* Schedules an export with the current settings
*
* @param pContext
*/
public static void scheduleExport(final Context pContext) {
PlayMusicExporterPreferences.init(pContext);
PlayMusicExporterPreferences.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.contains("auto")) {
scheduleExport(pContext);
Log.i(TAG, "Preference changed: " + key);
}
}
});
if (PlayMusicExporterPreferences.getAutoExportEnabled()) {
long lInterval = PlayMusicExporterPreferences.getAutoExportFrequency();
boolean lRequireUnmeteredNetwork = PlayMusicExporterPreferences.getAutoExportRequireUnmetered();

View file

@ -67,14 +67,25 @@ public class ExportAllService extends IntentService {
for (MusicTrack lTrack : lAlbum.getMusicTrackList()) {
if (lTrack.isOfflineAvailable()) {
String lPath = MusicPathBuilder.Build(lTrack, lExportStructure);
if (!isAlreadyThere(lUri, lPath)) {
if (lPlayMusicManager.exportMusicTrack(lTrack, lUri, lPath)) {
Log.i(TAG, "Exported Music Track: " + getStringForTrack(lTrack));
try {
if (!isAlreadyThere(lUri, lPath)) {
if (lPlayMusicManager.exportMusicTrack(lTrack, lUri, lPath)) {
Log.i(TAG, "Exported Music Track: " + getStringForTrack(lTrack));
} else {
Log.i(TAG, "Failed to export Music Track: " + getStringForTrack(lTrack));
}
} else {
Log.i(TAG, "Failed to export Music Track: " + getStringForTrack(lTrack));
Log.i(TAG, lPath + " already exists.");
}
} else {
Log.i(TAG, lPath + " already exists.");
} catch (IllegalArgumentException e) {
if (e.getMessage().contains("Invalid URI:")) {
/*
TODO: Make it impossible to reach this point
This happens when the user has not yet set the export path.
*/
Log.i(TAG, "Automatic export failed, because the URI is invalid.");
} else throw e;
}
}
}

View file

@ -12,40 +12,40 @@ import re.jcg.playmusicexporter.fragments.NavigationDrawerFragment;
public class PlayMusicExporterPreferences {
private static SharedPreferences preferences;
private static final String AUTO_EXPORT_ENABLED = "preference_auto_export_enabled";
private static final boolean AUTO_EXPORT_ENABLED_DEFAULT = false;
private static final String AUTO_EXPORT_USES_DIFFERENT_PATH = "preference_auto_export_use_different_path";
private static final boolean AUTO_EXPORT_USES_DIFFERENT_PATH_DEFAULT = false;
private static final String AUTO_EXPORT_USES_DIFFERENT_STRUCTURE = "preference_auto_export_use_different_structure";
private static final boolean AUTO_EXPORT_USES_DIFFERENT_STRUCTURE_DEFAULT = false;
private static final String AUTO_EXPORT_FREQUENCY = "preference_auto_export_frequency";
private static final String AUTO_EXPORT_FREQUENCY_DEFAULT = "86400000";
public static final String AUTO_EXPORT_ENABLED = "preference_auto_export_enabled";
public static final boolean AUTO_EXPORT_ENABLED_DEFAULT = false;
public static final String AUTO_EXPORT_USES_DIFFERENT_PATH = "preference_auto_export_use_different_path";
public static final boolean AUTO_EXPORT_USES_DIFFERENT_PATH_DEFAULT = false;
public static final String AUTO_EXPORT_USES_DIFFERENT_STRUCTURE = "preference_auto_export_use_different_structure";
public static final boolean AUTO_EXPORT_USES_DIFFERENT_STRUCTURE_DEFAULT = false;
public static final String AUTO_EXPORT_FREQUENCY = "preference_auto_export_frequency";
public static final String AUTO_EXPORT_FREQUENCY_DEFAULT = "86400000";
public static final String AUTO_EXPORT_REQUIRE_CHARGING = "preference_auto_export_require_charging";
public static final String AUTO_EXPORT_REQUIRE_UNMETERED = "preference_auto_export_require_unmetered";
public static final boolean AUTO_EXPORT_REQUIRE_CONDITION_DEFAULT = false;
private static final String AUTO_EXPORT_PATH = "preference_auto_export_path";
public static final String AUTO_EXPORT_PATH = "preference_auto_export_path";
//TODO Split Export Paths in export prefs, this won't work else.
private static final String ALBA_EXPORT_PATH = "preference_alba_export_path";
private static final String GROUPS_EXPORT_PATH = "preference_groups_export_path";
private static final String URI_DEFAULT = Uri.fromFile(
public static final String ALBA_EXPORT_PATH = "preference_alba_export_path";
public static final String GROUPS_EXPORT_PATH = "preference_groups_export_path";
public static final String URI_DEFAULT = Uri.fromFile(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)).toString();
private static final String AUTO_EXPORT_STRUCTURE = "preference_auto_export_structure";
private static final String ALBA_EXPORT_STRUCTURE = "preference_alba_export_structure";
private static final String GROUPS_EXPORT_STRUCTURE = "preference_groups_export_structure";
private static final String EXPORT_STRUCTURE_DEFAULT = "{album-artist}/{album}/{disc=CD $}/{no=$$.} {title}.mp3";
public static final String AUTO_EXPORT_STRUCTURE = "preference_auto_export_structure";
public static final String ALBA_EXPORT_STRUCTURE = "preference_alba_export_structure";
public static final String GROUPS_EXPORT_STRUCTURE = "preference_groups_export_structure";
public static final String EXPORT_STRUCTURE_DEFAULT = "{album-artist}/{album}/{disc=CD $}/{no=$$.} {title}.mp3";
private static final String EXPORT_ALBUM_ART_SIZE = "preference_id3_artwork_size";
private static final int EXPORT_ALBUM_ART_SIZE_DEFAULT = 512;
public static final String EXPORT_ALBUM_ART_SIZE = "preference_id3_artwork_size";
public static final int EXPORT_ALBUM_ART_SIZE_DEFAULT = 512;
private static final String DRAWER_LEARNED = "pref_drawer_learned";
private static final boolean DRAWER_LEARNED_DEFAULT = false;
private static final String DRAWER_SELECTED_TYPE = "pref_drawer_selected_type";
private static final String DRAWER_SELECTED_TYPE_DEFAULT = "Album";
public static final String DRAWER_LEARNED = "pref_drawer_learned";
public static final boolean DRAWER_LEARNED_DEFAULT = false;
public static final String DRAWER_SELECTED_TYPE = "pref_drawer_selected_type";
public static final String DRAWER_SELECTED_TYPE_DEFAULT = "Album";
private static final String SETUP_DONE = "preference_setup_done";
private static final boolean SETUP_DONE_DEFAULT = false;
public static final String SETUP_DONE = "preference_setup_done";
public static final boolean SETUP_DONE_DEFAULT = false;
private PlayMusicExporterPreferences() {
@ -150,6 +150,10 @@ public class PlayMusicExporterPreferences {
return preferences.getBoolean(AUTO_EXPORT_REQUIRE_CHARGING, AUTO_EXPORT_REQUIRE_CONDITION_DEFAULT);
}
public static void setAutoExportPath(Uri treeUri) {
preferences.edit().putString(AUTO_EXPORT_PATH, treeUri.toString()).apply();
}
public static boolean getSetupDone() {
return preferences.getBoolean(SETUP_DONE, SETUP_DONE_DEFAULT);
}

View file

@ -73,10 +73,10 @@
<string name="settings_donation_old_summery">Spende an David Schulte via PayPal</string>
<string name="settings_donation_old_title">Unterstützt den ursprünglichen Entwickler</string>
<string name="settings_export_structure_alba">Verzeichnisbaum für Alben</string>
<string name="settings_export_subdirectory_structure_album">Setze den Verzeichnisbaum</string>
<string name="settings_export_structure_alba_dialog_title">Setze den Verzeichnisbaum</string>
<string name="settings_export_subdirectory_structure_album_example">Beispiel: Beatles/Help!/13. Yesterday.mp3</string>
<string name="settings_export_subdirectory_structure_dialog_message">"Nutze / für einen neuen Order. Available Tags: - {album-artist} - {album} - {artist} - {title} - {disc=CD $} - {no=$$.} - {year} - {genre} "</string>
<string name="settings_export_subdirectory_structure_group">Setze den Verzeichnisbaum</string>
<string name="settings_export_structure_groups_dialog_title">Setze den Verzeichnisbaum</string>
<string name="settings_export_subdirectory_structure_group_example">Beispiel: Great Songs/4. Beatles - Yesterday.mp3</string>
<string name="settings_version_number">Versionsnummer</string>
<string name="debug_trigger_export_all_title">Jetzt den ExportAllService starten</string>
@ -100,4 +100,5 @@
<string name="settings_export_path_groups">Export Pfad für Playlists</string>
<string name="dialog_superuser_access_denied_title">Administrator-Zugriff verweigert</string>
<string name="dialog_superuser_access_denied">Der Play Music Exporter benötigt Administrator Rechte, ohne diese Rechte kann die App nicht genutzt werden.</string>
<string name="settings_auto_export_different_structure_dialog_title">Verzeichnisbaum</string>
</resources>

View file

@ -89,6 +89,7 @@
<string name="settings_auto_export_different_structure_switch">Use a different subdirectory structure</string>
<string name="settings_auto_export_different_structure_switch_summary">Off means that the automatic export uses the same subdirectory structure as albums.</string>
<string name="settings_auto_export_different_structure">Subdirectory structure</string>
<string name="settings_auto_export_different_structure_dialog_title">Subdirectory structure</string>
<string name="settings_category_export_location">Export Location</string>
<string name="settings_export_path">Export Base Path</string>
@ -97,12 +98,12 @@
<string name="settings_export_path_alba">Export path for albums</string>
<string name="settings_export_structure_alba">Subdirectory structure for albums</string>
<string name="settings_export_subdirectory_structure_album">Set your subdirectory structure</string>
<string name="settings_export_structure_alba_dialog_title">Set your subdirectory structure</string>
<string name="settings_export_subdirectory_structure_album_example">Example: Beatles/Help!/13. Yesterday.mp3</string>
<string name="settings_export_path_groups">Export path for groups</string>
<string name="settings_export_structure_groups">Subdirectory structure for playlists</string>
<string name="settings_export_subdirectory_structure_group">Set your subdirectory structure</string>
<string name="settings_export_structure_groups_dialog_title">Set your subdirectory structure</string>
<string name="settings_export_subdirectory_structure_group_example">Example: Great Songs/4. Beatles - Yesterday.mp3</string>
<string name="settings_export_id3">ID3 Tags</string>

View file

@ -50,7 +50,7 @@
<!-- TODO change Version number and build date with releases -->
<!-- Version number-->
<Preference
android:summary="0.9.2"
android:summary="0.9.3"
android:title="@string/settings_version_number" />
<!-- Build date-->
<Preference

View file

@ -20,8 +20,13 @@
android:key="preference_auto_export_use_different_structure"
android:summary="@string/settings_auto_export_different_structure_switch_summary"
android:title="@string/settings_auto_export_different_structure_switch" />
<Preference
<EditTextPreference
android:defaultValue="@string/settings_export_structure_alba_default_value"
android:dialogMessage="@string/settings_export_subdirectory_structure_dialog_message"
android:dialogTitle="@string/settings_auto_export_different_structure_dialog_title"
android:hint="@string/settings_export_structure_alba_default_value"
android:key="preference_auto_export_structure"
android:summary="@string/settings_export_subdirectory_structure_album_example"
android:title="@string/settings_auto_export_different_structure" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/settings_category_auto_export_conditions">

View file

@ -9,7 +9,7 @@
<EditTextPreference
android:defaultValue="@string/settings_export_structure_alba_default_value"
android:dialogMessage="@string/settings_export_subdirectory_structure_dialog_message"
android:dialogTitle="@string/settings_export_subdirectory_structure_album"
android:dialogTitle="@string/settings_export_structure_alba_dialog_title"
android:hint="@string/settings_export_structure_alba_default_value"
android:key="preference_alba_export_structure"
android:summary="@string/settings_export_subdirectory_structure_album_example"
@ -25,7 +25,7 @@
<EditTextPreference
android:defaultValue="@string/settings_export_structure_groups_default_value"
android:dialogMessage="@string/settings_export_subdirectory_structure_dialog_message"
android:dialogTitle="@string/settings_export_subdirectory_structure_group"
android:dialogTitle="@string/settings_export_structure_groups_dialog_title"
android:hint="@string/settings_export_structure_groups_default_value"
android:key="preference_groups_export_structure"
android:summary="@string/settings_export_subdirectory_structure_group_example"

View file

@ -63,13 +63,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
@ -77,6 +70,13 @@
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />

View file

@ -538,7 +538,7 @@ public class PlayMusicManager {
// Creates the subdirectories
String[] directories = path.split("\\/");
for(int i=0; i<directories.length - 1; i++) {
String directoryName = directories[i];
String directoryName = directories[i];
boolean found = false;
// Search all sub elements