From: Lennart Rosam Date: Sun, 15 Apr 2012 15:31:08 +0000 (+0200) Subject: Started working on the "Where is my device?" feature X-Git-Tag: oc-android-1.4.3~441 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/6e43d84b17a15b934989d0b71c1ac795186f26b4?ds=inline;hp=-c Started working on the "Where is my device?" feature --- 6e43d84b17a15b934989d0b71c1ac795186f26b4 diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c278a8e1..d709d1e2 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -12,6 +12,7 @@ + + + + + + + + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 7a2768f9..31e8b03d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14,12 +14,20 @@ Settings Account Setup There are no ownCloud accounts on your device. In order to use this App, you need to create one. - General + + General + Device tracking Stored sessions Add new session Create image thumbnails Select an account Choose, which of your accounts the app should use. + Device tracking + Enable ownCloud to track your device location + Your ownCloud keeps track of this device + Update intervall + Update every %1$s minutes + Session Name URL Username @@ -52,4 +60,17 @@ Choose account Contacts Use Secure Connection + ownCloud cannot track your device. Please check your location settings + + + 15 Minutes + 30 Minutes + 60 Minutes + + + + 15 + 30 + 60 + diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index 2fe8d3bb..e17e2848 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -1,7 +1,7 @@ - - + @@ -11,5 +11,25 @@ android:title="@string/prefs_select_oc_account" android:summary="@string/prefs_summary_select_oc_account" /> + + + + + + + + \ 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 index 00000000..813b46e4 --- /dev/null +++ b/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 . + * + */ +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 index 00000000..7ec3c467 --- /dev/null +++ b/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 . + * + */ +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 + + } + + +} diff --git a/src/eu/alefzero/owncloud/ui/activity/LandingActivity.java b/src/eu/alefzero/owncloud/ui/activity/LandingActivity.java index 7e2a8c03..668f134d 100644 --- a/src/eu/alefzero/owncloud/ui/activity/LandingActivity.java +++ b/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); } } diff --git a/src/eu/alefzero/owncloud/ui/activity/Preferences.java b/src/eu/alefzero/owncloud/ui/activity/Preferences.java index 70f3362b..a374b242 100644 --- a/src/eu/alefzero/owncloud/ui/activity/Preferences.java +++ b/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 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(); - 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 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(); + 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; + } + }