Integrated OpenCRX plugin with Astrid.

pull/14/head
Ikari 13 years ago committed by Tim Su
parent 8f520a8088
commit b5b6294972

2
.gitignore vendored

@ -11,4 +11,4 @@ release
dev
lp-translations/
translations/strings.xml
keys

@ -72,6 +72,8 @@ public class DependencyInjectionService {
return true;
if(packageName.startsWith("org.weloveastrid"))
return true;
if(packageName.startsWith("ru.otdelit"))
return true;
return false;
}

@ -16,7 +16,8 @@
<classpathentry exported="true" kind="lib" path="libs/todoroo-g.jar"/>
<classpathentry kind="lib" path="libs/framework.jar"/>
<classpathentry kind="src" path="GreenDroid_src"/>
<classpathentry kind="src" path="astridApi_src"/>
<classpathentry kind="src" path="facebook_src"/>
<classpathentry kind="src" path="astridApi_src"/>
<classpathentry kind="src" path="facebook_android_src"/>
<classpathentry kind="output" path="ecbuild"/>
</classpath>

@ -47,6 +47,11 @@
<type>2</type>
<locationURI>_android_astridApi_98e6a2cf/src</locationURI>
</link>
<link>
<name>facebook_android_src</name>
<type>2</type>
<locationURI>_android_facebook_android_1d8d51f6/src</locationURI>
</link>
<link>
<name>facebook_src</name>
<type>2</type>

@ -533,8 +533,8 @@
<action android:name="com.todoroo.astrid.REQUEST_SYNC_ACTIONS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</receiver>
<!-- other task actions -->
<receiver android:name="com.todoroo.astrid.core.LinkActionExposer">
<intent-filter>

@ -15,3 +15,4 @@ target=android-8
apk-configurations=
android.library.reference.2=../greendroid/GreenDroid/
android.library.reference.3=../facebook/facebook/
android.library.reference.4=../../astrid-opencrx

