Эх сурвалжийг харах

Started working on the "Where is my device?" feature

Lennart Rosam 13 жил өмнө
parent
commit
6e43d84b17

+ 15 - 0
AndroidManifest.xml

@@ -12,6 +12,7 @@
     <uses-permission android:name="android.permission.READ_SYNC_STATS" />
     <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
     <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 
     <uses-sdk
         android:minSdkVersion="7"
@@ -113,6 +114,20 @@
 
         <service android:name=".FileDownloader" >
         </service>
+        
+        <service android:name=".location.LocationUpdateService">
+            <intent-filter>
+				<action android:name="eu.alefzero.owncloud.location.LocationUpdateService" />
+			</intent-filter>
+        </service>
+        
+        <receiver android:name=".location.LocationServiceLauncherReciever">
+			<intent-filter>
+				<action android:name="android.intent.action.BOOT_COMPLETED" />
+				<action android:name="eu.alefzero.owncloud.location.LocationLauncher" />
+				<category android:name="android.intent.category.HOME" />
+			</intent-filter>
+		</receiver>
 
         <activity android:name=".ui.activity.FileDetailActivity" 
             android:theme="@style/Theme.ownCloud">

+ 22 - 1
res/values/strings.xml

@@ -14,12 +14,20 @@
     <string name="main_settings">Settings</string>
     <string name="main_tit_accsetup">Account Setup</string>
     <string name="main_wrn_accsetup">There are no ownCloud accounts on your device. In order to use this App, you need to create one.</string>
-    <string name="prefs_general">General</string>
+    
+    <string name="prefs_category_general">General</string>
+    <string name="prefs_category_trackmydevice">Device tracking</string>
     <string name="prefs_sessions">Stored sessions</string>
     <string name="prefs_add_session">Add new session</string>
     <string name="prefs_create_img_thumbnails">Create image thumbnails</string>
     <string name="prefs_select_oc_account">Select an account</string>
     <string name="prefs_summary_select_oc_account">Choose, which of your accounts the app should use.</string>
+    <string name="prefs_trackmydevice">Device tracking</string>
+    <string name="prefs_trackmydevice_summary_off">Enable ownCloud to track your device location</string>
+    <string name="prefs_trackmydevice_summary_on">Your ownCloud keeps track of this device</string>
+    <string name="prefs_trackmydevice_interval">Update intervall</string>
+    <string name="prefs_trackmydevice_interval_summary">Update every %1$s minutes</string>
+    
     <string name="new_session_id">Session Name</string>
     <string name="new_session_url">URL</string>
     <string name="new_session_username">Username</string>
@@ -52,4 +60,17 @@
     <string name="common_choose_account">Choose account</string>
     <string name="sync_string_contacts">Contacts</string>
     <string name="use_ssl">Use Secure Connection</string>
+    <string name="location_no_provider">ownCloud cannot track your device. Please check your location settings</string>
+    
+    <string-array name="prefs_trackmydevice_intervall_keys">
+    	<item>15 Minutes</item>
+    	<item>30 Minutes</item>
+    	<item>60 Minutes</item>
+	</string-array>
+	
+    <string-array name="prefs_trackmydevice_intervall_values">
+    	<item>15</item>
+    	<item>30</item>
+    	<item>60</item>
+	</string-array>
 </resources>

+ 22 - 2
res/xml/preferences.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <CheckBoxPreference
+	<PreferenceCategory android:title="@string/prefs_category_general">
+	    <CheckBoxPreference
         android:key="create_thumbnails"
         android:title="@string/prefs_create_img_thumbnails" 
         />
@@ -11,5 +11,25 @@
         android:title="@string/prefs_select_oc_account"
         android:summary="@string/prefs_summary_select_oc_account" 
         />
