You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
758 lines
28 KiB
Java
758 lines
28 KiB
Java
package name.mikanoshi.customiuizer;
|
|
|
|
import android.annotation.SuppressLint;
|
|
import android.app.Activity;
|
|
import android.content.ComponentName;
|
|
import android.content.DialogInterface;
|
|
import android.content.pm.PackageManager;
|
|
import android.content.res.AssetManager;
|
|
import android.graphics.Color;
|
|
import android.graphics.Paint;
|
|
import android.graphics.drawable.ColorDrawable;
|
|
import android.os.Build;
|
|
import android.os.Bundle;
|
|
import android.os.Handler;
|
|
import android.preference.CheckBoxPreference;
|
|
import android.preference.Preference;
|
|
import android.preference.Preference.OnPreferenceClickListener;
|
|
import android.preference.PreferenceCategory;
|
|
import android.preference.PreferenceScreen;
|
|
import android.text.Editable;
|
|
import android.text.Layout;
|
|
import android.text.Spannable;
|
|
import android.text.SpannableString;
|
|
import android.text.TextWatcher;
|
|
import android.text.style.AlignmentSpan;
|
|
import android.text.style.LineHeightSpan;
|
|
import android.view.ActionMode;
|
|
import android.view.KeyEvent;
|
|
import android.view.LayoutInflater;
|
|
import android.view.Menu;
|
|
import android.view.MenuItem;
|
|
import android.view.MotionEvent;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.AdapterView;
|
|
import android.widget.Button;
|
|
import android.widget.ImageView;
|
|
import android.widget.LinearLayout;
|
|
import android.widget.ListAdapter;
|
|
import android.widget.ListView;
|
|
import android.widget.PopupWindow;
|
|
import android.widget.TextView;
|
|
|
|
import org.acra.ACRA;
|
|
|
|
import java.io.BufferedReader;
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.FileOutputStream;
|
|
import java.io.InputStream;
|
|
import java.io.InputStreamReader;
|
|
import java.io.OutputStreamWriter;
|
|
import java.lang.reflect.Method;
|
|
import java.net.HttpURLConnection;
|
|
import java.net.URL;
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.Locale;
|
|
|
|
import miui.app.AlertDialog;
|
|
import miui.view.SearchActionMode;
|
|
|
|
import name.mikanoshi.customiuizer.prefs.ListPreferenceEx;
|
|
import name.mikanoshi.customiuizer.prefs.PreferenceEx;
|
|
import name.mikanoshi.customiuizer.subs.CategorySelector;
|
|
import name.mikanoshi.customiuizer.subs.Controls;
|
|
import name.mikanoshi.customiuizer.subs.Launcher;
|
|
import name.mikanoshi.customiuizer.subs.System;
|
|
import name.mikanoshi.customiuizer.subs.Various;
|
|
import name.mikanoshi.customiuizer.utils.GuidePopup;
|
|
import name.mikanoshi.customiuizer.utils.Helpers;
|
|
import name.mikanoshi.customiuizer.utils.ModData;
|
|
import name.mikanoshi.customiuizer.utils.ModSearchAdapter;
|
|
|
|
public class MainFragment extends PreferenceFragmentBase {
|
|
|
|
private final CategorySelector catSelector = new CategorySelector();
|
|
public System prefSystem = new System();
|
|
public Launcher prefLauncher = new Launcher();
|
|
public Controls prefControls = new Controls();
|
|
public Various prefVarious = new Various();
|
|
private View searchView = null;
|
|
private ListView listView = null;
|
|
private ListView resultView = null;
|
|
private LinearLayout search = null;
|
|
private View modsCat = null;
|
|
private View markCat = null;
|
|
boolean isSearchFocused = false;
|
|
boolean areGuidesCleared = false;
|
|
boolean actionModeNew = false;
|
|
ActionMode actionMode = null;
|
|
SearchActionMode.Callback actionModeCallback = new SearchActionMode.Callback() {
|
|
@Override
|
|
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
|
if (searchView == null || listView == null) {
|
|
if (mode != null) mode.finish();
|
|
return false;
|
|
}
|
|
|
|
SearchActionMode samode = (SearchActionMode)mode;
|
|
samode.setAnchorView(searchView);
|
|
samode.setAnimateView(listView);
|
|
samode.getSearchInput().setOnFocusChangeListener(new View.OnFocusChangeListener() {
|
|
@Override
|
|
public void onFocusChange(View v, boolean hasFocus) {
|
|
isSearchFocused = hasFocus;
|
|
}
|
|
});
|
|
samode.getSearchInput().setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
isSearchFocused = v.hasFocus();
|
|
}
|
|
});
|
|
samode.getSearchInput().setOnEditorActionListener(new TextView.OnEditorActionListener() {
|
|
@Override
|
|
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
|
|
if (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
|
|
Helpers.hideKeyboard(getActivity(), v);
|
|
resultView.requestFocus();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
});
|
|
samode.getSearchInput().addTextChangedListener(new TextWatcher() {
|
|
@Override
|
|
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
|
|
|
|
@Override
|
|
public void onTextChanged(CharSequence s, int start, int before, int count) {}
|
|
|
|
@Override
|
|
public void afterTextChanged(Editable s) {
|
|
findMod(s.toString().trim());
|
|
}
|
|
});
|
|
|
|
if (actionModeNew) {
|
|
actionModeNew = false;
|
|
resultView.postDelayed(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
samode.getSearchInput().setText(Helpers.NEW_MODS_SEARCH_QUERY);
|
|
samode.getSearchInput().setSelection(1, 1);
|
|
Helpers.hideKeyboard(getActivity(), getView());
|
|
resultView.requestFocus();
|
|
}
|
|
}, getResources().getInteger(android.R.integer.config_longAnimTime));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
|
|
if (searchView == null || listView == null) {
|
|
if (mode != null) mode.finish();
|
|
return false;
|
|
}
|
|
|
|
SearchActionMode samode = (SearchActionMode)mode;
|
|
samode.setAnchorView(searchView);
|
|
samode.setAnimateView(listView);
|
|
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public void onDestroyActionMode(ActionMode mode) {
|
|
TextView input = search == null ? null : search.findViewById(android.R.id.input);
|
|
if (input != null) input.setText("");
|
|
findMod("");
|
|
getActionBar().show();
|
|
actionMode = null;
|
|
}
|
|
};
|
|
|
|
private final Runnable showUpdateNotification = new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (getView() != null) try {
|
|
ImageView alert = getView().findViewById(R.id.update_alert);
|
|
if (alert != null) alert.setVisibility(View.VISIBLE);
|
|
} catch (Throwable e) {}
|
|
}
|
|
};
|
|
|
|
private final Runnable hideUpdateNotification = new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (getView() != null) try {
|
|
ImageView alert = getView().findViewById(R.id.update_alert);
|
|
if (alert != null) alert.setVisibility(View.GONE);
|
|
} catch (Throwable e) {}
|
|
}
|
|
};
|
|
|
|
private boolean isFragmentReady(Activity act) {
|
|
return act != null && !act.isFinishing() && MainFragment.this.isAdded();
|
|
}
|
|
|
|
@Override
|
|
@SuppressLint("MissingSuperCall")
|
|
public void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState, R.xml.prefs_main);
|
|
addPreferencesFromResource(R.xml.prefs_main);
|
|
|
|
final Activity act = getActivity();
|
|
final Handler handler = new Handler(act.getMainLooper());
|
|
|
|
if (Helpers.miuizerModuleActive && !Helpers.prefs.getBoolean("miuizer_prefs_migrated", false) && Helpers.usingNewSharedPrefs()) {
|
|
((MainActivity)act).migrateOnExit = true;
|
|
act.recreate();
|
|
return;
|
|
}
|
|
|
|
// Preventing launch delay
|
|
new Thread(new Runnable() {
|
|
public void run() {
|
|
if (!Helpers.isXposedInstallerInstalled(act))
|
|
act.runOnUiThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(act);
|
|
builder.setTitle(R.string.xposed_not_found);
|
|
builder.setMessage(R.string.xposed_not_found_explain);
|
|
builder.setNeutralButton(R.string.okay, null);
|
|
builder.setNegativeButton(R.string.i_use_lsp, new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
Helpers.prefs.edit().putBoolean("pref_key_miuizer_assumelsposed", true).apply();
|
|
getActivity().recreate();
|
|
}
|
|
});
|
|
AlertDialog dlg = builder.create();
|
|
if (isFragmentReady(act)) dlg.show();
|
|
}
|
|
}); else if (isFragmentReady(act) && !Helpers.miuizerModuleActive)
|
|
act.runOnUiThread(new Runnable() {
|
|
public void run() {
|
|
showXposedDialog(act);
|
|
}
|
|
}); else areGuidesCleared = true;
|
|
|
|
if (Helpers.prefs.getBoolean("miuizer_prefs_migrated", false)) {
|
|
int result = Helpers.prefs.getInt("miuizer_prefs_migration_result", 0);
|
|
if (result > 0) {
|
|
Helpers.prefs.edit().putInt("miuizer_prefs_migration_result", -1).apply();
|
|
act.runOnUiThread(new Runnable() {
|
|
public void run() {
|
|
showPrefsMigrationDialog(result == 1);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
String dataPath = act.getFilesDir().getAbsolutePath();
|
|
try {
|
|
URL url = new URL("https://code.highspec.ru/Mikanoshi/CustoMIUIzer/raw/branch/master/last_build");
|
|
//URL url = new URL("https://code.highspec.ru/last_build");
|
|
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
|
|
connection.setDefaultUseCaches(false);
|
|
connection.setUseCaches(false);
|
|
connection.setRequestProperty("Pragma", "no-cache");
|
|
connection.setRequestProperty("Cache-Control", "no-cache");
|
|
connection.setRequestProperty("Expires", "-1");
|
|
connection.connect();
|
|
|
|
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK || connection.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED) {
|
|
String last_build = "";
|
|
|
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
|
|
last_build = reader.readLine().trim();
|
|
} catch (Throwable t) { t.printStackTrace(); }
|
|
|
|
File tmp = new File(dataPath);
|
|
if (!tmp.exists()) tmp.mkdirs();
|
|
try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(dataPath + "/last_build", false))) {
|
|
writer.write(last_build);
|
|
} catch (Throwable t) { t.printStackTrace(); }
|
|
}
|
|
|
|
connection.disconnect();
|
|
} catch (Throwable t) { t.printStackTrace(); }
|
|
|
|
try (InputStream inputFile = new FileInputStream(dataPath + "/last_build")) {
|
|
int last_build = 0;
|
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputFile))) {
|
|
last_build = Integer.parseInt(reader.readLine().trim());
|
|
} catch (Throwable ignore) {}
|
|
|
|
if (last_build > BuildConfig.VERSION_CODE)
|
|
handler.post(showUpdateNotification);
|
|
else
|
|
handler.post(hideUpdateNotification);
|
|
} catch (Throwable t) { t.printStackTrace(); }
|
|
|
|
Helpers.getAllMods(act, savedInstanceState != null);
|
|
}
|
|
}).start();
|
|
|
|
if (Helpers.prefs.getBoolean("pref_key_was_restore", false)) {
|
|
Helpers.prefs.edit().putBoolean("pref_key_was_restore", false).apply();
|
|
showRestoreInfoDialog();
|
|
}
|
|
}
|
|
|
|
public View onInflateView(LayoutInflater inflater, ViewGroup group, Bundle bundle) {
|
|
return inflater.inflate(Helpers.is12() ? R.layout.prefs_main12 : R.layout.prefs_main, group, false);
|
|
}
|
|
|
|
private void openActionMode(boolean isNew) {
|
|
actionModeNew = isNew;
|
|
actionMode = startActionMode(actionModeCallback);
|
|
hideSplitView();
|
|
}
|
|
|
|
private static class SetLineOverlap implements LineHeightSpan {
|
|
private int originalBottom = 15;
|
|
private int originalDescent = 13;
|
|
private final Boolean overlap;
|
|
private Boolean overlapSaved = false;
|
|
|
|
SetLineOverlap(Boolean overlap) {
|
|
this.overlap = overlap;
|
|
}
|
|
|
|
@Override
|
|
public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int v, Paint.FontMetricsInt fm) {
|
|
if (overlap) {
|
|
if (!overlapSaved) {
|
|
originalBottom = fm.bottom;
|
|
originalDescent = fm.descent;
|
|
overlapSaved = true;
|
|
}
|
|
fm.bottom += fm.top;
|
|
fm.descent += fm.top;
|
|
} else {
|
|
fm.bottom = originalBottom;
|
|
fm.descent = originalDescent;
|
|
overlapSaved = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onActivityCreated(Bundle savedInstanceState) {
|
|
super.onActivityCreated(savedInstanceState);
|
|
|
|
if (getView() == null) return;
|
|
|
|
resultView = getView().findViewById(android.R.id.custom);
|
|
resultView.setAdapter(new ModSearchAdapter(getActivity()));
|
|
resultView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
|
@Override
|
|
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
|
ModData mod = (ModData)parent.getAdapter().getItem(position);
|
|
openModCat(mod.cat.name(), mod.sub, mod.key);
|
|
}
|
|
});
|
|
resultView.setOnTouchListener(new View.OnTouchListener() {
|
|
@Override
|
|
@SuppressLint("ClickableViewAccessibility")
|
|
public boolean onTouch(View v, MotionEvent event) {
|
|
if (actionMode != null && isSearchFocused) {
|
|
isSearchFocused = false;
|
|
Handler handler = new Handler(v.getContext().getMainLooper());
|
|
handler.postDelayed(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
Helpers.hideKeyboard(getActivity(), getView());
|
|
}
|
|
}, getResources().getInteger(android.R.integer.config_shortAnimTime));
|
|
}
|
|
return false;
|
|
}
|
|
});
|
|
setViewBackground(resultView);
|
|
|
|
searchView = getView().findViewById(R.id.searchView);
|
|
setActionModeStyle(searchView);
|
|
|
|
search = searchView.findViewById(android.R.id.inputArea);
|
|
search.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
openActionMode(false);
|
|
}
|
|
});
|
|
search.setOnLongClickListener(new View.OnLongClickListener() {
|
|
@Override
|
|
public boolean onLongClick(View v) {
|
|
openActionMode(true);
|
|
return true;
|
|
}
|
|
});
|
|
|
|
TextView searchInput = search.findViewById(android.R.id.input);
|
|
searchInput.setHint(R.string.search_input_description);
|
|
|
|
modsCat = null; markCat = null;
|
|
listView = getView().findViewById(android.R.id.list);
|
|
listView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
|
|
@Override
|
|
public void onChildViewAdded(View parent, View child) {
|
|
if (child == null) return;
|
|
CharSequence title = ((TextView)child.findViewById(android.R.id.title)).getText();
|
|
if (title.equals(getResources().getString(R.string.system_mods))) modsCat = child;
|
|
if (title.equals(getResources().getString(R.string.miuizer_show_newmods_title))) markCat = child;
|
|
if (modsCat != null && markCat != null) {
|
|
if (areGuidesCleared) try {
|
|
showGuides();
|
|
} catch (Throwable t) {
|
|
t.printStackTrace();
|
|
}
|
|
listView.setOnHierarchyChangeListener(null);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onChildViewRemoved(View parent, View child) {}
|
|
});
|
|
|
|
if (actionMode != null) actionMode.invalidate();
|
|
final Activity act = getActivity();
|
|
|
|
PreferenceEx warning = (PreferenceEx)findPreference("pref_key_warning");
|
|
if (warning != null)
|
|
if (Helpers.isRPlus()) {
|
|
warning.setTitle(R.string.warning);
|
|
warning.setSummary(getString(R.string.warning_unsupported_os, Build.VERSION.RELEASE));
|
|
warning.setNotice(true);
|
|
} else if (Helpers.usingNewSharedPrefs() && Helpers.isXposedScopeEnabled(act)) {
|
|
warning.setTitle(R.string.warning);
|
|
warning.setSummary(R.string.warning_scope);
|
|
warning.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
|
@Override
|
|
public boolean onPreferenceClick(Preference preference) {
|
|
Helpers.openXposedApp(getValidContext());
|
|
return true;
|
|
}
|
|
});
|
|
} else if (!Helpers.usingNewSharedPrefs() && Helpers.areXposedBlacklistsEnabled()) {
|
|
warning.setTitle(R.string.warning);
|
|
if (act.getApplicationContext().getApplicationInfo().targetSdkVersion > 27)
|
|
warning.setSummary(getString(R.string.warning_blacklist) + "\n" + getString(R.string.warning_blacklist_sdk));
|
|
else
|
|
warning.setSummary(R.string.warning_blacklist);
|
|
warning.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
|
@Override
|
|
public boolean onPreferenceClick(Preference preference) {
|
|
Helpers.openXposedApp(getValidContext());
|
|
return true;
|
|
}
|
|
});
|
|
} else getPreferenceScreen().removePreference(warning);
|
|
|
|
findPreference("pref_key_miuizer_launchericon").setOnPreferenceChangeListener(new CheckBoxPreference.OnPreferenceChangeListener() {
|
|
@Override
|
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
|
PackageManager pm = act.getPackageManager();
|
|
if ((Boolean)newValue)
|
|
pm.setComponentEnabledSetting(new ComponentName(act, GateWayLauncher.class), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
|
|
else
|
|
pm.setComponentEnabledSetting(new ComponentName(act, GateWayLauncher.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
|
|
return true;
|
|
}
|
|
});
|
|
|
|
String[] locales;
|
|
try {
|
|
AssetManager am = getContext().getAssets();
|
|
@SuppressWarnings("JavaReflectionMemberAccess") @SuppressLint("SoonBlockedPrivateApi")
|
|
Method getNonSystemLocales = AssetManager.class.getDeclaredMethod("getNonSystemLocales");
|
|
locales = (String[])getNonSystemLocales.invoke(am);
|
|
if (locales == null) locales = new String[] {};
|
|
} catch (Throwable t) {
|
|
locales = new String[] { "de", "es", "it", "pt-BR", "ru-RU", "tr", "uk-UK", "zh-CN" };
|
|
}
|
|
|
|
ArrayList<String> localesArr = new ArrayList<String>(Arrays.asList(locales));
|
|
ArrayList<SpannableString> localeNames = new ArrayList<SpannableString>();
|
|
localesArr.add(0, "en");
|
|
for (String locale: localesArr) try {
|
|
Locale loc = Locale.forLanguageTag(locale);
|
|
StringBuilder locStr = new StringBuilder(loc.getDisplayLanguage(loc));
|
|
locStr.setCharAt(0, Character.toUpperCase(locStr.charAt(0)));
|
|
SpannableString locSpanString;
|
|
if (!locale.equals("en")) {
|
|
String locStrPct = locStr + "\n" + Helpers.l10nProgress.get(locale) + "%";
|
|
int fullTextLength = locStrPct.length();
|
|
locSpanString = new SpannableString(locStrPct);
|
|
locSpanString.setSpan(new AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE), locStr.toString().length(), fullTextLength, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
locSpanString.setSpan(new SetLineOverlap(true), 1, fullTextLength - 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
locSpanString.setSpan(new SetLineOverlap(false), fullTextLength - 1, fullTextLength, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
} else locSpanString = new SpannableString(locStr.toString());
|
|
localeNames.add(locSpanString);
|
|
} catch (Throwable t) {
|
|
localeNames.add(new SpannableString(Locale.getDefault().getDisplayLanguage(Locale.getDefault())));
|
|
}
|
|
|
|
localesArr.add(0, "auto");
|
|
localeNames.add(0, new SpannableString(getString(R.string.array_system_default)));
|
|
|
|
ListPreferenceEx locale = (ListPreferenceEx)findPreference("pref_key_miuizer_locale");
|
|
locale.setEntries(localeNames.toArray(new CharSequence[0]));
|
|
locale.setEntryValues(localesArr.toArray(new CharSequence[0]));
|
|
locale.setOnPreferenceChangeListener(new CheckBoxPreference.OnPreferenceChangeListener() {
|
|
@Override
|
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
|
getActivity().recreate();
|
|
return true;
|
|
}
|
|
});
|
|
|
|
findPreference("pref_key_miuizer_holiday").setOnPreferenceChangeListener(new CheckBoxPreference.OnPreferenceChangeListener() {
|
|
@Override
|
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
|
getActivity().recreate();
|
|
return true;
|
|
}
|
|
});
|
|
|
|
findPreference("pref_key_miuizer_sendreport").setOnPreferenceClickListener(new CheckBoxPreference.OnPreferenceClickListener() {
|
|
@Override
|
|
public boolean onPreferenceClick(Preference preference) {
|
|
if (Helpers.checkStoragePerm(act, Helpers.REQUEST_PERMISSIONS_REPORT)) createReport();
|
|
return true;
|
|
}
|
|
});
|
|
|
|
findPreference("pref_key_miuizer_feedback").setOnPreferenceClickListener(new CheckBoxPreference.OnPreferenceClickListener() {
|
|
@Override
|
|
public boolean onPreferenceClick(Preference preference) {
|
|
openSubFragment(new SubFragment(), null, Helpers.SettingsType.Edit, Helpers.ActionBarType.Edit, R.string.miuizer_acramail_title, R.layout.prefs_freedback);
|
|
return true;
|
|
}
|
|
});
|
|
|
|
findPreference("pref_key_issuetracker").setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
|
@Override
|
|
public boolean onPreferenceClick(Preference pref) {
|
|
Helpers.openURL(act, "https://code.highspec.ru/Mikanoshi/CustoMIUIzer/issues");
|
|
return true;
|
|
}
|
|
});
|
|
|
|
// findPreference("pref_key_payinapp").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
|
// @Override
|
|
// public boolean onPreferenceClick(Preference pref) {
|
|
// Bundle args = new Bundle();
|
|
// args.putInt("baseResId", R.layout.fragment_inapp);
|
|
// openSubFragment(new InAppFragment(), args, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.support_donate_title, R.xml.prefs_inapp);
|
|
// return true;
|
|
// }
|
|
// });
|
|
|
|
findPreference("pref_key_paycrypto").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
|
@Override
|
|
public boolean onPreferenceClick(Preference pref) {
|
|
Helpers.openURL(act, "https://code.highspec.ru/cryptodonate");
|
|
return true;
|
|
}
|
|
});
|
|
|
|
findPreference("pref_key_payother").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
|
@Override
|
|
@SuppressWarnings("deprecation")
|
|
public boolean onPreferenceClick(Preference pref) {
|
|
if (getResources().getConfiguration().locale.getISO3Language().contains("ru"))
|
|
Helpers.openURL(act, "https://mikanoshi.name/donate/");
|
|
else
|
|
Helpers.openURL(act, "https://en.mikanoshi.name/donate/");
|
|
return true;
|
|
}
|
|
});
|
|
|
|
findPreference("pref_key_miuizer_marknewmods").setOnPreferenceChangeListener(new CheckBoxPreference.OnPreferenceChangeListener() {
|
|
@Override
|
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
|
Helpers.updateNewModsMarking(getActivity(), Integer.parseInt((String)newValue));
|
|
return true;
|
|
}
|
|
});
|
|
|
|
// if (Helpers.isUnsupportedManager(act)) {
|
|
// CheckBoxPreferenceEx ownrepo = (CheckBoxPreferenceEx)findPreference("pref_key_miuizer_ownrepo");
|
|
// ownrepo.setSummary(R.string.miuizer_ownrepo_unsupported);
|
|
// ownrepo.setEnabled(false);
|
|
// ownrepo.setChecked(false);
|
|
// }
|
|
|
|
// Helpers.removePref(this, "pref_key_miuizer_force_material", "pref_key_miuizer");
|
|
}
|
|
|
|
void showGuides() {
|
|
if (getView() == null || getActivity() == null) return;
|
|
Button more = getView().findViewById(getResources().getIdentifier("more", "id", "miui"));
|
|
View search = getView().findViewById(android.R.id.inputArea);
|
|
View overlay = getActivity().findViewById(R.id.guide_overlay);
|
|
if (more == null || search == null || overlay == null || Helpers.prefs.getBoolean("miuizer_guides_shown", false)) return;
|
|
|
|
overlay.setBackgroundColor(Helpers.isNightMode(getActivity()) ? Color.argb(150, 0, 0, 0) : Color.argb(150, 255, 255, 255));
|
|
overlay.setVisibility(View.VISIBLE);
|
|
overlay.bringToFront();
|
|
|
|
showGuide(search, GuidePopup.ARROW_TOP_MODE, R.string.guide_search).setOnDismissListener(new PopupWindow.OnDismissListener() {
|
|
@Override
|
|
public void onDismiss() {
|
|
showGuide(markCat, GuidePopup.ARROW_BOTTOM_MODE, R.string.guide_marknew).setOnDismissListener(new PopupWindow.OnDismissListener() {
|
|
@Override
|
|
public void onDismiss() {
|
|
showImmersionMenu();
|
|
showGuide(more, GuidePopup.ARROW_TOP_MODE, R.string.guide_softreboot).setOnDismissListener(new PopupWindow.OnDismissListener() {
|
|
@Override
|
|
public void onDismiss() {
|
|
dismissImmersionMenu(true);
|
|
overlay.setVisibility(View.GONE);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
Helpers.prefs.edit().putBoolean("miuizer_guides_shown", true).apply();
|
|
}
|
|
|
|
@SuppressWarnings({"UnusedReturnValue", "SameParameterValue"})
|
|
GuidePopup showGuide(View anchor, int arrowMode, int textResId) {
|
|
return showGuide(anchor, arrowMode, textResId, 0, 0);
|
|
}
|
|
|
|
@SuppressWarnings({"UnusedReturnValue", "SameParameterValue"})
|
|
GuidePopup showGuide(View anchor, int arrowMode, int textResId, int x, int y) {
|
|
GuidePopup guidePopup = new GuidePopup(getActivity());
|
|
guidePopup.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
|
|
guidePopup.setArrowMode(arrowMode);
|
|
guidePopup.setGuideText(textResId);
|
|
guidePopup.setOutsideTouchable(true);
|
|
guidePopup.show(anchor, x, y);
|
|
return guidePopup;
|
|
}
|
|
|
|
void findMod(String filter) {
|
|
resultView.setVisibility(filter.equals("") ? View.GONE : View.VISIBLE);
|
|
listView.setEnabled(filter.equals(""));
|
|
ListAdapter adapter = resultView.getAdapter();
|
|
if (adapter == null) return;
|
|
((ModSearchAdapter)resultView.getAdapter()).getFilter().filter(filter);
|
|
}
|
|
|
|
public void createReport() {
|
|
ACRA.getErrorReporter().handleException(null);
|
|
}
|
|
|
|
// PreferenceScreens management
|
|
private boolean openModCat(String cat) {
|
|
return openModCat(cat, null, null);
|
|
}
|
|
|
|
private boolean openModCat(String cat, String sub, String mod) {
|
|
Bundle bundle = new Bundle();
|
|
bundle.putString("cat", cat);
|
|
bundle.putString("sub", sub);
|
|
bundle.putString("mod", mod);
|
|
catSelector.setTargetFragment(this, 0);
|
|
switch (cat) {
|
|
case "pref_key_system":
|
|
if (sub == null)
|
|
openSubFragment(catSelector, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.system_mods, R.xml.prefs_system_cat);
|
|
else
|
|
openSubFragment(prefSystem, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.system_mods, R.xml.prefs_system);
|
|
return false;
|
|
case "pref_key_launcher":
|
|
if (sub == null)
|
|
openSubFragment(catSelector, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.launcher_title, R.xml.prefs_launcher_cat);
|
|
else
|
|
openSubFragment(prefLauncher, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.launcher_title, R.xml.prefs_launcher);
|
|
return true;
|
|
case "pref_key_controls":
|
|
if (sub == null)
|
|
openSubFragment(catSelector, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.controls_mods, R.xml.prefs_controls_cat);
|
|
else
|
|
openSubFragment(prefControls, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.controls_mods, R.xml.prefs_controls);
|
|
return false;
|
|
case "pref_key_various":
|
|
openSubFragment(prefVarious, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.various_mods, R.xml.prefs_various);
|
|
return false;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean onPreferenceTreeClick(PreferenceScreen parentPreferenceScreen, Preference preference) {
|
|
if (preference != null) {
|
|
PreferenceCategory modsCat = (PreferenceCategory)findPreference("prefs_cat");
|
|
if (modsCat.findPreference(preference.getKey()) != null)
|
|
if (openModCat(preference.getKey())) return true;
|
|
}
|
|
return super.onPreferenceTreeClick(parentPreferenceScreen, preference);
|
|
}
|
|
|
|
private void showRestoreInfoDialog() {
|
|
try {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
|
builder.setTitle(R.string.warning);
|
|
builder.setMessage(R.string.backup_restore_info);
|
|
builder.setCancelable(true);
|
|
builder.setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
|
public void onClick(DialogInterface dialog, int whichButton){}
|
|
});
|
|
AlertDialog dlg = builder.create();
|
|
dlg.show();
|
|
} catch (Throwable t) {
|
|
t.printStackTrace();
|
|
}
|
|
}
|
|
|
|
private void showPrefsMigrationDialog(boolean success) {
|
|
try {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
|
builder.setTitle(R.string.warning);
|
|
builder.setMessage(success ? R.string.prefs_migration_success : R.string.prefs_migration_failure);
|
|
builder.setCancelable(false);
|
|
builder.setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
|
public void onClick(DialogInterface dialog, int whichButton){}
|
|
});
|
|
AlertDialog dlg = builder.create();
|
|
dlg.show();
|
|
} catch (Throwable t) {
|
|
t.printStackTrace();
|
|
}
|
|
}
|
|
|
|
// private void showNotYetDialog() {
|
|
// try {
|
|
// AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
|
// builder.setTitle(R.string.info);
|
|
// builder.setMessage(R.string.not_yet);
|
|
// builder.setCancelable(true);
|
|
// builder.setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
|
// public void onClick(DialogInterface dialog, int whichButton){}
|
|
// });
|
|
// AlertDialog dlg = builder.create();
|
|
// dlg.show();
|
|
// } catch (Throwable t) {
|
|
// t.printStackTrace();
|
|
// }
|
|
// }
|
|
} |