@ -0,0 +1,406 @@
package ru.otdelit.astrid.opencrx;
import java.util.ArrayList;
import android.app.Activity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet;
import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.dao.StoreObjectDao.StoreObjectCriteria;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.MetadataApiDao.MetadataCriteria;
import com.todoroo.astrid.service.MetadataService;
/**
* Control Set for managing contact/creator assignments in OpenCRX
*
* @author Andrey Marchenko <igendou@gmail.com>
*
*/
public class OpencrxControlSet implements TaskEditControlSet {
/**
* Class that represents OpenCRX ActivityCreator. Duplicates some functionality of OpenCRX plugin.
*
*/
@SuppressWarnings("unused")
private static class OpencrxActivityCreator {
/** type*/
public static final String TYPE = "opencrx-creator"; //$NON-NLS-1$
/** hashed creator id in opencrx */
public static final LongProperty REMOTE_ID = new LongProperty(StoreObject.TABLE,
StoreObject.ITEM.name);
/** creator name */
public static final StringProperty NAME = new StringProperty(StoreObject.TABLE,
StoreObject.VALUE1.name);
/**
* String ID in OpenCRX system (ActivityCreator)
*/
public static final StringProperty CRX_ID = new StringProperty(StoreObject.TABLE,
StoreObject.VALUE3.name);
// data class-part
private final long id;
private final String name;
private final String crxId;
public OpencrxActivityCreator (StoreObject creatorData) {
this(creatorData.getValue(REMOTE_ID),creatorData.getValue(NAME),
creatorData.containsValue(CRX_ID) ? creatorData.getValue(CRX_ID) : ""); //$NON-NLS-1$
}
public OpencrxActivityCreator(long id, String name, String crxId) {
this.id = id;
this.name = name;
this.crxId = crxId;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public String getCrxId() {
return crxId;
}
@Override
public String toString() {
return name;
}
}
/**
* Class that represents OpenCRX Contact. Duplicates some functionality of OpenCRX plugin.
*
*/
@SuppressWarnings("unused")
private static class OpencrxContact {
public static final String TYPE = "opencrx-contacts"; //$NON-NLS-1$
/** hash contact id in opencrx */
public static final LongProperty REMOTE_ID = new LongProperty(StoreObject.TABLE,
StoreObject.ITEM.name);
/** contact first name */
public static final StringProperty FIRST_NAME = new StringProperty(StoreObject.TABLE,
StoreObject.VALUE1.name);
/** contact last name */
public static final StringProperty LAST_NAME = new StringProperty(StoreObject.TABLE,
StoreObject.VALUE2.name);
/** id in OpenCRX as string */
public static final StringProperty CRX_ID = new StringProperty(StoreObject.TABLE,
StoreObject.VALUE3.name);
private final long id;
private final String email;
private final String firstname;
private final String lastname;
private final String crxId;
public OpencrxContact(long id, String email, String firstname,
String lastname, String crxId) {
this.id = id;
this.email = email;
this.firstname = firstname;
this.lastname = lastname;
this.crxId = crxId;
}
public OpencrxContact(StoreObject userData){
this(userData.getValue(REMOTE_ID), "", userData.getValue(FIRST_NAME), userData.getValue(LAST_NAME), userData.getValue(CRX_ID) ); //$NON-NLS-1$
}
public String getEmail() {
return email;
}
public String getFirstname() {
return firstname;
}
public String getLastname() {
return lastname;
}
public String getCrxId() {
return crxId;
}
public long getId() {
return id;
}
@Override
public String toString() {
String displayString = ""; //$NON-NLS-1$
boolean hasFirstname = false;
boolean hasLastname = false;
if (firstname != null && firstname.length() > 0) {
displayString += firstname;
hasFirstname = true;
}
if (lastname != null && lastname.length() > 0)
hasLastname = true;
if (hasFirstname && hasLastname)
displayString += " "; //$NON-NLS-1$
if (hasLastname)
displayString += lastname;
if (!hasFirstname && !hasLastname && email != null
&& email.length() > 0)
displayString += email;
return displayString;
}
}
// --- instance variables
private final Activity activity;
private final Spinner assignedToSelector;
private final Spinner creatorSelector;
private final AutoCompleteTextView assignedToTextInput;
private final AutoCompleteTextView creatorTextInput;
private ArrayList<OpencrxContact> users = null;
private ArrayList<OpencrxActivityCreator> dashboards = null;
@Autowired
private MetadataService metadataService;
@Autowired
private StoreObjectDao storeObjectDao;
@SuppressWarnings("unused")
public OpencrxControlSet(final Activity activity, ViewGroup parent) {
DependencyInjectionService.getInstance().inject(this);
this.activity = activity;
View view = LayoutInflater.from(activity).inflate(R.layout.opencrx_control, parent, true);
this.assignedToSelector = (Spinner) activity.findViewById(R.id.opencrx_TEA_task_assign);
TextView emptyView = new TextView(activity);
emptyView.setText(activity.getText(R.string.opencrx_no_creator));
assignedToSelector.setEmptyView(emptyView);
this.creatorSelector = (Spinner) activity.findViewById(R.id.opencrx_TEA_dashboard_assign);
this.assignedToTextInput = (AutoCompleteTextView) activity.findViewById(R.id.opencrx_TEA_contact_textinput);
this.creatorTextInput = (AutoCompleteTextView) activity.findViewById(R.id.opencrx_TEA_creator_textinput);
}
@Override
public void readFromTask(Task task) {
Metadata metadata = getTaskMetadata(task.getId());
if(metadata == null)
metadata = OpencrxCoreUtils.INSTANCE.newMetadata();
// Fill the dashboard-spinner and set the current dashboard
long dashboardId = OpencrxCoreUtils.INSTANCE.getDefaultCreator();
if(metadata.containsNonNullValue(OpencrxCoreUtils.ACTIVITY_CREATOR_ID))
dashboardId = metadata.getValue(OpencrxCoreUtils.ACTIVITY_CREATOR_ID);
StoreObject[] dashboardsData = readStoreObjects(OpencrxActivityCreator.TYPE);
dashboards = new ArrayList<OpencrxActivityCreator>(dashboardsData.length);
int dashboardSpinnerIndex = -1;
for (int i=0;i<dashboardsData.length;i++) {
OpencrxActivityCreator dashboard = new OpencrxActivityCreator(dashboardsData[i]);
dashboards.add(dashboard);
if(dashboard.getId() == dashboardId) {
dashboardSpinnerIndex = i;
}
}
//dashboard to not sync as first spinner-entry
dashboards.add(0, new OpencrxActivityCreator(OpencrxCoreUtils.CREATOR_NO_SYNC, activity.getString(R.string.opencrx_no_creator), "")); //$NON-NLS-1$
ArrayAdapter<OpencrxActivityCreator> dashAdapter = new ArrayAdapter<OpencrxActivityCreator>(activity,
android.R.layout.simple_spinner_item, dashboards);
dashAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
creatorSelector.setAdapter(dashAdapter);
creatorSelector.setSelection(dashboardSpinnerIndex+1);
ArrayAdapter<OpencrxActivityCreator> creatorAdapterTextInput = new ArrayAdapter<OpencrxActivityCreator>(activity,
android.R.layout.simple_spinner_item, dashboards);
creatorTextInput.setAdapter(creatorAdapterTextInput);
creatorTextInput.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position,
long id) {
OpencrxActivityCreator creatorInput = (OpencrxActivityCreator) adapter.getItemAtPosition(position);
if (creatorInput == null) return;
int selectedIndex = creatorSelector.getSelectedItemPosition();
for (int i = 0; i < creatorSelector.getAdapter().getCount(); ++i){
OpencrxActivityCreator current = (OpencrxActivityCreator) creatorSelector.getAdapter().getItem(i);
if (current != null && current.getId() == creatorInput.getId()){
selectedIndex = i;
break;
}
}
creatorSelector.setSelection(selectedIndex);
}
});
// Assigned user
long responsibleId = OpencrxCoreUtils.INSTANCE.getDefaultAssignedUser();
if (metadata.containsNonNullValue(OpencrxCoreUtils.ACTIVITY_ASSIGNED_TO_ID)){
responsibleId = metadata.getValue(OpencrxCoreUtils.ACTIVITY_ASSIGNED_TO_ID);
}
StoreObject[] usersData = readStoreObjects(OpencrxContact.TYPE);
this.users = new ArrayList<OpencrxContact>();
for (StoreObject user : usersData){
this.users.add(new OpencrxContact(user));
}
ArrayAdapter<OpencrxContact> usersAdapter = new ArrayAdapter<OpencrxContact>(activity,
android.R.layout.simple_spinner_item, this.users);
usersAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
assignedToSelector.setAdapter(usersAdapter);
int responsibleSpinnerIndex = 0;
for (int i = 0; i < this.users.size() ; i++) {
if (this.users.get(i).getId() == responsibleId ) {
responsibleSpinnerIndex = i;
break;
}
}
assignedToSelector.setSelection(responsibleSpinnerIndex);
ArrayAdapter<OpencrxContact> contactAdapterTextInput = new ArrayAdapter<OpencrxContact>(activity,
android.R.layout.simple_spinner_item, this.users);
assignedToTextInput.setAdapter(contactAdapterTextInput);
assignedToTextInput.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position,
long id) {
OpencrxContact userInput = (OpencrxContact) adapter.getItemAtPosition(position);
if (userInput == null) return;
int selectedIndex = assignedToSelector.getSelectedItemPosition();
for (int i = 0; i < assignedToSelector.getAdapter().getCount(); ++i){
OpencrxContact current = (OpencrxContact) assignedToSelector.getAdapter().getItem(i);
if (current != null && current.getId() == userInput.getId()){
selectedIndex = i;
break;
}
}
assignedToSelector.setSelection(selectedIndex);
}
});
}
@Override
public String writeToModel(Task task) {
Metadata metadata = getTaskMetadata(task.getId());
try {
if (metadata == null) {
metadata = OpencrxCoreUtils.INSTANCE.newMetadata();
}
OpencrxActivityCreator dashboard = (OpencrxActivityCreator) creatorSelector.getSelectedItem();
metadata.setValue(OpencrxCoreUtils.ACTIVITY_CREATOR_ID, dashboard.getId());
OpencrxContact responsibleUser = (OpencrxContact) assignedToSelector.getSelectedItem();
if(responsibleUser == null)
metadata.setValue(OpencrxCoreUtils.ACTIVITY_ASSIGNED_TO_ID, 0L);
else
metadata.setValue(OpencrxCoreUtils.ACTIVITY_ASSIGNED_TO_ID, responsibleUser.getId());
if(metadata.getSetValues().size() > 0) {
metadataService.save(metadata);
task.setValue(Task.MODIFICATION_DATE, DateUtilities.now());
}
} catch (Exception e) {
Log.e("opencrx-error", "Error Saving Metadata", e); //$NON-NLS-1$ //$NON-NLS-2$
}
return null;
}
/**
* Reads metadata out of a task
* @return null if no metadata found
*/
private Metadata getTaskMetadata(long taskId) {
TodorooCursor<Metadata> cursor = metadataService.query(Query.select(Metadata.PROPERTIES).where(
MetadataCriteria.byTaskAndwithKey(taskId, OpencrxCoreUtils.OPENCRX_ACTIVITY_METADATA_KEY))
);
try {
if(cursor.getCount() == 0)
return null;
cursor.moveToFirst();
return new Metadata(cursor);
} finally {
cursor.close();
}
}
private StoreObject[] readStoreObjects(String type) {
StoreObject[] ret;
TodorooCursor<StoreObject> cursor = storeObjectDao.query(Query.select(StoreObject.PROPERTIES).
where(StoreObjectCriteria.byType(type)));
try {
ret = new StoreObject[cursor.getCount()];
for(int i = 0; i < ret.length; i++) {
cursor.moveToNext();
StoreObject dashboard = new StoreObject(cursor);
ret[i] = dashboard;
}
} finally {
cursor.close();
}
return ret;
}
}