+	</PreferenceCategory>
+	
+	<PreferenceCategory android:title="@string/prefs_category_trackmydevice">
+	    <CheckBoxPreference 
+	        android:key="enable_devicetracking"
+	        android:title="@string/prefs_trackmydevice"
+	        android:summaryOff="@string/prefs_trackmydevice_summary_off"
+	        android:summaryOn="@string/prefs_trackmydevice_summary_on"
+	        android:defaultValue="true"/>
+	    
+	    <ListPreference 
+	        android:key="devicetracking_update_intervall"
+	        android:title="@string/prefs_trackmydevice_interval"
+	        android:summary="@string/prefs_trackmydevice_interval_summary"
+	        android:entries="@array/prefs_trackmydevice_intervall_keys"
+	        android:entryValues="@array/prefs_trackmydevice_intervall_values"
+	        android:defaultValue="30"
+	        android:dependency="enable_devicetracking"/>
+	</PreferenceCategory>
+    
 
 </PreferenceScreen>

+ 83 - 0
src/eu/alefzero/owncloud/location/LocationServiceLauncherReciever.java

@@ -0,0 +1,83 @@
+/* ownCloud Android client application
+ *   Copyright (C) 2011  Bartek Przybylski
+ *
+ *   This program is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package eu.alefzero.owncloud.location;
+
+import android.app.ActivityManager;
+import android.app.ActivityManager.RunningServiceInfo;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+import android.util.Log;
+
+public class LocationServiceLauncherReciever extends BroadcastReceiver {
+
+	private final String TAG = getClass().getSimpleName();
+	
+	@Override
+	public void onReceive(Context context, Intent intent) {
+		Intent deviceTrackingIntent = new Intent();
+		deviceTrackingIntent.setAction("eu.alefzero.owncloud.location.LocationUpdateService");
+		SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
+		boolean trackDevice = preferences.getBoolean("enable_devicetracking", true);
+		
+		// Used in Preferences activity so that tracking is disabled or reenabled
+		if(intent.hasExtra("TRACKING_SETTING")){
+			trackDevice = intent.getBooleanExtra("TRACKING_SETTING", true);
+		}
+		
+		startOrStopDeviceTracking(context, trackDevice);
+	}
+	
+	/**
+	 * Used internally. Starts or stops the device tracking service
+	 * 
+	 * @param trackDevice
+	 *            true to start the service, false to stop it
+	 */
+	private void startOrStopDeviceTracking(Context context, boolean trackDevice) {
+		Intent deviceTrackingIntent = new Intent();
+		deviceTrackingIntent
+				.setAction("eu.alefzero.owncloud.location.LocationUpdateService");
+		if (!isDeviceTrackingServiceRunning(context) && trackDevice) {
+			Log.d(TAG, "Starting device tracker service");
+			context.startService(deviceTrackingIntent);
+		} else if (isDeviceTrackingServiceRunning(context) && !trackDevice) {
+			Log.d(TAG, "Stopping device tracker service");
+			context.stopService(deviceTrackingIntent);
+		}
+	}
+	
+	/**
+	 * Checks to see whether or not the LocationUpdateService is running
+	 * 
+	 * @return true, if it is. Otherwise false
+	 */
+	private boolean isDeviceTrackingServiceRunning(Context context) {
+		ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+		for (RunningServiceInfo service : manager
+				.getRunningServices(Integer.MAX_VALUE)) {
+			if (getClass().getName().equals(service.service.getClassName())) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+}

+ 102 - 0
src/eu/alefzero/owncloud/location/LocationUpdateService.java

@@ -0,0 +1,102 @@
+/* ownCloud Android client application
+ *   Copyright (C) 2011  Bartek Przybylski
+ *
+ *   This program is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package eu.alefzero.owncloud.location;
+
+import android.app.IntentService;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.location.Criteria;
+import android.location.Location;
+import android.location.LocationListener;
+import android.location.LocationManager;
+import android.location.LocationProvider;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.util.Log;
+import android.widget.Toast;
+
+public class LocationUpdateService extends IntentService implements LocationListener {
+
+	public static final String TAG = "LocationUpdateService";
+	
+	private LocationManager mLocationManager;
+	private LocationProvider mLocationProvider;
+	private SharedPreferences mPreferences;
+	
+	public LocationUpdateService() {
+		super(TAG);
+	}
+
+	@Override
+	protected void onHandleIntent(Intent intent) {
+		mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
+		// Determine, how we can track the device
+		Criteria criteria = new Criteria();
+		criteria.setAccuracy(Criteria.ACCURACY_FINE);
+		criteria.setPowerRequirement(Criteria.POWER_LOW);
+		mLocationProvider = mLocationManager.getProvider(mLocationManager.getBestProvider(criteria, true));
+		
+		// Notify user if there is no way to track the device
+		if(mLocationProvider == null){
+			Toast.makeText(this, eu.alefzero.owncloud.R.string.location_no_provider, Toast.LENGTH_LONG);
+			stopSelf();
+			return;
+		}
+		
+		// Get preferences for device tracking
+		mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
+		boolean trackDevice = mPreferences.getBoolean("enable_devicetracking", true);
+		int updateIntervall = Integer.parseInt(mPreferences.getString("devicetracking_update_intervall", "30")) * 60 * 1000;
+		int distanceBetweenLocationChecks = 50;
+		
+		// If we do shall track the device -> Stop
+		if(!trackDevice){
+			Log.d(TAG, "Devicetracking is disabled");
+			stopSelf();
+			return;
+		}
+		
+		mLocationManager.requestLocationUpdates(mLocationProvider.getName(), updateIntervall, distanceBetweenLocationChecks, this);
+	}
+
+	@Override
+	public void onLocationChanged(Location location) {
+		Log.d(TAG, "Location changed: " + location);
+		
+	}
+
+	@Override
+	public void onProviderDisabled(String arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onProviderEnabled(String arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
+		// TODO Auto-generated method stub
+		
+	}
+
+
+}

+ 5 - 0
src/eu/alefzero/owncloud/ui/activity/LandingActivity.java

@@ -58,6 +58,11 @@ public class LandingActivity extends SherlockFragmentActivity implements OnClick
 		// Check, if there are ownCloud accounts
 		if(!accountsAreSetup()){
 			showDialog(DIALOG_SETUP_ACCOUNT);
+		} else {
+			// Start device tracking service 
+			Intent locationServiceIntent = new Intent();
+			locationServiceIntent.setAction("eu.alefzero.owncloud.location.LocationLauncher");
+			sendBroadcast(locationServiceIntent);
 		}
 
 	}

+ 209 - 165
src/eu/alefzero/owncloud/ui/activity/Preferences.java

@@ -26,6 +26,7 @@ import android.accounts.AccountManager;
 import android.app.Activity;
 import android.content.Intent;
 import android.os.Bundle;
+import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceChangeListener;
@@ -50,172 +51,215 @@ import eu.alefzero.owncloud.db.DbHandler;
 
 /**
  * An Activity that allows the user to change the application's settings.
+ * 
  * @author Bartek Przybylski
- *
- */
-public class Preferences extends SherlockPreferenceActivity implements OnPreferenceChangeListener {
-  private static final String TAG = "OwnCloudPreferences";
-  private final int mNewSession = 47;
-  private final int mEditSession = 48;
-  private DbHandler mDbHandler;
-  private Vector<OwnCloudSession> mSessions;
-  private Account[] mAccounts;
-  private ListPreference mAccountList;
-  private int mSelectedMenuItem;
-  
-  @Override
-  public void onCreate(Bundle savedInstanceState){
-    super.onCreate(savedInstanceState);
-    mDbHandler = new DbHandler(getBaseContext());
-    mSessions = new Vector<OwnCloudSession>();
-    addPreferencesFromResource(R.xml.preferences);
-    registerForContextMenu(getListView());
-    populateAccountList();
-    ActionBar actionBar = getSherlock().getActionBar();
-    actionBar.setDisplayHomeAsUpEnabled(true);
-    //populateSessionList();
-  }
-  
-  private void populateSessionList() {
-    mSessions.clear();
-    mSessions = mDbHandler.getSessionList();
-    PreferenceScreen ps = getPreferenceScreen();
-    ps.removeAll();
-    addPreferencesFromResource(R.xml.preferences);
-    for (int i = 0; i < mSessions.size(); i++) {
-      Preference preference = new Preference(getBaseContext());
-      preference.setTitle(mSessions.get(i).getName());
-      URI uri;
-      try {
-        uri = new URI(mSessions.get(i).getUrl());
-      } catch (URISyntaxException e) {
-        e.printStackTrace(); // should never happen
-        continue;
-      }
-      preference.setSummary(uri.getScheme() + "://" + uri.getHost()+uri.getPath());
-      ps.addPreference(preference);
-    }
-  }
-  
-  /**
-   * Populates the account selector
-   */
-  private void populateAccountList(){
-	  AccountManager accMan = AccountManager.get(this);
-	  mAccounts = accMan.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);
-	  mAccountList = (ListPreference) findPreference("select_oc_account");
-	  mAccountList.setOnPreferenceChangeListener(this);
-	  
-	  // Display the name of the current account if there is any
-	  Account defaultAccount = AuthUtils.getCurrentOwnCloudAccount(this);
-	  if(defaultAccount != null){
-		  mAccountList.setSummary(defaultAccount.name);
-	  }
-	  
-	  // Transform accounts into array of string for preferences to use
-	  String[] accNames = new String[mAccounts.length];
-	  for(int i = 0; i < mAccounts.length; i++){
-		  Account account = mAccounts[i];
-		  accNames[i] = account.name;
-	  }
-	  
-	  mAccountList.setEntries(accNames);
-	  mAccountList.setEntryValues(accNames);
-  }
-
-  @Override
-  public boolean onCreateOptionsMenu(Menu menu) {
-    super.onCreateOptionsMenu(menu);
-    MenuInflater inflater = getSherlock().getMenuInflater();
-    inflater.inflate(R.menu.prefs_menu, menu);
-    return true;
-  }
-  
-  @Override
-  public boolean onMenuItemSelected(int featureId, MenuItem item) {
-    super.onMenuItemSelected(featureId, item);
-    Intent intent;
-    
-    switch (item.getItemId()) {
-      case R.id.addSessionItem:
-        intent = new Intent(this, PreferencesNewSession.class);
-        startActivityForResult(intent, mNewSession);
-        break;
-      case R.id.SessionContextEdit:
-        intent = new Intent(this, PreferencesNewSession.class);
-        intent.putExtra("sessionId", mSessions.get(mSelectedMenuItem).getEntryId());
-        intent.putExtra("sessionName", mSessions.get(mSelectedMenuItem).getName());
-        intent.putExtra("sessionURL", mSessions.get(mSelectedMenuItem).getUrl());
-        startActivityForResult(intent, mEditSession);
-        break;
-      case R.id.SessionContextRemove:
-        OwnCloudSession ocs = mSessions.get(mSelectedMenuItem);
-        mDbHandler.removeSessionWithId(ocs.getEntryId());
-        mSessions.remove(ocs);
-        getPreferenceScreen().removePreference(getPreferenceScreen().getPreference(mSelectedMenuItem+1));
-        break;
-      case android.R.id.home:
-    	  intent = new Intent(getBaseContext(), LandingActivity.class);
-    	  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-    	  startActivity(intent);
-    	  break;
-      default:
-        Log.w(TAG, "Unknown menu item triggered");
-        return false;
-    }
-    return true;
-  }
-
-  @Override
-  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-    super.onActivityResult(requestCode, resultCode, data);
-    if (resultCode == Activity.RESULT_OK) {
-      switch (requestCode) {
-        case mNewSession:
-          mDbHandler.addSession(data.getStringExtra("sessionName"), 
-                                data.getStringExtra("sessionURL"));
-          getPreferenceScreen().removeAll();
-          addPreferencesFromResource(R.xml.preferences);
-          populateSessionList();
-          break;
-        case mEditSession:
-          mDbHandler.changeSessionFields(data.getIntExtra("sessionId", -1),
-                                         data.getStringExtra("sessionName"),
-                                         data.getStringExtra("sessionURL"));
-          populateSessionList();
-          break;
-      }
-    }
-  }
-
-  @Override
-  public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
-    super.onCreateContextMenu(menu, v, menuInfo);
-    AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
-    mSelectedMenuItem = info.position-1;
-    menu.setHeaderTitle(mSessions.get(mSelectedMenuItem).getName());
-    
-    MenuInflater inflater = getSherlock().getMenuInflater();
-    inflater.inflate(R.menu.session_context_menu, (Menu) menu);
-    
-  }
-  
-  @Override
-  protected void onDestroy() {
-    mDbHandler.close();
-    super.onDestroy();
-  }
-
-@Override
-/**
- * Updates the summary of the account selector after a new account has 
- * been selected
+ * 
  */
