Merge remote branch 'upstream/master' into dev

pull/14/head
Arne Jans 16 years ago
commit e76dc3328a

@ -84,10 +84,10 @@
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
<!-- Activity that displays filter list -->
<activity android:name="com.todoroo.astrid.activity.FilterListActivity"
android:launchMode="singleTop"
android:finishOnTaskLaunch="true"
android:theme="@style/Theme">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
@ -313,6 +313,7 @@
</receiver>
<activity android:name="com.todoroo.astrid.reminders.NotificationActivity"
android:taskAffinity="com.todoroo.astrid.reminders.NotificationActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:clearTaskOnLaunch="true" />

@ -10,5 +10,5 @@
# Indicates whether an apk should be generated for each density.
split.density=false
# Project target.
target=Motorola, Inc.:MILESTONE:7
target=android-8
apk-configurations=

@ -15,6 +15,7 @@ import android.util.Log;
import com.timsu.astrid.R;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.utility.Preferences;
/**
@ -44,9 +45,11 @@ public class BackupService extends Service {
@Override
public void onStart(Intent intent, int startId) {
if (intent.getAction().equals(BACKUP_ACTION)) {
try {
ContextManager.setContext(this);
startBackup(this);
} catch (Exception e) {
PluginServices.getExceptionService().reportError("backup-bg-sync", e); //$NON-NLS-1$
}
}

@ -91,18 +91,18 @@ abstract public class SyncProviderPreferences extends TodorooPreferences {
if (r.getString(getUtilities().getSyncIntervalKey()).equals(
preference.getKey())) {
int index = AndroidUtilities.indexOf(
r.getStringArray(R.array.rmilk_MPr_interval_values),
r.getStringArray(R.array.sync_SPr_interval_values),
(String) value);
if (index <= 0)
preference.setSummary(R.string.sync_SPr_interval_desc_disabled);
else
preference.setSummary(r.getString(
R.string.sync_SPr_interval_desc,
r.getStringArray(R.array.rmilk_MPr_interval_entries)[index]));
r.getStringArray(R.array.sync_SPr_interval_entries)[index]));
}
// status
else if (r.getString(R.string.rmilk_MPr_status_key).equals(preference.getKey())) {
else if (r.getString(R.string.sync_SPr_status_key).equals(preference.getKey())) {
boolean loggedIn = getUtilities().isLoggedIn();
String status;
String subtitle = ""; //$NON-NLS-1$
@ -168,7 +168,7 @@ abstract public class SyncProviderPreferences extends TodorooPreferences {
}
// sync button
else if (r.getString(R.string.rmilk_MPr_sync_key).equals(preference.getKey())) {
else if (r.getString(R.string.sync_SPr_sync_key).equals(preference.getKey())) {
boolean loggedIn = getUtilities().isLoggedIn();
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference p) {
@ -182,12 +182,12 @@ abstract public class SyncProviderPreferences extends TodorooPreferences {
}
// log out button
else if (r.getString(R.string.rmilk_MPr_forget_key).equals(preference.getKey())) {
else if (r.getString(R.string.sync_SPr_forget_key).equals(preference.getKey())) {
boolean loggedIn = getUtilities().isLoggedIn();
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference p) {
dialogUtilities.okCancelDialog(SyncProviderPreferences.this,
r.getString(R.string.rmilk_forget_confirm), new OnClickListener() {
r.getString(R.string.sync_forget_confirm), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {

@ -10,15 +10,15 @@ import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Spinner;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R;
@ -93,7 +93,7 @@ public class GCalControlSet implements TaskEditControlSet {
Intent intent = new Intent(Intent.ACTION_EDIT, calendarUri);
try {
if(cursor.getCount() == 0) {
if(cursor == null || cursor.getCount() == 0) {
// event no longer exists, recreate it
calendarUri = null;
writeToModel(myTask);
@ -106,7 +106,8 @@ public class GCalControlSet implements TaskEditControlSet {
Log.e("gcal-error", "Error opening calendar", e); //$NON-NLS-1$ //$NON-NLS-2$
Toast.makeText(activity, R.string.gcal_TEA_error, Toast.LENGTH_LONG);
} finally {
cursor.close();
if(cursor != null)
cursor.close();
}
activity.startActivity(intent);

@ -186,6 +186,9 @@ public final class LocaleEditAlerts extends ExpandableListActivity {
.setPositiveButton(android.R.string.ok,
AddOnActivity.createAddOnClicker(LocaleEditAlerts.this, true))
.show();
FlurryAgent.onEvent("locale-edit-alerts-no-plugin"); //$NON-NLS-1$
} else {
FlurryAgent.onEvent("locale-edit-alerts"); //$NON-NLS-1$
}
}

@ -11,6 +11,7 @@ import android.util.Log;
import com.timsu.astrid.R;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.producteev.sync.ProducteevSyncProvider;
import com.todoroo.astrid.utility.Preferences;
@ -35,8 +36,11 @@ public class ProducteevBackgroundService extends Service {
/** Receive the alarm - start the synchronize service! */
@Override
public void onStart(Intent intent, int startId) {
if(intent != null && SYNC_ACTION.equals(intent.getAction()))
try {
startSynchronization(this);
} catch (Exception e) {
PluginServices.getExceptionService().reportError("pdv-bg-sync", e); //$NON-NLS-1$
}
}
/** Start the actual synchronization */
@ -49,6 +53,7 @@ public class ProducteevBackgroundService extends Service {
if(ProducteevUtilities.INSTANCE.isOngoing())
return;
PluginServices.getTaskService();
new ProducteevSyncProvider().synchronize(context);
}

