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
pull/2/head
Ricki Hirner 8 years ago
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,31 +17,50 @@
<string name="send">Send</string>
<string name="skip">Skip</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>
<string name="navigation_drawer_close">Close navigation drawer</string>
<string name="navigation_drawer_subtitle">CalDAV/CardDAV Sync Adapter</string>
<string name="navigation_drawer_about">About / License</string>
<string name="navigation_drawer_donate">Donate</string>
<string name="navigation_drawer_app_settings">Settings</string>
<string name="navigation_drawer_website">Web site</string>
<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>
<string name="app_settings_reset_trusted_certificates_success">Distrusted %d certificate(s)</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>
<!-- AccountsActivity -->
<string name="navigation_drawer_open">Open navigation drawer</string>
<string name="navigation_drawer_close">Close navigation drawer</string>
<string name="navigation_drawer_subtitle">CalDAV/CardDAV Sync Adapter</string>
<string name="navigation_drawer_about">About / License</string>
<string name="navigation_drawer_donate">Donate</string>
<string name="navigation_drawer_app_settings">Settings</string>
<string name="navigation_drawer_website">Web site</string>
<string name="account_list_empty">Welcome to DAVdroid!\n\nYou can add a CalDAV/CardDAV account now.</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&amp;pk_kwd=main-activity">DAVdroid homepage</a>.
DAVdroid respects your privacy, see our <a href="https://davdroid.bitfire.at/privacy?pk_campaign=davdroid-app&amp;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&amp;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&amp;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&amp;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&amp;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…
Cancel
Save