com.doplgangr.secrecy.settings.SettingsFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.doplgangr.secrecy.settings.SettingsFragment.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package com.doplgangr.secrecy.settings;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceGroup;
import android.preference.PreferenceManager;
import android.support.v4.content.IntentCompat;
import android.support.v4.preference.PreferenceFragment;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.doplgangr.secrecy.Config;
import com.doplgangr.secrecy.CustomApp;
import com.doplgangr.secrecy.filesystem.Storage;
import com.doplgangr.secrecy.premium.PremiumFragment;
import com.doplgangr.secrecy.premium.PremiumStateHelper;
import com.doplgangr.secrecy.premium.StealthMode;
import com.doplgangr.secrecy.R;
import com.doplgangr.secrecy.Util;
import com.doplgangr.secrecy.views.VaultsListFragment;
import com.ipaulpro.afilechooser.FileChooserActivity;
import com.ipaulpro.afilechooser.utils.FileUtils;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;

public class SettingsFragment extends PreferenceFragment {
    private static final int REQUEST_CODE_SET_VAULT_ROOT = 6384;
    private static final int REQUEST_CODE_MOVE_VAULT = 2058;
    private Context context;
    private VaultsListFragment.OnFragmentFinishListener mFinishListener;

    private static final ArrayList<String> INCLUDE_EXTENSIONS_LIST = new ArrayList<>();
    static {
        INCLUDE_EXTENSIONS_LIST.add(".");
    }

    private String stealth_mode_message;
    private String[] creditsNames;
    private String[] creditsDescription;
    private String[] creditsLinks;
    private String[] contributorNames;
    private String[] contributorDescription;
    private String[] contributorLinks;
    private String libraries;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        this.context = getActivity();

        Resources res = getResources();
        stealth_mode_message = getString(R.string.Settings__stealth_mode_message);
        creditsNames = res.getStringArray(R.array.Credits__names);
        creditsDescription = res.getStringArray(R.array.Credits__description);
        creditsLinks = res.getStringArray(R.array.Credits__links);
        contributorNames = res.getStringArray(R.array.Contributor__names);
        contributorDescription = res.getStringArray(R.array.Contributor__description);
        contributorLinks = res.getStringArray(R.array.Contributor__links);
        libraries = getString(R.string.Settings__libraries_message);

