diff options
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/fragment/preferences/synchronization')
3 files changed, 0 insertions, 611 deletions
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); - } -} |