mirror of
https://github.com/AntennaPod/AntennaPod.git
synced 2025-10-29 03:36:21 +00:00
Target Android 15 (#7626)
This commit is contained in:
parent
0d85e33d66
commit
baedabbc4b
@ -23,17 +23,16 @@ import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts.RequestPermission;
|
||||
import androidx.annotation.Nullable;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import de.danoeh.antennapod.R;
|
||||
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.databinding.OpmlSelectionBinding;
|
||||
import de.danoeh.antennapod.model.feed.Feed;
|
||||
import de.danoeh.antennapod.storage.importexport.OpmlElement;
|
||||
import de.danoeh.antennapod.storage.importexport.OpmlReader;
|
||||
import de.danoeh.antennapod.ui.common.ToolbarActivity;
|
||||
import io.reactivex.Completable;
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
@ -52,7 +51,7 @@ import java.util.Locale;
|
||||
/**
|
||||
* Activity for Opml Import.
|
||||
* */
|
||||
public class OpmlImportActivity extends AppCompatActivity {
|
||||
public class OpmlImportActivity extends ToolbarActivity {
|
||||
private static final String TAG = "OpmlImportBaseActivity";
|
||||
@Nullable private Uri uri;
|
||||
private OpmlSelectionBinding viewBinding;
|
||||
@ -63,7 +62,6 @@ public class OpmlImportActivity extends AppCompatActivity {
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
setTheme(ThemeSwitcher.getTheme(this));
|
||||
super.onCreate(savedInstanceState);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
viewBinding = OpmlSelectionBinding.inflate(getLayoutInflater());
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
package de.danoeh.antennapod.ui.screen.playback.video;
|
||||
|
||||
import android.app.PictureInPictureParams;
|
||||
import android.app.PictureInPictureUiState;
|
||||
import android.content.Intent;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
@ -29,6 +31,7 @@ import android.view.animation.ScaleAnimation;
|
||||
import android.widget.EditText;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.SeekBar;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
|
||||
import com.bumptech.glide.Glide;
|
||||
@ -115,6 +118,30 @@ public class VideoplayerActivity extends CastEnabledActivity implements SeekBar.
|
||||
setupView();
|
||||
getSupportActionBar().setBackgroundDrawable(new ColorDrawable(0x80000000));
|
||||
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
|
||||
|
||||
@ -11,7 +11,6 @@ import com.google.android.material.snackbar.Snackbar;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.app.ShareCompat;
|
||||
import androidx.core.content.FileProvider;
|
||||
|
||||
@ -21,11 +20,11 @@ import android.view.MenuItem;
|
||||
import android.widget.TextView;
|
||||
|
||||
|
||||
import de.danoeh.antennapod.ui.common.ThemeSwitcher;
|
||||
import de.danoeh.antennapod.CrashReportWriter;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.ui.common.IntentUtils;
|
||||
import de.danoeh.antennapod.ui.common.ToolbarActivity;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
||||
import java.io.File;
|
||||
@ -36,12 +35,11 @@ import java.nio.charset.Charset;
|
||||
/**
|
||||
* Displays the 'crash report' screen
|
||||
*/
|
||||
public class BugReportActivity extends AppCompatActivity {
|
||||
public class BugReportActivity extends ToolbarActivity {
|
||||
private static final String TAG = "BugReportActivity";
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
setTheme(ThemeSwitcher.getTheme(this));
|
||||
super.onCreate(savedInstanceState);
|
||||
getSupportActionBar().setDisplayShowHomeEnabled(true);
|
||||
setContentView(R.layout.bug_report);
|
||||
|
||||
@ -6,27 +6,21 @@ import android.os.Bundle;
|
||||
import android.provider.Settings;
|
||||
import android.util.Log;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import android.view.View;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.preference.PreferenceFragmentCompat;
|
||||
|
||||
import com.bytehamster.lib.preferencesearch.SearchPreferenceResult;
|
||||
import com.bytehamster.lib.preferencesearch.SearchPreferenceResultListener;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.ui.common.ThemeSwitcher;
|
||||
|
||||
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.NotificationPreferencesFragment;
|
||||
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.Subscribe;
|
||||
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
|
||||
* PreferenceController.
|
||||
*/
|
||||
public class PreferenceActivity extends AppCompatActivity implements SearchPreferenceResultListener {
|
||||
public class PreferenceActivity extends ToolbarActivity implements SearchPreferenceResultListener {
|
||||
private static final String FRAGMENT_TAG = "tag_preferences";
|
||||
public static final String OPEN_AUTO_DOWNLOAD_SETTINGS = "OpenAutoDownloadSettings";
|
||||
private SettingsActivityBinding binding;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
setTheme(ThemeSwitcher.getTheme(this));
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
ActionBar ab = getSupportActionBar();
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
buildscript {
|
||||
ext.agpVersion = "8.5.2"
|
||||
ext.agpVersion = "8.6.0"
|
||||
}
|
||||
plugins {
|
||||
id 'com.android.application' version "$agpVersion" apply false
|
||||
@ -36,12 +36,12 @@ project.ext {
|
||||
//Tests
|
||||
awaitilityVersion = "3.1.6"
|
||||
junitVersion = "4.13"
|
||||
robolectricVersion = "4.11"
|
||||
robolectricVersion = "4.14"
|
||||
espressoVersion = "3.5.0"
|
||||
runnerVersion = "1.5.0"
|
||||
rulesVersion = "1.5.0"
|
||||
testCoreVersion = "1.5.0"
|
||||
mockitoVersion = "5.11.0"
|
||||
mockitoVersion = "5.15.2"
|
||||
}
|
||||
|
||||
checkstyle {
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
android {
|
||||
compileSdk 34
|
||||
compileSdk 35
|
||||
|
||||
defaultConfig {
|
||||
minSdk 21
|
||||
targetSdk 34
|
||||
targetSdk 35
|
||||
|
||||
vectorDrawables.useSupportLibrary true
|
||||
vectorDrawables.generatedDensities = []
|
||||
|
||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
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
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@ -83,7 +83,7 @@ public class LocalFeedUpdaterTest {
|
||||
|
||||
mapDummyMetadata(LOCAL_FEED_DIR1);
|
||||
mapDummyMetadata(LOCAL_FEED_DIR2);
|
||||
shadowOf(MimeTypeMap.getSingleton()).addExtensionMimeTypMapping("mp3", "audio/mp3");
|
||||
shadowOf(MimeTypeMap.getSingleton()).addExtensionMimeTypeMapping("mp3", "audio/mp3");
|
||||
}
|
||||
|
||||
@After
|
||||
|
||||
@ -6,20 +6,6 @@ import androidx.annotation.StyleRes;
|
||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||
|
||||
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
|
||||
public static int getNoTitleTheme(Context context) {
|
||||
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.SeekBar;
|
||||
import android.widget.TextView;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import de.danoeh.antennapod.ui.common.ThemeSwitcher;
|
||||
import de.danoeh.antennapod.ui.common.ToolbarActivity;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public class WidgetConfigActivity extends AppCompatActivity {
|
||||
public class WidgetConfigActivity extends ToolbarActivity {
|
||||
private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
|
||||
|
||||
private SeekBar opacitySeekBar;
|
||||
@ -30,7 +29,6 @@ public class WidgetConfigActivity extends AppCompatActivity {
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
setTheme(ThemeSwitcher.getTheme(this));
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_widget_config);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user