package com.money.manager.ex.core; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.util.TypedValue; import android.widget.Toast; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; import com.mikepenz.iconics.IconicsDrawable; import com.mikepenz.iconics.typeface.IIcon; import com.money.manager.ex.Constants; import com.money.manager.ex.MoneyManagerApplication; import com.money.manager.ex.R; import com.money.manager.ex.settings.AppSettings; import com.money.manager.ex.utils.MmxDatabaseUtils; import com.nononsenseapps.filepicker.FilePickerActivity; import javax.inject.Inject; import dagger.Lazy; import rx.Observable; import rx.Subscriber; import rx.functions.Action0; import rx.subscriptions.Subscriptions; import timber.log.Timber; /** * Various methods that assist with the UI Android requirements. */ public class UIHelper { public static void pickFileDialog(Activity activity, String location, int requestCode) { // This always works Intent i = new Intent(activity, FilePickerActivity.class); // This works if you defined the intent filter // Intent i = new Intent(Intent.ACTION_GET_CONTENT); // Set these depending on your use case. These are the defaults. i.putExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, false); i.putExtra(FilePickerActivity.EXTRA_ALLOW_CREATE_DIR, false); i.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_FILE); // Configure initial directory by specifying a String. // You could specify a String like "/storage/emulated/0/", but that can // dangerous. Always use Android's API calls to get paths to the SD-card or // internal memory. i.putExtra(FilePickerActivity.EXTRA_START_PATH, location); // Environment.getExternalStorageDirectory().getPath() activity.startActivityForResult(i, requestCode); } /** * Extracts the path to the selected database file. * @param data Intent * @return Path to the selected file. */ public static String getSelectedFile(Intent data) { if (data == null) return null; String filePath = data.getData().getPath(); // check if the db file is valid if (!MmxDatabaseUtils.isValidDbFile(filePath)) return null; return filePath; } /* Instance */ public UIHelper(Context context) { this.context = context; MoneyManagerApplication.getApp().iocComponent.inject(this); } @Inject Lazy<AppSettings> appSettingsLazy; private Context context; public Context getContext() { return this.context; } public Observable<Boolean> binaryDialog(final int title, final int message) { return binaryDialog(title, message, android.R.string.ok, android.R.string.cancel); } public Observable<Boolean> binaryDialog(final int title, final int message, final int positiveTextId, final int negativeTextId) { return Observable.create(new Observable.OnSubscribe<Boolean>() { @Override public void call(final Subscriber<? super Boolean> subscriber) { final MaterialDialog dialog = new MaterialDialog.Builder(getContext()) .title(title) .content(message) .positiveText(positiveTextId) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { subscriber.onNext(true); subscriber.onCompleted(); } }) .negativeText(negativeTextId) .onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { subscriber.onNext(false); subscriber.onCompleted(); } }) .build(); // cleaning up subscriber.add(Subscriptions.create(new Action0() { @Override public void call() { dialog.dismiss(); } })); // show the dialog dialog.show(); } }); } public int getColor(int colorId) { return ContextCompat.getColor(getContext(), colorId); } public int getDimenInDp(int dimenId) { int sizeInDp = (int) (getContext().getResources().getDimension(dimenId) / getContext().getResources().getDisplayMetrics().density); return sizeInDp; } /** * Creates an icon with default settings. The default color is the toolbar item color. * @param icon Icon to instantiate. * @return Drawable (Iconics drawable). */ public IconicsDrawable getIcon(IIcon icon) { return new IconicsDrawable(getContext()) .icon(icon) .color(getToolbarItemColor()) .sizeDp(this.getToolbarIconSize()); } public int getPrimaryTextColor() { return isUsingDarkTheme() ? ContextCompat.getColor(getContext(), android.R.color.primary_text_dark) : ContextCompat.getColor(getContext(), android.R.color.primary_text_light); } public int getSecondaryTextColor() { return isUsingDarkTheme() ? ContextCompat.getColor(getContext(), android.R.color.secondary_text_dark) : ContextCompat.getColor(getContext(), android.R.color.secondary_text_light); } public int getToolbarItemColor() { return ContextCompat.getColor(getContext(), R.color.material_white); } public int getToolbarIconSize() { return getDimenInDp(R.dimen.mmx_icon_size); } /** * Return application theme choice from user * @return application theme id */ public int getThemeId() { try { String darkTheme = Constants.THEME_DARK; String currentTheme = appSettingsLazy.get().getGeneralSettings().getTheme(); if (currentTheme.endsWith(darkTheme)) { // Dark theme return R.style.Theme_Money_Manager_Dark; } else { // Light theme return R.style.Theme_Money_Manager_Light; } } catch (Exception e) { Timber.e(e, "getting theme setting"); return R.style.Theme_Money_Manager_Light; } } public boolean isUsingDarkTheme() { return getThemeId() == R.style.Theme_Money_Manager_Dark; } /** * Resolves the attribute into a resource id. * For example attr/color resolves into color.red, which is used to get the Color object. * @param attr id attribute * @return resource id for the given attribute. */ public int resolveAttribute(int attr) { TypedValue tv = new TypedValue(); if (getContext().getTheme().resolveAttribute(attr, tv, true)) return tv.resourceId; else return Constants.NOT_SET; } // public int dpToPx(int dp) { // DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics(); // int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); // return px; // } // // public int pxToDp(int px) { // DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics(); // int dp = Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); // return dp; // } // /** // * Pick a database file using built-in file picker. // * @param locationPath ? // */ // public void pickFileDialog(String locationPath, int requestCode) { // // root path should be the internal storage? // String root = Environment.getExternalStorageDirectory().getPath(); // // new MaterialFilePicker() // .withActivity((Activity) getContext()) // .withRequestCode(requestCode) // .withRootPath(root) // .withPath(locationPath) // .withFilter(Pattern.compile(".*\\.mmb$")) // //.withFilterDirectories() // .withHiddenFiles(true) // .start(); // // // continues in onActivityResult in the parent activity // } public void showToast(int messageId) { showToast(messageId, Toast.LENGTH_SHORT); } public void showToast(String message) { showToast(message, Toast.LENGTH_SHORT); } public void showToast(final int message, final int length) { Context context = getContext(); if (!(context instanceof Activity)) return; final Activity parent = (Activity) context; parent.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getContext(), message, length).show(); } }); } public void showToast(final String message, final int length) { Context context = getContext(); if (!(context instanceof Activity)) return; final Activity parent = (Activity) context; parent.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getContext(), message, length).show(); } }); } }