Started working on the "Where is my device?" feature
authorLennart Rosam <lennart@familie-rosam.de>
Sun, 15 Apr 2012 15:31:08 +0000 (17:31 +0200)
committerLennart Rosam <lennart@familie-rosam.de>
Sun, 15 Apr 2012 15:31:08 +0000 (17:31 +0200)
AndroidManifest.xml
res/values/strings.xml
res/xml/preferences.xml
src/eu/alefzero/owncloud/location/LocationServiceLauncherReciever.java [new file with mode: 0644]
src/eu/alefzero/owncloud/location/LocationUpdateService.java [new file with mode: 0644]
src/eu/alefzero/owncloud/ui/activity/LandingActivity.java
src/eu/alefzero/owncloud/ui/activity/Preferences.java

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