-public boolean onPreferenceChange(Preference preference, Object newValue) {
-	if(preference.equals(mAccountList)) {
-		mAccountList.setSummary(newValue.toString());
+public class Preferences extends SherlockPreferenceActivity implements
+		OnPreferenceChangeListener {
+	private static final String TAG = "OwnCloudPreferences";
+	private final int mNewSession = 47;
+	private final int mEditSession = 48;
+	private DbHandler mDbHandler;
+	private Vector<OwnCloudSession> mSessions;
+	private Account[] mAccounts;
+	private ListPreference mAccountList;
+	private ListPreference mTrackingUpdateInterval;
+	private CheckBoxPreference mDeviceTracking;
+	private int mSelectedMenuItem;
+
+	@Override
+	public void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		mDbHandler = new DbHandler(getBaseContext());
+		mSessions = new Vector<OwnCloudSession>();
+		addPreferencesFromResource(R.xml.preferences);
+		registerForContextMenu(getListView());
+		populateAccountList();
+		ActionBar actionBar = getSherlock().getActionBar();
+		actionBar.setDisplayHomeAsUpEnabled(true);
+
+		// Update summary for device tracking preference
+		mTrackingUpdateInterval = (ListPreference) findPreference("devicetracking_update_intervall");
+		String trackingSummary = getResources().getString(
+				R.string.prefs_trackmydevice_interval_summary);
+		trackingSummary = String.format(trackingSummary,
+				mTrackingUpdateInterval.getValue());
+		mTrackingUpdateInterval.setSummary(trackingSummary);
+		mTrackingUpdateInterval.setOnPreferenceChangeListener(this);
+
+		// Enable or disable device tracking service. Listen on events
+		mDeviceTracking = (CheckBoxPreference) findPreference("enable_devicetracking");
+		mDeviceTracking.setOnPreferenceChangeListener(this);
+		
+		// populateSessionList();
 	}
-	return true;
-}
-  
+
+	private void populateSessionList() {
+		mSessions.clear();
+		mSessions = mDbHandler.getSessionList();
+		PreferenceScreen ps = getPreferenceScreen();
+		ps.removeAll();
+		addPreferencesFromResource(R.xml.preferences);
+		for (int i = 0; i < mSessions.size(); i++) {
+			Preference preference = new Preference(getBaseContext());
+			preference.setTitle(mSessions.get(i).getName());
+			URI uri;
+			try {
+				uri = new URI(mSessions.get(i).getUrl());
+			} catch (URISyntaxException e) {
+				e.printStackTrace(); // should never happen
+				continue;
+			}
+			preference.setSummary(uri.getScheme() + "://" + uri.getHost()
+					+ uri.getPath());
+			ps.addPreference(preference);
+		}
+	}
+
+	/**
+	 * Populates the account selector
+	 */
+	private void populateAccountList() {
+		AccountManager accMan = AccountManager.get(this);
+		mAccounts = accMan.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);
+		mAccountList = (ListPreference) findPreference("select_oc_account");
+		mAccountList.setOnPreferenceChangeListener(this);
+
+		// Display the name of the current account if there is any
+		Account defaultAccount = AuthUtils.getCurrentOwnCloudAccount(this);
+		if (defaultAccount != null) {
+			mAccountList.setSummary(defaultAccount.name);
+		}
+
+		// Transform accounts into array of string for preferences to use
+		String[] accNames = new String[mAccounts.length];
+		for (int i = 0; i < mAccounts.length; i++) {
+			Account account = mAccounts[i];
+			accNames[i] = account.name;
+		}
+
+		mAccountList.setEntries(accNames);
+		mAccountList.setEntryValues(accNames);
+	}
+
+	@Override
+	public boolean onCreateOptionsMenu(Menu menu) {
+		super.onCreateOptionsMenu(menu);
+		MenuInflater inflater = getSherlock().getMenuInflater();
+		inflater.inflate(R.menu.prefs_menu, menu);
+		return true;
+	}
+
+	@Override
+	public boolean onMenuItemSelected(int featureId, MenuItem item) {
+		super.onMenuItemSelected(featureId, item);
+		Intent intent;
+
+		switch (item.getItemId()) {
+		case R.id.addSessionItem:
+			intent = new Intent(this, PreferencesNewSession.class);
+			startActivityForResult(intent, mNewSession);
+			break;
+		case R.id.SessionContextEdit:
+			intent = new Intent(this, PreferencesNewSession.class);
+			intent.putExtra("sessionId", mSessions.get(mSelectedMenuItem)
+					.getEntryId());
+			intent.putExtra("sessionName", mSessions.get(mSelectedMenuItem)
+					.getName());
+			intent.putExtra("sessionURL", mSessions.get(mSelectedMenuItem)
+					.getUrl());
+			startActivityForResult(intent, mEditSession);
+			break;
+		case R.id.SessionContextRemove:
+			OwnCloudSession ocs = mSessions.get(mSelectedMenuItem);
+			mDbHandler.removeSessionWithId(ocs.getEntryId());
+			mSessions.remove(ocs);
+			getPreferenceScreen().removePreference(
+					getPreferenceScreen().getPreference(mSelectedMenuItem + 1));
+			break;
+		case android.R.id.home:
+			intent = new Intent(getBaseContext(), LandingActivity.class);
+			intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+			startActivity(intent);
+			break;
+		default:
+			Log.w(TAG, "Unknown menu item triggered");
+			return false;
+		}
+		return true;
+	}
+
+	@Override
+	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+		super.onActivityResult(requestCode, resultCode, data);
+		if (resultCode == Activity.RESULT_OK) {
+			switch (requestCode) {
+			case mNewSession:
+				mDbHandler.addSession(data.getStringExtra("sessionName"),
+						data.getStringExtra("sessionURL"));
+				getPreferenceScreen().removeAll();
+				addPreferencesFromResource(R.xml.preferences);
+				populateSessionList();
+				break;
+			case mEditSession:
+				mDbHandler.changeSessionFields(
+						data.getIntExtra("sessionId", -1),
+						data.getStringExtra("sessionName"),
+						data.getStringExtra("sessionURL"));
+				populateSessionList();
+				break;
+			}
+		}
+	}
+
+	@Override
+	public void onCreateContextMenu(ContextMenu menu, View v,
+			ContextMenuInfo menuInfo) {
+		super.onCreateContextMenu(menu, v, menuInfo);
+		AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
+		mSelectedMenuItem = info.position - 1;
+		menu.setHeaderTitle(mSessions.get(mSelectedMenuItem).getName());
+
+		MenuInflater inflater = getSherlock().getMenuInflater();
+		inflater.inflate(R.menu.session_context_menu, (Menu) menu);
+
+	}
+
+	@Override
+	protected void onDestroy() {
+		mDbHandler.close();
+		super.onDestroy();
+	}
+
+	@Override
+	/**
+	 * Updates various summaries after updates. Also starts and stops 
+	 * the
+	 */
+	public boolean onPreferenceChange(Preference preference, Object newValue) {
+		// Update current account summary
+		if (preference.equals(mAccountList)) {
+			mAccountList.setSummary(newValue.toString());
+		} 
+		
+		// Update tracking interval summary
+		else if (preference.equals(mTrackingUpdateInterval)) {
+			String trackingSummary = getResources().getString(
+					R.string.prefs_trackmydevice_interval_summary);
+			trackingSummary = String.format(trackingSummary,
+					newValue.toString());
+			mTrackingUpdateInterval.setSummary(trackingSummary);
+		} 
+		
+		// Start or stop tracking service
+		else if (preference.equals(mDeviceTracking)) {
+			Intent locationServiceIntent = new Intent();
+			locationServiceIntent.setAction("eu.alefzero.owncloud.location.LocationLauncher");
+			locationServiceIntent.putExtra("TRACKING_SETTING", (Boolean) newValue);
+			sendBroadcast(locationServiceIntent);
+		}
+		return true;
+	}
+
 }