diff options
Diffstat (limited to 'app')
14 files changed, 116 insertions, 64 deletions
diff --git a/app/build.gradle b/app/build.gradle index 8f829d0af..b59106248 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,6 @@ dependencies { exclude group: 'org.json', module: 'json' } compile 'commons-io:commons-io:2.4' - compile project('dslv:library') compile 'com.jayway.android.robotium:robotium-solo:5.2.1' compile 'org.jsoup:jsoup:1.7.3' compile 'com.squareup.picasso:picasso:2.4.0' @@ -19,6 +18,7 @@ dependencies { compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0' compile 'com.squareup.okio:okio:1.2.0' compile project(':core') + compile project(':library:drag-sort-listview') } android { diff --git a/app/dslv b/app/dslv deleted file mode 160000 -Subproject 80011c50e444e1c7d5e13b57bdb127b524a1ff9 diff --git a/app/settings.gradle b/app/settings.gradle deleted file mode 100644 index e2d4f844d..000000000 --- a/app/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app:dslv:library' diff --git a/app/src/androidTest/java/de/test/antennapod/service/download/HttpDownloaderTest.java b/app/src/androidTest/java/de/test/antennapod/service/download/HttpDownloaderTest.java index 65b1145a2..443fbed7e 100644 --- a/app/src/androidTest/java/de/test/antennapod/service/download/HttpDownloaderTest.java +++ b/app/src/androidTest/java/de/test/antennapod/service/download/HttpDownloaderTest.java @@ -2,7 +2,12 @@ package de.test.antennapod.service.download; import android.test.InstrumentationTestCase; import android.util.Log; + +import java.io.File; +import java.io.IOException; + import de.danoeh.antennapod.core.feed.FeedFile; +import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.download.DownloadRequest; import de.danoeh.antennapod.core.service.download.DownloadStatus; import de.danoeh.antennapod.core.service.download.Downloader; @@ -10,9 +15,6 @@ import de.danoeh.antennapod.core.service.download.HttpDownloader; import de.danoeh.antennapod.core.util.DownloadError; import de.test.antennapod.util.service.download.HTTPBin; -import java.io.File; -import java.io.IOException; - public class HttpDownloaderTest extends InstrumentationTestCase { private static final String TAG = "HttpDownloaderTest"; private static final String DOWNLOAD_DIR = "testdownloads"; @@ -41,6 +43,7 @@ public class HttpDownloaderTest extends InstrumentationTestCase { @Override protected void setUp() throws Exception { super.setUp(); + UserPreferences.createInstance(getInstrumentation().getTargetContext()); destDir = getInstrumentation().getTargetContext().getExternalFilesDir(DOWNLOAD_DIR); assertNotNull(destDir); assertTrue(destDir.exists()); @@ -90,7 +93,7 @@ public class HttpDownloaderTest extends InstrumentationTestCase { } public void testGzip() { - download("http://httpbin.org/gzip", "testGzip", true); + download(HTTPBin.BASE_URL + "/gzip/100", "testGzip", true); } public void test404() { diff --git a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java index ce7b790e0..a8e93183c 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java @@ -3,12 +3,13 @@ package de.test.antennapod.ui; import android.content.Context; import android.content.SharedPreferences; import android.test.ActivityInstrumentationTestCase2; -import android.view.View; +import android.widget.ListView; + import com.robotium.solo.Solo; + import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.DefaultOnlineFeedViewActivity; import de.danoeh.antennapod.activity.MainActivity; -import de.danoeh.antennapod.activity.PreferenceActivityGingerbread; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.preferences.PreferenceController; @@ -49,10 +50,14 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv super.tearDown(); } + private void openNavDrawer() { + solo.clickOnScreen(50, 50); + } + public void testAddFeed() throws Exception { uiTestUtils.addHostedFeedData(); final Feed feed = uiTestUtils.hostedFeeds.get(0); - solo.setNavigationDrawer(Solo.OPENED); + openNavDrawer(); solo.clickOnText(solo.getString(R.string.add_feed_label)); solo.enterText(0, feed.getDownload_url()); solo.clickOnButton(0); @@ -65,39 +70,43 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv public void testClickNavDrawer() throws Exception { uiTestUtils.addLocalFeedData(false); - final View home = solo.getView(UITestUtils.HOME_VIEW); // all episodes + openNavDrawer(); + solo.clickOnText(solo.getString(R.string.all_episodes_label)); solo.waitForView(android.R.id.list); assertEquals(solo.getString(R.string.all_episodes_label), getActionbarTitle()); + // queue - solo.clickOnView(home); + openNavDrawer(); solo.clickOnText(solo.getString(R.string.queue_label)); solo.waitForView(android.R.id.list); assertEquals(solo.getString(R.string.queue_label), getActionbarTitle()); // downloads - solo.clickOnView(home); + openNavDrawer(); solo.clickOnText(solo.getString(R.string.downloads_label)); solo.waitForView(android.R.id.list); assertEquals(solo.getString(R.string.downloads_label), getActionbarTitle()); // playback history - solo.clickOnView(home); + openNavDrawer(); solo.clickOnText(solo.getString(R.string.playback_history_label)); solo.waitForView(android.R.id.list); assertEquals(solo.getString(R.string.playback_history_label), getActionbarTitle()); // add podcast - solo.clickOnView(home); + openNavDrawer(); solo.clickOnText(solo.getString(R.string.add_feed_label)); solo.waitForView(R.id.txtvFeedurl); assertEquals(solo.getString(R.string.add_feed_label), getActionbarTitle()); // podcasts + ListView list = (ListView)solo.getView(R.id.nav_list); for (int i = 0; i < uiTestUtils.hostedFeeds.size(); i++) { Feed f = uiTestUtils.hostedFeeds.get(i); - solo.clickOnView(home); + solo.clickOnScreen(50, 50); // open nav drawer + solo.scrollListToLine(list, i); solo.clickOnText(f.getTitle()); solo.waitForView(android.R.id.list); assertEquals("", getActionbarTitle()); @@ -109,7 +118,7 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv } public void testGoToPreferences() { - solo.setNavigationDrawer(Solo.CLOSED); + openNavDrawer(); solo.clickOnMenuItem(solo.getString(R.string.settings_label)); solo.waitForActivity(PreferenceController.getPreferenceActivity()); } diff --git a/app/src/androidTest/java/de/test/antennapod/ui/PlaybackTest.java b/app/src/androidTest/java/de/test/antennapod/ui/PlaybackTest.java index 2235ee6f4..8f1477192 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/PlaybackTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/PlaybackTest.java @@ -5,7 +5,11 @@ import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.test.ActivityInstrumentationTestCase2; import android.widget.TextView; + import com.robotium.solo.Solo; + +import java.util.List; + import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.AudioplayerActivity; import de.danoeh.antennapod.activity.MainActivity; @@ -16,8 +20,6 @@ import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.PodDBAdapter; -import java.util.List; - /** * Test cases for starting and ending playback from the MainActivity and AudioPlayerActivity */ @@ -40,6 +42,7 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity> PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getTargetContext()); adapter.open(); adapter.close(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getInstrumentation().getTargetContext()); prefs.edit().putBoolean(UserPreferences.PREF_UNPAUSE_ON_HEADSET_RECONNECT, false).commit(); prefs.edit().putBoolean(UserPreferences.PREF_PAUSE_ON_HEADSET_DISCONNECT, false).commit(); @@ -59,6 +62,10 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity> super.tearDown(); } + private void openNavDrawer() { + solo.clickOnScreen(50, 50); + } + private void setContinuousPlaybackPreference(boolean value) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getInstrumentation().getTargetContext()); prefs.edit().putBoolean(UserPreferences.PREF_FOLLOW_QUEUE, value).commit(); @@ -71,7 +78,9 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity> private void startLocalPlayback() { assertTrue(solo.waitForActivity(MainActivity.class)); - solo.setNavigationDrawer(Solo.CLOSED); + openNavDrawer(); + solo.clickOnText(solo.getString(R.string.all_episodes_label)); + solo.waitForView(android.R.id.list); solo.clickOnView(solo.getView(R.id.butSecondaryAction)); assertTrue(solo.waitForActivity(AudioplayerActivity.class)); assertTrue(solo.waitForView(solo.getView(R.id.butPlay))); @@ -79,10 +88,10 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity> private void startLocalPlaybackFromQueue() { assertTrue(solo.waitForActivity(MainActivity.class)); - solo.clickOnView(solo.getView(UITestUtils.HOME_VIEW)); + openNavDrawer(); solo.clickOnText(solo.getString(R.string.queue_label)); assertTrue(solo.waitForView(solo.getView(R.id.butSecondaryAction))); - solo.clickOnImageButton(0); + solo.clickOnImageButton(1); assertTrue(solo.waitForActivity(AudioplayerActivity.class)); assertTrue(solo.waitForView(solo.getView(R.id.butPlay))); } @@ -108,7 +117,7 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity> setContinuousPlaybackPreference(false); uiTestUtils.addLocalFeedData(true); List<FeedItem> queue = DBReader.getQueue(getInstrumentation().getTargetContext()); - FeedItem second = queue.get(1); + FeedItem second = queue.get(0); startLocalPlaybackFromQueue(); assertTrue(solo.waitForText(second.getTitle())); @@ -147,4 +156,6 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity> public void testReplayEpisodeContinuousPlaybackOff() throws Exception { replayEpisodeCheck(false); } + + } diff --git a/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java b/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java index 55fffb80a..249cb0dd6 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java @@ -5,12 +5,8 @@ import android.content.Context; import android.graphics.Bitmap; import android.os.Build; -import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.feed.*; -import de.danoeh.antennapod.core.storage.PodDBAdapter; -import de.test.antennapod.util.service.download.HTTPBin; -import de.test.antennapod.util.syndication.feedgenerator.RSS2Generator; import junit.framework.Assert; + import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -23,6 +19,16 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.feed.EventDistributor; +import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.FeedImage; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.storage.PodDBAdapter; +import de.test.antennapod.util.service.download.HTTPBin; +import de.test.antennapod.util.syndication.feedgenerator.RSS2Generator; + /** * Utility methods for UI tests. * Starts a web server that hosts feeds, episodes and images. @@ -174,7 +180,8 @@ public class UITestUtils { feed.setDownloaded(true); if (feed.getImage() != null) { FeedImage image = feed.getImage(); - image.setFile_url(image.getDownload_url()); + int fileId = Integer.parseInt(StringUtils.substringAfter(image.getDownload_url(), "files/")); + image.setFile_url(server.accessFile(fileId).getAbsolutePath()); image.setDownloaded(true); } if (downloadEpisodes) { diff --git a/app/src/androidTest/java/de/test/antennapod/util/service/download/HTTPBin.java b/app/src/androidTest/java/de/test/antennapod/util/service/download/HTTPBin.java index 5cb723446..2f2c3fe5b 100644 --- a/app/src/androidTest/java/de/test/antennapod/util/service/download/HTTPBin.java +++ b/app/src/androidTest/java/de/test/antennapod/util/service/download/HTTPBin.java @@ -2,15 +2,28 @@ package de.test.antennapod.util.service.download; import android.util.Base64; import android.util.Log; -import de.danoeh.antennapod.BuildConfig; + import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; import java.net.URLConnection; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Random; import java.util.zip.GZIPOutputStream; +import de.danoeh.antennapod.BuildConfig; + /** * Http server for testing purposes * <p/> @@ -264,7 +277,7 @@ public class HTTPBin extends NanoHTTPD { private Response getGzippedResponse(int size) throws IOException { try { - Thread.sleep(5000); + Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } @@ -272,14 +285,15 @@ public class HTTPBin extends NanoHTTPD { Random random = new Random(System.currentTimeMillis()); random.nextBytes(buffer); - ByteArrayOutputStream compressed = new ByteArrayOutputStream(); + ByteArrayOutputStream compressed = new ByteArrayOutputStream(buffer.length); GZIPOutputStream gzipOutputStream = new GZIPOutputStream(compressed); gzipOutputStream.write(buffer); + gzipOutputStream.close(); InputStream inputStream = new ByteArrayInputStream(compressed.toByteArray()); Response response = new Response(Response.Status.OK, MIME_PLAIN, inputStream); - response.addHeader("Content-encoding", "gzip"); - response.addHeader("Content-length", String.valueOf(compressed.size())); + response.addHeader("Content-Encoding", "gzip"); + response.addHeader("Content-Length", String.valueOf(compressed.size())); return response; } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5b00941de..de6b20eb7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="de.danoeh.antennapod" - android:versionCode="44" - android:versionName="1.0"> + android:versionCode="45" + android:versionName="1.1rc1"> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> diff --git a/app/src/main/java/de/danoeh/antennapod/activity/DefaultOnlineFeedViewActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/DefaultOnlineFeedViewActivity.java index 8401b41a7..287ae3568 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/DefaultOnlineFeedViewActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/DefaultOnlineFeedViewActivity.java @@ -138,7 +138,7 @@ public class DefaultOnlineFeedViewActivity extends OnlineFeedViewActivity { @Override public void onClick(View v) { try { - Feed f = new Feed(selectedDownloadUrl, new Date(), feed.getTitle()); + Feed f = new Feed(selectedDownloadUrl, new Date(0), feed.getTitle()); f.setPreferences(feed.getPreferences()); DefaultOnlineFeedViewActivity.this.feed = f; diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java index 9f028000e..3b03ed2db 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java @@ -13,9 +13,21 @@ import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.RelativeLayout; + +import org.apache.commons.lang3.StringUtils; +import org.xml.sax.SAXException; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import javax.xml.parsers.ParserConfigurationException; + import de.danoeh.antennapod.BuildConfig; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.dialog.AuthenticationDialog; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedPreferences; import de.danoeh.antennapod.core.preferences.UserPreferences; @@ -31,16 +43,7 @@ import de.danoeh.antennapod.core.util.FileNameGenerator; import de.danoeh.antennapod.core.util.StorageUtils; import de.danoeh.antennapod.core.util.URLChecker; import de.danoeh.antennapod.core.util.syndication.FeedDiscoverer; -import org.apache.commons.lang3.StringUtils; -import org.xml.sax.SAXException; - -import javax.xml.parsers.ParserConfigurationException; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; +import de.danoeh.antennapod.dialog.AuthenticationDialog; /** * Downloads a feed from a feed URL and parses it. Subclasses can display the @@ -181,7 +184,7 @@ public abstract class OnlineFeedViewActivity extends ActionBarActivity { if (BuildConfig.DEBUG) Log.d(TAG, "Starting feed download"); url = URLChecker.prepareURL(url); - feed = new Feed(url, new Date()); + feed = new Feed(url, new Date(0)); if (username != null && password != null) { feed.setPreferences(new FeedPreferences(0, false, username, password)); } diff --git a/app/src/main/java/de/danoeh/antennapod/asynctask/OpmlFeedQueuer.java b/app/src/main/java/de/danoeh/antennapod/asynctask/OpmlFeedQueuer.java index cb9197b8e..00327bce0 100644 --- a/app/src/main/java/de/danoeh/antennapod/asynctask/OpmlFeedQueuer.java +++ b/app/src/main/java/de/danoeh/antennapod/asynctask/OpmlFeedQueuer.java @@ -4,16 +4,17 @@ import android.annotation.SuppressLint; import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; -import de.danoeh.antennapod.core.R; + +import java.util.Arrays; +import java.util.Date; + import de.danoeh.antennapod.activity.OpmlImportHolder; +import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.opml.OpmlElement; import de.danoeh.antennapod.core.storage.DownloadRequestException; import de.danoeh.antennapod.core.storage.DownloadRequester; -import java.util.Arrays; -import java.util.Date; - /** Queues items for download in the background. */ public class OpmlFeedQueuer extends AsyncTask<Void, Void, Void> { private Context context; @@ -46,7 +47,7 @@ public class OpmlFeedQueuer extends AsyncTask<Void, Void, Void> { for (int idx = 0; idx < selection.length; idx++) { OpmlElement element = OpmlImportHolder.getReadElements().get( selection[idx]); - Feed feed = new Feed(element.getXmlUrl(), new Date(), + Feed feed = new Feed(element.getXmlUrl(), new Date(0), element.getText()); try { requester.downloadFeed(context.getApplicationContext(), feed); diff --git a/app/src/main/java/de/danoeh/antennapod/receiver/PowerConnectionReceiver.java b/app/src/main/java/de/danoeh/antennapod/receiver/PowerConnectionReceiver.java index 0e7784381..f050e031d 100644 --- a/app/src/main/java/de/danoeh/antennapod/receiver/PowerConnectionReceiver.java +++ b/app/src/main/java/de/danoeh/antennapod/receiver/PowerConnectionReceiver.java @@ -13,16 +13,19 @@ import de.danoeh.antennapod.core.storage.DownloadRequester; // modified from http://developer.android.com/training/monitoring-device-state/battery-monitoring.html // and ConnectivityActionReceiver.java +// Updated based on http://stackoverflow.com/questions/20833241/android-charge-intent-has-no-extra-data +// Since the intent doesn't have the EXTRA_STATUS like the android.com article says it does +// (though it used to) public class PowerConnectionReceiver extends BroadcastReceiver { private static final String TAG = "PowerConnectionReceiver"; @Override public void onReceive(Context context, Intent intent) { - int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); - boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || - status == BatteryManager.BATTERY_STATUS_FULL; + final String action = intent.getAction(); - if (isCharging) { + Log.d(TAG, "charging intent: " + action); + + if (Intent.ACTION_POWER_CONNECTED.equals(action)) { Log.d(TAG, "charging, starting auto-download"); // we're plugged in, this is a great time to auto-download if everything else is // right. So, even if the user allows auto-dl on battery, let's still start diff --git a/app/src/main/java/de/danoeh/antennapod/receiver/SPAReceiver.java b/app/src/main/java/de/danoeh/antennapod/receiver/SPAReceiver.java index 359a546f6..d15108bfe 100644 --- a/app/src/main/java/de/danoeh/antennapod/receiver/SPAReceiver.java +++ b/app/src/main/java/de/danoeh/antennapod/receiver/SPAReceiver.java @@ -5,15 +5,17 @@ import android.content.Context; import android.content.Intent; import android.util.Log; import android.widget.Toast; + +import org.apache.commons.lang3.StringUtils; + +import java.util.Arrays; +import java.util.Date; + import de.danoeh.antennapod.BuildConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.storage.DownloadRequestException; import de.danoeh.antennapod.core.storage.DownloadRequester; -import org.apache.commons.lang3.StringUtils; - -import java.util.Arrays; -import java.util.Date; /** * Receives intents from AntennaPod Single Purpose apps @@ -34,7 +36,7 @@ public class SPAReceiver extends BroadcastReceiver{ if (feedUrls != null) { if (BuildConfig.DEBUG) Log.d(TAG, "Received feeds list: " + Arrays.toString(feedUrls)); for (String url : feedUrls) { - Feed f = new Feed(url, new Date()); + Feed f = new Feed(url, new Date(0)); try { DownloadRequester.getInstance().downloadFeed(context, f); } catch (DownloadRequestException e) { |