mirror of
https://github.com/AntennaPod/AntennaPod.git
synced 2025-12-01 12:31:45 +00:00
Target Android 15 (#7626)
This commit is contained in:
@ -23,17 +23,16 @@ import androidx.activity.result.ActivityResultLauncher;
|
|||||||
import androidx.activity.result.contract.ActivityResultContracts.RequestPermission;
|
import androidx.activity.result.contract.ActivityResultContracts.RequestPermission;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
|
||||||
import androidx.core.app.ActivityCompat;
|
import androidx.core.app.ActivityCompat;
|
||||||
import de.danoeh.antennapod.R;
|
import de.danoeh.antennapod.R;
|
||||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||||
import de.danoeh.antennapod.ui.common.ThemeSwitcher;
|
|
||||||
|
|
||||||
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
|
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
|
||||||
import de.danoeh.antennapod.databinding.OpmlSelectionBinding;
|
import de.danoeh.antennapod.databinding.OpmlSelectionBinding;
|
||||||
import de.danoeh.antennapod.model.feed.Feed;
|
import de.danoeh.antennapod.model.feed.Feed;
|
||||||
import de.danoeh.antennapod.storage.importexport.OpmlElement;
|
import de.danoeh.antennapod.storage.importexport.OpmlElement;
|
||||||
import de.danoeh.antennapod.storage.importexport.OpmlReader;
|
import de.danoeh.antennapod.storage.importexport.OpmlReader;
|
||||||
|
import de.danoeh.antennapod.ui.common.ToolbarActivity;
|
||||||
import io.reactivex.Completable;
|
import io.reactivex.Completable;
|
||||||
import io.reactivex.Observable;
|
import io.reactivex.Observable;
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||||
@ -52,7 +51,7 @@ import java.util.Locale;
|
|||||||
/**
|
/**
|
||||||
* Activity for Opml Import.
|
* Activity for Opml Import.
|
||||||
* */
|
* */
|
||||||
public class OpmlImportActivity extends AppCompatActivity {
|
public class OpmlImportActivity extends ToolbarActivity {
|
||||||
private static final String TAG = "OpmlImportBaseActivity";
|
private static final String TAG = "OpmlImportBaseActivity";
|
||||||
@Nullable private Uri uri;
|
@Nullable private Uri uri;
|
||||||
private OpmlSelectionBinding viewBinding;
|
private OpmlSelectionBinding viewBinding;
|
||||||
@ -63,7 +62,6 @@ public class OpmlImportActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
setTheme(ThemeSwitcher.getTheme(this));
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
viewBinding = OpmlSelectionBinding.inflate(getLayoutInflater());
|
viewBinding = OpmlSelectionBinding.inflate(getLayoutInflater());
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
package de.danoeh.antennapod.ui.screen.playback.video;
|
package de.danoeh.antennapod.ui.screen.playback.video;
|
||||||
|
|
||||||
|
import android.app.PictureInPictureParams;
|
||||||
|
import android.app.PictureInPictureUiState;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.PixelFormat;
|
import android.graphics.PixelFormat;
|
||||||
import android.graphics.drawable.ColorDrawable;
|
import android.graphics.drawable.ColorDrawable;
|
||||||
@ -29,6 +31,7 @@ import android.view.animation.ScaleAnimation;
|
|||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
import android.widget.SeekBar;
|
import android.widget.SeekBar;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
|
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
|
||||||
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.Glide;
|
||||||
@ -115,6 +118,30 @@ public class VideoplayerActivity extends CastEnabledActivity implements SeekBar.
|
|||||||
setupView();
|
setupView();
|
||||||
getSupportActionBar().setBackgroundDrawable(new ColorDrawable(0x80000000));
|
getSupportActionBar().setBackgroundDrawable(new ColorDrawable(0x80000000));
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
|
setupPip();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setupPip() {
|
||||||
|
if (Build.VERSION.SDK_INT < 26) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder();
|
||||||
|
if (Build.VERSION.SDK_INT >= 31) {
|
||||||
|
builder.setAutoEnterEnabled(true);
|
||||||
|
builder.setSourceRectHint(viewBinding.getRoot().getClipBounds());
|
||||||
|
}
|
||||||
|
setPictureInPictureParams(builder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPictureInPictureUiStateChanged(@NonNull PictureInPictureUiState pipState) {
|
||||||
|
super.onPictureInPictureUiStateChanged(pipState);
|
||||||
|
if (Build.VERSION.SDK_INT < 35) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (pipState.isTransitioningToPip()) {
|
||||||
|
hideVideoControls(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -11,7 +11,6 @@ import com.google.android.material.snackbar.Snackbar;
|
|||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
|
||||||
import androidx.core.app.ShareCompat;
|
import androidx.core.app.ShareCompat;
|
||||||
import androidx.core.content.FileProvider;
|
import androidx.core.content.FileProvider;
|
||||||
|
|
||||||
@ -21,11 +20,11 @@ import android.view.MenuItem;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
|
||||||
import de.danoeh.antennapod.ui.common.ThemeSwitcher;
|
|
||||||
import de.danoeh.antennapod.CrashReportWriter;
|
import de.danoeh.antennapod.CrashReportWriter;
|
||||||
import de.danoeh.antennapod.R;
|
import de.danoeh.antennapod.R;
|
||||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||||
import de.danoeh.antennapod.ui.common.IntentUtils;
|
import de.danoeh.antennapod.ui.common.IntentUtils;
|
||||||
|
import de.danoeh.antennapod.ui.common.ToolbarActivity;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -36,12 +35,11 @@ import java.nio.charset.Charset;
|
|||||||
/**
|
/**
|
||||||
* Displays the 'crash report' screen
|
* Displays the 'crash report' screen
|
||||||
*/
|
*/
|
||||||
public class BugReportActivity extends AppCompatActivity {
|
public class BugReportActivity extends ToolbarActivity {
|
||||||
private static final String TAG = "BugReportActivity";
|
private static final String TAG = "BugReportActivity";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
setTheme(ThemeSwitcher.getTheme(this));
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
getSupportActionBar().setDisplayShowHomeEnabled(true);
|
getSupportActionBar().setDisplayShowHomeEnabled(true);
|
||||||
setContentView(R.layout.bug_report);
|
setContentView(R.layout.bug_report);
|
||||||
|
|||||||
@ -6,27 +6,21 @@ import android.os.Bundle;
|
|||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.inputmethod.InputMethodManager;
|
import android.view.inputmethod.InputMethodManager;
|
||||||
|
|
||||||
import androidx.appcompat.app.ActionBar;
|
import androidx.appcompat.app.ActionBar;
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
|
||||||
import androidx.preference.PreferenceFragmentCompat;
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
|
|
||||||
import com.bytehamster.lib.preferencesearch.SearchPreferenceResult;
|
import com.bytehamster.lib.preferencesearch.SearchPreferenceResult;
|
||||||
import com.bytehamster.lib.preferencesearch.SearchPreferenceResultListener;
|
import com.bytehamster.lib.preferencesearch.SearchPreferenceResultListener;
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
import de.danoeh.antennapod.R;
|
import de.danoeh.antennapod.R;
|
||||||
import de.danoeh.antennapod.ui.common.ThemeSwitcher;
|
|
||||||
|
|
||||||
import de.danoeh.antennapod.event.MessageEvent;
|
import de.danoeh.antennapod.event.MessageEvent;
|
||||||
|
import de.danoeh.antennapod.ui.common.ToolbarActivity;
|
||||||
|
import de.danoeh.antennapod.ui.preferences.databinding.SettingsActivityBinding;
|
||||||
import de.danoeh.antennapod.ui.preferences.screen.AutoDownloadPreferencesFragment;
|
import de.danoeh.antennapod.ui.preferences.screen.AutoDownloadPreferencesFragment;
|
||||||
import de.danoeh.antennapod.ui.preferences.screen.NotificationPreferencesFragment;
|
import de.danoeh.antennapod.ui.preferences.screen.NotificationPreferencesFragment;
|
||||||
import de.danoeh.antennapod.ui.preferences.screen.synchronization.SynchronizationPreferencesFragment;
|
import de.danoeh.antennapod.ui.preferences.screen.synchronization.SynchronizationPreferencesFragment;
|
||||||
import de.danoeh.antennapod.ui.preferences.databinding.SettingsActivityBinding;
|
|
||||||
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.EventBus;
|
||||||
import org.greenrobot.eventbus.Subscribe;
|
import org.greenrobot.eventbus.Subscribe;
|
||||||
import org.greenrobot.eventbus.ThreadMode;
|
import org.greenrobot.eventbus.ThreadMode;
|
||||||
@ -35,14 +29,13 @@ import org.greenrobot.eventbus.ThreadMode;
|
|||||||
* PreferenceActivity for API 11+. In order to change the behavior of the preference UI, see
|
* PreferenceActivity for API 11+. In order to change the behavior of the preference UI, see
|
||||||
* PreferenceController.
|
* PreferenceController.
|
||||||
*/
|
*/
|
||||||
public class PreferenceActivity extends AppCompatActivity implements SearchPreferenceResultListener {
|
public class PreferenceActivity extends ToolbarActivity implements SearchPreferenceResultListener {
|
||||||
private static final String FRAGMENT_TAG = "tag_preferences";
|
private static final String FRAGMENT_TAG = "tag_preferences";
|
||||||
public static final String OPEN_AUTO_DOWNLOAD_SETTINGS = "OpenAutoDownloadSettings";
|
public static final String OPEN_AUTO_DOWNLOAD_SETTINGS = "OpenAutoDownloadSettings";
|
||||||
private SettingsActivityBinding binding;
|
private SettingsActivityBinding binding;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
setTheme(ThemeSwitcher.getTheme(this));
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
ActionBar ab = getSupportActionBar();
|
ActionBar ab = getSupportActionBar();
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
buildscript {
|
buildscript {
|
||||||
ext.agpVersion = "8.5.2"
|
ext.agpVersion = "8.6.0"
|
||||||
}
|
}
|
||||||
plugins {
|
plugins {
|
||||||
id 'com.android.application' version "$agpVersion" apply false
|
id 'com.android.application' version "$agpVersion" apply false
|
||||||
@ -36,12 +36,12 @@ project.ext {
|
|||||||
//Tests
|
//Tests
|
||||||
awaitilityVersion = "3.1.6"
|
awaitilityVersion = "3.1.6"
|
||||||
junitVersion = "4.13"
|
junitVersion = "4.13"
|
||||||
robolectricVersion = "4.11"
|
robolectricVersion = "4.14"
|
||||||
espressoVersion = "3.5.0"
|
espressoVersion = "3.5.0"
|
||||||
runnerVersion = "1.5.0"
|
runnerVersion = "1.5.0"
|
||||||
rulesVersion = "1.5.0"
|
rulesVersion = "1.5.0"
|
||||||
testCoreVersion = "1.5.0"
|
testCoreVersion = "1.5.0"
|
||||||
mockitoVersion = "5.11.0"
|
mockitoVersion = "5.15.2"
|
||||||
}
|
}
|
||||||
|
|
||||||
checkstyle {
|
checkstyle {
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
android {
|
android {
|
||||||
compileSdk 34
|
compileSdk 35
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdk 21
|
minSdk 21
|
||||||
targetSdk 34
|
targetSdk 35
|
||||||
|
|
||||||
vectorDrawables.useSupportLibrary true
|
vectorDrawables.useSupportLibrary true
|
||||||
vectorDrawables.generatedDensities = []
|
vectorDrawables.generatedDensities = []
|
||||||
|
|||||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
@ -83,7 +83,7 @@ public class LocalFeedUpdaterTest {
|
|||||||
|
|
||||||
mapDummyMetadata(LOCAL_FEED_DIR1);
|
mapDummyMetadata(LOCAL_FEED_DIR1);
|
||||||
mapDummyMetadata(LOCAL_FEED_DIR2);
|
mapDummyMetadata(LOCAL_FEED_DIR2);
|
||||||
shadowOf(MimeTypeMap.getSingleton()).addExtensionMimeTypMapping("mp3", "audio/mp3");
|
shadowOf(MimeTypeMap.getSingleton()).addExtensionMimeTypeMapping("mp3", "audio/mp3");
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
|
|||||||
@ -6,20 +6,6 @@ import androidx.annotation.StyleRes;
|
|||||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||||
|
|
||||||
public abstract class ThemeSwitcher {
|
public abstract class ThemeSwitcher {
|
||||||
@StyleRes
|
|
||||||
public static int getTheme(Context context) {
|
|
||||||
boolean dynamic = UserPreferences.getIsThemeColorTinted();
|
|
||||||
switch (readThemeValue(context)) {
|
|
||||||
case DARK:
|
|
||||||
return dynamic ? R.style.Theme_AntennaPod_Dynamic_Dark : R.style.Theme_AntennaPod_Dark;
|
|
||||||
case BLACK:
|
|
||||||
return dynamic ? R.style.Theme_AntennaPod_Dynamic_TrueBlack : R.style.Theme_AntennaPod_TrueBlack;
|
|
||||||
case LIGHT: // fall-through
|
|
||||||
default:
|
|
||||||
return dynamic ? R.style.Theme_AntennaPod_Dynamic_Light : R.style.Theme_AntennaPod_Light;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@StyleRes
|
@StyleRes
|
||||||
public static int getNoTitleTheme(Context context) {
|
public static int getNoTitleTheme(Context context) {
|
||||||
boolean dynamic = UserPreferences.getIsThemeColorTinted();
|
boolean dynamic = UserPreferences.getIsThemeColorTinted();
|
||||||
|
|||||||
@ -0,0 +1,33 @@
|
|||||||
|
package de.danoeh.antennapod.ui.common;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.View;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import de.danoeh.antennapod.ui.common.databinding.ToolbarActivityBinding;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Activity showing a toolbar and ensuring that system insets are properly consumed.
|
||||||
|
*/
|
||||||
|
public class ToolbarActivity extends AppCompatActivity {
|
||||||
|
private ToolbarActivityBinding viewBinding;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
setTheme(ThemeSwitcher.getNoTitleTheme(this));
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
viewBinding = ToolbarActivityBinding.inflate(getLayoutInflater());
|
||||||
|
setSupportActionBar(viewBinding.toolbar);
|
||||||
|
super.setContentView(viewBinding.getRoot());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setContentView(View view) {
|
||||||
|
viewBinding.content.removeAllViews();
|
||||||
|
viewBinding.content.addView(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setContentView(int layoutResID) {
|
||||||
|
setContentView(View.inflate(this, layoutResID, null));
|
||||||
|
}
|
||||||
|
}
|
||||||
20
ui/common/src/main/res/layout/toolbar_activity.xml
Normal file
20
ui/common/src/main/res/layout/toolbar_activity.xml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:fitsSystemWindows="true">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:minHeight="?attr/actionBarSize" />
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@android:id/content"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@ -12,12 +12,11 @@ import android.view.View;
|
|||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.SeekBar;
|
import android.widget.SeekBar;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import de.danoeh.antennapod.ui.common.ToolbarActivity;
|
||||||
import de.danoeh.antennapod.ui.common.ThemeSwitcher;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
public class WidgetConfigActivity extends AppCompatActivity {
|
public class WidgetConfigActivity extends ToolbarActivity {
|
||||||
private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
|
private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
|
||||||
|
|
||||||
private SeekBar opacitySeekBar;
|
private SeekBar opacitySeekBar;
|
||||||
@ -30,7 +29,6 @@ public class WidgetConfigActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
setTheme(ThemeSwitcher.getTheme(this));
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_widget_config);
|
setContentView(R.layout.activity_widget_config);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user