package de.robv.android.xposed.installer; import android.Manifest; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceFragment; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v7.app.ActionBar; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Toast; import com.afollestad.materialdialogs.folderselector.FolderChooserDialog; import java.io.File; import java.io.IOException; import de.robv.android.xposed.installer.util.RepoLoader; import de.robv.android.xposed.installer.util.ThemeUtil; public class SettingsActivity extends XposedBaseActivity implements FolderChooserDialog.FolderCallback { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ThemeUtil.setTheme(this); setContentView(R.layout.activity_container); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); } }); ActionBar ab = getSupportActionBar(); if (ab != null) { ab.setTitle(R.string.nav_item_settings); ab.setDisplayHomeAsUpEnabled(true); } setFloating(toolbar, 0); if (savedInstanceState == null) { getFragmentManager().beginTransaction() .add(R.id.container, new SettingsFragment()).commit(); } } @Override public void onFolderSelection(@NonNull FolderChooserDialog dialog, @NonNull File folder) { if (folder.canWrite()) { XposedApp.getPreferences().edit().putString("download_location", folder.getPath()).apply(); } else { Toast.makeText(this, R.string.sdcard_not_writable, Toast.LENGTH_SHORT).show(); } } public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener, Preference.OnPreferenceClickListener { private static final File mDisableResourcesFlag = new File(XposedApp.BASE_DIR + "conf/disable_resources"); private Preference mClickedPreference; private Preference downloadLocation; public SettingsFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.prefs); findPreference("release_type_global").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { RepoLoader.getInstance().setReleaseTypeGlobal((String) newValue); return true; } }); CheckBoxPreference prefDisableResources = (CheckBoxPreference) findPreference("disable_resources"); prefDisableResources.setChecked(mDisableResourcesFlag.exists()); prefDisableResources.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { boolean enabled = (Boolean) newValue; if (enabled) { try { //noinspection ResultOfMethodCallIgnored mDisableResourcesFlag.createNewFile(); } catch (IOException e) { Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show(); } } else { //noinspection ResultOfMethodCallIgnored mDisableResourcesFlag.delete(); } return (enabled == mDisableResourcesFlag.exists()); } }); // TODO maybe enable again after checking the implementation //downloadLocation = findPreference("download_location"); //downloadLocation.setOnPreferenceClickListener(this); } @Override public void onResume() { super.onResume(); getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override public void onPause() { super.onPause(); getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (key.equals("theme")) getActivity().recreate(); } @Override public boolean onPreferenceClick(Preference preference) { if (preference.getKey().equals(downloadLocation.getKey())) { if (checkPermissions()) { mClickedPreference = downloadLocation; return false; } new FolderChooserDialog.Builder((SettingsActivity) getActivity()) .cancelButton(android.R.string.cancel) .initialPath(XposedApp.getDownloadPath()) .show(); } return true; } private boolean checkPermissions() { if (Build.VERSION.SDK_INT < 23) return false; if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); return true; } return false; } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (mClickedPreference != null) { new android.os.Handler().postDelayed(new Runnable() { @Override public void run() { onPreferenceClick(mClickedPreference); } }, 500); } } else { Toast.makeText(getActivity(), R.string.permissionNotGranted, Toast.LENGTH_LONG).show(); } } } }