diff options
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/fragment')
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); - } -} |