Adding name option to task rabbit

pull/14/head
Andrew Shaw 13 years ago
parent 99a8a73638
commit 6383d3679f

@ -623,15 +623,18 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<!-- Task Rabbit -->
<activity android:name="com.todoroo.astrid.taskrabbit.TaskRabbitControlSet"></activity>
<activity android:name="com.todoroo.astrid.taskrabbit.TaskRabbitMapActivity"></activity>
<activity android:name="com.todoroo.astrid.welcome.tutorial.WelcomeWalkthrough"
<activity android:name="com.todoroo.astrid.taskrabbit.TaskRabbitActivity"></activity><activity android:name="com.todoroo.astrid.welcome.tutorial.WelcomeWalkthrough"
android:windowSoftInputMode="stateHidden"
android:screenOrientation="portrait"></activity>
<!-- Uses Library -->
<uses-library android:name="com.google.android.maps" />
<uses-library android:name="com.google.android.maps" />
</application>

@ -112,10 +112,12 @@ public class EditPeopleControlSet extends PopupControlSet {
private final List<AssignedChangedListener> listeners = new LinkedList<AssignedChangedListener>();
public interface AssignedChangedListener {
public void assignedChanged(String name, JSONObject json);
public boolean showTaskRabbitForUser(String name, JSONObject json);
public boolean shouldShowTaskRabbit();
}
int selected = 0; //need to remember last selected state for task rabbit
static {
AstridDependencyInjector.initialize();
}
@ -390,7 +392,7 @@ public class EditPeopleControlSet extends PopupControlSet {
}
}
final int selected = assignedIndex;
selected = assignedIndex;
final AssignedUserAdapter usersAdapter = new AssignedUserAdapter(activity, listValues);
activity.runOnUiThread(new Runnable() {
@ -449,11 +451,19 @@ public class EditPeopleControlSet extends PopupControlSet {
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long id) {
AssignedToUser user = (AssignedToUser) assignedList.getAdapter().getItem(position);
assignedDisplay.setText(user.toString());
assignedCustom.setText(""); //$NON-NLS-1$
for (AssignedChangedListener l : listeners) {
l.assignedChanged(user.label, user.user);
if(l.showTaskRabbitForUser(user.label, user.user)) {
assignedList.setItemChecked(selected, true);
assignedList.setItemChecked(position, false);
DialogUtilities.dismissDialog(activity, dialog);
return;
}
}
assignedDisplay.setText(user.toString());
assignedCustom.setText(""); //$NON-NLS-1$
selected = position;
refreshDisplayView();
DialogUtilities.dismissDialog(activity, dialog);
}
@ -464,7 +474,8 @@ public class EditPeopleControlSet extends PopupControlSet {
@Override
public void onClick(View v) {
assignedCustom.setText(""); //$NON-NLS-1$
assignedList.setItemChecked(0, true);
selected = 0;
assignedList.setItemChecked(selected, true);
}
});

@ -849,7 +849,7 @@ public final class ActFmSyncService {
return result.optString("picture");
}
private MultipartEntity buildPictureData(Bitmap bitmap) {
public static MultipartEntity buildPictureData(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if(bitmap.getWidth() > 512 || bitmap.getHeight() > 512) {
float scale = Math.min(512f / bitmap.getWidth(), 512f / bitmap.getHeight());

@ -0,0 +1,843 @@
package com.todoroo.astrid.taskrabbit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicHeader;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.support.v4.app.ActionBar;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.MenuItem;
import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.PopupWindow.OnDismissListener;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.maps.GeoPoint;
import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.service.RestClient;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.OAuthLoginActivity;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.helper.TaskEditControlSet;
import com.todoroo.astrid.reminders.Notifications;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.StatisticsConstants;
import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.ui.FragmentPopover;
import com.todoroo.astrid.welcome.HelpInfoPopover;
public class TaskRabbitActivity extends FragmentActivity implements LocationListener {
public interface TaskRabbitSetListener {
public void readFromModel(JSONObject json, String key);
public void saveToJSON(JSONObject json, String key) throws JSONException;
public void writeToJSON(JSONObject json, String key) throws JSONException;
}
public interface ActivityResultSetListener {
public boolean activityResult (int requestCode, int resultCode, Intent data);
}
/** task model */
Task model = null;
@Autowired
private RestClient restClient;
@Autowired
private Database database;
@Autowired
private TaskService taskService;
@Autowired
private MetadataService metadataService;
@Autowired
private ExceptionService exceptionService;
GeoPoint[] supportedLocations =
{
new GeoPoint(42358430, -71059770),
new GeoPoint(37739230, -122439880),
new GeoPoint(40714350, -74005970),
new GeoPoint(41878110, -8762980),
new GeoPoint(34052230, -118243680),
new GeoPoint(33717470, -117831140)};
/** true if editing started with a new task */
boolean isNewTask = false;
private EditText taskTitle;
private Button taskButton;
private LinearLayout taskControls;
private LinearLayout descriptionControls;
private Location currentLocation;
private FragmentPopover menuPopover;
private TextView menuTitle;
private ListView menuList;
private ListAdapter adapter;
private int currentSelectedItem = 0;
private View menuNav;
private ImageView menuNavDisclosure;
private final List<TaskRabbitSetListener> controls = Collections.synchronizedList(new ArrayList<TaskRabbitSetListener>());
private LinearLayout row;
public static final int REQUEST_CODE_TASK_RABBIT_OAUTH = 5;
/** Act.fm current user name */
public static final String TASK_RABBIT_TOKEN = "task_rabbit_token"; //$NON-NLS-1$
public static final String TASK_RABBIT_URL = "http://www.taskrabbit.com"; //$NON-NLS-1$
// public static final String TASK_RABBIT_URL = "http://rs-astrid-api.taskrabbit.com"; //$NON-NLS-1$
public static final String TASK_RABBIT_CLIENT_ID = "RZUDrMuGn9Q3dXeq4nL24bM6LZmMCi1CEGgfP4ND"; //$NON-NLS-1$
public static final String TASK_RABBIT_CLIENT_APPLICATION_ID = "Va7FUIUTprsmyuwAq9eHSZvAgiRj8FVH1zeaM8Zt"; //$NON-NLS-1$
// public static final String TASK_RABBIT_CLIENT_ID = "fDTmGeR0uNCvoxopNyqsRWae8xOvbOBqC7jmHaxv"; //$NON-NLS-1$
// public static final String TASK_RABBIT_CLIENT_APPLICATION_ID = "XBpKshU8utH5eaNmhky9N8aAId5rSLTh04Hi60Co"; //$NON-NLS-1$
public static final String CITY_NAME = "task_rabbit_city_name"; //$NON-NLS-1$
private TaskRabbitTaskContainer taskRabbitTask;
/* From tag settings */
private boolean isDialog;
public TaskRabbitActivity() {
DependencyInjectionService.getInstance().inject(this);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
setupForDialogOrFullscreen();
super.onCreate(savedInstanceState);
loadLocation();
setContentView(R.layout.task_rabbit_enter);
}
public void showAddListPopover() {
ActionBar actionBar = getSupportActionBar();
HelpInfoPopover.showPopover(this, actionBar.getCustomView().findViewById(R.id.menu_nav), R.string.help_popover_add_lists, null);
}
@Override
public void onResume() {
super.onResume();
StatisticsService.sessionStart(this);
populateFields();
if(!isLoggedIn())
showAddListPopover();
}
@Override
public void onPause() {
super.onPause();
StatisticsService.sessionPause();
// if (shouldSaveState)
try {
taskRabbitTask.setLocalTaskData(serializeToJSON().toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void populateFields() {
loadItem(getIntent());
taskRabbitTask = TaskRabbitDataService.getInstance().getContainerForTask(model);
setUpUIComponents();
}
/*
* ======================================================================
* =============================================== model reading / saving
* ======================================================================
*/
/**
* Loads action item from the given intent
*
* @param intent
*/
@SuppressWarnings("nls")
protected void loadItem(Intent intent) {
if (model != null) {
// came from bundle
isNewTask = (model.getValue(Task.TITLE).length() == 0);
return;
}
long idParam = intent.getLongExtra(TaskEditFragment.TOKEN_ID, -1L);
database.openForReading();
if (idParam > -1L) {
model = taskService.fetchById(idParam, Task.PROPERTIES);
if (model == null) {
this.onBackPressed();
}
}
// not found by id or was never passed an id
if (model == null) {
String valuesAsString = intent.getStringExtra(TaskEditFragment.TOKEN_VALUES);
ContentValues values = null;
try {
if (valuesAsString != null)
values = AndroidUtilities.contentValuesFromSerializedString(valuesAsString);
} catch (Exception e) {
// oops, can't serialize
}
model = TaskListFragment.createWithValues(values, null,
taskService, metadataService);
}
if (model == null) {
exceptionService.reportError("task-edit-no-task",
new NullPointerException("model"));
onBackPressed();
return;
}
// clear notification
Notifications.cancelNotifications(model.getId());
}
private void setupForDialogOrFullscreen() {
isDialog = AndroidUtilities.isTabletSized(this);
if (isDialog)
setTheme(ThemeService.getDialogTheme());
else
ThemeService.applyTheme(this);
}
private void setUpControls() {
TypedArray arrays = getResources().obtainTypedArray(R.array.tr_default_set);
TypedArray arrayType = getResources().obtainTypedArray(R.array.tr_default_array);
for (int i = 0; i < arrays.length(); i++) {
int titleID = arrays.getResourceId(i, 0);
int arrayID = arrayType.getResourceId(i, 0);
if (arrayID == R.string.tr_set_key_location) {
TaskRabbitLocationControlSet set = new TaskRabbitLocationControlSet(this, R.layout.task_rabbit_row, titleID, i);
controls.add(set);
}
else if(arrayID == R.string.tr_set_key_deadline) {
TaskRabbitDeadlineControlSet deadlineControl = new TaskRabbitDeadlineControlSet(
this, R.layout.control_set_deadline,
R.layout.task_rabbit_row);
controls.add(deadlineControl);
deadlineControl.readFromTask(model);
}
else if(arrayID == R.string.tr_set_key_name) {
TaskRabbitNameControlSet nameControlSet = new TaskRabbitNameControlSet(this,
R.layout.control_set_notes, R.layout.task_rabbit_row, titleID, i);
controls.add(nameControlSet);
}
else if(arrayID == R.string.tr_set_key_description) {
TaskRabbitNameControlSet descriptionControlSet = new TaskRabbitNameControlSet(this,
R.layout.control_set_notes, R.layout.task_rabbit_row_description, titleID, i);
try {
descriptionControlSet.readFromModel(new JSONObject().put("description", model.getValue(Task.NOTES)), "description");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
controls.add(descriptionControlSet);
}
else {
TaskRabbitSpinnerControlSet set = new TaskRabbitSpinnerControlSet(this, R.layout.task_rabbit_spinner, titleID, i);
controls.add(set);
}
}
/*
if(TextUtils.isEmpty(taskDescription.getText())){
taskDescription.setText(model.getValue(Task.NOTES));
}*/
if(TextUtils.isEmpty(taskTitle.getText())) {
taskTitle.setText(model.getValue(Task.TITLE));
}
populateFields(taskRabbitTask);
displayViewsForMode(currentSelectedItem);
}
private void displayViewsForMode(int mode) {
taskControls.removeAllViews();
descriptionControls.removeAllViews();
if (row == null) {
row = new LinearLayout(this);
row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
row.setOrientation(LinearLayout.HORIZONTAL);
}
else {
row.removeAllViews();
}
menuTitle.setText(getResources().getStringArray(R.array.tr_preset_types)[mode]);
int[] presetValues = getPresetValues(mode);
TypedArray keys = getResources().obtainTypedArray(R.array.tr_default_set_key);
JSONObject parameters = defaultValuesToJSON(keys, presetValues);
for (int i = 1; i < controls.size(); i++) {
if (presetValues[i] == -1) continue;
TaskRabbitSetListener set = controls.get(i);
int arrayID = keys.getResourceId(i, 0);
if (arrayID == R.string.tr_set_key_cost_in_cents || arrayID == R.string.tr_set_key_named_price) {
if(row.getParent() == null)
taskControls.addView(row);
else {
// View separator = getLayoutInflater().inflate(R.layout.tea_separator, row);
// separator.setLayoutParams(new LayoutParams(1, LayoutParams.FILL_PARENT));
}
LinearLayout displayRow = (LinearLayout)((TaskEditControlSet)set).getDisplayView();
LinearLayout.LayoutParams layoutParams= null;
if(arrayID == R.string.tr_set_key_named_price) {
layoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT, 1);
displayRow.findViewById(R.id.display_row_body).setPadding(5, 0, 10, 0);
displayRow.setMinimumWidth(130);
}
else {
layoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT, 1);
displayRow.findViewById(R.id.display_row_body).setPadding(10, 0, 5, 0);
}
row.addView(displayRow, layoutParams);
}
else if (arrayID == R.string.tr_set_key_description) {
descriptionControls.addView(((TaskEditControlSet)set).getDisplayView());
}
else {
taskControls.addView(((TaskEditControlSet)set).getDisplayView());
}
((TaskRabbitSetListener) set).readFromModel(parameters, getString(arrayID));
}
}
private JSONObject defaultValuesToJSON (TypedArray keys, int[] presetValues) {
JSONObject parameters = new JSONObject();
for(int i = 0; i < keys.length(); i++) {
try {
int arrayID = keys.getResourceId(i, 0);
parameters.put(getString(arrayID), (presetValues[i]));
} catch (JSONException e) {
e.printStackTrace();
}
}
return parameters;
}
/** Initialize UI components */
private void setUpUIComponents() {
if (taskTitle == null){
taskTitle = (EditText) findViewById(R.id.task_title);
taskControls = (LinearLayout) findViewById(R.id.task_controls);
descriptionControls = (LinearLayout)findViewById(R.id.description_controls);
taskButton = (Button) findViewById(R.id.task_button);
taskButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
submitTaskRabbit();
}
});
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setCustomView(R.layout.task_rabbit_header_view);
View customView = actionBar.getCustomView();
menuNav = customView.findViewById(R.id.menu_nav);
menuNavDisclosure = (ImageView) customView.findViewById(R.id.menu_disclosure_arrow);
menuTitle = (TextView) customView.findViewById(R.id.task_rabbit_title);
menuNav.setOnClickListener(menuClickListener);
createMenuPopover();
}
setUpControls();
}
}
private void populateFields(TaskRabbitTaskContainer container) {
if (container == null) {
return;
}
if(taskRabbitTask.getTaskID() > 0)
taskButton.setText("Update task!");
JSONObject jsonData = container.getLocalTaskData();
synchronized (controls) {
if(jsonData != null) {
String[] keys = getResources().getStringArray(R.array.tr_default_set_key);
currentSelectedItem = jsonData.optInt(getString(R.string.tr_set_key_type));
String title = jsonData.optString(getString(R.string.tr_set_key_name));
if (!TextUtils.isEmpty(title)) {
taskTitle.setText(title);
}
for (int i = 0; i < controls.size(); i++) {
TaskRabbitSetListener set = (TaskRabbitSetListener) controls.get(i);
set.readFromModel(jsonData, keys[i]);
}
}
}
}
/* saving/converting task rabbit data */
private JSONObject localParamsToJSON () throws JSONException {
JSONObject parameters = new JSONObject();
int[] presetValues = getPresetValues(currentSelectedItem);
String[] keys = getResources().getStringArray(R.array.tr_default_set_key);
String descriptionKey = getString(R.string.tr_set_key_description);
String category = "Category: " + menuTitle.getText().toString() + "\n";
parameters.put(descriptionKey, category);
for (int i = 0; i < controls.size(); i++) {
if (presetValues[i] == -1) continue;
TaskRabbitSetListener set = controls.get(i);
set.writeToJSON(parameters, keys[i]);
}
if (parameters.optJSONArray("other_locations_attributes") == null) {
parameters.put(getString(R.string.tr_attr_city_id), Preferences.getInt("task_rabbit_city_id", 1));
parameters.put(getString(R.string.tr_attr_city_lat), true);
}
parameters.put(getString(R.string.tr_set_key_name), taskTitle.getText().toString());
parameters.put(getString(R.string.tr_set_key_name), taskTitle.getText().toString());
// parameters.put(activity.getString(R.string.tr_set_key_type), menuList.getSelectedItem().toString());
Log.d("THE TAK JSON IS", parameters.toString());
return new JSONObject().put("task", parameters);
}
private int[] getPresetValues(int mode) {
TypedArray arrays = getResources().obtainTypedArray(R.array.tr_default_type_array);
int[] presetValues = getResources().getIntArray(arrays.getResourceId(mode, 0));
return presetValues;
}
private String serializeToJSON () throws JSONException {
JSONObject parameters = new JSONObject();
String[] keys = getResources().getStringArray(R.array.tr_default_set_key);
for (int i = 0; i < controls.size(); i++) {
TaskRabbitSetListener set = controls.get(i);
set.saveToJSON(parameters, keys[i]);
}
parameters.put(getString(R.string.tr_set_key_type), currentSelectedItem);
parameters.put(getString(R.string.tr_set_key_name), taskTitle.getText().toString());
return parameters.toString();
}
private HttpEntity getTaskBody() {
try {
return new StringEntity(localParamsToJSON().toString());
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
protected void submitTaskRabbit(){
if(!Preferences.isSet(TASK_RABBIT_TOKEN)){
loginTaskRabbit();
}
else {
new Thread(new Runnable() {
@Override
public void run() {
try {
String urlCall = "tasks/";
if (taskRabbitTask.getTaskID() > 0) urlCall += taskRabbitTask.getTaskID();
urlCall +="?client_id=" + TASK_RABBIT_CLIENT_ID;
Log.d("Tasks url:", taskRabbitURL(urlCall));
Header authorization = new BasicHeader("Authorization", "OAuth " + Preferences.getStringValue(TASK_RABBIT_TOKEN)); //$NON-NLS-1$
Header contentType = new BasicHeader("Content-Type", //$NON-NLS-1$
"application/json"); //$NON-NLS-1$
String response = restClient.post(taskRabbitURL(urlCall), getTaskBody(), contentType, authorization);
Log.d("Task rabbit response", response);
JSONObject taskResponse = new JSONObject(response);
if(taskResponse.has("id")){
taskRabbitTask.setRemoteTaskData(response);
taskRabbitTask.setTaskID(taskResponse.optString("id"));
Message successMessage = new Message();
successMessage.what = 1;
handler.sendMessage(successMessage);
}
}
catch (Exception e){
e.printStackTrace();
Message failureMessage = new Message();
failureMessage.what = -1;
handler.sendMessage(failureMessage);
}
}
}).start();
}
try {
taskRabbitTask.setLocalTaskData(serializeToJSON().toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//submit!
}
/* message callbacks */
/**
* Show toast for task edit canceling
*/
private void showSuccessToast() {
Toast.makeText(this, "Task posted to Task Rabbit successfully!",
Toast.LENGTH_SHORT).show();
}
private final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case -1:
AlertDialog.Builder adb = new AlertDialog.Builder(TaskRabbitActivity.this);
adb.setTitle("Error posting task");
adb.setMessage("Please try again");
adb.setPositiveButton("Close",null);
adb.show();
break;
case 0: break;
case 1:
TaskRabbitDataService.getInstance().saveTaskAndMetadata(taskRabbitTask);
Intent data = new Intent();
data.putExtra(TaskRabbitControlSet.DATA_RESPONSE, taskRabbitTask.getRemoteTaskData().toString());
TaskRabbitActivity.this.setResult(Activity.RESULT_OK, data);
TaskRabbitActivity.this.finish();
break;
}
}
};
/* login methods */
protected void loginTaskRabbit() {
Intent intent = new Intent(this,
OAuthLoginActivity.class);
try {
String url = TASK_RABBIT_URL + "/api/authorize?client_id=" + TASK_RABBIT_CLIENT_ID;
intent.putExtra(OAuthLoginActivity.URL_TOKEN, url);
this.startActivityForResult(intent, REQUEST_CODE_TASK_RABBIT_OAUTH);
StatisticsService.reportEvent(StatisticsConstants.ACTFM_LOGIN_GL_START);
} catch (Exception e) {
// handleError(e);
e.printStackTrace();
}
}
private void loadLocation() {
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if ( !locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER ) || !locationManager.isProviderEnabled( LocationManager.NETWORK_PROVIDER )) {
buildAlertMessageNoGps();
}
currentLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, this);
updateControlSetLocation(currentLocation);
}
private void buildAlertMessageNoGps() {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("GPS needs to be enabled in order to add location based tasks. Do you want to enable it?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
dialog.cancel();
}
});
final AlertDialog alert = builder.create();
alert.show();
}
protected void saveUserInfo(String response) throws Exception {
JSONObject userObject = new JSONObject(response);
JSONObject cityObject = userObject.getJSONObject("city");
if (cityObject.has("name")){
Preferences.setString("task_rabbit_city_name", cityObject.getString("name"));
}
if (cityObject.has("id")){
Preferences.setInt("task_rabbit_city_id", cityObject.getInt("id"));
}
if (cityObject.has("lat")){
// currentLocation.setLatitude(cityObject.getDouble("lat"));
Preferences.setString("task_rabbit_city_lat", String.valueOf(cityObject.getDouble("lat")));
}
if (cityObject.has("lng")){
// currentLocation.setLongitude(cityObject.getDouble("lng"));
Preferences.setString("task_rabbit_city_lng", String.valueOf(cityObject.getDouble("lng")));
}
}
private String taskRabbitURL(String method) {
return TASK_RABBIT_URL + "/api/v1/"+ method;
}
@Override
public void onActivityResult (int requestCode, int resultCode, Intent data) {
Log.d("The actiivty result request code", "Rerjwklrw" + requestCode);
if (requestCode == REQUEST_CODE_TASK_RABBIT_OAUTH && resultCode == Activity.RESULT_OK){
String result = data.getStringExtra(OAuthLoginActivity.DATA_RESPONSE);
if(result.contains("access_token=")) {
try {
result = result.substring(result.indexOf("access_token=")+"access_token=".length());
Preferences.setString(TASK_RABBIT_TOKEN, result);
String response = restClient.get(taskRabbitURL("account"));
Log.d("Task rabbit response", response);
saveUserInfo(response);
}
catch (Exception e){
e.printStackTrace();
}
}
}
else {
for (TaskRabbitSetListener set : controls) {
if (set instanceof ActivityResultSetListener) {
if (((ActivityResultSetListener) set).activityResult(requestCode, resultCode, data))
return;
}
}
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case android.R.id.home:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
/*
* (non-Javadoc)
* @see android.location.LocationListener#onLocationChanged(android.location.Location)
*/
@Override
public void onLocationChanged(Location location) {
currentLocation = location;
updateControlSetLocation(currentLocation);
}
public void updateControlSetLocation (Location location) {
for (TaskRabbitSetListener controlSet : controls) {
if (TaskRabbitLocationControlSet.class.isAssignableFrom(controlSet.getClass())) {
((TaskRabbitLocationControlSet) controlSet).updateCurrentLocation(location);
}
}
}
@Override
public void onProviderDisabled(String provider) {
return;
}
@Override
public void onProviderEnabled(String provider) {
return;
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
return;
}
public boolean isLoggedIn() {
return !TextUtils.isEmpty(Preferences.getStringValue(TASK_RABBIT_TOKEN));
}
public boolean supportsCurrentLocation() {
//TODO test this
if(true) return true;
if (currentLocation == null) return false;
for (GeoPoint point : supportedLocations){
Location city = new Location(""); //$NON-NLS-1$
city.setLatitude(point.getLatitudeE6()/1E6);
city.setLongitude(point.getLongitudeE6()/1E6);
float distance = currentLocation.distanceTo(city);
if (distance < 400000) { //250 mi radius
return true;
}
}
return false;
}
/* Menu Popover */
private void setMenuDropdownSelected(boolean selected) {
int oldTextColor = menuTitle.getTextColors().getDefaultColor();
int textStyle = (selected ? R.style.TextAppearance_ActionBar_ListsHeader_Selected :
R.style.TextAppearance_ActionBar_ListsHeader);
TypedValue listDisclosure = new TypedValue();
getTheme().resolveAttribute(R.attr.asListsDisclosure, listDisclosure, false);
menuTitle.setTextAppearance(this, textStyle);
menuNav.setBackgroundColor(selected ? oldTextColor : android.R.color.transparent);
menuNavDisclosure.setSelected(selected);
}
private final OnClickListener menuClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
setMenuDropdownSelected(true);
menuPopover.show(v);
}
};
private void createMenuPopover() {
menuPopover = new FragmentPopover(this, R.layout.task_rabbit_menu_popover);
menuPopover.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss() {
setMenuDropdownSelected(false);
}
});
setupListView();
menuPopover.setContent(menuList);
}
private void setupListView() {
String[] keys = getResources().getStringArray(R.array.tr_preset_types);
if (!supportsCurrentLocation()) {
keys = new String[]{ getResources().getString(R.string.tr_type_virtual)};
}
adapter = new ArrayAdapter<String>(this, R.layout.task_rabbit_menu_row, keys);
menuList = new ListView(this);
menuList.setAdapter(adapter);
menuList.setCacheColorHint(Color.TRANSPARENT);
menuList.setSelection(0);
menuList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
currentSelectedItem = position;
displayViewsForMode(position);
menuPopover.dismiss();
}
});
}
}

