package com.amaze.filemanager.ui.dialogs; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.graphics.Typeface; import android.hardware.fingerprint.FingerprintManager; import android.net.Uri; import android.os.Build; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.RequiresApi; import android.support.v7.widget.AppCompatButton; import android.support.v7.widget.AppCompatEditText; import android.text.SpannableString; import android.text.TextUtils; import android.text.format.Formatter; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.Theme; import com.amaze.filemanager.R; import com.amaze.filemanager.activities.BaseActivity; import com.amaze.filemanager.activities.BasicActivity; import com.amaze.filemanager.activities.MainActivity; import com.amaze.filemanager.adapters.HiddenAdapter; import com.amaze.filemanager.adapters.RecyclerAdapter; import com.amaze.filemanager.exceptions.RootNotPermittedException; import com.amaze.filemanager.filesystem.BaseFile; import com.amaze.filemanager.filesystem.HFile; import com.amaze.filemanager.filesystem.RootHelper; import com.amaze.filemanager.fragments.AppsList; import com.amaze.filemanager.fragments.MainFragment; import com.amaze.filemanager.fragments.preference_fragments.Preffrag; import com.amaze.filemanager.services.asynctasks.CountFolderItems; import com.amaze.filemanager.services.asynctasks.GenerateHashes; import com.amaze.filemanager.services.asynctasks.LoadFolderSpaceData; import com.amaze.filemanager.ui.LayoutElement; import com.amaze.filemanager.utils.CryptUtil; import com.amaze.filemanager.utils.DataUtils; import com.amaze.filemanager.utils.FingerprintHandler; import com.amaze.filemanager.utils.Futils; import com.amaze.filemanager.utils.OpenMode; import com.amaze.filemanager.utils.PreferenceUtils; import com.amaze.filemanager.utils.Utils; import com.amaze.filemanager.utils.color.ColorUsage; import com.amaze.filemanager.utils.theme.AppTheme; import com.github.mikephil.charting.charts.PieChart; import com.github.mikephil.charting.components.Legend; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieDataSet; import com.github.mikephil.charting.data.PieEntry; import com.github.mikephil.charting.formatter.IValueFormatter; import com.github.mikephil.charting.utils.ViewPortHandler; import java.io.File; import java.io.IOException; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.UnrecoverableEntryException; import java.security.cert.CertificateException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import eu.chainfire.libsuperuser.Shell; import static com.amaze.filemanager.utils.Futils.getFreeSpace; import static com.amaze.filemanager.utils.Futils.getTotalSpace; import static com.amaze.filemanager.utils.Futils.toHFileArray; /** * Here are a lot of function that create material dialogs * * @author Emmanuel * on 17/5/2017, at 13:27. */ public class GeneralDialogCreation { public static MaterialDialog showBasicDialog(Activity m, String fabskin, AppTheme appTheme, String[] texts) { MaterialDialog.Builder a = new MaterialDialog.Builder(m) .content(texts[0]) .widgetColor(Color.parseColor(fabskin)) .theme(appTheme.getMaterialDialogTheme()) .title(texts[1]) .positiveText(texts[2]) .positiveColor(Color.parseColor(fabskin)) .negativeText(texts[3]) .negativeColor(Color.parseColor(fabskin)); if (texts[4] != (null)) { a.neutralText(texts[4]) .neutralColor(Color.parseColor(fabskin)); } return a.build(); } public static MaterialDialog showNameDialog(final MainActivity m, String[] texts) { MaterialDialog.Builder a = new MaterialDialog.Builder(m); a.input(texts[0], texts[1], false, new MaterialDialog.InputCallback() { @Override public void onInput(MaterialDialog materialDialog, CharSequence charSequence) { } }); a.widgetColor(Color.parseColor(BaseActivity.accentSkin)); a.theme(m.getAppTheme().getMaterialDialogTheme()); a.title(texts[2]); a.positiveText(texts[3]); a.positiveColor(Color.parseColor(BaseActivity.accentSkin)); a.neutralText(texts[4]); if (texts[5] != (null)) { a.negativeText(texts[5]); a.negativeColor(Color.parseColor(BaseActivity.accentSkin)); } MaterialDialog dialog = a.build(); return dialog; } public static void deleteFilesDialog(ArrayList<LayoutElement> a, final MainFragment b, List<Integer> pos, AppTheme appTheme) { final MaterialDialog.Builder c = new MaterialDialog.Builder(b.getActivity()); c.title(b.getResources().getString(R.string.confirm)); int fileCounter = 0, dirCounter = 0; long longSizeTotal = 0; final ArrayList<BaseFile> todelete = new ArrayList<>(); StringBuilder dirNames = new StringBuilder(); StringBuilder fileNames = new StringBuilder(); for (int i = 0; i < pos.size(); i++) { final LayoutElement elem = a.get(pos.get(i)); todelete.add(elem.generateBaseFile()); if (elem.isDirectory()) { dirNames.append("\n") .append(++dirCounter) .append(". ") .append(elem.getTitle()); // TODO: Get folder size ? } else { fileNames.append("\n") .append(++fileCounter) .append(". ") .append(elem.getTitle()) .append(" (") .append(elem.getSize()) .append(")"); longSizeTotal += elem.getlongSize(); } } String titleFiles = b.getResources().getString(R.string.title_files).toUpperCase(); String titleDirs = b.getResources().getString(R.string.title_dirs).toUpperCase(); StringBuilder message = new StringBuilder(); message.append(b.getResources().getString(R.string.questiondelete)) .append("\n\n"); if (dirCounter == 0 && fileCounter == 1) { final LayoutElement elem = a.get(pos.get(0)); message.append(elem.getTitle()) .append(" (") .append(elem.getSize()) .append(")"); } else if (fileCounter == 0) { message.append(titleDirs) .append(":") .append(dirNames); } else if(dirCounter == 0) { message.append(titleFiles) .append(":") .append(fileNames); } else { message.append(titleDirs) .append(":") .append(dirNames) .append("\n\n") .append(titleFiles) .append(":") .append(fileNames); } if (fileCounter + dirCounter > 1 && longSizeTotal > 0) { message.append("\n\n") .append(b.getResources().getString(R.string.total)) .append(" ") .append(Formatter.formatFileSize(b.getContext(), longSizeTotal)); } c.content(message.toString()); c.theme(appTheme.getMaterialDialogTheme()); c.negativeText(b.getResources().getString(R.string.cancel).toUpperCase()); c.positiveText(b.getResources().getString(R.string.delete).toUpperCase()); c.positiveColor(Color.parseColor(b.fabSkin)); c.negativeColor(Color.parseColor(b.fabSkin)); c.callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog materialDialog) { Toast.makeText(b.getActivity(), b.getResources().getString(R.string.deleting), Toast.LENGTH_SHORT).show(); b.MAIN_ACTIVITY.mainActivityHelper.deleteFiles(todelete); } @Override public void onNegative(MaterialDialog materialDialog) { //materialDialog.cancel(); } }); c.build().show(); } public static void showPropertiesDialogWithPermissions(BaseFile baseFile, final String permissions, BasicActivity basic, boolean isRoot, AppTheme appTheme) { showPropertiesDialog(baseFile, permissions, basic, isRoot, appTheme, true, false); } public static void showPropertiesDialogWithoutPermissions(final BaseFile f, BasicActivity activity, AppTheme appTheme) { showPropertiesDialog(f, null, activity, false, appTheme, false, false); } public static void showPropertiesDialogForStorage(final BaseFile f, BasicActivity activity, AppTheme appTheme) { showPropertiesDialog(f, null, activity, false, appTheme, false, true); } private static void showPropertiesDialog(final BaseFile baseFile, final String permissions, BasicActivity basic, boolean isRoot, AppTheme appTheme, boolean showPermissions, boolean forStorage) { final ExecutorService executor = Executors.newFixedThreadPool(3); final Context c = basic.getApplicationContext(); int accentColor = basic.getColorPreference().getColor(ColorUsage.ACCENT); long last = baseFile.getDate(); final String date = Utils.getDate(last), items = basic.getResources().getString(R.string.calculating), name = baseFile.getName(), parent = baseFile.getReadablePath(baseFile.getParent(c)); SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(c); String fabskin = PreferenceUtils.getAccentString(sharedPrefs); MaterialDialog.Builder builder = new MaterialDialog.Builder(basic); builder.title(basic.getResources().getString(R.string.properties)); builder.theme(appTheme.getMaterialDialogTheme()); View v = basic.getLayoutInflater().inflate(R.layout.properties_dialog, null); TextView itemsText = (TextView) v.findViewById(R.id.t7); /*View setup*/ { TextView mNameTitle = (TextView) v.findViewById(R.id.title_name); mNameTitle.setTextColor(accentColor); TextView mDateTitle = (TextView) v.findViewById(R.id.title_date); mDateTitle.setTextColor(accentColor); TextView mSizeTitle = (TextView) v.findViewById(R.id.title_size); mSizeTitle.setTextColor(accentColor); TextView mLocationTitle = (TextView) v.findViewById(R.id.title_location); mLocationTitle.setTextColor(accentColor); TextView md5Title = (TextView) v.findViewById(R.id.title_md5); md5Title.setTextColor(accentColor); TextView sha256Title = (TextView) v.findViewById(R.id.title_sha256); sha256Title.setTextColor(accentColor); ((TextView) v.findViewById(R.id.t5)).setText(name); ((TextView) v.findViewById(R.id.t6)).setText(parent); itemsText.setText(items); ((TextView) v.findViewById(R.id.t8)).setText(date); LinearLayout mNameLinearLayout = (LinearLayout) v.findViewById(R.id.properties_dialog_name); LinearLayout mLocationLinearLayout = (LinearLayout) v.findViewById(R.id.properties_dialog_location); LinearLayout mSizeLinearLayout = (LinearLayout) v.findViewById(R.id.properties_dialog_size); LinearLayout mDateLinearLayout = (LinearLayout) v.findViewById(R.id.properties_dialog_date); // setting click listeners for long press mNameLinearLayout.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Futils.copyToClipboard(c, name); Toast.makeText(c, c.getResources().getString(R.string.name) + " " + c.getResources().getString(R.string.properties_copied_clipboard), Toast.LENGTH_SHORT).show(); return false; } }); mLocationLinearLayout.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Futils.copyToClipboard(c, parent); Toast.makeText(c, c.getResources().getString(R.string.location) + " " + c.getResources().getString(R.string.properties_copied_clipboard), Toast.LENGTH_SHORT).show(); return false; } }); mSizeLinearLayout.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Futils.copyToClipboard(c, items); Toast.makeText(c, c.getResources().getString(R.string.size) + " " + c.getResources().getString(R.string.properties_copied_clipboard), Toast.LENGTH_SHORT).show(); return false; } }); mDateLinearLayout.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Futils.copyToClipboard(c, date); Toast.makeText(c, c.getResources().getString(R.string.date) + " " + c.getResources().getString(R.string.properties_copied_clipboard), Toast.LENGTH_SHORT).show(); return false; } }); } CountFolderItems countFolderItems = new CountFolderItems(c, itemsText, baseFile); countFolderItems.executeOnExecutor(executor); GenerateHashes hashGen = new GenerateHashes(baseFile, c, v); hashGen.executeOnExecutor(executor); /*Chart creation and data loading*/ { boolean isRightToLeft = c.getResources().getBoolean(R.bool.is_right_to_left); boolean isDarkTheme = appTheme.getMaterialDialogTheme() == Theme.DARK; PieChart chart = (PieChart) v.findViewById(R.id.chart); chart.setTouchEnabled(false); chart.setDrawEntryLabels(false); chart.setDescription(null); chart.setNoDataText(c.getString(R.string.loading)); chart.setRotationAngle(!isRightToLeft? 0f:180f); chart.setHoleColor(Color.TRANSPARENT); chart.setCenterTextColor(isDarkTheme? Color.WHITE:Color.BLACK); chart.getLegend().setEnabled(true); chart.getLegend().setForm(Legend.LegendForm.CIRCLE); chart.getLegend().setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER); chart.getLegend().setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL)); chart.animateY(1000); if(forStorage) { final String[] LEGENDS = new String[]{c.getString(R.string.used), c.getString(R.string.free)}; final int[] COLORS = {Utils.getColor(c, R.color.piechart_red), Utils.getColor(c, R.color.piechart_green)}; long totalSpace = getTotalSpace(baseFile), freeSpace = getFreeSpace(baseFile), usedSpace = totalSpace - freeSpace; List<PieEntry> entries = new ArrayList<>(); entries.add(new PieEntry(usedSpace, LEGENDS[0])); entries.add(new PieEntry(freeSpace, LEGENDS[1])); PieDataSet set = new PieDataSet(entries, null); set.setColors(COLORS); set.setXValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE); set.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE); set.setSliceSpace(5f); set.setAutomaticallyDisableSliceSpacing(true); set.setValueLinePart2Length(1.05f); set.setSelectionShift(0f); PieData pieData = new PieData(set); pieData.setValueFormatter(new SizeFormatter(c)); pieData.setValueTextColor(isDarkTheme? Color.WHITE:Color.BLACK); String totalSpaceFormatted = Formatter.formatFileSize(c, totalSpace); chart.setCenterText(new SpannableString(c.getString(R.string.total) + "\n" + totalSpaceFormatted)); chart.setData(pieData); } else { LoadFolderSpaceData loadFolderSpaceData = new LoadFolderSpaceData(c, appTheme, chart, baseFile); loadFolderSpaceData.executeOnExecutor(executor); } chart.invalidate(); } if(!forStorage && showPermissions) { final MainFragment main = ((MainActivity) basic).mainFragment; AppCompatButton appCompatButton = (AppCompatButton) v.findViewById(R.id.permissionsButton); appCompatButton.setAllCaps(true); final View permissionsTable = v.findViewById(R.id.permtable); final View button = v.findViewById(R.id.set); if (isRoot && permissions.length() > 6) { appCompatButton.setVisibility(View.VISIBLE); appCompatButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (permissionsTable.getVisibility() == View.GONE) { permissionsTable.setVisibility(View.VISIBLE); button.setVisibility(View.VISIBLE); setPermissionsDialog(permissionsTable, button, baseFile, permissions, c, main); } else { button.setVisibility(View.GONE); permissionsTable.setVisibility(View.GONE); } } }); } } builder.customView(v, true); builder.positiveText(basic.getResources().getString(R.string.ok)); builder.positiveColor(Color.parseColor(fabskin)); builder.dismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { executor.shutdown(); } }); MaterialDialog materialDialog = builder.build(); materialDialog.show(); materialDialog.getActionButton(DialogAction.NEGATIVE).setEnabled(false); /* View bottomSheet = c.findViewById(R.id.design_bottom_sheet); BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet); bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); bottomSheetBehavior.setPeekHeight(BottomSheetBehavior.STATE_DRAGGING); */ } public static class SizeFormatter implements IValueFormatter { private Context context; public SizeFormatter(Context c) { context = c; } @Override public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) { String prefix = entry.getData() != null && entry.getData() instanceof String? (String) entry.getData():""; return prefix + Formatter.formatFileSize(context, (long) value); } } public static void showCloudDialog(final MainActivity mainActivity, AppTheme appTheme, final OpenMode openMode) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mainActivity); String fabskin = PreferenceUtils.getAccentString(sp); final MaterialDialog.Builder builder = new MaterialDialog.Builder(mainActivity); switch (openMode) { case DROPBOX: builder.title(mainActivity.getResources().getString(R.string.cloud_dropbox)); break; case BOX: builder.title(mainActivity.getResources().getString(R.string.cloud_box)); break; case GDRIVE: builder.title(mainActivity.getResources().getString(R.string.cloud_drive)); break; case ONEDRIVE: builder.title(mainActivity.getResources().getString(R.string.cloud_onedrive)); break; } builder.theme(appTheme.getMaterialDialogTheme()); builder.content(mainActivity.getResources().getString(R.string.cloud_remove)); builder.positiveText(mainActivity.getResources().getString(R.string.yes)); builder.positiveColor(Color.parseColor(fabskin)); builder.negativeText(mainActivity.getResources().getString(R.string.no)); builder.negativeColor(Color.parseColor(fabskin)); builder.onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { mainActivity.deleteConnection(openMode); } }); builder.onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { dialog.cancel(); } }); builder.show(); } public static void showEncryptWarningDialog(final Intent intent, final MainFragment main, AppTheme appTheme, final RecyclerAdapter.EncryptButtonCallbackInterface encryptButtonCallbackInterface) { final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(main.getContext()); final MaterialDialog.Builder builder = new MaterialDialog.Builder(main.getActivity()); builder.title(main.getResources().getString(R.string.warning)); builder.content(main.getResources().getString(R.string.crypt_warning_key)); builder.theme(appTheme.getMaterialDialogTheme()); builder.negativeText(main.getResources().getString(R.string.warning_never_show)); builder.positiveText(main.getResources().getString(R.string.warning_confirm)); builder.positiveColor(Color.parseColor(main.fabSkin)); builder.onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { try { encryptButtonCallbackInterface.onButtonPressed(intent); } catch (Exception e) { e.printStackTrace(); Toast.makeText(main.getActivity(), main.getResources().getString(R.string.crypt_encryption_fail), Toast.LENGTH_LONG).show(); } } }); builder.onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { preferences.edit().putBoolean(Preffrag.PREFERENCE_CRYPT_WARNING_REMEMBER, true).apply(); try { encryptButtonCallbackInterface.onButtonPressed(intent); } catch (Exception e) { e.printStackTrace(); Toast.makeText(main.getActivity(), main.getResources().getString(R.string.crypt_encryption_fail), Toast.LENGTH_LONG).show(); } } }); builder.show(); } public static void showEncryptAuthenticateDialog(final Intent intent, final MainFragment main, AppTheme appTheme, final RecyclerAdapter.EncryptButtonCallbackInterface encryptButtonCallbackInterface) { MaterialDialog.Builder builder = new MaterialDialog.Builder(main.getActivity()); builder.title(main.getResources().getString(R.string.crypt_encrypt)); View rootView = View.inflate(main.getActivity(), R.layout.dialog_encrypt_authenticate, null); final AppCompatEditText passwordEditText = (AppCompatEditText) rootView.findViewById(R.id.edit_text_dialog_encrypt_password); final AppCompatEditText passwordConfirmEditText = (AppCompatEditText) rootView.findViewById(R.id.edit_text_dialog_encrypt_password_confirm); builder.customView(rootView, true); builder.positiveText(main.getResources().getString(R.string.ok)); builder.negativeText(main.getResources().getString(R.string.cancel)); builder.theme(appTheme.getMaterialDialogTheme()); builder.positiveColor(Color.parseColor(main.fabSkin)); builder.negativeColor(Color.parseColor(main.fabSkin)); builder.onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { dialog.cancel(); } }); builder.onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { if (TextUtils.isEmpty(passwordEditText.getText()) || TextUtils.isEmpty(passwordConfirmEditText.getText())) { dialog.cancel(); return; } try { encryptButtonCallbackInterface.onButtonPressed(intent, passwordEditText.getText().toString()); } catch (Exception e) { e.printStackTrace(); Toast.makeText(main.getActivity(), main.getResources().getString(R.string.crypt_encryption_fail), Toast.LENGTH_LONG).show(); } } }); builder.show(); } @RequiresApi(api = Build.VERSION_CODES.M) public static void showDecryptFingerprintDialog(final Intent intent, final MainFragment main, AppTheme appTheme, final RecyclerAdapter.DecryptButtonCallbackInterface decryptButtonCallbackInterface) throws IOException, CertificateException, NoSuchAlgorithmException, InvalidKeyException, UnrecoverableEntryException, InvalidAlgorithmParameterException, NoSuchPaddingException, NoSuchProviderException, BadPaddingException, KeyStoreException, IllegalBlockSizeException { MaterialDialog.Builder builder = new MaterialDialog.Builder(main.getActivity()); builder.title(main.getResources().getString(R.string.crypt_decrypt)); View rootView = View.inflate(main.getActivity(), R.layout.dialog_decrypt_fingerprint_authentication, null); Button cancelButton = (Button) rootView.findViewById(R.id.button_decrypt_fingerprint_cancel); cancelButton.setTextColor(Color.parseColor(main.fabSkin)); builder.customView(rootView, true); builder.canceledOnTouchOutside(false); builder.theme(appTheme.getMaterialDialogTheme()); final MaterialDialog dialog = builder.show(); cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.cancel(); } }); FingerprintManager manager = (FingerprintManager) main.getActivity().getSystemService(Context.FINGERPRINT_SERVICE); FingerprintManager.CryptoObject object = new FingerprintManager.CryptoObject(CryptUtil.initCipher(main.getContext())); FingerprintHandler handler = new FingerprintHandler(main.getActivity(), intent, dialog, decryptButtonCallbackInterface); handler.authenticate(manager, object); } public static void showDecryptDialog(final Intent intent, final MainFragment main, AppTheme appTheme, final String password, final RecyclerAdapter.DecryptButtonCallbackInterface decryptButtonCallbackInterface) { MaterialDialog.Builder builder = new MaterialDialog.Builder(main.getActivity()); builder.title(main.getResources().getString(R.string.crypt_decrypt)); builder.input(main.getResources().getString(R.string.authenticate_password), "", false, new MaterialDialog.InputCallback() { @Override public void onInput(@NonNull MaterialDialog dialog, CharSequence input) { } }); builder.theme(appTheme.getMaterialDialogTheme()); builder.positiveText(main.getResources().getString(R.string.ok)); builder.negativeText(main.getResources().getString(R.string.cancel)); builder.positiveColor(Color.parseColor(main.fabSkin)); builder.negativeColor(Color.parseColor(main.fabSkin)); builder.onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { EditText editText = dialog.getInputEditText(); if (editText.getText().toString().equals(password)) decryptButtonCallbackInterface.confirm(intent); else decryptButtonCallbackInterface.failed(); } }); builder.onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { dialog.cancel(); } }); builder.show(); } public static void showSMBHelpDialog(Context m,String acc){ MaterialDialog.Builder b=new MaterialDialog.Builder(m); b.content(m.getText(R.string.smb_instructions)); b.positiveText(R.string.doit); b.positiveColor(Color.parseColor(acc)); b.build().show(); } public static void showPackageDialog(final File f, final MainActivity m) { MaterialDialog.Builder mat = new MaterialDialog.Builder(m); mat.title(R.string.packageinstaller).content(R.string.pitext) .positiveText(R.string.install) .negativeText(R.string.view) .neutralText(R.string.cancel) .positiveColor(Color.parseColor(BaseActivity.accentSkin)) .negativeColor(Color.parseColor(BaseActivity.accentSkin)) .neutralColor(Color.parseColor(BaseActivity.accentSkin)) .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog materialDialog) { Futils.openunknown(f, m, false); } @Override public void onNegative(MaterialDialog materialDialog) { m.openZip(f.getPath()); } }) .theme(m.getAppTheme().getMaterialDialogTheme()) .build() .show(); } public static void showArchiveDialog(final File f, final MainActivity m) { MaterialDialog.Builder mat = new MaterialDialog.Builder(m); mat.title(R.string.archive) .content(R.string.archtext) .positiveText(R.string.extract) .negativeText(R.string.view) .neutralText(R.string.cancel) .positiveColor(Color.parseColor(BaseActivity.accentSkin)) .negativeColor(Color.parseColor(BaseActivity.accentSkin)) .neutralColor(Color.parseColor(BaseActivity.accentSkin)) .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog materialDialog) { m. mainActivityHelper.extractFile(f); } @Override public void onNegative(MaterialDialog materialDialog) { //m.addZipViewTab(f.getPath()); if (f.getName().toLowerCase().endsWith(".rar")) m.openRar(Uri.fromFile(f).toString()); else m.openZip(Uri.fromFile(f).toString()); } }); if (m.getAppTheme().equals(AppTheme.DARK)) mat.theme(Theme.DARK); MaterialDialog b = mat.build(); if (!f.getName().toLowerCase().endsWith(".rar") && !f.getName().toLowerCase().endsWith(".jar") && !f.getName().toLowerCase().endsWith(".apk") && !f.getName().toLowerCase().endsWith(".zip")) b.getActionButton(DialogAction.NEGATIVE).setEnabled(false); b.show(); } public static void showCompressDialog(final MainActivity m, final ArrayList<BaseFile> b, final String current) { MaterialDialog.Builder a = new MaterialDialog.Builder(m); a.input(m.getResources().getString(R.string.enterzipname), ".zip", false, new MaterialDialog.InputCallback() { @Override public void onInput(MaterialDialog materialDialog, CharSequence charSequence) { } }); a.widgetColor(Color.parseColor(BaseActivity.accentSkin)); a.theme(m.getAppTheme().getMaterialDialogTheme()); a.title(m.getResources().getString(R.string.enterzipname)); a.positiveText(R.string.create); a.positiveColor(Color.parseColor(BaseActivity.accentSkin)); a.onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(MaterialDialog materialDialog, DialogAction dialogAction) { if (materialDialog.getInputEditText().getText().toString().equals(".zip")) Toast.makeText(m, "File should have a name", Toast.LENGTH_SHORT).show(); else { String name = current + "/" + materialDialog.getInputEditText().getText().toString(); m.mainActivityHelper.compressFiles(new File(name), b); } } }); a.negativeText(m.getResources().getString(R.string.cancel)); a.negativeColor(Color.parseColor(BaseActivity.accentSkin)); a.build().show(); } public static void showSortDialog(final MainFragment m, AppTheme appTheme) { String[] sort = m.getResources().getStringArray(R.array.sortby); int current = Integer.parseInt(m.sharedPref.getString("sortby", "0")); MaterialDialog.Builder a = new MaterialDialog.Builder(m.getActivity()); a.theme(appTheme.getMaterialDialogTheme()); a.items(sort).itemsCallbackSingleChoice(current > 3 ? current - 4 : current, new MaterialDialog.ListCallbackSingleChoice() { @Override public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) { return true; } }); a.negativeText(R.string.ascending).positiveColor(Color.parseColor(BaseActivity.accentSkin)); a.positiveText(R.string.descending).negativeColor(Color.parseColor(BaseActivity.accentSkin)); a.onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { m.sharedPref.edit().putString("sortby", "" + dialog.getSelectedIndex()).commit(); m.getSortModes(); m.updateList(); dialog.dismiss(); } }); a.onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { m.sharedPref.edit().putString("sortby", "" + (dialog.getSelectedIndex() + 4)).commit(); m.getSortModes(); m.updateList(); dialog.dismiss(); } }); a.title(R.string.sortby); a.build().show(); } public static void showSortDialog(final AppsList m, AppTheme appTheme) { String[] sort = m.getResources().getStringArray(R.array.sortbyApps); int current = Integer.parseInt(m.Sp.getString("sortbyApps", "0")); MaterialDialog.Builder a = new MaterialDialog.Builder(m.getActivity()); a.theme(appTheme.getMaterialDialogTheme()); a.items(sort).itemsCallbackSingleChoice(current > 2 ? current - 3 : current, new MaterialDialog.ListCallbackSingleChoice() { @Override public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) { return true; } }); a.negativeText(R.string.ascending).positiveColor(Color.parseColor(BaseActivity.accentSkin)); a.positiveText(R.string.descending).negativeColor(Color.parseColor(BaseActivity.accentSkin)); a.onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { m.Sp.edit().putString("sortbyApps", "" + dialog.getSelectedIndex()).commit(); m.getSortModes(); m.getLoaderManager().restartLoader(AppsList.ID_LOADER_APP_LIST, null, m); dialog.dismiss(); } }); a.onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { m.Sp.edit().putString("sortbyApps", "" + (dialog.getSelectedIndex() + 3)).commit(); m.getSortModes(); m.getLoaderManager().restartLoader(AppsList.ID_LOADER_APP_LIST, null, m); dialog.dismiss(); } }); a.title(R.string.sortby); a.build().show(); } public static void showHistoryDialog(final DataUtils dataUtils, Futils utils, final MainFragment m, AppTheme appTheme) { final MaterialDialog.Builder a = new MaterialDialog.Builder(m.getActivity()); a.positiveText(R.string.cancel); a.positiveColor(Color.parseColor(BaseActivity.accentSkin)); a.negativeText(R.string.clear); a.negativeColor(Color.parseColor(BaseActivity.accentSkin)); a.title(R.string.history); a.onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { dataUtils.clearHistory(); } }); a.theme(appTheme.getMaterialDialogTheme()); a.autoDismiss(true); HiddenAdapter adapter = new HiddenAdapter(m.getActivity(), m, utils, R.layout.bookmarkrow, toHFileArray(dataUtils.getHistory()), null, true); a.adapter(adapter, null); MaterialDialog x= a.build(); adapter.updateDialog(x); x.show(); } public static void showHiddenDialog(DataUtils dataUtils, Futils utils, final MainFragment m, AppTheme appTheme) { final MaterialDialog.Builder a = new MaterialDialog.Builder(m.getActivity()); a.positiveText(R.string.cancel); a.positiveColor(Color.parseColor(BaseActivity.accentSkin)); a.title(R.string.hiddenfiles); a.theme(appTheme.getMaterialDialogTheme()); a.autoDismiss(true); HiddenAdapter adapter = new HiddenAdapter(m.getActivity(), m, utils, R.layout.bookmarkrow, toHFileArray(dataUtils.getHiddenfiles()), null, false); a.adapter(adapter, null); a.dividerColor(Color.GRAY); MaterialDialog x= a.build(); adapter.updateDialog(x); x.show(); } public static void setPermissionsDialog(final View v, View but, final HFile file, final String f, final Context context, final MainFragment mainFrag) { final CheckBox readown = (CheckBox) v.findViewById(R.id.creadown); final CheckBox readgroup = (CheckBox) v.findViewById(R.id.creadgroup); final CheckBox readother = (CheckBox) v.findViewById(R.id.creadother); final CheckBox writeown = (CheckBox) v.findViewById(R.id.cwriteown); final CheckBox writegroup = (CheckBox) v.findViewById(R.id.cwritegroup); final CheckBox writeother = (CheckBox) v.findViewById(R.id.cwriteother); final CheckBox exeown = (CheckBox) v.findViewById(R.id.cexeown); final CheckBox exegroup = (CheckBox) v.findViewById(R.id.cexegroup); final CheckBox exeother = (CheckBox) v.findViewById(R.id.cexeother); String perm = f; if (perm.length() < 6) { v.setVisibility(View.GONE); but.setVisibility(View.GONE); Toast.makeText(context, R.string.not_allowed, Toast.LENGTH_SHORT).show(); return; } ArrayList<Boolean[]> arrayList = Futils.parse(perm); Boolean[] read = arrayList.get(0); Boolean[] write = arrayList.get(1); final Boolean[] exe = arrayList.get(2); readown.setChecked(read[0]); readgroup.setChecked(read[1]); readother.setChecked(read[2]); writeown.setChecked(write[0]); writegroup.setChecked(write[1]); writeother.setChecked(write[2]); exeown.setChecked(exe[0]); exegroup.setChecked(exe[1]); exeother.setChecked(exe[2]); but.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int a = 0, b = 0, c = 0; if (readown.isChecked()) a = 4; if (writeown.isChecked()) b = 2; if (exeown.isChecked()) c = 1; int owner = a + b + c; int d = 0; int e = 0; int f = 0; if (readgroup.isChecked()) d = 4; if (writegroup.isChecked()) e = 2; if (exegroup.isChecked()) f = 1; int group = d + e + f; int g = 0, h = 0, i = 0; if (readother.isChecked()) g = 4; if (writeother.isChecked()) h = 2; if (exeother.isChecked()) i = 1; int other = g + h + i; String finalValue = owner + "" + group + "" + other; String command = "chmod " + finalValue + " " + file.getPath(); if (file.isDirectory()) command = "chmod -R " + finalValue + " \"" + file.getPath() + "\""; try { RootHelper.runShellCommand(command, new Shell.OnCommandResultListener() { @Override public void onCommandResult(int commandCode, int exitCode, List<String> output) { if (exitCode < 0) { Toast.makeText(context, mainFrag.getString(R.string.operationunsuccesful), Toast.LENGTH_LONG).show(); } else { Toast.makeText(context, mainFrag.getResources().getString(R.string.done), Toast.LENGTH_LONG).show(); } } }); mainFrag.updateList(); } catch (RootNotPermittedException e1) { Toast.makeText(context, mainFrag.getResources().getString(R.string.rootfailure), Toast.LENGTH_LONG).show(); e1.printStackTrace(); } } }); } }