From 3349f6a946be4c904db768e53f1ba09634eb2ce3 Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Sun, 2 Sep 2012 22:31:04 +0800 Subject: [PATCH] more simple list layouts. disabled hardware acceleration, i found this will make list veeeeeeeeeery smooth multi selecting should work normally. --- AndroidManifest.xml | 2 +- res/drawable-xhdpi/list_focused_holo.9.png | Bin 163 -> 203 bytes res/layout-ar/status_list_item.xml | 12 +-- res/layout-ar/user_list_item.xml | 4 +- res/layout-ar/view_status.xml | 2 +- res/layout/status_list_item.xml | 14 ++-- res/layout/user_list_item.xml | 73 ++++++++---------- res/layout/view_status.xml | 2 +- res/menu/action_multi_select.xml | 9 ++- res/values/strings.xml | 2 + .../twidere/activity/MultiSelectActivity.java | 66 ++++++++++++++-- .../twidere/adapter/UsersAdapter.java | 17 +++- .../twidere/app/TwidereApplication.java | 4 +- .../fragment/BaseStatusesListFragment.java | 10 ++- .../fragment/BaseUsersListFragment.java | 44 ++++++----- .../fragment/CursorStatusesListFragment.java | 1 - .../twidere/model/StatusViewHolder.java | 17 ++-- .../twidere/model/UserViewHolder.java | 46 +++++------ .../twidere/service/TwidereService.java | 4 +- ...out.java => ColorLabelRelativeLayout.java} | 26 +++---- 20 files changed, 206 insertions(+), 149 deletions(-) rename src/org/mariotaku/twidere/view/{ExtendedRelativeLayout.java => ColorLabelRelativeLayout.java} (85%) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 79d25efa..eb5b7344 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -58,7 +58,7 @@ diff --git a/res/drawable-xhdpi/list_focused_holo.9.png b/res/drawable-xhdpi/list_focused_holo.9.png index 690cb1eb61f6bc4ce58e5c1fb30304db69393bc7..b545f8e57871c0a11cfeddb22bbd9d7f5014959b 100644 GIT binary patch delta 138 zcmV;50CoSP0m}i9Nq=ogL_t(2k-d@I34kyRMemhv;TVq5J={t6=opUS9M_MEkJ!-q z(*uE!a0p2t2?b>0-IPE8n9{zKY>zFD^YBM_(q9b7%de)Ma36&LV(UaXc~z|9iFERd sa5n58KRdNftkPekB#YEBfbrI+42)2QFE-t{z*%qUO-!U{ zKn4S&5ySH|w~_uD8R>2#eKj&b6FGXK#*2-&K4ky^v|$`Ob(qop00000NkvXXu0mjf D2t6op diff --git a/res/layout-ar/status_list_item.xml b/res/layout-ar/status_list_item.xml index 552c2e92..956d310a 100644 --- a/res/layout-ar/status_list_item.xml +++ b/res/layout-ar/status_list_item.xml @@ -1,6 +1,6 @@ - @@ -11,13 +11,13 @@ android:layout_alignParentRight="true" android:scaleType="fitCenter"/> - - + - + \ No newline at end of file diff --git a/res/layout-ar/user_list_item.xml b/res/layout-ar/user_list_item.xml index e95604a9..d90d000d 100644 --- a/res/layout-ar/user_list_item.xml +++ b/res/layout-ar/user_list_item.xml @@ -1,5 +1,5 @@ - @@ -47,4 +47,4 @@ android:textStyle="bold" android:visibility="gone"/> - \ No newline at end of file + \ No newline at end of file diff --git a/res/layout-ar/view_status.xml b/res/layout-ar/view_status.xml index 69a56643..a69b55bd 100644 --- a/res/layout-ar/view_status.xml +++ b/res/layout-ar/view_status.xml @@ -24,7 +24,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/item_background_holo_light" - android:padding="8dp"> + android:padding="6dp"> - @@ -35,8 +35,7 @@ android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorSecondary"/> - - - + - + - - - - + \ No newline at end of file diff --git a/res/layout/user_list_item.xml b/res/layout/user_list_item.xml index 5cfdfc8d..aa1d4912 100644 --- a/res/layout/user_list_item.xml +++ b/res/layout/user_list_item.xml @@ -1,50 +1,39 @@ - + android:layout_height="wrap_content" + android:padding="6dp"> - + - - - - - + android:layout_alignParentTop="true" + android:layout_alignWithParentIfMissing="true" + android:layout_marginLeft="6dp" + android:layout_toRightOf="@+id/profile_image" + android:singleLine="true" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?android:attr/textColorPrimary" + android:textStyle="bold"/> - - + - \ No newline at end of file + \ No newline at end of file diff --git a/res/layout/view_status.xml b/res/layout/view_status.xml index 62ed46f8..b9722992 100644 --- a/res/layout/view_status.xml +++ b/res/layout/view_status.xml @@ -30,7 +30,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/item_background_holo_light" - android:padding="8dp"> + android:padding="6dp"> + - Remember position Remember list/tab position before closing Twidere Blocked this user. + Blocked these users. Unblocked this user. Reported this user for spam. + Reported these users for spam. Filename File exists, overwrite? Save as diff --git a/src/org/mariotaku/twidere/activity/MultiSelectActivity.java b/src/org/mariotaku/twidere/activity/MultiSelectActivity.java index 1e3cd7cf..2cb60959 100644 --- a/src/org/mariotaku/twidere/activity/MultiSelectActivity.java +++ b/src/org/mariotaku/twidere/activity/MultiSelectActivity.java @@ -1,6 +1,9 @@ package org.mariotaku.twidere.activity; +import static org.mariotaku.twidere.util.Utils.getAccountScreenNames; + import java.util.ArrayList; +import java.util.Arrays; import org.mariotaku.actionbarcompat.ActionMode; import org.mariotaku.twidere.R; @@ -8,8 +11,10 @@ import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.provider.TweetStore.Filters; +import org.mariotaku.twidere.util.ArrayUtils; import org.mariotaku.twidere.util.ListUtils; import org.mariotaku.twidere.util.NoDuplicatesList; +import org.mariotaku.twidere.util.ServiceInterface; import android.content.BroadcastReceiver; import android.content.ContentResolver; @@ -30,6 +35,7 @@ public class MultiSelectActivity extends DualPaneActivity implements ActionMode.Callback { private TwidereApplication mApplication; + private ServiceInterface mService; private ActionMode mActionMode; @@ -49,12 +55,13 @@ public void onReceive(Context context, Intent intent) { @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - final ArrayList selected_items = mApplication.getSelectedItems(); + final NoDuplicatesList selected_items = mApplication.getSelectedItems(); switch (item.getItemId()) { case MENU_REPLY: { final Extractor extractor = new Extractor(); final Intent intent = new Intent(INTENT_ACTION_COMPOSE); final Bundle bundle = new Bundle(); + final String[] account_names = getAccountScreenNames(this); final NoDuplicatesList all_mentions = new NoDuplicatesList(); for (final Object object : selected_items) { if (object instanceof ParcelableStatus) { @@ -66,10 +73,12 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { all_mentions.add(user.screen_name); } } + all_mentions.removeAll(Arrays.asList(account_names)); bundle.putStringArray(INTENT_KEY_MENTIONS, all_mentions.toArray(new String[all_mentions.size()])); intent.putExtras(bundle); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); + mode.finish(); break; } case MENU_MUTE_USER: { @@ -99,18 +108,62 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { resolver.bulkInsert(uri, values_list.toArray(new ContentValues[values_list.size()])); editor.putBoolean(PREFERENCE_KEY_ENABLE_FILTER, true).commit(); Toast.makeText(this, R.string.users_muted, Toast.LENGTH_SHORT).show(); + mode.finish(); break; } case MENU_BLOCK: { + final int count = selected_items.size(); + if (count >= 1) { + final Object obj = selected_items.get(0); + final long account_id; + final ArrayList ids_list = new ArrayList(); + if (obj instanceof ParcelableUser) { + account_id = ((ParcelableUser) obj).account_id; + } else if (obj instanceof ParcelableStatus) { + account_id = ((ParcelableStatus) obj).account_id; + } else { + account_id = -1; + } + for (final Object selected_item : selected_items) { + if (selected_item instanceof ParcelableUser) { + ids_list.add(((ParcelableUser) selected_item).user_id); + } else if (selected_item instanceof ParcelableStatus) { + ids_list.add(((ParcelableStatus) selected_item).user_id); + } + } + if (account_id > 0) { + mService.createMultiBlock(account_id, ArrayUtils.fromList(ids_list)); + } + } + mode.finish(); break; } case MENU_REPORT_SPAM: { - break; - } - } - if (item.getItemId() != R.id.more_submenu) { - if (mode != null) { + final int count = selected_items.size(); + if (count >= 1) { + final Object obj = selected_items.get(0); + final long account_id; + final ArrayList ids_list = new ArrayList(); + if (obj instanceof ParcelableUser) { + account_id = ((ParcelableUser) obj).account_id; + } else if (obj instanceof ParcelableStatus) { + account_id = ((ParcelableStatus) obj).account_id; + } else { + account_id = -1; + } + for (final Object selected_item : selected_items) { + if (selected_item instanceof ParcelableUser) { + ids_list.add(((ParcelableUser) selected_item).user_id); + } else if (selected_item instanceof ParcelableStatus) { + ids_list.add(((ParcelableStatus) selected_item).user_id); + } + } + if (account_id > 0) { + mService.reportMultiSpam(account_id, ArrayUtils.fromList(ids_list)); + } + } mode.finish(); + break; } } return true; @@ -120,6 +173,7 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { @Override public void onCreate(Bundle savedInstanceState) { mApplication = getTwidereApplication(); + mService = mApplication.getServiceInterface(); super.onCreate(savedInstanceState); } diff --git a/src/org/mariotaku/twidere/adapter/UsersAdapter.java b/src/org/mariotaku/twidere/adapter/UsersAdapter.java index 31a15cb6..815de6f8 100644 --- a/src/org/mariotaku/twidere/adapter/UsersAdapter.java +++ b/src/org/mariotaku/twidere/adapter/UsersAdapter.java @@ -19,6 +19,7 @@ package org.mariotaku.twidere.adapter; +import static org.mariotaku.twidere.util.Utils.getAccountColor; import static org.mariotaku.twidere.util.Utils.getBiggerTwitterProfileImage; import static org.mariotaku.twidere.util.Utils.getNormalTwitterProfileImage; import static org.mariotaku.twidere.util.Utils.getUserColor; @@ -43,7 +44,8 @@ public class UsersAdapter extends ArrayAdapter implements BaseAdapterInterface { private final LazyImageLoader mProfileImageLoader; - private boolean mDisplayProfileImage, mDisplayHiResProfileImage, mDisplayName, mMultiSelectEnabled; + private boolean mDisplayProfileImage, mDisplayHiResProfileImage, mDisplayName, mShowAccountColor, + mMultiSelectEnabled; private float mTextSize; private final ArrayList mSelectedUserIds; private final Context mContext; @@ -102,6 +104,12 @@ public View getView(int position, View convertView, ViewGroup parent) { holder.setSelected(false); } + holder.setAccountColorEnabled(mShowAccountColor); + + if (mShowAccountColor) { + holder.setAccountColor(getAccountColor(mContext, user.account_id)); + } + holder.setUserColor(getUserColor(mContext, user.user_id)); holder.setTextSize(mTextSize); @@ -169,6 +177,13 @@ public void setMultiSelectEnabled(boolean multi) { } } + public void setShowAccountColor(boolean show) { + if (show != mShowAccountColor) { + mShowAccountColor = show; + notifyDataSetChanged(); + } + } + @Override public void setTextSize(float text_size) { if (text_size != mTextSize) { diff --git a/src/org/mariotaku/twidere/app/TwidereApplication.java b/src/org/mariotaku/twidere/app/TwidereApplication.java index dd3360a7..fc1b2f08 100644 --- a/src/org/mariotaku/twidere/app/TwidereApplication.java +++ b/src/org/mariotaku/twidere/app/TwidereApplication.java @@ -31,6 +31,7 @@ import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.util.AsyncTaskManager; import org.mariotaku.twidere.util.LazyImageLoader; +import org.mariotaku.twidere.util.NoDuplicatesList; import org.mariotaku.twidere.util.ServiceInterface; import android.app.Application; @@ -164,7 +165,7 @@ public void stopMultiSelect() { } @SuppressWarnings("serial") - public class ItemsList extends ArrayList { + public class ItemsList extends NoDuplicatesList { @Override public boolean add(Object object) { @@ -184,6 +185,7 @@ public boolean add(Object object) { public void clear() { super.clear(); mSelectedStatusIds.clear(); + mSelectedUserIds.clear(); final Intent intent = new Intent(BROADCAST_MULTI_SELECT_ITEM_CHANGED); intent.setPackage(getPackageName()); sendBroadcast(intent); diff --git a/src/org/mariotaku/twidere/fragment/BaseStatusesListFragment.java b/src/org/mariotaku/twidere/fragment/BaseStatusesListFragment.java index b88279e1..dbac83fc 100644 --- a/src/org/mariotaku/twidere/fragment/BaseStatusesListFragment.java +++ b/src/org/mariotaku/twidere/fragment/BaseStatusesListFragment.java @@ -19,13 +19,13 @@ package org.mariotaku.twidere.fragment; +import static org.mariotaku.twidere.util.Utils.getActivatedAccountIds; import static org.mariotaku.twidere.util.Utils.getQuoteStatus; import static org.mariotaku.twidere.util.Utils.isMyRetweet; import static org.mariotaku.twidere.util.Utils.openConversation; import static org.mariotaku.twidere.util.Utils.openStatus; import static org.mariotaku.twidere.util.Utils.setMenuForStatus; -import java.util.ArrayList; import java.util.List; import org.mariotaku.popupmenu.PopupMenu; @@ -36,6 +36,7 @@ import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.StatusViewHolder; import org.mariotaku.twidere.util.AsyncTaskManager; +import org.mariotaku.twidere.util.NoDuplicatesList; import org.mariotaku.twidere.util.ServiceInterface; import org.mariotaku.twidere.util.StatusesAdapterInterface; @@ -177,7 +178,7 @@ public void onItemClick(AdapterView adapter, View view, int position, long id getStatuses(new long[] { status.account_id }, new long[] { status.status_id }); } else { if (mApplication.isMultiSelectActive()) { - final ArrayList list = mApplication.getSelectedItems(); + final NoDuplicatesList list = mApplication.getSelectedItems(); if (!list.contains(status)) { list.add(status); } else { @@ -198,7 +199,7 @@ public boolean onItemLongClick(AdapterView adapter, View view, int position, if (holder.show_as_gap) return false; mSelectedStatus = getListAdapter().findStatus(id); if (mApplication.isMultiSelectActive()) { - final ArrayList list = mApplication.getSelectedItems(); + final NoDuplicatesList list = mApplication.getSelectedItems(); if (!list.contains(mSelectedStatus)) { list.add(mSelectedStatus); } else { @@ -225,6 +226,7 @@ public void onLoaderReset(Loader loader) { @Override public void onLoadFinished(Loader loader, Data data) { mData = data; + mAdapter.setShowAccountColor(getActivatedAccountIds(getActivity()).length > 1); setListShown(true); } @@ -306,7 +308,7 @@ public boolean onMenuItemClick(MenuItem item) { if (!mApplication.isMultiSelectActive()) { mApplication.startMultiSelect(); } - final ArrayList list = mApplication.getSelectedItems(); + final NoDuplicatesList list = mApplication.getSelectedItems(); if (!list.contains(status)) { list.add(status); } diff --git a/src/org/mariotaku/twidere/fragment/BaseUsersListFragment.java b/src/org/mariotaku/twidere/fragment/BaseUsersListFragment.java index 6efaa63b..7a508d9b 100644 --- a/src/org/mariotaku/twidere/fragment/BaseUsersListFragment.java +++ b/src/org/mariotaku/twidere/fragment/BaseUsersListFragment.java @@ -19,6 +19,8 @@ package org.mariotaku.twidere.fragment; +import static org.mariotaku.twidere.util.Utils.getActivatedAccountIds; + import java.util.ArrayList; import java.util.List; @@ -30,6 +32,7 @@ import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.Panes; import org.mariotaku.twidere.model.ParcelableUser; +import org.mariotaku.twidere.util.NoDuplicatesList; import android.content.BroadcastReceiver; import android.content.Context; @@ -148,7 +151,7 @@ public final void onItemClick(AdapterView adapter, View view, int position, l final ParcelableUser user = mAdapter.findItem(id); if (user == null) return; if (mApplication.isMultiSelectActive()) { - final ArrayList list = mApplication.getSelectedItems(); + final NoDuplicatesList list = mApplication.getSelectedItems(); if (!list.contains(user)) { list.add(user); } else { @@ -165,7 +168,7 @@ public boolean onItemLongClick(AdapterView parent, View view, int position, l final UsersAdapter adapter = getListAdapter(); mSelectedUser = adapter.findItem(id); if (mApplication.isMultiSelectActive()) { - final ArrayList list = mApplication.getSelectedItems(); + final NoDuplicatesList list = mApplication.getSelectedItems(); if (!list.contains(mSelectedUser)) { list.add(mSelectedUser); } else { @@ -189,6 +192,7 @@ public void onLoaderReset(Loader> loader) { public void onLoadFinished(Loader> loader, List data) { setProgressBarIndeterminateVisibility(false); mAdapter.setData(data); + mAdapter.setShowAccountColor(getActivatedAccountIds(getActivity()).length > 1); onRefreshComplete(); setListShown(true); } @@ -213,7 +217,7 @@ public boolean onMenuItemClick(MenuItem item) { if (!mApplication.isMultiSelectActive()) { mApplication.startMultiSelect(); } - final ArrayList list = mApplication.getSelectedItems(); + final NoDuplicatesList list = mApplication.getSelectedItems(); if (!list.contains(mSelectedUser)) { list.add(mSelectedUser); } @@ -242,6 +246,23 @@ public void onPullUpToRefresh() { } } + @Override + public void onResume() { + super.onResume(); + + mLoadMoreAutomatically = mPreferences.getBoolean(PREFERENCE_KEY_LOAD_MORE_AUTOMATICALLY, false); + final float text_size = mPreferences.getFloat(PREFERENCE_KEY_TEXT_SIZE, PREFERENCE_DEFAULT_TEXT_SIZE); + final boolean display_profile_image = mPreferences.getBoolean(PREFERENCE_KEY_DISPLAY_PROFILE_IMAGE, true); + final boolean hires_profile_image = mPreferences.getBoolean(PREFERENCE_KEY_HIRES_PROFILE_IMAGE, false); + final boolean display_name = mPreferences.getBoolean(PREFERENCE_KEY_DISPLAY_NAME, true); + mAdapter.setMultiSelectEnabled(mApplication.isMultiSelectActive()); + mAdapter.setDisplayProfileImage(display_profile_image); + mAdapter.setDisplayHiResProfileImage(hires_profile_image); + mAdapter.setTextSize(text_size); + mAdapter.setDisplayName(display_name); + mAdapter.notifyDataSetChanged(); + } + @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { final boolean reached = firstVisibleItem + visibleItemCount >= totalItemCount @@ -264,23 +285,6 @@ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCoun @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } - - @Override - public void onResume() { - super.onResume(); - - mLoadMoreAutomatically = mPreferences.getBoolean(PREFERENCE_KEY_LOAD_MORE_AUTOMATICALLY, false); - final float text_size = mPreferences.getFloat(PREFERENCE_KEY_TEXT_SIZE, PREFERENCE_DEFAULT_TEXT_SIZE); - final boolean display_profile_image = mPreferences.getBoolean(PREFERENCE_KEY_DISPLAY_PROFILE_IMAGE, true); - final boolean hires_profile_image = mPreferences.getBoolean(PREFERENCE_KEY_HIRES_PROFILE_IMAGE, false); - final boolean display_name = mPreferences.getBoolean(PREFERENCE_KEY_DISPLAY_NAME, true); - mAdapter.setMultiSelectEnabled(mApplication.isMultiSelectActive()); - mAdapter.setDisplayProfileImage(display_profile_image); - mAdapter.setDisplayHiResProfileImage(hires_profile_image); - mAdapter.setTextSize(text_size); - mAdapter.setDisplayName(display_name); - mAdapter.notifyDataSetChanged(); - } @Override public void onStart() { diff --git a/src/org/mariotaku/twidere/fragment/CursorStatusesListFragment.java b/src/org/mariotaku/twidere/fragment/CursorStatusesListFragment.java index 53228b70..1956d428 100644 --- a/src/org/mariotaku/twidere/fragment/CursorStatusesListFragment.java +++ b/src/org/mariotaku/twidere/fragment/CursorStatusesListFragment.java @@ -115,7 +115,6 @@ public void onLoaderReset(Loader loader) { public void onLoadFinished(Loader loader, Cursor data) { super.onLoadFinished(loader, data); mAdapter.swapCursor(data); - mAdapter.setShowAccountColor(getActivatedAccountIds(getActivity()).length > 1); } @Override diff --git a/src/org/mariotaku/twidere/model/StatusViewHolder.java b/src/org/mariotaku/twidere/model/StatusViewHolder.java index 78eef45c..033effbc 100644 --- a/src/org/mariotaku/twidere/model/StatusViewHolder.java +++ b/src/org/mariotaku/twidere/model/StatusViewHolder.java @@ -19,27 +19,26 @@ package org.mariotaku.twidere.model; -import android.content.Context; +import org.mariotaku.twidere.R; +import org.mariotaku.twidere.view.ColorLabelRelativeLayout; + import android.graphics.Color; import android.view.View; import android.widget.ImageView; import android.widget.TextView; - -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.view.ExtendedRelativeLayout; public class StatusViewHolder { public final ImageView profile_image, image_preview; public final TextView name, text, time, reply_retweet_status; private final View gap_indicator; - private final ExtendedRelativeLayout content; + private final ColorLabelRelativeLayout content; public boolean show_as_gap; private boolean account_color_enabled; private float text_size; public StatusViewHolder(View view) { - content = (ExtendedRelativeLayout) view; + content = (ColorLabelRelativeLayout) view; gap_indicator = view.findViewById(R.id.list_gap_text); profile_image = (ImageView) view.findViewById(R.id.profile_image); image_preview = (ImageView) view.findViewById(R.id.image_preview); @@ -59,13 +58,13 @@ public void setAccountColorEnabled(boolean enabled) { content.drawRight(Color.TRANSPARENT); } } - + public void setHighlightColor(int color) { - content.drawBackground(show_as_gap ? Color.TRANSPARENT : color); + content.drawBackground(show_as_gap ? Color.TRANSPARENT : color); } public void setSelected(boolean selected) { - content.setBackgroundColor(selected && !show_as_gap ? 0x8033B5E5 : 0); + content.setBackgroundColor(selected && !show_as_gap ? 0x600099CC : Color.TRANSPARENT); } public void setShowAsGap(boolean show_gap) { diff --git a/src/org/mariotaku/twidere/model/UserViewHolder.java b/src/org/mariotaku/twidere/model/UserViewHolder.java index 7b114f80..0041c359 100644 --- a/src/org/mariotaku/twidere/model/UserViewHolder.java +++ b/src/org/mariotaku/twidere/model/UserViewHolder.java @@ -20,10 +20,9 @@ package org.mariotaku.twidere.model; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.view.ColorView; +import org.mariotaku.twidere.view.ColorLabelRelativeLayout; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; +import android.graphics.Color; import android.view.View; import android.widget.ImageView; import android.widget.TextView; @@ -31,46 +30,45 @@ public class UserViewHolder { public final ImageView profile_image; - public final ColorView user_background; public final TextView name, description; - private final View content, user_content, gap_indicator; + private final View gap_indicator; + private final ColorLabelRelativeLayout content; public boolean show_as_gap; + private boolean account_color_enabled; private float text_size; public UserViewHolder(View view) { - content = view; - user_content = view.findViewById(R.id.user_content); + content = (ColorLabelRelativeLayout) view; gap_indicator = view.findViewById(R.id.list_gap_text); profile_image = (ImageView) view.findViewById(R.id.profile_image); name = (TextView) view.findViewById(R.id.name); description = (TextView) view.findViewById(R.id.description); - user_background = (ColorView) view.findViewById(R.id.user_background); } public void setAccountColor(int color) { - final Drawable background = user_content.getBackground(); - if (background != null) { - background.mutate().setColorFilter(color, PorterDuff.Mode.MULTIPLY); - user_content.invalidate(); - } + content.drawRight(account_color_enabled && !show_as_gap ? color : Color.TRANSPARENT); } public void setAccountColorEnabled(boolean enabled) { - user_content.setBackgroundResource(enabled ? R.drawable.ic_label_account : 0); + account_color_enabled = enabled && !show_as_gap; + if (!account_color_enabled) { + content.drawRight(Color.TRANSPARENT); + } + } + + public void setHighlightColor(int color) { + content.drawBackground(show_as_gap ? Color.TRANSPARENT : color); } public void setSelected(boolean selected) { - if (!show_as_gap) { - content.setBackgroundResource(selected ? R.drawable.list_focused_holo : 0); - } else { - content.setBackgroundResource(0); - } + content.setBackgroundColor(selected && !show_as_gap ? 0x600099CC : Color.TRANSPARENT); } public void setShowAsGap(boolean show_gap) { show_as_gap = show_gap; - user_content.setVisibility(show_gap ? View.GONE : View.VISIBLE); - user_background.setVisibility(show_gap ? View.GONE : View.VISIBLE); + profile_image.setVisibility(show_gap ? View.GONE : View.VISIBLE); + description.setVisibility(show_gap ? View.GONE : View.VISIBLE); + name.setVisibility(show_gap ? View.GONE : View.VISIBLE); gap_indicator.setVisibility(!show_gap ? View.GONE : View.VISIBLE); } @@ -83,11 +81,7 @@ public void setTextSize(float text_size) { } public void setUserColor(int color) { - final Drawable background = user_background.getBackground(); - if (background != null) { - background.mutate().setColorFilter(color, PorterDuff.Mode.MULTIPLY); - user_background.invalidate(); - } + content.drawLeft(show_as_gap ? Color.TRANSPARENT : color); } } diff --git a/src/org/mariotaku/twidere/service/TwidereService.java b/src/org/mariotaku/twidere/service/TwidereService.java index 98e870ac..eadac4ac 100644 --- a/src/org/mariotaku/twidere/service/TwidereService.java +++ b/src/org/mariotaku/twidere/service/TwidereService.java @@ -832,7 +832,7 @@ protected void onPostExecute(ListResponse result) { + " IN (" + user_id_where + ")"; mResolver.delete(uri, where, null); } - Toast.makeText(TwidereService.this, R.string.user_blocked, Toast.LENGTH_SHORT).show(); + Toast.makeText(TwidereService.this, R.string.users_blocked, Toast.LENGTH_SHORT).show(); } final Intent intent = new Intent(BROADCAST_MULTI_BLOCKSTATE_CHANGED); intent.putExtra(INTENT_KEY_USER_ID, user_ids); @@ -1679,7 +1679,7 @@ protected void onPostExecute(ListResponse result) { + " IN (" + user_id_where + ")"; mResolver.delete(uri, where, null); } - Toast.makeText(TwidereService.this, R.string.reported_user_for_spam, Toast.LENGTH_SHORT).show(); + Toast.makeText(TwidereService.this, R.string.reported_users_for_spam, Toast.LENGTH_SHORT).show(); } final Intent intent = new Intent(BROADCAST_MULTI_BLOCKSTATE_CHANGED); intent.putExtra(INTENT_KEY_USER_ID, user_ids); diff --git a/src/org/mariotaku/twidere/view/ExtendedRelativeLayout.java b/src/org/mariotaku/twidere/view/ColorLabelRelativeLayout.java similarity index 85% rename from src/org/mariotaku/twidere/view/ExtendedRelativeLayout.java rename to src/org/mariotaku/twidere/view/ColorLabelRelativeLayout.java index 5b111472..a3685707 100644 --- a/src/org/mariotaku/twidere/view/ExtendedRelativeLayout.java +++ b/src/org/mariotaku/twidere/view/ColorLabelRelativeLayout.java @@ -27,21 +27,21 @@ import android.util.AttributeSet; import android.widget.RelativeLayout; -public class ExtendedRelativeLayout extends RelativeLayout { +public class ColorLabelRelativeLayout extends RelativeLayout { private final Paint mPaintLeft = new Paint(), mPaintRight = new Paint(), mPaintBackground = new Paint(); private final Rect mRectLeft = new Rect(), mRectRight = new Rect(), mRectBackground = new Rect(); - private final float mDensity; + private final float mDensity; - public ExtendedRelativeLayout(Context context) { + public ColorLabelRelativeLayout(Context context) { this(context, null); } - public ExtendedRelativeLayout(Context context, AttributeSet attrs) { + public ColorLabelRelativeLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } - public ExtendedRelativeLayout(Context context, AttributeSet attrs, int defStyle) { + public ColorLabelRelativeLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setWillNotDraw(false); mDensity = context.getResources().getDisplayMetrics().density; @@ -50,13 +50,17 @@ public ExtendedRelativeLayout(Context context, AttributeSet attrs, int defStyle) mPaintBackground.setColor(Color.TRANSPARENT); } + public void drawBackground(int color) { + drawLabel(mPaintLeft.getColor(), mPaintRight.getColor(), color); + } + public void drawLabel(int left, int right, int background) { mPaintBackground.setColor(background); mPaintLeft.setColor(left); mPaintRight.setColor(right); invalidate(); } - + public void drawLeft(int color) { drawLabel(color, mPaintRight.getColor(), mPaintBackground.getColor()); } @@ -64,11 +68,7 @@ public void drawLeft(int color) { public void drawRight(int color) { drawLabel(mPaintLeft.getColor(), color, mPaintBackground.getColor()); } - - public void drawBackground(int color) { - drawLabel(mPaintLeft.getColor(), mPaintRight.getColor(), color); - } - + @Override public void onDraw(Canvas canvas) { canvas.drawRect(mRectBackground, mPaintBackground); @@ -80,8 +80,8 @@ public void onDraw(Canvas canvas) { @Override public void onSizeChanged(int w, int h, int oldw, int oldh) { mRectBackground.set(0, 0, w, h); - mRectLeft.set(0, 0, (int)(4 * mDensity), h); - mRectRight.set(w - (int)(4 * mDensity), 0, w, h); + mRectLeft.set(0, 0, (int) (4 * mDensity), h); + mRectRight.set(w - (int) (4 * mDensity), 0, w, h); super.onSizeChanged(w, h, oldw, oldh); } }