added name for account selector in compose screen

This commit is contained in:
Mariotaku Lee 2015-04-28 23:23:23 +08:00
parent 72506e853f
commit 86c77d4dd8
9 changed files with 97 additions and 189 deletions

View File

@ -48,6 +48,7 @@ public interface Constants extends TwidereConstants {
int MENU_COMPOSE = R.id.compose;
int MENU_SEND = R.id.send;
int MENU_EDIT = R.id.edit;
int MENU_INFO = R.id.info;
int MENU_SELECT_ACCOUNT = R.id.select_account;
int MENU_SETTINGS = R.id.settings;
int MENU_ADD_LOCATION = R.id.add_location;

View File

@ -1234,11 +1234,13 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
private final AccountIconsAdapter adapter;
private final ShapedImageView iconView;
private final TextView nameView;
public AccountIconViewHolder(AccountIconsAdapter adapter, View itemView) {
super(itemView);
this.adapter = adapter;
iconView = (ShapedImageView) itemView.findViewById(android.R.id.icon);
nameView = (TextView) itemView.findViewById(android.R.id.text1);
itemView.setOnClickListener(this);
}
@ -1247,6 +1249,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
final MediaLoaderWrapper loader = adapter.getImageLoader();
loader.displayProfileImage(iconView, account.profile_image_url);
iconView.setBorderColor(account.color);
nameView.setText(adapter.isNameFirst() ? account.name : ("@" + account.screen_name));
}
@Override
@ -1263,6 +1266,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
private final LayoutInflater mInflater;
private final MediaLoaderWrapper mImageLoader;
private final LongSparseArray<Boolean> mSelection;
private final boolean mNameFirst;
private ParcelableAccount[] mAccounts;
@ -1271,6 +1275,9 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
mInflater = activity.getLayoutInflater();
mImageLoader = TwidereApplication.getInstance(activity).getMediaLoaderWrapper();
mSelection = new LongSparseArray<>();
final SharedPreferencesWrapper preferences = SharedPreferencesWrapper.getInstance(activity,
SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE, SharedPreferenceConstants.class);
mNameFirst = preferences.getBoolean(KEY_NAME_FIRST);
}
public MediaLoaderWrapper getImageLoader() {
@ -1351,6 +1358,10 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
mActivity.notifyAccountSelectionChanged();
notifyDataSetChanged();
}
public boolean isNameFirst() {
return mNameFirst;
}
}
private static class AddBitmapTask extends AddMediaTask {

View File

@ -353,6 +353,7 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
switch (linkId) {
case LINK_ID_SEARCH:
case LINK_ID_USER_LISTS:
case LINK_ID_USER_LIST:
case LINK_ID_FILTERS: {
ThemeUtils.applyActionBarBackground(actionBarContainer, this, themeId, themeColor, option, false);
break;

View File

@ -43,8 +43,6 @@ import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.CardView;
import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@ -55,8 +53,6 @@ import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
@ -67,6 +63,7 @@ import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.constant.SharedPreferenceConstants;
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback;
import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback;
import org.mariotaku.twidere.graphic.EmptyDrawable;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.ParcelableUserList;
import org.mariotaku.twidere.model.SingleResponse;
@ -80,39 +77,28 @@ import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TwidereLinkify;
import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.ColorLabelLinearLayout;
import org.mariotaku.twidere.view.HeaderDrawerLayout;
import org.mariotaku.twidere.view.HeaderDrawerLayout.DrawerCallback;
import org.mariotaku.twidere.view.TabPagerIndicator;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.UserList;
import static android.text.TextUtils.isEmpty;
import static org.mariotaku.twidere.util.MenuUtils.setMenuItemAvailability;
import static org.mariotaku.twidere.util.Utils.addIntentToMenu;
import static org.mariotaku.twidere.util.Utils.getAccountColor;
import static org.mariotaku.twidere.util.Utils.getTwitterInstance;
import static org.mariotaku.twidere.util.Utils.openUserListDetails;
import static org.mariotaku.twidere.util.Utils.openUserProfile;
public class UserListFragment extends BaseSupportFragment implements OnClickListener,
LoaderCallbacks<SingleResponse<ParcelableUserList>>, DrawerCallback,
SystemWindowsInsetsCallback, SupportFragmentCallback {
LoaderCallbacks<SingleResponse<ParcelableUserList>>, SystemWindowsInsetsCallback,
SupportFragmentCallback {
private MediaLoaderWrapper mProfileImageLoader;
private AsyncTwitterWrapper mTwitterWrapper;
private ImageView mProfileImageView;
private TextView mListNameView, mCreatedByView, mDescriptionView, mErrorTextView;
private View mErrorContainer, mProgressContainer;
private ColorLabelLinearLayout mUserListDetails;
private ImageView mErrorIconView;
private HeaderDrawerLayout mHeaderDrawerLayout;
private ViewPager mViewPager;
private TabPagerIndicator mPagerIndicator;
private CardView mCardView;
private View mPagerOverlay;
private SupportTabsAdapter mPagerAdapter;
private boolean mUserListLoaderInitialized;
@ -141,78 +127,16 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
}
};
@Override
public boolean canScroll(float dy) {
final Fragment fragment = getCurrentVisibleFragment();
return fragment instanceof DrawerCallback && ((DrawerCallback) fragment).canScroll(dy);
}
@Override
public void cancelTouch() {
final Fragment fragment = getCurrentVisibleFragment();
if (fragment instanceof DrawerCallback) {
((DrawerCallback) fragment).cancelTouch();
}
}
@Override
public void fling(float velocity) {
final Fragment fragment = getCurrentVisibleFragment();
if (fragment instanceof DrawerCallback) {
((DrawerCallback) fragment).fling(velocity);
}
}
@Override
public boolean isScrollContent(float x, float y) {
final ViewPager v = mViewPager;
final int[] location = new int[2];
v.getLocationOnScreen(location);
return x >= location[0] && x <= location[0] + v.getWidth()
&& y >= location[1] && y <= location[1] + v.getHeight();
}
@Override
public void scrollBy(float dy) {
final Fragment fragment = getCurrentVisibleFragment();
if (fragment instanceof DrawerCallback) {
((DrawerCallback) fragment).scrollBy(dy);
}
}
@Override
public boolean shouldLayoutHeaderBottom() {
final HeaderDrawerLayout drawer = mHeaderDrawerLayout;
final CardView card = mCardView;
if (drawer == null || card == null) return false;
return card.getTop() + drawer.getHeaderTop() - drawer.getPaddingTop() <= 0;
}
@Override
public void topChanged(int offset) {
}
public void displayUserList(final ParcelableUserList userList) {
if (userList == null || getActivity() == null) return;
getLoaderManager().destroyLoader(0);
mErrorContainer.setVisibility(View.GONE);
mProgressContainer.setVisibility(View.GONE);
mUserList = userList;
mUserListDetails.drawEnd(getAccountColor(getActivity(), userList.account_id));
mListNameView.setText(userList.name);
final boolean nameFirst = mPreferences.getBoolean(KEY_NAME_FIRST);
final String displayName = mUserColorNameManager.getDisplayName(userList, nameFirst, false);
mCreatedByView.setText(getString(R.string.created_by, displayName));
final String description = userList.description;
mDescriptionView.setVisibility(isEmpty(description) ? View.GONE : View.VISIBLE);
mDescriptionView.setText(description);
final TwidereLinkify linkify = new TwidereLinkify(new OnLinkClickHandler(getActivity(),
getMultiSelectManager()));
linkify.applyAllLinks(mDescriptionView, userList.account_id, false);
mDescriptionView.setMovementMethod(LinkMovementMethod.getInstance());
mProfileImageLoader.displayProfileImage(mProfileImageView, userList.user_profile_image_url);
invalidateOptionsMenu();
}
@ -273,15 +197,7 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_user_list, container, false);
final ViewGroup listDetailsContainer = (ViewGroup) view.findViewById(R.id.list_details_container);
final boolean isCompact = Utils.isCompactCards(getActivity());
if (isCompact) {
inflater.inflate(R.layout.layout_user_list_details_compact, listDetailsContainer);
} else {
inflater.inflate(R.layout.layout_user_list_details, listDetailsContainer);
}
return view;
return inflater.inflate(R.layout.fragment_content_pages, container, false);
}
@Override
@ -310,8 +226,6 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
}
});
mHeaderDrawerLayout.setDrawerCallback(this);
mPagerAdapter = new SupportTabsAdapter(activity, getChildFragmentManager());
mViewPager.setAdapter(mPagerAdapter);
@ -322,12 +236,7 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
} else {
}
mProfileImageView.setOnClickListener(this);
mUserListDetails.setOnClickListener(this);
mErrorIconView.setOnClickListener(this);
getUserListInfo(false);
setupUserPages();
}
@ -364,23 +273,17 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
@Override
public void onPrepareOptionsMenu(Menu menu) {
final AsyncTwitterWrapper twitter = getTwitterWrapper();
final ParcelableUserList userList = mUserList;
final MenuItem followItem = menu.findItem(MENU_FOLLOW);
if (followItem != null) {
followItem.setEnabled(userList != null);
if (userList == null) {
followItem.setIcon(android.R.color.transparent);
}
}
if (twitter == null || userList == null) return;
final boolean isMyList = userList.user_id == userList.account_id;
setMenuItemAvailability(menu, MENU_EDIT, isMyList);
setMenuItemAvailability(menu, MENU_ADD, isMyList);
setMenuItemAvailability(menu, MENU_DELETE, isMyList);
final boolean isFollowing = userList.is_following;
if (followItem != null) {
followItem.setVisible(!isMyList);
setMenuItemAvailability(menu, MENU_INFO, userList != null);
menu.removeGroup(MENU_GROUP_USER_LIST_EXTENSION);
if (userList != null) {
final boolean isMyList = userList.user_id == userList.account_id;
final boolean isFollowing = userList.is_following;
setMenuItemAvailability(menu, MENU_EDIT, isMyList);
setMenuItemAvailability(menu, MENU_FOLLOW, !isMyList);
setMenuItemAvailability(menu, MENU_ADD, isMyList);
setMenuItemAvailability(menu, MENU_DELETE, isMyList);
final MenuItem followItem = menu.findItem(MENU_FOLLOW);
if (isFollowing) {
followItem.setIcon(R.drawable.ic_action_cancel);
followItem.setTitle(R.string.unsubscribe);
@ -388,12 +291,16 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
followItem.setIcon(R.drawable.ic_action_add);
followItem.setTitle(R.string.subscribe);
}
final Intent extensionsIntent = new Intent(INTENT_ACTION_EXTENSION_OPEN_USER_LIST);
extensionsIntent.setExtrasClassLoader(getActivity().getClassLoader());
extensionsIntent.putExtra(EXTRA_USER_LIST, userList);
addIntentToMenu(getActivity(), menu, extensionsIntent, MENU_GROUP_USER_LIST_EXTENSION);
} else {
setMenuItemAvailability(menu, MENU_EDIT, false);
setMenuItemAvailability(menu, MENU_FOLLOW, false);
setMenuItemAvailability(menu, MENU_ADD, false);
setMenuItemAvailability(menu, MENU_DELETE, false);
}
menu.removeGroup(MENU_GROUP_USER_LIST_EXTENSION);
final Intent extensionsIntent = new Intent(INTENT_ACTION_EXTENSION_OPEN_USER_LIST);
extensionsIntent.setExtrasClassLoader(getActivity().getClassLoader());
extensionsIntent.putExtra(EXTRA_USER_LIST, mUserList);
addIntentToMenu(getActivity(), menu, extensionsIntent, MENU_GROUP_USER_LIST_EXTENSION);
}
@Override
@ -476,11 +383,6 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
@Override
public Loader<SingleResponse<ParcelableUserList>> onCreateLoader(final int id, final Bundle args) {
mErrorTextView.setText(null);
mErrorTextView.setVisibility(View.GONE);
mErrorContainer.setVisibility(View.GONE);
mHeaderDrawerLayout.setVisibility(View.GONE);
mProgressContainer.setVisibility(View.VISIBLE);
setProgressBarIndeterminateVisibility(true);
final long accountId = args != null ? args.getLong(EXTRA_ACCOUNT_ID, -1) : -1;
final long userId = args != null ? args.getLong(EXTRA_USER_ID, -1) : -1;
@ -497,20 +399,10 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
final SingleResponse<ParcelableUserList> data) {
if (data == null) return;
if (getActivity() == null) return;
if (data.getData() != null) {
if (data.hasData()) {
final ParcelableUserList list = data.getData();
displayUserList(list);
mHeaderDrawerLayout.setVisibility(View.VISIBLE);
mErrorContainer.setVisibility(View.GONE);
mProgressContainer.setVisibility(View.GONE);
} else {
if (data.hasException()) {
mErrorTextView.setText(data.getException().getMessage());
mErrorTextView.setVisibility(View.VISIBLE);
}
mHeaderDrawerLayout.setVisibility(View.GONE);
mErrorContainer.setVisibility(View.VISIBLE);
mProgressContainer.setVisibility(View.GONE);
} else if (data.hasException()) {
}
setProgressBarIndeterminateVisibility(false);
}
@ -523,39 +415,12 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
@Override
public void onBaseViewCreated(final View view, final Bundle savedInstanceState) {
super.onBaseViewCreated(view, savedInstanceState);
mHeaderDrawerLayout = (HeaderDrawerLayout) view.findViewById(R.id.details_container);
mErrorContainer = view.findViewById(R.id.error_container);
mProgressContainer = view.findViewById(R.id.progress_container);
final View headerView = mHeaderDrawerLayout.getHeader();
final View contentView = mHeaderDrawerLayout.getContent();
mCardView = (CardView) headerView.findViewById(R.id.card);
mUserListDetails = (ColorLabelLinearLayout) headerView.findViewById(R.id.user_list_details);
mListNameView = (TextView) headerView.findViewById(R.id.list_name);
mCreatedByView = (TextView) headerView.findViewById(R.id.created_by);
mDescriptionView = (TextView) headerView.findViewById(R.id.description);
mProfileImageView = (ImageView) headerView.findViewById(R.id.profile_image);
mErrorIconView = (ImageView) mErrorContainer.findViewById(R.id.error_icon);
mErrorTextView = (TextView) mErrorContainer.findViewById(R.id.error_text);
mViewPager = (ViewPager) contentView.findViewById(R.id.view_pager);
mPagerIndicator = (TabPagerIndicator) contentView.findViewById(R.id.view_pager_tabs);
}
@Override
protected void fitSystemWindows(Rect insets) {
final View progress = mProgressContainer, error = mErrorContainer;
final HeaderDrawerLayout content = mHeaderDrawerLayout;
if (progress == null || error == null || content == null) {
return;
}
progress.setPadding(insets.left, insets.top, insets.right, insets.bottom);
error.setPadding(insets.left, insets.top, insets.right, insets.bottom);
content.setPadding(insets.left, insets.top, insets.right, insets.bottom);
content.setClipToPadding(false);
mViewPager = (ViewPager) view.findViewById(R.id.view_pager);
mPagerIndicator = (TabPagerIndicator) view.findViewById(R.id.view_pager_tabs);
mPagerOverlay = view.findViewById(R.id.pager_window_overlay);
}
private void setupUserPages() {
final Context context = getActivity();
final Bundle args = getArguments(), tabArgs = new Bundle();
if (args.containsKey(EXTRA_USER)) {
final ParcelableUserList userList = args.getParcelable(EXTRA_USER_LIST);
@ -574,7 +439,12 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
mPagerAdapter.addTab(UserListTimelineFragment.class, tabArgs, getString(R.string.statuses), null, 0, null);
mPagerAdapter.addTab(UserListMembersFragment.class, tabArgs, getString(R.string.members), null, 1, null);
mPagerAdapter.addTab(UserListSubscribersFragment.class, tabArgs, getString(R.string.subscribers), null, 2, null);
mPagerIndicator.notifyDataSetChanged();
final FragmentActivity activity = getActivity();
ThemeUtils.initPagerIndicatorAsActionBarTab(activity, mPagerIndicator, mPagerOverlay);
ThemeUtils.setCompatToolbarOverlay(activity, new EmptyDrawable());
ThemeUtils.setCompatContentViewOverlay(activity, new EmptyDrawable());
ThemeUtils.setWindowOverlayViewOverlay(activity, new EmptyDrawable());
}
public static class EditUserListDialogFragment extends BaseSupportDialogFragment implements

View File

@ -108,7 +108,7 @@
<android.support.v7.widget.RecyclerView
android:id="@+id/account_selector"
android:layout_width="?actionBarSize"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="left"
android:overScrollMode="never"/>

View File

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Twidere - Twitter client for Android
~
~ Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
@ -17,15 +16,31 @@
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<org.mariotaku.twidere.view.SquareShapedImageView
android:id="@android:id/icon"
style="?profileImageStyle"
xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/element_spacing_msmall"
app:sivBorder="true"
app:sivBorderWidth="@dimen/line_width_compose_account_profile_image"
tools:layout_width="48dp"/>
xmlns:tool="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="?actionBarSize"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="@dimen/element_spacing_msmall">
<org.mariotaku.twidere.view.SquareShapedImageView
android:id="@android:id/icon"
style="?profileImageStyle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:sivBorder="true"
app:sivBorderWidth="@dimen/line_width_compose_account_profile_image" />
<TextView
android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/element_spacing_normal"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?android:textColorPrimary"
android:textStyle="bold"
tool:text="Name" />
</LinearLayout>

View File

@ -1,27 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@id/info"
android:icon="@drawable/ic_action_info"
android:title="@string/user_list_details"
app:showAsAction="ifRoom"
android:visible="false" />
<item
android:id="@id/follow"
android:enabled="false"
app:showAsAction="ifRoom"
android:icon="@drawable/ic_action_add"
android:title="@string/subscribe" />
<item
android:id="@id/edit"
android:icon="@drawable/ic_action_edit"
android:title="@string/edit_profile"
android:visible="false"/>
<item
android:id="@id/follow"
android:enabled="false"
android:icon="@android:color/transparent"
android:title="@string/subscribe"/>
android:visible="false" />
<item
android:id="@id/add"
android:icon="@drawable/ic_action_add"
android:title="@string/add_member"/>
android:title="@string/add_member" />
<item
android:id="@id/delete"
android:icon="@drawable/ic_action_delete"
android:title="@string/delete"/>
android:title="@string/delete" />
<item
android:id="@id/open_with_account"
android:icon="@drawable/ic_action_accounts"
android:title="@string/open_with_account"/>
android:title="@string/open_with_account" />
</menu>

View File

@ -77,4 +77,5 @@
<item name="inverse_selection" type="id"/>
<item name="edit_media" type="id"/>
<item name="reset" type="id"/>
<item name="info" type="id"/>
</resources>

View File

@ -739,4 +739,5 @@
<string name="swipe_down_to_refresh">Swipe down to refresh</string>
<string name="app_restart_confirm">Twidere will restart to apply settings.</string>
<string name="dont_restart">Don\'t restart</string>
<string name="user_list_details">List details</string>
</resources>