package com.aero.control.fragments; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.graphics.Point; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.ViewGroup; import android.widget.Toast; import com.aero.control.AeroActivity; import com.aero.control.R; import com.aero.control.helpers.Android.CustomListPreference; import com.aero.control.helpers.FileManager.FileManager; import com.aero.control.helpers.FileManager.FileManagerListener; import com.aero.control.helpers.FilePath; import com.aero.control.helpers.PreferenceHandler; import com.github.amlcurran.showcaseview.ShowcaseView; import com.github.amlcurran.showcaseview.targets.Target; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Map; /** * Created by Alexander Christ on 03.04.14. */ public class MiscSettingsFragment extends PlaceHolderFragment implements FileManagerListener { public static final String FILENAME_MISC = "firstrun_misc"; private PreferenceScreen root; private PreferenceCategory PrefCat; private PreferenceCategory mMiscCat; private PreferenceHandler mHandler; private ArrayList<String> mParaList; private ArrayList<String> mNameList; private SharedPreferences mPrefs; private SharedPreferences mMiscSettings; private FileManager mLocalFolders; private Dialog mFileDialog; private Context mContext; private ShowcaseView mShowCase; private static final String MISC_SETTINGS_STORAGE = "miscSettingsStorage"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences from an XML resource addPreferencesFromResource(R.layout.empty_preference); root = this.getPreferenceScreen(); mContext = getActivity(); // Always rebuild; mMiscSettings = mContext.getSharedPreferences(MISC_SETTINGS_STORAGE, mContext.MODE_PRIVATE); // Load parameter data: loadParalist(); // Load our custom preferences; loadSettings(); } // Create our options menu; @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext.getApplicationContext()); inflater.inflate(R.menu.misc_menu, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_add_item: // Setup our file manager; mLocalFolders = new FileManager(mContext, null); mLocalFolders.setIFolderItemListener(this); mLocalFolders.setDir("/"); if (mFileDialog == null) { mFileDialog = new Dialog(mContext); ViewGroup.LayoutParams abc = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT); mFileDialog.addContentView(mLocalFolders, abc); // In case we are just creating the dialog, fill it with the root-path; mFileDialog.setTitle("/"); mLocalFolders.setDialog(mFileDialog); } mFileDialog.show(); break; case R.id.action_delete_item: if (mMiscCat == null) break; final AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); final ArrayList<String> allMiscSettings = new ArrayList<String>(); final ArrayList<Boolean> miscSettingsDelete = new ArrayList<Boolean>(); for (int i = 0; i < mMiscCat.getPreferenceCount(); i++) { allMiscSettings.add(mMiscCat.getPreference(i).getTitle().toString()); } if (allMiscSettings.size() == 0) { Toast.makeText(mContext, R.string.pref_misc_no_settings, Toast.LENGTH_LONG).show(); break; } // Fill with default data; for (String a : allMiscSettings) { miscSettingsDelete.add(false); } final String[] preferenceData = allMiscSettings.toArray(new String[0]); dialog.setTitle(R.string.pref_misc_delete_misc); dialog.setIcon(R.drawable.warning); dialog.setMultiChoiceItems(preferenceData, null, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i, boolean b) { if (b) { miscSettingsDelete.add(i, true); } else { miscSettingsDelete.add(i, false); } } }) // Set the action buttons .setPositiveButton(R.string.save, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { SharedPreferences.Editor editor = mMiscSettings.edit(); SharedPreferences.Editor aero_editor = mPrefs.edit(); final Map<String,?> keys = mMiscSettings.getAll(); int i = 0; for (String s : preferenceData) { if (miscSettingsDelete.get(i)) { for (final Map.Entry<String,?> entry : keys.entrySet()) { // Delete our marked entries; String key = entry.getKey(); String value = entry.getValue().toString(); if (preferenceData[i].equals(value)) { editor.remove(key).commit(); aero_editor.remove(key).commit(); } } } i++; } // Re-init to rebuild UI; root.removePreference(mMiscCat); mMiscCat = null; initMisc(); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { // Do Nothing } }) ; dialog.create().show(); break; } return super.onOptionsItemSelected(item); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Set up our file; int output = 0; if (AeroActivity.genHelper.doesExist(getActivity().getFilesDir().getAbsolutePath() + "/" + FILENAME_MISC)) { output = 1; } // Only show showcase once; if (output == 0) DrawFirstStart(R.string.showcase_your_settings, R.string.showcase_your_settings_sum); } public void DrawFirstStart(int header, int content) { try { final FileOutputStream fos = getActivity().openFileOutput(FILENAME_MISC, Context.MODE_PRIVATE); fos.write("1".getBytes()); fos.close(); } catch (IOException e) { Log.e("Aero", "Could not save file. ", e); } Target homeTarget = new Target() { @Override public Point getPoint() { // Get approximate position of overflow action icon's center int actionBarSize = getActivity().findViewById(R.id.action_add_item).getHeight(); int x = getResources().getDisplayMetrics().widthPixels - actionBarSize / 2; int y = actionBarSize / 2; return new Point(x, y); } }; mShowCase = new ShowcaseView.Builder(getActivity()) .setContentTitle(header) .setContentText(content) .setTarget(homeTarget) .build(); } public void OnCannotFileRead(File file) { } public void OnFileClicked(File file) { // Sanity-check; is this tunable already added? for (int i = 0; i < mMiscCat.getPreferenceCount(); i++) { if (file.toString().contains(mMiscCat.getPreference(i).getTitle().toString())) { Toast.makeText(mContext, "This tunable was already added!", Toast.LENGTH_LONG).show(); mFileDialog.dismiss(); return; } } mHandler.genPrefFromSingleFile(file.toString()); String[] array = file.toString().split("/"); String paraName = ""; int i = 0; for (String a : array) { if (array.length - 1 == i) paraName = a; i++; } mMiscSettings.edit().putString(file.toString(), paraName).commit(); root.addPreference(mMiscCat); mFileDialog.dismiss(); } /* * Basically inits everything and maps data; */ private void initMisc() { final Map<String,?> keys = mMiscSettings.getAll(); int i = 0; if (mMiscCat == null) { mMiscCat = new PreferenceCategory(mContext); mMiscCat.setTitle(R.string.pref_misc_your_settings); root.addPreference(mMiscCat); mHandler = new PreferenceHandler(mContext, mMiscCat, getPreferenceManager()); // Load our saved data; for (final Map.Entry<String,?> entry : keys.entrySet()) { String key = entry.getKey(); mHandler.genPrefFromSingleFile(key); i++; } } else { root.addPreference(mMiscCat); } if (mHandler == null) { mHandler = new PreferenceHandler(mContext, mMiscCat, getPreferenceManager()); } // Remove the category if nothing is left; if (mMiscCat.getPreferenceCount() == 0) { root.removePreference(mMiscCat); } } private void loadParalist() { mParaList = new ArrayList<String>(); mNameList = new ArrayList<String>(); mNameList.add("vtg_level"); mParaList.add(FilePath.MISC_VIBRATOR_CONTROL); mNameList.add("amp"); mParaList.add(FilePath.MISC_VIBRATOR_CONTROL); mNameList.add("temp_threshold"); mParaList.add(FilePath.MISC_THERMAL_CONTROL); mNameList.add("volume_boost"); mParaList.add(FilePath.MISC_HEADSET_VOLUME_BOOST); setHasOptionsMenu(true); } public void loadSettings() { // If there are already some entries, kill them all (with fire) if (PrefCat != null) root.removePreference(PrefCat); final CustomListPreference tcpPreference = new CustomListPreference(mContext); PrefCat = new PreferenceCategory(mContext); PrefCat.setTitle(R.string.pref_misc_settings); root.addPreference(PrefCat); initMisc(); try { PreferenceHandler h = new PreferenceHandler(mContext, PrefCat, getPreferenceManager()); h.genPrefFromFiles(mNameList.toArray(new String[0]), mParaList.toArray(new String[0]), false); } catch (NullPointerException e) { Log.e("Aero", "I couldn't get any files!", e); } // Needed for set-on-boot; tcpPreference.setName("tcp_congestion"); tcpPreference.setTitle(R.string.pref_misc_tcp_congestion); tcpPreference.setDialogTitle(R.string.pref_misc_tcp_congestion); tcpPreference.setSummary(AeroActivity.shell.getInfo(FilePath.MISC_TCP_CONGESTION_CURRENT)); tcpPreference.setValue(AeroActivity.shell.getInfo(FilePath.MISC_TCP_CONGESTION_CURRENT)); tcpPreference.setEntries(AeroActivity.shell.getInfoArray(FilePath.MISC_TCP_CONGESTION_AVAILABLE, 0, 0)); tcpPreference.setEntryValues(AeroActivity.shell.getInfoArray(FilePath.MISC_TCP_CONGESTION_AVAILABLE, 0, 0)); if (AeroActivity.genHelper.doesExist(FilePath.MISC_TCP_CONGESTION_AVAILABLE)) PrefCat.addPreference(tcpPreference); tcpPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object o) { String a = (String) o; AeroActivity.shell.setRootInfo(a, FilePath.MISC_TCP_CONGESTION_CURRENT); tcpPreference.setSummary(a); return true; } }); } }