From c70ee616469dff191bd154d94fa49ba0f76452f0 Mon Sep 17 00:00:00 2001 From: Eric Kok Date: Thu, 10 Oct 2013 17:56:48 +0200 Subject: [PATCH] Working widgets with correct loading static and list rows UI. --- core/res/drawable-hdpi/widget_preview.png | Bin 0 -> 41013 bytes core/res/layout-v11/activity_widgetconfig.xml | 12 ++- core/res/layout-v11/list_item_widget_dark.xml | 34 ++++---- .../res/layout-v11/list_item_widget_light.xml | 34 ++++---- core/res/layout-v11/widget_torrents_dark.xml | 48 +++++++++-- core/res/layout-v11/widget_torrents_light.xml | 49 +++++++++-- core/res/values/dimens.xml | 5 ++ core/res/values/strings.xml | 6 +- core/res/xml/appwidget_info.xml | 2 +- .../lists/SimpleListItemSpinnerAdapter.java | 66 +++++++++++++++ .../core/gui/lists/SortByListItem.java | 30 ++++++- .../core/widget/WidgetConfigActivity.java | 20 +++-- .../core/widget/WidgetProvider.java | 78 ++++++++++-------- .../transdroid/core/widget/WidgetService.java | 22 ++--- 14 files changed, 296 insertions(+), 110 deletions(-) create mode 100644 core/res/drawable-hdpi/widget_preview.png create mode 100644 core/src/org/transdroid/core/gui/lists/SimpleListItemSpinnerAdapter.java diff --git a/core/res/drawable-hdpi/widget_preview.png b/core/res/drawable-hdpi/widget_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..e6fcab62570d68aec63cae9a9a5e6981acb5f5a2 GIT binary patch literal 41013 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 literal 0 HcmV?d00001 diff --git a/core/res/layout-v11/activity_widgetconfig.xml b/core/res/layout-v11/activity_widgetconfig.xml index 7f1169aa..9cf2564f 100644 --- a/core/res/layout-v11/activity_widgetconfig.xml +++ b/core/res/layout-v11/activity_widgetconfig.xml @@ -62,13 +62,21 @@ android:id="@+id/filter_spinner" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/margin_default" /> + android:layout_marginTop="@dimen/margin_half" /> + + + android:layout_marginTop="@dimen/margin_half" /> + android:paddingRight="@dimen/widget_list_item_padding" > - - + android:layout_width="6dp" + android:layout_height="@dimen/widget_list_item_height" /> + @@ -58,9 +59,10 @@ android:layout_height="wrap_content" android:layout_alignBaseline="@id/ratio_text" android:layout_alignParentLeft="true" - android:layout_marginLeft="@dimen/margin_torrentlistleft" - android:layout_toLeftOf="@id/priority_image" + android:layout_marginLeft="@dimen/widget_list_item_padding_left" + android:layout_toLeftOf="@id/ratio_text" + android:maxLines="1" android:textIsSelectable="false" android:textSize="@dimen/text_small" /> - + \ No newline at end of file diff --git a/core/res/layout-v11/list_item_widget_light.xml b/core/res/layout-v11/list_item_widget_light.xml index 860ef687..3e7fdd21 100644 --- a/core/res/layout-v11/list_item_widget_light.xml +++ b/core/res/layout-v11/list_item_widget_light.xml @@ -18,26 +18,26 @@ + android:paddingRight="@dimen/widget_list_item_padding" > - - + android:layout_width="6dp" + android:layout_height="@dimen/widget_list_item_height" /> + @@ -58,9 +59,10 @@ android:layout_height="wrap_content" android:layout_alignBaseline="@id/ratio_text" android:layout_alignParentLeft="true" - android:layout_marginLeft="@dimen/margin_torrentlistleft" - android:layout_toLeftOf="@id/priority_image" + android:layout_marginLeft="@dimen/widget_list_item_padding_left" + android:layout_toLeftOf="@id/ratio_text" + android:maxLines="1" android:textIsSelectable="false" android:textSize="@dimen/text_small" /> - + \ No newline at end of file diff --git a/core/res/layout-v11/widget_torrents_dark.xml b/core/res/layout-v11/widget_torrents_dark.xml index 3959a922..31b51077 100644 --- a/core/res/layout-v11/widget_torrents_dark.xml +++ b/core/res/layout-v11/widget_torrents_dark.xml @@ -1,4 +1,20 @@ + + + + android:paddingRight="@dimen/margin_half" + android:paddingTop="3dp" > @@ -40,20 +70,22 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="-4dip" + android:ellipsize="marquee" android:fontFamily="sans-serif-light" + android:maxLines="1" android:textColor="@color/text_actionbar_dark" android:textIsSelectable="false" android:textSize="@dimen/ui_navigation_server" /> - - + + + + android:paddingRight="@dimen/margin_half" + android:paddingTop="3dp" > @@ -40,20 +70,22 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="-4dip" + android:ellipsize="marquee" android:fontFamily="sans-serif-light" + android:maxLines="1" android:textColor="@color/text_actionbar_light" android:textIsSelectable="false" android:textSize="@dimen/ui_navigation_server" /> - - diff --git a/core/res/values/dimens.xml b/core/res/values/dimens.xml index 52c36924..a7e05008 100644 --- a/core/res/values/dimens.xml +++ b/core/res/values/dimens.xml @@ -46,5 +46,10 @@ 20dp 200dp -1dp + 46dp + 6dp + 54dp + 6dp + 12dp diff --git a/core/res/values/strings.xml b/core/res/values/strings.xml index b5856e1e..0d90b8cb 100644 --- a/core/res/values/strings.xml +++ b/core/res/values/strings.xml @@ -190,11 +190,13 @@ New torrents for %1$s + Loading… Open Transdroid SERVER VIEW LOOK & FEEL - Reverse sort order - Use dark theme + SORT ORDER + Reversed sort order + Use dark theme (no preview) DONE Servers diff --git a/core/res/xml/appwidget_info.xml b/core/res/xml/appwidget_info.xml index a236ffa0..7846f411 100644 --- a/core/res/xml/appwidget_info.xml +++ b/core/res/xml/appwidget_info.xml @@ -23,7 +23,7 @@ android:minResizeHeight="110dip" android:minResizeWidth="110dp" android:minWidth="180dp" - android:previewImage="@drawable/ic_launcher" + android:previewImage="@drawable/widget_preview" android:resizeMode="horizontal|vertical" android:updatePeriodMillis="3600000" android:widgetCategory="home_screen|keyguard" /> diff --git a/core/src/org/transdroid/core/gui/lists/SimpleListItemSpinnerAdapter.java b/core/src/org/transdroid/core/gui/lists/SimpleListItemSpinnerAdapter.java new file mode 100644 index 00000000..0d33e654 --- /dev/null +++ b/core/src/org/transdroid/core/gui/lists/SimpleListItemSpinnerAdapter.java @@ -0,0 +1,66 @@ +/* + * Copyright 2010-2013 Eric Kok et al. + * + * Transdroid 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. + * + * Transdroid 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 Transdroid. If not, see . + */ +package org.transdroid.core.gui.lists; + +import java.util.List; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +/** + * A wrapper around {@link ArrayAdapter} that contains {@link SimpleListItem}s which simply show their name in the + * Spinner. The standard Android spinner resources are used for the layout. + * @author Eric Kok + */ +public class SimpleListItemSpinnerAdapter extends ArrayAdapter { + + /** + * Constructs the adapter, supplying the {@link SimpleListItem}s to show in the spinner. The given resource will be + * ignored as the standard Android Spinner layout is used instead. + * @param context The UI context to inflate the layout in + * @param resource This is ignored; android.R.layout.simple_spinner_item is always used instead + * @param objects The items to show in the spinner, which can simply display some name + */ + public SimpleListItemSpinnerAdapter(Context context, int resource, List objects) { + super(context, android.R.layout.simple_spinner_item, objects); + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + // This relies on the ArrayAdapter implementation and the used standard xml layouts that simply return a + // TextView; this can then be filled with the SimpleListItem's name instead of the standard toString() + // implementation + TextView text = (TextView) super.getView(position, convertView, parent); + text.setText(getItem(position).getName()); + return text; + } + + @Override + public View getDropDownView(int position, View convertView, ViewGroup parent) { + // This relies on the ArrayAdapter implementation and the used standard xml layouts that simply return a + // TextView; this can then be filled with the SimpleListItem's name instead of the standard toString() + // implementation + TextView text = (TextView) super.getDropDownView(position, convertView, parent); + text.setText(getItem(position).getName()); + return text; + } + +} diff --git a/core/src/org/transdroid/core/gui/lists/SortByListItem.java b/core/src/org/transdroid/core/gui/lists/SortByListItem.java index d05c6aef..90e6110d 100644 --- a/core/src/org/transdroid/core/gui/lists/SortByListItem.java +++ b/core/src/org/transdroid/core/gui/lists/SortByListItem.java @@ -16,18 +16,42 @@ */ package org.transdroid.core.gui.lists; +import org.transdroid.core.R; import org.transdroid.daemon.TorrentsSortBy; +import android.content.Context; + /** * Represents a way in which a torrents list can be sorted. * @author Eric Kok */ public class SortByListItem implements SimpleListItem { - private TorrentsSortBy sortBy; + private final TorrentsSortBy sortBy; + private final String name; - public SortByListItem(TorrentsSortBy sortBy) { + public SortByListItem(Context context, TorrentsSortBy sortBy) { this.sortBy = sortBy; + switch (sortBy) { + case DateAdded: + this.name = context.getString(R.string.action_sort_added); + break; + case DateDone: + this.name = context.getString(R.string.action_sort_done); + break; + case Ratio: + this.name = context.getString(R.string.action_sort_ratio); + break; + case Status: + this.name = context.getString(R.string.action_sort_status); + break; + case UploadSpeed: + this.name = context.getString(R.string.action_sort_upspeed); + break; + default: + this.name = context.getString(R.string.action_sort_alpha); + break; + } } /** @@ -40,7 +64,7 @@ public class SortByListItem implements SimpleListItem { @Override public String getName() { - return sortBy.name(); + return name; } } diff --git a/core/src/org/transdroid/core/widget/WidgetConfigActivity.java b/core/src/org/transdroid/core/widget/WidgetConfigActivity.java index 2478623e..01d8276f 100644 --- a/core/src/org/transdroid/core/widget/WidgetConfigActivity.java +++ b/core/src/org/transdroid/core/widget/WidgetConfigActivity.java @@ -30,10 +30,9 @@ import org.androidannotations.annotations.ViewById; import org.transdroid.core.R; import org.transdroid.core.app.settings.ApplicationSettings; import org.transdroid.core.app.settings.ServerSetting; -import org.transdroid.core.gui.lists.SimpleListItem; +import org.transdroid.core.gui.lists.SimpleListItemSpinnerAdapter; import org.transdroid.core.gui.lists.SortByListItem; import org.transdroid.core.gui.lists.TorrentsAdapter; -import org.transdroid.core.gui.navigation.FilterListItemAdapter; import org.transdroid.core.gui.navigation.StatusType; import org.transdroid.core.gui.navigation.StatusType.StatusTypeFilter; import org.transdroid.core.service.ConnectivityHelper; @@ -111,18 +110,20 @@ public class WidgetConfigActivity extends SherlockActivity { @AfterViews protected void init() { - // Populate the selection spinners - List sortOrders = new ArrayList(); + // Populate the selection spinners with custom array adapters + List sortOrders = new ArrayList(); for (TorrentsSortBy order : TorrentsSortBy.values()) { - sortOrders.add(new SortByListItem(order)); + sortOrders.add(new SortByListItem(this, order)); } - - serverSpinner.setAdapter(new FilterListItemAdapter(this, applicationSettings.getServerSettings())); - filterSpinner.setAdapter(new FilterListItemAdapter(this, StatusType.getAllStatusTypes(this))); - sortSpinner.setAdapter(new FilterListItemAdapter(this, sortOrders)); + serverSpinner.setAdapter(new SimpleListItemSpinnerAdapter(this, 0, applicationSettings + .getServerSettings())); + filterSpinner.setAdapter(new SimpleListItemSpinnerAdapter(this, 0, StatusType + .getAllStatusTypes(this))); + sortSpinner.setAdapter(new SimpleListItemSpinnerAdapter(this, 0, sortOrders)); // TODO: Update to AndroidAnnotations 3.0 and use @CheckedChanged reverseorderCheckBox.setOnCheckedChangeListener(reverseorderCheckedChanged); torrentsList.setAdapter(previewTorrentsAdapter); + torrentsList.setEmptyView(errorText); // Set up action bar with a done button // Inspired by NoNonsenseNotes's ListWidgetConfig.java (Apache License, Version 2.0) @@ -257,4 +258,5 @@ public class WidgetConfigActivity extends SherlockActivity { } }; + } diff --git a/core/src/org/transdroid/core/widget/WidgetProvider.java b/core/src/org/transdroid/core/widget/WidgetProvider.java index e599d7ab..c16165c4 100644 --- a/core/src/org/transdroid/core/widget/WidgetProvider.java +++ b/core/src/org/transdroid/core/widget/WidgetProvider.java @@ -20,7 +20,7 @@ import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.EReceiver; import org.transdroid.core.R; import org.transdroid.core.app.settings.*; -import org.transdroid.core.app.settings.ServerSetting; +import org.transdroid.core.gui.TorrentsActivity_; import org.transdroid.core.gui.log.Log; import android.annotation.TargetApi; @@ -40,46 +40,40 @@ public class WidgetProvider extends AppWidgetProvider { public static final String INTENT_STARTSERVER = "org.transdroid.START_SERVER"; public static final String EXTRA_TORRENT = "extra_torrent"; public static final String EXTRA_SERVER = "extra_server"; + public static final String EXTRA_REFRESH = "extra_refresh"; @Bean protected ApplicationSettings applicationSettings; + @Override + public void onReceive(Context context, Intent intent) { + if (intent != null && intent.hasExtra(EXTRA_REFRESH)) { + // Manually requested a refresh for the app widget of which the ID was supplied + int appWidgetId = intent.getIntExtra(EXTRA_REFRESH, -1); + AppWidgetManager.getInstance(context).updateAppWidget(appWidgetId, + buildRemoteViews(context, appWidgetId, applicationSettings.getWidgetConfig(appWidgetId))); + AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.torrents_list); + return; + } + super.onReceive(context, intent); + } + @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { for (int appWidgetId : appWidgetIds) { appWidgetManager.updateAppWidget(appWidgetId, buildRemoteViews(context, appWidgetId, applicationSettings.getWidgetConfig(appWidgetId))); + appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.torrents_list); } } @Override public void onDeleted(Context context, int[] appWidgetIds) { - super.onDeleted(context, appWidgetIds); for (int appWidgetId : appWidgetIds) { applicationSettings.removeWidgetConfig(appWidgetId); } } - @Override - public void onReceive(Context context, Intent intent) { - - if (intent == null || intent.getAction() == null || intent.getExtras() == null - || !intent.hasExtra(EXTRA_SERVER)) - return; - - // Launch an Intent to start Transdroid on some specific server; and possibly a specific torrent too - Intent start = new Intent(INTENT_STARTSERVER); - start.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - start.putExtra(EXTRA_SERVER, intent.getIntExtra(EXTRA_SERVER, -1)); - if (intent.getAction().equals(EXTRA_TORRENT)) { - start.putExtra(EXTRA_TORRENT, intent.getParcelableExtra(EXTRA_TORRENT)); - } - context.startActivity(start); - - super.onReceive(context, intent); - - } - /** * Loads and sets up the layout for some specific app widget given the user's widget settings. Note that the views * for the list view rows are loaded separately in the {@link WidgetViewsFactory}. @@ -103,26 +97,44 @@ public class WidgetProvider extends AppWidgetProvider { // Load the dark or light widget layout xml RemoteViews rv = new RemoteViews(context.getPackageName(), - config.shouldUseDarkTheme() ? R.layout.list_item_widget_dark : R.layout.list_item_widget_light); + config.shouldUseDarkTheme() ? R.layout.widget_torrents_dark : R.layout.widget_torrents_light); // Set up the widget's list view loading service which refers to the WidgetViewsFactory - // Use a unique data URI next to the extra to make sure the intents are unique form each widget - Intent intent = new Intent(context, WidgetService.class); - intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME) + "//widget/" + appWidgetId + "/server/" - + config.getServerId())); - intent.putExtra(EXTRA_SERVER, config.getServerId()); - rv.setRemoteAdapter(appWidgetId, R.id.torrents_list, intent); + Intent data = new Intent(context, WidgetService_.class); + data.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); + data.setData(Uri.parse(data.toUri(Intent.URI_INTENT_SCHEME))); + rv.setRemoteAdapter(appWidgetId, R.id.torrents_list, data); + Intent open = new Intent(context, TorrentsActivity_.class); + open.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); rv.setPendingIntentTemplate(R.id.torrents_list, - PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)); + PendingIntent.getActivity(context, appWidgetId, open, PendingIntent.FLAG_UPDATE_CURRENT)); rv.setEmptyView(R.id.torrents_list, R.id.error_text); - rv.setTextViewText(R.id.error_text, context.getString(R.string.navigation_emptytorrents)); + rv.setTextViewText(R.id.error_text, context.getString(R.string.widget_loading)); - // Show the server and status type filter from the widget configuration + // Show the server and status type filter from the widget configuration in the 'action bar' ServerSetting server = appSettings.getServerSetting(config.getServerId()); rv.setTextViewText(R.id.server_text, server.getName()); rv.setTextViewText(R.id.filter_text, config.getStatusType().getFilterItem(context).getName()); + + // Set up the START_SERVER intent for 'action bar' clicks to start Transdroid normally + Intent start = new Intent(context, TorrentsActivity_.class); + //start.setData(Uri.parse("intent://widget/" + appWidgetId + "/start/" + config.getServerId())); + start.setAction(INTENT_STARTSERVER); + start.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + start.putExtra(EXTRA_SERVER, config.getServerId()); rv.setOnClickPendingIntent(R.id.icon_image, - PendingIntent.getActivity(context, 0, intent.cloneFilter(), PendingIntent.FLAG_UPDATE_CURRENT)); + PendingIntent.getActivity(context, appWidgetId, start, PendingIntent.FLAG_UPDATE_CURRENT)); + rv.setOnClickPendingIntent(R.id.navigation_view, + PendingIntent.getActivity(context, appWidgetId, start, PendingIntent.FLAG_UPDATE_CURRENT)); + + // Set up the widgets refresh button pending intent (calling this WidgetProvider itself) + // Make sure that the intent is unique using a custom data path (rather than just the extras) + Intent refresh = new Intent(context, WidgetProvider_.class); + refresh.setData(Uri.parse("intent://widget/" + appWidgetId + "/refresh")); + refresh.putExtra(EXTRA_REFRESH, appWidgetId); + refresh.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); + rv.setOnClickPendingIntent(R.id.refresh_button, + PendingIntent.getBroadcast(context, appWidgetId, refresh, PendingIntent.FLAG_UPDATE_CURRENT)); return rv; diff --git a/core/src/org/transdroid/core/widget/WidgetService.java b/core/src/org/transdroid/core/widget/WidgetService.java index 915bebd9..7f3ca7e3 100644 --- a/core/src/org/transdroid/core/widget/WidgetService.java +++ b/core/src/org/transdroid/core/widget/WidgetService.java @@ -39,7 +39,6 @@ import android.annotation.TargetApi; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; -import android.content.res.Resources; import android.os.Build; import android.widget.RemoteViews; import android.widget.RemoteViewsService; @@ -131,29 +130,28 @@ class WidgetViewsFactory implements RemoteViewsService.RemoteViewsFactory { // Bind the torrent details texts and status colour Torrent torrent = torrents.get(position); LocalTorrent local = LocalTorrent.fromTorrent(torrent); - Resources r = context.getResources(); rv.setTextViewText(R.id.name_text, torrent.getName()); - rv.setTextViewText(R.id.progress_text, local.getProgressSizeText(r, false)); - rv.setTextViewText(R.id.ratio_text, local.getProgressEtaRatioText(r)); + rv.setTextViewText(R.id.progress_text, local.getProgressSizeText(context.getResources(), false)); + rv.setTextViewText(R.id.ratio_text, local.getProgressEtaRatioText(context.getResources())); int statusColour; switch (torrent.getStatusCode()) { case Downloading: - statusColour = r.getColor(r.getColor(R.color.torrent_downloading)); + statusColour = R.color.torrent_downloading; break; case Paused: - statusColour = r.getColor(r.getColor(R.color.torrent_paused)); + statusColour = R.color.torrent_paused; break; case Seeding: - statusColour = r.getColor(r.getColor(R.color.torrent_seeding)); + statusColour = R.color.torrent_seeding; break; case Error: - statusColour = r.getColor(r.getColor(R.color.torrent_error)); + statusColour = R.color.torrent_error; break; default: // Checking, Waiting, Queued, Unknown - statusColour = r.getColor(r.getColor(R.color.torrent_other)); + statusColour = R.color.torrent_other; break; } - rv.setInt(R.id.status_view, "setBackgroundColor", r.getColor(statusColour)); + rv.setInt(R.id.status_view, "setBackgroundColor", context.getResources().getColor(statusColour)); Intent startIntent = new Intent(); startIntent.putExtra(WidgetProvider.EXTRA_SERVER, config.getServerId()); startIntent.putExtra(WidgetProvider.EXTRA_TORRENT, torrent); @@ -170,7 +168,9 @@ class WidgetViewsFactory implements RemoteViewsService.RemoteViewsFactory { @Override public void onDestroy() { - torrents.clear(); + if (torrents != null) + torrents.clear(); + torrents = null; } @Override