Target Android 15 (#7626)

This commit is contained in:
ByteHamster 2025-01-25 08:16:48 +01:00 committed by GitHub
parent 0d85e33d66
commit baedabbc4b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 97 additions and 44 deletions

View File

@ -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());

View File

@ -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

View File

@ -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);

View File

@ -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();

View File

@ -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 {

View File

@ -1,9 +1,9 @@
android {
compileSdk 34
compileSdk 35
defaultConfig {
minSdk 21
targetSdk 34
targetSdk 35
vectorDrawables.useSupportLibrary true
vectorDrawables.generatedDensities = []

View File

@ -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

View File

@ -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

View File

@ -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();

View File

@ -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));
}
}

View 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>

View File

@ -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);