From 77840bea99c206a593b14f2683e0d520d2274c91 Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Sun, 11 Jan 2015 18:45:53 -0500 Subject: Updated QueueFragment to have a refresh button. Issue #595 Also resolved an issue that may have been latent when 'All Episodes' was default. Namely, that the search and other option menus didn't show up until you navigated away and then back to the fragment. This was happening because the items weren't loaded yet, which prevented the options menu from being created. If we switch back to 'All Episodes' as being default, this problem may appear again. --- .../danoeh/antennapod/fragment/QueueFragment.java | 50 ++++++++++++++++++++++ app/src/main/res/menu/queue.xml | 13 ++++++ 2 files changed, 63 insertions(+) create mode 100644 app/src/main/res/menu/queue.xml diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index ce77229d9..0c794fc44 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -3,6 +3,7 @@ package de.danoeh.antennapod.fragment; import android.app.Activity; import android.content.Context; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; @@ -30,11 +31,15 @@ import de.danoeh.antennapod.adapter.DefaultActionButtonCallback; import de.danoeh.antennapod.adapter.QueueListAdapter; import de.danoeh.antennapod.core.asynctask.DownloadObserver; import de.danoeh.antennapod.core.feed.EventDistributor; +import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; +import de.danoeh.antennapod.core.storage.DownloadRequester; import de.danoeh.antennapod.menuhandler.MenuItemUtils; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; @@ -57,6 +62,7 @@ public class QueueFragment extends Fragment { private boolean itemsLoaded = false; private boolean viewsCreated = false; + private boolean isUpdatingFeeds = false; private AtomicReference activity = new AtomicReference(); @@ -125,10 +131,19 @@ public class QueueFragment extends Fragment { resetViewState(); } + private final MenuItemUtils.UpdateRefreshMenuItemChecker updateRefreshMenuItemChecker = new MenuItemUtils.UpdateRefreshMenuItemChecker() { + @Override + public boolean isRefreshing() { + return DownloadService.isRunning && DownloadRequester.getInstance().isDownloadingFeeds(); + } + }; + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); if (itemsLoaded && !MenuItemUtils.isActivityDrawerOpen((NavDrawerActivity) getActivity())) { + inflater.inflate(R.menu.queue, menu); + final SearchView sv = new SearchView(getActivity()); MenuItemUtils.addSearchItem(menu, sv); sv.setQueryHint(getString(R.string.search_hint)); @@ -145,7 +160,27 @@ public class QueueFragment extends Fragment { return false; } }); + isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (!super.onOptionsItemSelected(item)) { + switch (item.getItemId()) { + case R.id.refresh_item: + List feeds = ((MainActivity) getActivity()).getFeeds(); + if (feeds != null) { + DBTasks.refreshAllFeeds(getActivity(), feeds); + } + return true; + default: + return false; + } + } else { + return true; } + } @Override @@ -258,6 +293,18 @@ public class QueueFragment extends Fragment { downloadObserver.onResume(); } listAdapter.notifyDataSetChanged(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + // we need to refresh the options menu because it sometimes + // needs data that may have just been loaded. + // Things will still work on APIs lower than honeycomb + // but they may have to change away from this view + // and then back to get the options menu. + Activity theActivity = activity.get(); + if (theActivity != null) { + theActivity.invalidateOptionsMenu(); + } + } } private DownloadObserver.Callback downloadObserverCallback = new DownloadObserver.Callback() { @@ -307,6 +354,9 @@ public class QueueFragment extends Fragment { public void update(EventDistributor eventDistributor, Integer arg) { if ((arg & EVENTS) != 0) { startItemLoader(); + if (isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) { + getActivity().supportInvalidateOptionsMenu(); + } } } }; diff --git a/app/src/main/res/menu/queue.xml b/app/src/main/res/menu/queue.xml new file mode 100644 index 000000000..0f06ea952 --- /dev/null +++ b/app/src/main/res/menu/queue.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file -- cgit v1.2.3 From 86e5e9ea1373980576f76ad1abf676a4c9911fac Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Sun, 11 Jan 2015 18:53:11 -0500 Subject: Simlified invalidation of options menu. #595 --- .../java/de/danoeh/antennapod/fragment/QueueFragment.java | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index 0c794fc44..302739b6a 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -294,17 +294,9 @@ public class QueueFragment extends Fragment { } listAdapter.notifyDataSetChanged(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - // we need to refresh the options menu because it sometimes - // needs data that may have just been loaded. - // Things will still work on APIs lower than honeycomb - // but they may have to change away from this view - // and then back to get the options menu. - Activity theActivity = activity.get(); - if (theActivity != null) { - theActivity.invalidateOptionsMenu(); - } - } + // we need to refresh the options menu because it sometimes + // needs data that may have just been loaded. + getActivity().supportInvalidateOptionsMenu(); } private DownloadObserver.Callback downloadObserverCallback = new DownloadObserver.Callback() { -- cgit v1.2.3 From 2d68f025d7429103e702c3ba4e15b0529573aa02 Mon Sep 17 00:00:00 2001 From: Tim Butram Date: Tue, 26 Aug 2014 21:18:00 -0400 Subject: Added option to delete epidode upon completion of playback. Conflicts: app/dslv --- app/src/main/res/xml/preferences.xml | 6 ++++++ .../danoeh/antennapod/core/service/playback/PlaybackService.java | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 5175acdcb..dedfb74c3 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -35,6 +35,12 @@ android:key="prefFollowQueue" android:summary="@string/pref_followQueue_sum" android:title="@string/pref_followQueue_title"/> + Date: Sun, 18 Jan 2015 19:53:53 -0500 Subject: Option to delete episode after playback Fixes #498 --- app/src/main/res/xml/preferences.xml | 6 +++--- core/src/main/res/values/strings.xml | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index dedfb74c3..a5887e205 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -39,13 +39,13 @@ android:defaultValue="false" android:enabled="true" android:key="prefAutoDelete" - android:summary="Delete epidsode when playback completes" - android:title="Delete On Finish"/> + android:summary="@string/pref_auto_delete_sum" + android:title="@string/pref_auto_delete_title"/> - + Flattr Pause playback when the headphones are disconnected Jump to next queue item when playback completes + Delete episode when playback completes + Auto Delete Playback Network Update interval -- cgit v1.2.3 From 520ed8327c5d04134619f47eebf3c81615665f13 Mon Sep 17 00:00:00 2001 From: drabux Date: Thu, 22 Jan 2015 23:37:07 -0500 Subject: Options to sort queue by date --- .../danoeh/antennapod/fragment/QueueFragment.java | 6 +++ app/src/main/res/menu/queue.xml | 18 ++++++++- .../danoeh/antennapod/core/storage/DBWriter.java | 45 ++++++++++++++++++++++ core/src/main/res/values/strings.xml | 3 ++ 4 files changed, 70 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index 302739b6a..185af0e93 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -174,6 +174,12 @@ public class QueueFragment extends Fragment { DBTasks.refreshAllFeeds(getActivity(), feeds); } return true; + case R.id.queue_sort_date_asc: + DBWriter.sortQueueItemByDate(getActivity(), true, true); + return true; + case R.id.queue_sort_date_desc: + DBWriter.sortQueueItemByDate(getActivity(), false, true); + return true; default: return false; } diff --git a/app/src/main/res/menu/queue.xml b/app/src/main/res/menu/queue.xml index 0f06ea952..fa4d21b21 100644 --- a/app/src/main/res/menu/queue.xml +++ b/app/src/main/res/menu/queue.xml @@ -9,5 +9,19 @@ android:menuCategory="container" custom:showAsAction="ifRoom" android:icon="?attr/navigation_refresh"/> - - \ No newline at end of file + + + + + + + + + + diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java index d71d19433..41dde8656 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java @@ -24,6 +24,8 @@ import org.shredzone.flattr4j.model.Flattr; import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.LinkedList; import java.util.List; @@ -587,6 +589,49 @@ public class DBWriter { adapter.close(); } + /** + * Sort the FeedItems in the queue by date. + *