@ -1,46 +1,27 @@
package com.todoroo.astrid.taskrabbit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicHeader;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.TypedArray;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.maps.GeoPoint;
import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
@ -48,13 +29,11 @@ import com.todoroo.andlib.service.RestClient;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.EditPeopleControlSet.AssignedChangedListener;
import com.todoroo.astrid.actfm.OAuthLoginActivity;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.helper.TaskEditControlSet;
import com.todoroo.astrid.service.StatisticsConstants;
import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.ui.PopupControlSet;
public class TaskRabbitControlSet extends PopupControlSet implements AssignedChangedListener, LocationListener {
public class TaskRabbitControlSet extends TaskEditControlSet implements AssignedChangedListener {
public interface TaskRabbitSetListener {
@ -62,6 +41,10 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha
public void saveToJSON(JSONObject json, String key) throws JSONException;
public void writeToJSON(JSONObject json, String key) throws JSONException;
}
public interface ActivityResultSetListener {
public boolean activityResult (int requestCode, int resultCode, Intent data);
}
/** task model */
Task model = null;
@ -70,27 +53,17 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha
private RestClient restClient;
GeoPoint[] supportedLocations =
{
new GeoPoint(42358430, -71059770),
new GeoPoint(37739230, -122439880),
new GeoPoint(40714350, -74005970),
new GeoPoint(41878110, -8762980),
new GeoPoint(34052230, -118243680),
new GeoPoint(33717470, -117831140)};
/** true if editing started with a new task */
boolean isNewTask = false;
private EditText taskDescription;
private Button taskButton;
private LinearLayout taskControls;
private Location currentLocation;
private final Fragment fragment;
private final List<TaskRabbitSetListener> controls = Collections.synchronizedList(new ArrayList<TaskRabbitSetListener>());
private LinearLayout row;
protected final TextView displayText;
private Spinner spinnerMode;
public static final int REQUEST_CODE_TASK_RABBIT_ACTIVITY = 5;
public static final String DATA_RESPONSE = "response"; //$NON-NLS-1$
public static final int REQUEST_CODE_TASK_RABBIT_OAUTH = 5;
/** Act.fm current user name */
public static final String TASK_RABBIT_TOKEN = "task_rabbit_token"; //$NON-NLS-1$
@ -99,21 +72,29 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha
public static final String TASK_RABBIT_CLIENT_ID = "fDTmGeR0uNCvoxopNyqsRWae8xOvbOBqC7jmHaxv"; //$NON-NLS-1$
public static final String TASK_RABBIT_CLIENT_APPLICATION_ID = "XBpKshU8utH5eaNmhky9N8aAId5rSLTh04Hi60Co"; //$NON-NLS-1$
public static final String CITY_NAME = "task_rabbit_city_name"; //$NON-NLS-1$
private TaskRabbitTaskContainer taskRabbitTask;
public TaskRabbitControlSet(Fragment fragment, int viewLayout, int displayViewLayout) {
super(fragment.getActivity(), viewLayout, displayViewLayout, 0);
public TaskRabbitControlSet(Fragment fragment, int displayViewLayout) {
super(fragment.getActivity(), displayViewLayout);
this.fragment = fragment;
DependencyInjectionService.getInstance().inject(this);
loadLocation();
displayText = (TextView) getView().findViewById(R.id.display_row_title);
if (displayText != null) {
displayText.setMaxLines(2);
}
if (getView() != null) {
getView().setOnClickListener(getDisplayClickListener());
}
}
@Override
protected void refreshDisplayView() {
JSONObject remoteData = taskRabbitTask.getRemoteTaskData();
if (remoteData != null)
@ -129,13 +110,16 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha
}
@Override
private void showTaskRabbitActivity() {
Intent intent = new Intent(fragment.getActivity(), TaskRabbitActivity.class);
intent.putExtra(TaskEditFragment.TOKEN_ID, model.getId());
fragment.startActivityForResult(intent, REQUEST_CODE_TASK_RABBIT_ACTIVITY);
}
protected OnClickListener getDisplayClickListener() {
return new OnClickListener() {
@Override
public void onClick(View v) {
setUpUIComponents();
dialog.show();
showTaskRabbitActivity();
}
};
}
@ -157,320 +141,49 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha
}
private void setUpControls() {
TypedArray arrays = activity.getResources().obtainTypedArray(R.array.tr_default_set);
TypedArray arrayType = activity.getResources().obtainTypedArray(R.array.tr_default_array);
for (int i = 0; i < arrays.length(); i++) {
int titleID = arrays.getResourceId(i, -1);
int arrayID = arrayType.getResourceId(i, -1);
if (arrayID == R.string.tr_location) {
TaskRabbitLocationControlSet set = new TaskRabbitLocationControlSet(fragment, R.layout.task_rabbit_row, titleID, i, spinnerMode.getSelectedItemPosition());
controls.add(set);
}
else if(arrayID == R.string.tr_deadline) {
TaskRabbitDeadlineControlSet deadlineControl = new TaskRabbitDeadlineControlSet(
activity, R.layout.control_set_deadline,
R.layout.task_rabbit_row);
controls.add(deadlineControl);
}
else if(arrayID == R.string.tr_name) {
TaskRabbitNameControlSet nameControlSet = new TaskRabbitNameControlSet(activity,
R.layout.control_set_notes, R.layout.control_set_notes_display, titleID, i);
controls.add(nameControlSet);
}
else {
TaskRabbitSpinnerControlSet set = new TaskRabbitSpinnerControlSet(fragment, R.layout.task_rabbit_spinner, titleID, i, spinnerMode.getSelectedItemPosition());
controls.add(set);
}
}
if(taskDescription.getText().length() == 0){
taskDescription.setText(model.getValue(Task.TITLE) + model.getValue(Task.NOTES));
}
populateFields(taskRabbitTask);
}
private void displayViewsForMode(int mode) {
for (int i = 0; i < taskControls.getChildCount(); i++){
ViewGroup row = (ViewGroup)taskControls.getChildAt(i);
row.removeAllViews();
}
taskControls.removeAllViews();
LinearLayout row = null;
int[] presetValues = getPresetValues(mode);
String[] keys = activity.getResources().getStringArray(R.array.tr_default_set_key);
for (int i = 1; i < controls.size(); i++) {
if (presetValues[i] == -1) continue;
if (row == null || row.getChildCount() == 2) {
row = new LinearLayout(activity);
row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 100));
row.setOrientation(LinearLayout.HORIZONTAL);
taskControls.addView(row);
}
TaskRabbitSetListener set = controls.get(i);
row.addView(((TaskEditControlSet)set).getDisplayView(), new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1));
JSONObject parameters = new JSONObject();
try {
parameters.put(keys[i], (presetValues[i]));
} catch (JSONException e) {
e.printStackTrace();
}
((TaskRabbitSetListener) set).readFromModel(parameters, keys[i]);
}
}
/** Initialize UI components */
private void setUpUIComponents() {
if (taskDescription == null){
taskDescription = (EditText) getView().findViewById(R.id.task_description);
taskControls = (LinearLayout)getView().findViewById(R.id.task_controls);
taskButton = (Button) getView().findViewById(R.id.task_button);
taskButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
submitTaskRabbit();
}
});
spinnerMode = (Spinner) getView().findViewById(R.id.task_type);
String[] listTypes = activity.getResources().getStringArray(
R.array.tr_preset_types);
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
activity, android.R.layout.simple_spinner_item, listTypes);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
spinnerMode.setAdapter(adapter);
}
});
spinnerMode.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
displayViewsForMode(spinnerMode.getSelectedItemPosition());
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
return;
}
});
setUpControls();
}
}
private void populateFields(TaskRabbitTaskContainer container) {
if (container == null) {
return;
}
JSONObject jsonData = container.getLocalTaskData();
synchronized (controls) {
if(jsonData != null) {
String[] keys = activity.getResources().getStringArray(R.array.tr_default_set_key);
spinnerMode.setSelection(jsonData.optInt(keys[0]));
for (int i = 1; i < controls.size(); i++) {
TaskRabbitSetListener set = (TaskRabbitSetListener) controls.get(i);
set.readFromModel(jsonData, keys[i]);
}
}
}
}
private JSONObject localParamsToJSON () throws JSONException {
JSONObject parameters = new JSONObject();
int[] presetValues = getPresetValues(spinnerMode.getSelectedItemPosition());
String[] keys = activity.getResources().getStringArray(R.array.tr_default_set_key);
parameters.put(activity.getString(R.string.tr_set_key_type), spinnerMode.getSelectedItem().toString());
parameters.put(activity.getString(R.string.tr_set_key_description), taskDescription.getText().toString());
for (int i = 1; i < controls.size(); i++) {
if (presetValues[i] == -1) continue;
TaskRabbitSetListener set = controls.get(i);
set.writeToJSON(parameters, keys[i]);
}
if (parameters.optJSONArray("other_locations_attributes") == null) {
parameters.put(activity.getString(R.string.tr_attr_city_id), Preferences.getInt("task_rabbit_city_id", 1));
parameters.put(activity.getString(R.string.tr_attr_city_lat), true);
}
Log.d("localParamsToJSON", parameters.toString());
return new JSONObject().put("task", parameters);
}
private int[] getPresetValues(int mode) {
TypedArray arrays = activity.getResources().obtainTypedArray(R.array.tr_default_type_array);
int[] presetValues = activity.getResources().getIntArray(arrays.getResourceId(mode, -1));
return presetValues;
}
private String serializeToJSON () throws JSONException {
JSONObject parameters = new JSONObject();
String[] keys = activity.getResources().getStringArray(R.array.tr_default_set_key);
for (int i = 1; i < controls.size(); i++) {
TaskRabbitSetListener set = controls.get(i);
set.saveToJSON(parameters, keys[i]);
}
parameters.put(activity.getString(R.string.tr_set_key_type), spinnerMode.getSelectedItemPosition());
parameters.put(activity.getString(R.string.tr_set_key_description), taskDescription.getText().toString());
return parameters.toString();
}
private HttpEntity getTaskBody() {
try {
return new StringEntity(localParamsToJSON().toString());
}
catch (Exception e) {
e.printStackTrace();
}
return null;
/* message callbacks */
/**
* Show toast for task edit canceling
*/
private void showSuccessToast() {
Toast.makeText(fragment.getActivity(), "Task posted to Task Rabbit successfully!",
Toast.LENGTH_SHORT).show();
}
private final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case -1:
if(dialog.isShowing()) {
AlertDialog.Builder adb = new AlertDialog.Builder(activity);
adb.setTitle("Error posting task");
adb.setMessage("Please try again");
adb.setPositiveButton("Close",null);
adb.show();
}
break;
case 0: break;
case 1:
showSuccessToast();
TaskRabbitDataService.getInstance().saveTaskAndMetadata(taskRabbitTask);
updateDisplay(taskRabbitTask.getRemoteTaskData());
dialog.dismiss();
break;
case 2:
TaskRabbitDataService.getInstance().saveTaskAndMetadata(taskRabbitTask);
updateDisplay(taskRabbitTask.getRemoteTaskData());
dialog.dismiss();
break;
}
}
};
protected void submitTaskRabbit(){
if(!Preferences.isSet(TASK_RABBIT_TOKEN)){
loginTaskRabbit();
}
else {
new Thread(new Runnable() {
@Override
public void run() {
try {
String urlCall = "tasks/";
Log.d("Tasks url:", taskRabbitURL(urlCall));
Header authorization = new BasicHeader("Authorization", "OAuth " + Preferences.getStringValue(TASK_RABBIT_TOKEN)); //$NON-NLS-1$
Header contentType = new BasicHeader("Content-Type", //$NON-NLS-1$
"application/json"); //$NON-NLS-1$
String response = restClient.post(taskRabbitURL(urlCall), getTaskBody(), contentType, authorization);
Log.d("Task rabbit response", response);
JSONObject taskResponse = new JSONObject(response);
if(taskResponse.has("id")){
taskRabbitTask.setRemoteTaskData(response);
taskRabbitTask.setTaskID(taskResponse.optString("id"));
Message successMessage = new Message();
successMessage.what = 1;
handler.sendMessage(successMessage);
}
}
catch (Exception e){
e.printStackTrace();
Message failureMessage = new Message();
failureMessage.what = -1;
handler.sendMessage(failureMessage);
}
}
}).start();
}
try {
taskRabbitTask.setLocalTaskData(serializeToJSON().toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//submit!
}
/**
* Show toast for task edit canceling
*/
private void showSuccessToast() {
Toast.makeText(activity, "Task posted to Task Rabbit successfully!",
Toast.LENGTH_SHORT).show();
}
protected void loginTaskRabbit() {
Intent intent = new Intent(activity,
OAuthLoginActivity.class);
try {
String url = TASK_RABBIT_URL + "/api/authorize?client_id=" + TASK_RABBIT_CLIENT_ID;
intent.putExtra(OAuthLoginActivity.URL_TOKEN, url);
fragment.startActivityForResult(intent, REQUEST_CODE_TASK_RABBIT_OAUTH);
StatisticsService.reportEvent(StatisticsConstants.ACTFM_LOGIN_GL_START);
} catch (Exception e) {
// handleError(e);
e.printStackTrace();
}
}
private void loadLocation() {
LocationManager locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
currentLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, this);
updateControlSetLocation(currentLocation);
private void buildAlertMessageNoGps() {
final AlertDialog.Builder builder = new AlertDialog.Builder(fragment.getActivity());
builder.setMessage("Yout GPS seems to be disabled, do you want to enable it?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
fragment.getActivity().startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
dialog.cancel();
}
});
final AlertDialog alert = builder.create();
alert.show();
}
protected void saveUserInfo(String response) throws Exception {
JSONObject userObject = new JSONObject(response);
JSONObject cityObject = userObject.getJSONObject("city");
if (cityObject.has("name")){
Preferences.setString("task_rabbit_city_name", cityObject.getString("name"));
}
if (cityObject.has("id")){
Preferences.setInt("task_rabbit_city_id", cityObject.getInt("id"));
}
if (cityObject.has("lat")){
// currentLocation.setLatitude(cityObject.getDouble("lat"));
Preferences.setString("task_rabbit_city_lat", String.valueOf(cityObject.getDouble("lat")));
}
if (cityObject.has("lng")){
// currentLocation.setLongitude(cityObject.getDouble("lng"));
Preferences.setString("task_rabbit_city_lng", String.valueOf(cityObject.getDouble("lng")));
}
}
private String taskRabbitURL(String method) {
return TASK_RABBIT_URL + "/api/v1/"+ method;
@ -479,24 +192,22 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha
/** Fire task rabbit if assigned **/
@Override
public void assignedChanged(String name, JSONObject json) {
public boolean showTaskRabbitForUser(String name, JSONObject json) {
// TODO Auto-generated method stub
if (name.equals(activity.getString(R.string.actfm_EPA_task_rabbit))) {
setUpUIComponents();
dialog.show();
if (name.equals(fragment.getActivity().getString(R.string.actfm_EPA_task_rabbit))) {
showTaskRabbitActivity();
return true;
}
return false;
}
public boolean activityResult (int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_TASK_RABBIT_OAUTH && resultCode == Activity.RESULT_OK){
Log.d("The actiivty result request code", "Rerjwklrw" + REQUEST_CODE_TASK_RABBIT_ACTIVITY);
if (requestCode == REQUEST_CODE_TASK_RABBIT_ACTIVITY && resultCode == Activity.RESULT_OK){
String result = data.getStringExtra(OAuthLoginActivity.DATA_RESPONSE);
if(result.contains("access_token=")) {
if (TextUtils.isEmpty(result)) {
try {
result = result.substring(result.indexOf("access_token=")+"access_token=".length());
Preferences.setString(TASK_RABBIT_TOKEN, result);
String response = restClient.get(taskRabbitURL("account"));
Log.d("Task rabbit response", response);
saveUserInfo(response);
updateDisplay(new JSONObject(result));
}
catch (Exception e){
e.printStackTrace();
@ -505,58 +216,18 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha
return true;
}
else {
for (TaskRabbitSetListener set : controls) {
if (set.getClass().equals(TaskRabbitLocationControlSet.class)) {
if (((TaskRabbitLocationControlSet) set).activityResult(requestCode, resultCode, data)) {
return true;
}
}
}
}
return false;
}
/*
* (non-Javadoc)
* @see android.location.LocationListener#onLocationChanged(android.location.Location)
*/
@Override
public void onLocationChanged(Location location) {
currentLocation = location;
updateControlSetLocation(currentLocation);
}
public void updateControlSetLocation (Location location) {
for (TaskRabbitSetListener controlSet : controls) {
if (TaskRabbitLocationControlSet.class.isAssignableFrom(controlSet.getClass())) {
((TaskRabbitLocationControlSet) controlSet).updateCurrentLocation(location);
}
}
}
@Override
public void onProviderDisabled(String provider) {
return;
}
@Override
public void onProviderEnabled(String provider) {
return;
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
return;
}
/*
*
*/
public void updateDisplay(JSONObject json) {
if (json != null && json.has("state_label")) {
String status = json.optString(activity.getString(R.string.tr_attr_state_label));
String stateKey = fragment.getActivity().getString(R.string.tr_attr_state_label);
if (json != null && json.has(stateKey)) {
String status = json.optString(stateKey);
TextView statusText = (TextView) getDisplayView().findViewById(R.id.display_row_edit);
statusText.setText(status);
getDisplayView().setVisibility(View.VISIBLE);
@ -604,17 +275,9 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha
}
@Override
public boolean shouldShowTaskRabbit() {
//if (isLoggedIn()) return true;
if(!Locale.getDefault().getCountry().equals("US") ) return false; //$NON-NLS-1$
for (GeoPoint point : supportedLocations){
Location city = new Location(""); //$NON-NLS-1$
city.setLatitude(point.getLatitudeE6()/1E6);
city.setLongitude(point.getLongitudeE6()/1E6);
float distance = currentLocation.distanceTo(city);
if (distance < 400000) {
return true;
}
}
if(Locale.getDefault().getCountry().equals("US")) return true; //$NON-NLS-1$
return false;
}
}

@ -190,9 +190,7 @@ public final class TaskRabbitDataService {
ArrayList<Metadata> metadata = new ArrayList<Metadata>();
TodorooCursor<Metadata> metadataCursor = metadataService.query(Query.select(Metadata.PROPERTIES).
where(Criterion.and(MetadataCriteria.byTask(task.getId()),
Criterion.or(MetadataCriteria.withKey(TagService.KEY),
MetadataCriteria.withKey(TaskRabbitMetadata.METADATA_KEY),
MetadataCriteria.withKey(NoteMetadata.METADATA_KEY)))));
MetadataCriteria.withKey(TaskRabbitMetadata.METADATA_KEY))));
try {
for(metadataCursor.moveToFirst(); !metadataCursor.isAfterLast(); metadataCursor.moveToNext()) {
metadata.add(new Metadata(metadataCursor));

@ -17,7 +17,7 @@ import com.timsu.astrid.R;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.taskrabbit.TaskRabbitControlSet.TaskRabbitSetListener;
import com.todoroo.astrid.taskrabbit.TaskRabbitActivity.TaskRabbitSetListener;
import com.todoroo.astrid.ui.DateAndTimePicker;
import com.todoroo.astrid.ui.PopupControlSet;
@ -47,7 +47,8 @@ public class TaskRabbitDeadlineControlSet extends PopupControlSet implements Tas
protected void refreshDisplayView() {
TextView dateDisplay = (TextView) getDisplayView().findViewById(R.id.display_row_edit);
String toDisplay = dateAndTimePicker.getDisplayString(activity);
dateDisplay.setText(toDisplay);
if (dateDisplay != null)
dateDisplay.setText(toDisplay);
}
@Override
@ -64,20 +65,22 @@ public class TaskRabbitDeadlineControlSet extends PopupControlSet implements Tas
@Override
public void readFromModel(JSONObject json, String key) {
long dateValue = json.optLong(key);
Date currentDate = null;
if (dateValue < 24) {
long dateValue = json.optLong(key);
Date currentDate = null;
if (dateValue < 24) {
if(dateAndTimePicker.constructDueDate() > 0) return;
currentDate = new Date();
currentDate.setHours((int)dateValue);
currentDate.setMinutes(0);
currentDate.setSeconds(0);
}
else {
currentDate = new Date(dateValue);
}
}
else {
currentDate = new Date(dateValue);
}
dateAndTimePicker.initializeWithDate(DateUtilities.dateToUnixtime(currentDate)+ DateUtilities.ONE_DAY);
refreshDisplayView();
dateAndTimePicker.initializeWithDate(DateUtilities.dateToUnixtime(currentDate)+ DateUtilities.ONE_DAY);
refreshDisplayView();
}

@ -12,7 +12,6 @@ import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@ -22,30 +21,29 @@ import android.widget.TextView;
import com.timsu.astrid.R;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.helper.TaskEditControlSet;
import com.todoroo.astrid.taskrabbit.TaskRabbitControlSet.TaskRabbitSetListener;
import com.todoroo.astrid.taskrabbit.TaskRabbitActivity.ActivityResultSetListener;
import com.todoroo.astrid.taskrabbit.TaskRabbitActivity.TaskRabbitSetListener;
public class TaskRabbitLocationControlSet extends TaskEditControlSet implements TaskRabbitSetListener {
public class TaskRabbitLocationControlSet extends TaskEditControlSet implements TaskRabbitSetListener, ActivityResultSetListener {
private final int setID;
private final int type;
private final TextView displayText;
private final TextView displayEdit;
private final Fragment fragment;
private final Activity activity;
private Location location;
private String locationName;
public int REQUEST_CODE_TASK_RABBIT_LOCATION = 6;
public TaskRabbitLocationControlSet(final Fragment fragment , int viewLayout, int title, int setID, int type) {
super(fragment.getActivity(), viewLayout);
public TaskRabbitLocationControlSet(final Activity activity , int viewLayout, int title, int setID) {
super(activity, viewLayout);
this.setID = setID;
this.type = type;
this.fragment = fragment;
this.activity = activity;
// DependencyInjectionService.getInstance().inject(this);
REQUEST_CODE_TASK_RABBIT_LOCATION += setID;
displayText = (TextView) getDisplayView().findViewById(R.id.display_row_title);
displayText.setText(getActivity().getString(title));
displayText.setText(activity.getString(title));
displayEdit = (TextView) getDisplayView().findViewById(R.id.display_row_edit);
displayEdit.setText(getLocationText());
@ -54,19 +52,14 @@ public class TaskRabbitLocationControlSet extends TaskEditControlSet implements
@Override
public void onClick(View v) {
Intent mapIntent = new Intent(getActivity(), TaskRabbitMapActivity.class);
fragment.startActivityForResult(mapIntent, REQUEST_CODE_TASK_RABBIT_LOCATION);
Intent mapIntent = new Intent(activity, TaskRabbitMapActivity.class);
activity.startActivityForResult(mapIntent, REQUEST_CODE_TASK_RABBIT_LOCATION);
}
});
}
private Activity getActivity() {
return fragment.getActivity();
}
private void parseTaskLocation(JSONObject json) {
if (json == null) return;
@ -80,14 +73,13 @@ public class TaskRabbitLocationControlSet extends TaskEditControlSet implements
}
public String getLocationText () {
if (!TextUtils.isEmpty(locationName) && location != null)
return String.format("%S (%d : %d)", locationName, location.getLongitude(), location.getLatitude());
if (!TextUtils.isEmpty(locationName))
return locationName;
return "Current location";
return "Location is set";
}
public boolean activityResult (int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_TASK_RABBIT_LOCATION && resultCode == Activity.RESULT_OK) {
int lng = data.getIntExtra("lng", 0);
int lat = data.getIntExtra("lat", 0);
locationName = data.getStringExtra("name");
@ -115,7 +107,7 @@ public class TaskRabbitLocationControlSet extends TaskEditControlSet implements
private void getAddressFromLocation(Location location){
try {
Geocoder geocoder = new Geocoder(fragment.getActivity(), Locale.getDefault());
Geocoder geocoder = new Geocoder(activity, Locale.getDefault());
// Acquire a reference to the system Location Manager
List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
if (addresses != null){
@ -149,16 +141,19 @@ public class TaskRabbitLocationControlSet extends TaskEditControlSet implements
@Override
public void saveToJSON(JSONObject json, String key) throws JSONException {
json.put(key, getTaskLocation());
Log.d("LOCATION SAVE", json.toString());
}
@Override
public void writeToJSON(JSONObject json, String key) throws JSONException {
Log.d("LOCATION", "LOCEIJREGHSK");
JSONArray locations = json.optJSONArray("other_locations_attributes");
if (locations == null) {
locations = new JSONArray();
}
locations.put(getTaskLocation());
json.put("other_locations_attributes", locations);
Log.d("LOCATION", "LALALALAL" + json.toString());
}
@ -178,6 +173,7 @@ public class TaskRabbitLocationControlSet extends TaskEditControlSet implements
locationObject.put("lat", location.getLatitude());
}
else {
// TODO FIX THIS DON"T PUT IN ADDRESSES
locationObject.put("address", "300 Beale");
locationObject.put("city", "San Francisco");
locationObject.put("state", "CA");

@ -5,6 +5,8 @@ import java.util.Locale;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.location.Address;
import android.location.Geocoder;
@ -14,9 +16,10 @@ import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
@ -33,6 +36,7 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen
private MapController mapController;
public Location location;
private EditText searchText;
private TaskRabbitMapOverlayItem currentOverlayItem;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
@ -51,31 +55,33 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.icon_locale);
TaskRabbitMapOverlayItem itemizedoverlay = new TaskRabbitMapOverlayItem(drawable, this);
currentOverlayItem = new TaskRabbitMapOverlayItem(drawable, this);
GeoPoint point = null;
mapController = mapView.getController();
if(lastKnownLocation != null) {
point = new GeoPoint((int)(lastKnownLocation.getLatitude()*1E6),(int)(lastKnownLocation.getLongitude()*1E6));
}
else {
point = new GeoPoint(19240000,-99120000);
}
OverlayItem overlayitem = new OverlayItem(point, "Set this location", "Send this location to Task Rabbit!");
currentOverlayItem.addOverlay(overlayitem);
mapOverlays.add(currentOverlayItem);
OverlayItem overlayitem = new OverlayItem(point, "Set this location", "For the rabbits!");
itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
mapController.animateTo(point);
mapController.setZoom(17);
mapView.invalidate();
}
if ( !locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER ) || !locationManager.isProviderEnabled( LocationManager.NETWORK_PROVIDER )) {
buildAlertMessageNoGps();
}
mapController = mapView.getController();
mapController.animateTo(point);
mapController.setZoom(17);
mapView.invalidate();
searchText=(EditText)findViewById(R.id.search_text);
Button searchButton=(Button)findViewById(R.id.search_button);
ImageButton searchButton=(ImageButton)findViewById(R.id.search_button);
searchButton.setImageResource(android.R.drawable.ic_menu_search);
searchButton.setOnClickListener(new View.OnClickListener() {
@Override
@ -86,8 +92,32 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen
}
});
}
public String getSearchText() {
return searchText.getText().toString();
}
private void buildAlertMessageNoGps() {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("GPS needs to be enabled in order to add location based tasks. Do you want to enable it?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
dialog.cancel();
}
});
final AlertDialog alert = builder.create();
alert.show();
}
private final Handler handler = new Handler() {
@Override
@ -96,6 +126,7 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen
case 1:
mapView.invalidate();
currentOverlayItem.onTap(0);
// What to do when ready, example:
break;
case -1:
@ -131,16 +162,16 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen
(int) (addresses.get(0).getLongitude() * 1E6));
Drawable drawable = TaskRabbitMapActivity.this.getResources().getDrawable(R.drawable.icon_locale);
TaskRabbitMapOverlayItem itemizedoverlay = new TaskRabbitMapOverlayItem(drawable, TaskRabbitMapActivity.this);
currentOverlayItem = new TaskRabbitMapOverlayItem(drawable, TaskRabbitMapActivity.this);
mapController.animateTo(q);
mapController.setZoom(12);
OverlayItem overlayitem = new OverlayItem(q, "Set this location", "For the rabbits!");
itemizedoverlay.addOverlay(overlayitem);
currentOverlayItem.addOverlay(overlayitem);
List<Overlay> mapOverlays = mapView.getOverlays();
mapOverlays.clear();
mapOverlays.add(itemizedoverlay);
mapOverlays.add(currentOverlayItem);
Message successMessage = new Message();
successMessage.what = 1;
@ -169,11 +200,11 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen
private void updateLocationOverlay() {
if (location == null) { return; };
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.gl_alarm);
Drawable drawable = this.getResources().getDrawable(R.drawable.icon_locale);
TaskRabbitMapOverlayItem myItemizedOverlay = new TaskRabbitMapOverlayItem(drawable);
GeoPoint point = new GeoPoint((int)(location.getLatitude() * 1E6), (int)(location.getLongitude() * 1E6));
OverlayItem overlayitem = new OverlayItem(point, "Astrid!!", "WOrks!");
OverlayItem overlayitem = new OverlayItem(point, "Set this location", "For the rabbits!");
myItemizedOverlay.addOverlay(overlayitem);
mapOverlays.add(myItemizedOverlay);
}
@ -185,7 +216,9 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen
double lng = location.getLongitude();
this.location = location;
GeoPoint p = new GeoPoint((int) lat * 1000000, (int) lng * 1000000);
updateLocationOverlay();
mapController.animateTo(p);
}
}
@Override

@ -19,7 +19,7 @@ public class TaskRabbitMapOverlayItem extends ItemizedOverlay {
private final ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
private Drawable defaultMarker;
private Activity mActivity;
private TaskRabbitMapActivity mActivity;
private OverlayItem inDrag;
private int xDragImageOffset=0;
private int yDragImageOffset=0;
@ -33,7 +33,7 @@ public class TaskRabbitMapOverlayItem extends ItemizedOverlay {
super(boundCenterBottom(defaultMarker));
}
public TaskRabbitMapOverlayItem(Drawable defaultMarker, Activity activity) {
public TaskRabbitMapOverlayItem(Drawable defaultMarker, TaskRabbitMapActivity activity) {
super(boundCenterBottom(defaultMarker));
this.defaultMarker = defaultMarker;
mActivity = activity;
@ -88,6 +88,7 @@ public class TaskRabbitMapOverlayItem extends ItemizedOverlay {
Intent data = new Intent();
data.putExtra("lat",selectedItem.getPoint().getLatitudeE6());
data.putExtra("lng",selectedItem.getPoint().getLongitudeE6());
data.putExtra("name",mActivity.getSearchText());
mActivity.setResult(Activity.RESULT_OK, data);
mActivity.finish();
}

@ -1,26 +1,80 @@
package com.todoroo.astrid.taskrabbit;
import java.io.ByteArrayOutputStream;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.timsu.astrid.R;
import com.todoroo.astrid.actfm.ActFmCameraModule;
import com.todoroo.astrid.actfm.ActFmCameraModule.CameraResultCallback;
import com.todoroo.astrid.actfm.ActFmCameraModule.ClearImageCallback;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.taskrabbit.TaskRabbitActivity.ActivityResultSetListener;
import com.todoroo.astrid.taskrabbit.TaskRabbitActivity.TaskRabbitSetListener;
import com.todoroo.astrid.ui.PopupControlSet;
public class TaskRabbitNameControlSet extends PopupControlSet implements TaskRabbitSetListener, ActivityResultSetListener{
import com.todoroo.astrid.taskrabbit.TaskRabbitControlSet.TaskRabbitSetListener;
import com.todoroo.astrid.ui.EditNotesControlSet;
protected final EditText editText;
protected final TextView notesPreview;
private final LinearLayout notesBody;
private final ImageButton pictureButton;
private Bitmap pendingCommentPicture = null;
private int cameraButton;
public class TaskRabbitNameControlSet extends EditNotesControlSet implements TaskRabbitSetListener{
public TaskRabbitNameControlSet(Activity activity, int viewLayout,
int displayViewLayout, int titleID, int i) {
super(activity, viewLayout, displayViewLayout);
displayText.setText("Restaurant name");
}
super(activity, viewLayout, displayViewLayout, titleID);
editText = (EditText) getView().findViewById(R.id.notes);
notesPreview = (TextView) getDisplayView().findViewById(R.id.display_row_edit);
notesBody = (LinearLayout) getDisplayView().findViewById(R.id.notes_body);
dialog.getWindow()
.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
displayText.setText(activity.getString(titleID));;
editText.setMaxLines(Integer.MAX_VALUE);
@Override
public void readFromModel(JSONObject json, String key) {
editText.setTextKeepState(json.optString(key, ""));
notesPreview.setText(json.optString(key, ""));
pictureButton = (ImageButton) getDisplayView().findViewById(R.id.picture);
if (pictureButton != null) {
final ClearImageCallback clearImage = new ClearImageCallback() {
@Override
public void clearImage() {
pendingCommentPicture = null;
pictureButton.setImageResource(R.drawable.camera_button);
}
};
pictureButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (pendingCommentPicture != null)
ActFmCameraModule.showPictureLauncher(TaskRabbitNameControlSet.this.activity, clearImage);
else
ActFmCameraModule.showPictureLauncher(TaskRabbitNameControlSet.this.activity, null);
}
});
}
}
@Override
@ -30,9 +84,99 @@ public class TaskRabbitNameControlSet extends EditNotesControlSet implements Tas
@Override
public void writeToJSON(JSONObject json, String key) throws JSONException {
json.put(key, editText.getText().toString());
String nameKey = activity.getString(R.string.tr_set_key_description);
if (key.equals(activity.getString(R.string.tr_set_key_name)) && json.has(nameKey)) {
json.put(nameKey, json.optString(nameKey, "") + "\nRestaurant Name: " + editText.getText().toString());
}
else {
json.put(nameKey, json.optString(nameKey, "") + "\n" + editText.getText().toString());
}
if (pendingCommentPicture != null) {
String picture = buildPictureData(pendingCommentPicture);
JSONObject pictureArray = new JSONObject();
pictureArray.put("image", picture);
json.put("uploaded_photos_attributes", new JSONObject().put("1", pictureArray));
Log.d("The task json", json.toString());
}
}
public static String buildPictureData(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if(bitmap.getWidth() > 512 || bitmap.getHeight() > 512) {
float scale = Math.min(512f / bitmap.getWidth(), 512f / bitmap.getHeight());
bitmap = Bitmap.createScaledBitmap(bitmap, (int)(scale * bitmap.getWidth()),
(int)(scale * bitmap.getHeight()), false);
}
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, baos);
byte[] bytes = baos.toByteArray();
return Base64.encodeToString(bytes, Base64.DEFAULT);
}
@Override
public void readFromModel(JSONObject json, String key) {
if (json.optInt(key, -1) == 0) {
editText.setHint(displayText.getText().toString());
return;
}
String value = json.optString(key, "");
if (!TextUtils.isEmpty(value)) {
editText.setTextKeepState(value);
notesPreview.setText(value);
}
}
@Override
public boolean activityResult (int requestCode, int resultCode, Intent data) {
if (pictureButton != null) {
CameraResultCallback callback = new CameraResultCallback() {
@Override
public void handleCameraResult(Bitmap bitmap) {
Log.d("CAMERA CLALLBACK", "PICTURE SHOULD BE SET");
pendingCommentPicture = bitmap;
pictureButton.setImageBitmap(pendingCommentPicture);
}
};
return (ActFmCameraModule.activityResult(activity,
requestCode, resultCode, data, callback));
}
return false;
}
@Override
protected void refreshDisplayView() {
notesPreview.setText(editText.getText());
}
@Override
public void readFromTask(Task task) {
}
@Override
public String writeToModel(Task task) {
return null;
}
@Override
protected void onOkClick() {
super.onOkClick();
InputMethodManager imm = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
@Override
protected void onCancelClick() {
super.onCancelClick();
InputMethodManager imm = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
public boolean hasNotes() {
return !TextUtils.isEmpty(editText.getText());
}
}

@ -1,78 +0,0 @@
package com.todoroo.astrid.taskrabbit;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.widget.TextView;
import com.timsu.astrid.R;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.ui.PopupControlSet;
public class TaskRabbitRow extends PopupControlSet{
private final int setID;
private final int type;
private final TextView body;
public TaskRabbitRow(Activity activity, int viewLayout, int displayViewLayout, int setID, int type, final String title) {
super(activity, viewLayout, displayViewLayout, title);
this.setID = setID;
this.type = type;
body = (TextView) getDisplayView().findViewById(R.id.display_row_edit);
}
public void setBody(String desc) {
body.setText(desc);
}
public void showPopupForRow() {
return;
}
@Override
protected void refreshDisplayView() {
// TODO Auto-generated method stub
}
public boolean populateFromTask (TaskRabbitTaskContainer task) {
if (task != null) {
String[] types = activity.getResources().getStringArray(R.array.tr_default_set_key);
JSONObject trJSON = task.getLocalTaskData();
try {
trJSON.getString(types[setID]);
body.setText(trJSON.getString(types[setID]));
return true;
} catch (JSONException e) {
e.printStackTrace();
}
}
return false;
}
public void readFromTask(TaskRabbitTaskContainer task) {
if (!populateFromTask(task)) {
return;
}
body.setText("Whats up dowg");
}
@Override
public String writeToModel(Task task) {
return body.getText().toString();
}
@Override
public void readFromTask(Task task) {
// TODO Auto-generated method stub
}
}

@ -5,9 +5,12 @@ import org.json.JSONObject;
import android.app.Activity;
import android.content.res.TypedArray;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
@ -15,62 +18,112 @@ import android.widget.TextView;
import com.timsu.astrid.R;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.helper.TaskEditControlSet;
import com.todoroo.astrid.taskrabbit.TaskRabbitControlSet.TaskRabbitSetListener;
import com.todoroo.astrid.taskrabbit.TaskRabbitActivity.TaskRabbitSetListener;
public class TaskRabbitSpinnerControlSet extends TaskEditControlSet implements TaskRabbitSetListener{
private final Spinner spinner;
private final int setID;
private final int type;
private final int titleID;
private final TextView displayText;
private final Fragment fragment;
private final ArrayAdapter adapter;
private final TextView displayEdit;
private ArrayAdapter adapter;
private final Activity activity;
public TaskRabbitSpinnerControlSet(final Fragment fragment, int viewLayout, int title, int setID, int type) {
super(fragment.getActivity(), viewLayout);
public TaskRabbitSpinnerControlSet(final Activity activity, int viewLayout, int title, int setID) {
super(activity, viewLayout);
this.setID = setID;
this.type = type;
this.fragment = fragment;
this.titleID = title;
this.activity = activity;
// DependencyInjectionService.getInstance().inject(this);
spinner = (Spinner)getView().findViewById(R.id.display_row_edit);
spinner.setPrompt(getActivity().getString(title));
// spinner = new Spinner(fragment.activity);
spinner = (Spinner) getDisplayView().findViewById(R.id.spinner);
spinner.setPrompt(activity.getString(title));
displayEdit = (TextView) getDisplayView().findViewById(R.id.display_row_edit);
displayText = (TextView) getDisplayView().findViewById(R.id.display_row_title);
displayText.setText(title);
String[] listTypes;
if (title == R.string.tr_set_named_price){
listTypes = getStringDefaultArray(type, R.array.tr_default_price_type_array);
}
else {
listTypes = getStringDefaultArray(setID, R.array.tr_default_array);
}
String[] listTypes = getStringDefaultArray(setID, R.array.tr_default_array);
adapter = new ArrayAdapter<String>(
getActivity(), android.R.layout.simple_spinner_item, listTypes);
activity, android.R.layout.simple_spinner_item, listTypes);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
getActivity().runOnUiThread(new Runnable() {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
spinner.setAdapter(adapter);
spinner.setSelection(0); // plus 1 for the no selection item
}
});
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
Log.d("SELECTED ITEM", "SLECTED :" + arg2 + " ACTUAL: " + spinner.getSelectedItemPosition() + " STRING: " + spinner.getSelectedItem().toString());
displayEdit.setText(getDisplayEditText());
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
Log.d("SELECTED ITEM", " ACTUAL: " + spinner.getSelectedItemPosition());
getView().setOnClickListener(getDisplayClickListener());
}
protected OnClickListener getDisplayClickListener() {
return new OnClickListener() {
@Override
public void onClick(View v) {
spinner.performClick();
}
};
}
public String[] getStringDefaultArray(int position, int arrayType) {
TypedArray arrays = getActivity().getResources().obtainTypedArray(arrayType);
TypedArray arrays = activity.getResources().obtainTypedArray(arrayType);
int arrayID = arrays.getResourceId(position, -1);
return getActivity().getResources().getStringArray(arrayID);
return activity.getResources().getStringArray(arrayID);
}
public void resetAdapter(String[] items) {
if (adapter == null) return;
adapter = new ArrayAdapter<String>(
activity, android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
spinner.setAdapter(adapter);
spinner.setSelection(0); // plus 1 for the no selection item
}
});
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
private Activity getActivity() {
return fragment.getActivity();
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
Log.d("SELECTED ITEM", "SLECTED :" + arg2 + " ACTUAL: " + spinner.getSelectedItemPosition() + " STRING: " + spinner.getSelectedItem().toString());
displayEdit.setText(getDisplayEditText());
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
public int selectedPosition() {
@ -79,11 +132,35 @@ public class TaskRabbitSpinnerControlSet extends TaskEditControlSet implements T
@Override
public void readFromModel(JSONObject json, String key) {
int intValue = json.optInt(key);
if (intValue < spinner.getCount())
if (titleID == R.string.tr_set_named_price && json.has(activity.getString(R.string.tr_set_key_type))){
String[] listTypes = getStringDefaultArray(json.optInt(activity.getString(R.string.tr_set_key_type), 0), R.array.tr_default_price_type_array);
resetAdapter(listTypes);
}
else if (titleID == R.string.tr_set_skill_required && json.has(activity.getString(R.string.tr_set_key_type))){
String[] listTypes = getStringDefaultArray(json.optInt(activity.getString(R.string.tr_set_key_type), 0), R.array.tr_default_skill_type_array);
resetAdapter(listTypes);
}
int intValue = json.optInt(key, 0);
Log.d("iii", "" + spinner.getCount());
if (intValue < spinner.getCount()) {
spinner.setSelection(intValue);
displayEdit.setText(getDisplayEditText());
}
Log.d("dfhjskhfds", ""+intValue);
}
private String getDisplayEditText() {
if(titleID == R.string.tr_set_cost_in_cents) {
return activity.getResources().getStringArray(R.array.tr_default_cost_in_cents_display)[spinner.getSelectedItemPosition()];
}
else {
return spinner.getSelectedItem().toString();
}
}
@Override
public void saveToJSON(JSONObject json, String key) throws JSONException {
json.put(key, spinner.getSelectedItemPosition());

@ -42,17 +42,28 @@ public class TaskRabbitTaskContainer extends SyncContainer {
return getJSONData(TaskRabbitMetadata.DATA_REMOTE);
}
public String getTaskID() {
return trTask.getValue(TaskRabbitMetadata.ID);
public int getTaskID() {
try {
int taskID = Integer.parseInt(trTask.getValue(TaskRabbitMetadata.ID));
if(taskID > 0)
return taskID;
}
catch (Exception e) {
e.printStackTrace();
}
return 0;
}
private JSONObject getJSONData(StringProperty key) {
String jsonString = trTask.getValue(key);
if (!TextUtils.isEmpty(jsonString)) {
try {
return new JSONObject(jsonString);
} catch (Exception e) {
Log.e("Task Rabbit task container", //$NON-NLS-1$
e.toString());
if(trTask.containsNonNullValue(key)) {
String jsonString = trTask.getValue(key);
if (!TextUtils.isEmpty(jsonString)) {
try {
return new JSONObject(jsonString);
} catch (Exception e) {
Log.e("Task Rabbit task container", //$NON-NLS-1$
e.toString());
}
}
}
return null;

@ -25,12 +25,12 @@
android:text="@string/TEA_note_label" />
<com.todoroo.astrid.ui.TextViewWithMeasureListener
android:id="@+id/notes_display"
android:id="@+id/display_row_edit"
style="@style/TextAppearance.EditRowDisplay"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="right"
android:gravity="left"
android:paddingLeft="10dip" />
</LinearLayout>

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- notes -->
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="100" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ImageButton
android:id="@+id/picture"
android:layout_width="40dip"
android:layout_height="40dip"
android:background="#00000000"
android:paddingLeft="7dip"
android:scaleType="centerInside"
android:src="@drawable/camera_button" />
<!-- Voice Add Note Button -->
<ImageButton
android:id="@+id/voiceAddNoteButton"
android:layout_width="40dip"
android:layout_height="40dip"
android:background="#00000000"
android:paddingLeft="7dip"
android:scaleType="centerInside"
android:src="@android:drawable/ic_btn_speak_now"
android:visibility="gone" />
</LinearLayout>
<EditText
android:id="@+id/notes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="9dip"
android:layout_marginRight="9dip"
android:layout_weight="100"
android:autoText="true"
android:capitalize="sentences"
android:freezesText="true"
android:gravity="top"
android:hint="@string/TEA_notes_hint"
android:scrollbars="vertical"
android:singleLine="false" />
</LinearLayout>
</ScrollView>
<include layout="@layout/control_dialog_ok" />
</LinearLayout>

@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:astrid="http://schemas.android.com/apk/res/com.timsu.astrid"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:astrid="http://schemas.android.com/apk/res/com.timsu.astrid"
style="@style/Content_EditScroll"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="100"
android:orientation="vertical" >
<ScrollView
android:id="@+id/edit_scroll"
style="@style/Content_EditScroll"
android:layout_width="fill_parent"
@ -9,39 +16,68 @@
<LinearLayout
android:id="@+id/task_rabbit_parent"
style="@style/Content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
style="@style/TextAppearance.GEN_EditLabel.DLG_EditLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/TEA_reminder_alarm_label" />
android:background="#00000000"
android:orientation="vertical"
android:padding="10dip" >
<Spinner
android:id="@+id/task_type"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
android:layout_height="wrap_content"
android:visibility="gone" />
<LinearLayout
android:id="@+id/title_controls"
style="@style/EditRow"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<com.todoroo.astrid.ui.ErrorCatchingEditText
android:id="@+id/task_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="100"
android:autoText="true"
android:background="@drawable/edit_title_background"
android:capitalize="sentences"
android:freezesText="true"
android:hint="@string/TEA_title_hint"
android:inputType="textMultiLine"
android:paddingLeft="5dip"
android:paddingTop="3dip"
android:scrollbars="vertical"
android:text=""
android:textColor="@android:color/black" />
</LinearLayout>
<LinearLayout
android:id="@+id/task_controls"
style="@style/EditRow"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dip"
android:orientation="vertical" />
<EditText
android:id="@+id/task_description"
android:layout_width="match_parent"
android:layout_height="300dip"
android:hint="Description" />
<Button
android:id="@+id/task_button"
android:layout_width="match_parent"
<LinearLayout
android:id="@+id/description_controls"
style="@style/EditRow"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Send Task!" />
android:layout_marginTop="10dip"
android:orientation="vertical" >
</LinearLayout>
</LinearLayout>
</ScrollView>
<Button
android:id="@+id/task_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:text="Post Task!" />
</ScrollView>
</LinearLayout>

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<RelativeLayout
android:id="@+id/menu_nav"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_margin="5dip"
android:gravity="center_vertical"
android:paddingLeft="5dip"
android:paddingRight="5dip" >
<TextView
android:id="@+id/task_rabbit_title"
style="@style/TextAppearance.ActionBar_ListsHeader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="end"
android:gravity="center_vertical"
android:singleLine="true"
android:text="@string/BFE_Active" />
<ImageView
android:id="@+id/menu_disclosure_arrow"
android:layout_width="12dip"
android:layout_height="12dip"
android:layout_alignBottom="@id/task_rabbit_title"
android:layout_marginLeft="10dip"
android:layout_toRightOf="@id/task_rabbit_title"
android:scaleType="fitCenter"
android:src="?attr/asListsDisclosure" />
</RelativeLayout>
</LinearLayout>

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
android:layout_height="fill_parent"
android:orientation="vertical"
style="@style/Content_EditScroll" >
<com.google.android.maps.MapView
android:id="@+id/map_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="9"
android:layout_height="wrap_content"
android:layout_weight="12"
android:apiKey="0J-miH1uUbgW2wG77C9qZiqvpBW8FEnoRnn7qBw"
android:clickable="true" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_height="wrap_content" >
android:minHeight="50dip" >
<EditText
android:id="@+id/search_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="46 Watertree Ct. The Woodlands TX 77380"
android:layout_weight="3" />
android:layout_height="fill_parent"
android:layout_weight="10"
android:hint="Enter address"/>
<Button
<ImageButton
android:id="@+id/search_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Search"
android:layout_weight="1" />
android:layout_width="50dip"
android:layout_height="50dip"
android:layout_weight="1"
android:scaleType="center" />
</LinearLayout>
</LinearLayout>
</LinearLayout>

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dip">
<FrameLayout
android:id="@+id/content"
android:layout_width="280dip"
android:layout_height="wrap_content"
android:background="@drawable/list_popover_bg"
android:layout_below="@+id/gdi_arrow_up"/>
<ImageView
android:id="@+id/gdi_arrow_up"
android:layout_width="27dip"
android:layout_height="27dip"
android:scaleType="fitCenter"
android:layout_marginBottom="-8dip"
android:src="@drawable/list_arrow_up" />
<ImageView
android:id="@+id/gdi_arrow_down"
android:layout_width="27dip"
android:layout_height="27dip"
android:scaleType="fitCenter"
android:layout_marginBottom="-8dip"
android:layout_below="@android:id/list"
android:src="@drawable/list_arrow_down" />
</RelativeLayout>

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/TextAppearance.FLA_Filter"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="left|center_vertical"
android:padding="10dp"
android:paddingBottom="5dip"
android:paddingRight="6dip"
android:paddingTop="5dip"
android:textSize="16sp" >
</TextView>

@ -1,19 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/display_row_title"
android:layout_width="wrap_content"
<LinearLayout
android:id="@+id/display_row_body"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello" />
android:minHeight="50dip"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="10dip"
android:paddingRight="10dip" >
<TextView
android:id="@+id/display_row_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Friend" />
<TextView
android:id="@+id/display_row_title"
style="@style/TextAppearance.GEN_EditLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dip" />
<TextView
android:id="@+id/display_row_edit"
style="@style/TextAppearance.EditRowDisplay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="right"
android:maxLines="2"
android:paddingLeft="5dip" />
</LinearLayout>
<View
android:id="@+id/TEA_Separator"
style="@style/TEA_Separator"
android:layout_width="fill_parent"
android:layout_height="1px" />
</LinearLayout>
</LinearLayout>

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/display_row_body"
android:minHeight="50dip"
android:padding="10dip" >
<TextView
android:id="@+id/display_row_title"
style="@style/TextAppearance.GEN_EditLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="50dip"
android:orientation="horizontal"
android:paddingLeft="10dip"
android:paddingRight="10dip" >
<ImageButton
android:id="@+id/picture"
android:layout_width="40dip"
android:layout_height="40dip"
android:background="#00000000"
android:scaleType="centerInside"
android:layout_marginRight="10dip"
android:src="@drawable/camera_button" />
<!-- Voice Add Note Button -->
<ImageButton
android:id="@+id/voiceAddNoteButton"
android:layout_width="40dip"
android:layout_height="40dip"
android:background="#00000000"
android:layout_marginRight="10dip"
android:scaleType="centerInside"
android:src="@android:drawable/ic_btn_speak_now"
android:visibility="gone" />
<TextView
android:id="@+id/display_row_edit"
style="@style/TextAppearance.EditRowDisplay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="top"
android:gravity="left"
android:text="Enter description..."
android:paddingLeft="5dip"
android:layout_marginTop="10dip"
android:layout_marginBottom="10dip" />
</LinearLayout>
</LinearLayout>

@ -1,23 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/display_row_title"
android:layout_width="wrap_content"
<LinearLayout
android:id="@+id/display_row_body"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello" />
<Spinner xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/display_row_edit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:spinnerMode="dropdown"
android:background="#00000000" >
android:minHeight="50dip"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="10dip"
android:paddingRight="5dip" >
<Spinner
android:id="@+id/spinner"
android:layout_width="0dip"
android:layout_height="0dip" />
<TextView
android:id="@+id/display_row_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/TextAppearance.GEN_EditLabel" />
<TextView
android:id="@+id/display_row_edit"
style="@style/TextAppearance.EditRowDisplay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="right"
android:maxLines="2"
android:paddingLeft="5dip" />
</LinearLayout>
</Spinner>
<View
android:id="@+id/TEA_Separator"
style="@style/TEA_Separator"
android:layout_width="fill_parent"
android:layout_height="1px" />
</LinearLayout>

@ -37,10 +37,10 @@
<item>@array/tr_default_type_delivery</item>
<item>@array/tr_default_type_handyman</item>
<item>@array/tr_default_type_shopping</item>
<item>@array/tr_default_type_something_else</item>
</array>
<array name="tr_default_type_virtual">
<item>0</item>
<item>-1</item>
<item>-1</item>
<item>4</item>
@ -49,10 +49,10 @@
<item>10</item>
<item>-1</item>
<item>0</item>
<item>25</item>
<item>2</item>
<item>0</item>
</array>
<array name="tr_default_type_food_delivery">
<item>1</item>
<item>0</item>
<item>-1</item>
<item>-1</item>
@ -61,10 +61,10 @@
<item>10</item>
<item>0</item>
<item>1</item>
<item>20</item>
<item>2</item>
<item>0</item>
</array>
<array name="tr_default_type_cleaning">
<item>2</item>
<item>-1</item>
<item>0</item>
<item>-1</item>
@ -73,10 +73,10 @@
<item>10</item>
<item>-1</item>
<item>0</item>
<item>25</item>
<item>2</item>
<item>0</item>
</array>
<array name="tr_default_type_donations">
<item>3</item>
<item>-1</item>
<item>0</item>
<item>-1</item>
@ -85,10 +85,10 @@
<item>10</item>
<item>0</item>
<item>0</item>
<item>25</item>
<item>2</item>
<item>0</item>
</array>
<array name="tr_default_type_delivery">
<item>4</item>
<item>-1</item>
<item>0</item>
<item>-1</item>
@ -97,10 +97,10 @@
<item>10</item>
<item>0</item>
<item>0</item>
<item>25</item>
<item>2</item>
<item>0</item>
</array>
<array name="tr_default_type_handyman">
<item>5</item>
<item>-1</item>
<item>0</item>
<item>2</item>
@ -109,10 +109,10 @@
<item>10</item>
<item>-1</item>
<item>1</item>
<item>50</item>
<item>2</item>
<item>0</item>
</array>
<array name="tr_default_type_shopping">
<item>6</item>
<item>-1</item>
<item>0</item>
<item>-1</item>
@ -121,12 +121,12 @@
<item>10</item>
<item>0</item>
<item>2</item>
<item>20</item>
<item>2</item>
<item>0</item>
</array>
<array name="tr_default_type_something_else">
<item>7</item>
<item>0</item>
<item>-1</item>
<item>0</item>
<item>-1</item>
<item>-1</item>
@ -134,7 +134,8 @@
<item>10</item>
<item>0</item>
<item>2</item>
<item>20</item>
<item>2</item>
<item>0</item>
</array>
@ -159,7 +160,6 @@
<string-array name="tr_default_set">
<item>@string/tr_set_type</item>
<item>@string/tr_set_name</item>
<item>@string/tr_set_location</item>
<item>@string/tr_set_skill_required</item>
@ -169,6 +169,7 @@
<item>@string/tr_set_drop_off</item>
<item>@string/tr_set_cost_in_cents</item>
<item>@string/tr_set_named_price</item>
<item>@string/tr_set_description</item>
</string-array>
<!-- Control set title (do not translate) -->
@ -181,11 +182,11 @@
<string name="tr_set_deadline">Deadline</string>
<string name="tr_set_drop_off">Dropoff</string>
<string name="tr_set_cost_in_cents">Expenses</string>
<string name="tr_set_named_price">I will Pay</string>
<string name="tr_set_named_price">I\'ll Pay</string>
<string name="tr_set_description">Description</string>
<string-array name="tr_default_set_key">
<item>@string/tr_set_key_type</item>
<item>@string/tr_set_key_name</item>
<item>@string/tr_set_key_location</item>
<item>@string/tr_set_key_skill_required</item>
@ -195,11 +196,12 @@
<item>@string/tr_set_key_drop_off</item>
<item>@string/tr_set_key_cost_in_cents</item>
<item>@string/tr_set_key_named_price</item>
<item>@string/tr_set_key_description</item>
</string-array>
<!-- Control set key for json (do not translate) -->
<string name="tr_set_key_type">name</string>
<string name="tr_set_key_name">name:specific</string>
<string name="tr_set_key_type">type</string>
<string name="tr_set_key_name">name</string>
<string name="tr_set_key_location">location</string>
<string name="tr_set_key_skill_required">description:skill_required</string>
<string name="tr_set_key_duration">description:duration</string>
@ -212,23 +214,46 @@
<array name="tr_default_array">
<item>@array/tr_empty_string_array</item>
<item>@array/tr_empty_string_array</item>
<item>@string/tr_location</item>
<item>@array/tr_default_skill</item>
<item>@string/tr_set_key_name</item>
<item>@string/tr_set_key_location</item>
<item>@array/tr_default_skill_virtual</item>
<item>@array/tr_default_duration</item>
<item>@array/tr_default_supplies</item>
<item>@string/tr_deadline</item>
<item>@string/tr_location</item>
<item>@string/tr_set_key_deadline</item>
<item>@string/tr_set_key_location</item>
<item>@array/tr_default_cost_in_cents</item>
<item>@array/tr_default_named_price</item>
<item>@string/tr_set_key_description</item>
</array>
<!-- Default options -->
<string-array name="tr_default_skill">
<array name="tr_default_skill_type_array">
<item>@array/tr_default_skill_virtual</item>
<item>@array/tr_default_named_price</item>
<item>@array/tr_type_default_price_cleaning</item>
<item>@array/tr_default_named_price</item>
<item>@array/tr_default_named_price</item>
<item>@array/tr_default_skill_handyman</item>
<item>@array/tr_default_named_price</item>
<item>@array/tr_default_named_price</item>
</array>
<string-array name="tr_default_skill_virtual">
<item>@string/tr_default_skill_research</item>
<item>@string/tr_default_skill_phone_calls</item>
<item>@string/tr_default_skill_event_planning</item>
<item>@string/tr_default_skill_usability_testing</item>
<item>@string/tr_default_skill_craigslist</item>
<item>@string/tr_default_skill_help</item>
<item>@string/tr_default_skill_ebay_help</item>
</string-array>
<string-array name="tr_default_skill_handyman">
<item>@string/tr_default_skill_research</item>
<item>@string/tr_default_skill_phone_calls</item>
<item>@string/tr_default_skill_event_planning</item>
@ -246,6 +271,7 @@
<string name="tr_default_skill_craigslist">Craigslist</string>
<string name="tr_default_skill_help">Help</string>
<string name="tr_default_skill_ebay_help">eBay Help</string>
<string name="tr_default_skill_carpentry">Carpentry</string>
<string name="tr_default_skill_assembly_repair">Assembly and Repair</string>
<string name="tr_default_skill_plumbing">Plumbing</string>
@ -270,6 +296,13 @@
<item>@string/tr_default_cost_in_cents_100</item>
<item>@string/tr_default_cost_in_cents_101</item>
</string-array>
<string-array name="tr_default_cost_in_cents_display">
<item>@string/tr_default_cost_in_cents_0_display</item>
<item>@string/tr_default_cost_in_cents_25_display</item>
<item>@string/tr_default_cost_in_cents_50_display</item>
<item>@string/tr_default_cost_in_cents_100_display</item>
<item>@string/tr_default_cost_in_cents_101_display</item>
</string-array>
<!-- cost_in_cents -->
<string name="tr_default_cost_in_cents_0">$0</string>
@ -278,21 +311,14 @@
<string name="tr_default_cost_in_cents_100">Less than $100</string>
<string name="tr_default_cost_in_cents_101">More than $100</string>
<!-- cost_in_cents display -->
<string name="tr_default_cost_in_cents_0_display">$0</string>
<string name="tr_default_cost_in_cents_25_display">&lt; $25</string>
<string name="tr_default_cost_in_cents_50_display">&lt; $50</string>
<string name="tr_default_cost_in_cents_100_display">&lt; $100</string>
<string name="tr_default_cost_in_cents_101_display">&gt; $100</string>
<string-array name="tr_default_named_price">
<item>@string/tr_default_named_price_10</item>
<item>@string/tr_default_named_price_20</item>
<item>@string/tr_default_named_price_30</item>
<item>@string/tr_default_named_price_40</item>
</string-array>
<!-- named_price -->
<string name="tr_default_named_price_10">$10</string>
<string name="tr_default_named_price_20">$20</string>
<string name="tr_default_named_price_30">$30</string>
<string name="tr_default_named_price_40">$40</string>
<string name="tr_default_named_price_50">$50</string>
<string name="tr_default_named_price_60">$60</string>
<string name="tr_default_named_price_70">$70</string>
<string-array name="tr_default_duration">
@ -310,11 +336,6 @@
<string name="tr_default_duration_10">I do not know</string>
<string-array name="tr_empty_string_array"></string-array>
<string name="tr_location">tr_location</string>
<string name="tr_deadline">tr_deadline</string>
<string name="tr_name">tr_name</string>
@ -322,13 +343,13 @@
<array name="tr_default_price_type_array">
<item>@array/tr_type_default_price_virtual</item>
<item>@array/tr_type_default_price_food_delivery</item>
<item>@array/tr_default_named_price</item>
<item>@array/tr_type_default_price_cleaning</item>
<item>@array/tr_type_default_price_food_delivery</item>
<item>@array/tr_type_default_price_food_delivery</item>
<item>@array/tr_default_named_price</item>
<item>@array/tr_default_named_price</item>
<item>@array/tr_type_default_price_handyman</item>
<item>@array/tr_type_default_price_food_delivery</item>
<item>@array/tr_type_default_price_food_delivery</item>
<item>@array/tr_default_named_price</item>
<item>@array/tr_default_named_price</item>
</array>
<string-array name="tr_type_default_price_virtual">
@ -341,7 +362,7 @@
<item>$55</item>
</string-array>
<string-array name="tr_type_default_price_food_delivery">
<string-array name="tr_default_named_price">
<item>$10</item>
<item>$15</item>
<item>$20</item>

@ -86,4 +86,7 @@
For free, you get online backup, full synchronization with Astrid.com, the
ability to add tasks via email, and you can even share task lists with friends!</string>
<!-- Shown after user goes to task rabbit activity-->
<string name="help_popover_add_lists">Change your type here</string>
</resources>

@ -508,7 +508,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
// EditPeopleControlSet relies on the "tags" transitory created by the
// TagsControlSet, so we put the tags control before the people control
taskRabbitControl = new TaskRabbitControlSet(this, R.layout.task_rabbit_enter, R.layout.control_set_default_display);
taskRabbitControl = new TaskRabbitControlSet(this, R.layout.control_set_default_display);
controls.add(taskRabbitControl);
controls.add(peopleControlSet = new EditPeopleControlSet(getActivity(), this,
@ -517,7 +517,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
R.string.actfm_EPA_assign_label_long, REQUEST_LOG_IN));
controlSetMap.put(getString(R.string.TEA_ctrl_who_pref),
peopleControlSet);
peopleControlSet.addListener(taskRabbitControl);
peopleControlSet.addListener(taskRabbitControl);
RepeatControlSet repeatControls = new RepeatControlSet(getActivity(),
@ -1102,10 +1102,10 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (editNotes != null && editNotes.activityResult(requestCode, resultCode, data)) {
if (taskRabbitControl != null && taskRabbitControl.activityResult(requestCode, resultCode, data)) {
return;
}
else if (taskRabbitControl != null && taskRabbitControl.activityResult(requestCode, resultCode, data)) {
else if (editNotes != null && editNotes.activityResult(requestCode, resultCode, data)) {
return;
}
else if (requestCode == REQUEST_VOICE_RECOG
@ -1277,7 +1277,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
// EditNoteActivity Lisener when there are new updates/comments
@Override
public void updatesChanged() {
public void updatesChanged() {
setCurrentTab(TAB_VIEW_UPDATES);
this.setPagerHeightForPosition(TAB_VIEW_UPDATES);
}

@ -25,7 +25,7 @@ public class EditNotesControlSet extends PopupControlSet {
public EditNotesControlSet(Activity activity, int viewLayout, int displayViewLayout) {
super(activity, viewLayout, displayViewLayout, R.string.TEA_note_label);
editText = (EditText) getView().findViewById(R.id.notes);
notesPreview = (TextViewWithMeasureListener) getDisplayView().findViewById(R.id.notes_display);
notesPreview = (TextViewWithMeasureListener) getDisplayView().findViewById(R.id.display_row_edit);
notesBody = (LinearLayout) getDisplayView().findViewById(R.id.notes_body);
dialog.getWindow()
.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

@ -32,7 +32,7 @@ public abstract class PopupControlSet extends TaskEditControlSet {
this.displayView = LayoutInflater.from(activity).inflate(displayViewLayout, null);
displayText = (TextView) displayView.findViewById(R.id.display_row_title);
if (displayText != null) {
displayText.setMaxLines(2);
displayText.setMaxLines(2);
}
}
else {
@ -66,46 +66,6 @@ public abstract class PopupControlSet extends TaskEditControlSet {
displayView.setOnClickListener(getDisplayClickListener());
}
}
public PopupControlSet(Activity activity, int viewLayout, int displayViewLayout, String title) {
super(activity, viewLayout);
if (displayViewLayout != -1){
this.displayView = LayoutInflater.from(activity).inflate(displayViewLayout, null);
displayText = (TextView) displayView.findViewById(R.id.display_row_title);
if (displayText != null) {
displayText.setMaxLines(2);
}
}
else {
this.displayView = null;
this.displayText = null;
}
final DialogInterface.OnClickListener okListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int which) {
onOkClick();
}
};
final DialogInterface.OnCancelListener cancelListener = new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface d) {
onCancelClick();
}
};
this.activity = activity;
dialog = buildDialog(title, okListener, cancelListener);
if (displayView != null) {
displayView.setOnClickListener(getDisplayClickListener());
}
}
@Override
public View getDisplayView() {
return displayView;

@ -40,7 +40,7 @@ public abstract class AbstractModel {
protected ContentValues setValues = new ContentValues();
/** Cached values from database */
private ContentValues values = new ContentValues();
private final ContentValues values = new ContentValues();
/** Cursor into the database */
private Cursor cursor = null;
@ -191,6 +191,7 @@ public abstract class AbstractModel {
return value;
} catch (Exception e) {
// error reading from cursor, try to continue
e.printStackTrace();
}
}

Loading…
Cancel
Save