396 lines
15 KiB
Java
396 lines
15 KiB
Java
/*
|
|
* 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.activity;
|
|
|
|
import android.content.Intent;
|
|
import android.os.AsyncTask;
|
|
import android.os.Bundle;
|
|
import android.support.v4.app.DialogFragment;
|
|
import android.support.v4.app.Fragment;
|
|
import android.support.v4.app.FragmentManager;
|
|
import android.text.TextUtils;
|
|
import android.util.Log;
|
|
import android.view.View;
|
|
import android.view.View.OnClickListener;
|
|
import android.widget.AdapterView;
|
|
import android.widget.AdapterView.OnItemClickListener;
|
|
import android.widget.AutoCompleteTextView;
|
|
import android.widget.ListView;
|
|
|
|
import com.squareup.otto.Subscribe;
|
|
|
|
import org.mariotaku.twidere.R;
|
|
import org.mariotaku.twidere.adapter.SimpleParcelableUserListsAdapter;
|
|
import org.mariotaku.twidere.adapter.SimpleParcelableUsersAdapter;
|
|
import org.mariotaku.twidere.adapter.UserAutoCompleteAdapter;
|
|
import org.mariotaku.twidere.api.twitter.Twitter;
|
|
import org.mariotaku.twidere.api.twitter.TwitterException;
|
|
import org.mariotaku.twidere.api.twitter.http.HttpResponseCode;
|
|
import org.mariotaku.twidere.api.twitter.model.Paging;
|
|
import org.mariotaku.twidere.api.twitter.model.ResponseList;
|
|
import org.mariotaku.twidere.api.twitter.model.User;
|
|
import org.mariotaku.twidere.api.twitter.model.UserList;
|
|
import org.mariotaku.twidere.fragment.CreateUserListDialogFragment;
|
|
import org.mariotaku.twidere.fragment.SupportProgressDialogFragment;
|
|
import org.mariotaku.twidere.model.ParcelableUser;
|
|
import org.mariotaku.twidere.model.ParcelableUserList;
|
|
import org.mariotaku.twidere.model.SingleResponse;
|
|
import org.mariotaku.twidere.model.UserKey;
|
|
import org.mariotaku.twidere.model.message.UserListCreatedEvent;
|
|
import org.mariotaku.twidere.model.util.ParcelableUserListUtils;
|
|
import org.mariotaku.twidere.model.util.ParcelableUserUtils;
|
|
import org.mariotaku.twidere.util.AsyncTaskUtils;
|
|
import org.mariotaku.twidere.util.ParseUtils;
|
|
import org.mariotaku.twidere.util.TwitterAPIFactory;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import static android.text.TextUtils.isEmpty;
|
|
import static org.mariotaku.twidere.util.DataStoreUtils.getAccountScreenName;
|
|
|
|
public class UserListSelectorActivity extends BaseActivity implements OnClickListener,
|
|
OnItemClickListener {
|
|
|
|
private AutoCompleteTextView mEditScreenName;
|
|
private ListView mUserListsListView, mUsersListView;
|
|
private SimpleParcelableUserListsAdapter mUserListsAdapter;
|
|
private SimpleParcelableUsersAdapter mUsersAdapter;
|
|
private View mUsersListContainer, mUserListsContainer, mCreateUserListContainer;
|
|
|
|
private String mScreenName;
|
|
|
|
private Runnable mResumeFragmentRunnable;
|
|
private boolean mFragmentsResumed;
|
|
|
|
@Override
|
|
public void onClick(final View v) {
|
|
switch (v.getId()) {
|
|
case R.id.screen_name_confirm: {
|
|
final String screen_name = ParseUtils.parseString(mEditScreenName.getText());
|
|
if (isEmpty(screen_name)) return;
|
|
searchUser(screen_name);
|
|
break;
|
|
}
|
|
case R.id.create_list: {
|
|
final DialogFragment f = new CreateUserListDialogFragment();
|
|
final Bundle args = new Bundle();
|
|
args.putParcelable(EXTRA_ACCOUNT_KEY, getAccountKey());
|
|
f.setArguments(args);
|
|
f.show(getSupportFragmentManager(), null);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onContentChanged() {
|
|
super.onContentChanged();
|
|
mUsersListContainer = findViewById(R.id.users_list_container);
|
|
mUserListsContainer = findViewById(R.id.user_lists_container);
|
|
mEditScreenName = (AutoCompleteTextView) findViewById(R.id.edit_screen_name);
|
|
mUserListsListView = (ListView) findViewById(R.id.user_lists_list);
|
|
mUsersListView = (ListView) findViewById(R.id.users_list);
|
|
mCreateUserListContainer = findViewById(R.id.create_list_container);
|
|
}
|
|
|
|
@Override
|
|
public void onItemClick(final AdapterView<?> view, final View child, final int position, final long id) {
|
|
final int view_id = view.getId();
|
|
final ListView list = (ListView) view;
|
|
if (view_id == R.id.users_list) {
|
|
final ParcelableUser user = mUsersAdapter.getItem(position - list.getHeaderViewsCount());
|
|
if (user == null) return;
|
|
if (isSelectingUser()) {
|
|
final Intent data = new Intent();
|
|
data.setExtrasClassLoader(getClassLoader());
|
|
data.putExtra(EXTRA_USER, user);
|
|
setResult(RESULT_OK, data);
|
|
finish();
|
|
} else {
|
|
getUserLists(user.screen_name);
|
|
}
|
|
} else if (view_id == R.id.user_lists_list) {
|
|
final Intent data = new Intent();
|
|
data.putExtra(EXTRA_USER_LIST, mUserListsAdapter.getItem(position - list.getHeaderViewsCount()));
|
|
setResult(RESULT_OK, data);
|
|
finish();
|
|
}
|
|
}
|
|
|
|
public void setUsersData(final List<ParcelableUser> data) {
|
|
mUsersAdapter.setData(data, true);
|
|
mUsersListContainer.setVisibility(View.VISIBLE);
|
|
mUserListsContainer.setVisibility(View.GONE);
|
|
}
|
|
|
|
@Override
|
|
protected void onCreate(final Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
final Intent intent = getIntent();
|
|
if (!intent.hasExtra(EXTRA_ACCOUNT_KEY)) {
|
|
finish();
|
|
return;
|
|
}
|
|
setContentView(R.layout.activity_user_list_selector);
|
|
if (savedInstanceState == null) {
|
|
mScreenName = intent.getStringExtra(EXTRA_SCREEN_NAME);
|
|
} else {
|
|
mScreenName = savedInstanceState.getString(EXTRA_SCREEN_NAME);
|
|
}
|
|
|
|
final boolean selecting_user = isSelectingUser();
|
|
setTitle(selecting_user ? R.string.select_user : R.string.select_user_list);
|
|
if (!isEmpty(mScreenName)) {
|
|
if (selecting_user) {
|
|
searchUser(mScreenName);
|
|
} else {
|
|
getUserLists(mScreenName);
|
|
}
|
|
}
|
|
final UserAutoCompleteAdapter adapter = new UserAutoCompleteAdapter(this);
|
|
adapter.setAccountKey(getAccountKey());
|
|
mEditScreenName.setAdapter(adapter);
|
|
mEditScreenName.setText(mScreenName);
|
|
mUserListsListView.setAdapter(mUserListsAdapter = new SimpleParcelableUserListsAdapter(this));
|
|
mUsersListView.setAdapter(mUsersAdapter = new SimpleParcelableUsersAdapter(this));
|
|
mUserListsListView.setOnItemClickListener(this);
|
|
mUsersListView.setOnItemClickListener(this);
|
|
if (selecting_user) {
|
|
mUsersListContainer.setVisibility(View.VISIBLE);
|
|
mUserListsContainer.setVisibility(View.GONE);
|
|
} else {
|
|
mUsersListContainer.setVisibility(isEmpty(mScreenName) ? View.VISIBLE : View.GONE);
|
|
mUserListsContainer.setVisibility(isEmpty(mScreenName) ? View.GONE : View.VISIBLE);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onSaveInstanceState(final Bundle outState) {
|
|
super.onSaveInstanceState(outState);
|
|
outState.putString(EXTRA_SCREEN_NAME, mScreenName);
|
|
}
|
|
|
|
@Override
|
|
protected void onStart() {
|
|
super.onStart();
|
|
mBus.register(this);
|
|
}
|
|
|
|
@Override
|
|
protected void onStop() {
|
|
mBus.unregister(this);
|
|
super.onStop();
|
|
}
|
|
|
|
@Subscribe
|
|
public void onUserListCreated(UserListCreatedEvent event) {
|
|
getUserLists(mScreenName);
|
|
}
|
|
|
|
private UserKey getAccountKey() {
|
|
return getIntent().getParcelableExtra(EXTRA_ACCOUNT_KEY);
|
|
}
|
|
|
|
private void getUserLists(final String screenName) {
|
|
if (screenName == null) return;
|
|
mScreenName = screenName;
|
|
final GetUserListsTask task = new GetUserListsTask(this, getAccountKey(), screenName);
|
|
AsyncTaskUtils.executeTask(task);
|
|
}
|
|
|
|
private boolean isSelectingUser() {
|
|
return INTENT_ACTION_SELECT_USER.equals(getIntent().getAction());
|
|
}
|
|
|
|
private void searchUser(final String name) {
|
|
final SearchUsersTask task = new SearchUsersTask(this, getAccountKey(), name);
|
|
AsyncTaskUtils.executeTask(task);
|
|
}
|
|
|
|
private void setUserListsData(final List<ParcelableUserList> data, final boolean isMyAccount) {
|
|
mUserListsAdapter.setData(data, true);
|
|
mUsersListContainer.setVisibility(View.GONE);
|
|
mUserListsContainer.setVisibility(View.VISIBLE);
|
|
mCreateUserListContainer.setVisibility(isMyAccount ? View.VISIBLE : View.GONE);
|
|
}
|
|
|
|
@Override
|
|
protected void onResumeFragments() {
|
|
super.onResumeFragments();
|
|
if (!mFragmentsResumed && mResumeFragmentRunnable != null) {
|
|
mResumeFragmentRunnable.run();
|
|
}
|
|
mFragmentsResumed = true;
|
|
}
|
|
|
|
@Override
|
|
protected void onPause() {
|
|
mFragmentsResumed = false;
|
|
super.onPause();
|
|
}
|
|
|
|
private void dismissDialogFragment(final String tag) {
|
|
mResumeFragmentRunnable = new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
final FragmentManager fm = getSupportFragmentManager();
|
|
final Fragment f = fm.findFragmentByTag(tag);
|
|
if (f instanceof DialogFragment) {
|
|
((DialogFragment) f).dismiss();
|
|
}
|
|
mResumeFragmentRunnable = null;
|
|
}
|
|
};
|
|
if (mFragmentsResumed) {
|
|
mResumeFragmentRunnable.run();
|
|
}
|
|
}
|
|
|
|
private void showDialogFragment(final DialogFragment df, final String tag) {
|
|
mResumeFragmentRunnable = new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
df.show(getSupportFragmentManager(), tag);
|
|
mResumeFragmentRunnable = null;
|
|
}
|
|
};
|
|
if (mFragmentsResumed) {
|
|
mResumeFragmentRunnable.run();
|
|
}
|
|
}
|
|
|
|
private static class GetUserListsTask extends AsyncTask<Object, Object, SingleResponse<List<ParcelableUserList>>> {
|
|
|
|
private static final String FRAGMENT_TAG_GET_USER_LISTS = "get_user_lists";
|
|
|
|
private final UserListSelectorActivity mActivity;
|
|
private final UserKey mAccountKey;
|
|
private final String mScreenName;
|
|
|
|
GetUserListsTask(final UserListSelectorActivity activity, final UserKey accountKey,
|
|
final String screenName) {
|
|
mActivity = activity;
|
|
mAccountKey = accountKey;
|
|
mScreenName = screenName;
|
|
}
|
|
|
|
@Override
|
|
protected SingleResponse<List<ParcelableUserList>> doInBackground(final Object... params) {
|
|
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mActivity, mAccountKey, false);
|
|
if (twitter == null) return SingleResponse.getInstance();
|
|
try {
|
|
final ResponseList<UserList> lists = twitter.getUserLists(mScreenName, true);
|
|
final List<ParcelableUserList> data = new ArrayList<>();
|
|
boolean isMyAccount = mScreenName.equalsIgnoreCase(getAccountScreenName(mActivity,
|
|
mAccountKey));
|
|
for (final UserList item : lists) {
|
|
final User user = item.getUser();
|
|
if (user != null && mScreenName.equalsIgnoreCase(user.getScreenName())) {
|
|
if (!isMyAccount && TextUtils.equals(user.getId(), mAccountKey.getId())) {
|
|
isMyAccount = true;
|
|
}
|
|
data.add(ParcelableUserListUtils.from(item, mAccountKey));
|
|
}
|
|
}
|
|
final SingleResponse<List<ParcelableUserList>> result = SingleResponse.getInstance(data);
|
|
result.getExtras().putBoolean(EXTRA_IS_MY_ACCOUNT, isMyAccount);
|
|
return result;
|
|
} catch (final TwitterException e) {
|
|
Log.w(LOGTAG, e);
|
|
return SingleResponse.getInstance(e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onPostExecute(final SingleResponse<List<ParcelableUserList>> result) {
|
|
mActivity.dismissDialogFragment(FRAGMENT_TAG_GET_USER_LISTS);
|
|
if (result.getData() != null) {
|
|
mActivity.setUserListsData(result.getData(), result.getExtras().getBoolean(EXTRA_IS_MY_ACCOUNT));
|
|
} else if (result.getException() instanceof TwitterException) {
|
|
final TwitterException te = (TwitterException) result.getException();
|
|
if (te.getStatusCode() == HttpResponseCode.NOT_FOUND) {
|
|
mActivity.searchUser(mScreenName);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onPreExecute() {
|
|
final SupportProgressDialogFragment df = new SupportProgressDialogFragment();
|
|
df.setCancelable(false);
|
|
mActivity.showDialogFragment(df, FRAGMENT_TAG_GET_USER_LISTS);
|
|
}
|
|
|
|
}
|
|
|
|
private static class SearchUsersTask extends AsyncTask<Object, Object, SingleResponse<List<ParcelableUser>>> {
|
|
|
|
private static final String FRAGMENT_TAG_SEARCH_USERS = "search_users";
|
|
private final UserListSelectorActivity mActivity;
|
|
|
|
private final UserKey mAccountKey;
|
|
private final String mName;
|
|
|
|
SearchUsersTask(final UserListSelectorActivity activity, final UserKey accountKey,
|
|
final String name) {
|
|
mActivity = activity;
|
|
mAccountKey = accountKey;
|
|
mName = name;
|
|
}
|
|
|
|
@Override
|
|
protected SingleResponse<List<ParcelableUser>> doInBackground(final Object... params) {
|
|
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mActivity, mAccountKey, false);
|
|
if (twitter == null) return SingleResponse.getInstance();
|
|
try {
|
|
final Paging paging = new Paging();
|
|
final ResponseList<User> lists = twitter.searchUsers(mName, paging);
|
|
final List<ParcelableUser> data = new ArrayList<>();
|
|
for (final User item : lists) {
|
|
data.add(ParcelableUserUtils.fromUser(item, mAccountKey));
|
|
}
|
|
return SingleResponse.getInstance(data);
|
|
} catch (final TwitterException e) {
|
|
Log.w(LOGTAG, e);
|
|
return SingleResponse.getInstance(e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onPostExecute(final SingleResponse<List<ParcelableUser>> result) {
|
|
mActivity.dismissDialogFragment(FRAGMENT_TAG_SEARCH_USERS);
|
|
if (result.getData() != null) {
|
|
mActivity.setUsersData(result.getData());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onPreExecute() {
|
|
final SupportProgressDialogFragment df = new SupportProgressDialogFragment();
|
|
df.setCancelable(false);
|
|
mActivity.showDialogFragment(df, FRAGMENT_TAG_SEARCH_USERS);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|