Navigation redesign
* Replace list popover with drawer - Closes #33 * Replace menu popover with standard menus * Replace application icons - Closes #11 * Remove swipe between lists * Remove list icons * Remove list header from tablet view * Remove list settings shortcut * Add new list, rename list, delete list to overflow * Remove featured list * Brazilian Portuguese (sfrique) * Russian translation (xtsrsdn)pull/46/head 4.6.10
After Width: | Height: | Size: 7.1 KiB |
After Width: | Height: | Size: 6.4 KiB |
@ -1,123 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2012 Todoroo Inc
|
||||
*
|
||||
* See the file "LICENSE" for the full license governing this code.
|
||||
*/
|
||||
package com.todoroo.astrid.adapter;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcelable;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.app.FragmentStatePagerAdapter;
|
||||
|
||||
import com.todoroo.astrid.activity.TaskListFragment;
|
||||
import com.todoroo.astrid.adapter.FilterAdapter.FilterDataSourceChangedListener;
|
||||
import com.todoroo.astrid.api.Filter;
|
||||
import com.todoroo.astrid.api.FilterWithCustomIntent;
|
||||
import com.todoroo.astrid.subtasks.SubtasksHelper;
|
||||
|
||||
public class TaskListFragmentPagerAdapter extends FragmentStatePagerAdapter implements FilterDataSourceChangedListener {
|
||||
|
||||
private final HashMap<Integer, Fragment> positionToFragment;
|
||||
|
||||
private final FilterAdapter filterAdapter; // Shares an adapter instance with the filter list fragment
|
||||
|
||||
public TaskListFragmentPagerAdapter(FragmentManager fm, FilterAdapter filterAdapter) {
|
||||
super(fm);
|
||||
this.filterAdapter = filterAdapter;
|
||||
filterAdapter.setDataSourceChangedListener(this);
|
||||
positionToFragment = new HashMap<Integer, Fragment>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void filterDataSourceChanged() {
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates and returns a fragment for the filter at the specified position.
|
||||
* Also maps the position to the fragment in a cache for later lookup
|
||||
*/
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
Filter filter = filterAdapter.getItem(position);
|
||||
Fragment fragment = getFragmentForFilter(filter);
|
||||
positionToFragment.put(position, fragment);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lookup the fragment for the specified position
|
||||
*/
|
||||
public Fragment lookupFragmentForPosition(int position) {
|
||||
return positionToFragment.get(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getPageTitle(int position) {
|
||||
return filterAdapter.getItem(position).title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the specified filter to the data source if it doesn't exist,
|
||||
* returning the position of that filter regardless
|
||||
*/
|
||||
public int addOrLookup(Filter filter) {
|
||||
return filterAdapter.addOrLookup(filter);
|
||||
}
|
||||
|
||||
public int getPosition(Filter filter) {
|
||||
return filterAdapter.getPosition(filter);
|
||||
}
|
||||
|
||||
public void remove(Filter filter) {
|
||||
filterAdapter.remove(filter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the filter at the specified position
|
||||
*/
|
||||
public Filter getFilter(int position) {
|
||||
return filterAdapter.getItem(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return filterAdapter.getCount();
|
||||
}
|
||||
|
||||
private Fragment getFragmentForFilter(Filter filter) {
|
||||
Bundle extras = getExtrasForFilter(filter);
|
||||
Class<?> customList = null;
|
||||
if (SubtasksHelper.shouldUseSubtasksFragmentForFilter(filter)) {
|
||||
customList = SubtasksHelper.subtasksClassForFilter(filter);
|
||||
}
|
||||
return TaskListFragment.instantiateWithFilterAndExtras(filter, extras, customList);
|
||||
}
|
||||
|
||||
// Constructs extras corresponding to the specified filter that can be used as arguments to the fragment
|
||||
private Bundle getExtrasForFilter(Filter filter) {
|
||||
Bundle extras = null;
|
||||
if (filter instanceof FilterWithCustomIntent) {
|
||||
extras = ((FilterWithCustomIntent) filter).customExtras;
|
||||
}
|
||||
|
||||
if (extras == null) {
|
||||
extras = new Bundle();
|
||||
}
|
||||
|
||||
if (filter != null) {
|
||||
extras.putParcelable(TaskListFragment.TOKEN_FILTER, filter);
|
||||
}
|
||||
return extras;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Parcelable saveState() {
|
||||
return null; // Don't save state
|
||||
}
|
||||
|
||||
}
|
@ -1,63 +0,0 @@
|
||||
package com.todoroo.astrid.tags.reusable;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ListView;
|
||||
|
||||
import com.todoroo.astrid.adapter.FilterAdapter;
|
||||
import com.todoroo.astrid.utility.Constants;
|
||||
|
||||
public class FeaturedListFilterAdapter extends FilterAdapter {
|
||||
public static final String BROADCAST_REQUEST_FEATURED_LISTS = Constants.PACKAGE + ".REQUEST_FEATURED_LISTS"; //$NON-NLS-1$
|
||||
public static final String BROADCAST_SEND_FEATURED_LISTS = Constants.PACKAGE + ".SEND_FEATURED_LISTS"; //$NON-NLS-1$
|
||||
|
||||
public FeaturedListFilterAdapter(Activity activity, ListView listView,
|
||||
int rowLayout, boolean skipIntentFilters) {
|
||||
super(activity, listView, rowLayout, skipIntentFilters);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getLists() {
|
||||
Intent broadcastIntent = new Intent(BROADCAST_REQUEST_FEATURED_LISTS);
|
||||
activity.sendBroadcast(broadcastIntent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerRecevier() {
|
||||
IntentFilter peopleFilter = new IntentFilter(BROADCAST_SEND_FEATURED_LISTS);
|
||||
activity.registerReceiver(filterReceiver, peopleFilter);
|
||||
getLists();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregisterRecevier() {
|
||||
activity.unregisterReceiver(filterReceiver);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean shouldDirectlyPopulateFilters() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
View v = super.getView(position, convertView, parent);
|
||||
|
||||
ViewHolder viewHolder = (ViewHolder) v.getTag();
|
||||
viewHolder.size.setVisibility(View.GONE);
|
||||
viewHolder.name.setSingleLine(false);
|
||||
viewHolder.name.setLines(2);
|
||||
viewHolder.name.setMaxLines(2);
|
||||
|
||||
int right = (int) (metrics.density * 10);
|
||||
int top = (int) (metrics.density * 2);
|
||||
viewHolder.name.setPadding(0, top, right, 0);
|
||||
viewHolder.name.setTextSize(14);
|
||||
viewHolder.name.setLineSpacing(0.0f, 1.2f);
|
||||
|
||||
return v;
|
||||
}
|
||||
}
|
@ -1,107 +0,0 @@
|
||||
package com.todoroo.astrid.tags.reusable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
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.Functions;
|
||||
import com.todoroo.andlib.sql.Order;
|
||||
import com.todoroo.andlib.sql.Query;
|
||||
import com.todoroo.andlib.sql.QueryTemplate;
|
||||
import com.todoroo.astrid.actfm.TagViewFragment;
|
||||
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.TagData;
|
||||
import com.todoroo.astrid.tags.TagFilterExposer;
|
||||
import com.todoroo.astrid.tags.TagService;
|
||||
import com.todoroo.astrid.tags.TagService.Tag;
|
||||
import com.todoroo.astrid.tags.TaskToTagMetadata;
|
||||
|
||||
public class FeaturedListFilterExposer extends TagFilterExposer {
|
||||
|
||||
public static final String PREF_SHOULD_SHOW_FEATURED_LISTS = "show_featured_lists"; //$NON-NLS-1$
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
addUntaggedFilter = false;
|
||||
FilterListItem[] listAsArray = prepareFilters(context);
|
||||
|
||||
Intent broadcastIntent = new Intent(FeaturedListFilterAdapter.BROADCAST_SEND_FEATURED_LISTS);
|
||||
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, listAsArray);
|
||||
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
|
||||
}
|
||||
|
||||
private static FilterWithCustomIntent filterFromFeaturedList(Tag tag, Criterion criterion) {
|
||||
String title = tag.tag;
|
||||
QueryTemplate tagTemplate = tag.queryTemplate(criterion);
|
||||
ContentValues contentValues = new ContentValues();
|
||||
contentValues.put(Metadata.KEY.name, TaskToTagMetadata.KEY);
|
||||
contentValues.put(TaskToTagMetadata.TAG_NAME.name, tag.tag);
|
||||
contentValues.put(TaskToTagMetadata.TAG_UUID.name, tag.uuid.toString());
|
||||
|
||||
FilterWithUpdate filter = new FilterWithUpdate(tag.tag,
|
||||
title, tagTemplate,
|
||||
contentValues);
|
||||
|
||||
Class<?> fragmentClass = FeaturedTaskListFragment.class;
|
||||
filter.customTaskList = new ComponentName(ContextManager.getContext(), fragmentClass);
|
||||
if(tag.image != null) {
|
||||
filter.imageUrl = tag.image;
|
||||
}
|
||||
|
||||
Bundle extras = new Bundle();
|
||||
extras.putString(TagViewFragment.EXTRA_TAG_NAME, tag.tag);
|
||||
extras.putString(TagViewFragment.EXTRA_TAG_UUID, tag.uuid.toString());
|
||||
filter.customExtras = extras;
|
||||
|
||||
return filter;
|
||||
}
|
||||
|
||||
public static Filter getDefaultFilter() {
|
||||
TodorooCursor<TagData> firstFilter = PluginServices.getTagDataService()
|
||||
.query(Query.select(TagData.PROPERTIES)
|
||||
.where(Criterion.and(
|
||||
Functions.bitwiseAnd(TagData.FLAGS, TagData.FLAG_FEATURED).gt(0),
|
||||
TagData.DELETION_DATE.eq(0),
|
||||
TagData.NAME.isNotNull(),
|
||||
TagData.NAME.neq(""))) //$NON-NLS-1$
|
||||
.orderBy(Order.asc(TagData.NAME))
|
||||
.limit(1));
|
||||
try {
|
||||
if (firstFilter.getCount() > 0) {
|
||||
firstFilter.moveToFirst();
|
||||
TagData tagData = new TagData(firstFilter);
|
||||
Tag tag = new Tag(tagData);
|
||||
return filterFromFeaturedList(tag, TaskCriteria.activeAndVisible());
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
} finally {
|
||||
firstFilter.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Filter constructFilter(Context context, Tag tag) {
|
||||
return filterFromFeaturedList(tag, TaskCriteria.activeAndVisible());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<Tag> getTagList() {
|
||||
return TagService.getInstance().getFeaturedLists();
|
||||
}
|
||||
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
package com.todoroo.astrid.tags.reusable;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import org.tasks.R;
|
||||
import com.todoroo.astrid.activity.FilterListFragment;
|
||||
import com.todoroo.astrid.activity.FilterModeSpec;
|
||||
import com.todoroo.astrid.activity.TaskListFragment;
|
||||
import com.todoroo.astrid.api.Filter;
|
||||
import com.todoroo.astrid.api.FilterListItem;
|
||||
import com.todoroo.astrid.core.CoreFilterExposer;
|
||||
import com.todoroo.astrid.ui.MainMenuPopover;
|
||||
|
||||
public class FeaturedListFilterMode implements FilterModeSpec {
|
||||
|
||||
@Override
|
||||
public int[] getForbiddenMenuItems() {
|
||||
return FORBIDDEN_MENU_ITEMS;
|
||||
}
|
||||
|
||||
private static final int[] FORBIDDEN_MENU_ITEMS = {
|
||||
TaskListFragment.MENU_NEW_FILTER_ID,
|
||||
MainMenuPopover.MAIN_MENU_ITEM_FEATURED_LISTS
|
||||
};
|
||||
|
||||
@Override
|
||||
public Class<? extends FilterListFragment> getFilterListClass() {
|
||||
return FeaturedListFragment.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Filter getDefaultFilter(Context context) {
|
||||
Filter defaultFilter = FeaturedListFilterExposer.getDefaultFilter();
|
||||
if (defaultFilter == null) {
|
||||
return CoreFilterExposer.buildInboxFilter(context.getResources());
|
||||
} else {
|
||||
return defaultFilter;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMainMenuIconAttr() {
|
||||
return R.attr.asMainMenu;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean showComments() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
package com.todoroo.astrid.tags.reusable;
|
||||
|
||||
import android.app.Activity;
|
||||
|
||||
import org.tasks.R;
|
||||
import com.todoroo.astrid.activity.FilterListFragment;
|
||||
import com.todoroo.astrid.adapter.FilterAdapter;
|
||||
import com.todoroo.astrid.utility.AstridPreferences;
|
||||
|
||||
public class FeaturedListFragment extends FilterListFragment {
|
||||
|
||||
@Override
|
||||
protected FilterAdapter instantiateAdapter() {
|
||||
return new FeaturedListFilterAdapter(getActivity(), null, R.layout.filter_adapter_row, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayout(Activity activity) {
|
||||
if (AstridPreferences.useTabletLayout(activity)) {
|
||||
return R.layout.filter_list_fragment_alternative_3pane;
|
||||
} else {
|
||||
return R.layout.filter_list_fragment_alternative;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,198 +0,0 @@
|
||||
package com.todoroo.astrid.tags.reusable;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.ProgressDialog;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Bitmap;
|
||||
import android.text.TextUtils;
|
||||
import android.view.ContextMenu;
|
||||
import android.view.ContextMenu.ContextMenuInfo;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.actionbarsherlock.view.Menu;
|
||||
import com.actionbarsherlock.view.MenuItem;
|
||||
import org.tasks.R;
|
||||
import com.todoroo.andlib.data.TodorooCursor;
|
||||
import com.todoroo.andlib.service.Autowired;
|
||||
import com.todoroo.andlib.sql.Query;
|
||||
import com.todoroo.andlib.utility.DialogUtilities;
|
||||
import com.todoroo.astrid.actfm.TagViewFragment;
|
||||
import com.todoroo.astrid.activity.TaskListActivity;
|
||||
import com.todoroo.astrid.adapter.TaskAdapter;
|
||||
import com.todoroo.astrid.api.Filter;
|
||||
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
|
||||
import com.todoroo.astrid.data.RemoteModel;
|
||||
import com.todoroo.astrid.data.TagData;
|
||||
import com.todoroo.astrid.data.Task;
|
||||
import com.todoroo.astrid.helper.AsyncImageView;
|
||||
import com.todoroo.astrid.service.TagDataService;
|
||||
import com.todoroo.astrid.tags.TagFilterExposer;
|
||||
import com.todoroo.astrid.tags.TagService.Tag;
|
||||
import com.todoroo.astrid.utility.Flags;
|
||||
import com.todoroo.astrid.utility.ResourceDrawableCache;
|
||||
|
||||
public class FeaturedTaskListFragment extends TagViewFragment {
|
||||
|
||||
@Autowired private TagDataService tagDataService;
|
||||
|
||||
private static final int MENU_CLONE_LIST = R.string.actfm_feat_list_clone;
|
||||
|
||||
@Override
|
||||
protected TaskAdapter createTaskAdapter(TodorooCursor<Task> cursor) {
|
||||
return new ReusableTaskAdapter(this, R.layout.reusable_task_adapter_row,
|
||||
cursor, sqlQueryTemplate, false, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setupQuickAddBar() {
|
||||
super.setupQuickAddBar();
|
||||
quickAddBar.setVisibility(View.GONE);
|
||||
((TextView) getView().findViewById(android.R.id.empty)).setOnClickListener(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTaskListItemClicked(long taskId, boolean editable) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getTaskListBodyLayout() {
|
||||
return R.layout.task_list_body_featured_list;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addMenuItems(Menu menu, Activity activity) {
|
||||
super.addMenuItems(menu, activity);
|
||||
MenuItem item = menu.add(Menu.NONE, MENU_CLONE_LIST, 0, R.string.actfm_feat_list_clone);
|
||||
item.setIcon(R.drawable.ic_menu_list_copy);
|
||||
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handleOptionsMenuItemSelected(int id, Intent intent) {
|
||||
if (id == MENU_CLONE_LIST) {
|
||||
cloneList();
|
||||
return true;
|
||||
}
|
||||
return super.handleOptionsMenuItemSelected(id, intent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateContextMenu(ContextMenu menu, View v,
|
||||
ContextMenuInfo menuInfo) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setUpMembersGallery() {
|
||||
// Repurposed this method to set up the description view
|
||||
AsyncImageView imageView = (AsyncImageView) getView().findViewById(R.id.url_image);
|
||||
String imageUrl = tagData.getPictureUrl(TagData.PICTURE, RemoteModel.PICTURE_MEDIUM);
|
||||
Bitmap bitmap = null;
|
||||
if (TextUtils.isEmpty(imageUrl)) {
|
||||
bitmap = tagData.getPictureBitmap(TagData.PICTURE);
|
||||
}
|
||||
if (!TextUtils.isEmpty(imageUrl) || bitmap != null) {
|
||||
imageView.setVisibility(View.VISIBLE);
|
||||
imageView.setDefaultImageDrawable(ResourceDrawableCache.getImageDrawableFromId(resources, R.drawable.default_list_0));
|
||||
if (bitmap != null) {
|
||||
imageView.setImageBitmap(bitmap);
|
||||
} else {
|
||||
imageView.setUrl(imageUrl);
|
||||
}
|
||||
} else {
|
||||
imageView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
final String description = tagData.getValue(TagData.TAG_DESCRIPTION);
|
||||
final Resources r = getActivity().getResources();
|
||||
TextView desc = (TextView) getView().findViewById(R.id.feat_list_desc);
|
||||
desc.setText(description);
|
||||
desc.setLines(4);
|
||||
desc.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
DialogUtilities.okDialog(getActivity(), r.getString(R.string.DLG_information_title),
|
||||
0, description, null);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void cloneList() {
|
||||
// Clone list
|
||||
if (taskAdapter == null || taskAdapter.getCount() == 0) {
|
||||
Toast.makeText(getActivity(), R.string.actfm_feat_list_clone_empty, Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
final String localName = tagData.getValue(TagData.NAME) + " " + getString(R.string.actfm_feat_list_suffix); //$NON-NLS-1$
|
||||
TagData clone = new TagData();
|
||||
TodorooCursor<TagData> existing = tagDataService.query(Query.select(TagData.PROPERTIES)
|
||||
.where(TagData.NAME.eqCaseInsensitive(localName)));
|
||||
try {
|
||||
if (existing.getCount() > 0) {
|
||||
existing.moveToFirst();
|
||||
clone = new TagData(existing);
|
||||
} else {
|
||||
clone = new TagData();
|
||||
clone.setValue(TagData.NAME, localName);
|
||||
tagDataService.save(clone);
|
||||
}
|
||||
|
||||
} finally {
|
||||
existing.close();
|
||||
}
|
||||
|
||||
final ProgressDialog pd = DialogUtilities.progressDialog(getActivity(), getString(R.string.actfm_feat_list_cloning));
|
||||
|
||||
final TagData finalTagData = clone;
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
final TodorooCursor<Task> tasks = taskService.fetchFiltered(taskAdapter.getQuery(), null, Task.PROPERTIES);
|
||||
try {
|
||||
Task t = new Task();
|
||||
for (tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) {
|
||||
t.readFromCursor(tasks);
|
||||
taskService.cloneReusableTask(t, localName, finalTagData.getValue(TagData.UUID));
|
||||
}
|
||||
final Activity activity = getActivity();
|
||||
if (activity != null) {
|
||||
DialogUtilities.dismissDialog(activity, pd);
|
||||
DialogUtilities.okDialog(activity, getString(R.string.actfm_feat_list_clone_success), null);
|
||||
}
|
||||
|
||||
Flags.set(Flags.REFRESH);
|
||||
if (activity instanceof TaskListActivity) {
|
||||
activity.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
TaskListActivity tla = (TaskListActivity) activity;
|
||||
tla.setFilterMode(TaskListActivity.FILTER_MODE_NORMAL);
|
||||
|
||||
Filter clonedFilter;
|
||||
Tag tag = new Tag(finalTagData);
|
||||
clonedFilter = TagFilterExposer.filterFromTag(activity, tag, TaskCriteria.activeAndVisible());
|
||||
|
||||
tla.onFilterItemClicked(clonedFilter);
|
||||
}
|
||||
});
|
||||
}
|
||||
} finally {
|
||||
tasks.close();
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void refresh() {
|
||||
loadTaskListContent(true);
|
||||
((TextView)taskListView.findViewById(android.R.id.empty)).setText(R.string.TLA_no_items);
|
||||
setUpMembersGallery();
|
||||
}
|
||||
|
||||
}
|
@ -1,82 +0,0 @@
|
||||
package com.todoroo.astrid.tags.reusable;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.tasks.R;
|
||||
import com.todoroo.andlib.data.TodorooCursor;
|
||||
import com.todoroo.andlib.utility.Preferences;
|
||||
import com.todoroo.astrid.activity.TaskListFragment;
|
||||
import com.todoroo.astrid.adapter.TaskAdapter;
|
||||
import com.todoroo.astrid.data.RemoteModel;
|
||||
import com.todoroo.astrid.data.Task;
|
||||
import com.todoroo.astrid.utility.Flags;
|
||||
|
||||
public class ReusableTaskAdapter extends TaskAdapter {
|
||||
|
||||
public ReusableTaskAdapter(TaskListFragment fragment, int resource,
|
||||
Cursor c, AtomicReference<String> query, boolean autoRequery,
|
||||
OnCompletedTaskListener onCompletedTaskListener) {
|
||||
super(fragment, resource, c, query, autoRequery, onCompletedTaskListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View newView(Context context, Cursor cursor, ViewGroup parent) {
|
||||
ViewGroup view = (ViewGroup)inflater.inflate(resource, parent, false);
|
||||
|
||||
ReusableTaskViewHolder viewHolder = new ReusableTaskViewHolder();
|
||||
viewHolder.task = new Task();
|
||||
viewHolder.clone = (ImageView) view.findViewById(R.id.clone_task);
|
||||
viewHolder.title = (TextView) view.findViewById(R.id.title);
|
||||
|
||||
boolean showFullTaskTitle = Preferences.getBoolean(R.string.p_fullTaskTitle, false);
|
||||
if (showFullTaskTitle) {
|
||||
viewHolder.title.setMaxLines(Integer.MAX_VALUE);
|
||||
}
|
||||
|
||||
view.setTag(viewHolder);
|
||||
for(int i = 0; i < view.getChildCount(); i++) {
|
||||
view.getChildAt(i).setTag(viewHolder);
|
||||
}
|
||||
|
||||
viewHolder.clone.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
ReusableTaskViewHolder holder = (ReusableTaskViewHolder) v.getTag();
|
||||
taskService.cloneReusableTask(holder.task, null, RemoteModel.NO_UUID);
|
||||
Toast.makeText(fragment.getActivity(), R.string.actfm_feat_list_task_clone_success, Toast.LENGTH_LONG).show();
|
||||
Flags.set(Flags.REFRESH);
|
||||
}
|
||||
});
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindView(View view, Context context, Cursor c) {
|
||||
TodorooCursor<Task> cursor = (TodorooCursor<Task>)c;
|
||||
ReusableTaskViewHolder viewHolder = (ReusableTaskViewHolder) view.getTag();
|
||||
|
||||
Task task = viewHolder.task;
|
||||
task.clear();
|
||||
task.readFromCursor(cursor);
|
||||
|
||||
viewHolder.title.setText(task.getValue(Task.TITLE));
|
||||
view.setMinimumHeight(minRowHeight);
|
||||
}
|
||||
|
||||
public static class ReusableTaskViewHolder {
|
||||
public Task task;
|
||||
public ImageView clone;
|
||||
public TextView title;
|
||||
}
|
||||
|
||||
}
|
@ -1,84 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2012 Todoroo Inc
|
||||
*
|
||||
* See the file "LICENSE" for the full license governing this code.
|
||||
*/
|
||||
package com.todoroo.astrid.ui;
|
||||
|
||||
import greendroid.widget.QuickAction;
|
||||
import greendroid.widget.QuickActionWidget;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.View;
|
||||
import android.view.View.MeasureSpec;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewGroup.LayoutParams;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import org.tasks.R;
|
||||
|
||||
|
||||
public class FragmentPopover extends QuickActionWidget {
|
||||
|
||||
protected DisplayMetrics metrics;
|
||||
|
||||
public FragmentPopover(Context context, int layout) {
|
||||
super(context);
|
||||
setContentView(layout);
|
||||
|
||||
metrics = context.getResources().getDisplayMetrics();
|
||||
|
||||
setFocusable(true);
|
||||
setTouchable(true);
|
||||
}
|
||||
|
||||
public void setContent(View content) {
|
||||
FrameLayout contentContainer = (FrameLayout) getContentView().findViewById(R.id.content);
|
||||
contentContainer.addView(content);
|
||||
}
|
||||
|
||||
public void setContent(View content, LayoutParams params) {
|
||||
FrameLayout contentContainer = (FrameLayout) getContentView().findViewById(R.id.content);
|
||||
contentContainer.addView(content, params);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void populateQuickActions(List<QuickAction> quickActions) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasureAndLayout(Rect anchorRect, View contentView) {
|
||||
contentView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||
contentView.measure(MeasureSpec.makeMeasureSpec(getScreenWidth(), MeasureSpec.EXACTLY),
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
|
||||
int rootHeight = contentView.getMeasuredHeight();
|
||||
|
||||
int offsetY = getArrowOffsetY();
|
||||
int dyTop = anchorRect.top;
|
||||
int dyBottom = getScreenHeight() - anchorRect.bottom;
|
||||
|
||||
boolean onTop = (dyTop > dyBottom);
|
||||
int popupY = (onTop) ? anchorRect.top - rootHeight + offsetY : anchorRect.bottom - offsetY;
|
||||
|
||||
setWidgetSpecs(popupY, onTop);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getArrowLeftMargin(View arrow) {
|
||||
return mRect.left + arrow.getMeasuredWidth() / 2 - (int) (10 * metrics.density);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show(View anchor) {
|
||||
if (isShowing()) {
|
||||
return;
|
||||
}
|
||||
super.show(anchor);
|
||||
}
|
||||
}
|
@ -1,221 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2012 Todoroo Inc
|
||||
*
|
||||
* See the file "LICENSE" for the full license governing this code.
|
||||
*/
|
||||
package com.todoroo.astrid.ui;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.View.OnTouchListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.tasks.R;
|
||||
import com.todoroo.andlib.utility.Preferences;
|
||||
import com.todoroo.astrid.service.ThemeService;
|
||||
import com.todoroo.astrid.ui.TouchInterceptingFrameLayout.InterceptTouchListener;
|
||||
import com.todoroo.astrid.utility.AstridPreferences;
|
||||
|
||||
public class MainMenuPopover extends FragmentPopover implements InterceptTouchListener {
|
||||
|
||||
public static final int MAIN_MENU_ITEM_LISTS = R.string.TLA_menu_lists;
|
||||
public static final int MAIN_MENU_ITEM_FEATURED_LISTS = R.string.TLA_menu_featured_lists;
|
||||
public static final int MAIN_MENU_ITEM_SEARCH = R.string.TLA_menu_search;
|
||||
public static final int MAIN_MENU_ITEM_SETTINGS = R.string.TLA_menu_settings;
|
||||
|
||||
public interface MainMenuListener {
|
||||
public boolean shouldAddMenuItem(int itemId);
|
||||
public void mainMenuItemSelected(int item, Intent customIntent);
|
||||
}
|
||||
|
||||
private MainMenuListener mListener;
|
||||
private final LayoutInflater inflater;
|
||||
private final LinearLayout content;
|
||||
private final LinearLayout topFixed;
|
||||
private final LinearLayout bottomFixed;
|
||||
private final int rowLayout;
|
||||
private boolean suppressNextKeyEvent = false;
|
||||
private final boolean isTablet;
|
||||
|
||||
public void setMenuListener(MainMenuListener listener) {
|
||||
this.mListener = listener;
|
||||
}
|
||||
|
||||
public MainMenuPopover(Context context, int layout, boolean isTablet, MainMenuListener listener) {
|
||||
super(context, layout);
|
||||
|
||||
TouchInterceptingFrameLayout rootLayout = (TouchInterceptingFrameLayout) getContentView();
|
||||
rootLayout.setInterceptTouchListener(this);
|
||||
rootLayout.setOnTouchListener(new OnTouchListener() {
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
dismiss();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
if (AstridPreferences.useTabletLayout(context)) {
|
||||
rowLayout = R.layout.main_menu_row_tablet;
|
||||
} else {
|
||||
rowLayout = R.layout.main_menu_row;
|
||||
}
|
||||
|
||||
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||
|
||||
content = (LinearLayout) getContentView().findViewById(R.id.content);
|
||||
|
||||
topFixed = (LinearLayout) getContentView().findViewById(R.id.topFixedItems);
|
||||
bottomFixed = (LinearLayout) getContentView().findViewById(R.id.bottomFixedItems);
|
||||
|
||||
this.isTablet = isTablet;
|
||||
|
||||
mListener = listener;
|
||||
|
||||
addFixedItems();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean didInterceptTouch(KeyEvent event) {
|
||||
int keyCode = event.getKeyCode();
|
||||
if (!suppressNextKeyEvent) {
|
||||
if ((keyCode == KeyEvent.KEYCODE_MENU || keyCode == KeyEvent.KEYCODE_BACK) && isShowing()) {
|
||||
dismiss();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
suppressNextKeyEvent = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
public void suppressNextKeyEvent() {
|
||||
suppressNextKeyEvent = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBackgroundDrawable(Drawable background) {
|
||||
super.setBackgroundDrawable(null);
|
||||
}
|
||||
|
||||
private void addFixedItems() {
|
||||
int themeFlags = isTablet ? ThemeService.FLAG_FORCE_DARK : 0;
|
||||
if (Preferences.getBoolean(R.string.p_show_menu_search, true)) {
|
||||
addMenuItem(R.string.TLA_menu_search,
|
||||
ThemeService.getDrawable(R.drawable.icn_menu_search, themeFlags),
|
||||
MAIN_MENU_ITEM_SEARCH, null, topFixed);
|
||||
}
|
||||
|
||||
addMenuItem(R.string.TLA_menu_lists,
|
||||
ThemeService.getDrawable(R.drawable.icn_menu_lists, themeFlags),
|
||||
MAIN_MENU_ITEM_LISTS, null, topFixed); // Lists item
|
||||
|
||||
addMenuItem(R.string.TLA_menu_settings,
|
||||
ThemeService.getDrawable(R.drawable.icn_menu_settings, themeFlags),
|
||||
MAIN_MENU_ITEM_SETTINGS, null, bottomFixed); // Settings item
|
||||
}
|
||||
|
||||
public void refreshFixedItems() {
|
||||
topFixed.removeAllViews();
|
||||
bottomFixed.removeAllViews();
|
||||
addFixedItems();
|
||||
}
|
||||
|
||||
public void setFixedItemVisibility(int index, int visibility, boolean top) {
|
||||
LinearLayout container = top ? topFixed : bottomFixed;
|
||||
if (index < 0 || index >= container.getChildCount()) {
|
||||
return;
|
||||
}
|
||||
|
||||
container.getChildAt(index).setVisibility(visibility);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getArrowLeftMargin(View arrow) {
|
||||
return mRect.centerX() - arrow.getMeasuredWidth() / 2 - (int) (12 * metrics.density);
|
||||
}
|
||||
|
||||
|
||||
// --- Public interface ---
|
||||
public void addMenuItem(int title, int imageRes, int id) {
|
||||
addMenuItem(title, imageRes, id, null, content);
|
||||
}
|
||||
|
||||
public void addMenuItem(int title, int imageRes, Intent customIntent, int id) {
|
||||
addMenuItem(title, imageRes, id, customIntent, content);
|
||||
}
|
||||
|
||||
public void addMenuItem(CharSequence title, Drawable image, Intent customIntent, int id) {
|
||||
addMenuItem(title, image, id, customIntent, content);
|
||||
}
|
||||
|
||||
public void addSeparator() {
|
||||
inflater.inflate(R.layout.fla_separator, content);
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
content.removeAllViews();
|
||||
}
|
||||
|
||||
|
||||
// --- Private helpers ---
|
||||
private void addMenuItem(int title, int imageRes, int id, Intent customIntent, ViewGroup container) {
|
||||
if (mListener != null && !mListener.shouldAddMenuItem(id)) {
|
||||
return;
|
||||
}
|
||||
View item = setupItemWithParams(title, imageRes);
|
||||
addViewWithListener(item, container, id, customIntent);
|
||||
}
|
||||
|
||||
private void addMenuItem(CharSequence title, Drawable image, int id, Intent customIntent, ViewGroup container) {
|
||||
if (mListener != null && !mListener.shouldAddMenuItem(id)) {
|
||||
return;
|
||||
}
|
||||
View item = setupItemWithParams(title, image);
|
||||
addViewWithListener(item, container, id, customIntent);
|
||||
}
|
||||
|
||||
private void addViewWithListener(View view, ViewGroup container, final int id, final Intent customIntent) {
|
||||
container.addView(view);
|
||||
view.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
dismiss();
|
||||
if (mListener != null) {
|
||||
mListener.mainMenuItemSelected(id, customIntent);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private View setupItemWithParams(int title, int imageRes) {
|
||||
View itemRow = inflater.inflate(rowLayout, null);
|
||||
|
||||
ImageView image = (ImageView) itemRow.findViewById(R.id.icon);
|
||||
image.setImageResource(imageRes);
|
||||
|
||||
TextView name = (TextView) itemRow.findViewById(R.id.name);
|
||||
name.setText(title);
|
||||
|
||||
return itemRow;
|
||||
}
|
||||
|
||||
private View setupItemWithParams(CharSequence title, Drawable imageDrawable) {
|
||||
View itemRow = inflater.inflate(rowLayout, null);
|
||||
|
||||
ImageView image = (ImageView) itemRow.findViewById(R.id.icon);
|
||||
image.setImageDrawable(imageDrawable);
|
||||
|
||||
TextView name = (TextView) itemRow.findViewById(R.id.name);
|
||||
name.setText(title);
|
||||
|
||||
return itemRow;
|
||||
}
|
||||
}
|
@ -1,124 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2012 Todoroo Inc
|
||||
*
|
||||
* See the file "LICENSE" for the full license governing this code.
|
||||
*/
|
||||
package com.todoroo.astrid.ui;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.support.v4.view.PagerAdapter;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
import com.todoroo.andlib.utility.DialogUtilities;
|
||||
import com.todoroo.andlib.utility.Preferences;
|
||||
import com.todoroo.astrid.activity.TaskListFragment;
|
||||
import com.todoroo.astrid.adapter.TaskListFragmentPagerAdapter;
|
||||
import com.todoroo.astrid.api.Filter;
|
||||
import com.todoroo.astrid.service.ThemeService;
|
||||
import com.todoroo.astrid.utility.Flags;
|
||||
|
||||
import org.tasks.R;
|
||||
|
||||
public class TaskListFragmentPager extends ViewPager {
|
||||
|
||||
public static final String PREF_SHOWED_SWIPE_HELPER = "showed_swipe_helper"; //$NON-NLS-1$
|
||||
|
||||
public TaskListFragmentPager(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
setOffscreenPageLimit(1);
|
||||
setPageMargin(1);
|
||||
setPageMarginDrawable(R.drawable.vertical_separator);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAdapter(PagerAdapter adapter) {
|
||||
if (!(adapter instanceof TaskListFragmentPagerAdapter)) {
|
||||
throw new ClassCastException("TaskListFragmentPager requires an adapter of type TaskListFragmentPagerAdapter"); //$NON-NLS-1$
|
||||
}
|
||||
super.setAdapter(adapter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Hack to enable reloading fragments while they are being viewed
|
||||
*/
|
||||
public void forceReload() {
|
||||
int position = getCurrentItem();
|
||||
setAdapter(getAdapter());
|
||||
setCurrentItem(position, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the supplied filter, adding it to the data source if it doesn't exist
|
||||
*/
|
||||
public void showFilter(Filter f) {
|
||||
TaskListFragmentPagerAdapter adapter = (TaskListFragmentPagerAdapter) getAdapter();
|
||||
showFilter(adapter.addOrLookup(f));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the filter at the supplied index, with animation
|
||||
*/
|
||||
public void showFilter(int index) {
|
||||
setCurrentItem(index, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the currently showing fragment
|
||||
*/
|
||||
public TaskListFragment getCurrentFragment() {
|
||||
return (TaskListFragment) ((TaskListFragmentPagerAdapter) getAdapter()).lookupFragmentForPosition(getCurrentItem());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
||||
if (checkForPeopleHeaderScroll(ev)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Flags.check(Flags.TLFP_NO_INTERCEPT_TOUCH)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return super.onInterceptTouchEvent(ev);
|
||||
}
|
||||
|
||||
private boolean checkForPeopleHeaderScroll(MotionEvent ev) {
|
||||
TaskListFragment current = getCurrentFragment();
|
||||
if (current != null) {
|
||||
View v = current.getView();
|
||||
if (v != null) {
|
||||
View peopleView = v.findViewById(R.id.shared_with);
|
||||
if (peopleView != null) {
|
||||
Rect rect = new Rect();
|
||||
peopleView.getHitRect(rect);
|
||||
if (rect.contains((int) ev.getX(), (int) ev.getY())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void showSwipeBetweenHelper(Activity activity) {
|
||||
if (!Preferences.getBoolean(PREF_SHOWED_SWIPE_HELPER, false)) {
|
||||
String body = String.format("<h3>%s</h3><img src='%s'><br><br>%s",
|
||||
activity.getString(R.string.swipe_lists_helper_header),
|
||||
"subtasks_horizontal.png",
|
||||
activity.getString(R.string.swipe_lists_helper_subtitle));
|
||||
|
||||
String color = ThemeService.getDialogTextColorString();
|
||||
String html = String.format("<html><body style='text-align:center;color:%s'>%s</body></html>",
|
||||
color, body);
|
||||
|
||||
DialogUtilities.htmlDialog(activity, html, R.string.swipe_lists_helper_title);
|
||||
|
||||
Preferences.setBoolean(PREF_SHOWED_SWIPE_HELPER, true);
|
||||
}
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 827 B |
Before Width: | Height: | Size: 209 B |
Before Width: | Height: | Size: 206 B |
After Width: | Height: | Size: 225 B |
After Width: | Height: | Size: 217 B |
After Width: | Height: | Size: 702 B |
After Width: | Height: | Size: 639 B |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 695 B |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 251 B |
Before Width: | Height: | Size: 229 B |
Before Width: | Height: | Size: 245 B |
Before Width: | Height: | Size: 245 B |
Before Width: | Height: | Size: 268 B |
Before Width: | Height: | Size: 296 B |
Before Width: | Height: | Size: 301 B |
Before Width: | Height: | Size: 323 B |
Before Width: | Height: | Size: 301 B |
Before Width: | Height: | Size: 330 B |
Before Width: | Height: | Size: 454 B After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 267 B |
After Width: | Height: | Size: 262 B |
After Width: | Height: | Size: 916 B |
After Width: | Height: | Size: 827 B |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 901 B |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 238 B |
Before Width: | Height: | Size: 221 B |
Before Width: | Height: | Size: 234 B |
Before Width: | Height: | Size: 231 B |
Before Width: | Height: | Size: 575 B After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 264 B |
After Width: | Height: | Size: 264 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 202 B |