summaryrefslogtreecommitdiff
path: root/app/src/main/java/de/danoeh/antennapod/fragment
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/fragment')
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/actions/FeedMultiSelectActionHandler.java4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/AutoDownloadPreferencesFragment.java202
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/DownloadsPreferencesFragment.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/NotificationPreferencesFragment.java28
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/AboutFragment.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/ContributorsPagerFragment.java87
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/DevelopersFragment.java57
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/LicensesFragment.java126
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/SpecialThanksFragment.java56
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/TranslatorsFragment.java56
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/GpodderAuthenticationFragment.java279
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/NextcloudAuthenticationFragment.java111
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/SynchronizationPreferencesFragment.java221
15 files changed, 14 insertions, 1229 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java
index 4626c061f..c40a56dce 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java
@@ -38,10 +38,10 @@ import de.danoeh.antennapod.model.feed.VolumeAdaptionSetting;
import de.danoeh.antennapod.storage.preferences.UserPreferences;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.storage.DBWriter;
-import de.danoeh.antennapod.dialog.AuthenticationDialog;
import de.danoeh.antennapod.dialog.EpisodeFilterDialog;
import de.danoeh.antennapod.dialog.FeedPreferenceSkipDialog;
import de.danoeh.antennapod.dialog.TagSettingsDialog;
+import de.danoeh.antennapod.ui.preferences.screen.synchronization.AuthenticationDialog;
import io.reactivex.Maybe;
import io.reactivex.MaybeOnSubscribe;
import io.reactivex.android.schedulers.AndroidSchedulers;
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/actions/FeedMultiSelectActionHandler.java b/app/src/main/java/de/danoeh/antennapod/fragment/actions/FeedMultiSelectActionHandler.java
index 78ddccf0b..b5a9215e6 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/actions/FeedMultiSelectActionHandler.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/actions/FeedMultiSelectActionHandler.java
@@ -18,10 +18,10 @@ import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.databinding.PlaybackSpeedFeedSettingDialogBinding;
import de.danoeh.antennapod.dialog.RemoveFeedDialog;
import de.danoeh.antennapod.dialog.TagSettingsDialog;
-import de.danoeh.antennapod.fragment.preferences.dialog.PreferenceListDialog;
-import de.danoeh.antennapod.fragment.preferences.dialog.PreferenceSwitchDialog;
import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.model.feed.FeedPreferences;
+import de.danoeh.antennapod.fragment.preferences.dialog.PreferenceListDialog;
+import de.danoeh.antennapod.fragment.preferences.dialog.PreferenceSwitchDialog;
public class FeedMultiSelectActionHandler {
private static final String TAG = "FeedSelectHandler";
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AutoDownloadPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AutoDownloadPreferencesFragment.java
deleted file mode 100644
index 50e74bee4..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AutoDownloadPreferencesFragment.java
+++ /dev/null
@@ -1,202 +0,0 @@
-package de.danoeh.antennapod.fragment.preferences;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.content.Context;
-import android.content.res.Resources;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiManager;
-import android.os.Build;
-import android.os.Bundle;
-import android.util.Log;
-import androidx.preference.CheckBoxPreference;
-import androidx.preference.ListPreference;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceFragmentCompat;
-import androidx.preference.PreferenceScreen;
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.PreferenceActivity;
-import de.danoeh.antennapod.storage.preferences.UserPreferences;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-public class AutoDownloadPreferencesFragment extends PreferenceFragmentCompat {
- private static final String TAG = "AutoDnldPrefFragment";
-
- private CheckBoxPreference[] selectedNetworks;
-
- @Override
- public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
- addPreferencesFromResource(R.xml.preferences_autodownload);
-
- setupAutoDownloadScreen();
- buildAutodownloadSelectedNetworksPreference();
- setSelectedNetworksEnabled(UserPreferences.isEnableAutodownloadWifiFilter());
- buildEpisodeCleanupPreference();
- }
-
- @Override
- public void onStart() {
- super.onStart();
- ((PreferenceActivity) getActivity()).getSupportActionBar().setTitle(R.string.pref_automatic_download_title);
- }
-
- @Override
- public void onResume() {
- super.onResume();
- checkAutodownloadItemVisibility(UserPreferences.isEnableAutodownload());
- }
-
- private void setupAutoDownloadScreen() {
- findPreference(UserPreferences.PREF_ENABLE_AUTODL).setOnPreferenceChangeListener(
- (preference, newValue) -> {
- if (newValue instanceof Boolean) {
- checkAutodownloadItemVisibility((Boolean) newValue);
- }
- return true;
- });
- if (Build.VERSION.SDK_INT >= 29) {
- findPreference(UserPreferences.PREF_ENABLE_AUTODL_WIFI_FILTER).setVisible(false);
- }
- findPreference(UserPreferences.PREF_ENABLE_AUTODL_WIFI_FILTER)
- .setOnPreferenceChangeListener(
- (preference, newValue) -> {
- if (newValue instanceof Boolean) {
- setSelectedNetworksEnabled((Boolean) newValue);
- return true;
- } else {
- return false;
- }
- }
- );
- }
-
- private void checkAutodownloadItemVisibility(boolean autoDownload) {
- findPreference(UserPreferences.PREF_EPISODE_CACHE_SIZE).setEnabled(autoDownload);
- findPreference(UserPreferences.PREF_ENABLE_AUTODL_ON_BATTERY).setEnabled(autoDownload);
- findPreference(UserPreferences.PREF_ENABLE_AUTODL_WIFI_FILTER).setEnabled(autoDownload);
- findPreference(UserPreferences.PREF_EPISODE_CLEANUP).setEnabled(autoDownload);
- setSelectedNetworksEnabled(autoDownload && UserPreferences.isEnableAutodownloadWifiFilter());
- }
-
- private static String blankIfNull(String val) {
- return val == null ? "" : val;
- }
-
- @SuppressLint("MissingPermission") // getConfiguredNetworks needs location permission starting with API 29
- private void buildAutodownloadSelectedNetworksPreference() {
- if (Build.VERSION.SDK_INT >= 29) {
- return;
- }
-
- final Activity activity = getActivity();
-
- if (selectedNetworks != null) {
- clearAutodownloadSelectedNetworsPreference();
- }
- // get configured networks
- WifiManager wifiservice = (WifiManager) activity.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
- List<WifiConfiguration> networks = wifiservice.getConfiguredNetworks();
-
- if (networks == null) {
- Log.e(TAG, "Couldn't get list of configure Wi-Fi networks");
- return;
- }
- Collections.sort(networks, (x, y) ->
- blankIfNull(x.SSID).compareToIgnoreCase(blankIfNull(y.SSID)));
- selectedNetworks = new CheckBoxPreference[networks.size()];
- List<String> prefValues = Arrays.asList(UserPreferences
- .getAutodownloadSelectedNetworks());
- PreferenceScreen prefScreen = getPreferenceScreen();
- Preference.OnPreferenceClickListener clickListener = preference -> {
- if (preference instanceof CheckBoxPreference) {
- String key = preference.getKey();
- List<String> prefValuesList = new ArrayList<>(
- Arrays.asList(UserPreferences
- .getAutodownloadSelectedNetworks())
- );
- boolean newValue = ((CheckBoxPreference) preference)
- .isChecked();
- Log.d(TAG, "Selected network " + key + ". New state: " + newValue);
-
- int index = prefValuesList.indexOf(key);
- if (index >= 0 && !newValue) {
- // remove network
- prefValuesList.remove(index);
- } else if (index < 0 && newValue) {
- prefValuesList.add(key);
- }
-
- UserPreferences.setAutodownloadSelectedNetworks(prefValuesList.toArray(new String[0]));
- return true;
- } else {
- return false;
- }
- };
- // create preference for each known network. attach listener and set
- // value
- for (int i = 0; i < networks.size(); i++) {
- WifiConfiguration config = networks.get(i);
-
- CheckBoxPreference pref = new CheckBoxPreference(activity);
- String key = Integer.toString(config.networkId);
- pref.setTitle(config.SSID);
- pref.setKey(key);
- pref.setOnPreferenceClickListener(clickListener);
- pref.setPersistent(false);
- pref.setChecked(prefValues.contains(key));
- selectedNetworks[i] = pref;
- prefScreen.addPreference(pref);
- }
- }
-
- private void clearAutodownloadSelectedNetworsPreference() {
- if (selectedNetworks != null) {
- PreferenceScreen prefScreen = getPreferenceScreen();
-
- for (CheckBoxPreference network : selectedNetworks) {
- if (network != null) {
- prefScreen.removePreference(network);
- }
- }
- }
- }
-
- private void buildEpisodeCleanupPreference() {
- final Resources res = getActivity().getResources();
-
- ListPreference pref = findPreference(UserPreferences.PREF_EPISODE_CLEANUP);
- String[] values = res.getStringArray(
- R.array.episode_cleanup_values);
- String[] entries = new String[values.length];
- for (int x = 0; x < values.length; x++) {
- int v = Integer.parseInt(values[x]);
- if (v == UserPreferences.EPISODE_CLEANUP_EXCEPT_FAVORITE) {
- entries[x] = res.getString(R.string.episode_cleanup_except_favorite_removal);
- } else if (v == UserPreferences.EPISODE_CLEANUP_QUEUE) {
- entries[x] = res.getString(R.string.episode_cleanup_queue_removal);
- } else if (v == UserPreferences.EPISODE_CLEANUP_NULL){
- entries[x] = res.getString(R.string.episode_cleanup_never);
- } else if (v == 0) {
- entries[x] = res.getString(R.string.episode_cleanup_after_listening);
- } else if (v > 0 && v < 24) {
- entries[x] = res.getQuantityString(R.plurals.episode_cleanup_hours_after_listening, v, v);
- } else {
- int numDays = v / 24; // assume underlying value will be NOT fraction of days, e.g., 36 (hours)
- entries[x] = res.getQuantityString(R.plurals.episode_cleanup_days_after_listening, numDays, numDays);
- }
- }
- pref.setEntries(entries);
- }
-
- private void setSelectedNetworksEnabled(boolean b) {
- if (selectedNetworks != null) {
- for (Preference p : selectedNetworks) {
- p.setEnabled(b);
- }
- }
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/DownloadsPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/DownloadsPreferencesFragment.java
index 91ffa1c4f..27028eaa2 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/DownloadsPreferencesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/DownloadsPreferencesFragment.java
@@ -11,7 +11,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.PreferenceActivity;
import de.danoeh.antennapod.core.util.download.FeedUpdateManager;
-import de.danoeh.antennapod.dialog.ChooseDataFolderDialog;
+import de.danoeh.antennapod.ui.preferences.screen.downloads.ChooseDataFolderDialog;
import de.danoeh.antennapod.dialog.ProxyDialog;
import de.danoeh.antennapod.storage.preferences.UserPreferences;
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java
index 6c0e0d456..1cf19aa68 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java
@@ -24,7 +24,6 @@ import androidx.core.app.ShareCompat;
import androidx.core.content.FileProvider;
import androidx.preference.PreferenceFragmentCompat;
import com.google.android.material.snackbar.Snackbar;
-import de.danoeh.antennapod.PodcastApp;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.OpmlImportActivity;
import de.danoeh.antennapod.activity.PreferenceActivity;
@@ -38,6 +37,7 @@ import de.danoeh.antennapod.storage.importexport.FavoritesWriter;
import de.danoeh.antennapod.storage.importexport.HtmlWriter;
import de.danoeh.antennapod.storage.importexport.OpmlWriter;
import de.danoeh.antennapod.storage.preferences.UserPreferences;
+import de.danoeh.antennapod.ui.appstartintent.MainActivityStarter;
import io.reactivex.Completable;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -205,7 +205,7 @@ public class ImportExportPreferencesFragment extends PreferenceFragmentCompat {
builder.setTitle(R.string.successful_import_label);
builder.setMessage(R.string.import_ok);
builder.setCancelable(false);
- builder.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> PodcastApp.forceRestart());
+ builder.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> forceRestart());
builder.show();
}
@@ -362,6 +362,12 @@ public class ImportExportPreferencesFragment extends PreferenceFragmentCompat {
((SwitchPreferenceCompat) findPreference(PREF_AUTOMATIC_DATABASE_EXPORT)).setChecked(true);
}
+ private void forceRestart() {
+ Intent intent = new MainActivityStarter(getContext()).getIntent();
+ getContext().getApplicationContext().startActivity(intent);
+ Runtime.getRuntime().exit(0);
+ }
+
private static class BackupDatabase extends ActivityResultContracts.CreateDocument {
BackupDatabase() {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/NotificationPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/NotificationPreferencesFragment.java
deleted file mode 100644
index ba17cedb2..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/NotificationPreferencesFragment.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package de.danoeh.antennapod.fragment.preferences;
-
-import android.os.Bundle;
-import androidx.preference.PreferenceFragmentCompat;
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.PreferenceActivity;
-import de.danoeh.antennapod.core.sync.SynchronizationSettings;
-
-public class NotificationPreferencesFragment extends PreferenceFragmentCompat {
-
- private static final String PREF_GPODNET_NOTIFICATIONS = "pref_gpodnet_notifications";
-
- @Override
- public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
- addPreferencesFromResource(R.xml.preferences_notifications);
- setUpScreen();
- }
-
- @Override
- public void onStart() {
- super.onStart();
- ((PreferenceActivity) getActivity()).getSupportActionBar().setTitle(R.string.notification_pref_fragment);
- }
-
- private void setUpScreen() {
- findPreference(PREF_GPODNET_NOTIFICATIONS).setEnabled(SynchronizationSettings.isProviderConnected());
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/AboutFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/AboutFragment.java
index 01dd5911c..0b17da3e6 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/AboutFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/AboutFragment.java
@@ -11,6 +11,8 @@ import de.danoeh.antennapod.BuildConfig;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.PreferenceActivity;
import de.danoeh.antennapod.core.util.IntentUtils;
+import de.danoeh.antennapod.ui.preferences.screen.about.ContributorsPagerFragment;
+import de.danoeh.antennapod.ui.preferences.screen.about.LicensesFragment;
public class AboutFragment extends PreferenceFragmentCompat {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/ContributorsPagerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/ContributorsPagerFragment.java
deleted file mode 100644
index 139413157..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/ContributorsPagerFragment.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package de.danoeh.antennapod.fragment.preferences.about;
-
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-import androidx.viewpager2.adapter.FragmentStateAdapter;
-import androidx.viewpager2.widget.ViewPager2;
-import com.google.android.material.tabs.TabLayout;
-import com.google.android.material.tabs.TabLayoutMediator;
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.PreferenceActivity;
-
-/**
- * Displays the 'about->Contributors' pager screen.
- */
-public class ContributorsPagerFragment extends Fragment {
- private static final int POS_DEVELOPERS = 0;
- private static final int POS_TRANSLATORS = 1;
- private static final int POS_SPECIAL_THANKS = 2;
- private static final int TOTAL_COUNT = 3;
-
- @Override
- public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- super.onCreateView(inflater, container, savedInstanceState);
-
- View rootView = inflater.inflate(R.layout.pager_fragment, container, false);
- ViewPager2 viewPager = rootView.findViewById(R.id.viewpager);
- viewPager.setAdapter(new StatisticsPagerAdapter(this));
- // Give the TabLayout the ViewPager
- TabLayout tabLayout = rootView.findViewById(R.id.sliding_tabs);
- new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
- switch (position) {
- case POS_DEVELOPERS:
- tab.setText(R.string.developers);
- break;
- case POS_TRANSLATORS:
- tab.setText(R.string.translators);
- break;
- case POS_SPECIAL_THANKS:
- tab.setText(R.string.special_thanks);
- break;
- default:
- break;
- }
- }).attach();
-
- rootView.findViewById(R.id.toolbar).setVisibility(View.GONE);
-
- return rootView;
- }
-
- @Override
- public void onStart() {
- super.onStart();
- ((PreferenceActivity) getActivity()).getSupportActionBar().setTitle(R.string.contributors);
- }
-
- public static class StatisticsPagerAdapter extends FragmentStateAdapter {
-
- StatisticsPagerAdapter(@NonNull Fragment fragment) {
- super(fragment);
- }
-
- @NonNull
- @Override
- public Fragment createFragment(int position) {
- switch (position) {
- case POS_TRANSLATORS:
- return new TranslatorsFragment();
- case POS_SPECIAL_THANKS:
- return new SpecialThanksFragment();
- default:
- case POS_DEVELOPERS:
- return new DevelopersFragment();
- }
- }
-
- @Override
- public int getItemCount() {
- return TOTAL_COUNT;
- }
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/DevelopersFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/DevelopersFragment.java
deleted file mode 100644
index dcd720dc2..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/DevelopersFragment.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package de.danoeh.antennapod.fragment.preferences.about;
-
-import android.os.Bundle;
-import android.view.View;
-import android.widget.Toast;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.ListFragment;
-import de.danoeh.antennapod.adapter.SimpleIconListAdapter;
-import io.reactivex.Single;
-import io.reactivex.SingleOnSubscribe;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.schedulers.Schedulers;
-
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-
-public class DevelopersFragment extends ListFragment {
- private Disposable developersLoader;
-
- @Override
- public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- getListView().setDivider(null);
- getListView().setSelector(android.R.color.transparent);
-
- developersLoader = Single.create((SingleOnSubscribe<ArrayList<SimpleIconListAdapter.ListItem>>) emitter -> {
- ArrayList<SimpleIconListAdapter.ListItem> developers = new ArrayList<>();
- BufferedReader reader = new BufferedReader(new InputStreamReader(
- getContext().getAssets().open("developers.csv"), "UTF-8"));
- String line;
- while ((line = reader.readLine()) != null) {
- String[] info = line.split(";");
- developers.add(new SimpleIconListAdapter.ListItem(info[0], info[2],
- "https://avatars2.githubusercontent.com/u/" + info[1] + "?s=60&v=4"));
- }
- emitter.onSuccess(developers);
- })
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- developers -> setListAdapter(new SimpleIconListAdapter<>(getContext(), developers)),
- error -> Toast.makeText(getContext(), error.getMessage(), Toast.LENGTH_LONG).show()
- );
-
- }
-
- @Override
- public void onStop() {
- super.onStop();
- if (developersLoader != null) {
- developersLoader.dispose();
- }
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/LicensesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/LicensesFragment.java
deleted file mode 100644
index 8b86d106e..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/LicensesFragment.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package de.danoeh.antennapod.fragment.preferences.about;
-
-import android.os.Bundle;
-import android.view.View;
-import android.widget.ListView;
-import android.widget.Toast;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import androidx.fragment.app.ListFragment;
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.PreferenceActivity;
-import de.danoeh.antennapod.adapter.SimpleIconListAdapter;
-import de.danoeh.antennapod.core.util.IntentUtils;
-import io.reactivex.Single;
-import io.reactivex.SingleOnSubscribe;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.schedulers.Schedulers;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.NodeList;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-
-public class LicensesFragment extends ListFragment {
- private Disposable licensesLoader;
- private final ArrayList<LicenseItem> licenses = new ArrayList<>();
-
- @Override
- public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- getListView().setDivider(null);
-
- licensesLoader = Single.create((SingleOnSubscribe<ArrayList<LicenseItem>>) emitter -> {
- licenses.clear();
- InputStream stream = getContext().getAssets().open("licenses.xml");
- DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
- NodeList libraryList = docBuilder.parse(stream).getElementsByTagName("library");
- for (int i = 0; i < libraryList.getLength(); i++) {
- NamedNodeMap lib = libraryList.item(i).getAttributes();
- licenses.add(new LicenseItem(
- lib.getNamedItem("name").getTextContent(),
- String.format("By %s, %s license",
- lib.getNamedItem("author").getTextContent(),
- lib.getNamedItem("license").getTextContent()),
- null,
- lib.getNamedItem("website").getTextContent(),
- lib.getNamedItem("licenseText").getTextContent()));
- }
- emitter.onSuccess(licenses);
- })
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- developers -> setListAdapter(new SimpleIconListAdapter<LicenseItem>(getContext(), developers)),
- error -> Toast.makeText(getContext(), error.getMessage(), Toast.LENGTH_LONG).show()
- );
-
- }
-
- private static class LicenseItem extends SimpleIconListAdapter.ListItem {
- final String licenseUrl;
- final String licenseTextFile;
-
- LicenseItem(String title, String subtitle, String imageUrl, String licenseUrl, String licenseTextFile) {
- super(title, subtitle, imageUrl);
- this.licenseUrl = licenseUrl;
- this.licenseTextFile = licenseTextFile;
- }
- }
-
- @Override
- public void onListItemClick(@NonNull ListView l, @NonNull View v, int position, long id) {
- super.onListItemClick(l, v, position, id);
-
- LicenseItem item = licenses.get(position);
- CharSequence[] items = {"View website", "View license"};
- new MaterialAlertDialogBuilder(getContext())
- .setTitle(item.title)
- .setItems(items, (dialog, which) -> {
- if (which == 0) {
- IntentUtils.openInBrowser(getContext(), item.licenseUrl);
- } else if (which == 1) {
- showLicenseText(item.licenseTextFile);
- }
- }).show();
- }
-
- private void showLicenseText(String licenseTextFile) {
- try {
- BufferedReader reader = new BufferedReader(new InputStreamReader(
- getContext().getAssets().open(licenseTextFile), "UTF-8"));
- StringBuilder licenseText = new StringBuilder();
- String line;
- while ((line = reader.readLine()) != null) {
- licenseText.append(line).append("\n");
- }
-
- new MaterialAlertDialogBuilder(getContext())
- .setMessage(licenseText)
- .show();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- @Override
- public void onStop() {
- super.onStop();
- if (licensesLoader != null) {
- licensesLoader.dispose();
- }
- }
-
- @Override
- public void onStart() {
- super.onStart();
- ((PreferenceActivity) getActivity()).getSupportActionBar().setTitle(R.string.licenses);
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/SpecialThanksFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/SpecialThanksFragment.java
deleted file mode 100644
index 1b4beeea0..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/SpecialThanksFragment.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package de.danoeh.antennapod.fragment.preferences.about;
-
-import android.os.Bundle;
-import android.view.View;
-import android.widget.Toast;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.ListFragment;
-import de.danoeh.antennapod.adapter.SimpleIconListAdapter;
-import io.reactivex.Single;
-import io.reactivex.SingleOnSubscribe;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.schedulers.Schedulers;
-
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-
-public class SpecialThanksFragment extends ListFragment {
- private Disposable translatorsLoader;
-
- @Override
- public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- getListView().setDivider(null);
- getListView().setSelector(android.R.color.transparent);
-
- translatorsLoader = Single.create((SingleOnSubscribe<ArrayList<SimpleIconListAdapter.ListItem>>) emitter -> {
- ArrayList<SimpleIconListAdapter.ListItem> translators = new ArrayList<>();
- BufferedReader reader = new BufferedReader(new InputStreamReader(
- getContext().getAssets().open("special_thanks.csv"), "UTF-8"));
- String line;
- while ((line = reader.readLine()) != null) {
- String[] info = line.split(";");
- translators.add(new SimpleIconListAdapter.ListItem(info[0], info[1], info[2]));
- }
- emitter.onSuccess(translators);
- })
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- translators -> setListAdapter(new SimpleIconListAdapter<>(getContext(), translators)),
- error -> Toast.makeText(getContext(), error.getMessage(), Toast.LENGTH_LONG).show()
- );
-
- }
-
- @Override
- public void onStop() {
- super.onStop();
- if (translatorsLoader != null) {
- translatorsLoader.dispose();
- }
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/TranslatorsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/TranslatorsFragment.java
deleted file mode 100644
index ed0d53145..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/TranslatorsFragment.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package de.danoeh.antennapod.fragment.preferences.about;
-
-import android.os.Bundle;
-import android.view.View;
-import android.widget.Toast;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.ListFragment;
-import de.danoeh.antennapod.adapter.SimpleIconListAdapter;
-import io.reactivex.Single;
-import io.reactivex.SingleOnSubscribe;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.schedulers.Schedulers;
-
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-
-public class TranslatorsFragment extends ListFragment {
- private Disposable translatorsLoader;
-
- @Override
- public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- getListView().setDivider(null);
- getListView().setSelector(android.R.color.transparent);
-
- translatorsLoader = Single.create((SingleOnSubscribe<ArrayList<SimpleIconListAdapter.ListItem>>) emitter -> {
- ArrayList<SimpleIconListAdapter.ListItem> translators = new ArrayList<>();
- BufferedReader reader = new BufferedReader(new InputStreamReader(
- getContext().getAssets().open("translators.csv"), "UTF-8"));
- String line;
- while ((line = reader.readLine()) != null) {
- String[] info = line.split(";");
- translators.add(new SimpleIconListAdapter.ListItem(info[0], info[1], null));
- }
- emitter.onSuccess(translators);
- })
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- translators -> setListAdapter(new SimpleIconListAdapter<>(getContext(), translators)),
- error -> Toast.makeText(getContext(), error.getMessage(), Toast.LENGTH_LONG).show()
- );
-
- }
-
- @Override
- public void onStop() {
- super.onStop();
- if (translatorsLoader != null) {
- translatorsLoader.dispose();
- }
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/GpodderAuthenticationFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/GpodderAuthenticationFragment.java
deleted file mode 100644
index ccd450345..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/GpodderAuthenticationFragment.java
+++ /dev/null
@@ -1,279 +0,0 @@
-package de.danoeh.antennapod.fragment.preferences.synchronization;
-
-import android.app.Dialog;
-import android.content.Context;
-import android.os.Build;
-import android.os.Bundle;
-import android.view.View;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-import android.widget.ViewFlipper;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import androidx.fragment.app.DialogFragment;
-import com.google.android.material.button.MaterialButton;
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.net.common.AntennapodHttpClient;
-import de.danoeh.antennapod.core.sync.SyncService;
-import de.danoeh.antennapod.core.sync.SynchronizationCredentials;
-import de.danoeh.antennapod.core.sync.SynchronizationProviderViewData;
-import de.danoeh.antennapod.core.sync.SynchronizationSettings;
-import de.danoeh.antennapod.core.util.FileNameGenerator;
-import de.danoeh.antennapod.net.sync.gpoddernet.GpodnetService;
-import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetDevice;
-import io.reactivex.Completable;
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.schedulers.Schedulers;
-
-import java.util.List;
-import java.util.Locale;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Guides the user through the authentication process.
- */
-public class GpodderAuthenticationFragment extends DialogFragment {
- public static final String TAG = "GpodnetAuthActivity";
-
- private ViewFlipper viewFlipper;
-
- private static final int STEP_DEFAULT = -1;
- private static final int STEP_HOSTNAME = 0;
- private static final int STEP_LOGIN = 1;
- private static final int STEP_DEVICE = 2;
- private static final int STEP_FINISH = 3;
-
- private int currentStep = -1;
-
- private GpodnetService service;
- private volatile String username;
- private volatile String password;
- private volatile GpodnetDevice selectedDevice;
- private List<GpodnetDevice> devices;
-
- @NonNull
- @Override
- public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
- MaterialAlertDialogBuilder dialog = new MaterialAlertDialogBuilder(getContext());
- dialog.setTitle(R.string.gpodnetauth_login_butLabel);
- dialog.setNegativeButton(R.string.cancel_label, null);
- dialog.setCancelable(false);
- this.setCancelable(false);
-
- View root = View.inflate(getContext(), R.layout.gpodnetauth_dialog, null);
- viewFlipper = root.findViewById(R.id.viewflipper);
- advance();
- dialog.setView(root);
-
- return dialog.create();
- }
-
- private void setupHostView(View view) {
- final Button selectHost = view.findViewById(R.id.chooseHostButton);
- final EditText serverUrlText = view.findViewById(R.id.serverUrlText);
- selectHost.setOnClickListener(v -> {
- if (serverUrlText.getText().length() == 0) {
- return;
- }
- SynchronizationCredentials.clear(getContext());
- SynchronizationCredentials.setHosturl(serverUrlText.getText().toString());
- service = new GpodnetService(AntennapodHttpClient.getHttpClient(),
- SynchronizationCredentials.getHosturl(), SynchronizationCredentials.getDeviceID(),
- SynchronizationCredentials.getUsername(), SynchronizationCredentials.getPassword());
- getDialog().setTitle(SynchronizationCredentials.getHosturl());
- advance();
- });
- }
-
- private void setupLoginView(View view) {
- final EditText username = view.findViewById(R.id.etxtUsername);
- final EditText password = view.findViewById(R.id.etxtPassword);
- final Button login = view.findViewById(R.id.butLogin);
- final TextView txtvError = view.findViewById(R.id.credentialsError);
- final ProgressBar progressBar = view.findViewById(R.id.progBarLogin);
- final TextView createAccountWarning = view.findViewById(R.id.createAccountWarning);
-
- if (SynchronizationCredentials.getHosturl().startsWith("http://")) {
- createAccountWarning.setVisibility(View.VISIBLE);
- }
- password.setOnEditorActionListener((v, actionID, event) ->
- actionID == EditorInfo.IME_ACTION_GO && login.performClick());
-
- login.setOnClickListener(v -> {
- final String usernameStr = username.getText().toString();
- final String passwordStr = password.getText().toString();
-
- if (usernameHasUnwantedChars(usernameStr)) {
- txtvError.setText(R.string.gpodnetsync_username_characters_error);
- txtvError.setVisibility(View.VISIBLE);
- return;
- }
-
- login.setEnabled(false);
- progressBar.setVisibility(View.VISIBLE);
- txtvError.setVisibility(View.GONE);
- InputMethodManager inputManager = (InputMethodManager) getContext()
- .getSystemService(Context.INPUT_METHOD_SERVICE);
- inputManager.hideSoftInputFromWindow(login.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
-
- Completable.fromAction(() -> {
- service.setCredentials(usernameStr, passwordStr);
- service.login();
- devices = service.getDevices();
- GpodderAuthenticationFragment.this.username = usernameStr;
- GpodderAuthenticationFragment.this.password = passwordStr;
- })
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(() -> {
- login.setEnabled(true);
- progressBar.setVisibility(View.GONE);
- advance();
- }, error -> {
- login.setEnabled(true);
- progressBar.setVisibility(View.GONE);
- txtvError.setText(error.getCause().getMessage());
- txtvError.setVisibility(View.VISIBLE);
- });
-
- });
- }
-
- private void setupDeviceView(View view) {
- final EditText deviceName = view.findViewById(R.id.deviceName);
- final LinearLayout devicesContainer = view.findViewById(R.id.devicesContainer);
- deviceName.setText(generateDeviceName());
-
- MaterialButton createDeviceButton = view.findViewById(R.id.createDeviceButton);
- createDeviceButton.setOnClickListener(v -> createDevice(view));
-
- for (GpodnetDevice device : devices) {
- View row = View.inflate(getContext(), R.layout.gpodnetauth_device_row, null);
- Button selectDeviceButton = row.findViewById(R.id.selectDeviceButton);
- selectDeviceButton.setOnClickListener(v -> {
- selectedDevice = device;
- advance();
- });
- selectDeviceButton.setText(device.getCaption());
- devicesContainer.addView(row);
- }
- }
-
- private void createDevice(View view) {
- final EditText deviceName = view.findViewById(R.id.deviceName);
- final TextView txtvError = view.findViewById(R.id.deviceSelectError);
- final ProgressBar progBarCreateDevice = view.findViewById(R.id.progbarCreateDevice);
-
- String deviceNameStr = deviceName.getText().toString();
- if (isDeviceInList(deviceNameStr)) {
- return;
- }
- progBarCreateDevice.setVisibility(View.VISIBLE);
- txtvError.setVisibility(View.GONE);
- deviceName.setEnabled(false);
-
- Observable.fromCallable(() -> {
- String deviceId = generateDeviceId(deviceNameStr);
- service.configureDevice(deviceId, deviceNameStr, GpodnetDevice.DeviceType.MOBILE);
- return new GpodnetDevice(deviceId, deviceNameStr, GpodnetDevice.DeviceType.MOBILE.toString(), 0);
- })
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(device -> {
- progBarCreateDevice.setVisibility(View.GONE);
- selectedDevice = device;
- advance();
- }, error -> {
- deviceName.setEnabled(true);
- progBarCreateDevice.setVisibility(View.GONE);
- txtvError.setText(error.getMessage());
- txtvError.setVisibility(View.VISIBLE);
- });
- }
-
- private String generateDeviceName() {
- String baseName = getString(R.string.gpodnetauth_device_name_default, Build.MODEL);
- String name = baseName;
- int num = 1;
- while (isDeviceInList(name)) {
- name = baseName + " (" + num + ")";
- num++;
- }
- return name;
- }
-
- private String generateDeviceId(String name) {
- // devices names must be of a certain form:
- // https://gpoddernet.readthedocs.org/en/latest/api/reference/general.html#devices
- return FileNameGenerator.generateFileName(name).replaceAll("\\W", "_").toLowerCase(Locale.US);
- }
-
- private boolean isDeviceInList(String name) {
- if (devices == null) {
- return false;
- }
- String id = generateDeviceId(name);
- for (GpodnetDevice device : devices) {
- if (device.getId().equals(id) || device.getCaption().equals(name)) {
- return true;
- }
- }
- return false;
- }
-
- private void setupFinishView(View view) {
- final Button sync = view.findViewById(R.id.butSyncNow);
-
- sync.setOnClickListener(v -> {
- dismiss();
- SyncService.sync(getContext());
- });
- }
-
- private void advance() {
- if (currentStep < STEP_FINISH) {
- View view = viewFlipper.getChildAt(currentStep + 1);
- if (currentStep == STEP_DEFAULT) {
- setupHostView(view);
- } else if (currentStep == STEP_HOSTNAME) {
- setupLoginView(view);
- } else if (currentStep == STEP_LOGIN) {
- if (username == null || password == null) {
- throw new IllegalStateException("Username and password must not be null here");
- } else {
- setupDeviceView(view);
- }
- } else if (currentStep == STEP_DEVICE) {
- if (selectedDevice == null) {
- throw new IllegalStateException("Device must not be null here");
- } else {
- SynchronizationSettings.setSelectedSyncProvider(SynchronizationProviderViewData.GPODDER_NET);
- SynchronizationCredentials.setUsername(username);
- SynchronizationCredentials.setPassword(password);
- SynchronizationCredentials.setDeviceID(selectedDevice.getId());
- setupFinishView(view);
- }
- }
- if (currentStep != STEP_DEFAULT) {
- viewFlipper.showNext();
- }
- currentStep++;
- } else {
- dismiss();
- }
- }
-
- private boolean usernameHasUnwantedChars(String username) {
- Pattern special = Pattern.compile("[!@#$%&*()+=|<>?{}\\[\\]~]");
- Matcher containsUnwantedChars = special.matcher(username);
- return containsUnwantedChars.find();
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/NextcloudAuthenticationFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/NextcloudAuthenticationFragment.java
deleted file mode 100644
index 88f7ec036..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/NextcloudAuthenticationFragment.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package de.danoeh.antennapod.fragment.preferences.synchronization;
-
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.view.View;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import androidx.fragment.app.DialogFragment;
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.net.common.AntennapodHttpClient;
-import de.danoeh.antennapod.core.sync.SyncService;
-import de.danoeh.antennapod.core.sync.SynchronizationCredentials;
-import de.danoeh.antennapod.core.sync.SynchronizationProviderViewData;
-import de.danoeh.antennapod.core.sync.SynchronizationSettings;
-import de.danoeh.antennapod.databinding.NextcloudAuthDialogBinding;
-import de.danoeh.antennapod.net.sync.nextcloud.NextcloudLoginFlow;
-
-/**
- * Guides the user through the authentication process.
- */
-public class NextcloudAuthenticationFragment extends DialogFragment
- implements NextcloudLoginFlow.AuthenticationCallback {
- public static final String TAG = "NextcloudAuthenticationFragment";
- private static final String EXTRA_LOGIN_FLOW = "LoginFlow";
- private NextcloudAuthDialogBinding viewBinding;
- private NextcloudLoginFlow nextcloudLoginFlow;
- private boolean shouldDismiss = false;
-
- @NonNull
- @Override
- public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
- MaterialAlertDialogBuilder dialog = new MaterialAlertDialogBuilder(getContext());
- dialog.setTitle(R.string.gpodnetauth_login_butLabel);
- dialog.setNegativeButton(R.string.cancel_label, null);
- dialog.setCancelable(false);
- this.setCancelable(false);
-
- viewBinding = NextcloudAuthDialogBinding.inflate(getLayoutInflater());
- dialog.setView(viewBinding.getRoot());
-
- viewBinding.chooseHostButton.setOnClickListener(v -> {
- nextcloudLoginFlow = new NextcloudLoginFlow(AntennapodHttpClient.getHttpClient(),
- viewBinding.serverUrlText.getText().toString(), getContext(), this);
- startLoginFlow();
- });
- if (savedInstanceState != null && savedInstanceState.getStringArrayList(EXTRA_LOGIN_FLOW) != null) {
- nextcloudLoginFlow = NextcloudLoginFlow.fromInstanceState(AntennapodHttpClient.getHttpClient(),
- getContext(), this, savedInstanceState.getStringArrayList(EXTRA_LOGIN_FLOW));
- startLoginFlow();
- }
- return dialog.create();
- }
-
- private void startLoginFlow() {
- viewBinding.errorText.setVisibility(View.GONE);
- viewBinding.chooseHostButton.setVisibility(View.GONE);
- viewBinding.loginProgressContainer.setVisibility(View.VISIBLE);
- viewBinding.serverUrlText.setEnabled(false);
- nextcloudLoginFlow.start();
- }
-
- @Override
- public void onSaveInstanceState(@NonNull Bundle outState) {
- super.onSaveInstanceState(outState);
- if (nextcloudLoginFlow != null) {
- outState.putStringArrayList(EXTRA_LOGIN_FLOW, nextcloudLoginFlow.saveInstanceState());
- }
- }
-
- @Override
- public void onDismiss(@NonNull DialogInterface dialog) {
- super.onDismiss(dialog);
- if (nextcloudLoginFlow != null) {
- nextcloudLoginFlow.cancel();
- }
- }
-
- @Override
- public void onResume() {
- super.onResume();
- if (shouldDismiss) {
- dismiss();
- }
- }
-
- @Override
- public void onNextcloudAuthenticated(String server, String username, String password) {
- SynchronizationSettings.setSelectedSyncProvider(SynchronizationProviderViewData.NEXTCLOUD_GPODDER);
- SynchronizationCredentials.clear(getContext());
- SynchronizationCredentials.setPassword(password);
- SynchronizationCredentials.setHosturl(server);
- SynchronizationCredentials.setUsername(username);
- SyncService.fullSync(getContext());
- if (isResumed()) {
- dismiss();
- } else {
- shouldDismiss = true;
- }
- }
-
- @Override
- public void onNextcloudAuthError(String errorMessage) {
- viewBinding.loginProgressContainer.setVisibility(View.GONE);
- viewBinding.errorText.setVisibility(View.VISIBLE);
- viewBinding.errorText.setText(errorMessage);
- viewBinding.chooseHostButton.setVisibility(View.VISIBLE);
- viewBinding.serverUrlText.setEnabled(true);
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/SynchronizationPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/SynchronizationPreferencesFragment.java
deleted file mode 100644
index 2ac1f78df..000000000
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization/SynchronizationPreferencesFragment.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package de.danoeh.antennapod.fragment.preferences.synchronization;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.text.Spanned;
-import android.text.format.DateUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.ListAdapter;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import androidx.core.text.HtmlCompat;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceFragmentCompat;
-
-import com.google.android.material.snackbar.Snackbar;
-
-import org.greenrobot.eventbus.EventBus;
-import org.greenrobot.eventbus.Subscribe;
-import org.greenrobot.eventbus.ThreadMode;
-
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.PreferenceActivity;
-import de.danoeh.antennapod.event.SyncServiceEvent;
-import de.danoeh.antennapod.core.sync.SynchronizationCredentials;
-import de.danoeh.antennapod.core.sync.SyncService;
-import de.danoeh.antennapod.core.sync.SynchronizationProviderViewData;
-import de.danoeh.antennapod.core.sync.SynchronizationSettings;
-import de.danoeh.antennapod.dialog.AuthenticationDialog;
-
-public class SynchronizationPreferencesFragment extends PreferenceFragmentCompat {
- private static final String PREFERENCE_SYNCHRONIZATION_DESCRIPTION = "preference_synchronization_description";
- private static final String PREFERENCE_GPODNET_SETLOGIN_INFORMATION = "pref_gpodnet_setlogin_information";
- private static final String PREFERENCE_SYNC = "pref_synchronization_sync";
- private static final String PREFERENCE_FORCE_FULL_SYNC = "pref_synchronization_force_full_sync";
- private static final String PREFERENCE_LOGOUT = "pref_synchronization_logout";
-
- @Override
- public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
- addPreferencesFromResource(R.xml.preferences_synchronization);
- setupScreen();
- updateScreen();
- }
-
- @Override
- public void onStart() {
- super.onStart();
- ((PreferenceActivity) getActivity()).getSupportActionBar().setTitle(R.string.synchronization_pref);
- updateScreen();
- EventBus.getDefault().register(this);
- }
-
- @Override
- public void onStop() {
- super.onStop();
- EventBus.getDefault().unregister(this);
- ((PreferenceActivity) getActivity()).getSupportActionBar().setSubtitle("");
- }
-
- @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
- public void syncStatusChanged(SyncServiceEvent event) {
- if (!SynchronizationSettings.isProviderConnected()) {
- return;
- }
- updateScreen();
- if (event.getMessageResId() == R.string.sync_status_error
- || event.getMessageResId() == R.string.sync_status_success) {
- updateLastSyncReport(SynchronizationSettings.isLastSyncSuccessful(),
- SynchronizationSettings.getLastSyncAttempt());
- } else {
- ((PreferenceActivity) getActivity()).getSupportActionBar().setSubtitle(event.getMessageResId());
- }
- }
-
- private void setupScreen() {
- final Activity activity = getActivity();
- findPreference(PREFERENCE_GPODNET_SETLOGIN_INFORMATION)
- .setOnPreferenceClickListener(preference -> {
- AuthenticationDialog dialog = new AuthenticationDialog(activity,
- R.string.pref_gpodnet_setlogin_information_title,
- false, SynchronizationCredentials.getUsername(), null) {
- @Override
- protected void onConfirmed(String username, String password) {
- SynchronizationCredentials.setPassword(password);
- }
- };
- dialog.show();
- return true;
- });
- findPreference(PREFERENCE_SYNC).setOnPreferenceClickListener(preference -> {
- SyncService.syncImmediately(getActivity().getApplicationContext());
- return true;
- });
- findPreference(PREFERENCE_FORCE_FULL_SYNC).setOnPreferenceClickListener(preference -> {
- SyncService.fullSync(getContext());
- return true;
- });
- findPreference(PREFERENCE_LOGOUT).setOnPreferenceClickListener(preference -> {
- SynchronizationCredentials.clear(getContext());
- Snackbar.make(getView(), R.string.pref_synchronization_logout_toast, Snackbar.LENGTH_LONG).show();
- SynchronizationSettings.setSelectedSyncProvider(null);
- updateScreen();
- return true;
- });
- }
-
- private void updateScreen() {
- final boolean loggedIn = SynchronizationSettings.isProviderConnected();
- Preference preferenceHeader = findPreference(PREFERENCE_SYNCHRONIZATION_DESCRIPTION);
- if (loggedIn) {
- SynchronizationProviderViewData selectedProvider =
- SynchronizationProviderViewData.fromIdentifier(getSelectedSyncProviderKey());
- preferenceHeader.setTitle("");
- preferenceHeader.setSummary(selectedProvider.getSummaryResource());
- preferenceHeader.setIcon(selectedProvider.getIconResource());
- preferenceHeader.setOnPreferenceClickListener(null);
- } else {
- preferenceHeader.setTitle(R.string.synchronization_choose_title);
- preferenceHeader.setSummary(R.string.synchronization_summary_unchoosen);
- preferenceHeader.setIcon(R.drawable.ic_cloud);
- preferenceHeader.setOnPreferenceClickListener((preference) -> {
- chooseProviderAndLogin();
- return true;
- });
- }
-
- Preference gpodnetSetLoginPreference = findPreference(PREFERENCE_GPODNET_SETLOGIN_INFORMATION);
- gpodnetSetLoginPreference.setVisible(isProviderSelected(SynchronizationProviderViewData.GPODDER_NET));
- gpodnetSetLoginPreference.setEnabled(loggedIn);
- findPreference(PREFERENCE_SYNC).setEnabled(loggedIn);
- findPreference(PREFERENCE_FORCE_FULL_SYNC).setEnabled(loggedIn);
- findPreference(PREFERENCE_LOGOUT).setEnabled(loggedIn);
- if (loggedIn) {
- String summary = getString(R.string.synchronization_login_status,
- SynchronizationCredentials.getUsername(), SynchronizationCredentials.getHosturl());
- Spanned formattedSummary = HtmlCompat.fromHtml(summary, HtmlCompat.FROM_HTML_MODE_LEGACY);
- findPreference(PREFERENCE_LOGOUT).setSummary(formattedSummary);
- updateLastSyncReport(SynchronizationSettings.isLastSyncSuccessful(),
- SynchronizationSettings.getLastSyncAttempt());
- } else {
- findPreference(PREFERENCE_LOGOUT).setSummary(null);
- ((PreferenceActivity) getActivity()).getSupportActionBar().setSubtitle(null);
- }
- }
-
- private void chooseProviderAndLogin() {
- MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext());
- builder.setTitle(R.string.dialog_choose_sync_service_title);
-
- SynchronizationProviderViewData[] providers = SynchronizationProviderViewData.values();
- ListAdapter adapter = new ArrayAdapter<SynchronizationProviderViewData>(
- getContext(), R.layout.alertdialog_sync_provider_chooser, providers) {
-
- ViewHolder holder;
-
- class ViewHolder {
- ImageView icon;
- TextView title;
- }
-
- public View getView(int position, View convertView, ViewGroup parent) {
- final LayoutInflater inflater = LayoutInflater.from(getContext());
- if (convertView == null) {
- convertView = inflater.inflate(
- R.layout.alertdialog_sync_provider_chooser, null);
-
- holder = new ViewHolder();
- holder.icon = (ImageView) convertView.findViewById(R.id.icon);
- holder.title = (TextView) convertView.findViewById(R.id.title);
- convertView.setTag(holder);
- } else {
- holder = (ViewHolder) convertView.getTag();
- }
- SynchronizationProviderViewData synchronizationProviderViewData = getItem(position);
- holder.title.setText(synchronizationProviderViewData.getSummaryResource());
- holder.icon.setImageResource(synchronizationProviderViewData.getIconResource());
- return convertView;
- }
- };
-
- builder.setAdapter(adapter, (dialog, which) -> {
- switch (providers[which]) {
- case GPODDER_NET:
- new GpodderAuthenticationFragment()
- .show(getChildFragmentManager(), GpodderAuthenticationFragment.TAG);
- break;
- case NEXTCLOUD_GPODDER:
- new NextcloudAuthenticationFragment()
- .show(getChildFragmentManager(), NextcloudAuthenticationFragment.TAG);
- break;
- default:
- break;
- }
- updateScreen();
- });
-
- builder.show();
- }
-
- private boolean isProviderSelected(@NonNull SynchronizationProviderViewData provider) {
- String selectedSyncProviderKey = getSelectedSyncProviderKey();
- return provider.getIdentifier().equals(selectedSyncProviderKey);
- }
-
- private String getSelectedSyncProviderKey() {
- return SynchronizationSettings.getSelectedSyncProviderKey();
- }
-
- private void updateLastSyncReport(boolean successful, long lastTime) {
- String status = String.format("%1$s (%2$s)", getString(successful
- ? R.string.gpodnetsync_pref_report_successful : R.string.gpodnetsync_pref_report_failed),
- DateUtils.getRelativeDateTimeString(getContext(),
- lastTime, DateUtils.MINUTE_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, DateUtils.FORMAT_SHOW_TIME));
- ((PreferenceActivity) getActivity()).getSupportActionBar().setSubtitle(status);
- }
-}