@ -0,0 +1,124 @@
package ru.otdelit.astrid.opencrx;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageManager.NameNotFoundException;
import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.sync.SyncProviderUtilities;
public class OpencrxCoreUtils extends SyncProviderUtilities{
public static final String OPENCRX_ACTIVITY_METADATA_KEY = "opencrx"; //$NON-NLS-1$
public static final String IDENTIFIER = "crx"; //$NON-NLS-1$
public static final LongProperty ACTIVITY_ID = new LongProperty(Metadata.TABLE, Metadata.VALUE1.name);
public static final LongProperty ACTIVITY_CREATOR_ID = new LongProperty(Metadata.TABLE, Metadata.VALUE2.name);
public static final LongProperty ACTIVITY_USERCREATOR_ID = new LongProperty(Metadata.TABLE, Metadata.VALUE3.name);
public static final LongProperty ACTIVITY_ASSIGNED_TO_ID = new LongProperty(Metadata.TABLE, Metadata.VALUE4.name);
public static final StringProperty ACTIVITY_CRX_ID = new StringProperty(Metadata.TABLE, Metadata.VALUE5.name);
private static final String PREF_USER_ID = "crx_userid"; //$NON-NLS-1$
private static final String PREF_DEFAULT_CREATOR = "opencrx_defaultcreator"; //$NON-NLS-1$
private static final String PREFS_FILE = "crx-prefs"; //$NON-NLS-1$
private static final String OPENCRX_PACKAGE = "ru.otdelit.astrid.opencrx"; //$NON-NLS-1$
public static final long CREATOR_NO_SYNC = -1;
public static final OpencrxCoreUtils INSTANCE = new OpencrxCoreUtils();
private OpencrxCoreUtils(){
// prevent instantiation
}
public Metadata newMetadata() {
Metadata metadata = new Metadata();
metadata.setValue(Metadata.KEY, OPENCRX_ACTIVITY_METADATA_KEY);
metadata.setValue(ACTIVITY_ID, 0L);
metadata.setValue(ACTIVITY_CREATOR_ID, getDefaultCreator());
metadata.setValue(ACTIVITY_USERCREATOR_ID, getDefaultAssignedUser());
metadata.setValue(ACTIVITY_ASSIGNED_TO_ID, getDefaultAssignedUser());
metadata.setValue(ACTIVITY_CRX_ID, ""); //$NON-NLS-1$
return metadata;
}
@Override
public void stopOngoing() {
SharedPreferences sharedPreferences = OpencrxCoreUtils.getPrefs();
if (sharedPreferences != null){
Editor editor = sharedPreferences.edit();
editor.putBoolean(getIdentifier() + PREF_ONGOING, false);
editor.commit();
}
}
/**
* Gets default creator from setting
* @return CREATOR_NO_SYNC if should not sync, otherwise remote id
*/
public long getDefaultCreator() {
long defaultCreatorId = CREATOR_NO_SYNC ;
SharedPreferences sharedPreferences = OpencrxCoreUtils.getPrefs();
if (sharedPreferences != null){
String defCreatorString = sharedPreferences.getString(PREF_DEFAULT_CREATOR, String.valueOf(CREATOR_NO_SYNC));
try{
defaultCreatorId = Long.parseLong(defCreatorString);
}catch(Exception ex){
defaultCreatorId = CREATOR_NO_SYNC;
}
}
return defaultCreatorId;
}
public long getDefaultAssignedUser(){
SharedPreferences sharedPreferences = OpencrxCoreUtils.getPrefs();
if (sharedPreferences != null){
return sharedPreferences.getLong(PREF_USER_ID, -1);
}else{
return -1;
}
}
protected static SharedPreferences getPrefs() {
try {
Context crxContext = ContextManager.getContext().createPackageContext(OPENCRX_PACKAGE, 0);
SharedPreferences sharedPreferences = crxContext.getSharedPreferences(PREFS_FILE,
Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
return sharedPreferences;
} catch (NameNotFoundException e) {
return null;
}
}
@Override
public boolean isLoggedIn() {
SharedPreferences sharedPreferences = OpencrxCoreUtils.getPrefs();
if (sharedPreferences != null)
return sharedPreferences.getString(getIdentifier() + PREF_TOKEN, null) != null;
else
return false;
}
@Override
public String getIdentifier() {
return IDENTIFIER;
}
@Override
public int getSyncIntervalKey() {
return 0;
}
}

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. -->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<!-- opencrx task assignment controlset -->
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/opencrx_TEA_creator_assign_label"
style="@style/TextAppearance.GEN_EditLabel" />
<AutoCompleteTextView
android:id="@+id/opencrx_TEA_creator_textinput"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/opencrx_creator_input_hint"
/>
<Spinner
android:id="@+id/opencrx_TEA_dashboard_assign"
android:prompt="@string/opencrx_TEA_creator_assign_label"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/opencrx_TEA_task_assign_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/opencrx_TEA_task_assign_label"
style="@style/TextAppearance.GEN_EditLabel" />
<AutoCompleteTextView
android:id="@+id/opencrx_TEA_contact_textinput"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/opencrx_contact_input_hint"
/>
<Spinner
android:id="@+id/opencrx_TEA_task_assign"
android:prompt="@string/opencrx_TEA_task_assign_label"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="1dip"
android:padding="5dip"
android:background="@android:drawable/divider_horizontal_dark" />
</merge>

@ -0,0 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- ====================== Plugin Boilerplate OpenCRX ========================= -->
<!-- filters header: Opencrx -->
<string name="opencrx_FEx_header">OpenCRX</string>
<!-- filter category for opencrx dashboards -->
<string name="opencrx_FEx_dashboard">Создатели деятельности</string>
<!-- filter category for opencrx responsible person -->
<string name="opencrx_FEx_responsible">Ответственный</string>
<!-- opencrx dashboard filter title (%s => dashboardname) -->
<string name="opencrx_FEx_responsible_title">Ответственный \'%s\'</string>
<!-- opencrx detail for showing tasks created by someone else (%s => person name) -->
<string name="opencrx_PDE_task_from">от %s</string>
<!-- replacement string for task edit "Notes" when using opencrx -->
<string name="opencrx_TEA_notes">Добавить комментарий</string>
<!-- ==================================================== Preferences == -->
<!-- Preferences Title: opencrx -->
<string name="opencrx_PPr_header">OpenCRX</string>
<!-- dashboard title for tasks that are not synchronized opencrx -->
<string name="opencrx_no_creator">Не синхронизировать</string>
<!-- preference title for default dashboard opencrx -->
<string name="opencrx_PPr_defaultcreator_title">Создатель деятельности по умолчанию</string>
<!-- preference description for default dashboard (%s -> setting) opencrx -->
<string name="opencrx_PPr_defaultcreator_summary">Добавлять новые задачи в %s</string>
<!-- preference description for default dashboard (when set to 'not synchronized') opencrx -->
<string name="opencrx_PPr_defaultcreator_summary_none">Новые задачи не будут синхонизированы по умолчанию</string>
<!-- OpenCRX host and segment group name -->
<string name="opencrx_group">Адрес OpenCRX</string>
<!-- preference description for OpenCRX host -->
<string name="opencrx_host_title">Адрес</string>
<!-- dialog title for OpenCRX host -->
<string name="opencrx_host_dialog_title">Адрес OpenCRX</string>
<!-- example for OpenCRX host -->
<string name="opencrx_host_summary">Например: <i>mydomain.com/opencrx-rest-CRX</i></string>
<!-- preference description for OpenCRX segment -->
<string name="opencrx_segment_title">Сегмент</string>
<!-- dialog title for OpenCRX segment -->
<string name="opencrx_segment_dialog_title">Синхронизируемый сегмент</string>
<!-- example for OpenCRX segment -->
<string name="opencrx_segment_summary">Например: <i>Standard</i></string>
<!-- default value for OpenCRX segment -->
<string name="opencrx_segment_default">Standard</string>
<!-- preference description for OpenCRX provider -->
<string name="opencrx_provider_title">Provider</string>
<!-- dialog title for OpenCRX provider -->
<string name="opencrx_provider_dialog_title">OpenCRX data provider</string>
<!-- example for OpenCRX provider -->
<string name="opencrx_provider_summary">Например: <i>CRX</i></string>
<!-- default value for OpenCRX provider -->
<string name="opencrx_provider_default">CRX</string>
<!-- ================================================= Login Activity == -->
<!-- Activity Title: OpenCRX Login -->
<string name="opencrx_PLA_title">Войти в OpenCRX</string>
<!-- Instructions: OpenCRX login -->
<string name="opencrx_PLA_body">Войдите в OpenCRX, используя существующую учётную запись!</string>
<!-- Sign In Button opencrx -->
<string name="opencrx_PLA_signIn">Войти</string>
<!-- Login Label OpenCRX -->
<string name="opencrx_PLA_login">Имя пользователя</string>
<!-- Password Label OpenCRX -->
<string name="opencrx_PLA_password">Пароль</string>
<!-- Error Message when fields aren't filled out opencrx -->
<string name="opencrx_PLA_errorEmpty">Ошибка: заполните все поля!</string>
<!-- Error Message when we receive a HTTP 401 Unauthorized opencrx -->
<string name="opencrx_PLA_errorAuth">Ошибка: неправильное имя пользователя или пароль!</string>
<!-- ================================================ Synchronization == -->
<!-- title for notification tray after synchronizing opencrx -->
<string name="opencrx_notification_title">OpenCRX</string>
<!-- text for notification tray when synchronizing opencrx -->
<string name="opencrx_notification_text">%s задач обновлено / кликните для подробностей</string>
<!-- Error msg when io exception opencrx -->
<string name="opencrx_ioerror">Ошибка соединения! Проверьте подключение к интернету.</string>
<!-- Prod Login email not specified opencrx-->
<string name="opencrx_MLA_email_empty">Не указано имя пользователя!</string>
<!-- Prod Login password not specified opencrx-->
<string name="opencrx_MLA_password_empty">Не указан пароль!</string>
<!-- ================================================ labels for layout-elements opencrx== -->
<!-- label for task-assignment spinner on taskeditactivity opencrx -->
<string name="opencrx_TEA_task_assign_label">Назначить эту задачу этому человеку:</string>
<!-- Spinner-item for unassigned tasks on taskeditactivity opencrx -->
<string name="opencrx_TEA_task_unassigned">&lt;Без назначения&gt;</string>
<!-- label for dashboard-assignment spinner on taskeditactivity opencrx -->
<string name="opencrx_TEA_creator_assign_label">Назначить эту задачу этому создателю деятельности:</string>
<!-- Spinner-item for default dashboard on taskeditactivity opencrx -->
<string name="opencrx_TEA_dashboard_default">&lt;По умолчанию&gt;</string>
<string name="CFC_opencrx_in_workspace_text">в среде: ?</string>
<string name="CFC_opencrx_in_workspace_name">в среде...</string>
<string name="CFC_opencrx_assigned_to_text">Присвоено: ?</string>
<string name="CFC_opencrx_assigned_to_name">Присвоено ...</string>
</resources>

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file contains preference keys and preference list values.
These should not be translated
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="opencrx_PPr_interval_key">opencrx_sync_freq</string>
<string name="opencrx_PPr_login">opencrx_email</string>
<string name="opencrx_PPr_password">opencrx_password</string>
<string name="opencrx_PPr_defaultcreator_key">opencrx_defaultcreator</string>
<string name="opencrx_PPr_host_key">opencrx_host</string>
<string name="opencrx_PPr_segment_key">opencrx_segment</string>
<string name="opencrx_PPr_provider_key">opencrx_provider</string>
</resources>

@ -0,0 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- ====================== Plugin Boilerplate ========================= -->
<!-- filters header: OpenCRX -->
<string name="opencrx_FEx_header">OpenCRX</string>
<!-- filter category for OpenCRX ActivityCreators -->
<string name="opencrx_FEx_dashboard">Workspaces</string>
<!-- filter category for OpenCRX responsible person -->
<string name="opencrx_FEx_responsible">Assigned To</string>
<!-- OpenCRX assignedTo filter title (%s => assigned contact) -->
<string name="opencrx_FEx_responsible_title">Assigned To \'%s\'</string>
<!-- detail for showing tasks created by someone else (%s => person name) -->
<string name="opencrx_PDE_task_from">from %s</string>
<!-- replacement string for task edit "Notes" when using OpenCRX -->
<string name="opencrx_TEA_notes">Add a Comment</string>
<string name="opencrx_creator_input_hint">Creator</string>
<string name="opencrx_contact_input_hint">Assigned to</string>
<!-- ==================================================== Preferences == -->
<!-- Preferences Title: OpenCRX -->
<string name="opencrx_PPr_header">OpenCRX</string>
<!-- creator title for tasks that are not synchronized -->
<string name="opencrx_no_creator">(Do Not Synchronize)</string>
<!-- preference title for default creator -->
<string name="opencrx_PPr_defaultcreator_title">Default ActivityCreator</string>
<!-- preference description for default creator (%s -> setting) -->
<string name="opencrx_PPr_defaultcreator_summary">New activities will be created by: %s</string>
<!-- preference description for default dashboard (when set to 'not synchronized') -->
<string name="opencrx_PPr_defaultcreator_summary_none">New activities will not be synchronized by default</string>
<!-- OpenCRX host and segment group name -->
<string name="opencrx_group">OpenCRX server</string>
<!-- preference description for OpenCRX host -->
<string name="opencrx_host_title">Host</string>
<!-- dialog title for OpenCRX host -->
<string name="opencrx_host_dialog_title">OpenCRX host</string>
<!-- example for OpenCRX host -->
<string name="opencrx_host_summary">For example: <i>mydomain.com</i></string>
<!-- preference description for OpenCRX segment -->
<string name="opencrx_segment_title">Segment</string>
<!-- dialog title for OpenCRX segment -->
<string name="opencrx_segment_dialog_title">Synchronized segment</string>
<!-- example for OpenCRX segment -->
<string name="opencrx_segment_summary">For example: <i>Standard</i></string>
<!-- default value for OpenCRX segment -->
<string name="opencrx_segment_default">Standard</string>
<!-- preference description for OpenCRX provider -->
<string name="opencrx_provider_title">Provider</string>
<!-- dialog title for OpenCRX provider -->
<string name="opencrx_provider_dialog_title">OpenCRX data provider</string>
<!-- example for OpenCRX provider -->
<string name="opencrx_provider_summary">For example: <i>CRX</i></string>
<!-- default value for OpenCRX provider -->
<string name="opencrx_provider_default">CRX</string>
<!-- ================================================= Login Activity == -->
<!-- Activity Title: Opencrx Login -->
<string name="opencrx_PLA_title">Log In to OpenCRX</string>
<!-- Instructions: Opencrx login -->
<string name="opencrx_PLA_body">Sign in with your OpenCRX account</string>
<!-- Sign In Button -->
<string name="opencrx_PLA_signIn">Sign In</string>
<!-- Login Label -->
<string name="opencrx_PLA_login">Login</string>
<!-- Password Label -->
<string name="opencrx_PLA_password">Password</string>
<!-- Error Message when fields aren't filled out -->
<string name="opencrx_PLA_errorEmpty">Error: fillout all fields</string>
<!-- Error Message when we receive a HTTP 401 Unauthorized -->
<string name="opencrx_PLA_errorAuth">Error: login or password incorrect!</string>
<!-- ================================================ Synchronization == -->
<!-- title for notification tray after synchronizing -->
<string name="opencrx_notification_title">OpenCRX</string>
<!-- text for notification tray when synchronizing -->
<string name="opencrx_notification_text">%s tasks updated / click for more details</string>
<!-- Error msg when io exception -->
<string name="opencrx_ioerror">Connection Error! Check your Internet connection.</string>
<!-- opencrx Login not specified-->
<string name="opencrx_MLA_email_empty">Login was not specified!</string>
<!-- opencrx password not specified-->
<string name="opencrx_MLA_password_empty">Password was not specified!</string>
<!-- ================================================ labels for layout-elements == -->
<!-- label for task-assignment spinner on taskeditactivity -->
<string name="opencrx_TEA_task_assign_label">Assign this task to this person:</string>
<!-- Spinner-item for unassigned tasks on taskeditactivity -->
<string name="opencrx_TEA_task_unassigned">&lt;Unassigned&gt;</string>
<!-- label for dashboard-assignment spinner on taskeditactivity -->
<string name="opencrx_TEA_creator_assign_label">Assign this task to this creator:</string>
<!-- Spinner-item for default dashboard on taskeditactivity -->
<string name="opencrx_TEA_dashboard_default">&lt;Default&gt;</string>
<string name="CFC_opencrx_in_workspace_text">In workspace: ?</string>
<string name="CFC_opencrx_in_workspace_name">In workspace...</string>
<string name="CFC_opencrx_assigned_to_text">Assigned to: ?</string>
<string name="CFC_opencrx_assigned_to_name">Assigned to...</string>
</resources>

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="@string/sync_SPr_group_status">
<Preference
android:layout="@layout/status_preference"
android:key="@string/sync_SPr_status_key"
android:textSize="24sp"
android:gravity="center"/>
</PreferenceCategory>
<PreferenceCategory
android:title="@string/sync_SPr_group_options">
<ListPreference
android:key="@string/opencrx_PPr_interval_key"
android:entries="@array/sync_SPr_interval_entries"
android:entryValues="@array/sync_SPr_interval_values"
android:title="@string/sync_SPr_interval_title" />
<ListPreference
android:key="@string/opencrx_PPr_defaultcreator_key"
android:title="@string/opencrx_PPr_defaultcreator_title" />
</PreferenceCategory>
<PreferenceCategory
android:title="@string/opencrx_group">
<EditTextPreference
android:key="@string/opencrx_PPr_host_key"
android:title="@string/opencrx_host_title"
android:dialogTitle="@string/opencrx_host_dialog_title"
android:summary="@string/opencrx_host_summary"
/>
<EditTextPreference
android:key="@string/opencrx_PPr_segment_key"
android:title="@string/opencrx_segment_title"
android:dialogTitle="@string/opencrx_segment_dialog_title"
android:summary="@string/opencrx_segment_summary"
android:defaultValue="@string/opencrx_segment_default"
/>
<EditTextPreference
android:key="@string/opencrx_PPr_provider_key"
android:title="@string/opencrx_provider_title"
android:dialogTitle="@string/opencrx_provider_dialog_title"
android:summary="@string/opencrx_provider_summary"
android:defaultValue="@string/opencrx_provider_default"
/>
</PreferenceCategory>
<PreferenceCategory
android:title="@string/sync_SPr_group_actions">
<Preference
android:key="@string/sync_SPr_sync_key"
android:title="@string/sync_SPr_sync" />
<Preference
android:key="@string/sync_SPr_forget_key"
android:title="@string/sync_SPr_forget"
android:summary="@string/sync_SPr_forget_description" />
</PreferenceCategory>
</PreferenceScreen>

@ -26,16 +26,18 @@ import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import ru.otdelit.astrid.opencrx.OpencrxControlSet;
import ru.otdelit.astrid.opencrx.OpencrxCoreUtils;
import android.app.AlertDialog;
import android.app.TabActivity;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Bundle;
@ -48,7 +50,6 @@ import android.view.MenuItem;
import android.view.View;
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.CheckBox;
@ -63,6 +64,7 @@ import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import android.widget.ToggleButton;
import android.widget.AdapterView.OnItemSelectedListener;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.Property.StringProperty;
@ -285,6 +287,16 @@ public final class TaskEditActivity extends TabActivity {
Log.e("astrid-error", "loading-control-set", e); //$NON-NLS-1$ //$NON-NLS-2$
}
try {
if(OpencrxCoreUtils.INSTANCE.isLoggedIn()) {
controls.add(new OpencrxControlSet(TaskEditActivity.this, addonsAddons));
notesEditText.setHint(R.string.opencrx_TEA_notes);
((TextView)findViewById(R.id.notes_label)).setHint(R.string.opencrx_TEA_notes);
}
} catch (Exception e) {
Log.e("astrid-error", "loading-control-set", e); //$NON-NLS-1$ //$NON-NLS-2$
}
controls.add(new TimerControlSet(TaskEditActivity.this, addonsAddons));
controls.add(new AlarmControlSet(TaskEditActivity.this, addonsAddons));
@ -736,7 +748,7 @@ public final class TaskEditActivity extends TabActivity {
int min = Task.IMPORTANCE_MOST;
int max = Task.IMPORTANCE_LEAST;
if(ProducteevUtilities.INSTANCE.isLoggedIn())
if(ProducteevUtilities.INSTANCE.isLoggedIn() || OpencrxCoreUtils.INSTANCE.isLoggedIn())
max = 5;
for(int i = min; i <= max; i++) {
@ -745,7 +757,7 @@ public final class TaskEditActivity extends TabActivity {
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1));
StringBuilder label = new StringBuilder();
if(ProducteevUtilities.INSTANCE.isLoggedIn())
if(ProducteevUtilities.INSTANCE.isLoggedIn() || OpencrxCoreUtils.INSTANCE.isLoggedIn())
label.append(5 - i).append("\n\u2605"); //$NON-NLS-1$
else {
for(int j = Task.IMPORTANCE_LEAST; j >= i; j--)

@ -3,9 +3,9 @@ package com.todoroo.astrid.activity;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicReference;
import org.weloveastrid.rmilk.MilkPreferences;
@ -32,28 +32,28 @@ import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.inputmethod.EditorInfo;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.TextView.OnEditorActionListener;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.Property;
@ -180,7 +180,6 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
/* ======================================================================
* ======================================================= initialization
* ====================================================================== */
static {
AstridDependencyInjector.initialize();
}

@ -5,6 +5,7 @@ import java.util.List;
import org.weloveastrid.rmilk.MilkUtilities;
import ru.otdelit.astrid.opencrx.OpencrxCoreUtils;
import android.Manifest;
import android.app.Activity;
import android.app.AlarmManager;
@ -12,8 +13,8 @@ import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
@ -153,6 +154,7 @@ public class StartupService {
// if sync ongoing flag was set, clear it
ProducteevUtilities.INSTANCE.stopOngoing();
MilkUtilities.INSTANCE.stopOngoing();
OpencrxCoreUtils.INSTANCE.stopOngoing();
BackupService.scheduleService(context);

@ -6,6 +6,7 @@ import java.util.regex.Pattern;
import org.weloveastrid.rmilk.data.MilkTaskFields;
import ru.otdelit.astrid.opencrx.OpencrxCoreUtils;
import android.content.ContentValues;
import com.todoroo.andlib.data.Property;
@ -19,8 +20,8 @@ import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task;
@ -121,6 +122,8 @@ public class TaskService {
continue;
if(MilkTaskFields.METADATA_KEY.equals(metadata.getValue(Metadata.KEY)))
continue;
if(OpencrxCoreUtils.OPENCRX_ACTIVITY_METADATA_KEY.equals(metadata.getValue(Metadata.KEY)))
continue;
metadata.setValue(Metadata.TASK, newId);
metadata.clearValue(Metadata.ID);
@ -342,7 +345,7 @@ public class TaskService {
// not in producteev world: !1 to !4 => importance 3 to 0
int importance = Math.max(Task.IMPORTANCE_MOST, Task.IMPORTANCE_LEAST + 1 - value);
// in the producteev world, !1 to !4 => importance 4 to 1
if(ProducteevUtilities.INSTANCE.isLoggedIn())
if(ProducteevUtilities.INSTANCE.isLoggedIn() || OpencrxCoreUtils.INSTANCE.isLoggedIn())
importance++;
task.setValue(Task.IMPORTANCE, importance);

Loading…
Cancel
Save