summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/build.gradle11
-rw-r--r--app/src/androidTest/java/de/test/antennapod/ui/UITestUtilsTest.java8
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java151
-rw-r--r--build.gradle17
-rw-r--r--core/build.gradle2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java16
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/APRedirectHandler.java54
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/ShakeListener.java5
10 files changed, 104 insertions, 166 deletions
diff --git a/app/build.gradle b/app/build.gradle
index eb4b25de8..2fe94d576 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -14,7 +14,7 @@ dependencies {
compile "com.android.support:gridlayout-v7:$supportVersion"
compile "com.android.support:cardview-v7:$supportVersion"
compile "com.android.support:design:$supportVersion"
- compile "com.android.support:recyclerview-v7:22.2.+"
+ compile "com.android.support:recyclerview-v7:$supportVersion"
compile "org.apache.commons:commons-lang3:$commonslangVersion"
compile("org.shredzone.flattr4j:flattr4j-core:$flattr4jVersion") {
exclude group: "org.json", module: "json"
@@ -31,9 +31,12 @@ dependencies {
compile "io.reactivex:rxjava:$rxJavaVersion"
// And ProGuard rules for RxJava!
compile "com.artemzin.rxjava:proguard-rules:$rxJavaRulesVersion"
- compile "com.joanzapata.iconify:android-iconify-fontawesome:2.1.0"
- compile "com.afollestad:material-dialogs:0.7.8.1"
- compile "com.yqritc:recyclerview-flexibledivider:1.2.6"
+ compile "com.joanzapata.iconify:android-iconify-fontawesome:$iconifyFontawesomeVersion"
+ compile "com.joanzapata.iconify:android-iconify-material:$iconifyFontawesomeVersion"
+ compile("com.github.afollestad.material-dialogs:commons:$materialDialogsVersion") {
+ transitive = true
+ }
+ compile "com.yqritc:recyclerview-flexibledivider:$recyclerviewFlexibledividerVersion"
compile "com.github.AntennaPod:AntennaPod-AudioPlayer:$audioPlayerVersion"
diff --git a/app/src/androidTest/java/de/test/antennapod/ui/UITestUtilsTest.java b/app/src/androidTest/java/de/test/antennapod/ui/UITestUtilsTest.java
index 6c5a350de..53fd7d7fd 100644
--- a/app/src/androidTest/java/de/test/antennapod/ui/UITestUtilsTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/ui/UITestUtilsTest.java
@@ -1,15 +1,15 @@
package de.test.antennapod.ui;
import android.test.InstrumentationTestCase;
-import de.danoeh.antennapod.core.feed.Feed;
-import de.danoeh.antennapod.core.feed.FeedItem;
-import org.apache.http.HttpStatus;
import java.io.File;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
+import de.danoeh.antennapod.core.feed.Feed;
+import de.danoeh.antennapod.core.feed.FeedItem;
+
/**
* Test for the UITestUtils. Makes sure that all URLs are reachable and that the class does not cause any crashes.
*/
@@ -55,7 +55,7 @@ public class UITestUtilsTest extends InstrumentationTestCase {
conn.setRequestMethod("GET");
conn.connect();
int rc = conn.getResponseCode();
- assertEquals(HttpStatus.SC_OK, rc);
+ assertEquals(HttpURLConnection.HTTP_OK, rc);
conn.disconnect();
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java
index 72704245f..e92df4885 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java
@@ -2,21 +2,20 @@ package de.danoeh.antennapod.fragment;
import android.content.Intent;
import android.content.res.Resources;
-import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.SearchView;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.GridView;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.util.EntityUtils;
+import com.squareup.okhttp.OkHttpClient;
+import com.squareup.okhttp.Request;
+import com.squareup.okhttp.Response;
+
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -30,13 +29,23 @@ import java.util.List;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.OnlineFeedViewActivity;
import de.danoeh.antennapod.adapter.itunes.ItunesAdapter;
+import de.danoeh.antennapod.core.ClientConfig;
import de.danoeh.antennapod.core.preferences.UserPreferences;
+import de.danoeh.antennapod.core.service.download.AntennapodHttpClient;
+import rx.Observable;
+import rx.Subscription;
+import rx.android.schedulers.AndroidSchedulers;
+import rx.schedulers.Schedulers;
import static de.danoeh.antennapod.adapter.itunes.ItunesAdapter.Podcast;
//Searches iTunes store for given string and displays results in a list
public class ItunesSearchFragment extends Fragment {
- final String TAG = "ItunesSearchFragment";
+
+ private static final String TAG = "ItunesSearchFragment";
+
+ private static final String API_URL = "https://itunes.apple.com/search?media=podcast&term=%s";
+
/**
* Search input field
*/
@@ -52,6 +61,8 @@ public class ItunesSearchFragment extends Fragment {
*/
private List<Podcast> searchResults;
+ private Subscription subscription;
+
/**
* Replace adapter data with provided search results from SearchTask.
* @param result List of Podcast objects containing search results
@@ -117,7 +128,7 @@ public class ItunesSearchFragment extends Fragment {
//This prevents onQueryTextSubmit() from being called twice when keyboard is used
//to submit the query.
searchView.clearFocus();
- new SearchTask(s).execute();
+ search(s);
return false;
}
@@ -137,77 +148,59 @@ public class ItunesSearchFragment extends Fragment {
return view;
}
- /**
- * Search the iTunes store for podcasts using the given query
- */
- class SearchTask extends AsyncTask<Void,Void,Void> {
- /**
- * Incomplete iTunes API search URL
- */
- final String apiUrl = "https://itunes.apple.com/search?media=podcast&term=%s";
-
- /**
- * Search terms
- */
- final String query;
-
- /**
- * Search result
- */
- final List<Podcast> taskData = new ArrayList<>();
-
- /**
- * Constructor
- *
- * @param query Search string
- */
- public SearchTask(String query) {
- String encodedQuery = null;
- try {
- encodedQuery = URLEncoder.encode(query, "UTF-8");
- } catch(UnsupportedEncodingException e) {
- // this won't ever be thrown
- }
- if(encodedQuery != null) {
- this.query = encodedQuery;
- } else {
- this.query = query; // failsafe
- }
- }
-
- //Get the podcast data
- @Override
- protected Void doInBackground(Void... params) {
-
- //Spaces in the query need to be replaced with '+' character.
- String formattedUrl = String.format(apiUrl, query).replace(' ', '+');
-
- HttpClient client = new DefaultHttpClient();
- HttpGet get = new HttpGet(formattedUrl);
-
- try {
- HttpResponse response = client.execute(get);
- String resultString = EntityUtils.toString(response.getEntity());
- JSONObject result = new JSONObject(resultString);
- JSONArray j = result.getJSONArray("results");
-
- for (int i = 0; i < j.length(); i++){
- JSONObject podcastJson = j.getJSONObject(i);
- Podcast podcast = new Podcast(podcastJson);
- taskData.add(podcast);
- }
-
- } catch (IOException | JSONException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- //Save the data and update the list
- @Override
- protected void onPostExecute(Void aVoid) {
- super.onPostExecute(aVoid);
- updateData(taskData);
+ private void search(String query) {
+ if (subscription != null) {
+ subscription.unsubscribe();
}
+ subscription = rx.Observable.create((Observable.OnSubscribe<List<Podcast>>) subscriber -> {
+ String encodedQuery = null;
+ try {
+ encodedQuery = URLEncoder.encode(query, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ // this won't ever be thrown
+ }
+ if (encodedQuery == null) {
+ encodedQuery = query; // failsafe
+ }
+
+ //Spaces in the query need to be replaced with '+' character.
+ String formattedUrl = String.format(API_URL, query).replace(' ', '+');
+
+ OkHttpClient client = AntennapodHttpClient.getHttpClient();
+ Request.Builder httpReq = new Request.Builder()
+ .url(formattedUrl)
+ .header("User-Agent", ClientConfig.USER_AGENT);
+ List<Podcast> podcasts = new ArrayList<>();
+ try {
+ Response response = client.newCall(httpReq.build()).execute();
+
+ if(response.isSuccessful()) {
+ String resultString = response.body().string();
+ JSONObject result = new JSONObject(resultString);
+ JSONArray j = result.getJSONArray("results");
+
+ for (int i = 0; i < j.length(); i++) {
+ JSONObject podcastJson = j.getJSONObject(i);
+ Podcast podcast = new Podcast(podcastJson);
+ podcasts.add(podcast);
+ }
+ }
+ else {
+ subscriber.onError(new IOException("Unexpected error: " + response));
+ }
+ } catch (IOException | JSONException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ }
+ subscriber.onNext(podcasts);
+ subscriber.onCompleted();
+ })
+ .subscribeOn(Schedulers.newThread())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(podcasts -> {
+ updateData(podcasts);
+ }, error -> {
+ Log.e(TAG, Log.getStackTraceString(error));
+ });
}
+
}
diff --git a/build.gradle b/build.gradle
index a82809ca4..bf2d68a60 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,7 +6,7 @@ buildscript {
}
dependencies {
classpath "com.android.tools.build:gradle:1.5.0"
- classpath "me.tatarka:gradle-retrolambda:3.2.3"
+ classpath "me.tatarka:gradle-retrolambda:3.2.4"
classpath "me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2"
// Exclude the version that the android plugin depends on.
@@ -36,27 +36,30 @@ subprojects {
}
project.ext {
- compileSdkVersion = 22
- buildToolsVersion = "22.0.1"
+ compileSdkVersion = 23
+ buildToolsVersion = "23.0.2"
minSdkVersion = 10
- targetSdkVersion = 22
+ targetSdkVersion = 23
- supportVersion = "22.2.1"
+ supportVersion = "23.1.1"
commonsioVersion = "2.4"
commonslangVersion = "3.4"
eventbusVersion = "2.4.0"
flattr4jVersion = "2.12"
glideVersion = "3.6.1"
jsoupVersion = "1.7.3"
+ iconifyFontawesomeVersion = "2.1.1"
+ materialDialogsVersion = "0.8.5.1@aar"
+ recyclerviewFlexibledividerVersion = "1.2.6"
rxAndroidVersion = "1.0.1"
rxJavaVersion = "1.0.16"
rxJavaRulesVersion = "1.0.16.1"
- okhttpVersion = "2.5.0"
+ okhttpVersion = "2.6.0"
okioVersion = "1.6.0"
audioPlayerVersion = "v1.0.7"
}
task wrapper(type: Wrapper) {
- gradleVersion = "2.4"
+ gradleVersion = "2.9"
}
diff --git a/core/build.gradle b/core/build.gradle
index 93f6f94db..d8e6b6287 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -46,7 +46,7 @@ dependencies {
exclude group: "org.json", module: "json"
}
compile "commons-io:commons-io:$commonsioVersion"
- compile "com.jayway.android.robotium:robotium-solo:5.5.2"
+ compile "com.jayway.android.robotium:robotium-solo:5.5.3"
compile "org.jsoup:jsoup:$jsoupVersion"
compile "com.github.bumptech.glide:glide:$glideVersion"
compile "com.github.bumptech.glide:okhttp-integration:1.3.1"
diff --git a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java
index d2a13f768..a24e3a485 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java
@@ -10,8 +10,6 @@ import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import com.squareup.okhttp.ResponseBody;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.ClientProtocolException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -19,6 +17,7 @@ import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
@@ -602,10 +601,7 @@ public class GpodnetService {
checkStatusCode(response);
body = response.body();
result = getStringFromResponseBody(body);
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- throw new GpodnetServiceException(e);
- } catch (IOException e) {
+ } catch (Exception e) {
e.printStackTrace();
throw new GpodnetServiceException(e);
} finally {
@@ -652,12 +648,12 @@ public class GpodnetService {
private void checkStatusCode(@NonNull Response response)
throws GpodnetServiceException {
int responseCode = response.code();
- if (responseCode != HttpStatus.SC_OK) {
- if (responseCode == HttpStatus.SC_UNAUTHORIZED) {
+ if (responseCode != HttpURLConnection.HTTP_OK) {
+ if (responseCode == HttpURLConnection.HTTP_UNAUTHORIZED) {
throw new GpodnetServiceAuthenticationException("Wrong username or password");
} else {
- throw new GpodnetServiceBadStatusCodeException(
- "Bad response code: " + responseCode, responseCode);
+ throw new GpodnetServiceBadStatusCodeException("Bad response code: "
+ + responseCode, responseCode);
}
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/APRedirectHandler.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/APRedirectHandler.java
deleted file mode 100644
index 3efcf4da8..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/APRedirectHandler.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package de.danoeh.antennapod.core.service.download;
-
-import android.util.Log;
-import de.danoeh.antennapod.core.BuildConfig;
-import org.apache.http.Header;
-import org.apache.http.HttpResponse;
-import org.apache.http.impl.client.DefaultRedirectHandler;
-import org.apache.http.protocol.HttpContext;
-
-import java.net.URI;
-
-public class APRedirectHandler extends DefaultRedirectHandler {
- // Identifier for logger
- private static final String TAG = "APRedirectHandler";
- // Header field, which has to be potentially fixed
- private static final String LOC = "Location";
- // Regular expressions for character strings, which should not appear in URLs
- private static final String CHi[] = { "\\{", "\\}", "\\|", "\\\\", "\\^", "~", "\\[", "\\]", "\\`"};
- private static final String CHo[] = { "%7B", "%7D", "%7C", "%5C", "%5E", "%7E", "%5B", "%5D", "%60"};
-
- /**
- * Workaround for broken URLs in redirection.
- * Proper solution involves LaxRedirectStrategy() which is not available in
- * current API yet.
- */
- @Override
- public URI getLocationURI(HttpResponse response, HttpContext context)
- throws org.apache.http.ProtocolException {
-
- Header h[] = response.getHeaders(LOC);
- if (h.length>0) {
- String s = h[0].getValue();
-
- // Fix broken URL
- for(int i=0; i<CHi.length;i++)
- s = s.replaceAll(CHi[i], CHo[i]);
-
- // If anything had to be fixed, then replace the header
- if (!s.equals(h[0].getValue()))
- {
- if (BuildConfig.DEBUG)
- Log.d(TAG, "Original URL: " + h[0].getValue());
-
- response.setHeader(LOC, s);
-
- if (BuildConfig.DEBUG)
- Log.d(TAG, "Fixed URL: " + s);
- }
- }
-
- // call DefaultRedirectHandler with fixed URL
- return super.getLocationURI(response, context);
- }
-}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
index 9768bd5de..29c44207d 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
@@ -22,7 +22,6 @@ import android.util.Log;
import android.webkit.URLUtil;
import org.apache.commons.io.FileUtils;
-import org.apache.http.HttpStatus;
import org.xml.sax.SAXException;
import java.io.File;
@@ -187,7 +186,7 @@ public class DownloadService extends Service {
if (status.getReason() == DownloadError.ERROR_UNAUTHORIZED) {
postAuthenticationNotification(downloader.getDownloadRequest());
} else if (status.getReason() == DownloadError.ERROR_HTTP_DATA_ERROR
- && Integer.valueOf(status.getReasonDetailed()) == HttpStatus.SC_REQUESTED_RANGE_NOT_SATISFIABLE) {
+ && Integer.valueOf(status.getReasonDetailed()) == 416) {
Log.d(TAG, "Requested invalid range, restarting download from the beginning");
FileUtils.deleteQuietly(new File(downloader.getDownloadRequest().getDestination()));
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java
index 9f54db477..25ab2f6fd 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java
@@ -11,7 +11,6 @@ import com.squareup.okhttp.ResponseBody;
import com.squareup.okhttp.internal.http.HttpDate;
import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpStatus;
import java.io.BufferedInputStream;
import java.io.File;
@@ -171,7 +170,7 @@ public class HttpDownloader extends Downloader {
String contentRangeHeader = (fileExists) ? response.header("Content-Range") : null;
- if (fileExists && response.code() == HttpStatus.SC_PARTIAL_CONTENT
+ if (fileExists && response.code() == HttpURLConnection.HTTP_PARTIAL
&& !TextUtils.isEmpty(contentRangeHeader)) {
String start = contentRangeHeader.substring("bytes ".length(),
contentRangeHeader.indexOf("-"));
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/ShakeListener.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/ShakeListener.java
index 446061ea6..fcd96826b 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/ShakeListener.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/ShakeListener.java
@@ -5,7 +5,6 @@ import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
-import android.util.FloatMath;
import android.util.Log;
public class ShakeListener implements SensorEventListener
@@ -50,8 +49,8 @@ public class ShakeListener implements SensorEventListener
float gY = event.values[1] / SensorManager.GRAVITY_EARTH;
float gZ = event.values[2] / SensorManager.GRAVITY_EARTH;
- float gForce = FloatMath.sqrt(gX*gX + gY*gY + gZ*gZ);
- if (gForce > 2.25f) {
+ double gForce = Math.sqrt(gX*gX + gY*gY + gZ*gZ);
+ if (gForce > 2.25) {
Log.d(TAG, "Detected shake " + gForce);
mSleepTimer.onShake();
}