new account selector in dashboard fragment

This commit is contained in:
Mariotaku Lee 2014-11-26 15:30:05 +08:00
parent de764eb177
commit 2f679124b0
39 changed files with 2606 additions and 2572 deletions

View File

@ -58,7 +58,6 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.CustomTabEditorActivity;
import org.mariotaku.twidere.model.CustomTabConfiguration;
import org.mariotaku.twidere.model.CustomTabConfiguration.CustomTabConfigurationComparator;
import org.mariotaku.twidere.model.Panes;
import org.mariotaku.twidere.provider.TweetStore.Tabs;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
@ -78,7 +77,7 @@ import static org.mariotaku.twidere.util.CustomTabUtils.isTabAdded;
import static org.mariotaku.twidere.util.CustomTabUtils.isTabTypeValid;
import static org.mariotaku.twidere.util.Utils.getAccountIds;
public class CustomTabsFragment extends BaseListFragment implements LoaderCallbacks<Cursor>, Panes.Right,
public class CustomTabsFragment extends BaseListFragment implements LoaderCallbacks<Cursor>,
MultiChoiceModeListener, DropListener {
private ContentResolver mResolver;

View File

@ -41,124 +41,123 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.ExtensionsAdapter;
import org.mariotaku.twidere.loader.ExtensionsListLoader;
import org.mariotaku.twidere.loader.ExtensionsListLoader.ExtensionInfo;
import org.mariotaku.twidere.model.Panes;
import org.mariotaku.twidere.util.PermissionsManager;
import java.util.List;
public class ExtensionsListFragment extends BaseListFragment implements Constants,
LoaderCallbacks<List<ExtensionInfo>>, OnItemClickListener, OnItemLongClickListener, OnMenuItemClickListener,
Panes.Right {
LoaderCallbacks<List<ExtensionInfo>>, OnItemClickListener, OnItemLongClickListener,
OnMenuItemClickListener {
private ExtensionsAdapter mAdapter;
private PackageManager mPackageManager;
private PermissionsManager mPermissionsManager;
private ExtensionInfo mSelectedExtension;
private ListView mListView;
private PopupMenu mPopupMenu;
private ExtensionsAdapter mAdapter;
private PackageManager mPackageManager;
private PermissionsManager mPermissionsManager;
private ExtensionInfo mSelectedExtension;
private ListView mListView;
private PopupMenu mPopupMenu;
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mPackageManager = getActivity().getPackageManager();
mPermissionsManager = new PermissionsManager(getActivity());
mAdapter = new ExtensionsAdapter(getActivity());
setListAdapter(mAdapter);
mListView = getListView();
mListView.setOnItemClickListener(this);
mListView.setOnItemLongClickListener(this);
getLoaderManager().initLoader(0, null, this);
setListShown(false);
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mPackageManager = getActivity().getPackageManager();
mPermissionsManager = new PermissionsManager(getActivity());
mAdapter = new ExtensionsAdapter(getActivity());
setListAdapter(mAdapter);
mListView = getListView();
mListView.setOnItemClickListener(this);
mListView.setOnItemLongClickListener(this);
getLoaderManager().initLoader(0, null, this);
setListShown(false);
}
@Override
public Loader<List<ExtensionInfo>> onCreateLoader(final int id, final Bundle args) {
return new ExtensionsListLoader(getActivity(), mPackageManager);
}
@Override
public Loader<List<ExtensionInfo>> onCreateLoader(final int id, final Bundle args) {
return new ExtensionsListLoader(getActivity(), mPackageManager);
}
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
openSettings(mAdapter.getItem(position));
}
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
openSettings(mAdapter.getItem(position));
}
@Override
public boolean onItemLongClick(final AdapterView<?> parent, final View view, final int position, final long id) {
mSelectedExtension = mAdapter.getItem(position);
if (mSelectedExtension == null) return false;
mPopupMenu = PopupMenu.getInstance(getActivity(), view);
mPopupMenu.inflate(R.menu.action_extension);
final Menu menu = mPopupMenu.getMenu();
final MenuItem settings = menu.findItem(MENU_SETTINGS);
final Intent intent = mSelectedExtension.pname != null && mSelectedExtension.settings != null ? new Intent(
INTENT_ACTION_EXTENSION_SETTINGS) : null;
if (intent != null) {
intent.setClassName(mSelectedExtension.pname, mSelectedExtension.settings);
}
settings.setVisible(intent != null && mPackageManager.queryIntentActivities(intent, 0).size() == 1);
mPopupMenu.setOnMenuItemClickListener(this);
mPopupMenu.show();
return true;
}
@Override
public boolean onItemLongClick(final AdapterView<?> parent, final View view, final int position, final long id) {
mSelectedExtension = mAdapter.getItem(position);
if (mSelectedExtension == null) return false;
mPopupMenu = PopupMenu.getInstance(getActivity(), view);
mPopupMenu.inflate(R.menu.action_extension);
final Menu menu = mPopupMenu.getMenu();
final MenuItem settings = menu.findItem(MENU_SETTINGS);
final Intent intent = mSelectedExtension.pname != null && mSelectedExtension.settings != null ? new Intent(
INTENT_ACTION_EXTENSION_SETTINGS) : null;
if (intent != null) {
intent.setClassName(mSelectedExtension.pname, mSelectedExtension.settings);
}
settings.setVisible(intent != null && mPackageManager.queryIntentActivities(intent, 0).size() == 1);
mPopupMenu.setOnMenuItemClickListener(this);
mPopupMenu.show();
return true;
}
@Override
public void onLoaderReset(final Loader<List<ExtensionInfo>> loader) {
mAdapter.setData(null);
}
@Override
public void onLoaderReset(final Loader<List<ExtensionInfo>> loader) {
mAdapter.setData(null);
}
@Override
public void onLoadFinished(final Loader<List<ExtensionInfo>> loader, final List<ExtensionInfo> data) {
mAdapter.setData(data);
setListShown(true);
}
@Override
public void onLoadFinished(final Loader<List<ExtensionInfo>> loader, final List<ExtensionInfo> data) {
mAdapter.setData(data);
setListShown(true);
}
@Override
public boolean onMenuItemClick(final MenuItem item) {
if (mSelectedExtension == null) return false;
switch (item.getItemId()) {
case MENU_SETTINGS: {
openSettings(mSelectedExtension);
break;
}
case MENU_DELETE: {
final Uri packageUri = Uri.parse("package:" + mSelectedExtension.pname);
final Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageUri);
startActivity(uninstallIntent);
break;
}
case MENU_REVOKE: {
mPermissionsManager.revoke(mSelectedExtension.pname);
mAdapter.notifyDataSetChanged();
break;
}
}
return false;
}
@Override
public boolean onMenuItemClick(final MenuItem item) {
if (mSelectedExtension == null) return false;
switch (item.getItemId()) {
case MENU_SETTINGS: {
openSettings(mSelectedExtension);
break;
}
case MENU_DELETE: {
final Uri packageUri = Uri.parse("package:" + mSelectedExtension.pname);
final Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageUri);
startActivity(uninstallIntent);
break;
}
case MENU_REVOKE: {
mPermissionsManager.revoke(mSelectedExtension.pname);
mAdapter.notifyDataSetChanged();
break;
}
}
return false;
}
@Override
public void onResume() {
super.onResume();
mAdapter.notifyDataSetChanged();
}
@Override
public void onResume() {
super.onResume();
mAdapter.notifyDataSetChanged();
}
@Override
public void onStop() {
if (mPopupMenu != null) {
mPopupMenu.dismiss();
}
super.onStop();
}
@Override
public void onStop() {
if (mPopupMenu != null) {
mPopupMenu.dismiss();
}
super.onStop();
}
private boolean openSettings(final ExtensionInfo info) {
if (info == null || info.settings == null) return false;
final Intent intent = new Intent(INTENT_ACTION_EXTENSIONS);
intent.setClassName(info.pname, info.settings);
try {
startActivity(intent);
} catch (final Exception e) {
Log.w(LOGTAG, e);
return false;
}
return true;
}
private boolean openSettings(final ExtensionInfo info) {
if (info == null || info.settings == null) return false;
final Intent intent = new Intent(INTENT_ACTION_EXTENSIONS);
intent.setClassName(info.pname, info.settings);
try {
startActivity(intent);
} catch (final Exception e) {
Log.w(LOGTAG, e);
return false;
}
return true;
}
}

View File

