aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--subsonic-android/AndroidManifest.xml14
-rw-r--r--subsonic-android/res/layout/appwidget4x1.xml91
-rw-r--r--subsonic-android/res/layout/appwidget4x2.xml105
-rw-r--r--subsonic-android/res/values/strings.xml2
-rw-r--r--subsonic-android/res/xml/appwidget4x1.xml7
-rw-r--r--subsonic-android/res/xml/appwidget4x2.xml7
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/provider/DSubWidget4x1.java30
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/provider/DSubWidget4x2.java30
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/provider/DSubWidgetProvider.java42
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/util/Util.java4
10 files changed, 317 insertions, 15 deletions
diff --git a/subsonic-android/AndroidManifest.xml b/subsonic-android/AndroidManifest.xml
index f8464f2d..6224cf79 100644
--- a/subsonic-android/AndroidManifest.xml
+++ b/subsonic-android/AndroidManifest.xml
@@ -98,11 +98,21 @@
</intent-filter>
</receiver>
- <receiver android:name="github.daneren2005.dsub.provider.DSubWidgetProvider" >
+ <receiver
+ android:name="github.daneren2005.dsub.provider.DSubWidget4x1"
+ android:label="@string/widget.4x1">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
- <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_info"/>
+ <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget4x1"/>
+ </receiver>
+ <receiver
+ android:name="github.daneren2005.dsub.provider.DSubWidget4x2"
+ android:label="@string/widget.4x2">
+ <intent-filter>
+ <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
+ </intent-filter>
+ <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget4x2"/>
</receiver>
<provider android:name="github.daneren2005.dsub.provider.DSubSearchProvider"
diff --git a/subsonic-android/res/layout/appwidget4x1.xml b/subsonic-android/res/layout/appwidget4x1.xml
new file mode 100644
index 00000000..ed08d674
--- /dev/null
+++ b/subsonic-android/res/layout/appwidget4x1.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="horizontal"
+ android:background="@drawable/appwidget_bg">
+
+ <ImageView
+ android:id="@+id/appwidget_coverart"
+ android:layout_height="fill_parent"
+ android:layout_width="82dip"
+ android:scaleType="fitXY"
+ android:src="@drawable/appwidget_art_default"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="@drawable/media_button"/>
+ <LinearLayout
+ android:id="@+id/appwidget_top"
+ android:layout_height="fill_parent"
+ android:layout_width="fill_parent"
+ android:orientation="vertical"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="@drawable/media_button">
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="16sp"
+ android:textColor="@color/appwidget_text"
+ android:textStyle="bold"
+ android:textSize="16sp"
+ android:singleLine="true"
+ android:paddingTop="4dip"
+ android:paddingLeft="5dip"
+ android:paddingRight="5dip"
+ android:paddingBottom="0dip"
+ android:fadingEdge="horizontal"
+ android:fadingEdgeLength="20dip"
+ android:ellipsize="none"/>
+ <TextView
+ android:id="@+id/artist"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textColor="@color/cyan"
+ android:minHeight="14sp"
+ android:textSize="12sp"
+ android:singleLine="true"
+ android:paddingLeft="5dip"
+ android:paddingBottom="2dip"
+ android:fadingEdge="horizontal"
+ android:fadingEdgeLength="10dip"
+ android:ellipsize="none"/>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="1.0dip"
+ android:background="#33ffffff"/>
+
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="horizontal">
+ <ImageButton
+ android:id="@+id/control_previous"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="fill_parent"
+ android:src="@drawable/ic_appwidget_music_previous"
+ android:background="@drawable/media_button"
+ android:scaleType="center"/>
+ <ImageButton
+ android:id="@+id/control_play"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="fill_parent"
+ android:src="@drawable/ic_appwidget_music_play"
+ android:background="@drawable/media_button"
+ android:scaleType="center"/>
+ <ImageButton
+ android:id="@+id/control_next"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="fill_parent"
+ android:src="@drawable/ic_appwidget_music_next"
+ android:background="@drawable/media_button"
+ android:scaleType="center"/>
+ </LinearLayout>
+ </LinearLayout>
+</LinearLayout>
diff --git a/subsonic-android/res/layout/appwidget4x2.xml b/subsonic-android/res/layout/appwidget4x2.xml
new file mode 100644
index 00000000..6407c298
--- /dev/null
+++ b/subsonic-android/res/layout/appwidget4x2.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="140dp"
+ android:orientation="horizontal"
+ android:background="@drawable/appwidget_bg">
+
+ <ImageView
+ android:id="@+id/appwidget_coverart"
+ android:layout_height="fill_parent"
+ android:layout_width="135dip"
+ android:scaleType="fitXY"
+ android:src="@drawable/appwidget_art_default"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="@drawable/media_button"/>
+ <LinearLayout
+ android:id="@+id/appwidget_top"
+ android:layout_height="fill_parent"
+ android:layout_width="fill_parent"
+ android:orientation="vertical"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="@drawable/media_button">
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="16sp"
+ android:textColor="@color/appwidget_text"
+ android:textStyle="bold"
+ android:textSize="16sp"
+ android:singleLine="true"
+ android:paddingTop="8dip"
+ android:paddingLeft="5dip"
+ android:paddingRight="5dip"
+ android:paddingBottom="4dip"
+ android:fadingEdge="horizontal"
+ android:fadingEdgeLength="20dip"
+ android:ellipsize="none"/>
+ <TextView
+ android:id="@+id/artist"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textColor="@color/appwidget_text"
+ android:minHeight="12sp"
+ android:textSize="14sp"
+ android:singleLine="true"
+ android:paddingLeft="5dip"
+ android:paddingBottom="2dip"
+ android:fadingEdge="horizontal"
+ android:fadingEdgeLength="10dip"
+ android:ellipsize="none"/>
+
+ <TextView
+ android:id="@+id/album"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textColor="@color/cyan"
+ android:minHeight="12sp"
+ android:textSize="14sp"
+ android:singleLine="true"
+ android:paddingLeft="5dip"
+ android:paddingBottom="20dip"
+ android:fadingEdge="horizontal"
+ android:fadingEdgeLength="10dip"
+ android:ellipsize="none"/>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="1.0dip"
+ android:background="#33ffffff"/>
+
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="horizontal">
+ <ImageButton
+ android:id="@+id/control_previous"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="fill_parent"
+ android:src="@drawable/ic_appwidget_music_previous"
+ android:background="@drawable/media_button"
+ android:scaleType="center"/>
+ <ImageButton
+ android:id="@+id/control_play"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="fill_parent"
+ android:src="@drawable/ic_appwidget_music_play"
+ android:background="@drawable/media_button"
+ android:scaleType="center"/>
+ <ImageButton
+ android:id="@+id/control_next"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="fill_parent"
+ android:src="@drawable/ic_appwidget_music_next"
+ android:background="@drawable/media_button"
+ android:scaleType="center"/>
+ </LinearLayout>
+ </LinearLayout>
+</LinearLayout>
diff --git a/subsonic-android/res/values/strings.xml b/subsonic-android/res/values/strings.xml
index 21dd4b88..2d42a66d 100644
--- a/subsonic-android/res/values/strings.xml
+++ b/subsonic-android/res/values/strings.xml
@@ -302,6 +302,8 @@
<string name="equalizer.enabled">Enabled</string>
<string name="equalizer.preset">Select preset</string>
+ <string name="widget.4x1">DSub (4x1)</string>
+ <string name="widget.4x2">DSub (4x2)</string>
<string name="widget.initial_text">Touch to select music</string>
<string name="widget.sdcard_busy">SD card unavailable</string>
<string name="widget.sdcard_missing">No SD card</string>
diff --git a/subsonic-android/res/xml/appwidget4x1.xml b/subsonic-android/res/xml/appwidget4x1.xml
new file mode 100644
index 00000000..65f47dba
--- /dev/null
+++ b/subsonic-android/res/xml/appwidget4x1.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+ android:minWidth="272dip"
+ android:minHeight="56dip"
+ android:updatePeriodMillis="0"
+ android:resizeMode="horizontal|vertical"
+ android:initialLayout="@layout/appwidget4x1"/> \ No newline at end of file
diff --git a/subsonic-android/res/xml/appwidget4x2.xml b/subsonic-android/res/xml/appwidget4x2.xml
new file mode 100644
index 00000000..f40204a7
--- /dev/null
+++ b/subsonic-android/res/xml/appwidget4x2.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+ android:minWidth="272dip"
+ android:minHeight="110dip"
+ android:updatePeriodMillis="0"
+ android:resizeMode="horizontal|vertical"
+ android:initialLayout="@layout/appwidget4x2"/> \ No newline at end of file
diff --git a/subsonic-android/src/github/daneren2005/dsub/provider/DSubWidget4x1.java b/subsonic-android/src/github/daneren2005/dsub/provider/DSubWidget4x1.java
new file mode 100644
index 00000000..5461d076
--- /dev/null
+++ b/subsonic-android/src/github/daneren2005/dsub/provider/DSubWidget4x1.java
@@ -0,0 +1,30 @@
+/*
+ This file is part of Subsonic.
+
+ Subsonic 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.
+
+ Subsonic 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 Subsonic. If not, see <http://www.gnu.org/licenses/>.
+
+ Copyright 2010 (C) Sindre Mehus
+ */
+package github.daneren2005.dsub.provider;
+
+import android.appwidget.AppWidgetManager;
+import android.content.Context;
+import github.daneren2005.dsub.R;
+
+public class DSubWidget4x1 extends DSubWidgetProvider {
+ @Override
+ protected int getLayout() {
+ return R.layout.appwidget4x1;
+ }
+}
diff --git a/subsonic-android/src/github/daneren2005/dsub/provider/DSubWidget4x2.java b/subsonic-android/src/github/daneren2005/dsub/provider/DSubWidget4x2.java
new file mode 100644
index 00000000..376a3084
--- /dev/null
+++ b/subsonic-android/src/github/daneren2005/dsub/provider/DSubWidget4x2.java
@@ -0,0 +1,30 @@
+/*
+ This file is part of Subsonic.
+
+ Subsonic 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.
+
+ Subsonic 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 Subsonic. If not, see <http://www.gnu.org/licenses/>.
+
+ Copyright 2010 (C) Sindre Mehus
+ */
+package github.daneren2005.dsub.provider;
+
+import android.appwidget.AppWidgetManager;
+import android.content.Context;
+import github.daneren2005.dsub.R;
+
+public class DSubWidget4x2 extends DSubWidgetProvider {
+ @Override
+ protected int getLayout() {
+ return R.layout.appwidget4x2;
+ }
+}
diff --git a/subsonic-android/src/github/daneren2005/dsub/provider/DSubWidgetProvider.java b/subsonic-android/src/github/daneren2005/dsub/provider/DSubWidgetProvider.java
index c61e215a..be91fe17 100644
--- a/subsonic-android/src/github/daneren2005/dsub/provider/DSubWidgetProvider.java
+++ b/subsonic-android/src/github/daneren2005/dsub/provider/DSubWidgetProvider.java
@@ -45,6 +45,7 @@ import github.daneren2005.dsub.service.DownloadService;
import github.daneren2005.dsub.service.DownloadServiceImpl;
import github.daneren2005.dsub.util.Constants;
import github.daneren2005.dsub.util.FileUtil;
+import java.util.HashMap;
/**
* Simple widget to show currently playing album art along
@@ -55,21 +56,30 @@ import github.daneren2005.dsub.util.FileUtil;
* @author Sindre Mehus
*/
public class DSubWidgetProvider extends AppWidgetProvider {
-
- private static DSubWidgetProvider instance;
private static final String TAG = DSubWidgetProvider.class.getSimpleName();
+ private static DSubWidget4x1 instance4x1;
+ private static DSubWidget4x2 instance4x2;
- public static synchronized DSubWidgetProvider getInstance() {
- if (instance == null) {
- instance = new DSubWidgetProvider();
- }
- return instance;
- }
+ public static synchronized void notifyInstances(Context context, DownloadService service, boolean playing) {
+ if(instance4x1 == null) {
+ instance4x1 = new DSubWidget4x1();
+ }
+ if(instance4x2 == null) {
+ instance4x2 = new DSubWidget4x2();
+ }
+
+ instance4x1.notifyChange(context, service, playing);
+ instance4x2.notifyChange(context, service, playing);
+ }
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
defaultAppWidget(context, appWidgetIds);
}
+
+ protected int getLayout() {
+ return 0;
+ }
/**
* Initialize given widgets to default state, where we launch Subsonic on default click
@@ -77,9 +87,12 @@ public class DSubWidgetProvider extends AppWidgetProvider {
*/
private void defaultAppWidget(Context context, int[] appWidgetIds) {
final Resources res = context.getResources();
- final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget);
+ final RemoteViews views = new RemoteViews(context.getPackageName(), getLayout());
views.setTextViewText(R.id.artist, res.getText(R.string.widget_initial_text));
+ if(getLayout() != R.layout.appwidget4x1) {
+ views.setTextViewText(R.id.album, "");
+ }
linkButtons(context, views, false);
pushUpdate(context, appWidgetIds, views);
@@ -118,11 +131,12 @@ public class DSubWidgetProvider extends AppWidgetProvider {
*/
private void performUpdate(Context context, DownloadService service, int[] appWidgetIds, boolean playing) {
final Resources res = context.getResources();
- final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget);
+ final RemoteViews views = new RemoteViews(context.getPackageName(), getLayout());
MusicDirectory.Entry currentPlaying = service.getCurrentPlaying() == null ? null : service.getCurrentPlaying().getSong();
String title = currentPlaying == null ? null : currentPlaying.getTitle();
CharSequence artist = currentPlaying == null ? null : currentPlaying.getArtist();
+ CharSequence album = currentPlaying == null ? null : currentPlaying.getAlbum();
CharSequence errorState = null;
// Show error message?
@@ -140,11 +154,17 @@ public class DSubWidgetProvider extends AppWidgetProvider {
// Show error state to user
views.setTextViewText(R.id.title,null);
views.setTextViewText(R.id.artist, errorState);
- views.setImageViewResource(R.id.appwidget_coverart, R.drawable.appwidget_art_default);
+ views.setTextViewText(R.id.album, "");
+ if(getLayout() != R.layout.appwidget4x1) {
+ views.setImageViewResource(R.id.appwidget_coverart, R.drawable.appwidget_art_default);
+ }
} else {
// No error, so show normal titles
views.setTextViewText(R.id.title, title);
views.setTextViewText(R.id.artist, artist);
+ if(getLayout() != R.layout.appwidget4x1) {
+ views.setTextViewText(R.id.album, album);
+ }
}
// Set correct drawable for pause state
diff --git a/subsonic-android/src/github/daneren2005/dsub/util/Util.java b/subsonic-android/src/github/daneren2005/dsub/util/Util.java
index 43aad67b..48cb7276 100644
--- a/subsonic-android/src/github/daneren2005/dsub/util/Util.java
+++ b/subsonic-android/src/github/daneren2005/dsub/util/Util.java
@@ -672,7 +672,7 @@ public final class Util {
});
// Update widget
- DSubWidgetProvider.getInstance().notifyChange(context, downloadService, true);
+ DSubWidgetProvider.notifyInstances(context, downloadService, true);
}
private static void setupViews(RemoteViews rv, Context context, MusicDirectory.Entry song, boolean playing){
@@ -754,7 +754,7 @@ public final class Util {
});
// Update widget
- DSubWidgetProvider.getInstance().notifyChange(context, downloadService, false);
+ DSubWidgetProvider.notifyInstances(context, downloadService, false);
}
public static void sleepQuietly(long millis) {