com.owncloud.android.ui.activity.Preferences.java Source code

Java tutorial

Introduction

Here is the source code for com.owncloud.android.ui.activity.Preferences.java

Source

/**
 *   ownCloud Android client application
 *
 *   @author Bartek Przybylski
 *   @author David A. Velasco
 *   Copyright (C) 2011  Bartek Przybylski
 *   Copyright (C) 2016 ownCloud Inc.
 *   Copyright (C) 2016 Nextcloud
 *
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License version 2,
 *   as published by the Free Software Foundation.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
package com.owncloud.android.ui.activity;

import android.accounts.Account;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Configuration;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.preference.SwitchPreference;
import android.support.annotation.LayoutRes;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatDelegate;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.owncloud.android.BuildConfig;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.datamodel.ArbitraryDataProvider;
import com.owncloud.android.datamodel.ExternalLinksProvider;
import com.owncloud.android.datastorage.DataStorageProvider;
import com.owncloud.android.datastorage.StoragePoint;
import com.owncloud.android.lib.common.ExternalLink;
import com.owncloud.android.lib.common.ExternalLinkType;
import com.owncloud.android.lib.common.OwnCloudAccount;
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.utils.AnalyticsUtils;
import com.owncloud.android.utils.ThemeUtils;

import java.io.IOException;

/**
 * An Activity that allows the user to change the application's settings.
 *
 * It proxies the necessary calls via {@link android.support.v7.app.AppCompatDelegate} to be used with AppCompat.
 */
public class Preferences extends PreferenceActivity implements StorageMigration.StorageMigrationProgressListener {

    private static final String TAG = Preferences.class.getSimpleName();

    public final static String PREFERENCE_USE_FINGERPRINT = "use_fingerprint";

    public static final String EXPERT_MODE = "expert_mode";

    private static final String SCREEN_NAME = "Settings";

    private static final int ACTION_REQUEST_PASSCODE = 5;
    private static final int ACTION_CONFIRM_PASSCODE = 6;

    private static final int ACTION_REQUEST_CODE_DAVDROID_SETUP = 10;

    public static final String SYNCED_FOLDER_LIGHT_UPLOAD_ON_WIFI = "SYNCED_FOLDER_LIGHT_UPLOAD_ON_WIFI";

    /**
     * The user's server base uri.
     */
    private Uri mUri;

    private SwitchPreference pCode;
    private SwitchPreference fPrint;
    private SwitchPreference mShowHiddenFiles;
    private SwitchPreference mExpertMode;
    private Preference pAboutApp;
    private AppCompatDelegate mDelegate;

    private ListPreference mPrefStoragePath;
    private String mStoragePath;

    public static class PreferenceKeys {
        public static final String STORAGE_PATH = "storage_path";
        public static final String INSTANT_UPLOAD_PATH = "instant_upload_path";
        public static final String INSTANT_VIDEO_UPLOAD_PATH = "instant_video_upload_path";
    }

    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {

        if (ThemeUtils.themingEnabled()) {
            setTheme(R.style.FallbackThemingTheme);
        }

        getDelegate().installViewFactory();
        getDelegate().onCreate(savedInstanceState);
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

        ActionBar actionBar = getDelegate().getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        ThemeUtils.setColoredTitle(actionBar, getString(R.string.actionbar_settings));
        actionBar.setBackgroundDrawable(new ColorDrawable(ThemeUtils.primaryColor()));
        getWindow().getDecorView().setBackgroundDrawable(
                new ColorDrawable(ResourcesCompat.getColor(getResources(), R.color.background_color, null)));

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().setStatusBarColor(ThemeUtils.primaryDarkColor());
        }

        Drawable backArrow = getResources().getDrawable(R.drawable.ic_arrow_back);
        actionBar.setHomeAsUpIndicator(ThemeUtils.tintDrawable(backArrow, ThemeUtils.fontColor()));

        int accentColor = ThemeUtils.primaryAccentColor();

        // retrieve user's base uri
        setupBaseUri();

