From 6383d3679feef248cd089e65fe0520039a64e76b Mon Sep 17 00:00:00 2001 From: Andrew Shaw Date: Mon, 6 Feb 2012 17:17:30 -0800 Subject: [PATCH] Adding name option to task rabbit --- astrid/AndroidManifest.xml | 7 +- .../astrid/actfm/EditPeopleControlSet.java | 23 +- .../astrid/actfm/sync/ActFmSyncService.java | 2 +- .../astrid/taskrabbit/TaskRabbitActivity.java | 843 ++++++++++++++++++ .../taskrabbit/TaskRabbitControlSet.java | 479 ++-------- .../taskrabbit/TaskRabbitDataService.java | 4 +- .../TaskRabbitDeadlineControlSet.java | 25 +- .../TaskRabbitLocationControlSet.java | 40 +- .../taskrabbit/TaskRabbitMapActivity.java | 71 +- .../taskrabbit/TaskRabbitMapOverlayItem.java | 5 +- .../taskrabbit/TaskRabbitNameControlSet.java | 166 +++- .../astrid/taskrabbit/TaskRabbitRow.java | 78 -- .../TaskRabbitSpinnerControlSet.java | 131 ++- .../taskrabbit/TaskRabbitTaskContainer.java | 29 +- .../res/layout/control_set_notes_display.xml | 4 +- .../task_rabbit_control_set_description.xml | 65 ++ astrid/res/layout/task_rabbit_enter.xml | 80 +- astrid/res/layout/task_rabbit_header_view.xml | 38 + .../res/layout/task_rabbit_map_activity.xml | 30 +- .../res/layout/task_rabbit_menu_popover.xml | 32 + astrid/res/layout/task_rabbit_menu_row.xml | 14 + astrid/res/layout/task_rabbit_row.xml | 44 +- .../layout/task_rabbit_row_description.xml | 60 ++ astrid/res/layout/task_rabbit_spinner.xml | 51 +- astrid/res/values/keys-taskrabbit.xml | 129 +-- astrid/res/values/strings-intro.xml | 3 + .../astrid/activity/TaskEditFragment.java | 10 +- .../astrid/ui/EditNotesControlSet.java | 2 +- .../todoroo/astrid/ui/PopupControlSet.java | 42 +- .../astrid/legacy/data/AbstractModel.java | 3 +- 30 files changed, 1746 insertions(+), 764 deletions(-) create mode 100644 astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitActivity.java delete mode 100644 astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitRow.java create mode 100644 astrid/res/layout/task_rabbit_control_set_description.xml create mode 100644 astrid/res/layout/task_rabbit_header_view.xml create mode 100644 astrid/res/layout/task_rabbit_menu_popover.xml create mode 100644 astrid/res/layout/task_rabbit_menu_row.xml create mode 100644 astrid/res/layout/task_rabbit_row_description.xml diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 44c9f295e..5356f4176 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -623,15 +623,18 @@ + + - - + + diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java b/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java index 4fd6a6d51..291bb9cae 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java @@ -112,10 +112,12 @@ public class EditPeopleControlSet extends PopupControlSet { private final List listeners = new LinkedList(); public interface AssignedChangedListener { - public void assignedChanged(String name, JSONObject json); + public boolean showTaskRabbitForUser(String name, JSONObject json); public boolean shouldShowTaskRabbit(); } + int selected = 0; //need to remember last selected state for task rabbit + static { AstridDependencyInjector.initialize(); } @@ -390,7 +392,7 @@ public class EditPeopleControlSet extends PopupControlSet { } } - final int selected = assignedIndex; + selected = assignedIndex; final AssignedUserAdapter usersAdapter = new AssignedUserAdapter(activity, listValues); activity.runOnUiThread(new Runnable() { @@ -449,11 +451,19 @@ public class EditPeopleControlSet extends PopupControlSet { public void onItemClick(AdapterView arg0, View arg1, int position, long id) { AssignedToUser user = (AssignedToUser) assignedList.getAdapter().getItem(position); - assignedDisplay.setText(user.toString()); - assignedCustom.setText(""); //$NON-NLS-1$ + for (AssignedChangedListener l : listeners) { - l.assignedChanged(user.label, user.user); + if(l.showTaskRabbitForUser(user.label, user.user)) { + assignedList.setItemChecked(selected, true); + assignedList.setItemChecked(position, false); + DialogUtilities.dismissDialog(activity, dialog); + return; + } + } + assignedDisplay.setText(user.toString()); + assignedCustom.setText(""); //$NON-NLS-1$ + selected = position; refreshDisplayView(); DialogUtilities.dismissDialog(activity, dialog); } @@ -464,7 +474,8 @@ public class EditPeopleControlSet extends PopupControlSet { @Override public void onClick(View v) { assignedCustom.setText(""); //$NON-NLS-1$ - assignedList.setItemChecked(0, true); + selected = 0; + assignedList.setItemChecked(selected, true); } }); diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java index 1a41668c7..fb5b18631 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java @@ -849,7 +849,7 @@ public final class ActFmSyncService { return result.optString("picture"); } - private MultipartEntity buildPictureData(Bitmap bitmap) { + public static MultipartEntity buildPictureData(Bitmap bitmap) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); if(bitmap.getWidth() > 512 || bitmap.getHeight() > 512) { float scale = Math.min(512f / bitmap.getWidth(), 512f / bitmap.getHeight()); diff --git a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitActivity.java b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitActivity.java new file mode 100644 index 000000000..191cadc20 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitActivity.java @@ -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 controls = Collections.synchronizedList(new ArrayList()); + + 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(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(); + } + }); + } + + + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitControlSet.java b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitControlSet.java index d905571ca..409b2270a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitControlSet.java @@ -1,46 +1,27 @@ package com.todoroo.astrid.taskrabbit; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import java.util.Locale; -import org.apache.http.Header; -import org.apache.http.HttpEntity; -import org.apache.http.entity.StringEntity; -import org.apache.http.message.BasicHeader; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.AlertDialog; -import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; -import android.content.res.TypedArray; import android.location.Location; -import android.location.LocationListener; -import android.location.LocationManager; -import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.provider.Settings; import android.support.v4.app.Fragment; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.view.ViewGroup.LayoutParams; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemSelectedListener; -import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.EditText; import android.widget.LinearLayout; -import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; -import com.google.android.maps.GeoPoint; import com.timsu.astrid.R; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; @@ -48,13 +29,11 @@ import com.todoroo.andlib.service.RestClient; import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.actfm.EditPeopleControlSet.AssignedChangedListener; import com.todoroo.astrid.actfm.OAuthLoginActivity; +import com.todoroo.astrid.activity.TaskEditFragment; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.helper.TaskEditControlSet; -import com.todoroo.astrid.service.StatisticsConstants; -import com.todoroo.astrid.service.StatisticsService; -import com.todoroo.astrid.ui.PopupControlSet; -public class TaskRabbitControlSet extends PopupControlSet implements AssignedChangedListener, LocationListener { +public class TaskRabbitControlSet extends TaskEditControlSet implements AssignedChangedListener { public interface TaskRabbitSetListener { @@ -62,6 +41,10 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha public void saveToJSON(JSONObject json, String key) throws JSONException; public void writeToJSON(JSONObject json, String key) throws JSONException; } + public interface ActivityResultSetListener { + + public boolean activityResult (int requestCode, int resultCode, Intent data); + } /** task model */ Task model = null; @@ -70,27 +53,17 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha private RestClient restClient; - GeoPoint[] supportedLocations = - { - new GeoPoint(42358430, -71059770), - new GeoPoint(37739230, -122439880), - new GeoPoint(40714350, -74005970), - new GeoPoint(41878110, -8762980), - new GeoPoint(34052230, -118243680), - new GeoPoint(33717470, -117831140)}; - /** true if editing started with a new task */ boolean isNewTask = false; - private EditText taskDescription; - private Button taskButton; - private LinearLayout taskControls; private Location currentLocation; + private final Fragment fragment; - private final List controls = Collections.synchronizedList(new ArrayList()); + private LinearLayout row; + protected final TextView displayText; - private Spinner spinnerMode; + public static final int REQUEST_CODE_TASK_RABBIT_ACTIVITY = 5; + public static final String DATA_RESPONSE = "response"; //$NON-NLS-1$ - public static final int REQUEST_CODE_TASK_RABBIT_OAUTH = 5; /** Act.fm current user name */ public static final String TASK_RABBIT_TOKEN = "task_rabbit_token"; //$NON-NLS-1$ @@ -99,21 +72,29 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha public static final String TASK_RABBIT_CLIENT_ID = "fDTmGeR0uNCvoxopNyqsRWae8xOvbOBqC7jmHaxv"; //$NON-NLS-1$ public static final String TASK_RABBIT_CLIENT_APPLICATION_ID = "XBpKshU8utH5eaNmhky9N8aAId5rSLTh04Hi60Co"; //$NON-NLS-1$ - public static final String CITY_NAME = "task_rabbit_city_name"; //$NON-NLS-1$ private TaskRabbitTaskContainer taskRabbitTask; - - public TaskRabbitControlSet(Fragment fragment, int viewLayout, int displayViewLayout) { - super(fragment.getActivity(), viewLayout, displayViewLayout, 0); + public TaskRabbitControlSet(Fragment fragment, int displayViewLayout) { + super(fragment.getActivity(), displayViewLayout); this.fragment = fragment; DependencyInjectionService.getInstance().inject(this); - loadLocation(); + displayText = (TextView) getView().findViewById(R.id.display_row_title); + if (displayText != null) { + displayText.setMaxLines(2); + } + + if (getView() != null) { + getView().setOnClickListener(getDisplayClickListener()); + } } - @Override + + + + protected void refreshDisplayView() { JSONObject remoteData = taskRabbitTask.getRemoteTaskData(); if (remoteData != null) @@ -129,13 +110,16 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha } - @Override + private void showTaskRabbitActivity() { + Intent intent = new Intent(fragment.getActivity(), TaskRabbitActivity.class); + intent.putExtra(TaskEditFragment.TOKEN_ID, model.getId()); + fragment.startActivityForResult(intent, REQUEST_CODE_TASK_RABBIT_ACTIVITY); + } protected OnClickListener getDisplayClickListener() { return new OnClickListener() { @Override public void onClick(View v) { - setUpUIComponents(); - dialog.show(); + showTaskRabbitActivity(); } }; } @@ -157,320 +141,49 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha } - private void setUpControls() { - TypedArray arrays = activity.getResources().obtainTypedArray(R.array.tr_default_set); - TypedArray arrayType = activity.getResources().obtainTypedArray(R.array.tr_default_array); - for (int i = 0; i < arrays.length(); i++) { - - - int titleID = arrays.getResourceId(i, -1); - int arrayID = arrayType.getResourceId(i, -1); - if (arrayID == R.string.tr_location) { - TaskRabbitLocationControlSet set = new TaskRabbitLocationControlSet(fragment, R.layout.task_rabbit_row, titleID, i, spinnerMode.getSelectedItemPosition()); - controls.add(set); - } - else if(arrayID == R.string.tr_deadline) { - - TaskRabbitDeadlineControlSet deadlineControl = new TaskRabbitDeadlineControlSet( - activity, R.layout.control_set_deadline, - R.layout.task_rabbit_row); - controls.add(deadlineControl); - } - else if(arrayID == R.string.tr_name) { - TaskRabbitNameControlSet nameControlSet = new TaskRabbitNameControlSet(activity, - R.layout.control_set_notes, R.layout.control_set_notes_display, titleID, i); - controls.add(nameControlSet); - } - else { - TaskRabbitSpinnerControlSet set = new TaskRabbitSpinnerControlSet(fragment, R.layout.task_rabbit_spinner, titleID, i, spinnerMode.getSelectedItemPosition()); - controls.add(set); - } - } - if(taskDescription.getText().length() == 0){ - taskDescription.setText(model.getValue(Task.TITLE) + model.getValue(Task.NOTES)); - } - populateFields(taskRabbitTask); - } - private void displayViewsForMode(int mode) { - - for (int i = 0; i < taskControls.getChildCount(); i++){ - ViewGroup row = (ViewGroup)taskControls.getChildAt(i); - row.removeAllViews(); - } - taskControls.removeAllViews(); - - LinearLayout row = null; - - int[] presetValues = getPresetValues(mode); - String[] keys = activity.getResources().getStringArray(R.array.tr_default_set_key); - for (int i = 1; i < controls.size(); i++) { - if (presetValues[i] == -1) continue; - if (row == null || row.getChildCount() == 2) { - row = new LinearLayout(activity); - row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 100)); - row.setOrientation(LinearLayout.HORIZONTAL); - taskControls.addView(row); - } - TaskRabbitSetListener set = controls.get(i); - row.addView(((TaskEditControlSet)set).getDisplayView(), new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1)); - JSONObject parameters = new JSONObject(); - try { - parameters.put(keys[i], (presetValues[i])); - } catch (JSONException e) { - e.printStackTrace(); - } - ((TaskRabbitSetListener) set).readFromModel(parameters, keys[i]); - } - } - - /** Initialize UI components */ - private void setUpUIComponents() { - if (taskDescription == null){ - taskDescription = (EditText) getView().findViewById(R.id.task_description); - - taskControls = (LinearLayout)getView().findViewById(R.id.task_controls); - - taskButton = (Button) getView().findViewById(R.id.task_button); - taskButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - submitTaskRabbit(); - } - }); - - - - spinnerMode = (Spinner) getView().findViewById(R.id.task_type); - String[] listTypes = activity.getResources().getStringArray( - R.array.tr_preset_types); - - final ArrayAdapter adapter = new ArrayAdapter( - activity, android.R.layout.simple_spinner_item, listTypes); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - spinnerMode.setAdapter(adapter); - } - }); - spinnerMode.setOnItemSelectedListener(new OnItemSelectedListener() { - - @Override - public void onItemSelected(AdapterView arg0, View arg1, - int arg2, long arg3) { - displayViewsForMode(spinnerMode.getSelectedItemPosition()); - } - @Override - public void onNothingSelected(AdapterView arg0) { - return; - } - }); - - - setUpControls(); - } - } - - private void populateFields(TaskRabbitTaskContainer container) { - if (container == null) { - return; - } - JSONObject jsonData = container.getLocalTaskData(); - synchronized (controls) { - if(jsonData != null) { - String[] keys = activity.getResources().getStringArray(R.array.tr_default_set_key); - spinnerMode.setSelection(jsonData.optInt(keys[0])); - for (int i = 1; i < controls.size(); i++) { - TaskRabbitSetListener set = (TaskRabbitSetListener) controls.get(i); - set.readFromModel(jsonData, keys[i]); - } - } - } - } - - private JSONObject localParamsToJSON () throws JSONException { - - JSONObject parameters = new JSONObject(); - - int[] presetValues = getPresetValues(spinnerMode.getSelectedItemPosition()); - String[] keys = activity.getResources().getStringArray(R.array.tr_default_set_key); - - parameters.put(activity.getString(R.string.tr_set_key_type), spinnerMode.getSelectedItem().toString()); - parameters.put(activity.getString(R.string.tr_set_key_description), taskDescription.getText().toString()); - for (int i = 1; i < controls.size(); i++) { - if (presetValues[i] == -1) continue; - TaskRabbitSetListener set = controls.get(i); - set.writeToJSON(parameters, keys[i]); - } - if (parameters.optJSONArray("other_locations_attributes") == null) { - parameters.put(activity.getString(R.string.tr_attr_city_id), Preferences.getInt("task_rabbit_city_id", 1)); - parameters.put(activity.getString(R.string.tr_attr_city_lat), true); - } - - Log.d("localParamsToJSON", parameters.toString()); - return new JSONObject().put("task", parameters); - } - - - private int[] getPresetValues(int mode) { - TypedArray arrays = activity.getResources().obtainTypedArray(R.array.tr_default_type_array); - int[] presetValues = activity.getResources().getIntArray(arrays.getResourceId(mode, -1)); - return presetValues; - } - - - private String serializeToJSON () throws JSONException { - - JSONObject parameters = new JSONObject(); - String[] keys = activity.getResources().getStringArray(R.array.tr_default_set_key); - for (int i = 1; i < controls.size(); i++) { - TaskRabbitSetListener set = controls.get(i); - set.saveToJSON(parameters, keys[i]); - } - parameters.put(activity.getString(R.string.tr_set_key_type), spinnerMode.getSelectedItemPosition()); - parameters.put(activity.getString(R.string.tr_set_key_description), taskDescription.getText().toString()); - return parameters.toString(); - } - private HttpEntity getTaskBody() { - - try { - return new StringEntity(localParamsToJSON().toString()); - } - catch (Exception e) { - e.printStackTrace(); - } - return null; + /* message callbacks */ + /** + * Show toast for task edit canceling + */ + private void showSuccessToast() { + Toast.makeText(fragment.getActivity(), "Task posted to Task Rabbit successfully!", + Toast.LENGTH_SHORT).show(); } - private final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { - case -1: - - if(dialog.isShowing()) { - AlertDialog.Builder adb = new AlertDialog.Builder(activity); - adb.setTitle("Error posting task"); - adb.setMessage("Please try again"); - adb.setPositiveButton("Close",null); - adb.show(); - } - break; case 0: break; case 1: showSuccessToast(); - TaskRabbitDataService.getInstance().saveTaskAndMetadata(taskRabbitTask); updateDisplay(taskRabbitTask.getRemoteTaskData()); - dialog.dismiss(); - break; - case 2: - TaskRabbitDataService.getInstance().saveTaskAndMetadata(taskRabbitTask); - updateDisplay(taskRabbitTask.getRemoteTaskData()); - dialog.dismiss(); break; } } }; - protected void submitTaskRabbit(){ - - if(!Preferences.isSet(TASK_RABBIT_TOKEN)){ - loginTaskRabbit(); - } - else { - - - new Thread(new Runnable() { - @Override - public void run() { - - try { - String urlCall = "tasks/"; - Log.d("Tasks url:", taskRabbitURL(urlCall)); - Header authorization = new BasicHeader("Authorization", "OAuth " + Preferences.getStringValue(TASK_RABBIT_TOKEN)); //$NON-NLS-1$ - Header contentType = new BasicHeader("Content-Type", //$NON-NLS-1$ - "application/json"); //$NON-NLS-1$ - String response = restClient.post(taskRabbitURL(urlCall), getTaskBody(), contentType, authorization); - Log.d("Task rabbit response", response); - JSONObject taskResponse = new JSONObject(response); - if(taskResponse.has("id")){ - taskRabbitTask.setRemoteTaskData(response); - taskRabbitTask.setTaskID(taskResponse.optString("id")); - Message successMessage = new Message(); - successMessage.what = 1; - handler.sendMessage(successMessage); - } - - } - catch (Exception e){ - e.printStackTrace(); - Message failureMessage = new Message(); - failureMessage.what = -1; - handler.sendMessage(failureMessage); - } - } - }).start(); - - } - try { - taskRabbitTask.setLocalTaskData(serializeToJSON().toString()); - } catch (JSONException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - //submit! - } - - /** - * Show toast for task edit canceling - */ - private void showSuccessToast() { - Toast.makeText(activity, "Task posted to Task Rabbit successfully!", - Toast.LENGTH_SHORT).show(); - } - - protected void loginTaskRabbit() { - Intent intent = new Intent(activity, - OAuthLoginActivity.class); - try { - String url = TASK_RABBIT_URL + "/api/authorize?client_id=" + TASK_RABBIT_CLIENT_ID; - intent.putExtra(OAuthLoginActivity.URL_TOKEN, url); - fragment.startActivityForResult(intent, REQUEST_CODE_TASK_RABBIT_OAUTH); - StatisticsService.reportEvent(StatisticsConstants.ACTFM_LOGIN_GL_START); - } catch (Exception e) { - // handleError(e); - e.printStackTrace(); - } - } - private void loadLocation() { - LocationManager locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE); - currentLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); - locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, this); - updateControlSetLocation(currentLocation); + private void buildAlertMessageNoGps() { + final AlertDialog.Builder builder = new AlertDialog.Builder(fragment.getActivity()); + builder.setMessage("Yout GPS seems to be disabled, do you want to enable it?") + .setCancelable(false) + .setPositiveButton("Yes", new DialogInterface.OnClickListener() { + public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) { + fragment.getActivity().startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); + } + }) + .setNegativeButton("No", new DialogInterface.OnClickListener() { + public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) { + dialog.cancel(); + } + }); + final AlertDialog alert = builder.create(); + alert.show(); } - protected void saveUserInfo(String response) throws Exception { - JSONObject userObject = new JSONObject(response); - JSONObject cityObject = userObject.getJSONObject("city"); - if (cityObject.has("name")){ - Preferences.setString("task_rabbit_city_name", cityObject.getString("name")); - } - if (cityObject.has("id")){ - Preferences.setInt("task_rabbit_city_id", cityObject.getInt("id")); - } - if (cityObject.has("lat")){ - // currentLocation.setLatitude(cityObject.getDouble("lat")); - Preferences.setString("task_rabbit_city_lat", String.valueOf(cityObject.getDouble("lat"))); - } - if (cityObject.has("lng")){ - // currentLocation.setLongitude(cityObject.getDouble("lng")); - Preferences.setString("task_rabbit_city_lng", String.valueOf(cityObject.getDouble("lng"))); - } - } private String taskRabbitURL(String method) { return TASK_RABBIT_URL + "/api/v1/"+ method; @@ -479,24 +192,22 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha /** Fire task rabbit if assigned **/ @Override - public void assignedChanged(String name, JSONObject json) { + public boolean showTaskRabbitForUser(String name, JSONObject json) { // TODO Auto-generated method stub - if (name.equals(activity.getString(R.string.actfm_EPA_task_rabbit))) { - setUpUIComponents(); - dialog.show(); + if (name.equals(fragment.getActivity().getString(R.string.actfm_EPA_task_rabbit))) { + showTaskRabbitActivity(); + return true; } + return false; } public boolean activityResult (int requestCode, int resultCode, Intent data) { - if (requestCode == REQUEST_CODE_TASK_RABBIT_OAUTH && resultCode == Activity.RESULT_OK){ + Log.d("The actiivty result request code", "Rerjwklrw" + REQUEST_CODE_TASK_RABBIT_ACTIVITY); + if (requestCode == REQUEST_CODE_TASK_RABBIT_ACTIVITY && resultCode == Activity.RESULT_OK){ String result = data.getStringExtra(OAuthLoginActivity.DATA_RESPONSE); - if(result.contains("access_token=")) { + if (TextUtils.isEmpty(result)) { try { - result = result.substring(result.indexOf("access_token=")+"access_token=".length()); - Preferences.setString(TASK_RABBIT_TOKEN, result); - String response = restClient.get(taskRabbitURL("account")); - Log.d("Task rabbit response", response); - saveUserInfo(response); + updateDisplay(new JSONObject(result)); } catch (Exception e){ e.printStackTrace(); @@ -505,58 +216,18 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha return true; } - else { - for (TaskRabbitSetListener set : controls) { - if (set.getClass().equals(TaskRabbitLocationControlSet.class)) { - if (((TaskRabbitLocationControlSet) set).activityResult(requestCode, resultCode, data)) { - return true; - } - } - } - } return false; } - /* - * (non-Javadoc) - * @see android.location.LocationListener#onLocationChanged(android.location.Location) - */ - @Override - public void onLocationChanged(Location location) { - - currentLocation = location; - updateControlSetLocation(currentLocation); - - } - public void updateControlSetLocation (Location location) { - for (TaskRabbitSetListener controlSet : controls) { - if (TaskRabbitLocationControlSet.class.isAssignableFrom(controlSet.getClass())) { - ((TaskRabbitLocationControlSet) controlSet).updateCurrentLocation(location); - } - } - } - @Override - public void onProviderDisabled(String provider) { - return; - } - @Override - public void onProviderEnabled(String provider) { - return; - } - @Override - public void onStatusChanged(String provider, int status, Bundle extras) { - return; - } - - /* * */ public void updateDisplay(JSONObject json) { - if (json != null && json.has("state_label")) { - String status = json.optString(activity.getString(R.string.tr_attr_state_label)); + String stateKey = fragment.getActivity().getString(R.string.tr_attr_state_label); + if (json != null && json.has(stateKey)) { + String status = json.optString(stateKey); TextView statusText = (TextView) getDisplayView().findViewById(R.id.display_row_edit); statusText.setText(status); getDisplayView().setVisibility(View.VISIBLE); @@ -604,17 +275,9 @@ public class TaskRabbitControlSet extends PopupControlSet implements AssignedCha } @Override public boolean shouldShowTaskRabbit() { - //if (isLoggedIn()) return true; - if(!Locale.getDefault().getCountry().equals("US") ) return false; //$NON-NLS-1$ - for (GeoPoint point : supportedLocations){ - Location city = new Location(""); //$NON-NLS-1$ - city.setLatitude(point.getLatitudeE6()/1E6); - city.setLongitude(point.getLongitudeE6()/1E6); - float distance = currentLocation.distanceTo(city); - if (distance < 400000) { - return true; - } - } + if(Locale.getDefault().getCountry().equals("US")) return true; //$NON-NLS-1$ return false; } + + } diff --git a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitDataService.java b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitDataService.java index 2a817b91c..b1607262c 100644 --- a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitDataService.java +++ b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitDataService.java @@ -190,9 +190,7 @@ public final class TaskRabbitDataService { ArrayList metadata = new ArrayList(); TodorooCursor metadataCursor = metadataService.query(Query.select(Metadata.PROPERTIES). where(Criterion.and(MetadataCriteria.byTask(task.getId()), - Criterion.or(MetadataCriteria.withKey(TagService.KEY), - MetadataCriteria.withKey(TaskRabbitMetadata.METADATA_KEY), - MetadataCriteria.withKey(NoteMetadata.METADATA_KEY))))); + MetadataCriteria.withKey(TaskRabbitMetadata.METADATA_KEY)))); try { for(metadataCursor.moveToFirst(); !metadataCursor.isAfterLast(); metadataCursor.moveToNext()) { metadata.add(new Metadata(metadataCursor)); diff --git a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitDeadlineControlSet.java b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitDeadlineControlSet.java index 489271f5f..579e17f6f 100644 --- a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitDeadlineControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitDeadlineControlSet.java @@ -17,7 +17,7 @@ import com.timsu.astrid.R; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.astrid.data.Task; -import com.todoroo.astrid.taskrabbit.TaskRabbitControlSet.TaskRabbitSetListener; +import com.todoroo.astrid.taskrabbit.TaskRabbitActivity.TaskRabbitSetListener; import com.todoroo.astrid.ui.DateAndTimePicker; import com.todoroo.astrid.ui.PopupControlSet; @@ -47,7 +47,8 @@ public class TaskRabbitDeadlineControlSet extends PopupControlSet implements Tas protected void refreshDisplayView() { TextView dateDisplay = (TextView) getDisplayView().findViewById(R.id.display_row_edit); String toDisplay = dateAndTimePicker.getDisplayString(activity); - dateDisplay.setText(toDisplay); + if (dateDisplay != null) + dateDisplay.setText(toDisplay); } @Override @@ -64,20 +65,22 @@ public class TaskRabbitDeadlineControlSet extends PopupControlSet implements Tas @Override public void readFromModel(JSONObject json, String key) { - long dateValue = json.optLong(key); - Date currentDate = null; - if (dateValue < 24) { + + long dateValue = json.optLong(key); + Date currentDate = null; + if (dateValue < 24) { + if(dateAndTimePicker.constructDueDate() > 0) return; currentDate = new Date(); currentDate.setHours((int)dateValue); currentDate.setMinutes(0); currentDate.setSeconds(0); - } - else { - currentDate = new Date(dateValue); - } + } + else { + currentDate = new Date(dateValue); + } - dateAndTimePicker.initializeWithDate(DateUtilities.dateToUnixtime(currentDate)+ DateUtilities.ONE_DAY); - refreshDisplayView(); + dateAndTimePicker.initializeWithDate(DateUtilities.dateToUnixtime(currentDate)+ DateUtilities.ONE_DAY); + refreshDisplayView(); } diff --git a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitLocationControlSet.java b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitLocationControlSet.java index e01f3c006..d9450f067 100644 --- a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitLocationControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitLocationControlSet.java @@ -12,7 +12,6 @@ import android.content.Intent; import android.location.Address; import android.location.Geocoder; import android.location.Location; -import android.support.v4.app.Fragment; import android.text.TextUtils; import android.util.Log; import android.view.View; @@ -22,30 +21,29 @@ import android.widget.TextView; import com.timsu.astrid.R; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.helper.TaskEditControlSet; -import com.todoroo.astrid.taskrabbit.TaskRabbitControlSet.TaskRabbitSetListener; +import com.todoroo.astrid.taskrabbit.TaskRabbitActivity.ActivityResultSetListener; +import com.todoroo.astrid.taskrabbit.TaskRabbitActivity.TaskRabbitSetListener; -public class TaskRabbitLocationControlSet extends TaskEditControlSet implements TaskRabbitSetListener { +public class TaskRabbitLocationControlSet extends TaskEditControlSet implements TaskRabbitSetListener, ActivityResultSetListener { private final int setID; - private final int type; private final TextView displayText; private final TextView displayEdit; - private final Fragment fragment; + private final Activity activity; private Location location; private String locationName; public int REQUEST_CODE_TASK_RABBIT_LOCATION = 6; - public TaskRabbitLocationControlSet(final Fragment fragment , int viewLayout, int title, int setID, int type) { - super(fragment.getActivity(), viewLayout); + public TaskRabbitLocationControlSet(final Activity activity , int viewLayout, int title, int setID) { + super(activity, viewLayout); this.setID = setID; - this.type = type; - this.fragment = fragment; + this.activity = activity; // DependencyInjectionService.getInstance().inject(this); REQUEST_CODE_TASK_RABBIT_LOCATION += setID; displayText = (TextView) getDisplayView().findViewById(R.id.display_row_title); - displayText.setText(getActivity().getString(title)); + displayText.setText(activity.getString(title)); displayEdit = (TextView) getDisplayView().findViewById(R.id.display_row_edit); displayEdit.setText(getLocationText()); @@ -54,19 +52,14 @@ public class TaskRabbitLocationControlSet extends TaskEditControlSet implements @Override public void onClick(View v) { - Intent mapIntent = new Intent(getActivity(), TaskRabbitMapActivity.class); - fragment.startActivityForResult(mapIntent, REQUEST_CODE_TASK_RABBIT_LOCATION); + Intent mapIntent = new Intent(activity, TaskRabbitMapActivity.class); + activity.startActivityForResult(mapIntent, REQUEST_CODE_TASK_RABBIT_LOCATION); } }); } - private Activity getActivity() { - return fragment.getActivity(); - } - - private void parseTaskLocation(JSONObject json) { if (json == null) return; @@ -80,14 +73,13 @@ public class TaskRabbitLocationControlSet extends TaskEditControlSet implements } public String getLocationText () { - if (!TextUtils.isEmpty(locationName) && location != null) - return String.format("%S (%d : %d)", locationName, location.getLongitude(), location.getLatitude()); + if (!TextUtils.isEmpty(locationName)) + return locationName; - return "Current location"; + return "Location is set"; } public boolean activityResult (int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_TASK_RABBIT_LOCATION && resultCode == Activity.RESULT_OK) { - int lng = data.getIntExtra("lng", 0); int lat = data.getIntExtra("lat", 0); locationName = data.getStringExtra("name"); @@ -115,7 +107,7 @@ public class TaskRabbitLocationControlSet extends TaskEditControlSet implements private void getAddressFromLocation(Location location){ try { - Geocoder geocoder = new Geocoder(fragment.getActivity(), Locale.getDefault()); + Geocoder geocoder = new Geocoder(activity, Locale.getDefault()); // Acquire a reference to the system Location Manager List
addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1); if (addresses != null){ @@ -149,16 +141,19 @@ public class TaskRabbitLocationControlSet extends TaskEditControlSet implements @Override public void saveToJSON(JSONObject json, String key) throws JSONException { json.put(key, getTaskLocation()); + Log.d("LOCATION SAVE", json.toString()); } @Override public void writeToJSON(JSONObject json, String key) throws JSONException { + Log.d("LOCATION", "LOCEIJREGHSK"); JSONArray locations = json.optJSONArray("other_locations_attributes"); if (locations == null) { locations = new JSONArray(); } locations.put(getTaskLocation()); json.put("other_locations_attributes", locations); + Log.d("LOCATION", "LALALALAL" + json.toString()); } @@ -178,6 +173,7 @@ public class TaskRabbitLocationControlSet extends TaskEditControlSet implements locationObject.put("lat", location.getLatitude()); } else { + // TODO FIX THIS DON"T PUT IN ADDRESSES locationObject.put("address", "300 Beale"); locationObject.put("city", "San Francisco"); locationObject.put("state", "CA"); diff --git a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitMapActivity.java b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitMapActivity.java index 06439eeb0..b30f8a63d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitMapActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitMapActivity.java @@ -5,6 +5,8 @@ import java.util.Locale; import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; import android.graphics.drawable.Drawable; import android.location.Address; import android.location.Geocoder; @@ -14,9 +16,10 @@ import android.location.LocationManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.provider.Settings; import android.view.View; -import android.widget.Button; import android.widget.EditText; +import android.widget.ImageButton; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; @@ -33,6 +36,7 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen private MapController mapController; public Location location; private EditText searchText; + private TaskRabbitMapOverlayItem currentOverlayItem; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) @@ -51,31 +55,33 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen List mapOverlays = mapView.getOverlays(); Drawable drawable = this.getResources().getDrawable(R.drawable.icon_locale); - TaskRabbitMapOverlayItem itemizedoverlay = new TaskRabbitMapOverlayItem(drawable, this); + currentOverlayItem = new TaskRabbitMapOverlayItem(drawable, this); GeoPoint point = null; + + mapController = mapView.getController(); if(lastKnownLocation != null) { point = new GeoPoint((int)(lastKnownLocation.getLatitude()*1E6),(int)(lastKnownLocation.getLongitude()*1E6)); - } - else { - point = new GeoPoint(19240000,-99120000); - } + OverlayItem overlayitem = new OverlayItem(point, "Set this location", "Send this location to Task Rabbit!"); + currentOverlayItem.addOverlay(overlayitem); + mapOverlays.add(currentOverlayItem); - OverlayItem overlayitem = new OverlayItem(point, "Set this location", "For the rabbits!"); - itemizedoverlay.addOverlay(overlayitem); - mapOverlays.add(itemizedoverlay); + mapController.animateTo(point); + mapController.setZoom(17); + mapView.invalidate(); + } + if ( !locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER ) || !locationManager.isProviderEnabled( LocationManager.NETWORK_PROVIDER )) { + buildAlertMessageNoGps(); + } - mapController = mapView.getController(); - mapController.animateTo(point); - mapController.setZoom(17); - mapView.invalidate(); searchText=(EditText)findViewById(R.id.search_text); - Button searchButton=(Button)findViewById(R.id.search_button); + ImageButton searchButton=(ImageButton)findViewById(R.id.search_button); + searchButton.setImageResource(android.R.drawable.ic_menu_search); searchButton.setOnClickListener(new View.OnClickListener() { @Override @@ -86,8 +92,32 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen } }); + + } + + public String getSearchText() { + return searchText.getText().toString(); + } + + private void buildAlertMessageNoGps() { + final AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage("GPS needs to be enabled in order to add location based tasks. Do you want to enable it?") + .setCancelable(false) + .setPositiveButton("Yes", new DialogInterface.OnClickListener() { + public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) { + startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); + } + }) + .setNegativeButton("No", new DialogInterface.OnClickListener() { + public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) { + dialog.cancel(); + } + }); + final AlertDialog alert = builder.create(); + alert.show(); } + private final Handler handler = new Handler() { @Override @@ -96,6 +126,7 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen case 1: mapView.invalidate(); + currentOverlayItem.onTap(0); // What to do when ready, example: break; case -1: @@ -131,16 +162,16 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen (int) (addresses.get(0).getLongitude() * 1E6)); Drawable drawable = TaskRabbitMapActivity.this.getResources().getDrawable(R.drawable.icon_locale); - TaskRabbitMapOverlayItem itemizedoverlay = new TaskRabbitMapOverlayItem(drawable, TaskRabbitMapActivity.this); + currentOverlayItem = new TaskRabbitMapOverlayItem(drawable, TaskRabbitMapActivity.this); mapController.animateTo(q); mapController.setZoom(12); OverlayItem overlayitem = new OverlayItem(q, "Set this location", "For the rabbits!"); - itemizedoverlay.addOverlay(overlayitem); + currentOverlayItem.addOverlay(overlayitem); List mapOverlays = mapView.getOverlays(); mapOverlays.clear(); - mapOverlays.add(itemizedoverlay); + mapOverlays.add(currentOverlayItem); Message successMessage = new Message(); successMessage.what = 1; @@ -169,11 +200,11 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen private void updateLocationOverlay() { if (location == null) { return; }; List mapOverlays = mapView.getOverlays(); - Drawable drawable = this.getResources().getDrawable(R.drawable.gl_alarm); + Drawable drawable = this.getResources().getDrawable(R.drawable.icon_locale); TaskRabbitMapOverlayItem myItemizedOverlay = new TaskRabbitMapOverlayItem(drawable); GeoPoint point = new GeoPoint((int)(location.getLatitude() * 1E6), (int)(location.getLongitude() * 1E6)); - OverlayItem overlayitem = new OverlayItem(point, "Astrid!!", "WOrks!"); + OverlayItem overlayitem = new OverlayItem(point, "Set this location", "For the rabbits!"); myItemizedOverlay.addOverlay(overlayitem); mapOverlays.add(myItemizedOverlay); } @@ -185,7 +216,9 @@ public class TaskRabbitMapActivity extends MapActivity implements LocationListen double lng = location.getLongitude(); this.location = location; GeoPoint p = new GeoPoint((int) lat * 1000000, (int) lng * 1000000); + updateLocationOverlay(); mapController.animateTo(p); + } } @Override diff --git a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitMapOverlayItem.java b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitMapOverlayItem.java index 2dc433b30..38e9b7265 100644 --- a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitMapOverlayItem.java +++ b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitMapOverlayItem.java @@ -19,7 +19,7 @@ public class TaskRabbitMapOverlayItem extends ItemizedOverlay { private final ArrayList mOverlays = new ArrayList(); private Drawable defaultMarker; - private Activity mActivity; + private TaskRabbitMapActivity mActivity; private OverlayItem inDrag; private int xDragImageOffset=0; private int yDragImageOffset=0; @@ -33,7 +33,7 @@ public class TaskRabbitMapOverlayItem extends ItemizedOverlay { super(boundCenterBottom(defaultMarker)); } - public TaskRabbitMapOverlayItem(Drawable defaultMarker, Activity activity) { + public TaskRabbitMapOverlayItem(Drawable defaultMarker, TaskRabbitMapActivity activity) { super(boundCenterBottom(defaultMarker)); this.defaultMarker = defaultMarker; mActivity = activity; @@ -88,6 +88,7 @@ public class TaskRabbitMapOverlayItem extends ItemizedOverlay { Intent data = new Intent(); data.putExtra("lat",selectedItem.getPoint().getLatitudeE6()); data.putExtra("lng",selectedItem.getPoint().getLongitudeE6()); + data.putExtra("name",mActivity.getSearchText()); mActivity.setResult(Activity.RESULT_OK, data); mActivity.finish(); } diff --git a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitNameControlSet.java b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitNameControlSet.java index 97e0fc27d..fd18b01e9 100644 --- a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitNameControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitNameControlSet.java @@ -1,26 +1,80 @@ package com.todoroo.astrid.taskrabbit; +import java.io.ByteArrayOutputStream; + import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.text.TextUtils; +import android.util.Base64; +import android.util.Log; +import android.view.View; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.timsu.astrid.R; +import com.todoroo.astrid.actfm.ActFmCameraModule; +import com.todoroo.astrid.actfm.ActFmCameraModule.CameraResultCallback; +import com.todoroo.astrid.actfm.ActFmCameraModule.ClearImageCallback; +import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.taskrabbit.TaskRabbitActivity.ActivityResultSetListener; +import com.todoroo.astrid.taskrabbit.TaskRabbitActivity.TaskRabbitSetListener; +import com.todoroo.astrid.ui.PopupControlSet; + +public class TaskRabbitNameControlSet extends PopupControlSet implements TaskRabbitSetListener, ActivityResultSetListener{ -import com.todoroo.astrid.taskrabbit.TaskRabbitControlSet.TaskRabbitSetListener; -import com.todoroo.astrid.ui.EditNotesControlSet; + protected final EditText editText; + protected final TextView notesPreview; + private final LinearLayout notesBody; + + + private final ImageButton pictureButton; + private Bitmap pendingCommentPicture = null; + private int cameraButton; -public class TaskRabbitNameControlSet extends EditNotesControlSet implements TaskRabbitSetListener{ public TaskRabbitNameControlSet(Activity activity, int viewLayout, int displayViewLayout, int titleID, int i) { - super(activity, viewLayout, displayViewLayout); - displayText.setText("Restaurant name"); - } + super(activity, viewLayout, displayViewLayout, titleID); + editText = (EditText) getView().findViewById(R.id.notes); + notesPreview = (TextView) getDisplayView().findViewById(R.id.display_row_edit); + notesBody = (LinearLayout) getDisplayView().findViewById(R.id.notes_body); + dialog.getWindow() + .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + displayText.setText(activity.getString(titleID));; + editText.setMaxLines(Integer.MAX_VALUE); - @Override - public void readFromModel(JSONObject json, String key) { - editText.setTextKeepState(json.optString(key, "")); - notesPreview.setText(json.optString(key, "")); + + pictureButton = (ImageButton) getDisplayView().findViewById(R.id.picture); + if (pictureButton != null) { + + final ClearImageCallback clearImage = new ClearImageCallback() { + @Override + public void clearImage() { + pendingCommentPicture = null; + pictureButton.setImageResource(R.drawable.camera_button); + } + }; + pictureButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (pendingCommentPicture != null) + ActFmCameraModule.showPictureLauncher(TaskRabbitNameControlSet.this.activity, clearImage); + else + ActFmCameraModule.showPictureLauncher(TaskRabbitNameControlSet.this.activity, null); + } + }); + } + } @Override @@ -30,9 +84,99 @@ public class TaskRabbitNameControlSet extends EditNotesControlSet implements Tas @Override public void writeToJSON(JSONObject json, String key) throws JSONException { - json.put(key, editText.getText().toString()); + String nameKey = activity.getString(R.string.tr_set_key_description); + if (key.equals(activity.getString(R.string.tr_set_key_name)) && json.has(nameKey)) { + json.put(nameKey, json.optString(nameKey, "") + "\nRestaurant Name: " + editText.getText().toString()); + } + else { + json.put(nameKey, json.optString(nameKey, "") + "\n" + editText.getText().toString()); + } + + if (pendingCommentPicture != null) { + String picture = buildPictureData(pendingCommentPicture); + JSONObject pictureArray = new JSONObject(); + pictureArray.put("image", picture); + json.put("uploaded_photos_attributes", new JSONObject().put("1", pictureArray)); + Log.d("The task json", json.toString()); + } + } + + public static String buildPictureData(Bitmap bitmap) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + if(bitmap.getWidth() > 512 || bitmap.getHeight() > 512) { + float scale = Math.min(512f / bitmap.getWidth(), 512f / bitmap.getHeight()); + bitmap = Bitmap.createScaledBitmap(bitmap, (int)(scale * bitmap.getWidth()), + (int)(scale * bitmap.getHeight()), false); + } + bitmap.compress(Bitmap.CompressFormat.JPEG, 50, baos); + byte[] bytes = baos.toByteArray(); + return Base64.encodeToString(bytes, Base64.DEFAULT); + } + + @Override + public void readFromModel(JSONObject json, String key) { + if (json.optInt(key, -1) == 0) { + editText.setHint(displayText.getText().toString()); + return; + } + String value = json.optString(key, ""); + if (!TextUtils.isEmpty(value)) { + editText.setTextKeepState(value); + notesPreview.setText(value); + } + + } + + @Override + public boolean activityResult (int requestCode, int resultCode, Intent data) { + if (pictureButton != null) { + CameraResultCallback callback = new CameraResultCallback() { + @Override + public void handleCameraResult(Bitmap bitmap) { + Log.d("CAMERA CLALLBACK", "PICTURE SHOULD BE SET"); + pendingCommentPicture = bitmap; + pictureButton.setImageBitmap(pendingCommentPicture); + } + }; + + return (ActFmCameraModule.activityResult(activity, + requestCode, resultCode, data, callback)); + } + return false; + } + + + @Override + protected void refreshDisplayView() { + notesPreview.setText(editText.getText()); + } + + @Override + public void readFromTask(Task task) { } + @Override + public String writeToModel(Task task) { + return null; + } + + @Override + protected void onOkClick() { + super.onOkClick(); + InputMethodManager imm = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); + } + + @Override + protected void onCancelClick() { + super.onCancelClick(); + InputMethodManager imm = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); + } + + public boolean hasNotes() { + return !TextUtils.isEmpty(editText.getText()); + } } diff --git a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitRow.java b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitRow.java deleted file mode 100644 index bdd9239f1..000000000 --- a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitRow.java +++ /dev/null @@ -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 - } - -} diff --git a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitSpinnerControlSet.java b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitSpinnerControlSet.java index 730cb7f6b..f5486f337 100644 --- a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitSpinnerControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitSpinnerControlSet.java @@ -5,9 +5,12 @@ import org.json.JSONObject; import android.app.Activity; import android.content.res.TypedArray; -import android.support.v4.app.Fragment; import android.text.TextUtils; import android.util.Log; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.TextView; @@ -15,62 +18,112 @@ import android.widget.TextView; import com.timsu.astrid.R; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.helper.TaskEditControlSet; -import com.todoroo.astrid.taskrabbit.TaskRabbitControlSet.TaskRabbitSetListener; +import com.todoroo.astrid.taskrabbit.TaskRabbitActivity.TaskRabbitSetListener; public class TaskRabbitSpinnerControlSet extends TaskEditControlSet implements TaskRabbitSetListener{ private final Spinner spinner; private final int setID; - private final int type; private final int titleID; private final TextView displayText; - private final Fragment fragment; - private final ArrayAdapter adapter; + private final TextView displayEdit; + private ArrayAdapter adapter; + private final Activity activity; - public TaskRabbitSpinnerControlSet(final Fragment fragment, int viewLayout, int title, int setID, int type) { - super(fragment.getActivity(), viewLayout); + public TaskRabbitSpinnerControlSet(final Activity activity, int viewLayout, int title, int setID) { + super(activity, viewLayout); this.setID = setID; - this.type = type; - this.fragment = fragment; this.titleID = title; + this.activity = activity; // DependencyInjectionService.getInstance().inject(this); - spinner = (Spinner)getView().findViewById(R.id.display_row_edit); - spinner.setPrompt(getActivity().getString(title)); +// spinner = new Spinner(fragment.activity); + spinner = (Spinner) getDisplayView().findViewById(R.id.spinner); + spinner.setPrompt(activity.getString(title)); + + displayEdit = (TextView) getDisplayView().findViewById(R.id.display_row_edit); displayText = (TextView) getDisplayView().findViewById(R.id.display_row_title); displayText.setText(title); - String[] listTypes; - if (title == R.string.tr_set_named_price){ - listTypes = getStringDefaultArray(type, R.array.tr_default_price_type_array); - } - else { - listTypes = getStringDefaultArray(setID, R.array.tr_default_array); - } + String[] listTypes = getStringDefaultArray(setID, R.array.tr_default_array); + adapter = new ArrayAdapter( - getActivity(), android.R.layout.simple_spinner_item, listTypes); + activity, android.R.layout.simple_spinner_item, listTypes); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - getActivity().runOnUiThread(new Runnable() { + activity.runOnUiThread(new Runnable() { @Override public void run() { spinner.setAdapter(adapter); - spinner.setSelection(0); // plus 1 for the no selection item } }); + + spinner.setOnItemSelectedListener(new OnItemSelectedListener() { + + @Override + public void onItemSelected(AdapterView arg0, View arg1, + int arg2, long arg3) { + Log.d("SELECTED ITEM", "SLECTED :" + arg2 + " ACTUAL: " + spinner.getSelectedItemPosition() + " STRING: " + spinner.getSelectedItem().toString()); + + displayEdit.setText(getDisplayEditText()); + } + + @Override + public void onNothingSelected(AdapterView arg0) { + + } + }); + Log.d("SELECTED ITEM", " ACTUAL: " + spinner.getSelectedItemPosition()); + getView().setOnClickListener(getDisplayClickListener()); + + } + + + protected OnClickListener getDisplayClickListener() { + return new OnClickListener() { + @Override + public void onClick(View v) { + spinner.performClick(); + } + }; } public String[] getStringDefaultArray(int position, int arrayType) { - TypedArray arrays = getActivity().getResources().obtainTypedArray(arrayType); + TypedArray arrays = activity.getResources().obtainTypedArray(arrayType); int arrayID = arrays.getResourceId(position, -1); - return getActivity().getResources().getStringArray(arrayID); + return activity.getResources().getStringArray(arrayID); } + public void resetAdapter(String[] items) { + if (adapter == null) return; + adapter = new ArrayAdapter( + activity, android.R.layout.simple_spinner_item, items); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + spinner.setAdapter(adapter); + spinner.setSelection(0); // plus 1 for the no selection item + } + }); + + spinner.setOnItemSelectedListener(new OnItemSelectedListener() { - private Activity getActivity() { - return fragment.getActivity(); + @Override + public void onItemSelected(AdapterView arg0, View arg1, + int arg2, long arg3) { + Log.d("SELECTED ITEM", "SLECTED :" + arg2 + " ACTUAL: " + spinner.getSelectedItemPosition() + " STRING: " + spinner.getSelectedItem().toString()); + + displayEdit.setText(getDisplayEditText()); + } + + @Override + public void onNothingSelected(AdapterView arg0) { + + } + }); } public int selectedPosition() { @@ -79,11 +132,35 @@ public class TaskRabbitSpinnerControlSet extends TaskEditControlSet implements T @Override public void readFromModel(JSONObject json, String key) { - int intValue = json.optInt(key); - if (intValue < spinner.getCount()) + + if (titleID == R.string.tr_set_named_price && json.has(activity.getString(R.string.tr_set_key_type))){ + String[] listTypes = getStringDefaultArray(json.optInt(activity.getString(R.string.tr_set_key_type), 0), R.array.tr_default_price_type_array); + resetAdapter(listTypes); + } + else if (titleID == R.string.tr_set_skill_required && json.has(activity.getString(R.string.tr_set_key_type))){ + String[] listTypes = getStringDefaultArray(json.optInt(activity.getString(R.string.tr_set_key_type), 0), R.array.tr_default_skill_type_array); + resetAdapter(listTypes); + } + int intValue = json.optInt(key, 0); + + Log.d("iii", "" + spinner.getCount()); + if (intValue < spinner.getCount()) { spinner.setSelection(intValue); + displayEdit.setText(getDisplayEditText()); + + + } + Log.d("dfhjskhfds", ""+intValue); } + private String getDisplayEditText() { + if(titleID == R.string.tr_set_cost_in_cents) { + return activity.getResources().getStringArray(R.array.tr_default_cost_in_cents_display)[spinner.getSelectedItemPosition()]; + } + else { + return spinner.getSelectedItem().toString(); + } + } @Override public void saveToJSON(JSONObject json, String key) throws JSONException { json.put(key, spinner.getSelectedItemPosition()); diff --git a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitTaskContainer.java b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitTaskContainer.java index 20664a7aa..35d818e51 100644 --- a/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitTaskContainer.java +++ b/astrid/plugin-src/com/todoroo/astrid/taskrabbit/TaskRabbitTaskContainer.java @@ -42,17 +42,28 @@ public class TaskRabbitTaskContainer extends SyncContainer { return getJSONData(TaskRabbitMetadata.DATA_REMOTE); } - public String getTaskID() { - return trTask.getValue(TaskRabbitMetadata.ID); + public int getTaskID() { + + try { + int taskID = Integer.parseInt(trTask.getValue(TaskRabbitMetadata.ID)); + if(taskID > 0) + return taskID; + } + catch (Exception e) { + e.printStackTrace(); + } + return 0; } private JSONObject getJSONData(StringProperty key) { - String jsonString = trTask.getValue(key); - if (!TextUtils.isEmpty(jsonString)) { - try { - return new JSONObject(jsonString); - } catch (Exception e) { - Log.e("Task Rabbit task container", //$NON-NLS-1$ - e.toString()); + if(trTask.containsNonNullValue(key)) { + String jsonString = trTask.getValue(key); + if (!TextUtils.isEmpty(jsonString)) { + try { + return new JSONObject(jsonString); + } catch (Exception e) { + Log.e("Task Rabbit task container", //$NON-NLS-1$ + e.toString()); + } } } return null; diff --git a/astrid/res/layout/control_set_notes_display.xml b/astrid/res/layout/control_set_notes_display.xml index 335780189..d7385910c 100644 --- a/astrid/res/layout/control_set_notes_display.xml +++ b/astrid/res/layout/control_set_notes_display.xml @@ -25,12 +25,12 @@ android:text="@string/TEA_note_label" /> diff --git a/astrid/res/layout/task_rabbit_control_set_description.xml b/astrid/res/layout/task_rabbit_control_set_description.xml new file mode 100644 index 000000000..9616ec3c6 --- /dev/null +++ b/astrid/res/layout/task_rabbit_control_set_description.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/astrid/res/layout/task_rabbit_enter.xml b/astrid/res/layout/task_rabbit_enter.xml index 308128ad4..cf83ee616 100644 --- a/astrid/res/layout/task_rabbit_enter.xml +++ b/astrid/res/layout/task_rabbit_enter.xml @@ -1,6 +1,13 @@ - + + - - + android:background="#00000000" + android:orientation="vertical" + android:padding="10dip" > + android:layout_height="wrap_content" + android:visibility="gone" /> + + + + + - - -