diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 1e9da83d4..574b9dc10 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionName="3.3.5 (bug fix release)" + android:versionCode="160"> diff --git a/astrid/gen/.gitignore b/astrid/gen/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmDetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmDetailExposer.java index 092dc7c22..b78dfcdbc 100644 --- a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmDetailExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmDetailExposer.java @@ -3,12 +3,13 @@ */ package com.todoroo.astrid.alarms; +import java.util.Date; + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.text.format.DateUtils; -import com.timsu.astrid.R; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.api.AstridApiConstants; @@ -60,10 +61,16 @@ public class AlarmDetailExposer extends BroadcastReceiver { if(nextTime == -1) return null; - CharSequence durationString = DateUtils.getRelativeDateTimeString(context, - nextTime, DateUtils.MINUTE_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, - DateUtils.FORMAT_ABBREV_ALL); - return context.getString(R.string.alarm_ADE_detail, durationString); + int flags = DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME; + Date today = new Date(); + Date alarm = new Date(nextTime); + if(today.getYear() == alarm.getYear()) + flags |= DateUtils.FORMAT_NO_YEAR; + if(alarm.getTime() - today.getTime() > DateUtilities.ONE_DAY) + flags |= DateUtils.FORMAT_SHOW_DATE; + CharSequence durationString = DateUtils.formatDateTime(context, nextTime, + flags); + return " " + durationString; //$NON-NLS-1$ } finally { cursor.close(); } diff --git a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java index 9284fb8b4..770a1b88d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java +++ b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java @@ -25,6 +25,7 @@ import com.todoroo.astrid.data.Task; import com.todoroo.astrid.reminders.Notifications; import com.todoroo.astrid.reminders.ReminderService; import com.todoroo.astrid.service.MetadataService; +import com.todoroo.astrid.utility.Constants; /** * Provides operations for working with alerts @@ -77,7 +78,10 @@ public class AlarmService { metadata.add(item); } - return service.synchronizeMetadata(taskId, metadata, Metadata.KEY.eq(AlarmFields.METADATA_KEY)) > 0; + boolean changed = service.synchronizeMetadata(taskId, metadata, Metadata.KEY.eq(AlarmFields.METADATA_KEY)) > 0; + if(changed) + scheduleAlarms(taskId); + return changed; } // --- alarm scheduling @@ -99,7 +103,7 @@ public class AlarmService { * @return todoroo cursor. PLEASE CLOSE THIS CURSOR! */ private TodorooCursor getAlarmsForTask(long taskId) { - return PluginServices.getMetadataService().query(Query.select(AlarmFields.TIME). + return PluginServices.getMetadataService().query(Query.select(Metadata.TASK, AlarmFields.TIME). join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))). where(Criterion.and(TaskCriteria.isActive(), MetadataCriteria.byTaskAndwithKey(taskId, AlarmFields.METADATA_KEY)))); @@ -129,8 +133,8 @@ public class AlarmService { * Schedules alarms for a single task * @param task */ - public void scheduleAlarms(Task task) { - TodorooCursor cursor = getAlarmsForTask(task.getId()); + public void scheduleAlarms(long taskId) { + TodorooCursor cursor = getAlarmsForTask(taskId); try { Metadata alarm = new Metadata(); for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { @@ -138,7 +142,7 @@ public class AlarmService { scheduleAlarm(alarm); } } catch (Exception e) { - // suppress + Log.i("astrid-alarms", "Error scheduling alarm", e); //$NON-NLS-1$ //$NON-NLS-2$ } finally { cursor.close(); } @@ -173,7 +177,8 @@ public class AlarmService { if(time == 0 || time == NO_ALARM) am.cancel(pendingIntent); else if(time > DateUtilities.now()) { - Log.e("Astrid", "Alarm (" + taskId + ", " + type + + if(Constants.DEBUG) + Log.e("Astrid", "Alarm (" + taskId + ", " + type + ") set for " + new Date(time)); am.set(AlarmManager.RTC_WAKEUP, time, pendingIntent); } diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevLoginActivity.java b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevLoginActivity.java index dcc489d03..9e135b84a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevLoginActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevLoginActivity.java @@ -19,6 +19,8 @@ */ package com.todoroo.astrid.producteev; +import java.util.TimeZone; + import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; @@ -27,8 +29,10 @@ import android.os.Bundle; import android.text.Editable; import android.view.View; import android.view.View.OnClickListener; +import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; +import android.widget.Spinner; import android.widget.TextView; import com.flurry.android.FlurryAgent; @@ -78,6 +82,21 @@ public class ProducteevLoginActivity extends Activity { final EditText emailEditText = (EditText) findViewById(R.id.email); final EditText passwordEditText = (EditText) findViewById(R.id.password); final View newUserLayout = findViewById(R.id.newUserLayout); + final Spinner timezoneList = (Spinner) findViewById(R.id.timezoneList); + + String[] timezoneIds = TimeZone.getAvailableIDs(); + String defaultTimeZone = TimeZone.getDefault().getID(); + int selected = 0; + for(int i = 0; i < timezoneIds.length; i++) { + if(timezoneIds[i].equals(defaultTimeZone)) + selected = i; + } + + ArrayAdapter adapter = new ArrayAdapter(this, + android.R.layout.simple_spinner_item, timezoneIds); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + timezoneList.setAdapter(adapter); + timezoneList.setSelection(selected); Button signIn = (Button) findViewById(R.id.signIn); signIn.setOnClickListener(new OnClickListener() { @@ -111,6 +130,7 @@ public class ProducteevLoginActivity extends Activity { Editable password = passwordEditText.getText(); Editable firstName = ((EditText)findViewById(R.id.firstName)).getText(); Editable lastName = ((EditText)findViewById(R.id.lastName)).getText(); + String timezone = timezoneList.getSelectedItem().toString(); if(email.length() == 0 || password.length() == 0 || firstName.length() == 0 || lastName.length() == 0) { @@ -119,7 +139,7 @@ public class ProducteevLoginActivity extends Activity { return; } performSignup(email.toString(), password.toString(), - firstName.toString(), lastName.toString()); + firstName.toString(), lastName.toString(), timezone); } } }); @@ -144,7 +164,7 @@ public class ProducteevLoginActivity extends Activity { Preferences.setString(R.string.producteev_PPr_password, password); ProducteevUtilities.INSTANCE.setToken(invoker.getToken()); - FlurryAgent.onEvent("producteev-login"); + FlurryAgent.onEvent("producteev-login"); //$NON-NLS-1$ synchronize(); } catch (ApiAuthenticationException e) { @@ -167,7 +187,7 @@ public class ProducteevLoginActivity extends Activity { } private void performSignup(final String email, final String password, - final String firstName, final String lastName) { + final String firstName, final String lastName, final String timezone) { final ProgressDialog dialog = DialogUtilities.progressDialog(this, getString(R.string.DLG_wait)); final TextView errors = (TextView) findViewById(R.id.error); @@ -178,7 +198,7 @@ public class ProducteevLoginActivity extends Activity { ProducteevInvoker invoker = ProducteevSyncProvider.getInvoker(); final StringBuilder errorMessage = new StringBuilder(); try { - invoker.usersSignUp(email, firstName, lastName, password, null); + invoker.usersSignUp(email, firstName, lastName, password, timezone, null); invoker.authenticate(email, password); Preferences.setString(R.string.producteev_PPr_email, email); @@ -220,7 +240,10 @@ public class ProducteevLoginActivity extends Activity { FlurryAgent.onStartSession(this, Constants.FLURRY_KEY); } - private void onEn() { + @Override + protected void onStop() { + super.onStop(); FlurryAgent.onEndSession(this); } + } \ No newline at end of file diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/api/ProducteevInvoker.java b/astrid/plugin-src/com/todoroo/astrid/producteev/api/ProducteevInvoker.java index 349ca292a..e77489bd9 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/api/ProducteevInvoker.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/api/ProducteevInvoker.java @@ -86,12 +86,13 @@ public class ProducteevInvoker { * Sign up as the given user */ public JSONObject usersSignUp(String email, String firstName, String lastName, String - password, Long fbUid) throws IOException, ApiServiceException { + password, String timezone, Long fbUid) throws IOException, ApiServiceException { return invokeGet("users/signup.json", "email", email, "firstname", firstName, "lastname", lastName, "password", password, + "timezone", timezone, "fbuid", fbUid); } @@ -254,6 +255,19 @@ public class ProducteevInvoker { "all_day", allDay); } + /** + * unset a deadline + * + * @param idTask + * + * @return array tasks/view + */ + public JSONObject tasksUnsetDeadline(long idTask) throws ApiServiceException, IOException { + return callAuthenticated("tasks/unset_deadline.json", + "token", token, + "id_task", idTask); + } + /** * set a workspace * diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevSyncProvider.java b/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevSyncProvider.java index fdc25f0f9..e0f426125 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevSyncProvider.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevSyncProvider.java @@ -527,8 +527,12 @@ public class ProducteevSyncProvider extends SyncProvider - + - - - - - - - - - - - - - - - - - - - - - -