mirror of https://github.com/tasks/tasks
Commit all the things--mostly working people view
parent
6060b21757
commit
0ed664a663
@ -0,0 +1,38 @@
|
|||||||
|
package com.todoroo.astrid.people;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.widget.ListView;
|
||||||
|
|
||||||
|
import com.todoroo.astrid.adapter.FilterAdapter;
|
||||||
|
import com.todoroo.astrid.utility.Constants;
|
||||||
|
|
||||||
|
public class PeopleFilterAdapter extends FilterAdapter {
|
||||||
|
|
||||||
|
public static final String BROADCAST_REQUEST_PEOPLE_FILTERS = Constants.PACKAGE + ".REQUEST_PEOPLE_FILTERS"; //$NON-NLS-1$
|
||||||
|
public static final String BROADCAST_SEND_PEOPLE_FILTERS = Constants.PACKAGE + ".SEND_PEOPLE_FILTERS"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public PeopleFilterAdapter(Activity activity, ListView listView,
|
||||||
|
int rowLayout, boolean skipIntentFilters) {
|
||||||
|
super(activity, listView, rowLayout, skipIntentFilters);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getLists() {
|
||||||
|
Intent broadcastIntent = new Intent(BROADCAST_REQUEST_PEOPLE_FILTERS);
|
||||||
|
activity.sendBroadcast(broadcastIntent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerRecevier() {
|
||||||
|
IntentFilter peopleFilter = new IntentFilter(BROADCAST_SEND_PEOPLE_FILTERS);
|
||||||
|
activity.registerReceiver(filterReceiver, peopleFilter);
|
||||||
|
getLists();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unregisterRecevier() {
|
||||||
|
activity.unregisterReceiver(filterReceiver);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,113 @@
|
|||||||
|
package com.todoroo.astrid.people;
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.ContentValues;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.todoroo.andlib.data.TodorooCursor;
|
||||||
|
import com.todoroo.andlib.service.ContextManager;
|
||||||
|
import com.todoroo.andlib.sql.Criterion;
|
||||||
|
import com.todoroo.andlib.sql.Field;
|
||||||
|
import com.todoroo.andlib.sql.Join;
|
||||||
|
import com.todoroo.andlib.sql.Order;
|
||||||
|
import com.todoroo.andlib.sql.Query;
|
||||||
|
import com.todoroo.andlib.sql.QueryTemplate;
|
||||||
|
import com.todoroo.astrid.api.AstridApiConstants;
|
||||||
|
import com.todoroo.astrid.api.Filter;
|
||||||
|
import com.todoroo.astrid.api.FilterListItem;
|
||||||
|
import com.todoroo.astrid.api.FilterWithCustomIntent;
|
||||||
|
import com.todoroo.astrid.api.FilterWithUpdate;
|
||||||
|
import com.todoroo.astrid.core.PluginServices;
|
||||||
|
import com.todoroo.astrid.data.Metadata;
|
||||||
|
import com.todoroo.astrid.data.TagData;
|
||||||
|
import com.todoroo.astrid.data.Task;
|
||||||
|
import com.todoroo.astrid.data.User;
|
||||||
|
import com.todoroo.astrid.tags.TagService;
|
||||||
|
|
||||||
|
public class PeopleFilterExposer extends BroadcastReceiver {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
FilterListItem[] listAsArray = prepareFilters(context);
|
||||||
|
|
||||||
|
Intent broadcastIntent = new Intent(PeopleFilterAdapter.BROADCAST_SEND_PEOPLE_FILTERS);
|
||||||
|
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, listAsArray);
|
||||||
|
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ADDON, "people"); //$NON-NLS-1$
|
||||||
|
context.sendBroadcast(broadcastIntent);
|
||||||
|
}
|
||||||
|
|
||||||
|
private FilterListItem[] prepareFilters(Context context) {
|
||||||
|
TodorooCursor<User> users = PluginServices.getUserDao().query(Query.select(User.PROPERTIES)
|
||||||
|
.orderBy(Order.asc(User.NAME), Order.asc(User.EMAIL)));
|
||||||
|
try {
|
||||||
|
FilterListItem[] items = new FilterListItem[users.getCount()];
|
||||||
|
User user = new User();
|
||||||
|
int i = 0;
|
||||||
|
for (users.moveToFirst(); !users.isAfterLast(); users.moveToNext()) {
|
||||||
|
user.readFromCursor(users);
|
||||||
|
Filter currFilter = filterFromUserData(user);
|
||||||
|
items[i] = currFilter;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return items;
|
||||||
|
} finally {
|
||||||
|
users.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("nls")
|
||||||
|
public static FilterWithCustomIntent filterFromUserData(User user) {
|
||||||
|
String email = user.getValue(User.EMAIL);
|
||||||
|
String[] tags;
|
||||||
|
|
||||||
|
TodorooCursor<TagData> tagsWithUser = PluginServices.getTagDataService().query(Query.select(TagData.NAME)
|
||||||
|
.where(Criterion.or(
|
||||||
|
TagData.MEMBERS.like("%" + email + "%"),
|
||||||
|
TagData.USER.like("%" + email + "%"),
|
||||||
|
TagData.USER_ID.eq(user.getId()))));
|
||||||
|
try {
|
||||||
|
if (tagsWithUser.getCount() == 0) {
|
||||||
|
tags = new String[1];
|
||||||
|
tags[0] = "\"\"";
|
||||||
|
} else {
|
||||||
|
tags = new String[tagsWithUser.getCount()];
|
||||||
|
int i = 0;
|
||||||
|
TagData curr = new TagData();
|
||||||
|
for (tagsWithUser.moveToFirst(); !tagsWithUser.isAfterLast(); tagsWithUser.moveToNext()) {
|
||||||
|
curr.readFromCursor(tagsWithUser);
|
||||||
|
tags[i] = "\"" + curr.getValue(TagData.NAME) + "\"";
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
tagsWithUser.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
String title = user.getDisplayName();
|
||||||
|
QueryTemplate userTemplate = new QueryTemplate().join(Join.inner(Metadata.TABLE.as("mtags"),
|
||||||
|
Criterion.and(Task.ID.eq(Field.field("mtags." + Metadata.TASK.name)),
|
||||||
|
Field.field("mtags." + Metadata.KEY.name).eq(TagService.KEY),
|
||||||
|
Field.field("mtags." + TagService.TAG.name).in(tags),
|
||||||
|
Criterion.or(Task.USER.like("%" + email + "%"),
|
||||||
|
Task.USER_ID.eq(user.getValue(User.REMOTE_ID))))));
|
||||||
|
|
||||||
|
FilterWithUpdate filter = new FilterWithUpdate(title, title, userTemplate, null);
|
||||||
|
|
||||||
|
filter.customTaskList = new ComponentName(ContextManager.getContext(), PersonViewFragment.class);
|
||||||
|
|
||||||
|
ContentValues values = new ContentValues();
|
||||||
|
values.put(Task.USER_ID.name, user.getValue(User.REMOTE_ID));
|
||||||
|
filter.valuesForNewTasks = values;
|
||||||
|
|
||||||
|
String imageUrl = user.getValue(User.PICTURE);
|
||||||
|
filter.imageUrl = imageUrl;
|
||||||
|
|
||||||
|
Bundle extras = new Bundle();
|
||||||
|
extras.putLong(PersonViewFragment.EXTRA_USER_ID_LOCAL, user.getId());
|
||||||
|
filter.customExtras = extras;
|
||||||
|
|
||||||
|
return filter;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.todoroo.astrid.people;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
|
||||||
|
import com.timsu.astrid.R;
|
||||||
|
import com.todoroo.astrid.activity.FilterListFragment;
|
||||||
|
import com.todoroo.astrid.adapter.FilterAdapter;
|
||||||
|
|
||||||
|
public class PeopleListFragment extends FilterListFragment {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected FilterAdapter instantiateAdapter() {
|
||||||
|
return new PeopleFilterAdapter(getActivity(), null, R.layout.filter_adapter_row, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getLayout(Activity activity) {
|
||||||
|
return R.layout.people_list_fragment;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,80 @@
|
|||||||
|
package com.todoroo.astrid.people;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.timsu.astrid.R;
|
||||||
|
import com.todoroo.andlib.utility.AndroidUtilities;
|
||||||
|
import com.todoroo.astrid.activity.FilterListFragment;
|
||||||
|
import com.todoroo.astrid.activity.TaskListActivity;
|
||||||
|
import com.todoroo.astrid.activity.TaskListFragment;
|
||||||
|
import com.todoroo.astrid.api.Filter;
|
||||||
|
import com.todoroo.astrid.api.FilterListItem;
|
||||||
|
import com.todoroo.astrid.api.FilterWithUpdate;
|
||||||
|
import com.todoroo.astrid.helper.AsyncImageView;
|
||||||
|
import com.todoroo.astrid.ui.MainMenuPopover;
|
||||||
|
|
||||||
|
public class PeopleViewActivity extends TaskListActivity {
|
||||||
|
|
||||||
|
private AsyncImageView imageView;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
imageView = (AsyncImageView) findViewById(R.id.person_image);
|
||||||
|
imageView.setDefaultImageResource(R.drawable.icn_default_person_image);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getContentView() {
|
||||||
|
return R.layout.people_view_wrapper_activity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Filter getDefaultFilter() {
|
||||||
|
// TODO More suitable default
|
||||||
|
return super.getDefaultFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<? extends FilterListFragment> getFilterListClass() {
|
||||||
|
return PeopleListFragment.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getHeaderView() {
|
||||||
|
return R.layout.header_people_view;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onFilterItemClicked(FilterListItem item) {
|
||||||
|
boolean result = super.onFilterItemClicked(item);
|
||||||
|
if (result && item instanceof FilterWithUpdate)
|
||||||
|
imageView.setUrl(((FilterWithUpdate) item).imageUrl);
|
||||||
|
else
|
||||||
|
imageView.setUrl(null);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final int[] FORBIDDEN_MENU_ITEMS = {
|
||||||
|
TaskListFragment.MENU_NEW_FILTER_ID,
|
||||||
|
TaskListFragment.MENU_ADDONS_ID,
|
||||||
|
MainMenuPopover.MAIN_MENU_ITEM_FRIENDS
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldAddMenuItem(int itemId) {
|
||||||
|
return AndroidUtilities.indexOf(FORBIDDEN_MENU_ITEMS, itemId) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mainMenuItemSelected(int item, Intent customIntent) {
|
||||||
|
if (item == MainMenuPopover.MAIN_MENU_ITEM_LISTS) {
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
super.mainMenuItemSelected(item, customIntent);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package com.todoroo.astrid.people;
|
||||||
|
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import com.timsu.astrid.R;
|
||||||
|
import com.todoroo.astrid.activity.TaskListFragment;
|
||||||
|
|
||||||
|
public class PersonViewFragment extends TaskListFragment {
|
||||||
|
|
||||||
|
public static final String EXTRA_USER_ID_LOCAL = "user_local_id"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected View getListBody(ViewGroup root) {
|
||||||
|
ViewGroup parent = (ViewGroup) getActivity().getLayoutInflater().inflate(R.layout.task_list_body_person, root, false);
|
||||||
|
|
||||||
|
View taskListView = super.getListBody(parent);
|
||||||
|
parent.addView(taskListView);
|
||||||
|
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/main_menu"
|
||||||
|
android:layout_width="51dip"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:src="?attr/asMainMenu"
|
||||||
|
android:scaleType="fitCenter"/>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="1px"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:layout_marginLeft="-1px"
|
||||||
|
android:background="?attr/asSeparatorBackground"
|
||||||
|
android:layout_marginBottom="4dip"
|
||||||
|
android:layout_marginTop="4dip"/>
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:gravity="center_vertical">
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/lists_nav"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_margin="5dip"
|
||||||
|
android:paddingRight="5dip"
|
||||||
|
android:paddingLeft="5dip"
|
||||||
|
android:gravity="center_vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/list_title"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:text="@string/BFE_Active"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:ellipsize="end"
|
||||||
|
style="@style/TextAppearance.ActionBar_ListsHeader"/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/list_disclosure_arrow"
|
||||||
|
android:layout_width="12dip"
|
||||||
|
android:layout_height="12dip"
|
||||||
|
android:layout_marginLeft="10dip"
|
||||||
|
android:layout_toRightOf="@id/list_title"
|
||||||
|
android:layout_alignBottom="@id/list_title"
|
||||||
|
android:src="?attr/asListsDisclosure"
|
||||||
|
android:scaleType="fitCenter"/>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<com.todoroo.astrid.helper.AsyncImageView
|
||||||
|
android:id="@+id/person_image"
|
||||||
|
android:layout_width="51dip"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:scaleType="centerCrop"/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/comments"
|
||||||
|
android:layout_width="51dip"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:background="?attr/asCommentButtonImg"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:paddingBottom="6dip"
|
||||||
|
android:visibility="gone"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- See the file "LICENSE" for the full license governing this code. -->
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/asListPopoverBg"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
|
||||||
|
<!-- List -->
|
||||||
|
<ListView android:id="@android:id/list"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="370dip"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:scrollbars="vertical"
|
||||||
|
android:divider="@android:color/transparent"
|
||||||
|
android:cacheColorHint="#00000000"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
style="@style/Content"
|
||||||
|
android:id="@+id/tasklist_fragment_container">
|
||||||
|
</FrameLayout>
|
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="100">
|
||||||
|
|
||||||
|
<!-- List body goes here -->
|
||||||
|
|
||||||
|
</LinearLayout>
|
Loading…
Reference in New Issue