content: package edu.berkeley.cs.amplab.carat.android.fragments;
  
  import android.content.Context;
  import android.content.Intent;
  import android.content.SharedPreferences;
  import android.os.Bundle;
  import android.preference.Preference;
  import android.preference.PreferenceManager;
  //important: the following import command imports the class from a library project, not from android.preference.PreferenceFragment
  import android.support.v4.preference.PreferenceFragment;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import edu.berkeley.cs.amplab.carat.android.CaratApplication;
  import edu.berkeley.cs.amplab.carat.android.Constants;
  import edu.berkeley.cs.amplab.carat.android.MainActivity;
  import edu.berkeley.cs.amplab.carat.android.R;
  import edu.berkeley.cs.amplab.carat.android.sampling.SamplingLibrary;
  import edu.berkeley.cs.amplab.carat.android.utils.Tracker;
  
  
  public class CaratSettingsFragment extends PreferenceFragment {
  	
  	Tracker tracker = null;
  
  	@Override
  	public void onCreate(Bundle savedInstanceState) {
  		super.onCreate(savedInstanceState);
  
  		/*
  		 * Using a PreferenceFragment and its addPreferencesFromResource() method is a convenient way to create a 
  		 * preference/settings fragment. 
  		 * The addPreferencesFromResource() method of the PreferenceFragment class does all of the hard work for us: 
  		 * it reads the values from our defaultSharedPreferences, 
  		 * inflates a ListView as our fragment's root view, 
  		 * then inside the getView() method of an ArrayAdapter it creates and attaches to our ListView,
  		 * it inflates each individual Preference widget we have in our specified xml file (whose resource ID we pass as an argument to this method),
  		 * sets the values of those inflated view objects to the values just read from our defaultSharedPreferences,
  		 * adds those inflated view objects to our rootView (ListView view object) using the mentioned adapter, 
  		 * and sets the resulting view as our fragment's view.
  		 * 
  		 * In addition, whenever the value of a preference widget changes in our PreferenceFragment's inflated view, 
  		 * the PreferenceFragment updates the value of the corresponding (tied) item in our defaultSharedPreferences
  		 * (if the item doesn't exist in there, PreferenceFragment creates an item with this key and sets its value to the just read value from the view/widget)
  		 * 
  		 * sets them to the last value of each corresponding preference (in the
  		 * XML file). basically it loads the preferences from an XML resource
  		 */
  		
  		addPreferencesFromResource(R.xml.preferences);
  
  		/*
  		 * Both of the "Switch" Preference widget (view) and the "PreferenceFragment" classes can only be used in Android 3.0+.
  		 * We use two external libraries to backport these handy classes (provide them for Android version < 3.0):
  		 * 1. The "switch widget backport" library, check out the readme: https://github.com/BoD/android-switch-backport
  		 * 2. The "android support preferencefragment" (check out the readme in the library's directory)
  		 */
  		
  		// we use the tracker in the following two methods, so instantiate it here
  		tracker = Tracker.getInstance();
  		
  		setSharePreferenceIntent();
  		setFeedbackPreferenceIntent();
  	}
  	
  	@Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
          View cr = super.onCreateView(inflater, container, savedInstanceState);
          cr.setBackgroundColor(getResources().getColor(android.R.color.background_light));
          return cr;
      }
  
  	/**
  	 * Set an intent for our "share" preference widget
  	 */
  	private void setSharePreferenceIntent() {
  		// grab a reference to our Preference widget object (Preference is a subclass of View). 
  		// (we have several preference widget objects in our res/xml/preferences.xml), 
  		// the name of the preference object we are trying to grab here is specified in CaratApplication.SHARE_PREFERENCE_KEY. 
  		// each preference widget in our xml file (preferences.xml) corresponds to an item/entry in our preference fragment's view		
  		Preference preference = findPreference(Constants.SHARE_PREFERENCE_KEY);
  		
  		// create an intent that we want to perform whenever this item is clicked (in this case, a send intent)
  		Intent intent = new Intent(Intent.ACTION_SEND);
  		intent.setType("text/plain");
  		int jscore = CaratApplication.getJscore();
  		intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.myjscoreis) + " " + jscore);
  		intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.sharetext1) + " " + jscore
  				+ getString(R.string.sharetext2));
  		
  		// set the created intent as our preference (view) object's intent
  		preference.setIntent(intent);
  		
  		tracker.trackSharing();
  	}
  
  	
  	/**
  	 * Set an intent for our "share" preference widget
  	 */
  	private void setFeedbackPreferenceIntent() {
  		Preference preference = findPreference(Constants.FEEDBACK_PREFERENCE_KEY);
  		
  		Intent intent = new Intent(Intent.ACTION_SEND);
  		
  		MainActivity mainActivity = CaratApplication.getMainActivity();
  		Context context = mainActivity.getApplicationContext();
  		SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
  		
  		String os = SamplingLibrary.getOsVersion();
  		String model = SamplingLibrary.getModel();
  		String uuId = defaultSharedPreferences.getString(CaratApplication.getRegisteredUuid(), "UNKNOWN");
  		int jscore = CaratApplication.getJscore();
  		
  		// Emulator does not support message/rfc822
  		if (model.equals("sdk"))
  			intent.setType("text/plain");
  		else
  			intent.setType("message/rfc822");
  		intent.putExtra(Intent.EXTRA_EMAIL, new String[] { "carat@cs.helsinki.fi" });
  		intent.putExtra(Intent.EXTRA_SUBJECT, "[carat] [Android] " + getString(R.string.feedbackfrom) + " "
  				+ model);
  		intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.os) + ": " + os + "\n"
  				+ getString(R.string.model) + ": " + model + "\nCarat ID: " + uuId + "\nJ-Score: " + jscore + "\n"
  				+ mainActivity.getFullVersion() + "\n");
  		
  		preference.setIntent(intent);
  		
  		tracker.trackFeedback(os, model);
  	}
  
  	@Override
  	public void onResume() {
  		getActivity().setTitle(getTag());
  		super.onResume();
  	}
  	
  	
  	/**
  	 * If you would like to do something FURTHER than changing "wifiOnly" preference value, do it in this listener.
  	 * 
  	 * Note 1: preferences value DO change automatically, no need for manual action.
  	 * (when we use a preference widget in an xml preference file (res/xml/*.xml))
  	 * 
  	 * Note 2: if you fill in this listener, do not forget to set it as our preference widget's listener, like this:
  	 * findPreference(CaratApplication.WIFI_ONLY_PREFERENCE_KEY).setOnPreferenceChangeListener(mOnPreferenceChangeListener);
  	 * (using Preference.setOnPreferenceChangeListener(listener))
  	 * (attach the listener in onCreate() method of the current fragment (which is a subclass of a specialized fragment, i.e. PreferenceFragment))
  	 */
  	/* private OnPreferenceChangeListener mOnPreferenceChangeListener = new OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object o) {
    	        Log.d("settings-fragment", "New value is: " + o.toString());
    	        // return true to update the state of the Preference with the new value.
    	        return true;
    	    }
        }; */
  
  	/**
       * This is a onCLICK listener method (rather than onCHANGE listener)
       * usually not needed, but leave it here just in case.
       * if you want to start an activity or open a custom dialog, this is not the correct way to go
       * See Preference.SetIntent() for example for starting an activity/intent
       * Or if your "extra" (the data you want to pass together with your intent) is merely some constants, 
       * see here for embedding your intent into your preference's xml element:
       * http://developer.android.com/guide/topics/ui/settings.html#Intents
       * If you want to display a custom dialog, see "Building a Custom Preference" in the above article.
       * There already are some ready-made dialogs (ListPreference, EditTextPreference, CheckBoxPreference), 
       * see the Preference class for a list of all other subclasses and their corresponding properties. 
       */
  	/* private OnPreferenceClickListener mOnPreferenceClickListener = new OnPreferenceClickListener() {
          @Override
          public boolean onPreferenceClick(Preference preference) {
  	        Log.d("settings-fragment", preference.getKey() + " was click");
  	        // return true to update the state of the Preference with the new value.
  	        return true;
  	    }
      }; */
  
  }