Java tutorial
package com.apps.anker.facepunchdroid; import android.Manifest; import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; import android.app.Instrumentation; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; import android.database.Cursor; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.provider.MediaStore; import android.provider.OpenableColumns; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentActivity; import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBar; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.preference.RingtonePreference; import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MenuItem; import android.support.v4.app.NavUtils; import android.webkit.WebView; import android.widget.Toast; import com.apps.anker.facepunchdroid.Tools.Language; import com.nbsp.materialfilepicker.MaterialFilePicker; import com.nbsp.materialfilepicker.ui.FilePickerActivity; import java.io.File; import java.io.FileNotFoundException; import java.net.URISyntaxException; import java.util.List; import java.util.Locale; import java.util.regex.Pattern; /** * A {@link PreferenceActivity} that presents a set of application settings. On * handset devices, settings are presented as a single list. On tablets, * settings are split by category, with category headers shown to the left of * the list of settings. * <p/> * See <a href="http://developer.android.com/design/patterns/settings.html"> * Android Design: Settings</a> for design guidelines and the <a * href="http://developer.android.com/guide/topics/ui/settings.html">Settings * API Guide</a> for more information on developing a Settings UI. */ public class SettingsActivity extends AppCompatPreferenceActivity { static Context mContext; /** * A preference value change listener that updates the preference's summary * to reflect its new value. */ private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object value) { String stringValue = value.toString(); Log.d("Pref change", preference.getKey()); if (preference instanceof ListPreference) { // For list preferences, look up the correct display value in // the preference's 'entries' list. ListPreference listPreference = (ListPreference) preference; int index = listPreference.findIndexOfValue(stringValue); // Set the summary to reflect the new value. preference.setSummary(index >= 0 ? listPreference.getEntries()[index] : null); } else if (preference instanceof RingtonePreference) { // For ringtone preferences, look up the correct display value // using RingtoneManager. if (TextUtils.isEmpty(stringValue)) { // Empty values correspond to 'silent' (no ringtone). preference.setSummary(R.string.pref_ringtone_silent); } else { Ringtone ringtone = RingtoneManager.getRingtone(preference.getContext(), Uri.parse(stringValue)); if (ringtone == null) { // Clear the summary if there was a lookup error. preference.setSummary(null); } else { // Set the summary to reflect the new ringtone display // name. String name = ringtone.getTitle(preference.getContext()); preference.setSummary(name); } } } else if (preference.getKey().equals("language")) { Log.d("LANG update", stringValue); } else { // For all other preferences, set the summary to the value's // simple string representation. preference.setSummary(stringValue); } return true; } }; /** * Helper method to determine if the device has an extra-large screen. For * example, 10" tablets are extra-large. */ private static boolean isXLargeTablet(Context context) { return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; } /** * Binds a preference's summary to its value. More specifically, when the * preference's value is changed, its summary (line of text below the * preference title) is updated to reflect the value. The summary is also * immediately updated upon calling this method. The exact display format is * dependent on the type of preference. * * @see #sBindPreferenceSummaryToValueListener */ private static void bindPreferenceSummaryToValue(Preference preference) { // Set the listener to watch for value changes. preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); // Trigger the listener immediately with the preference's // current value. sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, PreferenceManager .getDefaultSharedPreferences(preference.getContext()).getString(preference.getKey(), "")); } @Override protected void onCreate(Bundle savedInstanceState) { SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); Boolean enableDarkTheme = sharedPref.getBoolean("enable_dark_theme", false); Log.d("DarkTheme", String.valueOf(enableDarkTheme)); // Set dark theme if enabled dark mode if (enableDarkTheme) { super.setTheme(R.style.AppThemeSettingsDark); } // Update language String selectedLang = sharedPref.getString("language", "system"); Language.setLanguage(selectedLang, getResources()); super.onCreate(savedInstanceState); mContext = getApplicationContext(); setupActionBar(); } @Override protected void onResume() { SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); String selectedLang = sharedPref.getString("language", "system"); Language.setLanguage(selectedLang, getResources()); super.onResume(); } /** * Set up the {@link android.app.ActionBar}, if the API is available. */ private void setupActionBar() { ActionBar actionBar = getSupportActionBar(); actionBar.setTitle(R.string.title_activity_settings); if (actionBar != null) { // Show the Up button in the action bar. actionBar.setDisplayHomeAsUpEnabled(true); } } public void setActionBarTitle(String title) { getSupportActionBar().setTitle(title); } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { if (!super.onMenuItemSelected(featureId, item)) { NavUtils.navigateUpFromSameTask(this); } return true; } return super.onMenuItemSelected(featureId, item); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (event.getAction() == KeyEvent.ACTION_DOWN) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: NavUtils.navigateUpFromSameTask(this); return true; } } return super.onKeyDown(keyCode, event); } /** * {@inheritDoc} */ @Override public boolean onIsMultiPane() { return isXLargeTablet(this); } /** * {@inheritDoc} */ @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) public void onBuildHeaders(List<Header> target) { loadHeadersFromResource(R.xml.pref_headers, target); } /** * This method stops fragment injection in malicious applications. * Make sure to deny any unknown fragments here. */ protected boolean isValidFragment(String fragmentName) { return PreferenceFragment.class.getName().equals(fragmentName) || GeneralPreferenceFragment.class.getName().equals(fragmentName) || DataSyncPreferenceFragment.class.getName().equals(fragmentName) || NotificationPreferenceFragment.class.getName().equals(fragmentName) || StylePreferenceFragment.class.getName().equals(fragmentName) || AboutPreferenceFragment.class.getName().equals(fragmentName); } /** * This fragment shows general preferences only. It is used when the * activity is showing a two-pane settings UI. */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class GeneralPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(mContext); // Update language String selectedLang = sharedPref.getString("language", "system"); Language.setLanguage(selectedLang, getResources()); super.onCreate(savedInstanceState); ((SettingsActivity) getActivity()).setActionBarTitle(getString(R.string.pref_header_general)); addPreferencesFromResource(R.xml.pref_general); setHasOptionsMenu(true); // Bind the summaries of EditText/List/Dialog/Ringtone preferences // to their values. When their values change, their summaries are // updated to reflect the new value, per the Android Design // guidelines. final Preference startpage = findPreference("current_startpage"); bindPreferenceSummaryToValue(startpage); Preference reset = findPreference("reset_startpage"); reset.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @TargetApi(Build.VERSION_CODES.M) @Override public boolean onPreferenceClick(Preference preference) { SharedPreferences sharedPref = PreferenceManager .getDefaultSharedPreferences(getActivity().getApplicationContext()); SharedPreferences.Editor editor = sharedPref.edit(); editor.remove("current_startpage"); editor.apply(); startpage.setSummary("Default"); return true; } }); Preference language = findPreference("language"); language.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { Log.d("LANG UPDATE", newValue.toString()); Log.d("LANG UPDATE", Locale.getDefault().getLanguage()); // Update language Language.setLanguage(newValue.toString(), getResources()); Intent refresh = new Intent(getActivity(), SettingsActivity.class); startActivity(refresh); getActivity().finish(); return true; } }); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { startActivity(new Intent(getActivity(), SettingsActivity.class)); return true; } return super.onOptionsItemSelected(item); } } /** * This fragment shows general preferences only. It is used when the * activity is showing a two-pane settings UI. */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class StylePreferenceFragment extends PreferenceFragment { private SharedPreferences sharedPref; private Preference filePicker; @Override public void onCreate(Bundle savedInstanceState) { SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(mContext); // Update language String selectedLang = sharedPref.getString("language", "system"); Language.setLanguage(selectedLang, getResources()); super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_style); setHasOptionsMenu(true); sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); ((SettingsActivity) getActivity()).setActionBarTitle(getString(R.string.pref_header_styles)); filePicker = findPreference("custom_style_file"); filePicker.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @TargetApi(Build.VERSION_CODES.M) @Override public boolean onPreferenceClick(Preference preference) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[] { Manifest.permission.READ_EXTERNAL_STORAGE }, 2); } else { if (Build.VERSION.SDK_INT < 19) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType("*/*"); startActivityForResult(intent, 1); } else { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); startActivityForResult(intent, 1); } } return true; } }); // Bind the summaries of EditText/List/Dialog/Ringtone preferences // to their values. When their values change, their summaries are // updated to reflect the new value, per the Android Design // guidelines. } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { SharedPreferences sharedPref = PreferenceManager .getDefaultSharedPreferences(getActivity().getApplicationContext()); SharedPreferences.Editor editor = sharedPref.edit(); if (requestCode == 1) { if (resultCode == Activity.RESULT_OK) { // Get the Uri of the selected file Uri URL = Uri.parse(data.getData().getPath()); Log.d("File", data.getData().toString()); String CSS = null; try { CSS = customCSS.readFromSDcard(getActivity(), data.getData()); } catch (FileNotFoundException e) { e.printStackTrace(); } filePicker.setSummary(URL.getLastPathSegment()); Toast.makeText(getActivity(), "You might need to do a refresh to see the changes", Toast.LENGTH_LONG).show(); editor.putString("custom_style_file", CSS); editor.apply(); } if (resultCode == Activity.RESULT_CANCELED) { //Write your code if there's no result } } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case 2: { if (Build.VERSION.SDK_INT < 19) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType("*/*"); startActivityForResult(intent, 1); } else { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); startActivityForResult(intent, 1); } return; } } } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { startActivity(new Intent(getActivity(), SettingsActivity.class)); return true; } return super.onOptionsItemSelected(item); } } @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class AboutPreferenceFragment extends PreferenceFragment { private SharedPreferences sharedPref; private Preference licenseItem; @Override public void onCreate(Bundle savedInstanceState) { SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(mContext); // Update language String selectedLang = sharedPref.getString("language", "system"); Language.setLanguage(selectedLang, getResources()); super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_about); setHasOptionsMenu(true); sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); ((SettingsActivity) getActivity()).setActionBarTitle(getString(R.string.pref_header_about)); licenseItem = findPreference("license"); licenseItem.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @TargetApi(Build.VERSION_CODES.M) @Override public boolean onPreferenceClick(Preference preference) { WebView view = (WebView) LayoutInflater.from(getActivity()).inflate(R.layout.dialog_licenses, null); view.getSettings().getUseWideViewPort(); view.loadUrl("file:///android_asset/license.html"); AlertDialog mAlertDialog = new AlertDialog.Builder(getActivity(), R.style.Theme_AppCompat_Light_Dialog_Alert).setTitle("Licenses").setView(view) .setPositiveButton(android.R.string.ok, null).show(); return true; } }); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { startActivity(new Intent(getActivity(), SettingsActivity.class)); return true; } return super.onOptionsItemSelected(item); } } /** * This fragment shows notification preferences only. It is used when the * activity is showing a two-pane settings UI. */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class NotificationPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_notification); setHasOptionsMenu(true); // Bind the summaries of EditText/List/Dialog/Ringtone preferences // to their values. When their values change, their summaries are // updated to reflect the new value, per the Android Design // guidelines. bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone")); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { startActivity(new Intent(getActivity(), SettingsActivity.class)); return true; } return super.onOptionsItemSelected(item); } } /** * This fragment shows data and sync preferences only. It is used when the * activity is showing a two-pane settings UI. */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class DataSyncPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_data_sync); setHasOptionsMenu(true); // Bind the summaries of EditText/List/Dialog/Ringtone preferences // to their values. When their values change, their summaries are // updated to reflect the new value, per the Android Design // guidelines. bindPreferenceSummaryToValue(findPreference("sync_frequency")); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { startActivity(new Intent(getActivity(), SettingsActivity.class)); return true; } return super.onOptionsItemSelected(item); } } }