+ * This function must be run using the ExecutorService (dbExec). + * + * @param context A context that is used for opening a database connection. + * @param asc true sort by ascending order + * false sort by descending order + * @param broadcastUpdate true if this operation should trigger a QueueUpdateBroadcast. This option should be set to + * false if the caller wants to avoid unexpected updates of the GUI. + */ + public static void sortQueueItemByDate(final Context context, final boolean asc, final boolean broadcastUpdate) { + final PodDBAdapter adapter = new PodDBAdapter(context); + adapter.open(); + final List queue = DBReader.getQueue(context, adapter); + + if (queue != null) { + if (asc) { + Collections.sort(queue, new Comparator() { + public int compare(FeedItem f1, FeedItem f2) { + return f1.getPubDate().compareTo(f2.getPubDate()); + } + }); + } else { + Collections.sort(queue, new Comparator() { + public int compare(FeedItem f1, FeedItem f2) { + return f2.getPubDate().compareTo(f1.getPubDate()); + } + }); + } + + adapter.setQueue(queue); + if (broadcastUpdate) { + EventDistributor.getInstance() + .sendQueueUpdateBroadcast(); + } + + } else { + Log.e(TAG, "sortQueueItemByDate: Could not load queue"); + } + adapter.close(); + } + /** * Sets the 'read'-attribute of a FeedItem to the specified value. * diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 130007016..d76cc533b 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -159,6 +159,9 @@ Item removed Move to top Move to bottom + Sort + ascending date + descending date Flattr sign-in -- cgit v1.2.3 From 9764b8093544857261bb5abf99c1ab9dbfcda65a Mon Sep 17 00:00:00 2001 From: drabux Date: Sat, 24 Jan 2015 13:17:19 -0500 Subject: Options to sort queue refactor, add sort by alpha and duration --- .../danoeh/antennapod/fragment/QueueFragment.java | 17 ++++- app/src/main/res/menu/queue.xml | 50 ++++++++++-- .../danoeh/antennapod/core/storage/DBWriter.java | 23 +----- .../danoeh/antennapod/core/util/QueueSorter.java | 89 ++++++++++++++++++++++ core/src/main/res/values/strings.xml | 7 +- 5 files changed, 156 insertions(+), 30 deletions(-) create mode 100644 core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index 185af0e93..ca8543b4c 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -40,6 +40,7 @@ import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequester; +import de.danoeh.antennapod.core.util.QueueSorter; import de.danoeh.antennapod.menuhandler.MenuItemUtils; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; @@ -174,11 +175,23 @@ public class QueueFragment extends Fragment { DBTasks.refreshAllFeeds(getActivity(), feeds); } return true; + case R.id.queue_sort_alpha_asc: + QueueSorter.sort(getActivity(), QueueSorter.Rule.ALPHA_ASC, true); + return true; + case R.id.queue_sort_alpha_desc: + QueueSorter.sort(getActivity(), QueueSorter.Rule.ALPHA_DESC, true); + return true; case R.id.queue_sort_date_asc: - DBWriter.sortQueueItemByDate(getActivity(), true, true); + QueueSorter.sort(getActivity(), QueueSorter.Rule.DATE_ASC, true); return true; case R.id.queue_sort_date_desc: - DBWriter.sortQueueItemByDate(getActivity(), false, true); + QueueSorter.sort(getActivity(), QueueSorter.Rule.DATE_DESC, true); + return true; + case R.id.queue_sort_duration_asc: + QueueSorter.sort(getActivity(), QueueSorter.Rule.DURATION_ASC, true); + return true; + case R.id.queue_sort_duration_desc: + QueueSorter.sort(getActivity(), QueueSorter.Rule.DURATION_DESC, true); return true; default: return false; diff --git a/app/src/main/res/menu/queue.xml b/app/src/main/res/menu/queue.xml index fa4d21b21..b85279e5a 100644 --- a/app/src/main/res/menu/queue.xml +++ b/app/src/main/res/menu/queue.xml @@ -15,13 +15,49 @@ android:title="@string/sort">

- - + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java index 41dde8656..07c3c78e6 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java @@ -595,39 +595,24 @@ public class DBWriter { * This function must be run using the ExecutorService (dbExec). * * @param context A context that is used for opening a database connection. - * @param asc true sort by ascending order - * false sort by descending order + * @param comparator FeedItem comparator * @param broadcastUpdate true if this operation should trigger a QueueUpdateBroadcast. This option should be set to * false if the caller wants to avoid unexpected updates of the GUI. */ - public static void sortQueueItemByDate(final Context context, final boolean asc, final boolean broadcastUpdate) { + public static void sort (final Context context, Comparator comparator, final boolean broadcastUpdate) { final PodDBAdapter adapter = new PodDBAdapter(context); adapter.open(); final List queue = DBReader.getQueue(context, adapter); if (queue != null) { - if (asc) { - Collections.sort(queue, new Comparator() { - public int compare(FeedItem f1, FeedItem f2) { - return f1.getPubDate().compareTo(f2.getPubDate()); - } - }); - } else { - Collections.sort(queue, new Comparator() { - public int compare(FeedItem f1, FeedItem f2) { - return f2.getPubDate().compareTo(f1.getPubDate()); - } - }); - } - + Collections.sort(queue, comparator); adapter.setQueue(queue); if (broadcastUpdate) { EventDistributor.getInstance() .sendQueueUpdateBroadcast(); } - } else { - Log.e(TAG, "sortQueueItemByDate: Could not load queue"); + Log.e(TAG, "sort: Could not load queue"); } adapter.close(); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java b/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java new file mode 100644 index 000000000..b6ea8c977 --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java @@ -0,0 +1,89 @@ +package de.danoeh.antennapod.core.util; + +import android.content.Context; + +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.storage.DBWriter; + +import java.util.Comparator; + +/** + * Provides method for sorting the queue according to rules. + */ +public class QueueSorter { + public enum Rule { + ALPHA_ASC, + ALPHA_DESC, + DATE_ASC, + DATE_DESC, + DURATION_ASC, + DURATION_DESC + } + + public static void sort(final Context context, final Rule rule, final boolean broadcastUpdate) { + Comparator comparator = null; + + switch (rule) { + case ALPHA_ASC: + comparator = new Comparator() { + public int compare(FeedItem f1, FeedItem f2) { + return f1.getTitle().compareTo(f2.getTitle()); + } + }; + break; + case ALPHA_DESC: + comparator = new Comparator() { + public int compare(FeedItem f1, FeedItem f2) { + return f2.getTitle().compareTo(f1.getTitle()); + } + }; + break; + case DATE_ASC: + comparator = new Comparator() { + public int compare(FeedItem f1, FeedItem f2) { + return f1.getPubDate().compareTo(f2.getPubDate()); + } + }; + break; + case DATE_DESC: + comparator = new Comparator() { + public int compare(FeedItem f1, FeedItem f2) { + return f2.getPubDate().compareTo(f1.getPubDate()); + } + }; + break; + case DURATION_ASC: + comparator = new Comparator() { + public int compare(FeedItem f1, FeedItem f2) { + FeedMedia f1Media = f1.getMedia(); + FeedMedia f2Media = f2.getMedia(); + int duration1 = f1Media != null ? f1Media.getDuration() : -1; + int duration2 = f2Media != null ? f2Media.getDuration() : -1; + + if (duration1 == -1 || duration2 == -1) + return duration2 - duration1; + else + return duration1 - duration2; + } + }; + break; + case DURATION_DESC: + comparator = new Comparator() { + public int compare(FeedItem f1, FeedItem f2) { + FeedMedia f1Media = f1.getMedia(); + FeedMedia f2Media = f2.getMedia(); + int duration1 = f1Media != null ? f1Media.getDuration() : -1; + int duration2 = f2Media != null ? f2Media.getDuration() : -1; + + return -1 * (duration1 - duration2); + } + }; + default: + } + + if (comparator != null) { + DBWriter.sort(context, comparator, broadcastUpdate); + } + } +} diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index d76cc533b..b68013674 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -160,8 +160,11 @@ Move to top Move to bottom Sort - ascending date - descending date + Alphabetically + Date + Duration + Ascending + Descending Flattr sign-in -- cgit v1.2.3 From ad583e453d6be87b1c0d9a045119114c75faaf23 Mon Sep 17 00:00:00 2001 From: Tobias Preuss Date: Sun, 25 Jan 2015 10:27:46 +0100 Subject: Use design time attributes to assist layouting and value preview. + See: http://tools.android.com/tips/layout-designtime-attributes + This commit introduces no functional code changes! --- app/src/main/res/layout-v14/directory_chooser.xml | 15 +++++-- app/src/main/res/layout/audioplayer_activity.xml | 49 +++++++++++++++------- app/src/main/res/layout/cover_fragment.xml | 4 +- app/src/main/res/layout/directory_chooser.xml | 12 ++++-- .../res/layout/downloaded_episodeslist_item.xml | 27 ++++++++---- app/src/main/res/layout/downloadlist_item.xml | 25 +++++++---- app/src/main/res/layout/downloadlog_item.xml | 24 ++++++++--- .../main/res/layout/ellipsize_start_listitem.xml | 8 +++- .../main/res/layout/external_player_fragment.xml | 17 ++++++-- app/src/main/res/layout/feedinfo.xml | 30 +++++++++---- .../main/res/layout/feeditem_fragment_header.xml | 27 ++++++++---- app/src/main/res/layout/feeditemlist_header.xml | 18 +++++--- app/src/main/res/layout/feeditemlist_item.xml | 33 +++++++++++---- app/src/main/res/layout/gpodnet_podcast_list.xml | 11 +++-- .../main/res/layout/gpodnet_podcast_listitem.xml | 14 +++++-- .../main/res/layout/gpodnetauth_credentials.xml | 5 ++- app/src/main/res/layout/gpodnetauth_device.xml | 4 +- .../main/res/layout/itemdescription_listitem.xml | 14 +++++-- app/src/main/res/layout/main.xml | 11 +++-- app/src/main/res/layout/nav_feedlistitem.xml | 10 ++++- app/src/main/res/layout/nav_list.xml | 15 +++++-- app/src/main/res/layout/nav_listitem.xml | 16 +++++-- app/src/main/res/layout/nav_section_item.xml | 6 ++- app/src/main/res/layout/new_episodes_fragment.xml | 10 ++++- app/src/main/res/layout/new_episodes_listitem.xml | 30 +++++++++---- app/src/main/res/layout/onlinefeedview_header.xml | 17 ++++++-- app/src/main/res/layout/opml_import.xml | 11 +++-- app/src/main/res/layout/queue_listitem.xml | 25 +++++++---- app/src/main/res/layout/searchlist_item.xml | 21 +++++++--- app/src/main/res/layout/secondary_action.xml | 4 +- app/src/main/res/layout/simplechapter_item.xml | 24 ++++++++--- app/src/main/res/layout/time_dialog.xml | 7 +++- app/src/main/res/layout/vertical_list_divider.xml | 4 +- app/src/main/res/values/design_time_attributes.xml | 24 +++++++++++ 34 files changed, 427 insertions(+), 145 deletions(-) create mode 100644 app/src/main/res/values/design_time_attributes.xml diff --git a/app/src/main/res/layout-v14/directory_chooser.xml b/app/src/main/res/layout-v14/directory_chooser.xml index fb45d9937..8f9c4ee93 100644 --- a/app/src/main/res/layout-v14/directory_chooser.xml +++ b/app/src/main/res/layout-v14/directory_chooser.xml @@ -1,7 +1,9 @@ + android:layout_height="match_parent" + tools:background="@android:color/darker_gray"> + android:src="?attr/navigation_up" + tools:src="@drawable/navigation_up" + tools:background="@android:color/holo_green_dark" /> + android:textStyle="bold" + tools:background="@android:color/holo_green_dark"> + android:singleLine="true" + tools:text="/path/to/selected/folder" + tools:background="@android:color/holo_green_dark"/> + android:layout_height="match_parent" + tools:background="@android:color/holo_red_dark"> + android:minHeight="?attr/actionBarSize" + tools:background="@android:color/darker_gray"> + android:textSize="16sp" + tools:text="Audio title" + tools:background="@android:color/holo_green_dark" /> + android:gravity="right" + tools:src="@drawable/ic_stat_antenna_default" + tools:background="@android:color/holo_green_dark" /> @@ -63,7 +70,8 @@ android:layout_width="match_parent" android:layout_height="@dimen/audioplayer_playercontrols_length" android:layout_alignParentBottom="true" - android:background="?attr/overlay_background"> + android:background="?attr/overlay_background" + tools:background="@android:color/holo_purple"> + android:src="?attr/av_pause" + tools:src="@drawable/ic_pause_white_36dp" + tools:background="@android:color/holo_green_dark" /> + android:src="?attr/av_rew_big" + tools:src="@drawable/ic_fast_rewind_white_36dp" + tools:background="@android:color/holo_blue_dark" /> + android:src="?attr/av_ff_big" + tools:src="@drawable/ic_fast_forward_white_36dp" + tools:background="@android:color/holo_blue_dark" />