/*
* Copyright (C) 2014 Arpit Khurana <arpitkh96@gmail.com>, Vishal Nehra <vishalmeham2@gmail.com>,
* Emmanuel Messulam <emmanuelbendavid@gmail.com>
*
* This file is part of Amaze File Manager.
*
* Amaze File Manager is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* 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.amaze.filemanager.fragments.preference_fragments;
import android.Manifest;
import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.hardware.fingerprint.FingerprintManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.amaze.filemanager.BuildConfig;
import com.amaze.filemanager.R;
import com.amaze.filemanager.activities.AboutActivity;
import com.amaze.filemanager.activities.PreferencesActivity;
import com.amaze.filemanager.ui.views.CheckBox;
import com.amaze.filemanager.utils.MainActivityHelper;
import com.amaze.filemanager.utils.PreferenceUtils;
import com.amaze.filemanager.utils.TinyDB;
import com.amaze.filemanager.utils.provider.UtilitiesProviderInterface;
import com.amaze.filemanager.utils.theme.AppTheme;
import java.util.ArrayList;
import static com.amaze.filemanager.R.string.feedback;
import static com.amaze.filemanager.fragments.preference_fragments.FoldersPref.castStringListToTrioList;
public class Preffrag extends PreferenceFragment implements Preference.OnPreferenceClickListener {
private static final String PREFERENCE_KEY_ABOUT = "about";
private static final String[] PREFERENCE_KEYS =
{"columns", "theme", "sidebar_folders_enable", "sidebar_quickaccess_enable",
"rootmode", "showHidden", "feedback", PREFERENCE_KEY_ABOUT, "plus_pic", "colors",
"sidebar_folders", "sidebar_quickaccess", "advancedsearch"};
public static final String PREFERENCE_SHOW_SIDEBAR_FOLDERS = "show_sidebar_folders";
public static final String PREFERENCE_SHOW_SIDEBAR_QUICKACCESSES = "show_sidebar_quickaccesses";
public static final String PREFERENCE_SHOW_HIDDENFILES = "showHidden";
public static final String PREFERENCE_ROOTMODE = "rootmode";
public static final String PREFERENCE_CRYPT_MASTER_PASSWORD = "crypt_password";
public static final String PREFERENCE_CRYPT_FINGERPRINT = "crypt_fingerprint";
public static final String PREFERENCE_CRYPT_WARNING_REMEMBER = "crypt_remember";
public static final String PREFERENCE_CRYPT_MASTER_PASSWORD_DEFAULT = "";
public static final boolean PREFERENCE_CRYPT_FINGERPRINT_DEFAULT = false;
public static final boolean PREFERENCE_CRYPT_WARNING_REMEMBER_DEFAULT = false;
public static final String ENCRYPT_PASSWORD_FINGERPRINT = "fingerprint";
public static final String ENCRYPT_PASSWORD_MASTER = "master";
private UtilitiesProviderInterface utilsProvider;
private SharedPreferences sharedPref;
private CheckBox gplus;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
utilsProvider = (UtilitiesProviderInterface) getActivity();
PreferenceUtils.reset();
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
for (String PREFERENCE_KEY : PREFERENCE_KEYS) {
findPreference(PREFERENCE_KEY).setOnPreferenceClickListener(this);
}
gplus = (CheckBox) findPreference("plus_pic");
if (BuildConfig.IS_VERSION_FDROID)
gplus.setEnabled(false);
// crypt master password
final EditTextPreference masterPasswordPreference = (EditTextPreference) findPreference(PREFERENCE_CRYPT_MASTER_PASSWORD);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
// encryption feature not available
masterPasswordPreference.setEnabled(false);
}
if (sharedPref.getBoolean(PREFERENCE_CRYPT_FINGERPRINT, false)) {
masterPasswordPreference.setEnabled(false);
}
CheckBox checkBoxFingerprint = (CheckBox) findPreference(PREFERENCE_CRYPT_FINGERPRINT);
try {
// finger print sensor
final FingerprintManager fingerprintManager = (FingerprintManager)
getActivity().getSystemService(Context.FINGERPRINT_SERVICE);
final KeyguardManager keyguardManager = (KeyguardManager)
getActivity().getSystemService(Context.KEYGUARD_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && fingerprintManager.isHardwareDetected()) {
checkBoxFingerprint.setEnabled(true);
}
checkBoxFingerprint.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (ActivityCompat.checkSelfPermission(getActivity(),
Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getActivity(),
getResources().getString(R.string.crypt_fingerprint_no_permission),
Toast.LENGTH_LONG).show();
return false;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
!fingerprintManager.hasEnrolledFingerprints()) {
Toast.makeText(getActivity(),
getResources().getString(R.string.crypt_fingerprint_not_enrolled),
Toast.LENGTH_LONG).show();
return false;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
!keyguardManager.isKeyguardSecure()) {
Toast.makeText(getActivity(),
getResources().getString(R.string.crypt_fingerprint_no_security),
Toast.LENGTH_LONG).show();
return false;
}
masterPasswordPreference.setEnabled(false);
return true;
}
});
} catch (NoClassDefFoundError error) {
error.printStackTrace();
// fingerprint manager class not defined in the framework
checkBoxFingerprint.setEnabled(false);
}
}
@Override
public boolean onPreferenceClick(Preference preference) {
final String[] sort;
MaterialDialog.Builder builder;
switch (preference.getKey()) {
case "columns":
sort = getResources().getStringArray(R.array.columns);
builder = new MaterialDialog.Builder(getActivity());
builder.theme(utilsProvider.getAppTheme().getMaterialDialogTheme());
builder.title(R.string.gridcolumnno);
int current = Integer.parseInt(sharedPref.getString("columns", "-1"));
current = current == -1 ? 0 : current;
if (current != 0) current = current - 1;
builder.items(sort).itemsCallbackSingleChoice(current, new MaterialDialog.ListCallbackSingleChoice() {
@Override
public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
sharedPref.edit().putString("columns", "" + (which != 0 ? sort[which] : "" + -1)).commit();
dialog.dismiss();
return true;
}
});
builder.build().show();
return true;
case "theme":
sort = getResources().getStringArray(R.array.theme);
current = Integer.parseInt(sharedPref.getString("theme", "0"));
builder = new MaterialDialog.Builder(getActivity());
//builder.theme(utilsProvider.getAppTheme().getMaterialDialogTheme());
builder.items(sort).itemsCallbackSingleChoice(current, new MaterialDialog.ListCallbackSingleChoice() {
@Override
public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
utilsProvider.getThemeManager()
.setAppTheme(AppTheme.fromIndex(which))
.save();
Log.d("theme", AppTheme.fromIndex(which).name());
dialog.dismiss();
restartPC(getActivity());
return true;
}
});
builder.title(R.string.theme);
builder.build().show();
return true;
case "sidebar_folders_enable":
sharedPref.edit().putBoolean(PREFERENCE_SHOW_SIDEBAR_FOLDERS,
!sharedPref.getBoolean(PREFERENCE_SHOW_SIDEBAR_FOLDERS, true)).apply();
return true;
case "sidebar_quickaccess_enable":
sharedPref.edit().putBoolean(PREFERENCE_SHOW_SIDEBAR_QUICKACCESSES,
!sharedPref.getBoolean(PREFERENCE_SHOW_SIDEBAR_QUICKACCESSES, true)).apply();
return true;
case PREFERENCE_SHOW_HIDDENFILES:
setEnabledShortcuts();
return false;
case PREFERENCE_ROOTMODE:
setEnabledShortcuts();
/*
boolean b = sharedPref.getBoolean("rootmode", false);
if (b) {
if (MainActivity.shellInteractive.isRunning()) {
rootmode.setChecked(true);
} else { rootmode.setChecked(false);
Toast.makeText(getActivity(), getResources().getString(R.string.rootfailure), Toast.LENGTH_LONG).show();
}
} else {
rootmode.setChecked(false);
}
*/
return false;
case "feedback":
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
"mailto", "vishalmeham2@gmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Feedback : Amaze File Manager");
startActivity(Intent.createChooser(emailIntent, getResources().getString(feedback)));
return false;
case PREFERENCE_KEY_ABOUT:
startActivity(new Intent(getActivity(), AboutActivity.class));
return false;
case "plus_pic":
if(gplus.isChecked()){
boolean b= MainActivityHelper.checkAccountsPermission(getActivity());
if(!b) MainActivityHelper.requestAccountsPermission(getActivity());
}
return false;
/*FROM HERE BE FRAGMENTS*/
case "colors":
((PreferencesActivity) getActivity())
.selectItem(PreferencesActivity.COLORS_PREFERENCE);
return true;
case "sidebar_folders":
((PreferencesActivity) getActivity())
.selectItem(PreferencesActivity.FOLDERS_PREFERENCE);
return true;
case "sidebar_quickaccess":
((PreferencesActivity) getActivity())
.selectItem(PreferencesActivity.QUICKACCESS_PREFERENCE);
return true;
case "advancedsearch":
((PreferencesActivity) getActivity())
.selectItem(PreferencesActivity.ADVANCEDSEARCH_PREFERENCE);
return true;
}
return false;
}
public static void restartPC(final Activity activity) {
if (activity == null) return;
final int enter_anim = android.R.anim.fade_in;
final int exit_anim = android.R.anim.fade_out;
activity.overridePendingTransition(enter_anim, exit_anim);
activity.finish();
activity.overridePendingTransition(enter_anim, exit_anim);
activity.startActivity(activity.getIntent());
}
public void invalidateGplus(){
boolean a=MainActivityHelper.checkAccountsPermission(getActivity());
if(!a)gplus.setChecked(false);
}
/**
* Dynamically enables autodisabled shortcuts, and disables inaccessible shortcuts when user
* changes root access and hidden files visibility preferences.
*/
private void setEnabledShortcuts() {
ArrayList<String> predigestedPref = TinyDB.getList(sharedPref, String.class, FoldersPref.KEY, null);
if(predigestedPref == null) return;
ArrayList<FoldersPref.Shortcut> currentValue = castStringListToTrioList(predigestedPref);
for(int i = 0; i < currentValue.size(); i++) {
if(FoldersPref.canShortcutTo(currentValue.get(i).directory, sharedPref)
&& currentValue.get(i).autodisabled) {
FoldersPref.Shortcut shortcut = new FoldersPref.Shortcut(currentValue.get(i).name,
currentValue.get(i).directory, FoldersPref.Shortcut.TRUE);
currentValue.set(i, shortcut);
} else if (!FoldersPref.canShortcutTo(currentValue.get(i).directory, sharedPref)
&& currentValue.get(i).enabled) {
FoldersPref.Shortcut shortcut = new FoldersPref.Shortcut(currentValue.get(i).name,
currentValue.get(i).directory, FoldersPref.Shortcut.AUTOFALSE);
currentValue.set(i, shortcut);
}
}
TinyDB.putList(sharedPref, FoldersPref.KEY, FoldersPref.castTrioListToStringList(currentValue));
}
}