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