From 517186d6d3dd2dddd7b3f502dc9e3ae55708c239 Mon Sep 17 00:00:00 2001 From: Max Ammann Date: Mon, 13 Jun 2016 21:35:21 +0200 Subject: [PATCH] Added documentation, --- app/build.gradle | 8 +- .../iosched/ui/widget}/SlidingTabLayout.java | 5 +- .../iosched/ui/widget}/SlidingTabStrip.java | 2 +- .../music_cyclon/MainPreferenceActivity.java | 21 ++- .../java/max/music_cyclon/PagerAdapter.java | 16 +- .../max/music_cyclon/SynchronizeActivity.java | 173 +++++++++++------- .../{Config.java => SynchronizeConfig.java} | 40 ++-- .../SynchronizeConfigFragment.java | 45 +++-- .../music_cyclon/service/LibraryService.java | 9 +- app/src/main/res/xml/sync_config.xml | 43 ++--- 10 files changed, 221 insertions(+), 141 deletions(-) rename app/src/main/java/{max/music_cyclon/slidingtab => com/google/samples/apps/iosched/ui/widget}/SlidingTabLayout.java (98%) rename app/src/main/java/{max/music_cyclon/slidingtab => com/google/samples/apps/iosched/ui/widget}/SlidingTabStrip.java (99%) rename app/src/main/java/max/music_cyclon/{Config.java => SynchronizeConfig.java} (66%) diff --git a/app/build.gradle b/app/build.gradle index f49b3b2..d5a298e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 23 - buildToolsVersion "22.0.1" + buildToolsVersion "23.0.3" defaultConfig { applicationId "max.music_cyclon" @@ -21,8 +21,10 @@ dependencies { compile "cz.msebera.android:httpclient:4.4.1.2" compile 'commons-io:commons-io:2.4' -// compile 'com.android.support:appcompat-v7:23.4.0' -// compile 'com.android.support:preference-v14:23.4.0' +// compile 'com.android.support:appcompat-v7:23.4.0' +// and +// compile 'com.android.support:preference-v14:23.4.0' +// are provided by: compile 'com.takisoft.fix:preference-v7:23.4.0.4' compile 'com.android.support:appcompat-v7:23.4.0' diff --git a/app/src/main/java/max/music_cyclon/slidingtab/SlidingTabLayout.java b/app/src/main/java/com/google/samples/apps/iosched/ui/widget/SlidingTabLayout.java similarity index 98% rename from app/src/main/java/max/music_cyclon/slidingtab/SlidingTabLayout.java rename to app/src/main/java/com/google/samples/apps/iosched/ui/widget/SlidingTabLayout.java index 5e12996..af08f60 100644 --- a/app/src/main/java/max/music_cyclon/slidingtab/SlidingTabLayout.java +++ b/app/src/main/java/com/google/samples/apps/iosched/ui/widget/SlidingTabLayout.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package max.music_cyclon.slidingtab; +package com.google.samples.apps.iosched.ui.widget; import android.content.Context; import android.graphics.Typeface; @@ -311,9 +311,6 @@ public class SlidingTabLayout extends HorizontalScrollView { public void onClick(View v) { for (int i = 0; i < mTabStrip.getChildCount(); i++) { if (v == mTabStrip.getChildAt(i)) { - if (mViewPager.getChildAt(i) == null) { - continue; - } mViewPager.setCurrentItem(i); return; } diff --git a/app/src/main/java/max/music_cyclon/slidingtab/SlidingTabStrip.java b/app/src/main/java/com/google/samples/apps/iosched/ui/widget/SlidingTabStrip.java similarity index 99% rename from app/src/main/java/max/music_cyclon/slidingtab/SlidingTabStrip.java rename to app/src/main/java/com/google/samples/apps/iosched/ui/widget/SlidingTabStrip.java index 0683c9c..895841f 100644 --- a/app/src/main/java/max/music_cyclon/slidingtab/SlidingTabStrip.java +++ b/app/src/main/java/com/google/samples/apps/iosched/ui/widget/SlidingTabStrip.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package max.music_cyclon.slidingtab; +package com.google.samples.apps.iosched.ui.widget; import android.content.Context; import android.graphics.Canvas; diff --git a/app/src/main/java/max/music_cyclon/MainPreferenceActivity.java b/app/src/main/java/max/music_cyclon/MainPreferenceActivity.java index 78c3c18..198e086 100644 --- a/app/src/main/java/max/music_cyclon/MainPreferenceActivity.java +++ b/app/src/main/java/max/music_cyclon/MainPreferenceActivity.java @@ -1,15 +1,16 @@ package max.music_cyclon; -import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v14.preference.PreferenceFragment; +import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.MenuItem; -import com.takisoft.fix.support.v7.preference.PreferenceFragmentCompat; - +/** + * The activity to set general activities + */ public class MainPreferenceActivity extends AppCompatActivity { @Override @@ -17,17 +18,21 @@ public class MainPreferenceActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_preference); Toolbar toolbar = (Toolbar) findViewById(R.id.preference_toolbar); - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); + ActionBar actionBar = getSupportActionBar(); + assert actionBar != null; + actionBar.setDisplayHomeAsUpEnabled(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { - Intent myIntent = new Intent(getApplicationContext(), SynchronizeActivity.class); - startActivityForResult(myIntent, 0); - return true; + if (item.getItemId() == android.R.id.home) { + Intent myIntent = new Intent(getApplicationContext(), SynchronizeActivity.class); + startActivityForResult(myIntent, 0); + return true; + } + return false; } public static class MainPreferenceFragment extends PreferenceFragment { diff --git a/app/src/main/java/max/music_cyclon/PagerAdapter.java b/app/src/main/java/max/music_cyclon/PagerAdapter.java index 9c95323..073c696 100644 --- a/app/src/main/java/max/music_cyclon/PagerAdapter.java +++ b/app/src/main/java/max/music_cyclon/PagerAdapter.java @@ -13,29 +13,31 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +/** + * Holds the fragments for the configuration of all {@link SynchronizeConfig}s + */ public class PagerAdapter extends FragmentStatePagerAdapter { - private final List configs = new ArrayList<>(); - private final Map configData = new HashMap<>(); + private final Map configData = new HashMap<>(); - public PagerAdapter(List configs , FragmentManager fm) { + public PagerAdapter(List configs , FragmentManager fm) { super(fm); - for (Config config : configs) { + for (SynchronizeConfig config : configs) { this.configs.add(config.getName()); this.configData.put(config.getName(), config); } } public void save(OutputStream os) throws JSONException, IOException { - Config.save(configData.values(), os); + SynchronizeConfig.save(configData.values(), os); } public boolean add(String name) { - configData.put(name, new Config(name)); + configData.put(name, new SynchronizeConfig(name)); return configs.add(name); } @@ -71,7 +73,7 @@ public class PagerAdapter extends FragmentStatePagerAdapter { return configs; } - public List getConfigData() { + public List getConfigData() { return new ArrayList<>(configData.values()); } diff --git a/app/src/main/java/max/music_cyclon/SynchronizeActivity.java b/app/src/main/java/max/music_cyclon/SynchronizeActivity.java index d196069..42a28b8 100644 --- a/app/src/main/java/max/music_cyclon/SynchronizeActivity.java +++ b/app/src/main/java/max/music_cyclon/SynchronizeActivity.java @@ -2,6 +2,7 @@ package max.music_cyclon; import android.Manifest; +import android.app.Dialog; import android.app.ProgressDialog; import android.content.ComponentName; import android.content.Context; @@ -19,39 +20,64 @@ import android.os.RemoteException; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewPager; +import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import com.google.samples.apps.iosched.ui.widget.SlidingTabLayout; + import org.json.JSONException; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.lang.ref.WeakReference; import java.util.Collections; import java.util.List; import java.util.UUID; import max.music_cyclon.service.LibraryService; -import max.music_cyclon.slidingtab.SlidingTabLayout; - +/** + * The main activity for synchronisation + *

+ * This class manages: + *

    + *
  • + * the {@link PagerAdapter} with the references to all configs and their loading and saving. + *
  • + *
  • the link to the {@link LibraryService} with bi-directional message dispatching
  • + *
  • the general layout
  • + *
  • permission requests
  • + *
+ * + */ public class SynchronizeActivity extends AppCompatActivity { private PagerAdapter pagerAdapter; - /** Messenger for communicating with service. */ - Messenger mService = null; - /** Flag indicating whether we have called bind on the service. */ - private boolean mIsBound; + /** + * Messenger for communicating with service. + */ + private Messenger serviceObject = null; + /** + * Flag indicating whether we have called bind on the service. + */ + private boolean isBound; + + /** + * The dialog which is being displayed while a sync is in progress + */ + private ProgressDialog syncProgress = null; /** * Target we publish for clients to send messages to IncomingHandler. */ - private final Messenger mMessenger = new Messenger(new IncomingHandler()); - private ProgressDialog syncProgress; + private final Messenger mMessenger = new Messenger(new IncomingHandler(new WeakReference<>(this))); @Override protected void onCreate(Bundle savedInstanceState) { @@ -61,15 +87,13 @@ public class SynchronizeActivity extends AppCompatActivity { Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar); setSupportActionBar(toolbar); - List configs = Collections.emptyList(); + List configs = Collections.emptyList(); try { FileInputStream in = openFileInput("configs.json"); - configs = Config.load(in); + configs = SynchronizeConfig.load(in); in.close(); - } catch (IOException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); + } catch (IOException | JSONException e) { + Log.e("CONFIG", "Failed loading the config", e); } pagerAdapter = new PagerAdapter(configs, getSupportFragmentManager()); @@ -83,11 +107,12 @@ public class SynchronizeActivity extends AppCompatActivity { // Initialize tabs final SlidingTabLayout tabs = (SlidingTabLayout) findViewById(R.id.tabs); assert tabs != null; + tabs.setDistributeEvenly(true); tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() { @Override public int getIndicatorColor(int position) { - return getResources().getColor(R.color.accentColor); + return ContextCompat.getColor(SynchronizeActivity.this, R.color.accentColor); } }); @@ -111,37 +136,31 @@ public class SynchronizeActivity extends AppCompatActivity { } }); - if (ContextCompat.checkSelfPermission(this, - Manifest.permission.WRITE_EXTERNAL_STORAGE) + // Request permissions + requestPermissions(); + } + + private void requestPermissions() { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - - // Should we show an explanation? - if (ActivityCompat.shouldShowRequestPermissionRationale(this, - Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - - // Show an expanation to the user *asynchronously* -- don't block - // this thread waiting for the user's response! After the user - // sees the explanation, try again to request the permission. - - } else { - ActivityCompat.requestPermissions(this, - new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, - 0); - } + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, + 0); } } @Override protected void onStop() { super.onStop(); + + unbindLibraryService(); + try { FileOutputStream fos = openFileOutput("configs.json", Context.MODE_PRIVATE); getPagerAdapter().save(fos); fos.close(); - } catch (IOException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); + } catch (IOException | JSONException e) { + Log.e("CONFIG", "Failed saving the config", e); } } @@ -149,6 +168,14 @@ public class SynchronizeActivity extends AppCompatActivity { return pagerAdapter; } + public Dialog getSyncProgress() { + return syncProgress; + } + + public void clearSyncProgress() { + syncProgress = null; + } + @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); @@ -162,15 +189,18 @@ public class SynchronizeActivity extends AppCompatActivity { Intent preferenceIntent = new Intent(this, MainPreferenceActivity.class); startActivity(preferenceIntent); return true; - + case R.id.action_version: + notYetImplemented(this); + break; + case R.id.action_help: + notYetImplemented(this); + break; case R.id.action_sync: - Intent intent = new Intent(SynchronizeActivity.this, LibraryService.class); - List configs = getPagerAdapter().getConfigData(); - intent.putExtra("configs", configs.toArray(new Config[configs.size()])); - SynchronizeActivity.this.startService(intent); + startLibraryService(); - doBindService(); + bindLibraryService(); + // Show sync control dialog syncProgress = new ProgressDialog(SynchronizeActivity.this); syncProgress.setMessage("Synchronizing"); syncProgress.setCancelable(false); @@ -182,19 +212,36 @@ public class SynchronizeActivity extends AppCompatActivity { }); syncProgress.show(); return true; - default: return super.onOptionsItemSelected(item); - } + + return false; } - private class IncomingHandler extends Handler { + public static void notYetImplemented(Context context) { + new AlertDialog.Builder(context).setMessage("Not yet implemented!").show(); + } + + private static class IncomingHandler extends Handler { + private final WeakReference activity; + + private IncomingHandler(WeakReference activity) { + this.activity = activity; + } + @Override public void handleMessage(Message msg) { switch (msg.what) { case LibraryService.MSG_FINISHED: - syncProgress.dismiss(); + SynchronizeActivity activity = this.activity.get(); + if (activity != null) { + Dialog dialog = activity.getSyncProgress(); + if (dialog != null) { + dialog.dismiss(); + activity.clearSyncProgress(); + } + } break; default: super.handleMessage(msg); @@ -207,12 +254,12 @@ public class SynchronizeActivity extends AppCompatActivity { */ private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { - mService = new Messenger(service); + serviceObject = new Messenger(service); try { Message msg = Message.obtain(null, LibraryService.MSG_REGISTER_CLIENT); msg.replyTo = mMessenger; - mService.send(msg); + serviceObject.send(msg); } catch (RemoteException ignored) { // In this case the service has crashed before we could even // do anything with it; we can count on soon being @@ -222,37 +269,39 @@ public class SynchronizeActivity extends AppCompatActivity { } public void onServiceDisconnected(ComponentName className) { - mService = null; + serviceObject = null; } }; - void doBindService() { + private void startLibraryService() { + Intent intent = new Intent(SynchronizeActivity.this, LibraryService.class); + List configs = getPagerAdapter().getConfigData(); + intent.putExtra("configs", configs.toArray(new SynchronizeConfig[configs.size()])); + SynchronizeActivity.this.startService(intent); + } + + private void bindLibraryService() { bindService(new Intent( SynchronizeActivity.this, LibraryService.class ), mConnection, Context.BIND_AUTO_CREATE); - mIsBound = true; + isBound = true; } - void doUnbindService() { - if (mIsBound) { - // If we have received the service, and hence registered with - // it, then now is the time to unregister. - if (mService != null) { + private void unbindLibraryService() { + if (isBound) { + if (serviceObject != null) { try { - Message msg = Message.obtain(null, - LibraryService.MSG_UNREGISTER_CLIENT); + Message msg = Message.obtain(null, LibraryService.MSG_UNREGISTER_CLIENT); msg.replyTo = mMessenger; - mService.send(msg); - } catch (RemoteException e) { - // There is nothing special we need to do if the service - // has crashed. + serviceObject.send(msg); + } catch (RemoteException ignored) { } } // Detach our existing connection. unbindService(mConnection); - mIsBound = false; + isBound = false; } } } diff --git a/app/src/main/java/max/music_cyclon/Config.java b/app/src/main/java/max/music_cyclon/SynchronizeConfig.java similarity index 66% rename from app/src/main/java/max/music_cyclon/Config.java rename to app/src/main/java/max/music_cyclon/SynchronizeConfig.java index 1348048..2612dc4 100644 --- a/app/src/main/java/max/music_cyclon/Config.java +++ b/app/src/main/java/max/music_cyclon/SynchronizeConfig.java @@ -15,17 +15,27 @@ import java.util.Iterator; import java.util.List; import java.util.Scanner; -public class Config implements Parcelable { +/** + * A synchronize config which holds the information which tracks/albums should be queried + */ +public class SynchronizeConfig implements Parcelable { + /** + * The name of this config + */ private final String name; + + /** + * The data structure + */ private final JSONObject json; - public Config(String name, JSONObject json) { + public SynchronizeConfig(String name, JSONObject json) { this.name = name; this.json = json; } - public Config(String name) { + public SynchronizeConfig(String name) { this(name, new JSONObject()); } @@ -72,43 +82,43 @@ public class Config implements Parcelable { dest.writeString(json.toString()); } - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - public Config createFromParcel(Parcel in) { + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public SynchronizeConfig createFromParcel(Parcel in) { try { - return new Config(in.readString(), new JSONObject(in.readString())); + return new SynchronizeConfig(in.readString(), new JSONObject(in.readString())); } catch (JSONException e) { - return new Config("none"); + return new SynchronizeConfig("none"); } } - public Config[] newArray(int size) { - return new Config[size]; + public SynchronizeConfig[] newArray(int size) { + return new SynchronizeConfig[size]; } }; - public static List load(InputStream in) throws JSONException { + public static List load(InputStream in) throws JSONException { String data = convertStreamToString(in); return load(data); } - public static List load(String data) throws JSONException { + public static List load(String data) throws JSONException { JSONObject jsonConfigs = new JSONObject(data); - ArrayList configs = new ArrayList<>(); + ArrayList configs = new ArrayList<>(); Iterator keys = jsonConfigs.keys(); while (keys.hasNext()) { String key = (String) keys.next(); - configs.add(new Config(key, jsonConfigs.getJSONObject(key))); + configs.add(new SynchronizeConfig(key, jsonConfigs.getJSONObject(key))); } return configs; } - public static void save(Iterable configs, OutputStream fos) throws JSONException, IOException { + public static void save(Iterable configs, OutputStream fos) throws JSONException, IOException { JSONObject jsonConfigs = new JSONObject(); - for (Config config : configs) { + for (SynchronizeConfig config : configs) { jsonConfigs.put(config.getName(), config.getJson()); } diff --git a/app/src/main/java/max/music_cyclon/SynchronizeConfigFragment.java b/app/src/main/java/max/music_cyclon/SynchronizeConfigFragment.java index 609734c..a1811e1 100644 --- a/app/src/main/java/max/music_cyclon/SynchronizeConfigFragment.java +++ b/app/src/main/java/max/music_cyclon/SynchronizeConfigFragment.java @@ -2,18 +2,24 @@ package max.music_cyclon; import android.os.Bundle; import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.TwoStatePreference; import com.takisoft.fix.support.v7.preference.EditTextPreference; import com.takisoft.fix.support.v7.preference.PreferenceFragmentCompat; import org.json.JSONException; +import org.json.JSONObject; +/** + * A fragment which holds one {@link SynchronizeConfig} and displays it's content for + * simple editing. + */ public class SynchronizeConfigFragment extends PreferenceFragmentCompat { private String name; private PagerAdapter pagerAdapter; - private Config config; + private SynchronizeConfig config; @Override public void onCreate(final Bundle savedInstanceState) { @@ -24,19 +30,26 @@ public class SynchronizeConfigFragment extends PreferenceFragmentCompat { ConfigUpdater updater = new ConfigUpdater(); - for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) { - Preference preference = getPreferenceScreen().getPreference(i); - if (config.getJson().has(preference.getKey())) { + JSONObject json = config.getJson(); + + PreferenceScreen screen = getPreferenceScreen(); + for (int i = 0; i < screen.getPreferenceCount(); i++) { + Preference preference = screen.getPreference(i); + + if (json.has(preference.getKey())) { if (preference instanceof TwoStatePreference) { - ((TwoStatePreference) preference).setChecked(config.getJson().optBoolean(preference.getKey())); + boolean data = json.optBoolean(preference.getKey()); + ((TwoStatePreference) preference).setChecked(data); } else if (preference instanceof EditTextPreference) { - ((EditTextPreference) preference).setText(config.getJson().optString(preference.getKey())); + String data = json.optString(preference.getKey()); + ((EditTextPreference) preference).setText(data); } } preference.setOnPreferenceChangeListener(updater); } + // The remove listener Preference removePreference = findPreference("remove"); removePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override @@ -64,7 +77,6 @@ public class SynchronizeConfigFragment extends PreferenceFragmentCompat { return name; } - public PagerAdapter getPagerAdapter() { return pagerAdapter; } @@ -73,21 +85,26 @@ public class SynchronizeConfigFragment extends PreferenceFragmentCompat { this.pagerAdapter = pagerAdapter; } - public void setConfig(Config config) { + public void setConfig(SynchronizeConfig config) { this.config = config; } + public SynchronizeConfig getConfig() { + return config; + } + private class ConfigUpdater implements Preference.OnPreferenceChangeListener { @Override public boolean onPreferenceChange(Preference preference, Object o) { String key = preference.getKey(); - try { - config.getJson().put(key, o); - } catch (JSONException e) { - e.printStackTrace(); - } + JSONObject config = getConfig().getJson(); - return true; + try { + config.put(key, o); + return true; + } catch (JSONException e) { + return false; + } } } } diff --git a/app/src/main/java/max/music_cyclon/service/LibraryService.java b/app/src/main/java/max/music_cyclon/service/LibraryService.java index bf67985..3d1d308 100644 --- a/app/src/main/java/max/music_cyclon/service/LibraryService.java +++ b/app/src/main/java/max/music_cyclon/service/LibraryService.java @@ -24,10 +24,7 @@ import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.Array; import java.net.MalformedURLException; -import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; @@ -43,7 +40,7 @@ import cz.msebera.android.httpclient.client.methods.CloseableHttpResponse; import cz.msebera.android.httpclient.client.methods.HttpGet; import cz.msebera.android.httpclient.impl.client.CloseableHttpClient; import cz.msebera.android.httpclient.impl.client.HttpClients; -import max.music_cyclon.Config; +import max.music_cyclon.SynchronizeConfig; import max.music_cyclon.service.db.FileTracker; public class LibraryService extends IntentService { @@ -90,7 +87,7 @@ public class LibraryService extends IntentService { super("max.music_cyclon.service.LibraryService"); } - public List fetchRandom(String address, Config config, Resources resources) throws IOException { + public List fetchRandom(String address, SynchronizeConfig config, Resources resources) throws IOException { StringBuilder get; if (config.isAlbum(resources)) { @@ -249,7 +246,7 @@ public class LibraryService extends IntentService { } for (Parcelable parcelable : configs) { - Config config = (Config) parcelable; + SynchronizeConfig config = (SynchronizeConfig) parcelable; List items; try { updater.showMessage("Fetching music information for %s", config.getName()); diff --git a/app/src/main/res/xml/sync_config.xml b/app/src/main/res/xml/sync_config.xml index cc761e4..277e005 100644 --- a/app/src/main/res/xml/sync_config.xml +++ b/app/src/main/res/xml/sync_config.xml @@ -1,55 +1,56 @@ - + + android:persistent="false" + android:summary="The amount of tracks or albums to download" + android:title="Number of items" /> - - - - - + + + + + + android:persistent="false" + android:summary="Whether you want only complete albums" + android:title="Albums" /> + android:persistent="false" + android:summary="The search term you want to use in this configuration" + android:title="Query" /> + android:persistent="false" + android:title="Remove this config" /> + \ No newline at end of file