        // For adding content description tag to a title field in the action bar
        int actionBarTitleId = getResources().getIdentifier("action_bar_title", "id", "android");
        View actionBarTitleView = getWindow().getDecorView().findViewById(actionBarTitleId);
        if (actionBarTitleView != null) { // it's null in Android 2.x
            getWindow().getDecorView().findViewById(actionBarTitleId)
                    .setContentDescription(getString(R.string.actionbar_settings));
        }
        // Load package info
        String temp;
        try {
            PackageInfo pkg = getPackageManager().getPackageInfo(getPackageName(), 0);
            temp = pkg.versionName;
        } catch (NameNotFoundException e) {
            temp = "";
            Log_OC.e(TAG, "Error while showing about dialog", e);
        }
        final String appVersion = temp;

        // Register context menu for list of preferences.
        registerForContextMenu(getListView());

        // General
        PreferenceCategory preferenceCategoryGeneral = (PreferenceCategory) findPreference("general");
        preferenceCategoryGeneral
                .setTitle(ThemeUtils.getColoredTitle(getString(R.string.prefs_category_general), accentColor));

        // Synced folders
        PreferenceCategory preferenceCategorySyncedFolders = (PreferenceCategory) findPreference(
                "synced_folders_category");
        preferenceCategorySyncedFolders
                .setTitle(ThemeUtils.getColoredTitle(getString(R.string.drawer_synced_folders), accentColor));
        PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference("preference_screen");

        if (!getResources().getBoolean(R.bool.syncedFolder_light)) {
            preferenceScreen.removePreference(preferenceCategorySyncedFolders);
        } else {
            // Upload on WiFi
            final ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(getContentResolver());
            final Account account = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());

            final SwitchPreference pUploadOnWifiCheckbox = (SwitchPreference) findPreference(
                    "synced_folder_on_wifi");
            pUploadOnWifiCheckbox
                    .setChecked(arbitraryDataProvider.getBooleanValue(account, SYNCED_FOLDER_LIGHT_UPLOAD_ON_WIFI));

