summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordaniel oeh <daniel.oeh@gmail.com>2013-02-22 23:10:13 +0100
committerdaniel oeh <daniel.oeh@gmail.com>2013-02-22 23:10:13 +0100
commit4fca178972637f288966cf2388330229cd41d47c (patch)
tree8c5e5b8c09687a96baac0bb9a901fa0bc3885821
parentbd92dd3fb317fd3d38a505b8cc0d27cc6f3f4dd8 (diff)
parent668bae3354e289114d3dfc77fe470324d37c1170 (diff)
downloadAntennaPod-4fca178972637f288966cf2388330229cd41d47c.zip
Merge branch 'issue-39' into develop
Conflicts: res/values/ids.xml
-rw-r--r--.gitmodules3
-rw-r--r--AndroidManifest.xml1
-rw-r--r--assets/about.html2
-rw-r--r--pom.xml460
-rw-r--r--project.properties1
-rw-r--r--res/drawable/dragview_background.xml54
-rw-r--r--res/drawable/dragview_background_dark.xml54
-rw-r--r--res/layout/organize_queue.xml34
-rw-r--r--res/layout/organize_queue_listitem.xml56
-rw-r--r--res/values/attrs.xml1
-rw-r--r--res/values/dimens.xml1
-rw-r--r--res/values/ids.xml2
-rw-r--r--res/values/strings.xml3
-rw-r--r--res/values/styles.xml4
-rw-r--r--src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java177
-rw-r--r--src/de/danoeh/antennapod/feed/FeedManager.java34
-rw-r--r--src/de/danoeh/antennapod/fragment/EpisodesFragment.java12
m---------submodules/dslv0
18 files changed, 657 insertions, 242 deletions
diff --git a/.gitmodules b/.gitmodules
index 54b674f60..cd43a243e 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -4,3 +4,6 @@
[submodule "submodules/ViewPagerIndicator"]
path = submodules/ViewPagerIndicator
url = git://github.com/JakeWharton/Android-ViewPagerIndicator.git
+[submodule "submodules/dslv"]
+ path = submodules/dslv
+ url = git://github.com/bauerca/drag-sort-listview.git
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index abf8675d8..d20a1f91d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -228,6 +228,7 @@
<activity
android:name=".activity.DirectoryChooserActivity"
android:label="@string/choose_data_directory" />
+ <activity android:label="@string/organize_queue_label" android:name=".activity.OrganizeQueueActivity" android:configChanges="orientation"></activity>
</application>
</manifest> \ No newline at end of file
diff --git a/assets/about.html b/assets/about.html
index 92ed8bb49..0cfa7771b 100644
--- a/assets/about.html
+++ b/assets/about.html
@@ -55,5 +55,7 @@
by The Apache Software Foundation, licensed under the Apache 2.0 license
<h2>flattr4j <a href="http://www.shredzone.org/projects/flattr4j/wiki">(Link)</a></h2>
licensed under the Apache 2.0 license
+ <h2>drag-sort-listview <a href="https://github.com/bauerca/drag-sort-listview">(Link)</a></h2>
+ licensed under the Apache 2.0 license
</body>
</html>
diff --git a/pom.xml b/pom.xml
index b0d24fe13..52c7cf6d8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,235 +1,241 @@
<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>de.danoeh</groupId>
- <artifactId>antennapod</artifactId>
- <packaging>apk</packaging>
- <version>0.9.6.4</version>
- <name>AntennaPod</name>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>de.danoeh</groupId>
+ <artifactId>antennapod</artifactId>
+ <packaging>apk</packaging>
+ <version>0.9.6.4</version>
+ <name>AntennaPod</name>
- <dependencies>
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- <version>3.1</version>
- </dependency>
- <dependency>
- <groupId>org.shredzone.flattr4j</groupId>
- <artifactId>flattr4j-core</artifactId>
- <version>2.4</version>
- <scope>compile</scope>
- <exclusions>
- <exclusion>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpcore</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.json</groupId>
- <artifactId>json</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>com.google.android</groupId>
- <artifactId>android</artifactId>
- <scope>provided</scope>
- <version>4.1.1.4</version>
- </dependency>
- <dependency>
- <groupId>com.actionbarsherlock</groupId>
- <artifactId>library</artifactId>
- <version>4.1.0</version>
- <type>apklib</type>
- </dependency>
- <dependency>
- <groupId>com.viewpagerindicator</groupId>
- <artifactId>library</artifactId>
- <version>2.3.1</version>
- <type>apklib</type>
- </dependency>
- <dependency>
- <groupId>com.google.android</groupId>
- <artifactId>annotations</artifactId>
- <version>4.1.1.4</version>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>2.4</version>
- </dependency>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <version>3.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.shredzone.flattr4j</groupId>
+ <artifactId>flattr4j-core</artifactId>
+ <version>2.4</version>
+ <scope>compile</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpcore</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.json</groupId>
+ <artifactId>json</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.google.android</groupId>
+ <artifactId>android</artifactId>
+ <scope>provided</scope>
+ <version>4.1.1.4</version>
+ </dependency>
+ <dependency>
+ <groupId>com.actionbarsherlock</groupId>
+ <artifactId>library</artifactId>
+ <version>4.1.0</version>
+ <type>apklib</type>
+ </dependency>
+ <dependency>
+ <groupId>com.viewpagerindicator</groupId>
+ <artifactId>library</artifactId>
+ <version>2.3.1</version>
+ <type>apklib</type>
+ </dependency>
+ <dependency>
+ <groupId>com.google.android</groupId>
+ <artifactId>annotations</artifactId>
+ <version>4.1.1.4</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>2.4</version>
+ </dependency>
+ <dependency>
+ <groupId>com.mobeta.android.dslv</groupId>
+ <artifactId>drag-sort-listview</artifactId>
+ <version>0.6.1-SNAPSHOT</version>
+ <type>apklib</type>
+ </dependency>
+ </dependencies>
- </dependencies>
+ <build>
+ <sourceDirectory>src</sourceDirectory>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>2.3.2</version>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>com.jayway.maven.plugins.android.generation2</groupId>
+ <artifactId>android-maven-plugin</artifactId>
+ <version>3.5.0</version>
+ <configuration>
+ <sdk>
+ <path>${env.ANDROID_HOME}</path>
+ <platform>17</platform>
+ </sdk>
+ <manifest>
+ <debuggable>true</debuggable>
+ </manifest>
+ </configuration>
+ <extensions>true</extensions>
+ <executions>
+ <execution>
+ <id>alignApk</id>
+ <phase>package</phase>
+ <goals>
+ <goal>zipalign</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
- <build>
- <sourceDirectory>src</sourceDirectory>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>2.3.2</version>
- <configuration>
- <source>1.6</source>
- <target>1.6</target>
- </configuration>
- </plugin>
- <plugin>
- <groupId>com.jayway.maven.plugins.android.generation2</groupId>
- <artifactId>android-maven-plugin</artifactId>
- <version>3.5.0</version>
- <configuration>
- <sdk>
- <path>${env.ANDROID_HOME}</path>
- <platform>17</platform>
- </sdk>
- <manifest>
- <debuggable>true</debuggable>
- </manifest>
- </configuration>
- <extensions>true</extensions>
- <executions>
- <execution>
- <id>alignApk</id>
- <phase>package</phase>
- <goals>
- <goal>zipalign</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-
- <profiles>
- <profile>
- <id>development</id>
- <!-- using this since activeByDefault does not work well with multiple
- profiles -->
- <activation>
- <property>
- <name>environment</name>
- <value>!production</value>
- </property>
- </activation>
- <properties>
- <deployment.stage>In Development</deployment.stage>
- </properties>
- </profile>
- <profile>
- <id>production</id>
- <properties>
- <deployment.stage>In Production</deployment.stage>
- </properties>
- </profile>
- <profile>
- <id>release</id>
- <!-- via this activation the profile is automatically used when the release
- is done with the maven release plugin -->
- <activation>
- <property>
- <name>performRelease</name>
- <value>true</value>
- </property>
- </activation>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jarsigner-plugin</artifactId>
- <executions>
- <execution>
- <id>signing</id>
- <goals>
- <goal>sign</goal>
- <goal>verify</goal>
- </goals>
- <phase>package</phase>
- <inherited>true</inherited>
- <configuration>
- <removeExistingSignatures>true</removeExistingSignatures>
- <archiveDirectory />
- <includes>
- <include>${project.build.directory}/${project.artifactId}-${project.version}.apk</include>
- </includes>
- <keystore>${sign.keystore}</keystore>
- <alias>${sign.alias}</alias>
- <storepass>${sign.storepass}</storepass>
- <keypass>${sign.keypass}</keypass>
- <verbose>true</verbose>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <!-- the signed apk then needs to be zipaligned and we activate proguard
- and we run the manifest update -->
- <plugin>
- <groupId>com.jayway.maven.plugins.android.generation2</groupId>
- <artifactId>android-maven-plugin</artifactId>
- <inherited>true</inherited>
- <configuration>
- <sign>
- <debug>false</debug>
- </sign>
- <zipalign>
- <skip>false</skip>
- <verbose>true</verbose>
- <inputApk>${project.build.directory}/${project.artifactId}-${project.version}.apk</inputApk>
- <outputApk>${project.build.directory}/${project.artifactId}-${project.version}-signed-aligned.apk
- </outputApk>
- </zipalign>
- <manifest>
- <debuggable>false</debuggable>
- <versionCodeAutoIncrement>true</versionCodeAutoIncrement>
- </manifest>
- <proguard>
- <skip>true</skip>
- </proguard>
- </configuration>
- <executions>
- <execution>
- <id>alignApk</id>
- <phase>package</phase>
- <goals>
- <goal>zipalign</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>build-helper-maven-plugin</artifactId>
- <configuration>
- <artifacts>
- <artifact>
- <file>${project.build.directory}/${project.artifactId}-${project.version}-signed-aligned.apk</file>
- <type>apk</type>
- <classifier>signed-aligned</classifier>
- </artifact>
- <artifact>
- <file>${project.build.directory}/proguard/mapping.txt</file>
- <type>map</type>
- <classifier>release</classifier>
- </artifact>
- </artifacts>
- </configuration>
- <executions>
- <execution>
- <id>attach-signed-aligned</id>
- <phase>package</phase>
- <goals>
- <goal>attach-artifact</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </profile>
- </profiles>
+ <profiles>
+ <profile>
+ <id>development</id>
+ <!-- using this since activeByDefault does not work well with multiple
+ profiles -->
+ <activation>
+ <property>
+ <name>environment</name>
+ <value>!production</value>
+ </property>
+ </activation>
+ <properties>
+ <deployment.stage>In Development</deployment.stage>
+ </properties>
+ </profile>
+ <profile>
+ <id>production</id>
+ <properties>
+ <deployment.stage>In Production</deployment.stage>
+ </properties>
+ </profile>
+ <profile>
+ <id>release</id>
+ <!-- via this activation the profile is automatically used when the release
+ is done with the maven release plugin -->
+ <activation>
+ <property>
+ <name>performRelease</name>
+ <value>true</value>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jarsigner-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>signing</id>
+ <goals>
+ <goal>sign</goal>
+ <goal>verify</goal>
+ </goals>
+ <phase>package</phase>
+ <inherited>true</inherited>
+ <configuration>
+ <removeExistingSignatures>true</removeExistingSignatures>
+ <archiveDirectory />
+ <includes>
+ <include>${project.build.directory}/${project.artifactId}-${project.version}.apk</include>
+ </includes>
+ <keystore>${sign.keystore}</keystore>
+ <alias>${sign.alias}</alias>
+ <storepass>${sign.storepass}</storepass>
+ <keypass>${sign.keypass}</keypass>
+ <verbose>true</verbose>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <!-- the signed apk then needs to be zipaligned and we activate proguard
+ and we run the manifest update -->
+ <plugin>
+ <groupId>com.jayway.maven.plugins.android.generation2</groupId>
+ <artifactId>android-maven-plugin</artifactId>
+ <inherited>true</inherited>
+ <configuration>
+ <sign>
+ <debug>false</debug>
+ </sign>
+ <zipalign>
+ <skip>false</skip>
+ <verbose>true</verbose>
+ <inputApk>${project.build.directory}/${project.artifactId}-${project.version}.apk</inputApk>
+ <outputApk>${project.build.directory}/${project.artifactId}-${project.version}-signed-aligned.apk
+ </outputApk>
+ </zipalign>
+ <manifest>
+ <debuggable>false</debuggable>
+ <versionCodeAutoIncrement>true</versionCodeAutoIncrement>
+ </manifest>
+ <proguard>
+ <skip>true</skip>
+ </proguard>
+ </configuration>
+ <executions>
+ <execution>
+ <id>alignApk</id>
+ <phase>package</phase>
+ <goals>
+ <goal>zipalign</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <configuration>
+ <artifacts>
+ <artifact>
+ <file>${project.build.directory}/${project.artifactId}-${project.version}-signed-aligned.apk</file>
+ <type>apk</type>
+ <classifier>signed-aligned</classifier>
+ </artifact>
+ <artifact>
+ <file>${project.build.directory}/proguard/mapping.txt</file>
+ <type>map</type>
+ <classifier>release</classifier>
+ </artifact>
+ </artifacts>
+ </configuration>
+ <executions>
+ <execution>
+ <id>attach-signed-aligned</id>
+ <phase>package</phase>
+ <goals>
+ <goal>attach-artifact</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
</project>
diff --git a/project.properties b/project.properties
index d1eaa98a8..2706f89b9 100644
--- a/project.properties
+++ b/project.properties
@@ -12,3 +12,4 @@ proguard.config=proguard.cfg
target=android-17
android.library.reference.1=submodules/ActionBarSherlock/library
android.library.reference.2=submodules/ViewPagerIndicator/library
+android.library.reference.3=submodules/dslv/library
diff --git a/res/drawable/dragview_background.xml b/res/drawable/dragview_background.xml
new file mode 100644
index 000000000..32cfa88b6
--- /dev/null
+++ b/res/drawable/dragview_background.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <item>
+ <shape android:shape="rectangle" >
+ <corners android:radius="3dp" />
+
+ <solid android:color="#D2D2D2" />
+ </shape>
+ </item>
+ <item android:top="10dp">
+ <shape android:shape="rectangle" >
+ <corners android:radius="3dp" />
+
+ <solid android:color="#ECECEC" />
+ </shape>
+ </item>
+ <item android:top="20dp">
+ <shape android:shape="rectangle" >
+ <corners android:radius="3dp" />
+
+ <solid android:color="#D2D2D2" />
+ </shape>
+ </item>
+ <item android:top="30dp">
+ <shape android:shape="rectangle" >
+ <corners android:radius="3dp" />
+
+ <solid android:color="#ECECEC" />
+ </shape>
+ </item>
+ <item android:top="40dp">
+ <shape android:shape="rectangle" >
+ <corners android:radius="3dp" />
+
+ <solid android:color="#D2D2D2" />
+ </shape>
+ </item>
+ <item android:top="50dp">
+ <shape android:shape="rectangle" >
+ <corners android:radius="3dp" />
+
+ <solid android:color="#ECECEC" />
+ </shape>
+ </item>
+ <item android:top="60dp">
+ <shape android:shape="rectangle" >
+ <corners android:radius="3dp" />
+
+ <solid android:color="#D2D2D2" />
+ </shape>
+ </item>
+
+</layer-list> \ No newline at end of file
diff --git a/res/drawable/dragview_background_dark.xml b/res/drawable/dragview_background_dark.xml
new file mode 100644
index 000000000..577077d9a
--- /dev/null
+++ b/res/drawable/dragview_background_dark.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <item>
+ <shape android:shape="rectangle" >
+ <corners android:radius="3dp" />
+
+ <solid android:color="#BEBEBE" />
+ </shape>
+ </item>
+ <item android:top="10dp">
+ <shape android:shape="rectangle" >
+ <corners android:radius="3dp" />
+
+ <solid android:color="#242A30" />
+ </shape>
+ </item>
+ <item android:top="20dp">
+ <shape android:shape="rectangle" >
+ <corners android:radius="3dp" />
+
+ <solid android:color="#BEBEBE" />
+ </shape>
+ </item>
+ <item android:top="30dp">
+ <shape android:shape="rectangle" >
+ <corners android:radius="3dp" />
+
+ <solid android:color="#242A30" />
+ </shape>
+ </item>
+ <item android:top="40dp">
+ <shape android:shape="rectangle" >
+ <corners android:radius="3dp" />
+
+ <solid android:color="#BEBEBE" />
+ </shape>
+ </item>
+ <item android:top="50dp">
+ <shape android:shape="rectangle" >
+ <corners android:radius="3dp" />
+
+ <solid android:color="#242A30" />
+ </shape>
+ </item>
+ <item android:top="60dp">
+ <shape android:shape="rectangle" >
+ <corners android:radius="3dp" />
+
+ <solid android:color="#BEBEBE" />
+ </shape>
+ </item>
+
+</layer-list> \ No newline at end of file
diff --git a/res/layout/organize_queue.xml b/res/layout/organize_queue.xml
new file mode 100644
index 000000000..615853f6d
--- /dev/null
+++ b/res/layout/organize_queue.xml
@@ -0,0 +1,34 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:dslv="http://schemas.android.com/apk/res/de.danoeh.antennapod"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical" >
+
+ <com.mobeta.android.dslv.DragSortListView
+ android:id="@android:id/list"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ dslv:collapsed_height="2dp"
+ dslv:drag_enabled="true"
+ dslv:drag_handle_id="@id/drag_handle"
+ dslv:drag_scroll_start="0.33"
+ dslv:drag_start_mode="onDown"
+ dslv:float_alpha="0.6"
+ dslv:max_drag_scroll_speed="0.5"
+ dslv:remove_enabled="true"
+ dslv:remove_mode="flingRemove"
+ dslv:slide_shuffle_speed="0.3"
+ dslv:sort_enabled="true"
+ dslv:track_drag_sort="false"
+ dslv:use_default_controller="true" />
+
+ <TextView
+ android:id="@id/android:empty"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:text="@string/no_feeds_label" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/res/layout/organize_queue_listitem.xml b/res/layout/organize_queue_listitem.xml
new file mode 100644
index 000000000..a109b5784
--- /dev/null
+++ b/res/layout/organize_queue_listitem.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
+
+ <ImageView
+ android:id="@+id/imgvFeedimage"
+ android:layout_width="@dimen/thumbnail_length"
+ android:layout_height="@dimen/thumbnail_length"
+ android:layout_alignParentLeft="true"
+ android:scaleType="centerCrop" />
+
+ <View
+ android:id="@id/drag_handle"
+ android:layout_width="@dimen/dragview_length"
+ android:layout_height="@dimen/dragview_length"
+ android:layout_alignParentRight="true"
+ android:layout_centerVertical="true"
+ android:layout_marginBottom="8dp"
+ android:layout_marginLeft="4dp"
+ android:layout_marginRight="8dp"
+ android:layout_marginTop="8dp"
+ android:background="?attr/dragview_background"
+ android:clickable="false"
+ android:focusable="false"
+ android:focusableInTouchMode="false" />
+
+ <TextView
+ android:id="@+id/txtvTitle"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_marginLeft="8dp"
+ android:layout_marginTop="8dp"
+ android:layout_toLeftOf="@id/drag_handle"
+ android:layout_toRightOf="@id/imgvFeedimage"
+ android:ellipsize="end"
+ android:lines="2"
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="@dimen/text_size_small" />
+
+ <TextView
+ android:id="@+id/txtvFeedname"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/txtvTitle"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
+ android:layout_toLeftOf="@id/drag_handle"
+ android:layout_toRightOf="@id/imgvFeedimage"
+ android:ellipsize="end"
+ android:maxLines="1"
+ android:textColor="?android:attr/textColorSecondary"
+ android:textSize="@dimen/text_size_micro" />
+
+</RelativeLayout> \ No newline at end of file
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 940e2c556..4f0ac0067 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -30,6 +30,7 @@
<attr name="borderless_button" format="reference" />
<attr name="spinner_button" format="reference" />
<attr name="overlay_drawable" format="reference" />
+ <attr name="dragview_background" format="reference" />
<!-- Used in itemdescription -->
<attr name="non_transparent_background" format="reference" />
<attr name="overlay_background" format="color" />
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 7cb9ebe3f..d5bbe1e6f 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -3,6 +3,7 @@
<dimen name="widget_margin">8dp</dimen>
<dimen name="thumbnail_length">70dp</dimen>
+ <dimen name="dragview_length">54dp</dimen>
<dimen name="external_player_height">55dp</dimen>
<dimen name="enc_icons_size">20dp</dimen>
<dimen name="text_size_micro">12sp</dimen>
diff --git a/res/values/ids.xml b/res/values/ids.xml
index 14d7b7d24..476969668 100644
--- a/res/values/ids.xml
+++ b/res/values/ids.xml
@@ -12,5 +12,7 @@
<item name="open_in_browser_item" type="id"/>
<item name="copy_url_item" type="id"/>
<item name="share_url_item" type="id"/>
+ <item name="organize_queue_item" type="id"/>
+ <item name="drag_handle" type="id"/>
</resources> \ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 31721a823..83e4c3427 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -118,9 +118,8 @@
<string name="show_player_label">Show player</string>
<!-- Queue operations -->
- <string name="move_up_label">Move up</string>
- <string name="move_down_label">Move down</string>
<string name="clear_queue_label">Clear queue</string>
+ <string name="organize_queue_label">Organize queue</string>
<!-- Flattr -->
<string name="flattr_auth_label">Flattr sign-in</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index e79979e48..23299020e 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -34,11 +34,10 @@
<item name="attr/overlay_background">@color/overlay_light</item>
<item name="attr/spinner_button">@drawable/spinner_button</item>
<item name="attr/overlay_drawable">@drawable/overlay_drawable</item>
+ <item name="attr/dragview_background">@drawable/dragview_background</item>
</style>
<style name="AntennaPod.TabPageIndicator" parent="Widget.TabPageIndicator">
- <item name="android:dividerPadding">10dp</item>
- <item name="android:showDividers">middle</item>
<item name="android:paddingTop">16dp</item>
<item name="android:paddingLeft">8dp</item>
<item name="android:paddingRight">8dp</item>
@@ -84,6 +83,7 @@
<item name="attr/overlay_background">@color/overlay_dark</item>
<item name="attr/spinner_button">@drawable/spinner_button_dark</item>
<item name="attr/overlay_drawable">@drawable/overlay_drawable_dark</item>
+ <item name="attr/dragview_background">@drawable/dragview_background_dark</item>
</style>
<style name="AntennaPod.DarkTabPageIndicator" parent="AntennaPod.TabPageIndicator">
diff --git a/src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java b/src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java
new file mode 100644
index 000000000..a7017d2fb
--- /dev/null
+++ b/src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java
@@ -0,0 +1,177 @@
+package de.danoeh.antennapod.activity;
+
+import java.util.List;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.TypedArray;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.actionbarsherlock.app.SherlockListActivity;
+import com.actionbarsherlock.view.Menu;
+import com.actionbarsherlock.view.MenuItem;
+import com.mobeta.android.dslv.DragSortListView;
+
+import de.danoeh.antennapod.PodcastApp;
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.asynctask.FeedImageLoader;
+import de.danoeh.antennapod.feed.FeedItem;
+import de.danoeh.antennapod.feed.FeedManager;
+
+public class OrganizeQueueActivity extends SherlockListActivity {
+ private static final String TAG = "OrganizeQueueActivity";
+
+ private static final int MENU_ID_ACCEPT = 2;
+
+ private OrganizeAdapter adapter;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ setTheme(PodcastApp.getThemeResourceId());
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.organize_queue);
+
+ DragSortListView listView = (DragSortListView) getListView();
+ listView.setDropListener(dropListener);
+ listView.setRemoveListener(removeListener);
+
+ adapter = new OrganizeAdapter(this, 0, FeedManager.getInstance()
+ .getQueue());
+ setListAdapter(adapter);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ try {
+ unregisterReceiver(contentUpdate);
+ } catch (IllegalArgumentException e) {
+
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ IntentFilter filter = new IntentFilter(FeedManager.ACTION_QUEUE_UPDATE);
+ filter.addAction(FeedManager.ACTION_FEED_LIST_UPDATE);
+ registerReceiver(contentUpdate, filter);
+ }
+
+ private BroadcastReceiver contentUpdate = new BroadcastReceiver() {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (adapter != null) {
+ adapter.notifyDataSetChanged();
+ }
+ }
+
+ };
+
+ private DragSortListView.DropListener dropListener = new DragSortListView.DropListener() {
+
+ @Override
+ public void drop(int from, int to) {
+ FeedManager manager = FeedManager.getInstance();
+ manager.moveQueueItem(OrganizeQueueActivity.this, from, to, false);
+ adapter.notifyDataSetChanged();
+ }
+ };
+
+ private DragSortListView.RemoveListener removeListener = new DragSortListView.RemoveListener() {
+
+ @Override
+ public void remove(int which) {
+ FeedManager manager = FeedManager.getInstance();
+ manager.removeQueueItem(OrganizeQueueActivity.this,
+ (FeedItem) getListAdapter().getItem(which));
+ }
+ };
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ TypedArray drawables = obtainStyledAttributes(new int[] { R.attr.navigation_accept });
+ menu.add(Menu.NONE, MENU_ID_ACCEPT, Menu.NONE, R.string.confirm_label)
+ .setIcon(drawables.getDrawable(0))
+ .setShowAsAction(
+ MenuItem.SHOW_AS_ACTION_IF_ROOM
+ | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_ID_ACCEPT:
+ finish();
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ private static class OrganizeAdapter extends ArrayAdapter<FeedItem> {
+
+ private Context context;
+
+ public OrganizeAdapter(Context context, int textViewResourceId,
+ List<FeedItem> objects) {
+ super(context, textViewResourceId, objects);
+ this.context = context;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ Holder holder;
+ final FeedItem item = getItem(position);
+
+ if (convertView == null) {
+ holder = new Holder();
+ LayoutInflater inflater = (LayoutInflater) context
+ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ convertView = inflater.inflate(
+ R.layout.organize_queue_listitem, null);
+ holder.title = (TextView) convertView
+ .findViewById(R.id.txtvTitle);
+ holder.feedTitle = (TextView) convertView
+ .findViewById(R.id.txtvFeedname);
+
+ holder.feedImage = (ImageView) convertView
+ .findViewById(R.id.imgvFeedimage);
+ convertView.setTag(holder);
+ } else {
+ holder = (Holder) convertView.getTag();
+ }
+
+ holder.title.setText(item.getTitle());
+ holder.feedTitle.setText(item.getFeed().getTitle());
+
+ holder.feedImage.setTag(item.getFeed().getImage());
+ FeedImageLoader.getInstance().loadThumbnailBitmap(
+ item.getFeed().getImage(),
+ holder.feedImage,
+ (int) convertView.getResources().getDimension(
+ R.dimen.thumbnail_length));
+
+ return convertView;
+ }
+
+ static class Holder {
+ TextView title;
+ TextView feedTitle;
+ ImageView feedImage;
+ }
+
+ }
+
+}
diff --git a/src/de/danoeh/antennapod/feed/FeedManager.java b/src/de/danoeh/antennapod/feed/FeedManager.java
index 3e5e838b0..6c3471e5c 100644
--- a/src/de/danoeh/antennapod/feed/FeedManager.java
+++ b/src/de/danoeh/antennapod/feed/FeedManager.java
@@ -765,16 +765,29 @@ public class FeedManager {
}
}
- public void moveQueueItem(final Context context, FeedItem item, int delta) {
+ /**
+ * Moves the queue item at the specified index to another position. If the
+ * indices are out of range, no operation will be performed.
+ *
+ * @param from
+ * index of the item that is going to be moved
+ * @param to
+ * destination index of item
+ * @param broadcastUpdate
+ * true if the method should send a queue update broadcast after
+ * the operation has been performed. This should be set to false
+ * if the order of the queue is changed through drag & drop
+ * reordering to avoid visual glitches.
+ */
+ public void moveQueueItem(final Context context, int from, int to,
+ boolean broadcastUpdate) {
if (AppConfig.DEBUG)
- Log.d(TAG, "Moving queue item");
- int itemIndex = queue.indexOf(item);
- int newIndex = itemIndex + delta;
- if (newIndex >= 0 && newIndex < queue.size()) {
- FeedItem oldItem = queue.set(newIndex, item);
- queue.set(itemIndex, oldItem);
+ Log.d(TAG, "Moving queue item from index " + from + " to index "
+ + to);
+ if (from >= 0 && from < queue.size() && to >= 0 && to < queue.size()) {
+ FeedItem item = queue.remove(from);
+ queue.add(to, item);
dbExec.execute(new Runnable() {
-
@Override
public void run() {
PodDBAdapter adapter = new PodDBAdapter(context);
@@ -783,9 +796,10 @@ public class FeedManager {
adapter.close();
}
});
-
+ if (broadcastUpdate) {
+ sendQueueUpdateBroadcast(context, item);
+ }
}
- sendQueueUpdateBroadcast(context, item);
}
public boolean isInQueue(FeedItem item) {
diff --git a/src/de/danoeh/antennapod/fragment/EpisodesFragment.java b/src/de/danoeh/antennapod/fragment/EpisodesFragment.java
index 1ea0011ef..843cf5af0 100644
--- a/src/de/danoeh/antennapod/fragment/EpisodesFragment.java
+++ b/src/de/danoeh/antennapod/fragment/EpisodesFragment.java
@@ -21,6 +21,7 @@ import com.actionbarsherlock.view.Menu;
import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.ItemviewActivity;
+import de.danoeh.antennapod.activity.OrganizeQueueActivity;
import de.danoeh.antennapod.adapter.ActionButtonCallback;
import de.danoeh.antennapod.adapter.ExternalEpisodesListAdapter;
import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
@@ -60,8 +61,11 @@ public class EpisodesFragment extends SherlockFragment {
filter.addAction(FeedManager.ACTION_QUEUE_UPDATE);
filter.addAction(FeedManager.ACTION_UNREAD_ITEMS_UPDATE);
filter.addAction(FeedManager.ACTION_FEED_LIST_UPDATE);
-
+
getActivity().registerReceiver(contentUpdate, filter);
+ if (adapter != null) {
+ adapter.notifyDataSetChanged();
+ }
}
@Override
@@ -158,6 +162,8 @@ public class EpisodesFragment extends SherlockFragment {
}, selectedItem, false);
} else if (selectedGroupId == ExternalEpisodesListAdapter.GROUP_POS_QUEUE) {
+ menu.add(Menu.NONE, R.id.organize_queue_item, Menu.NONE,
+ R.string.organize_queue_label);
menu.add(Menu.NONE, R.id.clear_queue_item, Menu.NONE, getActivity()
.getString(R.string.clear_queue_label));
menu.add(Menu.NONE, R.id.download_all_item, Menu.NONE,
@@ -187,6 +193,10 @@ public class EpisodesFragment extends SherlockFragment {
} else if (selectedGroupId == ExternalEpisodesListAdapter.GROUP_POS_QUEUE) {
handled = true;
switch (item.getItemId()) {
+ case R.id.organize_queue_item:
+ startActivity(new Intent(getActivity(),
+ OrganizeQueueActivity.class));
+ break;
case R.id.clear_queue_item:
manager.clearQueue(getActivity());
break;
diff --git a/submodules/dslv b/submodules/dslv
new file mode 160000
+Subproject c5f07d473a48325d0f12994025fce525c3027e2