/** * Copyright (c) 2012 Todoroo Inc * * See the file "LICENSE" for the full license governing this code. */ package com.todoroo.astrid.people; import java.util.ArrayList; import java.util.List; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.text.TextUtils; import com.timsu.astrid.R; 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.actfm.sync.ActFmPreferenceService; 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.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.User; import com.todoroo.astrid.service.ThemeService; import com.todoroo.astrid.tags.TaskToTagMetadata; import com.todoroo.astrid.utility.AstridPreferences; 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) .where(Criterion.not(Criterion.or(User.STATUS.eq(User.STATUS_BLOCKED), User.STATUS.eq(User.STATUS_IGNORED), User.STATUS.eq(User.STATUS_RENOUNCE), User.STATUS.eq(User.STATUS_IGNORE)))) .orderBy(Order.asc(User.FIRST_NAME), Order.asc(User.LAST_NAME), Order.asc(User.NAME))); try { List<FilterListItem> items = new ArrayList<FilterListItem>(); items.add(mySharedTasks(context)); User user = new User(); for (users.moveToFirst(); !users.isAfterLast(); users.moveToNext()) { user.readFromCursor(users); if (ActFmPreferenceService.userId().equals(user.getValue(User.UUID))) continue; Filter currFilter = filterFromUserData(user); if (currFilter != null) items.add(currFilter); } return items.toArray(new FilterListItem[items.size()]); } finally { users.close(); } } @SuppressWarnings({ "nls", "deprecation" }) private static FilterWithCustomIntent filterFromUserData(User user) { String title = user.getDisplayName(); if (TextUtils.isEmpty(title) || "null".equals(title)) return null; String email = user.getValue(User.EMAIL); Criterion criterion; if (TextUtils.isEmpty(email) || "null".equals(email)) criterion = Task.USER_ID.eq(user.getValue(User.UUID)); else criterion = Criterion.or(Task.USER_ID.eq(user.getValue(User.UUID)), Task.USER.like("%" + email + "%")); // Deprecated field OK for backwards compatibility criterion = Criterion.and(TaskCriteria.activeAndVisible(), criterion); QueryTemplate userTemplate = new QueryTemplate().where(criterion); 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.UUID)); filter.valuesForNewTasks = values; String imageUrl = user.getPictureUrl(User.PICTURE, RemoteModel.PICTURE_THUMB); //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; } @SuppressWarnings("nls") public static FilterWithCustomIntent mySharedTasks(Context context) { TodorooCursor<TagData> tagsWithMembers = PluginServices.getTagDataService() .query(Query.select(TagData.NAME).where(TagData.MEMBER_COUNT.gt(0))); String[] names; try { if (tagsWithMembers.getCount() == 0) { names = new String[1]; names[0] = "\"\""; } else { names = new String[tagsWithMembers.getCount()]; TagData curr = new TagData(); int i = 0; for (tagsWithMembers.moveToFirst(); !tagsWithMembers.isAfterLast(); tagsWithMembers.moveToNext()) { curr.readFromCursor(tagsWithMembers); names[i] = "\"" + curr.getValue(TagData.NAME) + "\""; i++; } } } finally { tagsWithMembers.close(); } boolean isTablet = AstridPreferences.useTabletLayout(context); int themeFlags = isTablet ? ThemeService.FLAG_FORCE_LIGHT : 0; String title = context.getString(R.string.actfm_my_shared_tasks_title); QueryTemplate template = 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(TaskToTagMetadata.KEY), Field.field("mtags." + TaskToTagMetadata.TAG_NAME.name).in(names), TaskCriteria.activeVisibleMine()))); FilterWithCustomIntent filter = new FilterWithCustomIntent(title, title, template, null); filter.customTaskList = new ComponentName(ContextManager.getContext(), PersonViewFragment.class); Bundle extras = new Bundle(); extras.putBoolean(PersonViewFragment.EXTRA_HIDE_QUICK_ADD, true); filter.customExtras = extras; filter.listingIcon = ((BitmapDrawable)context.getResources().getDrawable( ThemeService.getDrawable(R.drawable.icn_menu_friends, themeFlags))).getBitmap(); return filter; } }