summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/checks.yml5
-rw-r--r--README.md2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java1
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackPreferencesFragment.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/UsageStatistics.java21
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java12
-rw-r--r--core/src/main/res/layout/popup_bubble_view.xml4
8 files changed, 37 insertions, 23 deletions
diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml
index 587b6780a..e1281355c 100644
--- a/.github/workflows/checks.yml
+++ b/.github/workflows/checks.yml
@@ -10,6 +10,7 @@ jobs:
code-style:
name: "Code Style"
runs-on: ubuntu-latest
+ timeout-minutes: 45
steps:
- uses: actions/checkout@v2
with:
@@ -37,6 +38,7 @@ jobs:
name: "Gradle Wrapper Validation"
needs: code-style
runs-on: ubuntu-latest
+ timeout-minutes: 45
steps:
- uses: actions/checkout@v2
- uses: gradle/wrapper-validation-action@v1
@@ -45,6 +47,7 @@ jobs:
name: "Static Code Analysis"
needs: code-style
runs-on: ubuntu-latest
+ timeout-minutes: 45
steps:
- uses: actions/checkout@v2
- name: Cache Gradle
@@ -63,6 +66,7 @@ jobs:
name: "Unit Test: ${{ matrix.variant }}"
needs: code-style
runs-on: ubuntu-latest
+ timeout-minutes: 45
strategy:
matrix:
include:
@@ -104,6 +108,7 @@ jobs:
name: "Emulator Test"
needs: code-style
runs-on: macOS-latest
+ timeout-minutes: 45
env:
api-level: 27
steps:
diff --git a/README.md b/README.md
index 8eb13073d..3cc9729ed 100644
--- a/README.md
+++ b/README.md
@@ -17,6 +17,8 @@ You can use the [AntennaPod Forum](https://forum.antennapod.org/) for discussion
Bug reports and feature requests can be submitted [here](https://github.com/AntennaPod/AntennaPod/issues) (please read the [instructions](https://github.com/AntennaPod/AntennaPod/blob/master/CONTRIBUTING.md) on how to report a bug and how to submit a feature request first!).
+We also hold regular community calls to discuss anything AntennaPod-related. [Come join the next call](https://forum.antennapod.org/t/monthly-community-call/1869)!
+
## Help to test AntennaPod
AntennaPod has many users and we don't want them to run into trouble when we add a new feature. It's important that we have a significant group test our app, so that we know all possible combinations of phones, Android versions and use cases work as expected. Check out our wiki on how to join our [Beta testing program](https://antennapod.org/documentation/general/beta)! If a bug is reported during the beta period, chances are high that it will be fixed before the stable version. If it is reported later, fixing might take another full beta cycle. So definitely let us know if something is not right.
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java
index 0a402a14b..b78b777f9 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java
@@ -398,6 +398,7 @@ public abstract class EpisodesListFragment extends Fragment {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(data -> {
progLoading.setVisibility(View.GONE);
+ loadingMoreView.setVisibility(View.GONE);
hasMoreItems = true;
episodes = data;
onFragmentLoaded(episodes);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java
index 7d9814998..6a8bc2585 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java
@@ -188,9 +188,9 @@ public class ItemFragment extends Fragment {
}
private void showOnDemandConfigBalloon(boolean offerStreaming) {
- boolean isLocaleRtl = TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())
+ final boolean isLocaleRtl = TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())
== View.LAYOUT_DIRECTION_RTL;
- Balloon balloon = new Balloon.Builder(getContext())
+ final Balloon balloon = new Balloon.Builder(getContext())
.setArrowOrientation(ArrowOrientation.TOP)
.setArrowOrientationRules(ArrowOrientationRules.ALIGN_FIXED)
.setArrowPosition(0.25f + ((isLocaleRtl ^ offerStreaming) ? 0f : 0.5f))
@@ -203,9 +203,9 @@ public class ItemFragment extends Fragment {
.setDismissWhenTouchOutside(true)
.setLifecycleOwner(this)
.build();
- Button positiveButton = balloon.getContentView().findViewById(R.id.balloon_button_positive);
- Button negativeButton = balloon.getContentView().findViewById(R.id.balloon_button_negative);
- TextView message = balloon.getContentView().findViewById(R.id.balloon_message);
+ final Button positiveButton = balloon.getContentView().findViewById(R.id.balloon_button_positive);
+ final Button negativeButton = balloon.getContentView().findViewById(R.id.balloon_button_negative);
+ final TextView message = balloon.getContentView().findViewById(R.id.balloon_message);
message.setText(offerStreaming
? R.string.on_demand_config_stream_text : R.string.on_demand_config_download_text);
positiveButton.setOnClickListener(v1 -> {
@@ -217,7 +217,7 @@ public class ItemFragment extends Fragment {
balloon.dismiss();
});
negativeButton.setOnClickListener(v1 -> {
- UsageStatistics.askAgainLater(UsageStatistics.ACTION_STREAM); // Type does not matter. Both are silenced.
+ UsageStatistics.doNotAskAgain(UsageStatistics.ACTION_STREAM); // Type does not matter. Both are silenced.
balloon.dismiss();
});
balloon.showAlignBottom(butAction1, 0, (int) (-12 * getResources().getDisplayMetrics().density));
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackPreferencesFragment.java
index 933a7d456..15fdf5d97 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackPreferencesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackPreferencesFragment.java
@@ -56,7 +56,8 @@ public class PlaybackPreferencesFragment extends PreferenceFragmentCompat {
findPreference(PREF_PLAYBACK_PREFER_STREAMING).setOnPreferenceChangeListener((preference, newValue) -> {
// Update all visible lists to reflect new streaming action button
EventBus.getDefault().post(new UnreadItemsUpdateEvent());
- UsageStatistics.askAgainLater(UsageStatistics.ACTION_STREAM);
+ // User consciously decided whether to prefer the streaming button, disable suggestion to change that
+ UsageStatistics.doNotAskAgain(UsageStatistics.ACTION_STREAM);
return true;
});
diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/UsageStatistics.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/UsageStatistics.java
index a5b00b08c..9835f9894 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/preferences/UsageStatistics.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/UsageStatistics.java
@@ -4,8 +4,6 @@ import android.content.Context;
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
-import java.util.Calendar;
-
/**
* Collects statistics about the app usage. The statistics are used to allow on-demand configuration:
* "Looks like you stream a lot. Do you want to toggle the 'Prefer streaming' setting?".
@@ -22,8 +20,7 @@ public class UsageStatistics {
private static final String PREF_DB_NAME = "UsageStatistics";
private static final float MOVING_AVERAGE_WEIGHT = 0.8f;
private static final float MOVING_AVERAGE_BIAS_THRESHOLD = 0.1f;
- private static final long ASK_AGAIN_LATER_DELAY = 1000 * 3600 * 24 * 10; // 10 days
- private static final String SUFFIX_HIDDEN_UNTIL = "_hiddenUntil";
+ private static final String SUFFIX_HIDDEN = "_hidden";
private static SharedPreferences prefs;
public static final StatsAction ACTION_STREAM = new StatsAction("downloadVsStream", 0);
@@ -49,16 +46,16 @@ public class UsageStatistics {
}
public static boolean hasSignificantBiasTo(StatsAction action) {
- final float movingAverage = prefs.getFloat(action.type, 0.5f);
- final long askAfter = prefs.getLong(action.type + SUFFIX_HIDDEN_UNTIL, 0);
- return Math.abs(action.value - movingAverage) < MOVING_AVERAGE_BIAS_THRESHOLD
- && Calendar.getInstance().getTimeInMillis() > askAfter;
+ if (prefs.getBoolean(action.type + SUFFIX_HIDDEN, false)) {
+ return false;
+ } else {
+ final float movingAverage = prefs.getFloat(action.type, 0.5f);
+ return Math.abs(action.value - movingAverage) < MOVING_AVERAGE_BIAS_THRESHOLD;
+ }
}
- public static void askAgainLater(StatsAction action) {
- prefs.edit().putLong(action.type + SUFFIX_HIDDEN_UNTIL,
- Calendar.getInstance().getTimeInMillis() + ASK_AGAIN_LATER_DELAY)
- .apply();
+ public static void doNotAskAgain(StatsAction action) {
+ prefs.edit().putBoolean(action.type + SUFFIX_HIDDEN, true).apply();
}
public static final class StatsAction {
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 01c135061..2393cedef 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
@@ -73,6 +73,10 @@ public class HttpDownloader extends Downloader {
httpReq.cacheControl(new CacheControl.Builder().noCache().build()); // noStore breaks CDNs
}
+ if (uri.getScheme().equals("http")) {
+ httpReq.addHeader("Upgrade-Insecure-Requests", "1");
+ }
+
if (!TextUtils.isEmpty(request.getLastModified())) {
String lastModified = request.getLastModified();
Date lastModifiedDate = DateUtils.parse(lastModified);
@@ -284,15 +288,19 @@ public class HttpDownloader extends Downloader {
responses.add(response);
response = response.priorResponse();
}
- if (responses.isEmpty()) {
+ if (responses.size() < 2) {
return;
}
Collections.reverse(responses);
int firstCode = responses.get(0).code();
+ String firstUrl = responses.get(0).request().url().toString();
+ String secondUrl = responses.get(1).request().url().toString();
if (firstCode == HttpURLConnection.HTTP_MOVED_PERM || firstCode == StatusLine.HTTP_PERM_REDIRECT) {
- String secondUrl = responses.get(1).request().url().toString();
Log.d(TAG, "Detected permanent redirect from " + request.getSource() + " to " + secondUrl);
permanentRedirectUrl = secondUrl;
+ } else if (secondUrl.equals(firstUrl.replace("http://", "https://"))) {
+ Log.d(TAG, "Treating http->https non-permanent redirect as permanent: " + firstUrl);
+ permanentRedirectUrl = secondUrl;
}
}
diff --git a/core/src/main/res/layout/popup_bubble_view.xml b/core/src/main/res/layout/popup_bubble_view.xml
index cc93bec72..7dee08eb5 100644
--- a/core/src/main/res/layout/popup_bubble_view.xml
+++ b/core/src/main/res/layout/popup_bubble_view.xml
@@ -23,7 +23,7 @@
<Button
android:id="@+id/balloon_button_negative"
android:layout_width="wrap_content"
- android:layout_height="36dp"
+ android:layout_height="wrap_content"
android:textColor="?attr/colorOnSecondary"
android:text="@string/no"
style="@style/Widget.MaterialComponents.Button.TextButton" />
@@ -31,7 +31,7 @@
<Button
android:id="@+id/balloon_button_positive"
android:layout_width="wrap_content"
- android:layout_height="36dp"
+ android:layout_height="wrap_content"
android:textColor="?attr/colorOnSecondary"
android:text="@string/yes"
style="@style/Widget.MaterialComponents.Button.TextButton" />