@ -3,10 +3,14 @@
*/
package com.todoroo.astrid.producteev;
import java.util.TreeMap;
import java.util.Map.Entry;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.util.Pair;
import com.timsu.astrid.R;
import com.todoroo.andlib.sql.Criterion;
@ -32,10 +36,8 @@ import com.todoroo.astrid.producteev.sync.ProducteevTask;
*/
public class ProducteevFilterExposer extends BroadcastReceiver {
@SuppressWarnings("nls")
private Filter filterFromList(Context context, ProducteevDashboard dashboard) {
String dashboardTitle = context.getString(R.string.producteev_FEx_dashboard_item).
replace("$N", dashboard.getName());
String dashboardTitle = dashboard.getName();
String title = context.getString(R.string.producteev_FEx_dashboard_title, dashboard.getName());
ContentValues values = new ContentValues();
values.put(Metadata.KEY.name, ProducteevTask.METADATA_KEY);
@ -54,6 +56,25 @@ public class ProducteevFilterExposer extends BroadcastReceiver {
return filter;
}
private Filter filterFromUser(Context context, String user, Pair<Long, String> ids) {
String title = context.getString(R.string.producteev_FEx_responsible_title, user);
ContentValues values = new ContentValues();
values.put(Metadata.KEY.name, ProducteevTask.METADATA_KEY);
values.put(ProducteevTask.DASHBOARD_ID.name, ids.first);
values.put(ProducteevTask.ID.name, 0);
values.put(ProducteevTask.CREATOR_ID.name, 0);
values.put(ProducteevTask.RESPONSIBLE_ID.name, ids.second);
Filter filter = new Filter(user, title, new QueryTemplate().join(
ProducteevDataService.METADATA_JOIN).where(Criterion.and(
MetadataCriteria.withKey(ProducteevTask.METADATA_KEY),
TaskCriteria.isActive(),
TaskCriteria.isVisible(),
ProducteevTask.RESPONSIBLE_ID.eq(ids.second))),
values);
return filter;
}
@Override
public void onReceive(Context context, Intent intent) {
// if we aren't logged in, don't expose features
@ -62,26 +83,60 @@ public class ProducteevFilterExposer extends BroadcastReceiver {
StoreObject[] dashboards = ProducteevDataService.getInstance().getDashboards();
// If user does not have any tags, don't show this section at all
// If user does not have any dashboards, don't show this section at all
if(dashboards.length == 0)
return;
FilterListHeader producteevHeader = new FilterListHeader(context.getString(R.string.producteev_FEx_header));
// load dashboards
Filter[] dashboardFilters = new Filter[dashboards.length];
for(int i = 0; i < dashboards.length; i++)
dashboardFilters[i] = filterFromList(context, new ProducteevDashboard(dashboards[i]));
FilterListHeader producteevHeader = new FilterListHeader(context.getString(R.string.producteev_FEx_header));
FilterCategory producteevDashboards = new FilterCategory(context.getString(R.string.producteev_FEx_dashboard),
dashboardFilters);
// load responsible people
TreeMap<String, Pair<Long, String>> people = loadResponsiblePeople(dashboards);
Filter[] peopleFilters = new Filter[people.size()];
int index = 0;
for(Entry<String, Pair<Long, String>> person : people.entrySet())
peopleFilters[index++] = filterFromUser(context, person.getKey(), person.getValue());
FilterCategory producteevUsers = new FilterCategory(context.getString(R.string.producteev_FEx_responsible),
peopleFilters);
// transmit filter list
FilterListItem[] list = new FilterListItem[2];
FilterListItem[] list = new FilterListItem[3];
list[0] = producteevHeader;
list[1] = producteevDashboards;
list[2] = producteevUsers;
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_FILTERS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ADDON, ProducteevUtilities.IDENTIFIER);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, list);
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
}
/**
* @param dashboards
* @return people in a map of name => pair(dashboard id, user id)
*/
@SuppressWarnings("nls")
private TreeMap<String, Pair<Long, String>> loadResponsiblePeople(
StoreObject[] dashboards) {
TreeMap<String, Pair<Long, String>> results = new TreeMap<String, Pair<Long, String>>();
for(StoreObject dashboard : dashboards) {
String users = dashboard.getValue(ProducteevDashboard.USERS);
String[] entries = users.split(";");
for(String entry : entries) {
String[] data = entry.split(",");
if(data.length != 2)
continue;
results.put(data[1], new Pair<Long, String>(
dashboard.getValue(ProducteevDashboard.REMOTE_ID), data[0])); // name, id
}
}
return results;
}
}