@ -31,7 +31,6 @@ import android.database.Cursor;
import android.graphics.PorterDuff.Mode;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
@ -43,18 +42,18 @@ import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Switch;
import android.widget.TextView;
import com.commonsware.cwac.merge.MergeAdapter;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.FiltersActivity;
import org.mariotaku.twidere.activity.SettingsActivity;
@ -66,11 +65,11 @@ import org.mariotaku.twidere.activity.support.UserProfileEditorActivity;
import org.mariotaku.twidere.adapter.ArrayAdapter;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.model.Account;
import org.mariotaku.twidere.model.Account.Indices;
import org.mariotaku.twidere.provider.TweetStore.Accounts;
import org.mariotaku.twidere.util.ImageLoaderWrapper;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.content.SupportFragmentReloadCursorObserver;
import org.mariotaku.twidere.view.iface.IColorLabelView;
import java.util.ArrayList;
@ -81,7 +80,7 @@ import static org.mariotaku.twidere.util.Utils.openUserProfile;
import static org.mariotaku.twidere.util.Utils.openUserTimeline;
public class AccountsDashboardFragment extends BaseSupportListFragment implements LoaderCallbacks<Cursor>,
OnSharedPreferenceChangeListener, OnAccountActivateStateChangeListener {
OnSharedPreferenceChangeListener, OnCheckedChangeListener {
private final SupportFragmentReloadCursorObserver mReloadContentObserver = new SupportFragmentReloadCursorObserver(
this, 0, this);
@ -90,7 +89,7 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
private SharedPreferences mPreferences;
private MergeAdapter mAdapter;
private DrawerAccountsAdapter mAccountsAdapter;
private AccountSelectorAdapter mAccountsAdapter;
private AccountOptionsAdapter mAccountOptionsAdapter;
private AppMenuAdapter mAppMenuAdapter;
@ -99,17 +98,11 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
private RecyclerView mAccountsSelector;
private ImageView mAccountProfileBannerView, mAccountProfileImageView;
private TextView mAccountProfileNameView, mAccountProfileScreenNameView;
private Switch mAccountsToggle;
private Context mThemedContext;
private ImageLoaderWrapper mImageLoader;
@Override
public void onAccountActivateStateChanged(final Account account, final boolean activated) {
final ContentValues values = new ContentValues();
values.put(Accounts.IS_ACTIVATED, activated);
final String where = Accounts.ACCOUNT_ID + " = " + account.account_id;
mResolver.update(Accounts.CONTENT_URI, values, where, null);
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
@ -121,21 +114,23 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
final LayoutInflater inflater = LayoutInflater.from(context);
final ListView listView = getListView();
mAdapter = new MergeAdapter();
mAccountsAdapter = new DrawerAccountsAdapter(context);
mAccountsAdapter = new AccountSelectorAdapter(context, this);
mAccountOptionsAdapter = new AccountOptionsAdapter(context);
mAppMenuAdapter = new AppMenuAdapter(context);
mAppMenuSectionView = newSectionView(context, R.string.more);
mAccountSelectorView = inflater.inflate(R.layout.header_drawer_account_selector, listView, false);
mAccountsSelector = (RecyclerView) mAccountSelectorView.findViewById(R.id.account_selector);
mAccountsSelector.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
// mAccountsSelector.setAdapter(mAccountsAdapter);
final LinearLayoutManager layoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
layoutManager.setStackFromEnd(true);
mAccountsSelector.setLayoutManager(layoutManager);
mAccountsSelector.setAdapter(mAccountsAdapter);
mAccountProfileImageView = (ImageView) mAccountSelectorView.findViewById(R.id.profile_image);
mAccountProfileBannerView = (ImageView) mAccountSelectorView.findViewById(R.id.profile_banner);
mAccountProfileNameView = (TextView) mAccountSelectorView.findViewById(R.id.name);
mAccountProfileScreenNameView = (TextView) mAccountSelectorView.findViewById(R.id.screen_name);
mAccountsAdapter.setOnAccountActivateStateChangeListener(this);
mAccountsToggle = (Switch) mAccountSelectorView.findViewById(R.id.toggle);
mAccountsToggle.setOnCheckedChangeListener(this);
mAdapter.addView(mAccountSelectorView, false);
mAdapter.addAdapter(mAccountsAdapter);
mAdapter.addAdapter(mAccountOptionsAdapter);
mAdapter.addView(mAppMenuSectionView, false);
mAdapter.addAdapter(mAppMenuAdapter);
@ -178,13 +173,7 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
public void onListItemClick(final ListView l, final View v, final int position, final long id) {
final ListAdapter adapter = mAdapter.getAdapter(position);
final Object item = mAdapter.getItem(position);
if (adapter instanceof DrawerAccountsAdapter) {
if (!(item instanceof Account)) return;
final Account account = (Account) item;
mAccountsAdapter.setSelectedAccountId(account.account_id);
updateAccountOptionsSeparatorLabel();
updateDefaultAccountState();
} else if (adapter instanceof AccountOptionsAdapter) {
if (adapter instanceof AccountOptionsAdapter) {
final Account account = mAccountsAdapter.getSelectedAccount();
if (account == null || !(item instanceof OptionItem)) return;
final OptionItem option = (OptionItem) item;
@ -269,6 +258,8 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
@Override
public void onLoaderReset(final Loader<Cursor> loader) {
//TODO
// mAccountsAdapter.changeCursor(null);
mAccountsAdapter.changeCursor(null);
}
@ -278,6 +269,8 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
data.moveToFirst();
mAccountsAdapter.setSelectedAccountId(data.getLong(data.getColumnIndex(Accounts.ACCOUNT_ID)));
}
//TODO
// mAccountsAdapter.changeCursor(data);
mAccountsAdapter.changeCursor(data);
updateAccountOptionsSeparatorLabel();
updateDefaultAccountState();
@ -286,14 +279,12 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
@Override
public void onResume() {
super.onResume();
mAccountsAdapter.setDefaultAccountId(mPreferences.getLong(KEY_DEFAULT_ACCOUNT_ID, -1));
updateDefaultAccountState();
}
@Override
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) {
if (KEY_DEFAULT_ACCOUNT_ID.equals(key)) {
mAccountsAdapter.setDefaultAccountId(mPreferences.getLong(KEY_DEFAULT_ACCOUNT_ID, -1));
updateDefaultAccountState();
}
}
@ -334,6 +325,7 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
}
mAccountProfileNameView.setText(account.name);
mAccountProfileScreenNameView.setText("@" + account.screen_name);
mAccountsToggle.setChecked(account.is_activated);
mImageLoader.displayProfileImage(mAccountProfileImageView, account.profile_image_url);
final int bannerWidth = mAccountProfileBannerView.getWidth();
final Resources res = getResources();
@ -343,8 +335,6 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
}
private void updateDefaultAccountState() {
final long defaultAccountId = mAccountsAdapter.getDefaultAccountId();
final long selectedAccountId = mAccountsAdapter.getSelectedAccountId();
}
private static TextView newSectionView(final Context context, final int titleRes) {
@ -355,19 +345,27 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
return textView;
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
final Account account = mAccountsAdapter.getSelectedAccount();
if (account == null) return;
final ContentValues values = new ContentValues();
values.put(Accounts.IS_ACTIVATED, isChecked);
final String where = Accounts.ACCOUNT_ID + " = " + account.account_id;
mResolver.update(Accounts.CONTENT_URI, values, where, null);
}
private static final class AccountOptionsAdapter extends OptionItemsAdapter {
private static final ArrayList<OptionItem> sOptions = new ArrayList<>();
static {
sOptions.add(new OptionItem(R.string.view_user_profile, R.drawable.ic_action_profile, MENU_VIEW_PROFILE));
sOptions.add(new OptionItem(R.string.profile, R.drawable.ic_action_profile, MENU_VIEW_PROFILE));
sOptions.add(new OptionItem(android.R.string.search_go, R.drawable.ic_action_search, MENU_SEARCH));
sOptions.add(new OptionItem(R.string.statuses, R.drawable.ic_action_quote, MENU_STATUSES));
sOptions.add(new OptionItem(R.string.favorites, R.drawable.ic_action_star, MENU_FAVORITES));
sOptions.add(new OptionItem(R.string.users_lists, R.drawable.ic_action_list, MENU_LISTS));
sOptions.add(new OptionItem(R.string.lists_following_me, R.drawable.ic_action_list,
MENU_LIST_MEMBERSHIPS));
sOptions.add(new OptionItem(R.string.lists, R.drawable.ic_action_list, MENU_LISTS));
}
public AccountOptionsAdapter(final Context context) {
@ -390,64 +388,83 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
}
private static class DrawerAccountsAdapter extends SimpleCursorAdapter implements Constants,
OnCheckedChangeListener {
static class AccountProfileImageViewHolder extends ViewHolder implements OnClickListener {
private final AccountSelectorAdapter adapter;
private final ImageView icon;
public AccountProfileImageViewHolder(AccountSelectorAdapter adapter, View itemView) {
super(itemView);
this.adapter = adapter;
itemView.setOnClickListener(this);
icon = (ImageView) itemView.findViewById(android.R.id.icon);
}
@Override
public void onClick(View v) {
adapter.dispatchItemSelected(getPosition());
}
}
private static class AccountSelectorAdapter extends Adapter<AccountProfileImageViewHolder> {
private final LayoutInflater mInflater;
private final ImageLoaderWrapper mImageLoader;
private final int mActivatedColor;
private final AccountsDashboardFragment mFragment;
private Cursor mCursor;
private Indices mIndices;
private long mSelectedAccountId;
private Account.Indices mIndices;
private long mSelectedAccountId, mDefaultAccountId;
private OnAccountActivateStateChangeListener mOnAccountActivateStateChangeListener;
public DrawerAccountsAdapter(final Context context) {
super(context, R.layout.list_item_drawer_account, null, new String[0], new int[0], 0);
final TwidereApplication app = TwidereApplication.getInstance(context);
mImageLoader = app.getImageLoaderWrapper();
mActivatedColor = ThemeUtils.getUserAccentColor(context);
AccountSelectorAdapter(Context context, AccountsDashboardFragment fragment) {
mInflater = LayoutInflater.from(context);
mImageLoader = TwidereApplication.getInstance(context).getImageLoaderWrapper();
mFragment = fragment;
}
@Override
public void bindView(@NonNull final View view, final Context context, @NonNull final Cursor cursor) {
super.bindView(view, context, cursor);
final CompoundButton toggle = (CompoundButton) view.findViewById(R.id.toggle);
final TextView name = (TextView) view.findViewById(R.id.name);
final TextView screenNameView = (TextView) view.findViewById(R.id.screen_name);
final TextView defaultIndicatorView = (TextView) view.findViewById(R.id.default_indicator);
final ImageView profileImageView = (ImageView) view.findViewById(R.id.profile_image);
final Account account = new Account(cursor, mIndices);
name.setText(account.name);
screenNameView.setText(String.format("@%s", account.screen_name));
defaultIndicatorView.setVisibility(account.account_id == mDefaultAccountId ? View.VISIBLE : View.GONE);
mImageLoader.displayProfileImage(profileImageView, account.profile_image_url);
toggle.setChecked(account.is_activated);
toggle.setTag(account);
toggle.setOnCheckedChangeListener(this);
view.setActivated(account.account_id == mSelectedAccountId);
final IColorLabelView colorLabelView = (IColorLabelView) view;
colorLabelView.drawStart(account.account_id == mSelectedAccountId ? mActivatedColor : 0);
colorLabelView.drawEnd(account.color);
}
public long getDefaultAccountId() {
return mDefaultAccountId;
public AccountProfileImageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View view = mInflater.inflate(R.layout.adapter_item_compose_account, parent, false);
return new AccountProfileImageViewHolder(this, view);
}
@Override
public Account getItem(final int position) {
final Cursor c = getCursor();
if (c == null || c.isClosed() || !c.moveToPosition(position)) return null;
return new Account(c, mIndices);
public void onBindViewHolder(AccountProfileImageViewHolder holder, int position) {
final Cursor c = mCursor;
c.moveToPosition(position);
if (c.getLong(mIndices.account_id) == mSelectedAccountId) {
c.moveToNext();
}
mImageLoader.displayProfileImage(holder.icon, c.getString(mIndices.profile_image_url));
}
@Override
public int getItemCount() {
if (mCursor == null) return 0;
return Math.max(mCursor.getCount() - 1, 0);
}
public void changeCursor(Cursor cursor) {
mCursor = cursor;
if (cursor != null) {
mIndices = new Indices(cursor);
}
notifyDataSetChanged();
}
public void setSelectedAccountId(long accountId) {
mSelectedAccountId = accountId;
notifyDataSetChanged();
}
public Account getSelectedAccount() {
final Cursor c = getCursor();
if (c == null || c.isClosed() || !c.moveToFirst() || mIndices == null) return null;
while (!c.isAfterLast()) {
if (mSelectedAccountId == c.getLong(mIndices.account_id))
return new Account(c, mIndices);
c.moveToNext();
final Cursor c = mCursor;
final Indices i = mIndices;
if (c != null && i != null && c.moveToFirst()) {
while (!c.isAfterLast()) {
if (c.getLong(mIndices.account_id) == mSelectedAccountId)
return new Account(c, mIndices);
c.moveToNext();
}
}
return null;
}
@ -456,70 +473,18 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
return mSelectedAccountId;
}
@Override
public boolean isEnabled(final int position) {
final Cursor c = getCursor();
if (c == null || c.isClosed() || !c.moveToPosition(position)) return false;
return c.getLong(mIndices.account_id) != mSelectedAccountId;
}
@Override
public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) {
final Account account = (Account) buttonView.getTag();
if (mOnAccountActivateStateChangeListener != null) {
mOnAccountActivateStateChangeListener.onAccountActivateStateChanged(account, isChecked);
private void dispatchItemSelected(int position) {
final Cursor c = mCursor;
c.moveToPosition(position);
if (c.getLong(mIndices.account_id) != mSelectedAccountId || c.moveToNext()) {
mFragment.onAccountSelected(new Account(c, mIndices));
}
}
public void setDefaultAccountId(final long account_id) {
if (mDefaultAccountId == account_id) return;
mDefaultAccountId = account_id;
notifyDataSetChanged();
}
public void setOnAccountActivateStateChangeListener(final OnAccountActivateStateChangeListener listener) {
mOnAccountActivateStateChangeListener = listener;
}
public void setSelectedAccountId(final long account_id) {
if (mSelectedAccountId == account_id) return;
mSelectedAccountId = account_id;
notifyDataSetChanged();
}
@Override
public Cursor swapCursor(final Cursor c) {
final Cursor old = super.swapCursor(c);
mIndices = c != null ? new Account.Indices(c) : null;
return old;
}
}
static class AccountProfileImageViewHolder extends ViewHolder {
public AccountProfileImageViewHolder(View itemView) {
super(itemView);
}
}
private static class DrawerAccountsAdapter2 extends Adapter<AccountProfileImageViewHolder> {
@Override
public AccountProfileImageViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
return null;
}
@Override
public void onBindViewHolder(AccountProfileImageViewHolder accountProfileImageViewHolder, int i) {
}
@Override
public int getItemCount() {
return 0;
}
private void onAccountSelected(Account account) {
mAccountsAdapter.setSelectedAccountId(account.account_id);
updateAccountOptionsSeparatorLabel();
}
private static class OptionItem {
@ -583,8 +548,4 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
}
}
}
interface OnAccountActivateStateChangeListener {
void onAccountActivateStateChanged(Account account, boolean activated);
}
}

View File

@ -42,7 +42,6 @@ import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter.MenuButtonClickListe
import org.mariotaku.twidere.adapter.iface.IStatusesListAdapter;
import org.mariotaku.twidere.model.Account;
import org.mariotaku.twidere.model.Account.AccountWithCredentials;
import org.mariotaku.twidere.model.Panes;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.task.AsyncTask;
import org.mariotaku.twidere.util.AsyncTaskManager;
@ -71,8 +70,7 @@ import static org.mariotaku.twidere.util.Utils.showOkMessage;
import static org.mariotaku.twidere.util.Utils.startStatusShareChooser;
abstract class BaseStatusesListFragment<Data> extends BasePullToRefreshListFragment implements LoaderCallbacks<Data>,
OnItemLongClickListener, OnMenuItemClickListener, Panes.Left, MultiSelectManager.Callback,
MenuButtonClickListener {
OnItemLongClickListener, OnMenuItemClickListener, MultiSelectManager.Callback, MenuButtonClickListener {
private AsyncTaskManager mAsyncTaskManager;
private SharedPreferences mPreferences;

View File

@ -19,15 +19,6 @@
package org.mariotaku.twidere.fragment.support;
import static org.mariotaku.twidere.util.Utils.cancelRetweet;
import static org.mariotaku.twidere.util.Utils.clearListViewChoices;
import static org.mariotaku.twidere.util.Utils.configBaseCardAdapter;
import static org.mariotaku.twidere.util.Utils.isMyRetweet;
import static org.mariotaku.twidere.util.Utils.openStatus;
import static org.mariotaku.twidere.util.Utils.setMenuForStatus;
import static org.mariotaku.twidere.util.Utils.showOkMessage;
import static org.mariotaku.twidere.util.Utils.startStatusShareChooser;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
@ -51,7 +42,6 @@ import org.mariotaku.menucomponent.widget.PopupMenu;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter.MenuButtonClickListener;
import org.mariotaku.twidere.adapter.iface.IStatusesListAdapter;
import org.mariotaku.twidere.model.Panes;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.task.AsyncTask;
import org.mariotaku.twidere.util.AsyncTaskManager;
@ -71,508 +61,518 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.mariotaku.twidere.util.Utils.cancelRetweet;
import static org.mariotaku.twidere.util.Utils.clearListViewChoices;
import static org.mariotaku.twidere.util.Utils.configBaseCardAdapter;
import static org.mariotaku.twidere.util.Utils.isMyRetweet;
import static org.mariotaku.twidere.util.Utils.openStatus;
import static org.mariotaku.twidere.util.Utils.setMenuForStatus;
import static org.mariotaku.twidere.util.Utils.showOkMessage;
import static org.mariotaku.twidere.util.Utils.startStatusShareChooser;
abstract class BaseStatusesStaggeredGridFragment<Data> extends BasePullToRefreshStaggeredGridFragment implements
LoaderCallbacks<Data>, OnItemLongClickListener, OnMenuItemClickListener, Panes.Left,
MultiSelectManager.Callback, MenuButtonClickListener {
LoaderCallbacks<Data>, OnItemLongClickListener, OnMenuItemClickListener,
MultiSelectManager.Callback, MenuButtonClickListener {
private AsyncTaskManager mAsyncTaskManager;
private SharedPreferences mPreferences;
private AsyncTaskManager mAsyncTaskManager;
private SharedPreferences mPreferences;
private StaggeredGridView mListView;
private IStatusesListAdapter<Data> mAdapter;
private PopupMenu mPopupMenu;
private StaggeredGridView mListView;
private IStatusesListAdapter<Data> mAdapter;
private PopupMenu mPopupMenu;
private Data mData;
private ParcelableStatus mSelectedStatus;
private Data mData;
private ParcelableStatus mSelectedStatus;
private boolean mLoadMoreAutomatically;
private int mListScrollOffset;
private boolean mLoadMoreAutomatically;
private int mListScrollOffset;
private MultiSelectManager mMultiSelectManager;
private PositionManager mPositionManager;
private MultiSelectManager mMultiSelectManager;
private PositionManager mPositionManager;
private int mFirstVisibleItem;
private int mSelectedPosition;
private int mFirstVisibleItem;
private int mSelectedPosition;
private final Map<Long, Set<Long>> mUnreadCountsToRemove = Collections
.synchronizedMap(new HashMap<Long, Set<Long>>());
private final List<Integer> mReadPositions = new NoDuplicatesCopyOnWriteArrayList<Integer>();
private final Map<Long, Set<Long>> mUnreadCountsToRemove = Collections
.synchronizedMap(new HashMap<Long, Set<Long>>());
private final List<Integer> mReadPositions = new NoDuplicatesCopyOnWriteArrayList<Integer>();
private RemoveUnreadCountsTask<Data> mRemoveUnreadCountsTask;
private RemoveUnreadCountsTask<Data> mRemoveUnreadCountsTask;
public AsyncTaskManager getAsyncTaskManager() {
return mAsyncTaskManager;
}
public AsyncTaskManager getAsyncTaskManager() {
return mAsyncTaskManager;
}
public final Data getData() {
return mData;
}
public final Data getData() {
return mData;
}
@Override
public IStatusesListAdapter<Data> getListAdapter() {
return mAdapter;
}
@Override
public IStatusesListAdapter<Data> getListAdapter() {
return mAdapter;
}
public ParcelableStatus getSelectedStatus() {
return mSelectedStatus;
}
public ParcelableStatus getSelectedStatus() {
return mSelectedStatus;
}
public SharedPreferences getSharedPreferences() {
return mPreferences;
}
public SharedPreferences getSharedPreferences() {
return mPreferences;
}
public abstract int getStatuses(long[] account_ids, long[] max_ids, long[] since_ids);
public abstract int getStatuses(long[] account_ids, long[] max_ids, long[] since_ids);
public final Map<Long, Set<Long>> getUnreadCountsToRemove() {
return mUnreadCountsToRemove;
}
public final Map<Long, Set<Long>> getUnreadCountsToRemove() {
return mUnreadCountsToRemove;
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAsyncTaskManager = getAsyncTaskManager();
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
mPositionManager = new PositionManager(getActivity());
mMultiSelectManager = getMultiSelectManager();
mListView = getListView();
mAdapter = newAdapterInstance();
mAdapter.setMenuButtonClickListener(this);
setListAdapter(null);
setListHeaderFooters(mListView);
setListAdapter(mAdapter);
mListView.setSelector(android.R.color.transparent);
mListView.setOnItemLongClickListener(this);
setListShown(false);
getLoaderManager().initLoader(0, getArguments(), this);
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAsyncTaskManager = getAsyncTaskManager();
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
mPositionManager = new PositionManager(getActivity());
mMultiSelectManager = getMultiSelectManager();
mListView = getListView();
mAdapter = newAdapterInstance();
mAdapter.setMenuButtonClickListener(this);
setListAdapter(null);
setListHeaderFooters(mListView);
setListAdapter(mAdapter);
mListView.setSelector(android.R.color.transparent);
mListView.setOnItemLongClickListener(this);
setListShown(false);
getLoaderManager().initLoader(0, getArguments(), this);
}
@Override
public abstract Loader<Data> onCreateLoader(int id, Bundle args);
@Override
public abstract Loader<Data> onCreateLoader(int id, Bundle args);
@Override
public boolean onItemLongClick(final AdapterView<?> parent, final View view, final int position, final long id) {
final Object tag = view.getTag();
if (tag instanceof StatusListViewHolder) {
final StatusListViewHolder holder = (StatusListViewHolder) tag;
final ParcelableStatus status = mAdapter.getStatus(position - mListView.getHeaderViewsCount());
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (twitter != null) {
TwitterWrapper.removeUnreadCounts(getActivity(), getTabPosition(), status.account_id, status.id);
}
if (holder.show_as_gap) return false;
if (mPreferences.getBoolean(KEY_LONG_CLICK_TO_OPEN_MENU, false)) {
openMenu(holder.content.getFakeOverflowButton(), status, position);
} else {
setItemSelected(status, position, !mMultiSelectManager.isSelected(status));
}
return true;
}
return false;
}
@Override
public boolean onItemLongClick(final AdapterView<?> parent, final View view, final int position, final long id) {
final Object tag = view.getTag();
if (tag instanceof StatusListViewHolder) {
final StatusListViewHolder holder = (StatusListViewHolder) tag;
final ParcelableStatus status = mAdapter.getStatus(position - mListView.getHeaderViewsCount());
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (twitter != null) {
TwitterWrapper.removeUnreadCounts(getActivity(), getTabPosition(), status.account_id, status.id);
}
if (holder.show_as_gap) return false;
if (mPreferences.getBoolean(KEY_LONG_CLICK_TO_OPEN_MENU, false)) {
openMenu(holder.content.getFakeOverflowButton(), status, position);
} else {
setItemSelected(status, position, !mMultiSelectManager.isSelected(status));
}
return true;
}
return false;
}
@Override
public void onItemsCleared() {
clearListViewChoices(mListView);
}
@Override
public void onItemsCleared() {
clearListViewChoices(mListView);
}
@Override
public void onItemSelected(final Object item) {
mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
@Override
public void onItemSelected(final Object item) {
mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
@Override
public void onItemUnselected(final Object item) {
}
@Override
public void onItemUnselected(final Object item) {
}
@Override
public void onListItemClick(final StaggeredGridView l, final View v, final int position, final long id) {
final Object tag = v.getTag();
if (tag instanceof StatusListViewHolder) {
final int pos = position - l.getHeaderViewsCount();
final ParcelableStatus status = mAdapter.getStatus(pos);
if (status == null) return;
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (twitter != null) {
TwitterWrapper.removeUnreadCounts(getActivity(), getTabPosition(), status.account_id, status.id);
}
if (((StatusListViewHolder) tag).show_as_gap) {
final long since_id = position + 1 < mAdapter.getStatusCount() ? mAdapter.getStatus(pos + 1).id : -1;
getStatuses(new long[] { status.account_id }, new long[] { status.id }, new long[] { since_id });
mListView.setItemChecked(position, false);
} else {
if (mMultiSelectManager.isActive()) {
setItemSelected(status, position, !mMultiSelectManager.isSelected(status));
return;
}
openStatus(getActivity(), status);
}
}
}
@Override
public void onListItemClick(final StaggeredGridView l, final View v, final int position, final long id) {
final Object tag = v.getTag();
if (tag instanceof StatusListViewHolder) {
final int pos = position - l.getHeaderViewsCount();
final ParcelableStatus status = mAdapter.getStatus(pos);
if (status == null) return;
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (twitter != null) {
TwitterWrapper.removeUnreadCounts(getActivity(), getTabPosition(), status.account_id, status.id);
}
if (((StatusListViewHolder) tag).show_as_gap) {
final long since_id = position + 1 < mAdapter.getStatusCount() ? mAdapter.getStatus(pos + 1).id : -1;
getStatuses(new long[]{status.account_id}, new long[]{status.id}, new long[]{since_id});
mListView.setItemChecked(position, false);
} else {
if (mMultiSelectManager.isActive()) {
setItemSelected(status, position, !mMultiSelectManager.isSelected(status));
return;
}
openStatus(getActivity(), status);
}
}
}
@Override
public final void onLoaderReset(final Loader<Data> loader) {
mAdapter.setData(mData = null);
}
@Override
public final void onLoaderReset(final Loader<Data> loader) {
mAdapter.setData(mData = null);
}
@Override
public final void onLoadFinished(final Loader<Data> loader, final Data data) {
if (getActivity() == null || getView() == null) return;
setListShown(true);
setRefreshComplete();
setProgressBarIndeterminateVisibility(false);
setData(data);
mFirstVisibleItem = -1;
mReadPositions.clear();
final int listVisiblePosition, savedChildIndex;
final boolean rememberPosition = mPreferences.getBoolean(KEY_REMEMBER_POSITION, true);
if (rememberPosition) {
listVisiblePosition = mListView.getLastVisiblePosition();
final int childCount = mListView.getChildCount();
savedChildIndex = childCount - 1;
if (childCount > 0) {
final View lastChild = mListView.getChildAt(savedChildIndex);
mListScrollOffset = lastChild != null ? lastChild.getTop() : 0;
}
} else {
listVisiblePosition = mListView.getFirstVisiblePosition();
savedChildIndex = 0;
if (mListView.getChildCount() > 0) {
final View firstChild = mListView.getChildAt(savedChildIndex);
mListScrollOffset = firstChild != null ? firstChild.getTop() : 0;
}
}
final long lastViewedId = mAdapter.getStatusId(listVisiblePosition);
mAdapter.setData(data);
mAdapter.setShowAccountColor(shouldShowAccountColor());
final int currFirstVisiblePosition = mListView.getFirstVisiblePosition();
final long currViewedId = mAdapter.getStatusId(currFirstVisiblePosition);
final long statusId;
if (lastViewedId <= 0) {
if (!rememberPosition) return;
statusId = mPositionManager.getPosition(getPositionKey());
} else if ((listVisiblePosition > 0 || rememberPosition) && currViewedId > 0 && lastViewedId != currViewedId) {
statusId = lastViewedId;
} else {
if (listVisiblePosition == 0 && mAdapter.getStatusId(0) != lastViewedId) {
mAdapter.setMaxAnimationPosition(mListView.getLastVisiblePosition());
}
return;
}
final int position = mAdapter.findPositionByStatusId(statusId);
if (position > -1 && position < mListView.getCount()) {
mAdapter.setMaxAnimationPosition(mListView.getLastVisiblePosition());
// mListView.setSelectionFromTop(position, mListScrollOffset);
mListView.setSelection(position);
mListScrollOffset = 0;
}
}
@Override
public final void onLoadFinished(final Loader<Data> loader, final Data data) {
if (getActivity() == null || getView() == null) return;
setListShown(true);
setRefreshComplete();
setProgressBarIndeterminateVisibility(false);
setData(data);
mFirstVisibleItem = -1;
mReadPositions.clear();
final int listVisiblePosition, savedChildIndex;
final boolean rememberPosition = mPreferences.getBoolean(KEY_REMEMBER_POSITION, true);
if (rememberPosition) {
listVisiblePosition = mListView.getLastVisiblePosition();
final int childCount = mListView.getChildCount();
savedChildIndex = childCount - 1;
if (childCount > 0) {
final View lastChild = mListView.getChildAt(savedChildIndex);
mListScrollOffset = lastChild != null ? lastChild.getTop() : 0;
}
} else {
listVisiblePosition = mListView.getFirstVisiblePosition();
savedChildIndex = 0;
if (mListView.getChildCount() > 0) {
final View firstChild = mListView.getChildAt(savedChildIndex);
mListScrollOffset = firstChild != null ? firstChild.getTop() : 0;
}
}
final long lastViewedId = mAdapter.getStatusId(listVisiblePosition);
mAdapter.setData(data);
mAdapter.setShowAccountColor(shouldShowAccountColor());
final int currFirstVisiblePosition = mListView.getFirstVisiblePosition();
final long currViewedId = mAdapter.getStatusId(currFirstVisiblePosition);
final long statusId;
if (lastViewedId <= 0) {
if (!rememberPosition) return;
statusId = mPositionManager.getPosition(getPositionKey());
} else if ((listVisiblePosition > 0 || rememberPosition) && currViewedId > 0 && lastViewedId != currViewedId) {
statusId = lastViewedId;
} else {
if (listVisiblePosition == 0 && mAdapter.getStatusId(0) != lastViewedId) {
mAdapter.setMaxAnimationPosition(mListView.getLastVisiblePosition());
}
return;
}
final int position = mAdapter.findPositionByStatusId(statusId);
if (position > -1 && position < mListView.getCount()) {
mAdapter.setMaxAnimationPosition(mListView.getLastVisiblePosition());
// mListView.setSelectionFromTop(position, mListScrollOffset);
mListView.setSelection(position);
mListScrollOffset = 0;
}
}
@Override
public void onMenuButtonClick(final View button, final int position, final long id) {
if (mMultiSelectManager.isActive()) return;
final ParcelableStatus status = mAdapter.getStatus(position);
if (status == null) return;
openMenu(button, status, position);
}
@Override
public void onMenuButtonClick(final View button, final int position, final long id) {
if (mMultiSelectManager.isActive()) return;
final ParcelableStatus status = mAdapter.getStatus(position);
if (status == null) return;
openMenu(button, status, position);
}
@Override
public final boolean onMenuItemClick(final MenuItem item) {
final ParcelableStatus status = mSelectedStatus;
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (status == null || twitter == null) return false;
switch (item.getItemId()) {
case MENU_VIEW: {
openStatus(getActivity(), status);
break;
}
case MENU_SHARE: {
startStatusShareChooser(getActivity(), status);
break;
}
case MENU_COPY: {
if (ClipboardUtils.setText(getActivity(), status.text_plain)) {
showOkMessage(getActivity(), R.string.text_copied, false);
}
break;
}
case MENU_RETWEET: {
if (isMyRetweet(status)) {
cancelRetweet(twitter, status);
} else {
final long id_to_retweet = status.retweet_id > 0 ? status.retweet_id : status.id;
twitter.retweetStatus(status.account_id, id_to_retweet);
}
break;
}
case MENU_QUOTE: {
final Intent intent = new Intent(INTENT_ACTION_QUOTE);
final Bundle bundle = new Bundle();
bundle.putParcelable(EXTRA_STATUS, status);
intent.putExtras(bundle);
startActivity(intent);
break;
}
case MENU_REPLY: {
final Intent intent = new Intent(INTENT_ACTION_REPLY);
final Bundle bundle = new Bundle();
bundle.putParcelable(EXTRA_STATUS, status);
intent.putExtras(bundle);
startActivity(intent);
break;
}
case MENU_FAVORITE: {
if (status.is_favorite) {
twitter.destroyFavoriteAsync(status.account_id, status.id);
} else {
twitter.createFavoriteAsync(status.account_id, status.id);
}
break;
}
case MENU_DELETE: {
twitter.destroyStatusAsync(status.account_id, status.id);
break;
}
case MENU_ADD_TO_FILTER: {
AddStatusFilterDialogFragment.show(getFragmentManager(), status);
break;
}
case MENU_MULTI_SELECT: {
final boolean isSelected = !mMultiSelectManager.isSelected(status);
setItemSelected(status, mSelectedPosition, isSelected);
break;
}
default: {
if (item.getIntent() != null) {
try {
startActivity(item.getIntent());
} catch (final ActivityNotFoundException e) {
Log.w(LOGTAG, e);
return false;
}
}
break;
}
}
return true;
}
@Override
public final boolean onMenuItemClick(final MenuItem item) {
final ParcelableStatus status = mSelectedStatus;
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (status == null || twitter == null) return false;
switch (item.getItemId()) {
case MENU_VIEW: {
openStatus(getActivity(), status);
break;
}
case MENU_SHARE: {
startStatusShareChooser(getActivity(), status);
break;
}
case MENU_COPY: {
if (ClipboardUtils.setText(getActivity(), status.text_plain)) {
showOkMessage(getActivity(), R.string.text_copied, false);
}
break;
}
case MENU_RETWEET: {
if (isMyRetweet(status)) {
cancelRetweet(twitter, status);
} else {
final long id_to_retweet = status.retweet_id > 0 ? status.retweet_id : status.id;
twitter.retweetStatus(status.account_id, id_to_retweet);
}
break;
}
case MENU_QUOTE: {
final Intent intent = new Intent(INTENT_ACTION_QUOTE);
final Bundle bundle = new Bundle();
bundle.putParcelable(EXTRA_STATUS, status);
intent.putExtras(bundle);
startActivity(intent);
break;
}
case MENU_REPLY: {
final Intent intent = new Intent(INTENT_ACTION_REPLY);
final Bundle bundle = new Bundle();
bundle.putParcelable(EXTRA_STATUS, status);
intent.putExtras(bundle);
startActivity(intent);
break;
}
case MENU_FAVORITE: {
if (status.is_favorite) {
twitter.destroyFavoriteAsync(status.account_id, status.id);
} else {
twitter.createFavoriteAsync(status.account_id, status.id);
}
break;
}
case MENU_DELETE: {
twitter.destroyStatusAsync(status.account_id, status.id);
break;
}
case MENU_ADD_TO_FILTER: {
AddStatusFilterDialogFragment.show(getFragmentManager(), status);
break;
}
case MENU_MULTI_SELECT: {
final boolean isSelected = !mMultiSelectManager.isSelected(status);
setItemSelected(status, mSelectedPosition, isSelected);
break;
}
default: {
if (item.getIntent() != null) {
try {
startActivity(item.getIntent());
} catch (final ActivityNotFoundException e) {
Log.w(LOGTAG, e);
return false;
}
}
break;
}
}
return true;
}
@Override
public void onRefreshFromEnd() {
if (mLoadMoreAutomatically) return;
loadMoreStatuses();
}
@Override
public void onRefreshFromEnd() {
if (mLoadMoreAutomatically) return;
loadMoreStatuses();
}
@Override
public void onResume() {
super.onResume();
mListView.setFastScrollEnabled(mPreferences.getBoolean(KEY_FAST_SCROLL_THUMB, false));
configBaseCardAdapter(getActivity(), mAdapter);
final boolean display_image_preview = mPreferences.getBoolean(KEY_DISPLAY_IMAGE_PREVIEW, false);
final boolean display_sensitive_contents = mPreferences.getBoolean(KEY_DISPLAY_SENSITIVE_CONTENTS, false);
final boolean indicate_my_status = mPreferences.getBoolean(KEY_INDICATE_MY_STATUS, true);
mAdapter.setDisplayImagePreview(display_image_preview);
mAdapter.setDisplaySensitiveContents(display_sensitive_contents);
mAdapter.setIndicateMyStatusDisabled(isMyTimeline() || !indicate_my_status);
mLoadMoreAutomatically = mPreferences.getBoolean(KEY_LOAD_MORE_AUTOMATICALLY, false);
}
@Override
public void onResume() {
super.onResume();
mListView.setFastScrollEnabled(mPreferences.getBoolean(KEY_FAST_SCROLL_THUMB, false));
configBaseCardAdapter(getActivity(), mAdapter);
final boolean display_image_preview = mPreferences.getBoolean(KEY_DISPLAY_IMAGE_PREVIEW, false);
final boolean display_sensitive_contents = mPreferences.getBoolean(KEY_DISPLAY_SENSITIVE_CONTENTS, false);
final boolean indicate_my_status = mPreferences.getBoolean(KEY_INDICATE_MY_STATUS, true);
mAdapter.setDisplayImagePreview(display_image_preview);
mAdapter.setDisplaySensitiveContents(display_sensitive_contents);
mAdapter.setIndicateMyStatusDisabled(isMyTimeline() || !indicate_my_status);
mLoadMoreAutomatically = mPreferences.getBoolean(KEY_LOAD_MORE_AUTOMATICALLY, false);
}
@Override
public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount,
final int totalItemCount) {
super.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
addReadPosition(firstVisibleItem);
}
@Override
public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount,
final int totalItemCount) {
super.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
addReadPosition(firstVisibleItem);
}
@Override
public void onScrollStateChanged(final AbsListView view, final int scrollState) {
super.onScrollStateChanged(view, scrollState);
switch (scrollState) {
case SCROLL_STATE_IDLE:
for (int i = mListView.getFirstVisiblePosition(), j = mListView.getLastVisiblePosition(); i < j; i++) {
mReadPositions.add(i);
}
removeUnreadCounts();
break;
default:
break;
}
}
@Override
public void onScrollStateChanged(final AbsListView view, final int scrollState) {
super.onScrollStateChanged(view, scrollState);
switch (scrollState) {
case SCROLL_STATE_IDLE:
for (int i = mListView.getFirstVisiblePosition(), j = mListView.getLastVisiblePosition(); i < j; i++) {
mReadPositions.add(i);
}
removeUnreadCounts();
break;
default:
break;
}
}
@Override
public void onStart() {
super.onStart();
mMultiSelectManager.registerCallback(this);
final int choiceMode = mListView.getChoiceMode();
if (mMultiSelectManager.isActive()) {
if (choiceMode != ListView.CHOICE_MODE_MULTIPLE) {
mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
} else {
if (choiceMode != ListView.CHOICE_MODE_NONE) {
Utils.clearListViewChoices(mListView);
}
}
}
@Override
public void onStart() {
super.onStart();
mMultiSelectManager.registerCallback(this);
final int choiceMode = mListView.getChoiceMode();
if (mMultiSelectManager.isActive()) {
if (choiceMode != ListView.CHOICE_MODE_MULTIPLE) {
mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
} else {
if (choiceMode != ListView.CHOICE_MODE_NONE) {
Utils.clearListViewChoices(mListView);
}
}
}
@Override
public void onStop() {
savePosition();
mMultiSelectManager.unregisterCallback(this);
if (mPopupMenu != null) {
mPopupMenu.dismiss();
}
super.onStop();
}
@Override
public void onStop() {
savePosition();
mMultiSelectManager.unregisterCallback(this);
if (mPopupMenu != null) {
mPopupMenu.dismiss();
}
super.onStop();
}
@Override
public boolean scrollToStart() {
final AsyncTwitterWrapper twitter = getTwitterWrapper();
final int tab_position = getTabPosition();
if (twitter != null && tab_position >= 0) {
twitter.clearUnreadCountAsync(tab_position);
}
return super.scrollToStart();
}
@Override
public boolean scrollToStart() {
final AsyncTwitterWrapper twitter = getTwitterWrapper();
final int tab_position = getTabPosition();
if (twitter != null && tab_position >= 0) {
twitter.clearUnreadCountAsync(tab_position);
}
return super.scrollToStart();
}
@Override
public void setUserVisibleHint(final boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
updateRefreshState();
}
@Override
public void setUserVisibleHint(final boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
updateRefreshState();
}
protected final int getListScrollOffset() {
return mListScrollOffset;
}
protected final int getListScrollOffset() {
return mListScrollOffset;
}
protected abstract long[] getNewestStatusIds();
protected abstract long[] getNewestStatusIds();
protected abstract long[] getOldestStatusIds();
protected abstract long[] getOldestStatusIds();
protected abstract String getPositionKey();
protected abstract String getPositionKey();
protected boolean isMyTimeline() {
return false;
}
protected boolean isMyTimeline() {
return false;
}
protected abstract void loadMoreStatuses();
protected abstract void loadMoreStatuses();
protected abstract IStatusesListAdapter<Data> newAdapterInstance();
protected abstract IStatusesListAdapter<Data> newAdapterInstance();
@Override
protected void onReachedBottom() {
if (!mLoadMoreAutomatically) return;
loadMoreStatuses();
}
@Override
protected void onReachedBottom() {
if (!mLoadMoreAutomatically) return;
loadMoreStatuses();
}
protected void savePosition() {
final int first_visible_position = mListView.getFirstVisiblePosition();
if (mListView.getChildCount() > 0) {
final View first_child = mListView.getChildAt(0);
mListScrollOffset = first_child != null ? first_child.getTop() : 0;
}
final long status_id = mAdapter.getStatusId(first_visible_position);
mPositionManager.setPosition(getPositionKey(), status_id);
}
protected void savePosition() {
final int first_visible_position = mListView.getFirstVisiblePosition();
if (mListView.getChildCount() > 0) {
final View first_child = mListView.getChildAt(0);
mListScrollOffset = first_child != null ? first_child.getTop() : 0;
}
final long status_id = mAdapter.getStatusId(first_visible_position);
mPositionManager.setPosition(getPositionKey(), status_id);
}
protected final void setData(final Data data) {
mData = data;
}
protected final void setData(final Data data) {
mData = data;
}
protected void setItemSelected(final ParcelableStatus status, final int position, final boolean selected) {
if (selected) {
mMultiSelectManager.selectItem(status);
} else {
mMultiSelectManager.unselectItem(status);
}
if (position >= 0) {
mListView.setItemChecked(position, selected);
}
}
protected void setItemSelected(final ParcelableStatus status, final int position, final boolean selected) {
if (selected) {
mMultiSelectManager.selectItem(status);
} else {
mMultiSelectManager.unselectItem(status);
}
if (position >= 0) {
mListView.setItemChecked(position, selected);
}
}
protected void setListHeaderFooters(final StaggeredGridView list) {
protected void setListHeaderFooters(final StaggeredGridView list) {
}
}
protected boolean shouldEnablePullToRefresh() {
return true;
}
protected boolean shouldEnablePullToRefresh() {
return true;
}
protected abstract boolean shouldShowAccountColor();
protected abstract boolean shouldShowAccountColor();
protected abstract void updateRefreshState();
protected abstract void updateRefreshState();
private void addReadPosition(final int firstVisibleItem) {
if (mFirstVisibleItem != firstVisibleItem) {
mReadPositions.add(firstVisibleItem);
}
mFirstVisibleItem = firstVisibleItem;
}
private void addReadPosition(final int firstVisibleItem) {
if (mFirstVisibleItem != firstVisibleItem) {
mReadPositions.add(firstVisibleItem);
}
mFirstVisibleItem = firstVisibleItem;
}
private void addUnreadCountsToRemove(final long account_id, final long id) {
if (mUnreadCountsToRemove.containsKey(account_id)) {
final Set<Long> counts = mUnreadCountsToRemove.get(account_id);
counts.add(id);
} else {
final Set<Long> counts = new HashSet<Long>();
counts.add(id);
mUnreadCountsToRemove.put(account_id, counts);
}
}
private void addUnreadCountsToRemove(final long account_id, final long id) {
if (mUnreadCountsToRemove.containsKey(account_id)) {
final Set<Long> counts = mUnreadCountsToRemove.get(account_id);
counts.add(id);
} else {
final Set<Long> counts = new HashSet<Long>();
counts.add(id);
mUnreadCountsToRemove.put(account_id, counts);
}
}
private void openMenu(final View view, final ParcelableStatus status, final int position) {
mSelectedStatus = status;
mSelectedPosition = position;
if (view == null || status == null) return;
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (twitter != null) {
TwitterWrapper.removeUnreadCounts(getActivity(), getTabPosition(), status.account_id, status.id);
}
if (mPopupMenu != null && mPopupMenu.isShowing()) {
mPopupMenu.dismiss();
}
mPopupMenu = PopupMenu.getInstance(getActivity(), view);
mPopupMenu.inflate(R.menu.action_status);
final boolean longclickToOpenMenu = mPreferences.getBoolean(KEY_LONG_CLICK_TO_OPEN_MENU, false);
final Menu menu = mPopupMenu.getMenu();
setMenuForStatus(getActivity(), menu, status);
Utils.setMenuItemAvailability(menu, MENU_MULTI_SELECT, longclickToOpenMenu);
mPopupMenu.setOnMenuItemClickListener(this);
mPopupMenu.show();
}
private void openMenu(final View view, final ParcelableStatus status, final int position) {
mSelectedStatus = status;
mSelectedPosition = position;
if (view == null || status == null) return;
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (twitter != null) {
TwitterWrapper.removeUnreadCounts(getActivity(), getTabPosition(), status.account_id, status.id);
}
if (mPopupMenu != null && mPopupMenu.isShowing()) {
mPopupMenu.dismiss();
}
mPopupMenu = PopupMenu.getInstance(getActivity(), view);
mPopupMenu.inflate(R.menu.action_status);
final boolean longclickToOpenMenu = mPreferences.getBoolean(KEY_LONG_CLICK_TO_OPEN_MENU, false);
final Menu menu = mPopupMenu.getMenu();
setMenuForStatus(getActivity(), menu, status);
Utils.setMenuItemAvailability(menu, MENU_MULTI_SELECT, longclickToOpenMenu);
mPopupMenu.setOnMenuItemClickListener(this);
mPopupMenu.show();
}
private void removeUnreadCounts() {
if (mRemoveUnreadCountsTask != null && mRemoveUnreadCountsTask.getStatus() == AsyncTask.Status.RUNNING) return;
mRemoveUnreadCountsTask = new RemoveUnreadCountsTask<Data>(mReadPositions, this);
mRemoveUnreadCountsTask.execute();
}
private void removeUnreadCounts() {
if (mRemoveUnreadCountsTask != null && mRemoveUnreadCountsTask.getStatus() == AsyncTask.Status.RUNNING)
return;
mRemoveUnreadCountsTask = new RemoveUnreadCountsTask<Data>(mReadPositions, this);
mRemoveUnreadCountsTask.execute();
}
static class RemoveUnreadCountsTask<T> extends AsyncTask<Void, Void, Void> {
private final List<Integer> read_positions;
private final IStatusesListAdapter<T> adapter;
private final BaseStatusesStaggeredGridFragment<T> fragment;
static class RemoveUnreadCountsTask<T> extends AsyncTask<Void, Void, Void> {
private final List<Integer> read_positions;
private final IStatusesListAdapter<T> adapter;
private final BaseStatusesStaggeredGridFragment<T> fragment;
RemoveUnreadCountsTask(final List<Integer> read_positions, final BaseStatusesStaggeredGridFragment<T> fragment) {
this.read_positions = read_positions;
this.fragment = fragment;
this.adapter = fragment.getListAdapter();
}
RemoveUnreadCountsTask(final List<Integer> read_positions, final BaseStatusesStaggeredGridFragment<T> fragment) {
this.read_positions = read_positions;
this.fragment = fragment;
this.adapter = fragment.getListAdapter();
}
@Override
protected Void doInBackground(final Void... params) {
for (final int pos : read_positions) {
final long id = adapter.getStatusId(pos), account_id = adapter.getAccountId(pos);
fragment.addUnreadCountsToRemove(account_id, id);
}
return null;
}
@Override
protected Void doInBackground(final Void... params) {
for (final int pos : read_positions) {
final long id = adapter.getStatusId(pos), account_id = adapter.getAccountId(pos);
fragment.addUnreadCountsToRemove(account_id, id);
}
return null;
}
@Override
protected void onPostExecute(final Void result) {
final AsyncTwitterWrapper twitter = fragment.getTwitterWrapper();
if (twitter != null) {
twitter.removeUnreadCountsAsync(fragment.getTabPosition(), fragment.getUnreadCountsToRemove());
}
}
@Override
protected void onPostExecute(final Void result) {
final AsyncTwitterWrapper twitter = fragment.getTwitterWrapper();
if (twitter != null) {
twitter.removeUnreadCountsAsync(fragment.getTabPosition(), fragment.getUnreadCountsToRemove());
}
}
}
}
}

View File

@ -37,7 +37,6 @@ import org.mariotaku.refreshnow.widget.RefreshMode;
import org.mariotaku.twidere.adapter.ParcelableUserListsAdapter;
import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter.MenuButtonClickListener;
import org.mariotaku.twidere.loader.support.BaseUserListsLoader;
import org.mariotaku.twidere.model.Panes;
import org.mariotaku.twidere.model.ParcelableUserList;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.MultiSelectManager;
@ -49,7 +48,7 @@ import static org.mariotaku.twidere.util.Utils.configBaseCardAdapter;
import static org.mariotaku.twidere.util.Utils.openUserListDetails;
abstract class BaseUserListsListFragment extends BasePullToRefreshListFragment implements
LoaderCallbacks<List<ParcelableUserList>>, Panes.Left, OnMenuItemClickListener, MenuButtonClickListener {
LoaderCallbacks<List<ParcelableUserList>>, OnMenuItemClickListener, MenuButtonClickListener {
private ParcelableUserListsAdapter mAdapter;

View File

@ -37,7 +37,6 @@ import android.widget.ListView;
import org.mariotaku.twidere.adapter.ParcelableUsersAdapter;
import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter.MenuButtonClickListener;
import org.mariotaku.twidere.loader.support.DummyParcelableUsersLoader;
import org.mariotaku.twidere.model.Panes;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.util.MultiSelectManager;
import org.mariotaku.twidere.util.Utils;
@ -52,7 +51,7 @@ import static org.mariotaku.twidere.util.Utils.getActivatedAccountIds;
import static org.mariotaku.twidere.util.Utils.openUserProfile;
abstract class BaseUsersListFragment extends BasePullToRefreshListFragment implements
LoaderCallbacks<List<ParcelableUser>>, OnItemLongClickListener, Panes.Left, OnMenuItemClickListener,
LoaderCallbacks<List<ParcelableUser>>, OnItemLongClickListener, OnMenuItemClickListener,
MultiSelectManager.Callback, MenuButtonClickListener {
private SharedPreferences mPreferences;

View File

@ -65,7 +65,6 @@ import org.mariotaku.twidere.adapter.DirectMessagesConversationAdapter;
import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter.MenuButtonClickListener;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.model.Account;
import org.mariotaku.twidere.model.Panes;
import org.mariotaku.twidere.model.ParcelableDirectMessage;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.provider.TweetStore;
@ -95,7 +94,7 @@ import static org.mariotaku.twidere.util.Utils.getOldestMessageIdsFromDatabase;
import static org.mariotaku.twidere.util.Utils.showOkMessage;
public class DirectMessagesConversationFragment extends BasePullToRefreshListFragment implements
LoaderCallbacks<Cursor>, OnMenuItemClickListener, TextWatcher, OnClickListener, Panes.Right,
LoaderCallbacks<Cursor>, OnMenuItemClickListener, TextWatcher, OnClickListener,
OnItemSelectedListener, OnEditorActionListener, MenuButtonClickListener {
private TwidereValidator mValidator;

View File

@ -19,8 +19,6 @@
package org.mariotaku.twidere.fragment.support;
import static org.mariotaku.twidere.util.Utils.openTweetSearch;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
@ -35,134 +33,135 @@ import android.widget.ListView;
import android.widget.TextView;
import org.mariotaku.twidere.loader.support.SavedSearchesLoader;
import org.mariotaku.twidere.model.Panes;
import twitter4j.ResponseList;
import twitter4j.SavedSearch;
import java.util.Collections;
import java.util.Comparator;
import twitter4j.ResponseList;
import twitter4j.SavedSearch;
import static org.mariotaku.twidere.util.Utils.openTweetSearch;
public class SavedSearchesListFragment extends BasePullToRefreshListFragment implements
LoaderCallbacks<ResponseList<SavedSearch>>, OnItemLongClickListener, Panes.Left {
LoaderCallbacks<ResponseList<SavedSearch>>, OnItemLongClickListener {
private SavedSearchesAdapter mAdapter;
private SavedSearchesAdapter mAdapter;
private long mAccountId;
private ListView mListView;
private static final Comparator<SavedSearch> POSITION_COMPARATOR = new Comparator<SavedSearch>() {
private long mAccountId;
private ListView mListView;
private static final Comparator<SavedSearch> POSITION_COMPARATOR = new Comparator<SavedSearch>() {
@Override
public int compare(final SavedSearch object1, final SavedSearch object2) {
return object1.getPosition() - object2.getPosition();
}
@Override
public int compare(final SavedSearch object1, final SavedSearch object2) {
return object1.getPosition() - object2.getPosition();
}
};
};
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new SavedSearchesAdapter(getActivity());
setListAdapter(mAdapter);
mListView = getListView();
mListView.setOnItemLongClickListener(this);
final Bundle args = getArguments();
mAccountId = args != null ? args.getLong(EXTRA_ACCOUNT_ID, -1) : -1;
getLoaderManager().initLoader(0, null, this);
setListShown(false);
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new SavedSearchesAdapter(getActivity());
setListAdapter(mAdapter);
mListView = getListView();
mListView.setOnItemLongClickListener(this);
final Bundle args = getArguments();
mAccountId = args != null ? args.getLong(EXTRA_ACCOUNT_ID, -1) : -1;
getLoaderManager().initLoader(0, null, this);
setListShown(false);
}
@Override
public Loader<ResponseList<SavedSearch>> onCreateLoader(final int id, final Bundle args) {
return new SavedSearchesLoader(getActivity(), mAccountId);
}
@Override
public Loader<ResponseList<SavedSearch>> onCreateLoader(final int id, final Bundle args) {
return new SavedSearchesLoader(getActivity(), mAccountId);
}
@Override
public boolean onItemLongClick(final AdapterView<?> view, final View child, final int position, final long id) {
final SavedSearch item = mAdapter.findItem(id);
if (item == null) return false;
DestroySavedSearchDialogFragment.show(getFragmentManager(), mAccountId, item.getId(), item.getName());
return true;
}
@Override
public boolean onItemLongClick(final AdapterView<?> view, final View child, final int position, final long id) {
final SavedSearch item = mAdapter.findItem(id);
if (item == null) return false;
DestroySavedSearchDialogFragment.show(getFragmentManager(), mAccountId, item.getId(), item.getName());
return true;
}
@Override
public void onListItemClick(final ListView view, final View child, final int position, final long id) {
final SavedSearch item = mAdapter.findItem(id);
if (item == null) return;
openTweetSearch(getActivity(), mAccountId, item.getQuery());
}
@Override
public void onListItemClick(final ListView view, final View child, final int position, final long id) {
final SavedSearch item = mAdapter.findItem(id);
if (item == null) return;
openTweetSearch(getActivity(), mAccountId, item.getQuery());
}
@Override
public void onLoaderReset(final Loader<ResponseList<SavedSearch>> loader) {
mAdapter.setData(null);
}
@Override
public void onLoaderReset(final Loader<ResponseList<SavedSearch>> loader) {
mAdapter.setData(null);
}
@Override
public void onLoadFinished(final Loader<ResponseList<SavedSearch>> loader, final ResponseList<SavedSearch> data) {
if (data != null) {
Collections.sort(data, POSITION_COMPARATOR);
}
mAdapter.setData(data);
setListShown(true);
setRefreshComplete();
}
@Override
public void onLoadFinished(final Loader<ResponseList<SavedSearch>> loader, final ResponseList<SavedSearch> data) {
if (data != null) {
Collections.sort(data, POSITION_COMPARATOR);
}
mAdapter.setData(data);
setListShown(true);
setRefreshComplete();
}
@Override
public void onRefreshFromEnd() {
@Override
public void onRefreshFromEnd() {
}
}
@Override
public void onRefreshFromStart() {
if (isRefreshing()) return;
getLoaderManager().restartLoader(0, null, this);
}
@Override
public void onRefreshFromStart() {
if (isRefreshing()) return;
getLoaderManager().restartLoader(0, null, this);
}
static class SavedSearchesAdapter extends BaseAdapter {
static class SavedSearchesAdapter extends BaseAdapter {
private ResponseList<SavedSearch> mData;
private final LayoutInflater mInflater;
private ResponseList<SavedSearch> mData;
private final LayoutInflater mInflater;
public SavedSearchesAdapter(final Context context) {
mInflater = LayoutInflater.from(context);
}
public SavedSearchesAdapter(final Context context) {
mInflater = LayoutInflater.from(context);
}
public SavedSearch findItem(final long id) {
for (int i = 0, count = getCount(); i < count; i++) {
if (id != -1 && id == getItemId(i)) return getItem(i);
}
return null;
}
public SavedSearch findItem(final long id) {
for (int i = 0, count = getCount(); i < count; i++) {
if (id != -1 && id == getItemId(i)) return getItem(i);
}
return null;
}
@Override
public int getCount() {
return mData != null ? mData.size() : 0;
}
@Override
public int getCount() {
return mData != null ? mData.size() : 0;
}
@Override
public SavedSearch getItem(final int position) {
return mData != null ? mData.get(position) : null;
}
@Override
public SavedSearch getItem(final int position) {
return mData != null ? mData.get(position) : null;
}
@Override
public long getItemId(final int position) {
return mData != null ? mData.get(position).getId() : -1;
}
@Override
public long getItemId(final int position) {
return mData != null ? mData.get(position).getId() : -1;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = convertView != null ? convertView : mInflater.inflate(
android.R.layout.simple_list_item_1, null);
final TextView text = (TextView) view.findViewById(android.R.id.text1);
text.setText(getItem(position).getName());
return view;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = convertView != null ? convertView : mInflater.inflate(
android.R.layout.simple_list_item_1, null);
final TextView text = (TextView) view.findViewById(android.R.id.text1);
text.setText(getItem(position).getName());
return view;
}
public void setData(final ResponseList<SavedSearch> data) {
mData = data;
notifyDataSetChanged();
}
public void setData(final ResponseList<SavedSearch> data) {
mData = data;
notifyDataSetChanged();
}
}
}
}

View File

@ -37,14 +37,13 @@ import org.mariotaku.twidere.activity.support.LinkHandlerActivity;
import org.mariotaku.twidere.adapter.support.SupportTabsAdapter;
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;
import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback;
import org.mariotaku.twidere.model.Panes;
import org.mariotaku.twidere.provider.RecentSearchProvider;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.view.ExtendedViewPager;
import org.mariotaku.twidere.view.LinePageIndicator;
public class SearchFragment extends BaseSupportFragment implements Panes.Left, OnPageChangeListener,
public class SearchFragment extends BaseSupportFragment implements OnPageChangeListener,
RefreshScrollTopInterface, SupportFragmentCallback {
private ExtendedViewPager mViewPager;

View File

@ -76,7 +76,6 @@ import org.mariotaku.twidere.adapter.iface.IStatusesListAdapter;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.model.Account;
import org.mariotaku.twidere.model.Account.AccountWithCredentials;
import org.mariotaku.twidere.model.Panes;
import org.mariotaku.twidere.model.ParcelableLocation;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
@ -140,7 +139,7 @@ import static org.mariotaku.twidere.util.Utils.showErrorMessage;
import static org.mariotaku.twidere.util.Utils.showOkMessage;
import static org.mariotaku.twidere.util.Utils.startStatusShareChooser;
public class StatusFragment extends ParcelableStatusesListFragment implements OnClickListener, Panes.Right,
public class StatusFragment extends ParcelableStatusesListFragment implements OnClickListener,
OnMediaClickListener, OnSharedPreferenceChangeListener, ActionMode.Callback {
private static final int LOADER_ID_STATUS = 1;

View File

@ -19,10 +19,6 @@
package org.mariotaku.twidere.fragment.support;
import static org.mariotaku.twidere.util.Utils.getDefaultAccountId;
import static org.mariotaku.twidere.util.Utils.getTableNameByUri;
import static org.mariotaku.twidere.util.Utils.openTweetSearch;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@ -38,111 +34,113 @@ import android.support.v4.widget.SimpleCursorAdapter;
import android.view.View;
import android.widget.ListView;
import org.mariotaku.twidere.model.Panes;
import org.mariotaku.twidere.provider.TweetStore.CachedTrends;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.MultiSelectManager;
public class TrendsSuggectionsFragment extends BasePullToRefreshListFragment implements LoaderCallbacks<Cursor>,
Panes.Left {
import static org.mariotaku.twidere.util.Utils.getDefaultAccountId;
import static org.mariotaku.twidere.util.Utils.getTableNameByUri;
import static org.mariotaku.twidere.util.Utils.openTweetSearch;
private MultiSelectManager mMultiSelectManager;
private SharedPreferences mPreferences;
public class TrendsSuggectionsFragment extends BasePullToRefreshListFragment implements LoaderCallbacks<Cursor> {
private TrendsAdapter mTrendsAdapter;
private MultiSelectManager mMultiSelectManager;
private SharedPreferences mPreferences;
private long mAccountId;
private TrendsAdapter mTrendsAdapter;
private final BroadcastReceiver mStatusReceiver = new BroadcastReceiver() {
private long mAccountId;
@Override
public void onReceive(final Context context, final Intent intent) {
if (getActivity() == null || !isAdded() || isDetached()) return;
final String action = intent.getAction();
if (BROADCAST_TASK_STATE_CHANGED.equals(action)) {
updateRefreshState();
}
}
};
private final BroadcastReceiver mStatusReceiver = new BroadcastReceiver() {
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
super.onActivityCreated(savedInstanceState);
mMultiSelectManager = getMultiSelectManager();
mAccountId = getDefaultAccountId(getActivity());
mTrendsAdapter = new TrendsAdapter(getActivity());
setListAdapter(mTrendsAdapter);
getLoaderManager().initLoader(0, null, this);
}
@Override
public void onReceive(final Context context, final Intent intent) {
if (getActivity() == null || !isAdded() || isDetached()) return;
final String action = intent.getAction();
if (BROADCAST_TASK_STATE_CHANGED.equals(action)) {
updateRefreshState();
}
}
};
@Override
public Loader<Cursor> onCreateLoader(final int id, final Bundle args) {
final Uri uri = CachedTrends.Local.CONTENT_URI;
final String table = getTableNameByUri(uri);
final String where = table != null ? CachedTrends.TIMESTAMP + " = " + "(SELECT " + CachedTrends.TIMESTAMP
+ " FROM " + table + " ORDER BY " + CachedTrends.TIMESTAMP + " DESC LIMIT 1)" : null;
return new CursorLoader(getActivity(), uri, CachedTrends.COLUMNS, where, null, null);
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
super.onActivityCreated(savedInstanceState);
mMultiSelectManager = getMultiSelectManager();
mAccountId = getDefaultAccountId(getActivity());
mTrendsAdapter = new TrendsAdapter(getActivity());
setListAdapter(mTrendsAdapter);
getLoaderManager().initLoader(0, null, this);
}
@Override
public void onListItemClick(final ListView l, final View v, final int position, final long id) {
if (mMultiSelectManager.isActive()) return;
final Cursor cur = (Cursor) mTrendsAdapter.getItem(position - l.getHeaderViewsCount());
if (cur == null) return;
openTweetSearch(getActivity(), mAccountId, cur.getString(cur.getColumnIndex(CachedTrends.NAME)));
}
@Override
public Loader<Cursor> onCreateLoader(final int id, final Bundle args) {
final Uri uri = CachedTrends.Local.CONTENT_URI;
final String table = getTableNameByUri(uri);
final String where = table != null ? CachedTrends.TIMESTAMP + " = " + "(SELECT " + CachedTrends.TIMESTAMP
+ " FROM " + table + " ORDER BY " + CachedTrends.TIMESTAMP + " DESC LIMIT 1)" : null;
return new CursorLoader(getActivity(), uri, CachedTrends.COLUMNS, where, null, null);
}
@Override
public void onLoaderReset(final Loader<Cursor> loader) {
mTrendsAdapter.swapCursor(null);
}
@Override
public void onListItemClick(final ListView l, final View v, final int position, final long id) {
if (mMultiSelectManager.isActive()) return;
final Cursor cur = (Cursor) mTrendsAdapter.getItem(position - l.getHeaderViewsCount());
if (cur == null) return;
openTweetSearch(getActivity(), mAccountId, cur.getString(cur.getColumnIndex(CachedTrends.NAME)));
}
@Override
public void onLoadFinished(final Loader<Cursor> loader, final Cursor cursor) {
mTrendsAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(final Loader<Cursor> loader) {
mTrendsAdapter.swapCursor(null);
}
@Override
public void onRefreshFromEnd() {
@Override
public void onLoadFinished(final Loader<Cursor> loader, final Cursor cursor) {
mTrendsAdapter.swapCursor(cursor);
}
}
@Override
public void onRefreshFromEnd() {
@Override
public void onRefreshFromStart() {
if (isRefreshing()) return;
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (twitter == null) return;
twitter.getLocalTrendsAsync(mAccountId, mPreferences.getInt(KEY_LOCAL_TRENDS_WOEID, 1));
}
}
@Override
public void onStart() {
super.onStart();
getLoaderManager().restartLoader(0, null, this);
final IntentFilter filter = new IntentFilter(BROADCAST_TASK_STATE_CHANGED);
registerReceiver(mStatusReceiver, filter);
}
@Override
public void onRefreshFromStart() {
if (isRefreshing()) return;
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (twitter == null) return;
twitter.getLocalTrendsAsync(mAccountId, mPreferences.getInt(KEY_LOCAL_TRENDS_WOEID, 1));
}
@Override
public void onStop() {
unregisterReceiver(mStatusReceiver);
super.onStop();
}
@Override
public void onStart() {
super.onStart();
getLoaderManager().restartLoader(0, null, this);
final IntentFilter filter = new IntentFilter(BROADCAST_TASK_STATE_CHANGED);
registerReceiver(mStatusReceiver, filter);
}
protected void updateRefreshState() {
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (twitter == null || !getUserVisibleHint()) return;
setRefreshing(twitter.isLocalTrendsRefreshing());
}
@Override
public void onStop() {
unregisterReceiver(mStatusReceiver);
super.onStop();
}
static class TrendsAdapter extends SimpleCursorAdapter {
protected void updateRefreshState() {
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (twitter == null || !getUserVisibleHint()) return;
setRefreshing(twitter.isLocalTrendsRefreshing());
}
public TrendsAdapter(final Context context) {
super(context, android.R.layout.simple_list_item_1, null, new String[] { CachedTrends.NAME },
new int[] { android.R.id.text1 }, 0);
}
static class TrendsAdapter extends SimpleCursorAdapter {
}
public TrendsAdapter(final Context context) {
super(context, android.R.layout.simple_list_item_1, null, new String[]{CachedTrends.NAME},
new int[]{android.R.id.text1}, 0);
}
}
}

View File

@ -58,7 +58,6 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.UserListSelectorActivity;
import org.mariotaku.twidere.adapter.ListActionAdapter;
import org.mariotaku.twidere.model.ListAction;
import org.mariotaku.twidere.model.Panes;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.ParcelableUserList;
import org.mariotaku.twidere.model.SingleResponse;
@ -90,8 +89,7 @@ import static org.mariotaku.twidere.util.Utils.openUserProfile;
import static org.mariotaku.twidere.util.Utils.setMenuItemAvailability;
public class UserListDetailsFragment extends BaseSupportListFragment implements OnClickListener, OnItemClickListener,
OnItemLongClickListener, OnMenuItemClickListener, LoaderCallbacks<SingleResponse<ParcelableUserList>>,
Panes.Right {
OnItemLongClickListener, OnMenuItemClickListener, LoaderCallbacks<SingleResponse<ParcelableUserList>> {
private ImageLoaderWrapper mProfileImageLoader;
private AsyncTwitterWrapper mTwitterWrapper;

View File

@ -0,0 +1,132 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.fragment.support;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.support.SupportTabsAdapter;
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;
import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.view.ExtendedViewPager;
import org.mariotaku.twidere.view.LinePageIndicator;
public class UserListsFragment extends BaseSupportFragment implements OnPageChangeListener,
RefreshScrollTopInterface, SupportFragmentCallback {
private ExtendedViewPager mViewPager;
private SupportTabsAdapter mAdapter;
private LinePageIndicator mPagerIndicator;
private Fragment mCurrentVisibleFragment;
@Override
public Fragment getCurrentVisibleFragment() {
return mCurrentVisibleFragment;
}
public void hideIndicator() {
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final Bundle args = getArguments();
final FragmentActivity activity = getActivity();
mAdapter = new SupportTabsAdapter(activity, getChildFragmentManager(), null, 1);
mAdapter.addTab(UserListsListFragment.class, args, getString(R.string.lists),
R.drawable.ic_action_twitter, 0);
mAdapter.addTab(UserListMembershipsListFragment.class, args,
getString(R.string.lists_following_user), R.drawable.ic_action_user, 1);
mViewPager.setAdapter(mAdapter);
mViewPager.setOnPageChangeListener(this);
mViewPager.setOffscreenPageLimit(2);
mPagerIndicator.setSelectedColor(ThemeUtils.getThemeColor(activity));
mPagerIndicator.setViewPager(mViewPager);
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_search, container, false);
}
@Override
public void onDetachFragment(final Fragment fragment) {
}
@Override
public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) {
}
@Override
public void onPageScrollStateChanged(final int state) {
}
@Override
public void onPageSelected(final int position) {
}
@Override
public void onSetUserVisibleHint(final Fragment fragment, final boolean isVisibleToUser) {
if (isVisibleToUser) {
mCurrentVisibleFragment = fragment;
}
}
@Override
public void onViewCreated(final View view, final Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mViewPager = (ExtendedViewPager) view.findViewById(R.id.search_pager);
mPagerIndicator = (LinePageIndicator) view.findViewById(R.id.search_pager_indicator);
}
@Override
public boolean scrollToStart() {
if (!(mCurrentVisibleFragment instanceof RefreshScrollTopInterface)) return false;
((RefreshScrollTopInterface) mCurrentVisibleFragment).scrollToStart();
return true;
}
public void showIndicator() {
}
@Override
public boolean triggerRefresh() {
if (!(mCurrentVisibleFragment instanceof RefreshScrollTopInterface)) return false;
((RefreshScrollTopInterface) mCurrentVisibleFragment).triggerRefresh();
return true;
}
@Override
public boolean triggerRefresh(final int position) {
return false;
}
}

View File

@ -91,7 +91,6 @@ import org.mariotaku.twidere.activity.support.UserProfileEditorActivity;
import org.mariotaku.twidere.adapter.ListActionAdapter;
import org.mariotaku.twidere.loader.support.ParcelableUserLoader;
import org.mariotaku.twidere.model.ListAction;
import org.mariotaku.twidere.model.Panes.Right;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.ParcelableUserList;
import org.mariotaku.twidere.model.SingleResponse;
@ -149,7 +148,6 @@ import static org.mariotaku.twidere.util.Utils.openUserBlocks;
import static org.mariotaku.twidere.util.Utils.openUserFavorites;
import static org.mariotaku.twidere.util.Utils.openUserFollowers;
import static org.mariotaku.twidere.util.Utils.openUserFriends;
import static org.mariotaku.twidere.util.Utils.openUserListMemberships;
import static org.mariotaku.twidere.util.Utils.openUserLists;
import static org.mariotaku.twidere.util.Utils.openUserMediaTimeline;
import static org.mariotaku.twidere.util.Utils.openUserMentions;
@ -159,7 +157,7 @@ import static org.mariotaku.twidere.util.Utils.setMenuItemAvailability;
import static org.mariotaku.twidere.util.Utils.showInfoMessage;
public class UserProfileFragmentOld extends BaseSupportListFragment implements OnClickListener, OnItemClickListener,
OnItemLongClickListener, OnMenuItemClickListener, OnLinkClickListener, Right, OnSizeChangedListener,
OnItemLongClickListener, OnMenuItemClickListener, OnLinkClickListener, OnSizeChangedListener,
OnSharedPreferenceChangeListener, OnTouchListener, ImageLoadingListener {
private static final int LOADER_ID_USER = 1;
@ -416,7 +414,6 @@ public class UserProfileFragmentOld extends BaseSupportListFragment implements O
mAdapter.add(new FavoritesAction(2));
mAdapter.add(new UserMentionsAction(3));
mAdapter.add(new UserListsAction(4));
mAdapter.add(new UserListMembershipsAction(5));
if (userIsMe) {
mAdapter.add(new SavedSearchesAction(11));
if (user.is_protected) {
@ -1204,26 +1201,6 @@ public class UserProfileFragmentOld extends BaseSupportListFragment implements O
}
private final class UserListMembershipsAction extends ListAction {
public UserListMembershipsAction(final int order) {
super(order);
}
@Override
public String getName() {
if (mUser == null) return getString(R.string.lists_following_user);
final String display_name = getDisplayName(getActivity(), mUser.id, mUser.name, mUser.screen_name);
return getString(R.string.lists_following_user_with_name, display_name);
}
@Override
public void onClick() {
final ParcelableUser user = mUser;
if (user == null) return;
openUserListMemberships(getActivity(), user.account_id, user.id, user.screen_name);
}
}
private final class UserListsAction extends ListAction {
public UserListsAction(final int order) {
@ -1232,9 +1209,7 @@ public class UserProfileFragmentOld extends BaseSupportListFragment implements O
@Override
public String getName() {
if (mUser == null) return getString(R.string.users_lists);
final String display_name = getDisplayName(getActivity(), mUser.id, mUser.name, mUser.screen_name);
return getString(R.string.users_lists_with_name, display_name);
return getString(R.string.lists);
}
@Override

View File

@ -1,31 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.model;
public interface Panes {
public interface Left {
}
public interface Right {
}
}

View File

@ -140,7 +140,7 @@ import org.mariotaku.twidere.fragment.support.UserListMembersFragment;
import org.mariotaku.twidere.fragment.support.UserListMembershipsListFragment;
import org.mariotaku.twidere.fragment.support.UserListSubscribersFragment;
import org.mariotaku.twidere.fragment.support.UserListTimelineFragment;
import org.mariotaku.twidere.fragment.support.UserListsListFragment;
import org.mariotaku.twidere.fragment.support.UserListsFragment;
import org.mariotaku.twidere.fragment.support.UserMediaTimelineFragment;
import org.mariotaku.twidere.fragment.support.UserMentionsFragment;
import org.mariotaku.twidere.fragment.support.UserProfileFragmentOld;
@ -849,29 +849,29 @@ public final class Utils implements Constants, TwitterConstants {
break;
}
case LINK_ID_USER_LISTS: {
fragment = new UserListsListFragment();
fragment = new UserListsFragment();
final String paramScreenName = uri.getQueryParameter(QUERY_PARAM_SCREEN_NAME);
final String param_user_id = uri.getQueryParameter(QUERY_PARAM_USER_ID);
final String paramUserId = uri.getQueryParameter(QUERY_PARAM_USER_ID);
if (!args.containsKey(EXTRA_SCREEN_NAME)) {
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
}
if (!args.containsKey(EXTRA_USER_ID)) {
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(param_user_id));
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(paramUserId));
}
if (isEmpty(paramScreenName) && isEmpty(param_user_id)) return null;
if (isEmpty(paramScreenName) && isEmpty(paramUserId)) return null;
break;
}
case LINK_ID_USER_LIST_TIMELINE: {
fragment = new UserListTimelineFragment();
final String paramScreenName = uri.getQueryParameter(QUERY_PARAM_SCREEN_NAME);
final String param_user_id = uri.getQueryParameter(QUERY_PARAM_USER_ID);
final String param_list_id = uri.getQueryParameter(QUERY_PARAM_LIST_ID);
final String paramUserId = uri.getQueryParameter(QUERY_PARAM_USER_ID);
final String paramListId = uri.getQueryParameter(QUERY_PARAM_LIST_ID);
final String paramListName = uri.getQueryParameter(QUERY_PARAM_LIST_NAME);
if (isEmpty(param_list_id)
&& (isEmpty(paramListName) || isEmpty(paramScreenName) && isEmpty(param_user_id)))
if (isEmpty(paramListId)
&& (isEmpty(paramListName) || isEmpty(paramScreenName) && isEmpty(paramUserId)))
return null;
args.putInt(EXTRA_LIST_ID, ParseUtils.parseInt(param_list_id));
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(param_user_id));
args.putInt(EXTRA_LIST_ID, ParseUtils.parseInt(paramListId));
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(paramUserId));
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
args.putString(EXTRA_LIST_NAME, paramListName);
break;
@ -879,14 +879,14 @@ public final class Utils implements Constants, TwitterConstants {
case LINK_ID_USER_LIST_MEMBERS: {
fragment = new UserListMembersFragment();
final String paramScreenName = uri.getQueryParameter(QUERY_PARAM_SCREEN_NAME);
final String param_user_id = uri.getQueryParameter(QUERY_PARAM_USER_ID);
final String param_list_id = uri.getQueryParameter(QUERY_PARAM_LIST_ID);
final String paramUserId = uri.getQueryParameter(QUERY_PARAM_USER_ID);
final String paramListId = uri.getQueryParameter(QUERY_PARAM_LIST_ID);
final String paramListName = uri.getQueryParameter(QUERY_PARAM_LIST_NAME);
if (isEmpty(param_list_id)
&& (isEmpty(paramListName) || isEmpty(paramScreenName) && isEmpty(param_user_id)))
if (isEmpty(paramListId)
&& (isEmpty(paramListName) || isEmpty(paramScreenName) && isEmpty(paramUserId)))
return null;
args.putInt(EXTRA_LIST_ID, ParseUtils.parseInt(param_list_id));
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(param_user_id));
args.putInt(EXTRA_LIST_ID, ParseUtils.parseInt(paramListId));
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(paramUserId));
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
args.putString(EXTRA_LIST_NAME, paramListName);
break;
@ -894,14 +894,14 @@ public final class Utils implements Constants, TwitterConstants {
case LINK_ID_USER_LIST_SUBSCRIBERS: {
fragment = new UserListSubscribersFragment();
final String paramScreenName = uri.getQueryParameter(QUERY_PARAM_SCREEN_NAME);
final String param_user_id = uri.getQueryParameter(QUERY_PARAM_USER_ID);
final String param_list_id = uri.getQueryParameter(QUERY_PARAM_LIST_ID);
final String paramUserId = uri.getQueryParameter(QUERY_PARAM_USER_ID);
final String paramListId = uri.getQueryParameter(QUERY_PARAM_LIST_ID);
final String paramListName = uri.getQueryParameter(QUERY_PARAM_LIST_NAME);
if (isEmpty(param_list_id)
&& (isEmpty(paramListName) || isEmpty(paramScreenName) && isEmpty(param_user_id)))
if (isEmpty(paramListId)
&& (isEmpty(paramListName) || isEmpty(paramScreenName) && isEmpty(paramUserId)))
return null;
args.putInt(EXTRA_LIST_ID, ParseUtils.parseInt(param_list_id));
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(param_user_id));
args.putInt(EXTRA_LIST_ID, ParseUtils.parseInt(paramListId));
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(paramUserId));
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
args.putString(EXTRA_LIST_NAME, paramListName);
break;
@ -934,16 +934,16 @@ public final class Utils implements Constants, TwitterConstants {
case LINK_ID_STATUS_RETWEETERS: {
fragment = new StatusRetweetersListFragment();
if (!args.containsKey(EXTRA_STATUS_ID)) {
final String param_status_id = uri.getQueryParameter(QUERY_PARAM_STATUS_ID);
args.putLong(EXTRA_STATUS_ID, ParseUtils.parseLong(param_status_id));
final String paramStatusId = uri.getQueryParameter(QUERY_PARAM_STATUS_ID);
args.putLong(EXTRA_STATUS_ID, ParseUtils.parseLong(paramStatusId));
}
break;
}
case LINK_ID_STATUS_FAVORITERS: {
fragment = new StatusFavoritersListFragment();
if (!args.containsKey(EXTRA_STATUS_ID)) {
final String param_status_id = uri.getQueryParameter(QUERY_PARAM_STATUS_ID);
args.putLong(EXTRA_STATUS_ID, ParseUtils.parseLong(param_status_id));
final String paramStatusId = uri.getQueryParameter(QUERY_PARAM_STATUS_ID);
args.putLong(EXTRA_STATUS_ID, ParseUtils.parseLong(paramStatusId));
}
break;
}
@ -970,17 +970,17 @@ public final class Utils implements Constants, TwitterConstants {
return null;
}
}
final String param_account_id = uri.getQueryParameter(QUERY_PARAM_ACCOUNT_ID);
if (param_account_id != null) {
args.putLong(EXTRA_ACCOUNT_ID, ParseUtils.parseLong(param_account_id));
final String paramAccountId = uri.getQueryParameter(QUERY_PARAM_ACCOUNT_ID);
if (paramAccountId != null) {
args.putLong(EXTRA_ACCOUNT_ID, ParseUtils.parseLong(paramAccountId));
} else {
final String param_account_name = uri.getQueryParameter(QUERY_PARAM_ACCOUNT_NAME);
if (param_account_name != null) {
args.putLong(EXTRA_ACCOUNT_ID, getAccountId(context, param_account_name));
final String paramAccountName = uri.getQueryParameter(QUERY_PARAM_ACCOUNT_NAME);
if (paramAccountName != null) {
args.putLong(EXTRA_ACCOUNT_ID, getAccountId(context, paramAccountName));
} else {
final long account_id = getDefaultAccountId(context);
if (isMyAccount(context, account_id)) {
args.putLong(EXTRA_ACCOUNT_ID, account_id);
final long accountId = getDefaultAccountId(context);
if (isMyAccount(context, accountId)) {
args.putLong(EXTRA_ACCOUNT_ID, accountId);
}
}
}

View File

@ -1,8 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<ImageView
<org.mariotaku.twidere.view.SquareFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/icon"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_alignParentBottom="true"
android:layout_alignParentTop="true"/>
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="@dimen/element_spacing_msmall">
<org.mariotaku.twidere.view.CircularImageView
android:id="@android:id/icon"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</org.mariotaku.twidere.view.SquareFrameLayout>

View File

@ -1,13 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<org.mariotaku.twidere.view.CardItemLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_small">
<org.mariotaku.twidere.view.CardItemLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_small">
<LinearLayout
android:layout_width="match_parent"
@ -83,7 +84,7 @@
android:layout_height="@dimen/icon_size_card_list_item"
android:layout_marginLeft="@dimen/element_spacing_normal"
android:layout_weight="0"
android:contentDescription="@string/my_profile_image"
android:contentDescription="@string/your_profile_image"
android:scaleType="fitCenter"/>
</LinearLayout>

View File

@ -1,12 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<org.mariotaku.twidere.view.CardItemFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_small">
<org.mariotaku.twidere.view.CardItemFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_small">
<RelativeLayout
android:layout_width="match_parent"
@ -32,7 +33,7 @@
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="@dimen/element_spacing_normal"
android:contentDescription="@string/my_profile_image"
android:contentDescription="@string/your_profile_image"
android:scaleType="fitCenter"/>
<FrameLayout
@ -42,7 +43,7 @@
android:layout_alignParentTop="true"
android:layout_alignWithParentIfMissing="true"
android:layout_toLeftOf="@+id/time_frame"
android:layout_toRightOf="@+id/profile_image">
android:layout_toRightOf="@id/profile_image">
<LinearLayout
android:layout_width="wrap_content"
@ -150,7 +151,7 @@
android:layout_alignRight="@+id/time_frame"
android:layout_alignWithParentIfMissing="true"
android:layout_below="@+id/reply_retweet_status"
android:layout_toRightOf="@+id/profile_image"
android:layout_toRightOf="@id/profile_image"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingTop="@dimen/element_spacing_small">

View File

@ -66,8 +66,8 @@
android:id="@+id/profile_type"
android:layout_width="@dimen/icon_size_profile_type"
android:layout_height="@dimen/icon_size_profile_type"
android:layout_alignBottom="@+id/profile_image"
android:layout_alignRight="@+id/profile_image"
android:layout_alignBottom="@id/profile_image"
android:layout_alignRight="@id/profile_image"
android:scaleType="fitCenter"/>
<LinearLayout
@ -76,7 +76,7 @@
android:layout_centerVertical="true"
android:layout_marginLeft="@dimen/element_spacing_normal"
android:layout_toLeftOf="@+id/menu"
android:layout_toRightOf="@+id/profile_image"
android:layout_toRightOf="@id/profile_image"
android:orientation="vertical">

View File

@ -46,10 +46,10 @@
android:id="@+id/profile_type"
android:layout_width="@dimen/icon_size_profile_type"
android:layout_height="@dimen/icon_size_profile_type"
android:layout_alignBottom="@+id/profile_image"
android:layout_alignBottom="@id/profile_image"
android:layout_marginRight="@dimen/element_spacing_minus_normal"
android:layout_marginBottom="@dimen/element_spacing_minus_small"
android:layout_alignRight="@+id/profile_image"
android:layout_alignRight="@id/profile_image"
android:scaleType="centerInside"/>
<LinearLayout
@ -58,7 +58,7 @@
android:layout_height="wrap_content"
android:layout_alignTop="@id/profile_image"
android:layout_marginLeft="@dimen/element_spacing_normal"
android:layout_toRightOf="@+id/profile_image"
android:layout_toRightOf="@id/profile_image"
android:orientation="vertical">
<LinearLayout

View File

@ -1,15 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<org.mariotaku.twidere.view.CardItemLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_small"
tools:context=".adapter.DirectMessagesEntryAdapter">
<org.mariotaku.twidere.view.CardItemLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_small"
tools:context=".adapter.DirectMessagesEntryAdapter">
<LinearLayout
android:layout_width="match_parent"

View File

@ -1,97 +1,98 @@
<?xml version="1.0" encoding="utf-8"?>
<org.mariotaku.twidere.view.CardItemFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_small"
tools:context=".adapter.DirectMessagesEntryAdapter">
<org.mariotaku.twidere.view.CardItemFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_small"
tools:context=".adapter.DirectMessagesEntryAdapter">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/element_spacing_normal">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/element_spacing_normal">
<org.mariotaku.twidere.view.ForegroundImageView
android:id="@+id/profile_image"
android:layout_width="@dimen/icon_size_card_list_item"
android:layout_height="@dimen/icon_size_card_list_item"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginRight="@dimen/element_spacing_normal"
android:contentDescription="@string/profile_image"
android:scaleType="fitCenter"/>
<org.mariotaku.twidere.view.CircularImageView
android:id="@+id/profile_image"
android:layout_width="@dimen/icon_size_card_list_item"
android:layout_height="@dimen/icon_size_card_list_item"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginRight="@dimen/element_spacing_normal"
android:contentDescription="@string/profile_image"
android:scaleType="fitCenter"/>
<FrameLayout
android:id="@+id/name_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignWithParentIfMissing="true"
android:layout_toLeftOf="@+id/time_frame"
android:layout_toRightOf="@+id/profile_image">
<FrameLayout
android:id="@+id/name_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignWithParentIfMissing="true"
android:layout_toLeftOf="@id/time_frame"
android:layout_toRightOf="@id/profile_image">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal">
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary"
android:textStyle="bold"/>
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary"
android:textStyle="bold"/>
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/screen_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"/>
</LinearLayout>
</FrameLayout>
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/screen_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"/>
</LinearLayout>
</FrameLayout>
<FrameLayout
android:id="@+id/time_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/name_frame"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/name_frame"
android:layout_alignWithParentIfMissing="true"
android:paddingLeft="@dimen/element_spacing_small">
<FrameLayout
android:id="@+id/time_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/name_frame"
android:layout_alignParentRight="true"
android:layout_alignTop="@id/name_frame"
android:layout_alignWithParentIfMissing="true"
android:paddingLeft="@dimen/element_spacing_small">
<org.mariotaku.twidere.view.ShortTimeView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:drawablePadding="@dimen/element_spacing_small"
android:singleLine="true"
android:textColor="?android:attr/textColorSecondary"/>
</FrameLayout>
<org.mariotaku.twidere.view.ShortTimeView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:drawablePadding="@dimen/element_spacing_small"
android:singleLine="true"
android:textColor="?android:attr/textColorSecondary"/>
</FrameLayout>
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/name_frame"
android:layout_alignRight="@+id/time_frame"
android:layout_below="@+id/name_frame"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"/>
</RelativeLayout>
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/name_frame"
android:layout_alignRight="@id/time_frame"
android:layout_below="@id/name_frame"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"/>
</RelativeLayout>
</org.mariotaku.twidere.view.CardItemFrameLayout>

View File

@ -1,15 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<org.mariotaku.twidere.view.CardItemLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_small"
tools:context=".adapter.CursorStatusesAdapter">
<org.mariotaku.twidere.view.CardItemLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_small"
tools:context=".adapter.CursorStatusesAdapter">
<LinearLayout
android:layout_width="match_parent"
@ -85,7 +86,7 @@
android:layout_height="@dimen/icon_size_card_list_item"
android:layout_marginLeft="@dimen/element_spacing_normal"
android:layout_weight="0"
android:contentDescription="@string/my_profile_image"
android:contentDescription="@string/your_profile_image"
android:scaleType="fitCenter"/>
</LinearLayout>

View File

@ -1,14 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<org.mariotaku.twidere.view.CardItemFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_small"
tools:context=".adapter.CursorStatusesAdapter">
<org.mariotaku.twidere.view.CardItemFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_small"
tools:context=".adapter.CursorStatusesAdapter">
<RelativeLayout
android:layout_width="match_parent"
@ -37,7 +38,7 @@
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="@dimen/element_spacing_normal"
android:contentDescription="@string/my_profile_image"
android:contentDescription="@string/your_profile_image"
android:scaleType="fitCenter"/>
<FrameLayout
@ -46,8 +47,8 @@
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignWithParentIfMissing="true"
android:layout_toLeftOf="@+id/time_frame"
android:layout_toRightOf="@+id/profile_image">
android:layout_toLeftOf="@id/time_frame"
android:layout_toRightOf="@id/profile_image">
<LinearLayout
android:layout_width="wrap_content"
@ -82,10 +83,10 @@
android:id="@+id/time_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/name_frame"
android:layout_alignTop="@+id/name_frame"
android:layout_alignBottom="@id/name_frame"
android:layout_alignTop="@id/name_frame"
android:layout_alignWithParentIfMissing="true"
android:layout_toLeftOf="@+id/my_profile_image"
android:layout_toLeftOf="@id/my_profile_image"
android:paddingLeft="@dimen/element_spacing_small">
<org.mariotaku.twidere.view.ShortTimeView
@ -102,9 +103,9 @@
android:id="@+id/image_preview_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/name_frame"
android:layout_alignRight="@+id/time_frame"
android:layout_below="@+id/name_frame"
android:layout_alignLeft="@id/name_frame"
android:layout_alignRight="@id/time_frame"
android:layout_below="@id/name_frame"
android:paddingTop="@dimen/element_spacing_small"
android:visibility="gone">
@ -139,9 +140,9 @@
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/name_frame"
android:layout_alignRight="@+id/time_frame"
android:layout_below="@+id/image_preview_container"
android:layout_alignLeft="@id/name_frame"
android:layout_alignRight="@id/time_frame"
android:layout_below="@id/image_preview_container"
android:paddingTop="@dimen/element_spacing_small"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"/>
@ -150,9 +151,9 @@
android:id="@+id/reply_retweet_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/name_frame"
android:layout_alignRight="@+id/time_frame"
android:layout_below="@+id/text"
android:layout_alignLeft="@id/name_frame"
android:layout_alignRight="@id/time_frame"
android:layout_below="@id/text"
android:drawablePadding="4dp"
android:paddingTop="@dimen/element_spacing_small"
android:singleLine="true"

View File

@ -22,7 +22,7 @@
android:paddingRight="@dimen/element_spacing_xlarge"
android:paddingTop="@dimen/element_spacing_normal">
<ImageView
<org.mariotaku.twidere.view.CircularImageView
android:id="@+id/profile_image"
android:layout_width="@dimen/icon_size_card_list_item"
android:layout_height="@dimen/icon_size_card_list_item"

View File

@ -1,143 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<org.mariotaku.twidere.view.CardItemFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_small"
tools:context=".adapter.ParcelableUsersAdapter">
<org.mariotaku.twidere.view.CardItemFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_small"
tools:context=".adapter.ParcelableUsersAdapter">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/element_spacing_normal"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/item_menu_card_padding_compact"
android:paddingTop="@dimen/element_spacing_normal">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/element_spacing_normal"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/item_menu_card_padding_compact"
android:paddingTop="@dimen/element_spacing_normal">
<ImageView
android:id="@+id/profile_image"
android:layout_width="@dimen/icon_size_card_list_item"
android:layout_height="@dimen/icon_size_card_list_item"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginRight="@dimen/element_spacing_normal"
android:contentDescription="@string/profile_image"
android:scaleType="fitCenter"/>
<org.mariotaku.twidere.view.CircularImageView
android:id="@+id/profile_image"
android:layout_width="@dimen/icon_size_card_list_item"
android:layout_height="@dimen/icon_size_card_list_item"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginRight="@dimen/element_spacing_normal"
android:contentDescription="@string/profile_image"
android:scaleType="fitCenter"/>
<FrameLayout
android:id="@+id/name_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_alignWithParentIfMissing="true"
android:layout_toRightOf="@+id/profile_image">
<FrameLayout
android:id="@+id/name_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_alignWithParentIfMissing="true"
android:layout_toRightOf="@id/profile_image">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal">
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary"
android:textStyle="bold"/>
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary"
android:textStyle="bold"/>
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/screen_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"/>
</LinearLayout>
</FrameLayout>
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/screen_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"/>
</LinearLayout>
</FrameLayout>
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/name_frame"
android:layout_below="@+id/name_frame"
android:paddingTop="@dimen/element_spacing_small"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"/>
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/name_frame"
android:layout_below="@+id/name_frame"
android:paddingTop="@dimen/element_spacing_small"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"/>
<TextView
android:id="@+id/location"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/name_frame"
android:layout_below="@+id/description"
android:drawableLeft="@drawable/ic_indicator_location"
android:drawablePadding="@dimen/element_spacing_small"
android:paddingTop="@dimen/element_spacing_small"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"/>
<TextView
android:id="@+id/location"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/name_frame"
android:layout_below="@+id/description"
android:drawableLeft="@drawable/ic_indicator_location"
android:drawablePadding="@dimen/element_spacing_small"
android:paddingTop="@dimen/element_spacing_small"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"/>
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/name_frame"
android:layout_below="@+id/location"
android:drawableLeft="@drawable/ic_indicator_web"
android:drawablePadding="@dimen/element_spacing_small"
android:paddingTop="@dimen/element_spacing_small"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"/>
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/name_frame"
android:layout_below="@+id/location"
android:drawableLeft="@drawable/ic_indicator_web"
android:drawablePadding="@dimen/element_spacing_small"
android:paddingTop="@dimen/element_spacing_small"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/name_frame"
android:layout_below="@+id/url"
android:orientation="horizontal"
android:paddingTop="@dimen/element_spacing_small">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/name_frame"
android:layout_below="@+id/url"
android:orientation="horizontal"
android:paddingTop="@dimen/element_spacing_small">
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/statuses_count"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawableLeft="@drawable/ic_indicator_twitter"
android:drawablePadding="@dimen/element_spacing_small"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"/>
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/statuses_count"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawableLeft="@drawable/ic_indicator_twitter"
android:drawablePadding="@dimen/element_spacing_small"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"/>
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/followers_count"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawableLeft="@drawable/ic_indicator_followers"
android:drawablePadding="@dimen/element_spacing_small"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"/>
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/followers_count"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawableLeft="@drawable/ic_indicator_followers"
android:drawablePadding="@dimen/element_spacing_small"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"/>
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/friends_count"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawableLeft="@drawable/ic_indicator_following"
android:drawablePadding="@dimen/element_spacing_small"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"/>
</LinearLayout>
</RelativeLayout>
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/friends_count"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawableLeft="@drawable/ic_indicator_following"
android:drawablePadding="@dimen/element_spacing_small"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"/>
</LinearLayout>
</RelativeLayout>
</org.mariotaku.twidere.view.CardItemFrameLayout>

View File

@ -37,7 +37,7 @@
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_alignWithParentIfMissing="true"
android:layout_toRightOf="@+id/profile_image">
android:layout_toRightOf="@id/profile_image">
<LinearLayout
android:layout_width="wrap_content"
@ -72,8 +72,8 @@
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/name_frame"
android:layout_below="@+id/name_frame"
android:layout_alignLeft="@id/name_frame"
android:layout_below="@id/name_frame"
android:paddingTop="@dimen/element_spacing_small"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"/>
@ -81,8 +81,8 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/description"
android:layout_below="@+id/description"
android:layout_alignLeft="@id/description"
android:layout_below="@id/description"
android:orientation="horizontal"
android:paddingTop="@dimen/element_spacing_small">

View File

@ -12,8 +12,7 @@
android:layout_alignTop="@id/profile_container"
android:alpha="0.33"
android:contentDescription="@string/profile_banner"
android:scaleType="centerCrop"
android:src="@drawable/twidere_feature_graphic"/>
android:scaleType="centerCrop"/>
<RelativeLayout
android:id="@+id/profile_container"
@ -28,40 +27,54 @@
android:id="@+id/profile_image"
android:layout_width="@dimen/icon_size_profile_image_dashboard_current"
android:layout_height="@dimen/icon_size_profile_image_dashboard_current"
android:layout_marginBottom="@dimen/element_spacing_large"
android:layout_marginTop="@dimen/element_spacing_large"
android:src="@drawable/ic_launcher"/>
android:layout_marginBottom="@dimen/element_spacing_mlarge"
android:layout_marginTop="@dimen/element_spacing_mlarge"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/account_selector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/profile_image"
android:layout_alignBottom="@id/profile_image"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/profile_image"
android:layout_toRightOf="@+id/profile_image"/>
android:layout_alignTop="@id/profile_image"
android:layout_marginBottom="@dimen/element_spacing_large"
android:layout_toRightOf="@id/profile_image"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/profile_image"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:orientation="vertical">
android:layout_below="@id/profile_image"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/name"
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?android:textColorPrimary"
android:textStyle="bold"/>
<TextView
android:id="@+id/screen_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:textAppearanceSmall"/>
</LinearLayout>
<Switch
android:id="@+id/toggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?android:textColorPrimary"
android:textStyle="bold"/>
<TextView
android:id="@+id/screen_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:textAppearanceSmall"/>
android:layout_weight="0"/>
</LinearLayout>
</RelativeLayout>

View File

@ -58,18 +58,18 @@
android:id="@+id/profile_type"
android:layout_width="@dimen/icon_size_profile_type_detail"
android:layout_height="@dimen/icon_size_profile_type_detail"
android:layout_alignBottom="@+id/profile_image"
android:layout_alignRight="@+id/profile_image"
android:layout_alignBottom="@id/profile_image"
android:layout_alignRight="@id/profile_image"
android:scaleType="fitCenter"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/profile_image"
android:layout_alignTop="@+id/profile_image"
android:layout_alignBottom="@id/profile_image"
android:layout_alignTop="@id/profile_image"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/follow_indicator"
android:layout_toRightOf="@+id/profile_image"
android:layout_toRightOf="@id/profile_image"
android:gravity="center_vertical"
android:orientation="vertical"
android:paddingLeft="8dp"

View File

@ -25,7 +25,7 @@
android:padding="@dimen/element_spacing_normal"
app:ignorePadding="true">
<org.mariotaku.twidere.view.ForegroundImageView
<org.mariotaku.twidere.view.CircularImageView
android:id="@+id/profile_image"
android:layout_width="@dimen/icon_size_card_details"
android:layout_height="@dimen/icon_size_card_details"
@ -41,7 +41,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/profile_image"
android:layout_toRightOf="@id/profile_image"
android:gravity="center_vertical"
android:orientation="vertical"
android:paddingLeft="@dimen/element_spacing_normal">

View File

@ -15,22 +15,22 @@
<View
android:layout_width="match_parent"
android:layout_height="@dimen/element_spacing_xsmall"
android:layout_above="@+id/profile_name_container"
android:layout_above="@id/profile_name_container"
android:background="@drawable/shadow_top"/>
<!--<View-->
<!--android:id="@+id/profile_layer_bottom"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="match_parent"-->
<!--android:layout_alignBottom="@+id/card"-->
<!--android:layout_alignTop="@+id/profile_name_container"/>-->
<!--android:layout_alignBottom="@id/card"-->
<!--android:layout_alignTop="@id/profile_name_container"/>-->
<org.mariotaku.twidere.view.CircularImageView
android:id="@+id/profile_image"
style="?profileImageStyleLarge"
android:layout_width="@dimen/icon_size_user_profile"
android:layout_height="@dimen/icon_size_user_profile"
android:layout_alignBottom="@+id/profile_name_container"
android:layout_alignBottom="@id/profile_name_container"
android:layout_marginLeft="@dimen/element_spacing_normal"
android:contentDescription="@string/profile_image"
android:src="@drawable/ic_profile_image_default"/>
@ -40,16 +40,16 @@
style="@style/Widget.ProfileType"
android:layout_width="@dimen/icon_size_profile_type_user_profile"
android:layout_height="@dimen/icon_size_profile_type_user_profile"
android:layout_alignBottom="@+id/profile_image"
android:layout_alignRight="@+id/profile_image"
android:layout_alignBottom="@id/profile_image"
android:layout_alignRight="@id/profile_image"
android:scaleType="fitCenter"/>
<org.mariotaku.twidere.view.ColorLabelLinearLayout
android:id="@+id/profile_name_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/profile_banner_space"
android:layout_toRightOf="@+id/profile_image"
android:layout_below="@id/profile_banner_space"
android:layout_toRightOf="@id/profile_image"
android:background="?android:selectableItemBackground"
android:clipToPadding="false"
android:orientation="vertical"
@ -95,7 +95,7 @@
android:id="@+id/card"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/profile_name_container"
android:layout_below="@id/profile_name_container"
android:layout_margin="@dimen/element_spacing_normal"
app:cardBackgroundColor="?cardItemBackgroundColor"
app:cardCornerRadius="@dimen/corner_radius_card"

View File

@ -42,7 +42,7 @@
android:layout_height="@dimen/icon_size_list_item"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/drag_handle"
android:contentDescription="@string/my_profile_image"
android:contentDescription="@string/your_profile_image"
android:scaleType="fitCenter"/>
<LinearLayout

View File

@ -36,36 +36,20 @@
android:orientation="vertical"
android:paddingLeft="@dimen/element_spacing_small">
<LinearLayout
android:id="@+id/name_default_container"
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
android:singleLine="true"
android:textAppearance="?android:textAppearanceMedium"
android:textSize="@dimen/accounts_drawer_name_size"/>
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:textAppearance="?android:textAppearanceMedium"
android:textSize="@dimen/accounts_drawer_name_size"/>
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/default_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="4dp"
android:singleLine="true"
android:text="@string/default_account"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/accounts_drawer_default_indicator_size"/>
</LinearLayout>
<TextView
android:id="@+id/screen_name"
android:layout_width="wrap_content"
android:visibility="gone"
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"

View File

@ -91,6 +91,6 @@
<dimen name="padding_profile_image_detail_page">@dimen/element_spacing_small</dimen>
<dimen name="padding_profile_image_list_item">@dimen/element_spacing_small</dimen>
<dimen name="icon_size_profile_image_dashboard_current">64dp</dimen>
<dimen name="icon_size_profile_image_dashboard_current">72dp</dimen>
</resources>

View File

@ -123,11 +123,11 @@
<string name="load_item_limit">Load item limit</string>
<string name="load_item_limit_summary">Set items limit per load.</string>
<string name="load_more_automatically">Load more content automatically</string>
<string name="load_more_automatically_summary">Load more content (e.g. photos, maps, statuses) automatically</string>
<string name="load_more_automatically_summary">Load more content (e.g. photos, maps, tweets) automatically</string>
<string name="quote">Quote</string>
<string name="add_rule">Add rule</string>
<string name="text_size">Text size</string>
<string name="text_size_summary">Text size of statuses.</string>
<string name="text_size_summary">Text size of tweets.</string>
<string name="cannot_get_location">Can\'t get your location.</string>
<string name="drafts">Drafts</string>
<string name="description">Description</string>
@ -194,9 +194,10 @@
<string name="list_members">List members</string>
<string name="list_subscribers">List subscribers</string>
<string name="type_to_compose">Type to compose</string>
<string name="lists">Lists</string>
<string name="users_lists">User\'s lists</string>
<string name="lists_following_user">Lists following this user</string>
<string name="lists_following_me">Lists following me</string>
<string name="lists_following_you">Lists following you</string>
<string name="item_3_minutes">3 minutes</string>
<string name="item_5_minutes">5 minutes</string>
<string name="item_10_minutes">10 minutes</string>
@ -387,7 +388,7 @@
<string name="no_thanks">No, thanks</string>
<string name="revoke_permissions">Revoke permissions</string>
<string name="fast_scroll_thumb">Fast scroll thumb</string>
<string name="indicate_my_status">Indicate my tweet</string>
<string name="indicate_your_status">Indicate your tweet</string>
<string name="default_ringtone">Default ringtone</string>
<string name="phishing_link_warning">Phishing link warning</string>
<string name="phishing_link_warning_summary">Warn you when are trying to open a possibly phishing link in a direct message.</string>
@ -403,7 +404,7 @@
<string name="quote_protected_status_notice">It\'s not recommended to quote protected tweets.</string>
<string name="edit_draft">Edit draft</string>
<string name="profile_image">Profile image</string>
<string name="my_profile_image">My profile image</string>
<string name="your_profile_image">Your profile image</string>
<string name="mention_user">Mention <xliff:g id="user">%s</xliff:g></string>
<string name="theme_color">Theme color</string>
<string name="wrong_url_format">Wrong URL format.</string>
@ -674,5 +675,6 @@
<string name="function">Function</string>
<string name="replies">Replies</string>
<string name="profile_banner">Profile banner</string>
<string name="profile">Profile</string>
</resources>

View File

@ -72,7 +72,7 @@
android:defaultValue="true"
android:key="indicate_my_status"
android:order="29"
android:title="@string/indicate_my_status"/>
android:title="@string/indicate_your_status"/>
<org.mariotaku.twidere.preference.AutoFixCheckBoxPreference
android:defaultValue="false"
android:key="show_absolute_time"