        preparePreferenceStealthMode();
        preparePreferenceStealthModePassword();
        preparePreferenceMaxImageSize();
        preparePreferenceVaultRoot();
        preparePreferenceVaultMove();
        preparePreferenceCreditList();
        preparePreferenceTranslatorsList();
        preparePreferenceVersion();
        preparePreferenceLegal();
    }

    private void preparePreferenceStealthMode() {
        final CheckBoxPreference stealth_mode = (CheckBoxPreference) findPreference(Config.STEALTH_MODE);
        stealth_mode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object o) {
                SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getActivity())
                        .edit();

                if (!(Boolean) o) {
                    StealthMode.showApp(context);

                    editor.putBoolean(Config.STEALTH_MODE, (Boolean) o);
                    editor.putString(Config.STEALTH_MODE_PASSWORD, "");
                    editor.apply();
                } else {
                    editor.putBoolean(Config.STEALTH_MODE, (Boolean) o);
                    editor.apply();
                }
                return true;
            }
        });
    }

    private void preparePreferenceStealthModePassword() {
        final Preference stealth_mode_password = findPreference(Config.STEALTH_MODE_PASSWORD);
        String openPin = PreferenceManager.getDefaultSharedPreferences(context)
                .getString(Config.STEALTH_MODE_PASSWORD, "");
        if (!openPin.equals("")) {
            stealth_mode_password.setSummary("*# " + openPin);
        }

        PremiumStateHelper.PremiumListener mPremiumListener = new PremiumStateHelper.PremiumListener() {
            @Override
            public void isPremium() {
                stealth_mode_password.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
                            Util.alert(context, getString(R.string.Stealth__no_telephony),
                                    getString(R.string.Stealth__no_telephony_message), Util.emptyClickListener,
                                    null);
                            return true;
                        }
                        final View dialogView = View.inflate(context, R.layout.dialog_stealth, null);
                        new AlertDialog.Builder(context)
                                .setMessage(context.getString(R.string.Settings__stealth_explanation))
                                .setView(dialogView).setInverseBackgroundForced(true)
                                .setPositiveButton(getString(R.string.OK), new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {
                                        String password = ((EditText) dialogView.findViewById(R.id.stealth_keycode))
                                                .getText().toString();
                                        SharedPreferences.Editor editor = PreferenceManager
                                                .getDefaultSharedPreferences(context).edit();
                                        editor.putString(Config.STEALTH_MODE_PASSWORD, password);
                                        editor.apply();
                                        confirm_stealth(password);
                                    }
                                }).setNegativeButton(getString(R.string.CANCEL), Util.emptyClickListener).show();
                        return true;
                    }
                });
            }

            @Override
            public void notPremium() {
                stealth_mode_password.setSummary(
                        stealth_mode_message + " " + context.getString(R.string.Settings__only_permium));
                stealth_mode_password.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        mFinishListener.onNew(null, new PremiumFragment()); //Switch fragment to donation
                        return true;
                    }
                });
            }
        };
        new PremiumStateHelper(getActivity(), mPremiumListener);
    }

    private void preparePreferenceMaxImageSize() {
        Preference image_size = findPreference(Config.IMAGE_SIZE);
        image_size.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object o) {
                Util.loadSelectedImageSize((String) o);
                return true;
            }
        });
    }

    private void preparePreferenceVaultRoot() {
        Preference vault_root = findPreference("vault_root");
        vault_root.setSummary(Storage.getRoot().getAbsolutePath());
        vault_root.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                choosePath(new getFileListener() {
                    @Override
                    public void get(File file) {
                        Intent intent = new Intent(context, FileChooserActivity.class);
                        intent.putStringArrayListExtra(FileChooserActivity.EXTRA_FILTER_INCLUDE_EXTENSIONS,
                                INCLUDE_EXTENSIONS_LIST);
                        intent.putExtra(FileChooserActivity.PATH, file.getAbsolutePath());
                        intent.putExtra(FileChooserActivity.EXTRA_SELECT_FOLDER, true);
                        startActivityForResult(intent, REQUEST_CODE_SET_VAULT_ROOT);
                    }
                });
                return true;
            }
        });
    }

    private void preparePreferenceVaultMove() {
        Preference vault_move = findPreference("vault_move");
        vault_move.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                choosePath(new getFileListener() {
                    @Override
                    public void get(File file) {
                        Intent intent = new Intent(context, FileChooserActivity.class);
                        intent.putStringArrayListExtra(FileChooserActivity.EXTRA_FILTER_INCLUDE_EXTENSIONS,
                                INCLUDE_EXTENSIONS_LIST);
                        intent.putExtra(FileChooserActivity.PATH, file.getAbsolutePath());
                        intent.putExtra(FileChooserActivity.EXTRA_SELECT_FOLDER, true);
                        startActivityForResult(intent, REQUEST_CODE_MOVE_VAULT);
                    }
                });
                return true;
            }
        });
    }

    private void preparePreferenceCreditList() {
        PreferenceGroup creditsList = (PreferenceGroup) findPreference("credits_list");
        for (int i = 0; i < creditsNames.length; i++) {
            Preference newPreference = new Preference(context);
            newPreference.setTitle(creditsNames[i]);
            newPreference.setSummary(creditsDescription[i]);
            final int finali = i;
            newPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                @Override
                public boolean onPreferenceClick(Preference preference) {
                    Uri uri = Uri.parse(creditsLinks[finali]);
                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                    startActivity(intent);
                    return true;
                }
            });
            creditsList.addPreference(newPreference);
        }
    }

    private void preparePreferenceTranslatorsList() {
        PreferenceGroup translatorList = (PreferenceGroup) findPreference("translators_list");
        for (int i = 0; i < contributorNames.length; i++) {
            Preference newPreference = new Preference(context);
            newPreference.setTitle(contributorNames[i]);
            newPreference.setSummary(contributorDescription[i]);
            final int finali = i;
            newPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                @Override
                public boolean onPreferenceClick(Preference preference) {
                    Uri uri = Uri.parse(contributorLinks[finali]);
                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                    startActivity(intent);
                    return true;
                }
            });
            translatorList.addPreference(newPreference);
        }
    }

    private void preparePreferenceVersion() {
        Preference version = findPreference("version");
        version.setSummary(CustomApp.VERSIONNAME);
    }

    private void preparePreferenceLegal() {
        Preference dialogPreference = getPreferenceScreen().findPreference("legal");
        dialogPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            public boolean onPreferenceClick(Preference preference) {
                Util.alert(context, null, libraries, Util.emptyClickListener, null);
                return true;
            }
        });
    }

    private void confirm_stealth(String password) {
        final View dialogView = View.inflate(context, R.layout.dialog_confirm_stealth, null);
        ((TextView) dialogView.findViewById(R.id.stealth_keycode)).append(password);
        new AlertDialog.Builder(context).setInverseBackgroundForced(true).setView(dialogView)
                .setMessage(R.string.Settings__try_once_before_hide)
                .setPositiveButton(getString(R.string.OK), new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context)
                                .edit();
                        editor.putBoolean(Config.SHOW_STEALTH_MODE_TUTORIAL, true);
                        editor.apply();
                        Intent dial = new Intent();
                        dial.setAction("android.intent.action.DIAL");
                        dial.setData(Uri.parse("tel:"));
                        dial.setFlags(IntentCompat.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(dial);
                        getActivity().finish();
                    }
                }).show();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ((ActionBarActivity) getActivity()).getSupportActionBar().setTitle(R.string.Page_header__settings);

        return inflater.inflate(R.layout.activity_settings, container, false);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mFinishListener = (VaultsListFragment.OnFragmentFinishListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement Listener");
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
        case REQUEST_CODE_SET_VAULT_ROOT:
            // If the file selection was successful
            if (resultCode == Activity.RESULT_OK) {
                if (data != null) {
                    // Get the URI of the selected file
                    final Uri uri = data.getData();
                    try {
                        // Get the file path from the URI
                        final String path = FileUtils.getPath(context, uri);
                        Storage.setRoot(path);
                        Preference vault_root = findPreference(Config.VAULT_ROOT);
                        vault_root.setSummary(Storage.getRoot().getAbsolutePath());
                    } catch (Exception e) {
                        Log.e("SettingsFragment", "File select error", e);
                    }
                }
            }
            break;
        case REQUEST_CODE_MOVE_VAULT:
            if (resultCode == Activity.RESULT_OK) {
                if (data != null) {
                    // Get the URI of the selected file
                    final Uri uri = data.getData();
                    try {
                        // Get the file path from the URI
                        final String path = FileUtils.getPath(context, uri);
                        if (path.contains(Storage.getRoot().getAbsolutePath())) {
                            Util.alert(context, getString(R.string.Settings__cannot_move_vault),
                                    getString(R.string.Settings__cannot_move_vault_message),
                                    Util.emptyClickListener, null);
                            break;
                        }
                        Util.alert(context, getString(R.string.Settings__move_vault),
                                String.format(getString(R.string.move_message), Storage.getRoot().getAbsolutePath(),
                                        path),
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialogInterface, int i) {
                                        String[] children = new File(path).list();
                                        if (children.length == 0) {
                                            final ProgressDialog progressDialog = ProgressDialog.show(context, null,
                                                    context.getString(R.string.Settings__moving_vault), true);
                                            new Thread(new Runnable() {
                                                public void run() {
                                                    moveStorageRoot(path, progressDialog);
                                                }
                                            }).start();
                                        } else
                                            Util.alert(context, getString(R.string.Error__files_exist),
                                                    getString(R.string.Error__files_exist_message),
                                                    Util.emptyClickListener, null);
                                    }
                                }, Util.emptyClickListener);
                    } catch (Exception e) {
                        Log.e("SettingsFragment", "File select error", e);
                    }
                }
            }
            break;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    void moveStorageRoot(String path, ProgressDialog progressDialog) {
        File oldRoot = Storage.getRoot();
        try {
            org.apache.commons.io.FileUtils.copyDirectory(oldRoot, new File(path));
            Storage.setRoot(path);
            Preference vault_root = findPreference(Config.VAULT_ROOT);
            vault_root.setSummary(Storage.getRoot().getAbsolutePath());
            Util.toast(getActivity(), String.format(getString(R.string.Settings__moved_vault), path),
                    Toast.LENGTH_LONG);
        } catch (Exception E) {
            Util.alert(context, context.getString(R.string.Error__moving_vault),
                    context.getString(R.string.Error__moving_vault_message), Util.emptyClickListener, null);
            progressDialog.dismiss();
            return;
        }
        try {
            org.apache.commons.io.FileUtils.deleteDirectory(oldRoot);
        } catch (IOException ignored) {
            //ignore
        }
        progressDialog.dismiss();
    }

    void choosePath(final getFileListener listener) {
        AlertDialog.Builder builderSingle = new AlertDialog.Builder(context);
        builderSingle.setTitle(context.getString(R.string.Settings__select_storage_title));
        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(context,
                R.layout.select_dialog_singlechoice);
        final Map<String, File> storages = Util.getAllStorageLocations();
        for (String key : storages.keySet()) {
            arrayAdapter.add(key);
        }
        builderSingle.setNegativeButton(R.string.CANCEL, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        builderSingle.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String strName = arrayAdapter.getItem(which);
                File file = storages.get(strName);
                listener.get(file);
            }
        });
        builderSingle.show();
    }

    public interface getFileListener {
        void get(File file);
    }

}