mirror of
https://github.com/etesync/android
synced 2025-03-25 03:45:46 +00:00
Startup dialogs
* add startup dialogs (F-Droid: donations, Play Store: DRM bug, OpenTasks not installed) * allow to reset hints/startup dialogs * AccountSettings: fragment as inner class of activity
This commit is contained in:
parent
5ee8d76b34
commit
1df3ddbe74
@ -46,7 +46,7 @@ public class App extends Application implements SharedPreferences.OnSharedPrefer
|
||||
public final static Logger log = Logger.getLogger("davdroid");
|
||||
|
||||
@Getter
|
||||
private SharedPreferences preferences;
|
||||
private static SharedPreferences preferences;
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
|
@ -282,7 +282,7 @@ public class AccountActivity extends AppCompatActivity implements Toolbar.OnMenu
|
||||
listCardDAV.setEnabled(!info.carddav.refreshing);
|
||||
listCardDAV.setAlpha(info.carddav.refreshing ? 0.5f : 1);
|
||||
|
||||
tbCardDAV.getMenu().findItem(R.id.create_address_book).setVisible(info.carddav.hasHomeSets);
|
||||
tbCardDAV.getMenu().findItem(R.id.create_address_book).setEnabled(info.carddav.hasHomeSets);
|
||||
|
||||
AddressBookAdapter adapter = new AddressBookAdapter(this);
|
||||
adapter.addAll(info.carddav.collections);
|
||||
@ -301,7 +301,7 @@ public class AccountActivity extends AppCompatActivity implements Toolbar.OnMenu
|
||||
listCalDAV.setEnabled(!info.caldav.refreshing);
|
||||
listCalDAV.setAlpha(info.caldav.refreshing ? 0.5f : 1);
|
||||
|
||||
tbCalDAV.getMenu().findItem(R.id.create_calendar).setVisible(info.caldav.hasHomeSets);
|
||||
tbCalDAV.getMenu().findItem(R.id.create_calendar).setEnabled(info.caldav.hasHomeSets);
|
||||
|
||||
final CalendarAdapter adapter = new CalendarAdapter(this);
|
||||
adapter.addAll(info.caldav.collections);
|
||||
|
@ -9,13 +9,24 @@
|
||||
package at.bitfire.davdroid.ui;
|
||||
|
||||
import android.accounts.Account;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.provider.CalendarContract;
|
||||
import android.provider.ContactsContract;
|
||||
import android.support.v4.app.NavUtils;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.preference.EditTextPreference;
|
||||
import android.support.v7.preference.ListPreference;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceFragmentCompat;
|
||||
import android.support.v7.preference.SwitchPreferenceCompat;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import at.bitfire.davdroid.AccountSettings;
|
||||
import at.bitfire.davdroid.R;
|
||||
import at.bitfire.ical4android.TaskProvider;
|
||||
|
||||
public class AccountSettingsActivity extends AppCompatActivity {
|
||||
public final static String EXTRA_ACCOUNT = "account";
|
||||
@ -49,4 +60,143 @@ public class AccountSettingsActivity extends AppCompatActivity {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public static class AccountSettingsFragment extends PreferenceFragmentCompat {
|
||||
Account account;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
account = getArguments().getParcelable(EXTRA_ACCOUNT);
|
||||
refresh();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreatePreferences(Bundle bundle, String s) {
|
||||
addPreferencesFromResource(R.xml.settings_account);
|
||||
}
|
||||
|
||||
public void refresh() {
|
||||
final AccountSettings settings = new AccountSettings(getActivity(), account);
|
||||
|
||||
// category: authentication
|
||||
final EditTextPreference prefUserName = (EditTextPreference)findPreference("username");
|
||||
prefUserName.setSummary(settings.username());
|
||||
prefUserName.setText(settings.username());
|
||||
prefUserName.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
settings.username((String) newValue);
|
||||
refresh(); return false;
|
||||
}
|
||||
});
|
||||
|
||||
final EditTextPreference prefPassword = (EditTextPreference)findPreference("password");
|
||||
prefPassword.setText(settings.password());
|
||||
prefPassword.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
settings.password((String) newValue);
|
||||
refresh(); return false;
|
||||
}
|
||||
});
|
||||
|
||||
final SwitchPreferenceCompat prefPreemptive = (SwitchPreferenceCompat)findPreference("preemptive");
|
||||
prefPreemptive.setChecked(settings.preemptiveAuth());
|
||||
prefPreemptive.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
settings.preemptiveAuth((Boolean) newValue);
|
||||
refresh(); return false;
|
||||
}
|
||||
});
|
||||
|
||||
// category: synchronization
|
||||
final ListPreference prefSyncContacts = (ListPreference)findPreference("sync_interval_contacts");
|
||||
final Long syncIntervalContacts = settings.getSyncInterval(ContactsContract.AUTHORITY);
|
||||
if (syncIntervalContacts != null) {
|
||||
prefSyncContacts.setValue(syncIntervalContacts.toString());
|
||||
if (syncIntervalContacts == AccountSettings.SYNC_INTERVAL_MANUALLY)
|
||||
prefSyncContacts.setSummary(R.string.settings_sync_summary_manually);
|
||||
else
|
||||
prefSyncContacts.setSummary(getString(R.string.settings_sync_summary_periodically, syncIntervalContacts / 60));
|
||||
prefSyncContacts.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
settings.setSyncInterval(ContactsContract.AUTHORITY, Long.parseLong((String) newValue));
|
||||
refresh(); return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
prefSyncContacts.setEnabled(false);
|
||||
prefSyncContacts.setSummary(R.string.settings_sync_summary_not_available);
|
||||
}
|
||||
|
||||
final ListPreference prefSyncCalendars = (ListPreference)findPreference("sync_interval_calendars");
|
||||
final Long syncIntervalCalendars = settings.getSyncInterval(CalendarContract.AUTHORITY);
|
||||
if (syncIntervalCalendars != null) {
|
||||
prefSyncCalendars.setValue(syncIntervalCalendars.toString());
|
||||
if (syncIntervalCalendars == AccountSettings.SYNC_INTERVAL_MANUALLY)
|
||||
prefSyncCalendars.setSummary(R.string.settings_sync_summary_manually);
|
||||
else
|
||||
prefSyncCalendars.setSummary(getString(R.string.settings_sync_summary_periodically, syncIntervalCalendars / 60));
|
||||
prefSyncCalendars.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
settings.setSyncInterval(CalendarContract.AUTHORITY, Long.parseLong((String) newValue));
|
||||
refresh(); return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
prefSyncCalendars.setEnabled(false);
|
||||
prefSyncCalendars.setSummary(R.string.settings_sync_summary_not_available);
|
||||
}
|
||||
|
||||
final ListPreference prefSyncTasks = (ListPreference)findPreference("sync_interval_tasks");
|
||||
final Long syncIntervalTasks = settings.getSyncInterval(TaskProvider.ProviderName.OpenTasks.authority);
|
||||
if (syncIntervalTasks != null) {
|
||||
prefSyncTasks.setValue(syncIntervalTasks.toString());
|
||||
if (syncIntervalTasks == AccountSettings.SYNC_INTERVAL_MANUALLY)
|
||||
prefSyncTasks.setSummary(R.string.settings_sync_summary_manually);
|
||||
else
|
||||
prefSyncTasks.setSummary(getString(R.string.settings_sync_summary_periodically, syncIntervalTasks / 60));
|
||||
prefSyncTasks.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
settings.setSyncInterval(TaskProvider.ProviderName.OpenTasks.authority, Long.parseLong((String) newValue));
|
||||
refresh(); return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
prefSyncTasks.setEnabled(false);
|
||||
prefSyncTasks.setSummary(R.string.settings_sync_summary_not_available);
|
||||
}
|
||||
|
||||
final Preference prefTimeRangePastDays = findPreference("caldav_time_range_past_days");
|
||||
Integer pastDays = settings.getTimeRangePastDays();
|
||||
if (pastDays != null) {
|
||||
//prefTimeRangePastDays.setText(pastDays.toString());
|
||||
prefTimeRangePastDays.setSummary(getResources().getQuantityString(R.plurals.settings_sync_time_range_past_days, pastDays, pastDays));
|
||||
} else {
|
||||
//prefTimeRangePastDays.setText(null);
|
||||
prefTimeRangePastDays.setSummary(R.string.settings_sync_time_range_past_none);
|
||||
}
|
||||
prefTimeRangePastDays.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
int days;
|
||||
try {
|
||||
days = Integer.parseInt((String)newValue);
|
||||
} catch(NumberFormatException ignored) {
|
||||
days = -1;
|
||||
}
|
||||
settings.setTimeRangePastDays(days < 0 ? null : days);
|
||||
refresh(); return false;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,166 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2013 – 2015 Ricki Hirner (bitfire web engineering).
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Public License v3.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*/
|
||||
|
||||
package at.bitfire.davdroid.ui;
|
||||
|
||||
import android.accounts.Account;
|
||||
import android.os.Bundle;
|
||||
import android.provider.CalendarContract;
|
||||
import android.provider.ContactsContract;
|
||||
import android.support.v7.preference.EditTextPreference;
|
||||
import android.support.v7.preference.ListPreference;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceFragmentCompat;
|
||||
import android.support.v7.preference.SwitchPreferenceCompat;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.logging.Level;
|
||||
|
||||
import at.bitfire.davdroid.AccountSettings;
|
||||
import at.bitfire.davdroid.App;
|
||||
import at.bitfire.davdroid.R;
|
||||
import at.bitfire.ical4android.TaskProvider;
|
||||
|
||||
public class AccountSettingsFragment extends PreferenceFragmentCompat {
|
||||
Account account;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
account = getArguments().getParcelable(AccountSettingsActivity.EXTRA_ACCOUNT);
|
||||
refresh();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreatePreferences(Bundle bundle, String s) {
|
||||
addPreferencesFromResource(R.xml.settings_account);
|
||||
}
|
||||
|
||||
public void refresh() {
|
||||
final AccountSettings settings = new AccountSettings(getActivity(), account);
|
||||
|
||||
// category: authentication
|
||||
final EditTextPreference prefUserName = (EditTextPreference)findPreference("username");
|
||||
prefUserName.setSummary(settings.username());
|
||||
prefUserName.setText(settings.username());
|
||||
prefUserName.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
settings.username((String) newValue);
|
||||
refresh(); return false;
|
||||
}
|
||||
});
|
||||
|
||||
final EditTextPreference prefPassword = (EditTextPreference)findPreference("password");
|
||||
prefPassword.setText(settings.password());
|
||||
prefPassword.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
settings.password((String) newValue);
|
||||
refresh(); return false;
|
||||
}
|
||||
});
|
||||
|
||||
final SwitchPreferenceCompat prefPreemptive = (SwitchPreferenceCompat)findPreference("preemptive");
|
||||
prefPreemptive.setChecked(settings.preemptiveAuth());
|
||||
prefPreemptive.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
settings.preemptiveAuth((Boolean) newValue);
|
||||
refresh(); return false;
|
||||
}
|
||||
});
|
||||
|
||||
// category: synchronization
|
||||
final ListPreference prefSyncContacts = (ListPreference)findPreference("sync_interval_contacts");
|
||||
final Long syncIntervalContacts = settings.getSyncInterval(ContactsContract.AUTHORITY);
|
||||
if (syncIntervalContacts != null) {
|
||||
prefSyncContacts.setValue(syncIntervalContacts.toString());
|
||||
if (syncIntervalContacts == AccountSettings.SYNC_INTERVAL_MANUALLY)
|
||||
prefSyncContacts.setSummary(R.string.settings_sync_summary_manually);
|
||||
else
|
||||
prefSyncContacts.setSummary(getString(R.string.settings_sync_summary_periodically, syncIntervalContacts / 60));
|
||||
prefSyncContacts.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
settings.setSyncInterval(ContactsContract.AUTHORITY, Long.parseLong((String) newValue));
|
||||
refresh(); return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
prefSyncContacts.setEnabled(false);
|
||||
prefSyncContacts.setSummary(R.string.settings_sync_summary_not_available);
|
||||
}
|
||||
|
||||
final ListPreference prefSyncCalendars = (ListPreference)findPreference("sync_interval_calendars");
|
||||
final Long syncIntervalCalendars = settings.getSyncInterval(CalendarContract.AUTHORITY);
|
||||
if (syncIntervalCalendars != null) {
|
||||
prefSyncCalendars.setValue(syncIntervalCalendars.toString());
|
||||
if (syncIntervalCalendars == AccountSettings.SYNC_INTERVAL_MANUALLY)
|
||||
prefSyncCalendars.setSummary(R.string.settings_sync_summary_manually);
|
||||
else
|
||||
prefSyncCalendars.setSummary(getString(R.string.settings_sync_summary_periodically, syncIntervalCalendars / 60));
|
||||
prefSyncCalendars.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
settings.setSyncInterval(CalendarContract.AUTHORITY, Long.parseLong((String) newValue));
|
||||
refresh(); return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
prefSyncCalendars.setEnabled(false);
|
||||
prefSyncCalendars.setSummary(R.string.settings_sync_summary_not_available);
|
||||
}
|
||||
|
||||
final ListPreference prefSyncTasks = (ListPreference)findPreference("sync_interval_tasks");
|
||||
final Long syncIntervalTasks = settings.getSyncInterval(TaskProvider.ProviderName.OpenTasks.authority);
|
||||
if (syncIntervalTasks != null) {
|
||||
prefSyncTasks.setValue(syncIntervalTasks.toString());
|
||||
if (syncIntervalTasks == AccountSettings.SYNC_INTERVAL_MANUALLY)
|
||||
prefSyncTasks.setSummary(R.string.settings_sync_summary_manually);
|
||||
else
|
||||
prefSyncTasks.setSummary(getString(R.string.settings_sync_summary_periodically, syncIntervalTasks / 60));
|
||||
prefSyncTasks.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
settings.setSyncInterval(TaskProvider.ProviderName.OpenTasks.authority, Long.parseLong((String) newValue));
|
||||
refresh(); return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
prefSyncTasks.setEnabled(false);
|
||||
prefSyncTasks.setSummary(R.string.settings_sync_summary_not_available);
|
||||
}
|
||||
|
||||
final EditTextPreference prefTimeRangePastDays = (EditTextPreference)findPreference("caldav_time_range_past_days");
|
||||
Integer pastDays = settings.getTimeRangePastDays();
|
||||
if (pastDays != null) {
|
||||
prefTimeRangePastDays.setText(pastDays.toString());
|
||||
prefTimeRangePastDays.setSummary(getResources().getQuantityString(R.plurals.settings_sync_time_range_past_days, pastDays, pastDays));
|
||||
} else {
|
||||
prefTimeRangePastDays.setText(null);
|
||||
prefTimeRangePastDays.setSummary(R.string.settings_sync_time_range_past_none);
|
||||
}
|
||||
prefTimeRangePastDays.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
int days;
|
||||
try {
|
||||
days = Integer.parseInt((String)newValue);
|
||||
} catch(NumberFormatException ignored) {
|
||||
days = -1;
|
||||
}
|
||||
settings.setTimeRangePastDays(days < 0 ? null : days);
|
||||
refresh(); return false;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -12,6 +12,7 @@ import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.design.widget.FloatingActionButton;
|
||||
import android.support.design.widget.NavigationView;
|
||||
import android.support.v4.app.FragmentTransaction;
|
||||
import android.support.v4.view.GravityCompat;
|
||||
import android.support.v4.widget.DrawerLayout;
|
||||
import android.support.v7.app.ActionBarDrawerToggle;
|
||||
@ -52,13 +53,10 @@ public class AccountsActivity extends AppCompatActivity implements NavigationVie
|
||||
navigationView.setNavigationItemSelectedListener(this);
|
||||
|
||||
if (savedInstanceState == null && !getPackageName().equals(getCallingPackage())) {
|
||||
final String installedFrom = installedFrom();
|
||||
if (installedFrom == null || installedFrom.startsWith("org.fdroid"))
|
||||
getSupportFragmentManager().beginTransaction()
|
||||
.add(new DonateDialogFragment(), null)
|
||||
.commit();
|
||||
else if ("com.android.vending".equals(installedFrom))
|
||||
/* TODO Play Store Dialog */;
|
||||
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
||||
for (StartupDialogFragment fragment : StartupDialogFragment.getStartupDialogs(this))
|
||||
ft.add(fragment, null);
|
||||
ft.commit();
|
||||
}
|
||||
}
|
||||
|
||||
@ -92,12 +90,4 @@ public class AccountsActivity extends AppCompatActivity implements NavigationVie
|
||||
return true;
|
||||
}
|
||||
|
||||
private String installedFrom() {
|
||||
try {
|
||||
return getPackageManager().getInstallerPackageName(getPackageName());
|
||||
} catch(IllegalArgumentException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -43,11 +43,11 @@ public class AppSettingsActivity extends AppCompatActivity {
|
||||
|
||||
@Override
|
||||
public void onCreatePreferences(Bundle bundle, String s) {
|
||||
getPreferenceManager().setSharedPreferencesName(App.PREF_FILE);
|
||||
|
||||
addPreferencesFromResource(R.xml.settings_app);
|
||||
prefResetHints = findPreference("reset_hints");
|
||||
prefResetCertificates = findPreference("reset_certificates");
|
||||
|
||||
getPreferenceManager().setSharedPreferencesName(App.PREF_FILE);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -62,7 +62,11 @@ public class AppSettingsActivity extends AppCompatActivity {
|
||||
}
|
||||
|
||||
private void resetHints() {
|
||||
// TODO
|
||||
App.getPreferences().edit()
|
||||
.remove(StartupDialogFragment.PREF_HINT_GOOGLE_PLAY_ACCOUNTS_REMOVED)
|
||||
.remove(StartupDialogFragment.PREF_HINT_OPENTASKS_NOT_INSTALLED)
|
||||
.commit();
|
||||
Snackbar.make(getView(), R.string.app_settings_reset_hints_success, Snackbar.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
private void resetCertificates() {
|
||||
@ -77,7 +81,7 @@ public class AppSettingsActivity extends AppCompatActivity {
|
||||
} catch (KeyStoreException e) {
|
||||
App.log.log(Level.SEVERE, "Couldn't distrust certificate", e);
|
||||
}
|
||||
Snackbar.make(getView(), getString(R.string.app_settings_reset_trusted_certificates_success, deleted), Snackbar.LENGTH_LONG).show();
|
||||
Snackbar.make(getView(), getResources().getQuantityString(R.plurals.app_settings_reset_trusted_certificates_success, deleted, deleted), Snackbar.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,50 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2013 – 2015 Ricki Hirner (bitfire web engineering).
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Public License v3.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*/
|
||||
|
||||
package at.bitfire.davdroid.ui;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
|
||||
import at.bitfire.davdroid.Constants;
|
||||
import at.bitfire.davdroid.R;
|
||||
|
||||
public class DonateDialogFragment extends DialogFragment {
|
||||
|
||||
public DonateDialogFragment() {
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
setCancelable(false);
|
||||
return new AlertDialog.Builder(getActivity())
|
||||
.setIcon(R.drawable.ic_launcher)
|
||||
.setTitle(R.string.donate_title)
|
||||
.setMessage(R.string.donate_message)
|
||||
.setPositiveButton(R.string.donate_now, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
startActivity(new Intent(Intent.ACTION_VIEW, Constants.webUri.buildUpon().appendEncodedPath("donate/").build()));
|
||||
}
|
||||
})
|
||||
.setNeutralButton(R.string.donate_later, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
dismiss();
|
||||
}
|
||||
})
|
||||
.create();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,171 @@
|
||||
/*
|
||||
* Copyright © 2013 – 2015 Ricki Hirner (bitfire web engineering).
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Public License v3.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*/
|
||||
|
||||
package at.bitfire.davdroid.ui;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import at.bitfire.davdroid.App;
|
||||
import at.bitfire.davdroid.Constants;
|
||||
import at.bitfire.davdroid.R;
|
||||
import at.bitfire.davdroid.resource.LocalTaskList;
|
||||
|
||||
public class StartupDialogFragment extends DialogFragment {
|
||||
public static final String
|
||||
PREF_HINT_GOOGLE_PLAY_ACCOUNTS_REMOVED = "hint_google_play_accounts_removed",
|
||||
PREF_HINT_OPENTASKS_NOT_INSTALLED = "hint_opentasks_not_installed";
|
||||
|
||||
private static final String ARGS_MODE = "mode";
|
||||
|
||||
enum Mode {
|
||||
FDROID_DONATE,
|
||||
GOOGLE_PLAY_ACCOUNTS_REMOVED,
|
||||
OPENTASKS_NOT_INSTALLED
|
||||
}
|
||||
|
||||
|
||||
public static StartupDialogFragment[] getStartupDialogs(Context context) {
|
||||
List<StartupDialogFragment> dialogs = new LinkedList<>();
|
||||
|
||||
// store-specific information
|
||||
final String installedFrom = installedFrom(context);
|
||||
if (installedFrom == null || installedFrom.startsWith("org.fdroid"))
|
||||
dialogs.add(StartupDialogFragment.instantiate(Mode.FDROID_DONATE));
|
||||
|
||||
else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP && // only on Android <5
|
||||
"com.android.vending".equals(installedFrom) && // only when installed from Play Store
|
||||
App.getPreferences().getBoolean(PREF_HINT_GOOGLE_PLAY_ACCOUNTS_REMOVED, true)) // and only when "Don't show again" hasn't been clicked yet
|
||||
dialogs.add(StartupDialogFragment.instantiate(Mode.GOOGLE_PLAY_ACCOUNTS_REMOVED));
|
||||
|
||||
// OpenTasks information
|
||||
if (!LocalTaskList.tasksProviderAvailable(context.getContentResolver()) &&
|
||||
App.getPreferences().getBoolean(PREF_HINT_OPENTASKS_NOT_INSTALLED, true))
|
||||
dialogs.add(StartupDialogFragment.instantiate(Mode.OPENTASKS_NOT_INSTALLED));
|
||||
|
||||
Collections.reverse(dialogs);
|
||||
return dialogs.toArray(new StartupDialogFragment[dialogs.size()]);
|
||||
}
|
||||
|
||||
public static StartupDialogFragment instantiate(Mode mode) {
|
||||
StartupDialogFragment frag = new StartupDialogFragment();
|
||||
Bundle args = new Bundle(1);
|
||||
args.putString(ARGS_MODE, mode.name());
|
||||
frag.setArguments(args);
|
||||
return frag;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
setCancelable(false);
|
||||
|
||||
Mode mode = Mode.valueOf(getArguments().getString(ARGS_MODE));
|
||||
switch (mode) {
|
||||
case FDROID_DONATE:
|
||||
return new AlertDialog.Builder(getActivity())
|
||||
.setIcon(R.drawable.ic_launcher)
|
||||
.setTitle(R.string.startup_donate)
|
||||
.setMessage(R.string.startup_donate_message)
|
||||
.setPositiveButton(R.string.startup_donate_now, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
startActivity(new Intent(Intent.ACTION_VIEW, Constants.webUri.buildUpon().appendEncodedPath("donate/").build()));
|
||||
}
|
||||
})
|
||||
.setNegativeButton(R.string.startup_donate_later, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
}
|
||||
})
|
||||
.create();
|
||||
|
||||
case GOOGLE_PLAY_ACCOUNTS_REMOVED:
|
||||
Drawable icon = null;
|
||||
try {
|
||||
icon = getContext().getPackageManager().getApplicationIcon("com.android.vending").getCurrent();
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
App.log.log(Level.WARNING, "Can't load Play Store icon", e);
|
||||
}
|
||||
return new AlertDialog.Builder(getActivity())
|
||||
.setIcon(icon)
|
||||
.setTitle(R.string.startup_google_play_accounts_removed)
|
||||
.setMessage(R.string.startup_google_play_accounts_removed_message)
|
||||
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
}
|
||||
})
|
||||
.setNeutralButton(R.string.startup_google_play_accounts_removed_more_info, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW, Constants.webUri.buildUpon().appendEncodedPath("faq/").build());
|
||||
getContext().startActivity(intent);
|
||||
}
|
||||
})
|
||||
.setNegativeButton(R.string.startup_dont_show_again, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
App.getPreferences().edit().putBoolean(PREF_HINT_GOOGLE_PLAY_ACCOUNTS_REMOVED, false).commit();
|
||||
}
|
||||
})
|
||||
.create();
|
||||
|
||||
case OPENTASKS_NOT_INSTALLED:
|
||||
return new AlertDialog.Builder(getActivity())
|
||||
.setIcon(R.drawable.ic_alarm_on_dark)
|
||||
.setTitle(R.string.startup_opentasks_not_installed)
|
||||
.setMessage(R.string.startup_opentasks_not_installed_message)
|
||||
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
}
|
||||
})
|
||||
.setNeutralButton(R.string.startup_opentasks_not_installed_install, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=org.dmfs.tasks"));
|
||||
getContext().startActivity(intent);
|
||||
}
|
||||
})
|
||||
.setNegativeButton(R.string.startup_dont_show_again, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
App.getPreferences().edit().putBoolean(PREF_HINT_OPENTASKS_NOT_INSTALLED, false).commit();
|
||||
}
|
||||
})
|
||||
.create();
|
||||
}
|
||||
|
||||
throw new IllegalArgumentException(/* illegal mode argument */);
|
||||
}
|
||||
|
||||
private static String installedFrom(Context context) {
|
||||
try {
|
||||
return context.getPackageManager().getInstallerPackageName(context.getPackageName());
|
||||
} catch(IllegalArgumentException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -17,19 +17,20 @@
|
||||
<string name="send">Send</string>
|
||||
<string name="skip">Skip</string>
|
||||
|
||||
<!-- AppSettingsActivity -->
|
||||
<string name="app_settings">Settings</string>
|
||||
<string name="app_settings_user_interface">User interface</string>
|
||||
<string name="app_settings_reset_hints">Reset hints</string>
|
||||
<string name="app_settings_reset_hints_summary">Re-enables hints which have been dismissed previously</string>
|
||||
<string name="app_settings_security">Security</string>
|
||||
<string name="app_settings_reset_trusted_certificates">Reset trusted certificates</string>
|
||||
<string name="app_settings_reset_trusted_certificates_summary">Forgets all certificates which have been accepted previously</string>
|
||||
<string name="app_settings_reset_trusted_certificates_success">Distrusted %d certificate(s)</string>
|
||||
<string name="app_settings_debug">Debugging</string>
|
||||
<string name="app_settings_log_to_file">Log to external file</string>
|
||||
<string name="app_settings_log_to_file_on">Logging to external storage (if available)</string>
|
||||
<string name="app_settings_log_to_file_off">External file logging is disabled</string>
|
||||
<!-- startup dialogs -->
|
||||
<string name="startup_dont_show_again">Don\'t show again</string>
|
||||
<string name="startup_donate">Open-Source Information</string>
|
||||
<string name="startup_donate_message">We\'re happy that you use DAVdroid, which is open-source software (GPLv3). Because developing DAVdroid is hard work and took us thousands of working hours, please consider a donation.</string>
|
||||
<string name="startup_donate_now">Show donation page</string>
|
||||
<string name="startup_donate_later">Maybe later</string>
|
||||
<string name="startup_google_play_accounts_removed">Play Store DRM bug information</string>
|
||||
<string name="startup_google_play_accounts_removed_message">Under certain conditions, Play Store DRM may cause all DAVdroid accounts to be gone
|
||||
after a reboot or after upgrading DAVdroid. If you\'re affected by this problem (and only then), please install \"DAVdroid JB Workaround\" from Play Store.</string>
|
||||
<string name="startup_google_play_accounts_removed_more_info">More information</string>
|
||||
<string name="startup_opentasks_not_installed">OpenTasks not installed</string>
|
||||
<string name="startup_opentasks_not_installed_message">The OpenTasks app is not installed or not accessible, so DAVdroid won\'t be
|
||||
able to synchronize task lists. You may have to re-install DAVdroid and then add your accounts again after installing OpenTasks.</string>
|
||||
<string name="startup_opentasks_not_installed_install">Install OpenTasks</string>
|
||||
|
||||
<!-- AccountsActivity -->
|
||||
<string name="navigation_drawer_open">Open navigation drawer</string>
|
||||
@ -42,6 +43,24 @@
|
||||
|
||||
<string name="account_list_empty">Welcome to DAVdroid!\n\nYou can add a CalDAV/CardDAV account now.</string>
|
||||
|
||||
<!-- AppSettingsActivity -->
|
||||
<string name="app_settings">Settings</string>
|
||||
<string name="app_settings_user_interface">User interface</string>
|
||||
<string name="app_settings_reset_hints">Reset hints</string>
|
||||
<string name="app_settings_reset_hints_summary">Re-enables hints which have been dismissed previously</string>
|
||||
<string name="app_settings_reset_hints_success">All hints will be shown again</string>
|
||||
<string name="app_settings_security">Security</string>
|
||||
<string name="app_settings_reset_trusted_certificates">Reset trusted certificates</string>
|
||||
<string name="app_settings_reset_trusted_certificates_summary">Forgets all certificates which have been accepted previously</string>
|
||||
<plurals name="app_settings_reset_trusted_certificates_success">
|
||||
<item quantity="one">Distrusted one certificate</item>
|
||||
<item quantity="other">Distrusted %d certificates</item>
|
||||
</plurals>
|
||||
<string name="app_settings_debug">Debugging</string>
|
||||
<string name="app_settings_log_to_file">Log to external file</string>
|
||||
<string name="app_settings_log_to_file_on">Logging to external storage (if available)</string>
|
||||
<string name="app_settings_log_to_file_off">External file logging is disabled</string>
|
||||
|
||||
<!-- AccountActivity -->
|
||||
<string name="account_synchronize_now">Synchronize now</string>
|
||||
<string name="account_synchronizing_now">Synchronizing now</string>
|
||||
@ -56,68 +75,6 @@
|
||||
<string name="account_add_existing_calendar">Add existing calendar</string>
|
||||
<string name="account_create_new_calendar">Create new calendar</string>
|
||||
|
||||
<!-- MainActivity -->
|
||||
<string name="main_manage_accounts">Manage sync accounts</string>
|
||||
<string name="main_show_debug_info">Show debug info</string>
|
||||
|
||||
<string name="main_play_workaround_html"><![CDATA[
|
||||
<p>Thank you for buying DAVdroid on Google Play, thus supporting the project. Unfortunately, there are two Google Play bugs
|
||||
that may be of concern for you. Click on a link to view details.</p>
|
||||
|
||||
<p><a href="https://davdroid.bitfire.at/faq/entry/account-gone-after-reboot">1. Accounts may be gone after a reboot</a>:
|
||||
affects Android 4.1, 4.2 with certain devices (for instance, most Samsung devices), possible some other devices. Most
|
||||
recent Android versions work fine.<br/>
|
||||
|
||||
<a href="https://davdroid.bitfire.at/faq/entry/account-gone-after-updating">2. Accounts may be gone after upgrading DAVdroid</a>:
|
||||
affects some Android 4.4.2 devices (known for Nexus devices and Moto G), possible a few other ones. Most recent Android
|
||||
versions work fine.</p>
|
||||
|
||||
<p><strong>If you have such issues, please <a href="market://details?id=at.bitfire.davdroid.jbworkaround">install the
|
||||
DAVdroid JB Workaround</a>.</strong></p>
|
||||
]]></string>
|
||||
<string name="main_welcome">Welcome to DAVdroid/%s!</string>
|
||||
<string name="main_what_is_davdroid_html"><![CDATA[
|
||||
<p>DAVdroid is an Android 4+ sync adapter for CalDAV/CardDAV. To use it, just add a DAVdroid account
|
||||
for your CalDAV/CardDAV server and your contacts/events/tasks will be synchronized in both directions.</p>
|
||||
|
||||
<p>For more information, please see the <a href="https://davdroid.bitfire.at/?pk_campaign=davdroid-app&pk_kwd=main-activity">DAVdroid homepage</a>.
|
||||
DAVdroid respects your privacy, see our <a href="https://davdroid.bitfire.at/privacy?pk_campaign=davdroid-app&pk_kwd=main-activity">privacy policy</a>.</p>
|
||||
]]></string>
|
||||
<string name="main_how_to_setup_html"><![CDATA[
|
||||
<p><b>How to configure</b></p>
|
||||
|
||||
<p>DAVdroid aims to support all standards-compliant CalDAV/CardDAV services. To see a list of tested services and related
|
||||
setup info, together with some information about TLS and certificates, have a look at our
|
||||
<a href="https://davdroid.bitfire.at/configuration?pk_campaign=davdroid-app&pk_kwd=main-activity">configuration page</a>.</p>
|
||||
]]></string>
|
||||
<string name="main_support_html"><![CDATA[<p><b>Support</b></p>
|
||||
<p><b>In case of problems, check the <a href="https://davdroid.bitfire.at/faq?pk_campaign=davdroid-app&pk_kwd=main-activity">frequently
|
||||
asked questions</a> first. To get assistance or discuss about DAVdroid-related topics, have a look in our
|
||||
<a href="https://davdroid.bitfire.at/forums?pk_campaign=davdroid-app&pk_kwd=main-activity">DAVdroid forums</a>.</b>
|
||||
Please do not blackmail us with bad ratings in the stores (it\'s futile and discouraging for both sides).</p>
|
||||
]]></string>
|
||||
<string name="main_open_source_disclaimer_html"><![CDATA[<p><b>Open source</b></p>
|
||||
<p>DAVdroid is designed to be an open-source project from the very first beginning. It is always possible to compile the
|
||||
app yourself and use it for free without any obligations. The
|
||||
<a href="https://davdroid.bitfire.at/source?pk_campaign=davdroid-app&pk_kwd=main-activity">source code is
|
||||
available</a>, and you can <a href="https://f-droid.org/app/at.bitfire.davdroid">download the app on F-Droid</a>.</p></p>
|
||||
]]></string>
|
||||
<string name="main_license_html"><![CDATA[<p><b>License</b></p>
|
||||
<p>Copyright © 2013 – 2015 Ricki Hirner, Bernhard Stockmann (<a href="https://www.bitfire.at">bitfire web engineering</a>).
|
||||
All rights reserved. This program and the accompanying materials are made available under the terms of the GNU Public License
|
||||
v3.0 which accompanies this distribution, and is available at <a
|
||||
href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a>. As far as Google Play, Samsung
|
||||
Store or Amazon Appstore require other terms, the respective terms apply only to versions that are downloaded using these services.</p>
|
||||
]]></string>
|
||||
<string name="main_translation_info">Translations to other languages than English and German have been contributed by various people which are mentioned in their respective language version.</string>
|
||||
<string name="main_used_libraries_heading">DAVdroid uses these libraries (alphabetical order):</string>
|
||||
|
||||
<!-- DonateDialogFragment -->
|
||||
<string name="donate_title">Open-Source Information</string>
|
||||
<string name="donate_message">We\'re happy that you use DAVdroid, which is open-source software (GPLv3). Because developing DAVdroid is hard work and took us thousands of working hours, please consider a donation.</string>
|
||||
<string name="donate_now">Show donation page</string>
|
||||
<string name="donate_later">Maybe later</string>
|
||||
|
||||
<!-- AddAccountActivity -->
|
||||
<string name="login_title">Add account</string>
|
||||
<string name="login_type_email">Login with email address</string>
|
||||
@ -183,7 +140,7 @@
|
||||
<item>Every 4 hours</item>
|
||||
<item>Once a day</item>
|
||||
</string-array>
|
||||
<string name="settings_sync_time_range_past">Restrict synchronization of past events</string>
|
||||
<string name="settings_sync_time_range_past">Past event time limit</string>
|
||||
<string name="settings_sync_time_range_past_none">All events will be synchronized</string>
|
||||
<plurals name="settings_sync_time_range_past_days">
|
||||
<item quantity="one">Events more than one day in the past will be ignored</item>
|
||||
@ -223,35 +180,6 @@
|
||||
<string name="settings_version_update_title">Settings have been updated</string>
|
||||
<string name="settings_version_update_description">Internal settings have been updated. If there are problems, please uninstall DAVdroid and then install it again.</string>
|
||||
|
||||
<string name="setup_resource_detection">Resource detection</string>
|
||||
<string name="setup_no_collections_found">No address books or calendars were found.</string>
|
||||
<string name="setup_view_logs">View logs</string>
|
||||
<string name="setup_add_account">Add account</string>
|
||||
<string name="setup_querying_server">Querying server. Please wait…</string>
|
||||
<string name="setup_install_apps_info">Plain Android doesn\'t support to-do lists (in contrast to contacts and calendars).</string>
|
||||
<string name="setup_install_tasks_app_html"><![CDATA[
|
||||
<p>DAVdroid is able to synchronize tasks with the <a href="market://details?id=org.dmfs.tasks">Tasks app</a> (by Marten Gajda).</p>
|
||||
<p>Because of an <a href="https://code.google.com/p/android/issues/detail?id=25906">Android bug</a>, the <b>Tasks app must be installed
|
||||
before installing DAVdroid</b> (otherwise, DAVdroid can\'t get the permission to access the tasks provider).</p>
|
||||
<p>If you want tasks to be synchronized:</p>
|
||||
<p>1. Install the Tasks app.<br/>
|
||||
2. Re-install DAVdroid (to gain tasks access permission). Uninstalling DAVdroid will discard your DAVdroid accounts and unsynchronized data.<br/>
|
||||
3. Add your DAVdroid account again.</p>
|
||||
<p>Otherwise, you may skip this step.</p>
|
||||
]]></string>
|
||||
<string name="setup_what_to_sync">Which collections shall be synchronized?</string>
|
||||
<string name="setup_address_books">Address books</string>
|
||||
<string name="setup_calendars">Calendars</string>
|
||||
<string name="setup_task_lists">Task lists</string>
|
||||
<string name="setup_select_address_book">Select up to one address book (tap again to unselect) for synchronization:</string>
|
||||
<string name="setup_select_calendars">Select calendars for synchronization:</string>
|
||||
<string name="setup_select_task_lists">Select task lists for synchronization:</string>
|
||||
|
||||
<string name="setup_account_details">Account details</string>
|
||||
<string name="setup_account_name">Account name:</string>
|
||||
<string name="setup_account_name_hint">My CalDAV/CardDAV Account</string>
|
||||
<string name="setup_read_only">read-only</string>
|
||||
|
||||
<!-- sync errors and DebugInfoActivity -->
|
||||
<string name="debug_info_title">Debug info</string>
|
||||
<string name="sync_error_calendar">Calendar synchronization failed (%s)</string>
|
||||
|
@ -21,7 +21,7 @@
|
||||
android:key="password"
|
||||
android:title="@string/settings_password"
|
||||
android:persistent="false"
|
||||
android:password="true"
|
||||
android:inputType="textPassword"
|
||||
android:summary="@string/settings_password_summary"
|
||||
android:dialogTitle="@string/settings_enter_password" />
|
||||
|
||||
@ -60,7 +60,7 @@
|
||||
<EditTextPreference
|
||||
android:key="caldav_time_range_past_days"
|
||||
android:persistent="false"
|
||||
android:title="Restrict past time range"
|
||||
android:title="@string/settings_sync_time_range_past"
|
||||
android:dialogMessage="@string/settings_sync_time_range_past_message"
|
||||
android:inputType="number"/>
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user