            pUploadOnWifiCheckbox.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                @Override
                public boolean onPreferenceClick(Preference preference) {
                    arbitraryDataProvider.storeOrUpdateKeyValue(account.name, SYNCED_FOLDER_LIGHT_UPLOAD_ON_WIFI,
                            String.valueOf(pUploadOnWifiCheckbox.isChecked()));

                    return true;
                }
            });

            Preference pSyncedFolder = findPreference("synced_folders_configure_folders");
            if (pSyncedFolder != null) {
                if (getResources().getBoolean(R.bool.syncedFolder_light)
                        && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    pSyncedFolder.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                        @Override
                        public boolean onPreferenceClick(Preference preference) {
                            Intent syncedFoldersIntent = new Intent(getApplicationContext(),
                                    SyncedFoldersActivity.class);
                            syncedFoldersIntent.putExtra(SyncedFoldersActivity.EXTRA_SHOW_SIDEBAR, false);
                            startActivity(syncedFoldersIntent);
                            return true;
                        }
                    });
                } else {
                    preferenceCategorySyncedFolders.removePreference(pSyncedFolder);
                }
            }
        }

        PreferenceCategory preferenceCategoryDetails = (PreferenceCategory) findPreference("details");
        preferenceCategoryDetails
                .setTitle(ThemeUtils.getColoredTitle(getString(R.string.prefs_category_details), accentColor));

        boolean fPassCodeEnabled = getResources().getBoolean(R.bool.passcode_enabled);
        pCode = (SwitchPreference) findPreference(PassCodeActivity.PREFERENCE_SET_PASSCODE);
        if (pCode != null && fPassCodeEnabled) {
            pCode.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    Intent i = new Intent(getApplicationContext(), PassCodeActivity.class);
                    Boolean incoming = (Boolean) newValue;

                    i.setAction(incoming ? PassCodeActivity.ACTION_REQUEST_WITH_RESULT
                            : PassCodeActivity.ACTION_CHECK_WITH_RESULT);

                    startActivityForResult(i, incoming ? ACTION_REQUEST_PASSCODE : ACTION_CONFIRM_PASSCODE);

                    // Don't update just yet, we will decide on it in onActivityResult
                    return false;
                }
            });
        } else {
            preferenceCategoryDetails.removePreference(pCode);
        }

        boolean fPrintEnabled = getResources().getBoolean(R.bool.fingerprint_enabled);
        fPrint = (SwitchPreference) findPreference(PREFERENCE_USE_FINGERPRINT);
        if (fPrint != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (FingerprintActivity.isFingerprintCapable(MainApp.getAppContext()) && fPrintEnabled) {
                    fPrint.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
                        @Override
                        public boolean onPreferenceChange(Preference preference, Object newValue) {
                            Boolean incoming = (Boolean) newValue;

                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                if (FingerprintActivity.isFingerprintReady(MainApp.getAppContext())) {
                                    SharedPreferences appPrefs = PreferenceManager
                                            .getDefaultSharedPreferences(getApplicationContext());
                                    SharedPreferences.Editor editor = appPrefs.edit();
                                    editor.putBoolean("use_fingerprint", incoming);
                                    editor.apply();
                                    return true;
                                } else {
                                    if (incoming) {
                                        Toast.makeText(MainApp.getAppContext(), R.string.prefs_fingerprint_notsetup,
                                                Toast.LENGTH_LONG).show();
                                        fPrint.setChecked(false);
                                    }
                                    SharedPreferences appPrefs = PreferenceManager
                                            .getDefaultSharedPreferences(getApplicationContext());
                                    SharedPreferences.Editor editor = appPrefs.edit();
                                    editor.putBoolean("use_fingerprint", false);
                                    editor.apply();
                                    return false;
                                }
                            } else {
                                return false;
                            }
                        }
                    });
                    if (!FingerprintActivity.isFingerprintReady(MainApp.getAppContext())) {
                        fPrint.setChecked(false);
                    }

                } else {
                    preferenceCategoryDetails.removePreference(fPrint);
                }
            } else {
                preferenceCategoryDetails.removePreference(fPrint);
            }
        }

        boolean fShowHiddenFilesEnabled = getResources().getBoolean(R.bool.show_hidden_files_enabled);
        mShowHiddenFiles = (SwitchPreference) findPreference("show_hidden_files");

        if (fShowHiddenFilesEnabled) {
            mShowHiddenFiles.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                @Override
                public boolean onPreferenceClick(Preference preference) {
                    SharedPreferences appPrefs = PreferenceManager
                            .getDefaultSharedPreferences(getApplicationContext());
                    SharedPreferences.Editor editor = appPrefs.edit();
                    editor.putBoolean("show_hidden_files_pref", mShowHiddenFiles.isChecked());
                    editor.apply();
                    return true;
                }
            });
        } else {
            preferenceCategoryDetails.removePreference(mShowHiddenFiles);
        }

        mExpertMode = (SwitchPreference) findPreference(EXPERT_MODE);

        if (getResources().getBoolean(R.bool.syncedFolder_light)) {
            preferenceCategoryDetails.removePreference(mExpertMode);
        } else {
            mExpertMode = (SwitchPreference) findPreference(EXPERT_MODE);
            mExpertMode.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                @Override
                public boolean onPreferenceClick(Preference preference) {
                    SharedPreferences appPrefs = PreferenceManager
                            .getDefaultSharedPreferences(getApplicationContext());
                    SharedPreferences.Editor editor = appPrefs.edit();
                    editor.putBoolean(EXPERT_MODE, mExpertMode.isChecked());
                    editor.apply();

                    if (mExpertMode.isChecked()) {
                        Log_OC.startLogging(getApplicationContext());
                    } else {
                        if (!BuildConfig.DEBUG
                                && !getApplicationContext().getResources().getBoolean(R.bool.logger_enabled)) {
                            Log_OC.stopLogging();
                        }
                    }

                    return true;
                }
            });
        }

        PreferenceCategory preferenceCategoryMore = (PreferenceCategory) findPreference("more");
        preferenceCategoryMore
                .setTitle(ThemeUtils.getColoredTitle(getString(R.string.prefs_category_more), accentColor));

        boolean calendarContactsEnabled = getResources().getBoolean(R.bool.davdroid_integration_enabled);
        Preference pCalendarContacts = findPreference("calendar_contacts");
        if (pCalendarContacts != null) {
            if (calendarContactsEnabled) {
                pCalendarContacts.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        try {
                            launchDavDroidLogin();
                        } catch (Throwable t) {
                            Log_OC.e(TAG, "Base Uri for account could not be resolved to call DAVdroid!", t);
                            Toast.makeText(MainApp.getAppContext(),
                                    R.string.prefs_calendar_contacts_address_resolve_error, Toast.LENGTH_SHORT)
                                    .show();
                        }
                        return true;
                    }
                });
            } else {
                preferenceCategoryMore.removePreference(pCalendarContacts);
            }
        }

        boolean contactsBackupEnabled = !getResources().getBoolean(R.bool.show_drawer_contacts_backup)
                && getResources().getBoolean(R.bool.contacts_backup);
        Preference pContactsBackup = findPreference("contacts");
        if (pCalendarContacts != null) {
            if (contactsBackupEnabled) {
                pContactsBackup.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        Intent contactsIntent = new Intent(getApplicationContext(),
                                ContactsPreferenceActivity.class);
                        contactsIntent.putExtra(ContactsPreferenceActivity.EXTRA_SHOW_SIDEBAR, false);
                        startActivity(contactsIntent);
                        return true;
                    }
                });
            } else {
                preferenceCategoryMore.removePreference(pContactsBackup);
            }
        }

        if (!fShowHiddenFilesEnabled && !fPrintEnabled && !fPassCodeEnabled) {
            preferenceScreen.removePreference(preferenceCategoryDetails);
        }

        boolean helpEnabled = getResources().getBoolean(R.bool.help_enabled);
        Preference pHelp = findPreference("help");
        if (pHelp != null) {
            if (helpEnabled) {
                pHelp.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        String helpWeb = getString(R.string.url_help);
                        if (helpWeb != null && helpWeb.length() > 0) {
                            Uri uriUrl = Uri.parse(helpWeb);
                            Intent intent = new Intent(Intent.ACTION_VIEW, uriUrl);
                            startActivity(intent);
                        }
                        return true;
                    }
                });
            } else {
                preferenceCategoryMore.removePreference(pHelp);
            }
        }

        boolean recommendEnabled = getResources().getBoolean(R.bool.recommend_enabled);
        Preference pRecommend = findPreference("recommend");
        if (pRecommend != null) {
            if (recommendEnabled) {
                pRecommend.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {

                        Intent intent = new Intent(Intent.ACTION_SEND);
                        intent.setType("text/plain");
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                        String appName = getString(R.string.app_name);
                        String downloadUrlGooglePlayStore = getString(R.string.url_app_download);
                        String downloadUrlFDroid = getString(R.string.fdroid_link);
                        String downloadUrls = String.format(getString(R.string.recommend_urls),
                                downloadUrlGooglePlayStore, downloadUrlFDroid);

                        String recommendSubject = String.format(getString(R.string.recommend_subject), appName);
                        String recommendText = String.format(getString(R.string.recommend_text), appName,
                                downloadUrls);

                        intent.putExtra(Intent.EXTRA_SUBJECT, recommendSubject);
                        intent.putExtra(Intent.EXTRA_TEXT, recommendText);
                        startActivity(intent);

                        return true;

                    }
                });
            } else {
                preferenceCategoryMore.removePreference(pRecommend);
            }
        }

        boolean feedbackEnabled = getResources().getBoolean(R.bool.feedback_enabled);
        Preference pFeedback = findPreference("feedback");
        if (pFeedback != null) {
            if (feedbackEnabled) {
                pFeedback.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        String feedbackMail = getString(R.string.mail_feedback);
                        String feedback = getText(R.string.prefs_feedback) + " - android v" + appVersion;
                        Intent intent = new Intent(Intent.ACTION_SENDTO);
                        intent.setType("text/plain");
                        intent.putExtra(Intent.EXTRA_SUBJECT, feedback);

                        intent.setData(Uri.parse(feedbackMail));
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);

                        return true;
                    }
                });
            } else {
                preferenceCategoryMore.removePreference(pFeedback);
            }
        }

        SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

        boolean loggerEnabled = getResources().getBoolean(R.bool.logger_enabled) || BuildConfig.DEBUG
                || appPrefs.getBoolean(EXPERT_MODE, false);
        Preference pLogger = findPreference("logger");
        if (pLogger != null) {
            if (loggerEnabled) {
                pLogger.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        Intent loggerIntent = new Intent(getApplicationContext(), LogHistoryActivity.class);
                        startActivity(loggerIntent);

                        return true;
                    }
                });
            } else {
                preferenceCategoryMore.removePreference(pLogger);
            }
        }

        boolean imprintEnabled = getResources().getBoolean(R.bool.imprint_enabled);
        Preference pImprint = findPreference("imprint");
        if (pImprint != null) {
            if (imprintEnabled) {
                pImprint.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        String imprintWeb = getString(R.string.url_imprint);
                        if (imprintWeb != null && imprintWeb.length() > 0) {
                            Uri uriUrl = Uri.parse(imprintWeb);
                            Intent intent = new Intent(Intent.ACTION_VIEW, uriUrl);
                            startActivity(intent);
                        }
                        //ImprintDialog.newInstance(true).show(preference.get, "IMPRINT_DIALOG");
                        return true;
                    }
                });
            } else {
                preferenceCategoryMore.removePreference(pImprint);
            }
        }

        mPrefStoragePath = (ListPreference) findPreference(PreferenceKeys.STORAGE_PATH);
        if (mPrefStoragePath != null) {
            StoragePoint[] storageOptions = DataStorageProvider.getInstance().getAvailableStoragePoints();
            String[] entries = new String[storageOptions.length];
            String[] values = new String[storageOptions.length];
            for (int i = 0; i < storageOptions.length; ++i) {
                entries[i] = storageOptions[i].getDescription();
                values[i] = storageOptions[i].getPath();
            }
            mPrefStoragePath.setEntries(entries);
            mPrefStoragePath.setEntryValues(values);

            mPrefStoragePath.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    String newPath = (String) newValue;
                    if (mStoragePath.equals(newPath)) {
                        return true;
                    }

                    StorageMigration storageMigration = new StorageMigration(Preferences.this, mStoragePath,
                            newPath);

                    storageMigration.setStorageMigrationProgressListener(Preferences.this);

                    storageMigration.migrate();

                    return false;
                }
            });
        }

        // About category
        PreferenceCategory preferenceCategoryAbout = (PreferenceCategory) findPreference("about");
        preferenceCategoryAbout
                .setTitle(ThemeUtils.getColoredTitle(getString(R.string.prefs_category_about), accentColor));

        /* About App */
        pAboutApp = findPreference("about_app");
        if (pAboutApp != null) {
            pAboutApp.setTitle(String.format(getString(R.string.about_android), getString(R.string.app_name)));
            pAboutApp.setSummary(String.format(getString(R.string.about_version), appVersion));
        }

        // source code
        boolean sourcecodeEnabled = getResources().getBoolean(R.bool.sourcecode_enabled);
        Preference sourcecodePreference = findPreference("sourcecode");
        if (sourcecodePreference != null) {
            String sourcecodeUrl = getString(R.string.sourcecode_url);

            if (sourcecodeEnabled && !sourcecodeUrl.isEmpty()) {
                sourcecodePreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        Uri uriUrl = Uri.parse(sourcecodeUrl);
                        Intent intent = new Intent(Intent.ACTION_VIEW, uriUrl);
                        startActivity(intent);
                        return true;
                    }
                });
            } else {
                preferenceCategoryAbout.removePreference(sourcecodePreference);
            }
        }

        // license
        boolean licenseEnabled = getResources().getBoolean(R.bool.license_enabled);
        Preference licensePreference = findPreference("license");
        if (licensePreference != null) {
            String licenseUrl = getString(R.string.license_url);

            if (licenseEnabled && !licenseUrl.isEmpty()) {
                licensePreference.setSummary(R.string.prefs_gpl_v2);
                licensePreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        Uri uriUrl = Uri.parse(licenseUrl);
                        Intent intent = new Intent(Intent.ACTION_VIEW, uriUrl);
                        startActivity(intent);
                        return true;
                    }
                });
            } else {
                preferenceCategoryAbout.removePreference(licensePreference);
            }
        }

        // privacy
        boolean privacyEnabled = getResources().getBoolean(R.bool.privacy_enabled);
        Preference privacyPreference = findPreference("privacy");
        if (privacyPreference != null) {
            if (privacyEnabled) {
                privacyPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        String privacyUrl = getString(R.string.privacy_url);
                        if (privacyUrl.length() > 0) {
                            Intent externalWebViewIntent = new Intent(getApplicationContext(),
                                    ExternalSiteWebView.class);
                            externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_TITLE,
                                    getResources().getString(R.string.privacy));
                            externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_URL, privacyUrl);
                            externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_SHOW_SIDEBAR, false);
                            externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_MENU_ITEM_ID, -1);
                            startActivity(externalWebViewIntent);
                        }
                        return true;
                    }
                });
            } else {
                preferenceCategoryAbout.removePreference(privacyPreference);
            }
        }

        loadExternalSettingLinks(preferenceCategoryMore);

        loadStoragePath();
    }

    private void launchDavDroidLogin()
            throws com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException,
            OperationCanceledException, AuthenticatorException, IOException {
        Account account = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());

        Intent davDroidLoginIntent = new Intent();
        davDroidLoginIntent.setClassName("at.bitfire.davdroid", "at.bitfire.davdroid.ui.setup.LoginActivity");
        if (getPackageManager().resolveActivity(davDroidLoginIntent, 0) != null) {
            // arguments
            if (mUri != null) {
                davDroidLoginIntent.putExtra("url", mUri.toString() + AccountUtils.DAV_PATH);
            }
            davDroidLoginIntent.putExtra("username", AccountUtils.getAccountUsername(account.name));
            //loginIntent.putExtra("password", "...");
            startActivityForResult(davDroidLoginIntent, ACTION_REQUEST_CODE_DAVDROID_SETUP);
        } else {
            // DAVdroid not installed
            Intent installIntent = new Intent(Intent.ACTION_VIEW,
                    Uri.parse("market://details?id=at.bitfire.davdroid"));

            // launch market(s)
            if (installIntent.resolveActivity(getPackageManager()) != null) {
                startActivity(installIntent);
            } else {
                // no f-droid market app or Play store installed --> launch browser for f-droid url
                Intent downloadIntent = new Intent(Intent.ACTION_VIEW,
                        Uri.parse("https://f-droid.org/repository/browse/?fdid=at.bitfire.davdroid"));
                startActivity(downloadIntent);

                Toast.makeText(MainApp.getAppContext(), R.string.prefs_calendar_contacts_no_store_error,
                        Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void setupBaseUri() {
        // retrieve and set user's base URI
        Thread t = new Thread(new Runnable() {
            public void run() {
                try {
                    Account account = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
                    OwnCloudAccount ocAccount = new OwnCloudAccount(account, MainApp.getAppContext());
                    mUri = OwnCloudClientManagerFactory.getDefaultSingleton()
                            .getClientFor(ocAccount, getApplicationContext()).getBaseUri();
                } catch (Throwable t) {
                    Log_OC.e(TAG, "Error retrieving user's base URI", t);
                }
            }
        });
        t.start();
    }

    @Override
    protected void onResume() {
        super.onResume();
        AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG);

        SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        boolean state = appPrefs.getBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false);
        pCode.setChecked(state);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        return true;
    }

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        super.onMenuItemSelected(featureId, item);
        Intent intent;

        switch (item.getItemId()) {
        case android.R.id.home:
            intent = new Intent(getBaseContext(), FileDisplayActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            break;
        default:
            Log_OC.w(TAG, "Unknown menu item triggered");
            return false;
        }
        return true;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == ACTION_REQUEST_PASSCODE && resultCode == RESULT_OK) {
            String passcode = data.getStringExtra(PassCodeActivity.KEY_PASSCODE);
            if (passcode != null && passcode.length() == 4) {
                SharedPreferences.Editor appPrefs = PreferenceManager
                        .getDefaultSharedPreferences(getApplicationContext()).edit();

                for (int i = 1; i <= 4; ++i) {
                    appPrefs.putString(PassCodeActivity.PREFERENCE_PASSCODE_D + i, passcode.substring(i - 1, i));
                }
                appPrefs.putBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, true);
                appPrefs.apply();
                Toast.makeText(this, R.string.pass_code_stored, Toast.LENGTH_LONG).show();
            }
        } else if (requestCode == ACTION_CONFIRM_PASSCODE && resultCode == RESULT_OK) {
            if (data.getBooleanExtra(PassCodeActivity.KEY_CHECK_RESULT, false)) {

                SharedPreferences.Editor appPrefs = PreferenceManager
                        .getDefaultSharedPreferences(getApplicationContext()).edit();
                appPrefs.putBoolean(PassCodeActivity.PREFERENCE_SET_PASSCODE, false);
                appPrefs.apply();

                Toast.makeText(this, R.string.pass_code_removed, Toast.LENGTH_LONG).show();
            }
        } else if (requestCode == ACTION_REQUEST_CODE_DAVDROID_SETUP && resultCode == RESULT_OK) {
            Toast.makeText(this, R.string.prefs_calendar_contacts_sync_setup_successful, Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public MenuInflater getMenuInflater() {
        return getDelegate().getMenuInflater();
    }

    @Override
    public void setContentView(@LayoutRes int layoutResID) {
        getDelegate().setContentView(layoutResID);
    }

    @Override
    public void setContentView(View view) {
        getDelegate().setContentView(view);
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        getDelegate().setContentView(view, params);
    }

    @Override
    public void addContentView(View view, ViewGroup.LayoutParams params) {
        getDelegate().addContentView(view, params);
    }

    @Override
    protected void onPostResume() {
        super.onPostResume();
        getDelegate().onPostResume();
    }

    @Override
    protected void onTitleChanged(CharSequence title, int color) {
        super.onTitleChanged(title, color);
        getDelegate().setTitle(title);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        getDelegate().onConfigurationChanged(newConfig);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        getDelegate().onPostCreate(savedInstanceState);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getDelegate().onDestroy();
    }

    @Override
    protected void onStop() {
        super.onStop();
        getDelegate().onStop();
    }

    public void invalidateOptionsMenu() {
        getDelegate().invalidateOptionsMenu();
    }

    private AppCompatDelegate getDelegate() {
        if (mDelegate == null) {
            mDelegate = AppCompatDelegate.create(this, null);
        }
        return mDelegate;
    }

    private void loadExternalSettingLinks(PreferenceCategory preferenceCategory) {
        if (getBaseContext().getResources().getBoolean(R.bool.show_external_links)) {
            ExternalLinksProvider externalLinksProvider = new ExternalLinksProvider(getContentResolver());

            for (final ExternalLink link : externalLinksProvider.getExternalLink(ExternalLinkType.SETTINGS)) {

                // only add if it does not exist, in case activity is re-used
                if (findPreference(link.id.toString()) == null) {
                    Preference p = new Preference(this);
                    p.setTitle(link.name);
                    p.setKey(link.id.toString());

                    p.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                        @Override
                        public boolean onPreferenceClick(Preference preference) {
                            Intent externalWebViewIntent = new Intent(getApplicationContext(),
                                    ExternalSiteWebView.class);
                            externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_TITLE, link.name);
                            externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_URL, link.url);
                            externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_SHOW_SIDEBAR, false);
                            externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_MENU_ITEM_ID, link.id);
                            startActivity(externalWebViewIntent);

                            return true;
                        }
                    });

                    preferenceCategory.addPreference(p);
                }
            }
        }
    }

    /**
     * Save storage path
     */
    private void saveStoragePath(String newStoragePath) {
        SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        mStoragePath = newStoragePath;
        MainApp.setStoragePath(mStoragePath);
        SharedPreferences.Editor editor = appPrefs.edit();
        editor.putString(PreferenceKeys.STORAGE_PATH, mStoragePath);
        editor.apply();
        String storageDescription = DataStorageProvider.getInstance().getStorageDescriptionByPath(mStoragePath);
        mPrefStoragePath.setSummary(storageDescription);
        mPrefStoragePath.setValue(newStoragePath);
    }

    /**
     * Load storage path set on preferences
     */
    private void loadStoragePath() {
        SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        mStoragePath = appPrefs.getString(PreferenceKeys.STORAGE_PATH,
                Environment.getExternalStorageDirectory().getAbsolutePath());
        String storageDescription = DataStorageProvider.getInstance().getStorageDescriptionByPath(mStoragePath);
        mPrefStoragePath.setSummary(storageDescription);
    }

    @Override
    public void onStorageMigrationFinished(String storagePath, boolean succeed) {
        if (succeed) {
            saveStoragePath(storagePath);
        }
    }

    @Override
    public void onCancelMigration() {
        // Migration was canceled so we don't do anything
    }
}