Java tutorial
package cn.studyjams.s1.contest.autohello; import android.annotation.TargetApi; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.preference.RingtonePreference; import android.support.design.widget.Snackbar; import android.support.v4.app.NavUtils; import android.support.v7.app.ActionBar; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.widget.EditText; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.UUID; import cn.studyjams.s1.contest.autohello.model.Feedback; /** * 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 { private final static String TAG = "SettingsActivity"; private static DatabaseReference mDatabaseRef; private static FirebaseUser user; /** * 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(); 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 { // For all other preferences, set the summary to the value's // simple string representation. preference.setSummary(stringValue); } return true; } }; /** * 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) { super.onCreate(savedInstanceState); setupActionBar(); user = FirebaseAuth.getInstance().getCurrentUser(); if (user != null) { mDatabaseRef = FirebaseDatabase.getInstance().getReference().child("feedback").child(user.getUid()) .child(UUID.randomUUID().toString()); } } /** * Set up the {@link android.app.ActionBar}, if the API is available. */ private void setupActionBar() { ViewGroup rootView = (ViewGroup) findViewById(R.id.action_bar_root); //id from appcompat if (rootView != null) { View view = getLayoutInflater().inflate(R.layout.settings_toolbar, rootView, false); rootView.addView(view, 0); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); } ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { // Show the Up button in the action bar. actionBar.setDisplayHomeAsUpEnabled(true); } } @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); } /** * {@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) || DangerPreferenceFragment.class.getName().equals(fragmentName) || NotificationPreferenceFragment.class.getName().equals(fragmentName) || AboutPreferenceFragment.class.getName().equals(fragmentName) || QAPreferenceFragment.class.getName().equals(fragmentName); } @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class DangerPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_danger); 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("example_text")); // bindPreferenceSummaryToValue(findPreference("example_list")); } @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 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); } } @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class AboutPreferenceFragment extends PreferenceFragment implements Preference.OnPreferenceClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_about); setHasOptionsMenu(true); findPreference("terms_of_use").setOnPreferenceClickListener(this); findPreference("privacy_policy").setOnPreferenceClickListener(this); findPreference("licenses").setOnPreferenceClickListener(this); } @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); } @Override public boolean onPreferenceClick(Preference preference) { View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_webview, null); WebView wv = (WebView) view.findViewById(R.id.qa_web); wv.setWebChromeClient(new WebChromeClient()); String title = ""; if (preference.getKey().equals("terms_of_use")) { wv.loadUrl("https://autohello-44b3d.firebaseapp.com/terms.html"); title = getString(R.string.pref_title_terms_of_use); } if (preference.getKey().equals("privacy_policy")) { wv.loadUrl("https://autohello-44b3d.firebaseapp.com/privacy.html"); title = getString(R.string.pref_title_privacy_policy); } if (preference.getKey().equals("licenses")) { wv.loadUrl("https://autohello-44b3d.firebaseapp.com/licenses.html"); title = getString(R.string.pref_title_licenses); } AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()).setView(view).setTitle(title) .setCancelable(true).setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int i) { dialog.dismiss(); } }); builder.show(); return true; } } @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class QAPreferenceFragment extends PreferenceFragment implements Preference.OnPreferenceClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_qa); setHasOptionsMenu(true); findPreference("qa").setOnPreferenceClickListener(this); findPreference("feedback").setOnPreferenceClickListener(this); } @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); } @Override public boolean onPreferenceClick(Preference preference) { if (preference.getKey().equals("qa")) { Log.d(TAG, "qa"); View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_webview, null); WebView wv = (WebView) view.findViewById(R.id.qa_web); wv.loadUrl("https://autohello-44b3d.firebaseapp.com/qa.html"); wv.setWebChromeClient(new WebChromeClient()); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()).setView(view) .setTitle(getString(R.string.pref_title_qa)).setCancelable(true) .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int i) { dialog.dismiss(); } }); builder.show(); } if (preference.getKey().equals("feedback")) { Log.d(TAG, "feedback"); final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_feedback, null); final EditText content = (EditText) view.findViewById(R.id.feedback_edittext); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()).setView(view) .setTitle(getString(R.string.pref_title_feedback)) .setPositiveButton(R.string.done, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int i) { if (TextUtils.isEmpty(content.getText().toString())) { Log.d(TAG, "empty"); } else { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()); if (user != null && mDatabaseRef != null) { Feedback feedback = new Feedback(user.getUid(), user.getDisplayName(), user.getEmail(), content.getText().toString(), sdf.format(new Date()), "", ""); mDatabaseRef.setValue(feedback) .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { Snackbar.make(view, getString(R.string.feedback_success), Snackbar.LENGTH_LONG).show(); } }); } else { Snackbar.make(view, getString(R.string.feedback_fail), Snackbar.LENGTH_LONG) .show(); } Log.d(TAG, content.getText().toString()); } } }); builder.show(); } return true; } } }