--- /dev/null
+/* 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;
+ }
+
+}
--- /dev/null
+/* 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
+
+ }
+
+
+}
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
\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