@ -163,8 +163,8 @@ public class ProducteevSyncProvider extends SyncProvider<ProducteevTaskContainer
if(context instanceof Activity)
((Activity)context).startActivityForResult(intent, 0);
else {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
preferences.setToken(null);
preferences.stopOngoing();
}
} else {
invoker.authenticate(email, password);

@ -3,7 +3,6 @@ package com.todoroo.astrid.producteev.sync;
import org.json.JSONException;
import org.json.JSONObject;
/**
*
* @author Arne Jans <arne.jans@gmail.com>
@ -11,74 +10,76 @@ import org.json.JSONObject;
@SuppressWarnings("nls")
public class ProducteevUser {
private final long id;
private final String email;
private final long id;
private final String firstname;
private final String email;
private final String lastname;
private final String firstname;
public ProducteevUser(long id, String email, String firstname, String lastname) {
this.id = id;
this.email = email;
this.firstname = firstname;
this.lastname = lastname;
}
private final String lastname;
public ProducteevUser(JSONObject elt) throws JSONException {
this.id = elt.getLong("id");
this.email = elt.getString("email");
this.firstname = elt.getString("firstname");
this.lastname = elt.getString("lastname");
}
public ProducteevUser(long id, String email, String firstname,
String lastname) {
this.id = id;
this.email = email;
this.firstname = firstname;
this.lastname = lastname;
}
/**
* @return the email
*/
public String getEmail() {
return email;
}
public ProducteevUser(JSONObject elt) throws JSONException {
this.id = elt.getLong("id");
this.email = elt.getString("email");
this.firstname = elt.getString("firstname");
this.lastname = elt.getString("lastname");
}
/**
* @return the firstname
*/
public String getFirstname() {
return firstname;
}
/**
* @return the email
*/
public String getEmail() {
return email;
}
/**
* @return the lastname
*/
public String getLastname() {
return lastname;
}
/**
* @return the firstname
*/
public String getFirstname() {
return firstname;
}
/**
* @return the id
*/
public long getId() {
return id;
}
/**
* @return the lastname
*/
public String getLastname() {
return lastname;
}
@Override
public String toString() {
String displayString = "";
boolean hasFirstname = false;
boolean hasLastname = false;
if (firstname != null && firstname.length() > 0) {
displayString += firstname;
hasFirstname = true;
/**
* @return the id
*/
public long getId() {
return id;
}
if (lastname != null && lastname.length() > 0)
hasLastname = true;
if (hasFirstname && hasLastname)
displayString += " ";
if (hasLastname)
displayString += lastname;
if (!hasFirstname && !hasLastname && email != null && email.length() > 0)
displayString += email;
return displayString;
}
@Override
public String toString() {
String displayString = "";
boolean hasFirstname = false;
boolean hasLastname = false;
if (firstname != null && firstname.length() > 0) {
displayString += firstname;
hasFirstname = true;
}
if (lastname != null && lastname.length() > 0)
hasLastname = true;
if (hasFirstname && hasLastname)
displayString += " ";
if (hasLastname)
displayString += lastname;
if (!hasFirstname && !hasLastname && email != null
&& email.length() > 0)
displayString += email;
return displayString;
}
}

@ -124,10 +124,14 @@ public class RepeatTaskCompleteListener extends BroadcastReceiver {
if(nextDate instanceof DateTimeValueImpl) {
DateTimeValueImpl newDateTime = (DateTimeValueImpl)nextDate;
Date date = new Date(Date.UTC(newDateTime.year() - 1900, newDateTime.month() - 1,
newDateTime.day(), newDateTime.hour(),
newDateTime.minute(), newDateTime.second()));
// time may be inaccurate due to DST, force time to be same
date.setHours(repeatFromDate.getHours());
date.setMinutes(repeatFromDate.getMinutes());
newDueDate = task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME,
Date.UTC(newDateTime.year() - 1900, newDateTime.month() - 1,
newDateTime.day(), newDateTime.hour(),
newDateTime.minute(), newDateTime.second()));
date.getTime());
} else {
newDueDate = task.createDueDate(Task.URGENCY_SPECIFIC_DAY,
new Date(nextDate.year() - 1900, nextDate.month() - 1,

@ -11,6 +11,7 @@ import android.util.Log;
import com.timsu.astrid.R;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.rmilk.sync.RTMSyncProvider;
import com.todoroo.astrid.utility.Preferences;
@ -35,8 +36,11 @@ public class MilkBackgroundService extends Service {
/** Receive the alarm - start the synchronize service! */
@Override
public void onStart(Intent intent, int startId) {
if(SYNC_ACTION.equals(intent.getAction()))
try {
startSynchronization(this);
} catch (Exception e) {
PluginServices.getExceptionService().reportError("rtm-bg-sync", e); //$NON-NLS-1$
}
}
/** Start the actual synchronization */
@ -49,6 +53,7 @@ public class MilkBackgroundService extends Service {
if(MilkUtilities.isOngoing())
return;
PluginServices.getTaskService();
new RTMSyncProvider().synchronize(context);
}

@ -3,8 +3,8 @@ package com.todoroo.astrid.rmilk;
import java.util.Date;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Bundle;
@ -78,18 +78,18 @@ public class MilkPreferences extends TodorooPreferences {
if (r.getString(R.string.rmilk_MPr_interval_key).equals(
preference.getKey())) {
int index = AndroidUtilities.indexOf(
r.getStringArray(R.array.rmilk_MPr_interval_values),
r.getStringArray(R.array.sync_SPr_interval_values),
(String) value);
if (index <= 0)
preference.setSummary(R.string.sync_SPr_interval_desc_disabled);
else
preference.setSummary(r.getString(
R.string.sync_SPr_interval_desc,
r.getStringArray(R.array.rmilk_MPr_interval_entries)[index]));
r.getStringArray(R.array.sync_SPr_interval_entries)[index]));
}
// status
else if (r.getString(R.string.rmilk_MPr_status_key).equals(preference.getKey())) {
else if (r.getString(R.string.sync_SPr_status_key).equals(preference.getKey())) {
boolean loggedIn = MilkUtilities.isLoggedIn();
String status;
String subtitle = ""; //$NON-NLS-1$
@ -155,7 +155,7 @@ public class MilkPreferences extends TodorooPreferences {
}
// sync button
else if (r.getString(R.string.rmilk_MPr_sync_key).equals(preference.getKey())) {
else if (r.getString(R.string.sync_SPr_sync_key).equals(preference.getKey())) {
boolean loggedIn = MilkUtilities.isLoggedIn();
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference p) {
@ -169,12 +169,12 @@ public class MilkPreferences extends TodorooPreferences {
}
// log out button
else if (r.getString(R.string.rmilk_MPr_forget_key).equals(preference.getKey())) {
else if (r.getString(R.string.sync_SPr_forget_key).equals(preference.getKey())) {
boolean loggedIn = MilkUtilities.isLoggedIn();
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference p) {
dialogUtilities.okCancelDialog(MilkPreferences.this,
r.getString(R.string.rmilk_forget_confirm), new OnClickListener() {
r.getString(R.string.sync_forget_confirm), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {

@ -36,21 +36,21 @@ import com.todoroo.astrid.common.SyncProvider;
import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.rmilk.MilkLoginActivity;
import com.todoroo.astrid.rmilk.MilkLoginActivity.SyncLoginCallback;
import com.todoroo.astrid.rmilk.MilkPreferences;
import com.todoroo.astrid.rmilk.MilkUtilities;
import com.todoroo.astrid.rmilk.MilkLoginActivity.SyncLoginCallback;
import com.todoroo.astrid.rmilk.api.ApplicationInfo;
import com.todoroo.astrid.rmilk.api.ServiceImpl;
import com.todoroo.astrid.rmilk.api.ServiceInternalException;
import com.todoroo.astrid.rmilk.api.data.RtmAuth.Perms;
import com.todoroo.astrid.rmilk.api.data.RtmList;
import com.todoroo.astrid.rmilk.api.data.RtmLists;
import com.todoroo.astrid.rmilk.api.data.RtmTask;
import com.todoroo.astrid.rmilk.api.data.RtmTask.Priority;
import com.todoroo.astrid.rmilk.api.data.RtmTaskList;
import com.todoroo.astrid.rmilk.api.data.RtmTaskNote;
import com.todoroo.astrid.rmilk.api.data.RtmTaskSeries;
import com.todoroo.astrid.rmilk.api.data.RtmTasks;
import com.todoroo.astrid.rmilk.api.data.RtmAuth.Perms;
import com.todoroo.astrid.rmilk.api.data.RtmTask.Priority;
import com.todoroo.astrid.rmilk.data.MilkDataService;
import com.todoroo.astrid.rmilk.data.MilkNote;
import com.todoroo.astrid.service.AstridDependencyInjector;
@ -212,10 +212,14 @@ public class RTMSyncProvider extends SyncProvider<RTMTaskContainer> {
}
});
intent.putExtra(MilkLoginActivity.URL_TOKEN, url);
if(context instanceof Activity)
((Activity)context).startActivityForResult(intent, 0);
else
context.startActivity(intent);
else {
// can't synchronize until user logs in
MilkUtilities.setToken(null);
MilkUtilities.stopOngoing();
}
} else {
performSync();

@ -86,7 +86,7 @@ public final class TagsControlSet implements TaskEditControlSet {
if(loadedTags.length <= i || !loadedTags[i].equals(tag))
identical = false;
}
if(identical && tags.size() != loadedTags.length)
if(loadedTags == null || tags.size() != loadedTags.length)
identical = false;
if(!identical) {

@ -19,7 +19,7 @@
<!-- importance -->
<View android:id="@+id/importance"
android:layout_width="2dip"
android:layout_width="3dip"
android:layout_height="fill_parent"
android:layout_marginRight="5dip" />

@ -27,12 +27,13 @@
<!-- List Label -->
<TextView android:id="@+id/listLabel"
android:layout_width="wrap_content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="100"
android:gravity="center"
android:singleLine="true"
android:paddingRight="50dip"
android:ellipsize="middle"
android:ellipsize="start"
style="@style/TextAppearance.TLA_Header"/>
</LinearLayout>

@ -10,7 +10,7 @@
<!-- Header -->
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_height="42dip"
android:layout_weight="1"
android:orientation="horizontal"
android:background="@drawable/edit_header">
@ -22,19 +22,18 @@
android:layout_weight="1"
android:src="@drawable/tango_filters"
android:scaleType="center"
android:paddingTop="8dip"
android:paddingLeft="5dip"
android:paddingRight="5dip"/>
<!-- List Label -->
<TextView android:id="@+id/listLabel"
android:layout_width="wrap_content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="100"
android:gravity="center"
android:singleLine="true"
android:paddingTop="6dip"
android:paddingRight="50dip"
android:ellipsize="middle"
android:ellipsize="start"
style="@style/TextAppearance.TLA_Header"/>
</LinearLayout>

@ -178,10 +178,10 @@
<!-- default hide until setting (corresponds to entry in TEA_hideUntil) -->
<string name="p_default_hideUntil_key">p_def_hide</string>
<!-- ============================================================ MILK == -->
<!-- ============================================================ SYNC == -->
<string-array name="rmilk_MPr_interval_values">
<!-- rmilk_MPr_interval_values: interval in seconds for sync entries (do not edit) -->
<string-array name="sync_SPr_interval_values">
<!-- sync_SPr_interval_values: interval in seconds for sync entries (do not edit) -->
<item>0</item>
<item>900</item>
<item>1800</item>
@ -195,14 +195,16 @@
</string-array>
<!-- Preference Key (do not translate) -->
<string name="rmilk_MPr_status_key">rmilk_status</string>
<string name="sync_SPr_status_key">sync_status</string>
<!-- Preference Key (do not translate) -->
<string name="rmilk_MPr_bgwifi_key">sync_bgwifi</string>
<string name="sync_SPr_bgwifi_key">sync_bgwifi</string>
<!-- Preference Key (do not translate) -->
<string name="rmilk_MPr_sync_key">rmilk_sync</string>
<string name="sync_SPr_sync_key">sync_sync</string>
<!-- Preference Key (do not translate) -->
<string name="rmilk_MPr_forget_key">rmilk_forget</string>
<string name="sync_SPr_forget_key">sync_forget</string>
<!-- ============================================================ MILK == -->
<!-- Preference Key (do not translate) -->
<string name="rmilk_MPr_interval_key">sync_freq</string>

@ -4,23 +4,20 @@
<!-- ====================== Plugin Boilerplate ========================= -->
<!-- task detail showing Producteev dashboard information (%s => workspace name) -->
<string name="producteev_TLA_dashboard">W: %s</string>
<!-- task detail showing Producteev responsible information (%s => responsible user) -->
<string name="producteev_TLA_responsible">R: %s</string>
<!-- filters header: Producteev -->
<string name="producteev_FEx_header">Producteev</string>
<!-- filter category for Producteev dashboards -->
<string name="producteev_FEx_dashboard">Producteev Workspaces</string>
<string name="producteev_FEx_dashboard">Workspaces</string>
<!-- Producteev dashboard filter title (%s => dashboard name) -->
<string name="producteev_FEx_dashboard_title">%s</string>
<!-- Producteev dashboard filter name ($N => dashboardname, $C => count) -->
<string name="producteev_FEx_dashboard_item">$N</string>
<!-- filter category for Producteev responsible person -->
<string name="producteev_FEx_responsible">Assigned To</string>
<!-- Producteev dashboard filter title (%s => dashboardname) -->
<string name="producteev_FEx_dashboard_title">Workspace \'%s\'</string>
<string name="producteev_FEx_responsible_title">Assigned To \'%s\'</string>
<!-- ==================================================== Preferences == -->

@ -47,7 +47,7 @@
<!-- ======================== SyncPreferences ========================== -->
<!-- RTM Status Group Label -->
<string name="sync_MPr_group_status">Status</string>
<string name="sync_SPr_group_status">Status</string>
<!-- Sync Status: log in -->
<string name="sync_status_loggedout">Not Logged In!</string>
@ -73,24 +73,41 @@
<string name="sync_SPr_interval_desc">Currently set to: %s</string>
<!-- Preference: Background Wifi Title -->
<string name="sync_MPr_bgwifi_title">Wifi Only Setting</string>
<string name="sync_SPr_bgwifi_title">Wifi Only Setting</string>
<!-- Preference: Background Wifi Description (enabled) -->
<string name="sync_MPr_bgwifi_desc_enabled">Background synchronization only happens when on Wifi</string>
<string name="sync_SPr_bgwifi_desc_enabled">Background synchronization only happens when on Wifi</string>
<!-- Preference: Background Wifi Description (disabled) -->
<string name="sync_MPr_bgwifi_desc_disabled">Background synchronization will always occur</string>
<string name="sync_SPr_bgwifi_desc_disabled">Background synchronization will always occur</string>
<!-- Actions Group Label -->
<string name="sync_MPr_group_actions">Actions</string>
<string name="sync_SPr_group_actions">Actions</string>
<!-- Synchronize Now Button -->
<string name="sync_MPr_sync">Synchronize Now!</string>
<string name="sync_SPr_sync">Synchronize Now!</string>
<!-- Synchronize Now Button if not logged in-->
<string name="sync_MPr_sync_log_in">Log In &amp; Synchronize!</string>
<string name="sync_SPr_sync_log_in">Log In &amp; Synchronize!</string>
<!-- Sync: Clear Data Title -->
<string name="sync_MPr_forget">Log Out</string>
<string name="sync_SPr_forget">Log Out</string>
<!-- Sync: Clear Data Description -->
<string name="sync_MPr_forget_description">Clears all synchronization data</string>
<string name="sync_SPr_forget_description">Clears all synchronization data</string>
<!-- confirmation dialog for sync log out -->
<string name="sync_forget_confirm">Log out / clear synchronization data?</string>
<string-array name="sync_SPr_interval_entries">
<!-- rmilk_MPr_interval_entries: Synchronization Intervals -->
<item>disable</item>
<item>every fifteen minutes</item>
<item>every thirty minutes</item>
<item>every hour</item>
<item>every three hours</item>
<item>every six hours</item>
<item>every twelve hours</item>
<item>every day</item>
<item>every three days</item>
<item>every week</item>
</string-array>
<!-- ======================= MilkLoginActivity ========================= -->
@ -109,27 +126,9 @@ Error Message: %s
<!-- title for notification tray when synchronizing -->
<string name="rmilk_notification_title">Astrid: Remember the Milk</string>
<!-- confirmation dialog for RTM log out -->
<string name="rmilk_forget_confirm">Log out / clear synchronization data?</string>
<!-- Error msg when io exception with rmilk -->
<string name="rmilk_ioerror">Connection Error! Check your Internet connection,
or maybe RTM servers (status.rememberthemilk.com), for possible solutions.</string>
<string-array name="rmilk_MPr_interval_entries">
<!-- rmilk_MPr_interval_entries: Synchronization Intervals -->
<item>disable</item>
<item>every fifteen minutes</item>
<item>every thirty minutes</item>
<item>every hour</item>
<item>every three hours</item>
<item>every six hours</item>
<item>every twelve hours</item>
<item>every day</item>
<item>every three days</item>
<item>every week</item>
</string-array>
</resources>

@ -25,7 +25,7 @@
</style>
<style name="TextAppearance.TLA_Header">
<item name="android:textSize">20sp</item>
<item name="android:textSize">18sp</item>
<item name="android:gravity">center</item>
</style>

@ -7,7 +7,7 @@
<Preference
android:layout="@layout/status_preference"
android:key="@string/rmilk_MPr_status_key"
android:key="@string/sync_SPr_status_key"
android:textSize="24sp"
android:gravity="center"/>
@ -19,7 +19,7 @@
<ListPreference
android:key="@string/producteev_PPr_interval_key"
android:entries="@array/sync_SPr_interval_entries"
android:entryValues="@array/rmilk_MPr_interval_values"
android:entryValues="@array/sync_SPr_interval_values"
android:title="@string/sync_SPr_interval_title" />
<ListPreference
@ -31,11 +31,11 @@
<PreferenceCategory
android:title="@string/sync_SPr_group_actions">
<Preference
android:key="@string/rmilk_MPr_sync_key"
android:key="@string/sync_SPr_sync_key"
android:title="@string/sync_SPr_sync" />
<Preference
android:key="@string/rmilk_MPr_forget_key"
android:key="@string/sync_SPr_forget_key"
android:title="@string/sync_SPr_forget"
android:summary="@string/sync_SPr_forget_description" />
</PreferenceCategory>

@ -7,7 +7,7 @@
<Preference
android:layout="@layout/status_preference"
android:key="@string/rmilk_MPr_status_key"
android:key="@string/sync_SPr_status_key"
android:textSize="24sp"
android:gravity="center"/>
@ -19,7 +19,7 @@
<ListPreference
android:key="@string/rmilk_MPr_interval_key"
android:entries="@array/sync_SPr_interval_entries"
android:entryValues="@array/rmilk_MPr_interval_values"
android:entryValues="@array/sync_SPr_interval_values"
android:title="@string/sync_SPr_interval_title" />
</PreferenceCategory>
@ -28,11 +28,11 @@
android:title="@string/sync_SPr_group_actions">
<Preference
android:key="@string/rmilk_MPr_sync_key"
android:key="@string/sync_SPr_sync_key"
android:title="@string/sync_SPr_sync" />
<Preference
android:key="@string/rmilk_MPr_forget_key"
android:key="@string/sync_SPr_forget_key"
android:title="@string/sync_SPr_forget"
android:summary="@string/sync_SPr_forget_description" />

@ -191,6 +191,12 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
database.openForWriting();
setUpUiComponents();
onNewIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setUpTaskList();
if(Constants.DEBUG)
setTitle("[D] " + filter.title); //$NON-NLS-1$
@ -264,7 +270,6 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
Intent intent = new Intent(TaskListActivity.this,
FilterListActivity.class);
startActivity(intent);
finish();
}
});
@ -495,6 +500,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
super.onActivityResult(requestCode, resultCode, data);
if(resultCode != RESULT_CANCELED) {
taskAdapter.flushCaches();
loadTaskListContent(true);
taskService.cleanup();
}
@ -870,7 +876,6 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
Intent intent = new Intent(TaskListActivity.this,
FilterListActivity.class);
startActivity(intent);
finish();
}
}

@ -18,12 +18,12 @@ import android.text.Html;
import android.text.Html.ImageGetter;
import android.text.util.Linkify;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.CheckBox;
@ -42,6 +42,7 @@ import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.SoftHashMap;
import com.todoroo.astrid.activity.TaskEditActivity;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.alarms.AlarmDetailExposer;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.DetailExposer;
@ -557,7 +558,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
public void onClick(View arg0) {
Intent intent = new Intent(activity, TaskEditActivity.class);
intent.putExtra(TaskEditActivity.TOKEN_ID, taskId);
activity.startActivity(intent);
activity.startActivityForResult(intent, TaskListActivity.ACTIVITY_EDIT_TASK);
}
});
editButton.setLayoutParams(params);
@ -786,7 +787,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
* @return list if there was already one
*/
protected synchronized Collection<TYPE> initialize(long taskId) {
if(cache.containsKey(taskId))
if(cache.containsKey(taskId) && cache.get(taskId) != null)
return get(taskId);
cache.put(taskId, new HashMap<String, TYPE>());
return null;

@ -154,8 +154,10 @@ public class TaskDao extends GenericDao<Task> {
boolean saveSuccessful;
ContentValues values = task.getSetValues();
if(values == null || values.size() == 0)
return false;
if(values == null || values.size() == 0) {
if(task.getDatabaseValues() != null)
return false;
}
if (task.getId() == Task.NO_ID) {
saveSuccessful = createNew(task);

@ -175,6 +175,7 @@ public class TasksWidget extends AppWidgetProvider {
}
Intent listIntent = new Intent(context, TaskListActivity.class);
listIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
if(filter != null) {
listIntent.putExtra(TaskListActivity.TOKEN_FILTER, filter);
listIntent.setType(filter.sqlQuery);
@ -184,6 +185,7 @@ public class TasksWidget extends AppWidgetProvider {
views.setOnClickPendingIntent(R.id.taskbody, pendingIntent);
Intent editIntent = new Intent(context, TaskEditActivity.class);
editIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if(filter != null && filter.valuesForNewTasks != null) {
String values = AndroidUtilities.contentValuesToSerializedString(filter.valuesForNewTasks);
editIntent.putExtra(TaskEditActivity.TOKEN_VALUES, values);

@ -9,12 +9,14 @@ import android.view.View;
import android.widget.Button;
import android.widget.ExpandableListView;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.adapter.FilterAdapter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterCategory;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.utility.Preferences;
public class WidgetConfigActivity extends ExpandableListActivity {
@ -56,6 +58,8 @@ public class WidgetConfigActivity extends ExpandableListActivity {
Button button = (Button)findViewById(R.id.ok);
button.setOnClickListener(mOnClickListener);
FlurryAgent.onEvent("widget-config"); //$NON-NLS-1$
}
View.OnClickListener mOnClickListener = new View.OnClickListener() {
@ -115,6 +119,18 @@ public class WidgetConfigActivity extends ExpandableListActivity {
adapter.unregisterRecevier();
}
@Override
protected void onStart() {
super.onStart();
FlurryAgent.onStartSession(this, Constants.FLURRY_KEY);
}
@Override
protected void onStop() {
super.onStop();
FlurryAgent.onEndSession(this);
}
private void saveConfiguration(FilterListItem filterListItem) {
String sql = null, contentValuesString = null, title = null;

Loading…
Cancel
Save