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" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<!-- Task Rabbit -->
<activity android:name="com.todoroo.astrid.taskrabbit.TaskRabbitControlSet"></activity> <activity android:name="com.todoroo.astrid.taskrabbit.TaskRabbitControlSet"></activity>
<activity android:name="com.todoroo.astrid.taskrabbit.TaskRabbitMapActivity"></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:windowSoftInputMode="stateHidden"
android:screenOrientation="portrait"></activity> android:screenOrientation="portrait"></activity>
<!-- Uses Library --> <!-- Uses Library -->
<uses-library android:name="com.google.android.maps" /> <uses-library android:name="com.google.android.maps" />
</application> </application>

@ -112,10 +112,12 @@ public class EditPeopleControlSet extends PopupControlSet {
private final List<AssignedChangedListener> listeners = new LinkedList<AssignedChangedListener>(); private final List<AssignedChangedListener> listeners = new LinkedList<AssignedChangedListener>();
public interface AssignedChangedListener { public interface AssignedChangedListener {
public void assignedChanged(String name, JSONObject json); public boolean showTaskRabbitForUser(String name, JSONObject json);
public boolean shouldShowTaskRabbit(); public boolean shouldShowTaskRabbit();
} }
int selected = 0; //need to remember last selected state for task rabbit
static { static {
AstridDependencyInjector.initialize(); AstridDependencyInjector.initialize();
} }
@ -390,7 +392,7 @@ public class EditPeopleControlSet extends PopupControlSet {
} }
} }
final int selected = assignedIndex; selected = assignedIndex;
final AssignedUserAdapter usersAdapter = new AssignedUserAdapter(activity, listValues); final AssignedUserAdapter usersAdapter = new AssignedUserAdapter(activity, listValues);
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(new Runnable() {
@ -449,11 +451,19 @@ public class EditPeopleControlSet extends PopupControlSet {
public void onItemClick(AdapterView<?> arg0, View arg1, int position, public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long id) { long id) {
AssignedToUser user = (AssignedToUser) assignedList.getAdapter().getItem(position); AssignedToUser user = (AssignedToUser) assignedList.getAdapter().getItem(position);
assignedDisplay.setText(user.toString());
assignedCustom.setText(""); //$NON-NLS-1$
for (AssignedChangedListener l : listeners) { 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(); refreshDisplayView();
DialogUtilities.dismissDialog(activity, dialog); DialogUtilities.dismissDialog(activity, dialog);
} }
@ -464,7 +474,8 @@ public class EditPeopleControlSet extends PopupControlSet {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
assignedCustom.setText(""); //$NON-NLS-1$ 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"); return result.optString("picture");
} }
private MultipartEntity buildPictureData(Bitmap bitmap) { public static MultipartEntity buildPictureData(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
if(bitmap.getWidth() > 512 || bitmap.getHeight() > 512) { if(bitmap.getWidth() > 512 || bitmap.getHeight() > 512) {
float scale = Math.min(512f / bitmap.getWidth(), 512f / bitmap.getHeight()); 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; package com.todoroo.astrid.taskrabbit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale; 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.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.Context; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.res.TypedArray;
import android.location.Location; import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.provider.Settings;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; 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.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.google.android.maps.GeoPoint;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService; 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.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.EditPeopleControlSet.AssignedChangedListener; import com.todoroo.astrid.actfm.EditPeopleControlSet.AssignedChangedListener;
import com.todoroo.astrid.actfm.OAuthLoginActivity; import com.todoroo.astrid.actfm.OAuthLoginActivity;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.helper.TaskEditControlSet; 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 { 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 saveToJSON(JSONObject json, String key) throws JSONException;
public void writeToJSON(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 */
Task model = null; Task model = null;
@ -70,27 +53,17 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha
private RestClient restClient; 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 */ /** true if editing started with a new task */
boolean isNewTask = false; boolean isNewTask = false;
private EditText taskDescription;
private Button taskButton;
private LinearLayout taskControls;
private Location currentLocation; private Location currentLocation;
private final Fragment fragment; 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 */ /** Act.fm current user name */
public static final String TASK_RABBIT_TOKEN = "task_rabbit_token"; //$NON-NLS-1$ 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_ID = "fDTmGeR0uNCvoxopNyqsRWae8xOvbOBqC7jmHaxv"; //$NON-NLS-1$
public static final String TASK_RABBIT_CLIENT_APPLICATION_ID = "XBpKshU8utH5eaNmhky9N8aAId5rSLTh04Hi60Co"; //$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; private TaskRabbitTaskContainer taskRabbitTask;
public TaskRabbitControlSet(Fragment fragment, int displayViewLayout) {
public TaskRabbitControlSet(Fragment fragment, int viewLayout, int displayViewLayout) { super(fragment.getActivity(), displayViewLayout);
super(fragment.getActivity(), viewLayout, displayViewLayout, 0);
this.fragment = fragment; this.fragment = fragment;
DependencyInjectionService.getInstance().inject(this); 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() { protected void refreshDisplayView() {
JSONObject remoteData = taskRabbitTask.getRemoteTaskData(); JSONObject remoteData = taskRabbitTask.getRemoteTaskData();
if (remoteData != null) 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() { protected OnClickListener getDisplayClickListener() {
return new OnClickListener() { return new OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
setUpUIComponents(); showTaskRabbitActivity();
dialog.show();
} }
}; };
} }
@ -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() { private final Handler handler = new Handler() {
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
switch (msg.what) { 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 0: break;
case 1: case 1:
showSuccessToast(); showSuccessToast();
TaskRabbitDataService.getInstance().saveTaskAndMetadata(taskRabbitTask);
updateDisplay(taskRabbitTask.getRemoteTaskData()); updateDisplay(taskRabbitTask.getRemoteTaskData());
dialog.dismiss();
break;
case 2:
TaskRabbitDataService.getInstance().saveTaskAndMetadata(taskRabbitTask);
updateDisplay(taskRabbitTask.getRemoteTaskData());
dialog.dismiss();
break; 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() { private void buildAlertMessageNoGps() {
Intent intent = new Intent(activity, final AlertDialog.Builder builder = new AlertDialog.Builder(fragment.getActivity());
OAuthLoginActivity.class); builder.setMessage("Yout GPS seems to be disabled, do you want to enable it?")
try { .setCancelable(false)
String url = TASK_RABBIT_URL + "/api/authorize?client_id=" + TASK_RABBIT_CLIENT_ID; .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
intent.putExtra(OAuthLoginActivity.URL_TOKEN, url); public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
fragment.startActivityForResult(intent, REQUEST_CODE_TASK_RABBIT_OAUTH); fragment.getActivity().startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
StatisticsService.reportEvent(StatisticsConstants.ACTFM_LOGIN_GL_START); }
} catch (Exception e) { })
// handleError(e); .setNegativeButton("No", new DialogInterface.OnClickListener() {
e.printStackTrace(); public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
} dialog.cancel();
} }
private void loadLocation() { });
LocationManager locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE); final AlertDialog alert = builder.create();
currentLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); alert.show();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, this);
updateControlSetLocation(currentLocation);
} }
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) { private String taskRabbitURL(String method) {
return TASK_RABBIT_URL + "/api/v1/"+ method; return TASK_RABBIT_URL + "/api/v1/"+ method;
@ -479,24 +192,22 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha
/** Fire task rabbit if assigned **/ /** Fire task rabbit if assigned **/
@Override @Override
public void assignedChanged(String name, JSONObject json) { public boolean showTaskRabbitForUser(String name, JSONObject json) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
if (name.equals(activity.getString(R.string.actfm_EPA_task_rabbit))) { if (name.equals(fragment.getActivity().getString(R.string.actfm_EPA_task_rabbit))) {
setUpUIComponents(); showTaskRabbitActivity();
dialog.show(); return true;
} }
return false;
} }
public boolean activityResult (int requestCode, int resultCode, Intent data) { 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); String result = data.getStringExtra(OAuthLoginActivity.DATA_RESPONSE);
if(result.contains("access_token=")) { if (TextUtils.isEmpty(result)) {
try { try {
result = result.substring(result.indexOf("access_token=")+"access_token=".length()); updateDisplay(new JSONObject(result));
Preferences.setString(TASK_RABBIT_TOKEN, result);
String response = restClient.get(taskRabbitURL("account"));
Log.d("Task rabbit response", response);
saveUserInfo(response);
} }
catch (Exception e){ catch (Exception e){
e.printStackTrace(); e.printStackTrace();
@ -505,58 +216,18 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha
return true; return true;
} }
else {
for (TaskRabbitSetListener set : controls) {
if (set.getClass().equals(TaskRabbitLocationControlSet.class)) {
if (((TaskRabbitLocationControlSet) set).activityResult(requestCode, resultCode, data)) {
return true;
}
}
}
}
return false; 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) { public void updateDisplay(JSONObject json) {
if (json != null && json.has("state_label")) { String stateKey = fragment.getActivity().getString(R.string.tr_attr_state_label);
String status = json.optString(activity.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); TextView statusText = (TextView) getDisplayView().findViewById(R.id.display_row_edit);
statusText.setText(status); statusText.setText(status);
getDisplayView().setVisibility(View.VISIBLE); getDisplayView().setVisibility(View.VISIBLE);
@ -604,17 +275,9 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha
} }
@Override @Override
public boolean shouldShowTaskRabbit() { public boolean shouldShowTaskRabbit() {
//if (isLoggedIn()) return true; if(Locale.getDefault().getCountry().equals("US")) return true; //$NON-NLS-1$
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;
}
}
return false; return false;
} }
} }

@ -190,9 +190,7 @@ public final class TaskRabbitDataService {
ArrayList<Metadata> metadata = new ArrayList<Metadata>(); ArrayList<Metadata> metadata = new ArrayList<Metadata>();
TodorooCursor<Metadata> metadataCursor = metadataService.query(Query.select(Metadata.PROPERTIES). TodorooCursor<Metadata> metadataCursor = metadataService.query(Query.select(Metadata.PROPERTIES).
where(Criterion.and(MetadataCriteria.byTask(task.getId()), where(Criterion.and(MetadataCriteria.byTask(task.getId()),
Criterion.or(MetadataCriteria.withKey(TagService.KEY), MetadataCriteria.withKey(TaskRabbitMetadata.METADATA_KEY))));
MetadataCriteria.withKey(TaskRabbitMetadata.METADATA_KEY),
MetadataCriteria.withKey(NoteMetadata.METADATA_KEY)))));
try { try {
for(metadataCursor.moveToFirst(); !metadataCursor.isAfterLast(); metadataCursor.moveToNext()) { for(metadataCursor.moveToFirst(); !metadataCursor.isAfterLast(); metadataCursor.moveToNext()) {
metadata.add(new Metadata(metadataCursor)); 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.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.data.Task; 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.DateAndTimePicker;
import com.todoroo.astrid.ui.PopupControlSet; import com.todoroo.astrid.ui.PopupControlSet;
@ -47,7 +47,8 @@ public class TaskRabbitDeadlineControlSet extends PopupControlSet implements Tas
protected void refreshDisplayView() { protected void refreshDisplayView() {
TextView dateDisplay = (TextView) getDisplayView().findViewById(R.id.display_row_edit); TextView dateDisplay = (TextView) getDisplayView().findViewById(R.id.display_row_edit);
String toDisplay = dateAndTimePicker.getDisplayString(activity); String toDisplay = dateAndTimePicker.getDisplayString(activity);
dateDisplay.setText(toDisplay); if (dateDisplay != null)
dateDisplay.setText(toDisplay);
} }
@Override @Override
@ -64,20 +65,22 @@ public class TaskRabbitDeadlineControlSet extends PopupControlSet implements Tas
@Override @Override
public void readFromModel(JSONObject json, String key) { public void readFromModel(JSONObject json, String key) {
long dateValue = json.optLong(key);
Date currentDate = null; long dateValue = json.optLong(key);
if (dateValue < 24) { Date currentDate = null;
if (dateValue < 24) {
if(dateAndTimePicker.constructDueDate() > 0) return;
currentDate = new Date(); currentDate = new Date();
currentDate.setHours((int)dateValue); currentDate.setHours((int)dateValue);
currentDate.setMinutes(0); currentDate.setMinutes(0);
currentDate.setSeconds(0); currentDate.setSeconds(0);
} }
else { else {
currentDate = new Date(dateValue); currentDate = new Date(dateValue);
} }
dateAndTimePicker.initializeWithDate(DateUtilities.dateToUnixtime(currentDate)+ DateUtilities.ONE_DAY); dateAndTimePicker.initializeWithDate(DateUtilities.dateToUnixtime(currentDate)+ DateUtilities.ONE_DAY);
refreshDisplayView(); refreshDisplayView();
} }

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

@ -5,6 +5,8 @@ import java.util.Locale;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.location.Address; import android.location.Address;
import android.location.Geocoder; import android.location.Geocoder;
@ -14,9 +16,10 @@ import android.location.LocationManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.provider.Settings;
import android.view.View; import android.view.View;
import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageButton;
import com.google.android.maps.GeoPoint; import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity; import com.google.android.maps.MapActivity;
@ -33,6 +36,7 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen
private MapController mapController; private MapController mapController;
public Location location; public Location location;
private EditText searchText; private EditText searchText;
private TaskRabbitMapOverlayItem currentOverlayItem;
/** Called when the activity is first created. */ /** Called when the activity is first created. */
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState)
@ -51,31 +55,33 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen
List<Overlay> mapOverlays = mapView.getOverlays(); List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.icon_locale); Drawable drawable = this.getResources().getDrawable(R.drawable.icon_locale);
TaskRabbitMapOverlayItem itemizedoverlay = new TaskRabbitMapOverlayItem(drawable, this); currentOverlayItem = new TaskRabbitMapOverlayItem(drawable, this);
GeoPoint point = null; GeoPoint point = null;
mapController = mapView.getController();
if(lastKnownLocation != null) { if(lastKnownLocation != null) {
point = new GeoPoint((int)(lastKnownLocation.getLatitude()*1E6),(int)(lastKnownLocation.getLongitude()*1E6)); point = new GeoPoint((int)(lastKnownLocation.getLatitude()*1E6),(int)(lastKnownLocation.getLongitude()*1E6));
} OverlayItem overlayitem = new OverlayItem(point, "Set this location", "Send this location to Task Rabbit!");
else { currentOverlayItem.addOverlay(overlayitem);
point = new GeoPoint(19240000,-99120000); 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); 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() { searchButton.setOnClickListener(new View.OnClickListener() {
@Override @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() { private final Handler handler = new Handler() {
@Override @Override
@ -96,6 +126,7 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen
case 1: case 1:
mapView.invalidate(); mapView.invalidate();
currentOverlayItem.onTap(0);
// What to do when ready, example: // What to do when ready, example:
break; break;
case -1: case -1:
@ -131,16 +162,16 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen
(int) (addresses.get(0).getLongitude() * 1E6)); (int) (addresses.get(0).getLongitude() * 1E6));
Drawable drawable = TaskRabbitMapActivity.this.getResources().getDrawable(R.drawable.icon_locale); 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.animateTo(q);
mapController.setZoom(12); mapController.setZoom(12);
OverlayItem overlayitem = new OverlayItem(q, "Set this location", "For the rabbits!"); OverlayItem overlayitem = new OverlayItem(q, "Set this location", "For the rabbits!");
itemizedoverlay.addOverlay(overlayitem); currentOverlayItem.addOverlay(overlayitem);
List<Overlay> mapOverlays = mapView.getOverlays(); List<Overlay> mapOverlays = mapView.getOverlays();
mapOverlays.clear(); mapOverlays.clear();
mapOverlays.add(itemizedoverlay); mapOverlays.add(currentOverlayItem);
Message successMessage = new Message(); Message successMessage = new Message();
successMessage.what = 1; successMessage.what = 1;
@ -169,11 +200,11 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen
private void updateLocationOverlay() { private void updateLocationOverlay() {
if (location == null) { return; }; if (location == null) { return; };
List<Overlay> mapOverlays = mapView.getOverlays(); 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); TaskRabbitMapOverlayItem myItemizedOverlay = new TaskRabbitMapOverlayItem(drawable);
GeoPoint point = new GeoPoint((int)(location.getLatitude() * 1E6), (int)(location.getLongitude() * 1E6)); 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); myItemizedOverlay.addOverlay(overlayitem);
mapOverlays.add(myItemizedOverlay); mapOverlays.add(myItemizedOverlay);
} }
@ -185,7 +216,9 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen
double lng = location.getLongitude(); double lng = location.getLongitude();
this.location = location; this.location = location;
GeoPoint p = new GeoPoint((int) lat * 1000000, (int) lng * 1000000); GeoPoint p = new GeoPoint((int) lat * 1000000, (int) lng * 1000000);
updateLocationOverlay();
mapController.animateTo(p); mapController.animateTo(p);
} }
} }
@Override @Override

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

@ -1,26 +1,80 @@
package com.todoroo.astrid.taskrabbit; package com.todoroo.astrid.taskrabbit;
import java.io.ByteArrayOutputStream;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import android.app.Activity; 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; protected final EditText editText;
import com.todoroo.astrid.ui.EditNotesControlSet; 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, public TaskRabbitNameControlSet(Activity activity, int viewLayout,
int displayViewLayout, int titleID, int i) { int displayViewLayout, int titleID, int i) {
super(activity, viewLayout, displayViewLayout); super(activity, viewLayout, displayViewLayout, titleID);
displayText.setText("Restaurant name"); 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 @Override
@ -30,9 +84,99 @@ public class TaskRabbitNameControlSet extends EditNotesControlSet implements Tas
@Override @Override
public void writeToJSON(JSONObject json, String key) throws JSONException { 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.app.Activity;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.support.v4.app.Fragment;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; 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.ArrayAdapter;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
@ -15,62 +18,112 @@ import android.widget.TextView;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.helper.TaskEditControlSet; 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{ public class TaskRabbitSpinnerControlSet extends TaskEditControlSet implements TaskRabbitSetListener{
private final Spinner spinner; private final Spinner spinner;
private final int setID; private final int setID;
private final int type;
private final int titleID; private final int titleID;
private final TextView displayText; private final TextView displayText;
private final Fragment fragment; private final TextView displayEdit;
private final ArrayAdapter adapter; private ArrayAdapter adapter;
private final Activity activity;
public TaskRabbitSpinnerControlSet(final Fragment fragment, int viewLayout, int title, int setID, int type) { public TaskRabbitSpinnerControlSet(final Activity activity, int viewLayout, int title, int setID) {
super(fragment.getActivity(), viewLayout); super(activity, viewLayout);
this.setID = setID; this.setID = setID;
this.type = type;
this.fragment = fragment;
this.titleID = title; this.titleID = title;
this.activity = activity;
// DependencyInjectionService.getInstance().inject(this); // DependencyInjectionService.getInstance().inject(this);
spinner = (Spinner)getView().findViewById(R.id.display_row_edit); // spinner = new Spinner(fragment.activity);
spinner.setPrompt(getActivity().getString(title)); 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 = (TextView) getDisplayView().findViewById(R.id.display_row_title);
displayText.setText(title); displayText.setText(title);
String[] listTypes; String[] listTypes = getStringDefaultArray(setID, R.array.tr_default_array);
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);
}
adapter = new ArrayAdapter<String>( 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); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
getActivity().runOnUiThread(new Runnable() { activity.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
spinner.setAdapter(adapter); 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) { 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); 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() { @Override
return fragment.getActivity(); 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() { public int selectedPosition() {
@ -79,11 +132,35 @@ public class TaskRabbitSpinnerControlSet extends TaskEditControlSet implements T
@Override @Override
public void readFromModel(JSONObject json, String key) { 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); 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 @Override
public void saveToJSON(JSONObject json, String key) throws JSONException { public void saveToJSON(JSONObject json, String key) throws JSONException {
json.put(key, spinner.getSelectedItemPosition()); json.put(key, spinner.getSelectedItemPosition());

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

@ -25,12 +25,12 @@
android:text="@string/TEA_note_label" /> android:text="@string/TEA_note_label" />
<com.todoroo.astrid.ui.TextViewWithMeasureListener <com.todoroo.astrid.ui.TextViewWithMeasureListener
android:id="@+id/notes_display" android:id="@+id/display_row_edit"
style="@style/TextAppearance.EditRowDisplay" style="@style/TextAppearance.EditRowDisplay"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:gravity="right" android:gravity="left"
android:paddingLeft="10dip" /> android:paddingLeft="10dip" />
</LinearLayout> </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"?> <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:astrid="http://schemas.android.com/apk/res/com.timsu.astrid" 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" android:id="@+id/edit_scroll"
style="@style/Content_EditScroll" style="@style/Content_EditScroll"
android:layout_width="fill_parent" android:layout_width="fill_parent"
@ -9,39 +16,68 @@
<LinearLayout <LinearLayout
android:id="@+id/task_rabbit_parent" android:id="@+id/task_rabbit_parent"
style="@style/Content"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" > android:background="#00000000"
android:orientation="vertical"
<TextView android:padding="10dip" >
style="@style/TextAppearance.GEN_EditLabel.DLG_EditLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/TEA_reminder_alarm_label" />
<Spinner <Spinner
android:id="@+id/task_type" android:id="@+id/task_type"
android:layout_width="fill_parent" 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 <LinearLayout
android:id="@+id/task_controls" android:id="@+id/task_controls"
style="@style/EditRow"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dip"
android:orientation="vertical" /> android:orientation="vertical" />
<EditText <LinearLayout
android:id="@+id/task_description" android:id="@+id/description_controls"
android:layout_width="match_parent" style="@style/EditRow"
android:layout_height="300dip" android:layout_width="fill_parent"
android:hint="Description" />
<Button
android:id="@+id/task_button"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Send Task!" /> android:layout_marginTop="10dip"
android:orientation="vertical" >
</LinearLayout>
</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"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical"> android:orientation="vertical"
style="@style/Content_EditScroll" >
<com.google.android.maps.MapView <com.google.android.maps.MapView
android:id="@+id/map_view" android:id="@+id/map_view"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="wrap_content"
android:layout_weight="9" android:layout_weight="12"
android:apiKey="0J-miH1uUbgW2wG77C9qZiqvpBW8FEnoRnn7qBw" android:apiKey="0J-miH1uUbgW2wG77C9qZiqvpBW8FEnoRnn7qBw"
android:clickable="true" /> android:clickable="true" />
<LinearLayout <LinearLayout
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:layout_height="wrap_content" > android:minHeight="50dip" >
<EditText <EditText
android:id="@+id/search_text" android:id="@+id/search_text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="fill_parent"
android:text="46 Watertree Ct. The Woodlands TX 77380" android:layout_weight="10"
android:layout_weight="3" /> android:hint="Enter address"/>
<Button <ImageButton
android:id="@+id/search_button" android:id="@+id/search_button"
android:layout_width="wrap_content" android:layout_width="50dip"
android:layout_height="wrap_content" android:layout_height="50dip"
android:text="Search" android:layout_weight="1"
android:layout_weight="1" /> android:scaleType="center" />
</LinearLayout> </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"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="wrap_content"
android:orientation="vertical" > android:orientation="vertical" >
<TextView <LinearLayout
android:id="@+id/display_row_title" android:id="@+id/display_row_body"
android:layout_width="wrap_content" android:layout_width="fill_parent"
android:layout_height="wrap_content" 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 <TextView
android:id="@+id/display_row_edit" android:id="@+id/display_row_title"
android:layout_width="wrap_content" style="@style/TextAppearance.GEN_EditLabel"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:text="Friend" /> 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"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="wrap_content"
android:orientation="vertical" > android:orientation="vertical" >
<TextView <LinearLayout
android:id="@+id/display_row_title" android:id="@+id/display_row_body"
android:layout_width="wrap_content" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Hello" /> android:minHeight="50dip"
android:gravity="center_vertical"
<Spinner xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal"
android:id="@+id/display_row_edit" android:paddingLeft="10dip"
android:layout_width="fill_parent" android:paddingRight="5dip" >
android:layout_height="wrap_content"
android:orientation="vertical" <Spinner
android:spinnerMode="dropdown" android:id="@+id/spinner"
android:background="#00000000" > 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> </LinearLayout>

@ -37,10 +37,10 @@
<item>@array/tr_default_type_delivery</item> <item>@array/tr_default_type_delivery</item>
<item>@array/tr_default_type_handyman</item> <item>@array/tr_default_type_handyman</item>
<item>@array/tr_default_type_shopping</item> <item>@array/tr_default_type_shopping</item>
<item>@array/tr_default_type_something_else</item>
</array> </array>
<array name="tr_default_type_virtual"> <array name="tr_default_type_virtual">
<item>0</item>
<item>-1</item> <item>-1</item>
<item>-1</item> <item>-1</item>
<item>4</item> <item>4</item>
@ -49,10 +49,10 @@
<item>10</item> <item>10</item>
<item>-1</item> <item>-1</item>
<item>0</item> <item>0</item>
<item>25</item> <item>2</item>
<item>0</item>
</array> </array>
<array name="tr_default_type_food_delivery"> <array name="tr_default_type_food_delivery">
<item>1</item>
<item>0</item> <item>0</item>
<item>-1</item> <item>-1</item>
<item>-1</item> <item>-1</item>
@ -61,10 +61,10 @@
<item>10</item> <item>10</item>
<item>0</item> <item>0</item>
<item>1</item> <item>1</item>
<item>20</item> <item>2</item>
<item>0</item>
</array> </array>
<array name="tr_default_type_cleaning"> <array name="tr_default_type_cleaning">
<item>2</item>
<item>-1</item> <item>-1</item>
<item>0</item> <item>0</item>
<item>-1</item> <item>-1</item>
@ -73,10 +73,10 @@
<item>10</item> <item>10</item>
<item>-1</item> <item>-1</item>
<item>0</item> <item>0</item>
<item>25</item> <item>2</item>
<item>0</item>
</array> </array>
<array name="tr_default_type_donations"> <array name="tr_default_type_donations">
<item>3</item>
<item>-1</item> <item>-1</item>
<item>0</item> <item>0</item>
<item>-1</item> <item>-1</item>
@ -85,10 +85,10 @@
<item>10</item> <item>10</item>
<item>0</item> <item>0</item>
<item>0</item> <item>0</item>
<item>25</item> <item>2</item>
<item>0</item>
</array> </array>
<array name="tr_default_type_delivery"> <array name="tr_default_type_delivery">
<item>4</item>
<item>-1</item> <item>-1</item>
<item>0</item> <item>0</item>
<item>-1</item> <item>-1</item>
@ -97,10 +97,10 @@
<item>10</item> <item>10</item>
<item>0</item> <item>0</item>
<item>0</item> <item>0</item>
<item>25</item> <item>2</item>
<item>0</item>
</array> </array>
<array name="tr_default_type_handyman"> <array name="tr_default_type_handyman">
<item>5</item>
<item>-1</item> <item>-1</item>
<item>0</item> <item>0</item>
<item>2</item> <item>2</item>
@ -109,10 +109,10 @@
<item>10</item> <item>10</item>
<item>-1</item> <item>-1</item>
<item>1</item> <item>1</item>
<item>50</item> <item>2</item>
<item>0</item>
</array> </array>
<array name="tr_default_type_shopping"> <array name="tr_default_type_shopping">
<item>6</item>
<item>-1</item> <item>-1</item>
<item>0</item> <item>0</item>
<item>-1</item> <item>-1</item>
@ -121,12 +121,12 @@
<item>10</item> <item>10</item>
<item>0</item> <item>0</item>
<item>2</item> <item>2</item>
<item>20</item> <item>2</item>
<item>0</item>
</array> </array>
<array name="tr_default_type_something_else"> <array name="tr_default_type_something_else">
<item>7</item> <item>-1</item>
<item>0</item>
<item>0</item> <item>0</item>
<item>-1</item> <item>-1</item>
<item>-1</item> <item>-1</item>
@ -134,7 +134,8 @@
<item>10</item> <item>10</item>
<item>0</item> <item>0</item>
<item>2</item> <item>2</item>
<item>20</item> <item>2</item>
<item>0</item>
</array> </array>
@ -159,7 +160,6 @@
<string-array name="tr_default_set"> <string-array name="tr_default_set">
<item>@string/tr_set_type</item>
<item>@string/tr_set_name</item> <item>@string/tr_set_name</item>
<item>@string/tr_set_location</item> <item>@string/tr_set_location</item>
<item>@string/tr_set_skill_required</item> <item>@string/tr_set_skill_required</item>
@ -169,6 +169,7 @@
<item>@string/tr_set_drop_off</item> <item>@string/tr_set_drop_off</item>
<item>@string/tr_set_cost_in_cents</item> <item>@string/tr_set_cost_in_cents</item>
<item>@string/tr_set_named_price</item> <item>@string/tr_set_named_price</item>
<item>@string/tr_set_description</item>
</string-array> </string-array>
<!-- Control set title (do not translate) --> <!-- Control set title (do not translate) -->
@ -181,11 +182,11 @@
<string name="tr_set_deadline">Deadline</string> <string name="tr_set_deadline">Deadline</string>
<string name="tr_set_drop_off">Dropoff</string> <string name="tr_set_drop_off">Dropoff</string>
<string name="tr_set_cost_in_cents">Expenses</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"> <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_name</item>
<item>@string/tr_set_key_location</item> <item>@string/tr_set_key_location</item>
<item>@string/tr_set_key_skill_required</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_drop_off</item>
<item>@string/tr_set_key_cost_in_cents</item> <item>@string/tr_set_key_cost_in_cents</item>
<item>@string/tr_set_key_named_price</item> <item>@string/tr_set_key_named_price</item>
<item>@string/tr_set_key_description</item>
</string-array> </string-array>
<!-- Control set key for json (do not translate) --> <!-- Control set key for json (do not translate) -->
<string name="tr_set_key_type">name</string> <string name="tr_set_key_type">type</string>
<string name="tr_set_key_name">name:specific</string> <string name="tr_set_key_name">name</string>
<string name="tr_set_key_location">location</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_skill_required">description:skill_required</string>
<string name="tr_set_key_duration">description:duration</string> <string name="tr_set_key_duration">description:duration</string>
@ -212,23 +214,46 @@
<array name="tr_default_array"> <array name="tr_default_array">
<item>@array/tr_empty_string_array</item> <item>@string/tr_set_key_name</item>
<item>@array/tr_empty_string_array</item> <item>@string/tr_set_key_location</item>
<item>@string/tr_location</item> <item>@array/tr_default_skill_virtual</item>
<item>@array/tr_default_skill</item>
<item>@array/tr_default_duration</item> <item>@array/tr_default_duration</item>
<item>@array/tr_default_supplies</item> <item>@array/tr_default_supplies</item>
<item>@string/tr_deadline</item> <item>@string/tr_set_key_deadline</item>
<item>@string/tr_location</item> <item>@string/tr_set_key_location</item>
<item>@array/tr_default_cost_in_cents</item> <item>@array/tr_default_cost_in_cents</item>
<item>@array/tr_default_named_price</item> <item>@array/tr_default_named_price</item>
<item>@string/tr_set_key_description</item>
</array> </array>
<!-- Default options --> <!-- 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_research</item>
<item>@string/tr_default_skill_phone_calls</item> <item>@string/tr_default_skill_phone_calls</item>
<item>@string/tr_default_skill_event_planning</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_craigslist">Craigslist</string>
<string name="tr_default_skill_help">Help</string> <string name="tr_default_skill_help">Help</string>
<string name="tr_default_skill_ebay_help">eBay 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_carpentry">Carpentry</string>
<string name="tr_default_skill_assembly_repair">Assembly and Repair</string> <string name="tr_default_skill_assembly_repair">Assembly and Repair</string>
<string name="tr_default_skill_plumbing">Plumbing</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_100</item>
<item>@string/tr_default_cost_in_cents_101</item> <item>@string/tr_default_cost_in_cents_101</item>
</string-array> </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 --> <!-- cost_in_cents -->
<string name="tr_default_cost_in_cents_0">$0</string> <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_100">Less than $100</string>
<string name="tr_default_cost_in_cents_101">More 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"> <string-array name="tr_default_duration">
@ -310,11 +336,6 @@
<string name="tr_default_duration_10">I do not know</string> <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"> <array name="tr_default_price_type_array">
<item>@array/tr_type_default_price_virtual</item> <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_cleaning</item>
<item>@array/tr_type_default_price_food_delivery</item> <item>@array/tr_default_named_price</item>
<item>@array/tr_type_default_price_food_delivery</item> <item>@array/tr_default_named_price</item>
<item>@array/tr_type_default_price_handyman</item> <item>@array/tr_type_default_price_handyman</item>
<item>@array/tr_type_default_price_food_delivery</item> <item>@array/tr_default_named_price</item>
<item>@array/tr_type_default_price_food_delivery</item> <item>@array/tr_default_named_price</item>
</array> </array>
<string-array name="tr_type_default_price_virtual"> <string-array name="tr_type_default_price_virtual">
@ -341,7 +362,7 @@
<item>$55</item> <item>$55</item>
</string-array> </string-array>
<string-array name="tr_type_default_price_food_delivery"> <string-array name="tr_default_named_price">
<item>$10</item> <item>$10</item>
<item>$15</item> <item>$15</item>
<item>$20</item> <item>$20</item>

@ -86,4 +86,7 @@
For free, you get online backup, full synchronization with Astrid.com, the 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> 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> </resources>

@ -508,7 +508,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
// EditPeopleControlSet relies on the "tags" transitory created by the // EditPeopleControlSet relies on the "tags" transitory created by the
// TagsControlSet, so we put the tags control before the people control // 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(taskRabbitControl);
controls.add(peopleControlSet = new EditPeopleControlSet(getActivity(), this, 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)); R.string.actfm_EPA_assign_label_long, REQUEST_LOG_IN));
controlSetMap.put(getString(R.string.TEA_ctrl_who_pref), controlSetMap.put(getString(R.string.TEA_ctrl_who_pref),
peopleControlSet); peopleControlSet);
peopleControlSet.addListener(taskRabbitControl); peopleControlSet.addListener(taskRabbitControl);
RepeatControlSet repeatControls = new RepeatControlSet(getActivity(), RepeatControlSet repeatControls = new RepeatControlSet(getActivity(),
@ -1102,10 +1102,10 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { 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; return;
} }
else if (taskRabbitControl != null && taskRabbitControl.activityResult(requestCode, resultCode, data)) { else if (editNotes != null && editNotes.activityResult(requestCode, resultCode, data)) {
return; return;
} }
else if (requestCode == REQUEST_VOICE_RECOG else if (requestCode == REQUEST_VOICE_RECOG
@ -1277,7 +1277,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
// EditNoteActivity Lisener when there are new updates/comments // EditNoteActivity Lisener when there are new updates/comments
@Override @Override
public void updatesChanged() { public void updatesChanged() {
setCurrentTab(TAB_VIEW_UPDATES); setCurrentTab(TAB_VIEW_UPDATES);
this.setPagerHeightForPosition(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) { public EditNotesControlSet(Activity activity, int viewLayout, int displayViewLayout) {
super(activity, viewLayout, displayViewLayout, R.string.TEA_note_label); super(activity, viewLayout, displayViewLayout, R.string.TEA_note_label);
editText = (EditText) getView().findViewById(R.id.notes); 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); notesBody = (LinearLayout) getDisplayView().findViewById(R.id.notes_body);
dialog.getWindow() dialog.getWindow()
.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); .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); this.displayView = LayoutInflater.from(activity).inflate(displayViewLayout, null);
displayText = (TextView) displayView.findViewById(R.id.display_row_title); displayText = (TextView) displayView.findViewById(R.id.display_row_title);
if (displayText != null) { if (displayText != null) {
displayText.setMaxLines(2); displayText.setMaxLines(2);
} }
} }
else { else {
@ -66,46 +66,6 @@ public abstract class PopupControlSet extends TaskEditControlSet {
displayView.setOnClickListener(getDisplayClickListener()); 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 @Override
public View getDisplayView() { public View getDisplayView() {
return displayView; return displayView;

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

Loading…
Cancel
Save