Java tutorial
/* * Tweetings - Twitter client for Android * * Copyright (C) 2012-2013 RBD Solutions Limited <apps@tweetings.net> * Copyright (C) 2012 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 com.dwdesign.tweetings.fragment; import static com.dwdesign.tweetings.util.Utils.findUserList; import static com.dwdesign.tweetings.util.Utils.getAccountColor; import static com.dwdesign.tweetings.util.Utils.getActivatedAccountIds; import static com.dwdesign.tweetings.util.Utils.getBiggerTwitterProfileImage; import static com.dwdesign.tweetings.util.Utils.getTwitterInstance; import static com.dwdesign.tweetings.util.Utils.isMyActivatedAccount; import static com.dwdesign.tweetings.util.Utils.isNullOrEmpty; import static com.dwdesign.tweetings.util.Utils.openTweetSearch; import static com.dwdesign.tweetings.util.Utils.openUserListMembers; import static com.dwdesign.tweetings.util.Utils.openUserListSubscribers; import static com.dwdesign.tweetings.util.Utils.openUserListTimeline; import static com.dwdesign.tweetings.util.Utils.openUserProfile; import static com.dwdesign.tweetings.util.Utils.parseArguments; import static com.dwdesign.tweetings.util.Utils.parseString; import static com.dwdesign.tweetings.util.Utils.parseURL; import static com.dwdesign.tweetings.util.Utils.showErrorToast; import com.dwdesign.popupmenu.PopupMenu; import com.dwdesign.popupmenu.PopupMenu.OnMenuItemClickListener; import com.dwdesign.tweetings.R; import com.dwdesign.tweetings.adapter.ListActionAdapter; import com.dwdesign.tweetings.adapter.UserAutoCompleteAdapter; import com.dwdesign.tweetings.fragment.CustomTabsFragment.CustomTabsAdapter; import com.dwdesign.tweetings.model.ListAction; import com.dwdesign.tweetings.model.Panes; import com.dwdesign.tweetings.model.ParcelableUserList; import com.dwdesign.tweetings.provider.TweetStore.Tabs; import com.dwdesign.tweetings.util.ImageLoaderWrapper; import com.dwdesign.tweetings.util.ServiceInterface; import com.dwdesign.tweetings.util.TwidereLinkify; import com.dwdesign.tweetings.util.TwidereLinkify.OnLinkClickListener; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.User; import twitter4j.UserList; import twitter4j.internal.org.json.JSONObject; import android.app.AlertDialog; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.text.InputFilter; import android.text.method.LinkMovementMethod; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.support.v4.content.AsyncTaskLoader; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; public class UserListDetailsFragment extends BaseListFragment implements OnClickListener, OnLongClickListener, OnItemClickListener, OnItemLongClickListener, OnLinkClickListener, OnMenuItemClickListener, LoaderCallbacks<UserListDetailsFragment.Response<UserList>>, Panes.Right { public Loader<Response<UserList>> onCreateLoader(final int id, final Bundle args) { mListContainer.setVisibility(View.VISIBLE); mErrorMessageView.setText(null); mErrorMessageView.setVisibility(View.GONE); mErrorRetryContainer.setVisibility(View.GONE); setListShown(false); setProgressBarIndeterminateVisibility(true); long account_id = -1, user_id = -1; int list_id = -1; String screen_name = null, list_name = null; if (args != null) { account_id = args.getLong(INTENT_KEY_ACCOUNT_ID, -1); user_id = args.getLong(INTENT_KEY_USER_ID, -1); list_id = args.getInt(INTENT_KEY_LIST_ID, -1); list_name = args.getString(INTENT_KEY_LIST_NAME); screen_name = args.getString(INTENT_KEY_SCREEN_NAME); } return new ListInfoLoader(getActivity(), account_id, list_id, list_name, user_id, screen_name); } public void onLoadFinished(final Loader<Response<UserList>> loader, final Response<UserList> data) { if (data == null) return; if (getActivity() == null) return; if (data.value != null) { final UserList user = data.value; setListShown(true); changeUserList(mAccountId, user); mErrorRetryContainer.setVisibility(View.GONE); } else { if (data.exception != null) { mErrorMessageView.setText(data.exception.getMessage()); mErrorMessageView.setVisibility(View.VISIBLE); } mListContainer.setVisibility(View.GONE); mErrorRetryContainer.setVisibility(View.VISIBLE); } setProgressBarIndeterminateVisibility(false); } public void onLoaderReset(final Loader<Response<UserList>> loader) { // TODO: Implement this method } private ImageLoaderWrapper mProfileImageLoader; private ImageView mProfileImageView; private TextView mListNameView, mUserNameView, mDescriptionView, mErrorMessageView; private View mNameContainer, mProfileImageContainer, mDescriptionContainer; private Button mFollowMoreButton, mRetryButton; private ListActionAdapter mAdapter; private ListView mListView; private View mHeaderView; private long mAccountId, mUserId; private final DialogFragment mAddMemberDialogFragment = new AddMemberDialogFragment(), mEditUserListDialogFragment = new EditUserListDialogFragment(); private UserList mUserList = null; private int mUserListId; private String mUserName, mUserScreenName, mListName, mListSlug; private ServiceInterface mService; private SharedPreferences mPreferences; private boolean mDisplayName; private PopupMenu mPopupMenu; private final BroadcastReceiver mStatusReceiver = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { final String action = intent.getAction(); if (BROADCAST_USER_LIST_DETAILS_UPDATED.equals(action)) { if (intent.getIntExtra(INTENT_KEY_LIST_ID, -1) == mUserListId && intent.getBooleanExtra(INTENT_KEY_SUCCEED, false)) { reloadUserListInfo(); } } else if (BROADCAST_USER_LIST_SUBSCRIPTION_CHANGED.equals(action)) { if (intent.getIntExtra(INTENT_KEY_LIST_ID, -1) == mUserListId && intent.getBooleanExtra(INTENT_KEY_SUCCEED, false)) { reloadUserListInfo(); } } } }; private View mListContainer, mErrorRetryContainer; public void changeUserList(final long account_id, final UserList user_list) { if (user_list == null || getActivity() == null || !isMyActivatedAccount(getActivity(), account_id)) return; getLoaderManager().destroyLoader(0); final User user = user_list.getUser(); if (user == null) return; final boolean is_my_activated_account = isMyActivatedAccount(getActivity(), user_list.getId()); mErrorRetryContainer.setVisibility(View.GONE); mAccountId = account_id; mUserListId = user_list.getId(); mUserName = user.getName(); mUserId = user.getId(); mUserScreenName = user.getScreenName(); mListName = user_list.getName(); mListSlug = user_list.getSlug(); final boolean is_multiple_account_enabled = getActivatedAccountIds(getActivity()).length > 1; mListView.setBackgroundResource(is_multiple_account_enabled ? R.drawable.ic_label_account_nopadding : 0); if (is_multiple_account_enabled) { final Drawable d = mListView.getBackground(); if (d != null) { d.mutate().setColorFilter(getAccountColor(getActivity(), account_id), PorterDuff.Mode.MULTIPLY); mListView.invalidate(); } } mListNameView.setText(mListName); mUserNameView.setText(mDisplayName ? mUserName : mUserScreenName); final String description = user_list.getDescription(); mDescriptionContainer .setVisibility(is_my_activated_account || !isNullOrEmpty(description) ? View.VISIBLE : View.GONE); mDescriptionContainer.setOnLongClickListener(this); mDescriptionView.setText(description); final TwidereLinkify linkify = new TwidereLinkify(mDescriptionView); linkify.setOnLinkClickListener(this); linkify.addAllLinks(); mDescriptionView.setMovementMethod(LinkMovementMethod.getInstance()); final String profile_image_url_string = parseString(user.getProfileImageURL()); final boolean hires_profile_image = getResources().getBoolean(R.bool.hires_profile_image); mProfileImageLoader.displayProfileImage(mProfileImageView, hires_profile_image ? getBiggerTwitterProfileImage(profile_image_url_string) : profile_image_url_string); mUserList = user_list; //if (mUserId == mAccountId) { mFollowMoreButton.setText(R.string.more); mFollowMoreButton.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.expander_open_holo, 0); //} else { // mFollowMoreButton.setText(user_list.isFollowing() ? R.string.unfollow : R.string.follow); // mFollowMoreButton.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); //} mAdapter.notifyDataSetChanged(); } public void getUserListInfo(final boolean init, final long account_id, final int list_id, final String list_name, final long user_id, final String screen_name) { mAccountId = account_id; mUserListId = list_id; mUserName = screen_name; getLoaderManager().destroyLoader(0); if (!isMyActivatedAccount(getActivity(), mAccountId)) { mListContainer.setVisibility(View.GONE); mErrorRetryContainer.setVisibility(View.GONE); return; } if (list_id > 0 || list_name != null && (user_id > 0 || screen_name != null)) { } else { mListContainer.setVisibility(View.GONE); mErrorRetryContainer.setVisibility(View.GONE); return; } final Bundle args = new Bundle(); args.putLong(INTENT_KEY_ACCOUNT_ID, account_id); args.putLong(INTENT_KEY_USER_ID, user_id); args.putInt(INTENT_KEY_LIST_ID, list_id); args.putString(INTENT_KEY_LIST_NAME, list_name); args.putString(INTENT_KEY_SCREEN_NAME, screen_name); if (init) { getLoaderManager().initLoader(0, args, this); } else { getLoaderManager().restartLoader(0, args, this); } } @Override public void onActivityCreated(final Bundle savedInstanceState) { mService = getApplication().getServiceInterface(); mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); super.onActivityCreated(savedInstanceState); final Bundle args = getArguments(); long account_id = -1, user_id = -1; int list_id = -1; String screen_name = null, list_name = null; if (args != null) { account_id = args.getLong(INTENT_KEY_ACCOUNT_ID, -1); user_id = args.getLong(INTENT_KEY_USER_ID, -1); list_id = args.getInt(INTENT_KEY_LIST_ID, -1); list_name = args.getString(INTENT_KEY_LIST_NAME); screen_name = args.getString(INTENT_KEY_SCREEN_NAME); } mProfileImageLoader = getApplication().getImageLoaderWrapper(); mAdapter = new ListActionAdapter(getActivity()); mAdapter.add(new ListTimelineAction()); mAdapter.add(new ListMembersAction()); mAdapter.add(new ListSubscribersAction()); mProfileImageContainer.setOnClickListener(this); mProfileImageContainer.setOnLongClickListener(this); mNameContainer.setOnClickListener(this); mNameContainer.setOnLongClickListener(this); mFollowMoreButton.setOnClickListener(this); mRetryButton.setOnClickListener(this); setListAdapter(null); mListView = getListView(); mListView.addHeaderView(mHeaderView, null, false); mListView.setOnItemClickListener(this); mListView.setOnItemLongClickListener(this); setListAdapter(mAdapter); getUserListInfo(true, account_id, list_id, list_name, user_id, screen_name); } @Override public void onClick(final View view) { switch (view.getId()) { case R.id.follow_more: { if (mUserList == null) return; /*if (mAccountId != mUserId) { mFollowMoreButton.setVisibility(View.GONE); if (mUserList.isFollowing()) { mService.destroyUserListSubscription(mAccountId, mUserList.getId()); } else { mService.createUserListSubscription(mAccountId, mUserList.getId()); } } else {*/ mPopupMenu = PopupMenu.getInstance(getActivity(), view); mPopupMenu.inflate(R.menu.action_user_list_details); if (mUserId == mAccountId) { final MenuItem followItem = mPopupMenu.getMenu().findItem(MENU_FOLLOW); followItem.setVisible(false); } else { final MenuItem followItem = mPopupMenu.getMenu().findItem(MENU_FOLLOW); followItem.setTitle(mUserList.isFollowing() ? R.string.unfollow : R.string.follow); final MenuItem addMemberItem = mPopupMenu.getMenu().findItem(MENU_ADD); addMemberItem.setVisible(false); final MenuItem deleteItem = mPopupMenu.getMenu().findItem(MENU_DELETE_SUBMENU); deleteItem.setVisible(false); } mPopupMenu.setOnMenuItemClickListener(this); mPopupMenu.show(); //} break; } case R.id.retry: { reloadUserListInfo(); break; } case R.id.profile_image_container: { if (mAccountId > 0 && (mUserId > 0 || mUserScreenName != null)) { openUserProfile(getActivity(), mAccountId, mUserId, mUserScreenName); } break; } } } @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { mHeaderView = inflater.inflate(R.layout.user_list_detail_header, null); mNameContainer = mHeaderView.findViewById(R.id.name_container); mListNameView = (TextView) mHeaderView.findViewById(R.id.list_name); mUserNameView = (TextView) mHeaderView.findViewById(R.id.user_name); mDescriptionView = (TextView) mHeaderView.findViewById(R.id.description); mProfileImageView = (ImageView) mHeaderView.findViewById(R.id.profile_image); mProfileImageContainer = mHeaderView.findViewById(R.id.profile_image_container); mDescriptionContainer = mHeaderView.findViewById(R.id.description_container); mFollowMoreButton = (Button) mHeaderView.findViewById(R.id.follow_more); mListContainer = super.onCreateView(inflater, container, savedInstanceState); final View container_view = inflater.inflate(R.layout.list_with_error_message, null); ((FrameLayout) container_view.findViewById(R.id.list_container)).addView(mListContainer); mErrorRetryContainer = container_view.findViewById(R.id.error_retry_container); mRetryButton = (Button) container_view.findViewById(R.id.retry); mErrorMessageView = (TextView) container_view.findViewById(R.id.error_message); return container_view; } @Override public void onDestroyView() { mUserList = null; getLoaderManager().destroyLoader(0); super.onDestroyView(); } @Override public void onItemClick(final AdapterView<?> adapter, final View view, final int position, final long id) { final ListAction action = mAdapter.findItem(id); if (action != null) { action.onClick(); } } @Override public boolean onItemLongClick(final AdapterView<?> adapter, final View view, final int position, final long id) { final ListAction action = mAdapter.findItem(id); if (action != null) return action.onLongClick(); return false; } @Override public void onLinkClick(final String link, final int type) { if (mUserList == null) return; switch (type) { case TwidereLinkify.LINK_TYPE_MENTION_LIST: { openUserProfile(getActivity(), mAccountId, -1, link); break; } case TwidereLinkify.LINK_TYPE_HASHTAG: { openTweetSearch(getActivity(), mAccountId, link); break; } case TwidereLinkify.LINK_TYPE_LINK_WITH_IMAGE_EXTENSION: { final Intent intent = new Intent(INTENT_ACTION_VIEW_IMAGE, Uri.parse(link)); intent.setPackage(getActivity().getPackageName()); startActivity(intent); break; } case TwidereLinkify.LINK_TYPE_LINK: { final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); startActivity(intent); break; } case TwidereLinkify.LINK_TYPE_LIST: { final String[] mention_list = link.split("\\/"); if (mention_list == null || mention_list.length != 2) { break; } break; } } } @Override public boolean onLongClick(final View view) { if (mUserList == null) return false; final boolean is_my_activated_account = isMyActivatedAccount(getActivity(), mUserId); if (!is_my_activated_account) return false; switch (view.getId()) { case R.id.name_container: case R.id.description_container: final Bundle args = new Bundle(); args.putLong(INTENT_KEY_ACCOUNT_ID, mAccountId); args.putString(INTENT_KEY_LIST_NAME, mUserList.getName()); args.putString(INTENT_KEY_DESCRIPTION, mUserList.getDescription()); args.putString(INTENT_KEY_TITLE, getString(R.string.description)); args.putBoolean(INTENT_KEY_IS_PUBLIC, mUserList.isPublic()); args.putInt(INTENT_KEY_LIST_ID, mUserList.getId()); mEditUserListDialogFragment.setArguments(args); mEditUserListDialogFragment.show(getFragmentManager(), "edit_user_list_details"); return true; } return false; } @Override public boolean onMenuItemClick(final MenuItem item) { switch (item.getItemId()) { case MENU_FOLLOW: { if (mAccountId != mUserId) { if (mUserList.isFollowing()) { mService.destroyUserListSubscription(mAccountId, mUserList.getId()); } else { mService.createUserListSubscription(mAccountId, mUserList.getId()); } } break; } case MENU_ADD: { final Bundle args = new Bundle(); args.putLong(INTENT_KEY_ACCOUNT_ID, mAccountId); args.putString(INTENT_KEY_TEXT, ""); args.putInt(INTENT_KEY_LIST_ID, mUserList.getId()); mAddMemberDialogFragment.setArguments(args); mAddMemberDialogFragment.show(getFragmentManager(), "add_member"); break; } case MENU_ADD_TAB: { CustomTabsAdapter mAdapter; mAdapter = new CustomTabsAdapter(getActivity()); ContentResolver mResolver; mResolver = getContentResolver(); final String tabName = mListName; final String tabType = AUTHORITY_LIST_TIMELINE; final String tabIcon = "list"; final long account_id = mAccountId; final String tabScreenName = mUserScreenName; final String tabListName = mListName; final String tabArguments = "{\"account_id\":" + account_id + ",\"screen_name\":\"" + tabScreenName + "\",\"list_name\":" + JSONObject.quote(tabListName) + "}"; final ContentValues values = new ContentValues(); values.put(Tabs.ARGUMENTS, tabArguments); values.put(Tabs.NAME, tabName); values.put(Tabs.POSITION, mAdapter.getCount()); values.put(Tabs.TYPE, tabType); values.put(Tabs.ICON, tabIcon); mResolver.insert(Tabs.CONTENT_URI, values); Toast.makeText(this.getActivity(), R.string.list_tab_added, Toast.LENGTH_SHORT).show(); break; } case MENU_DELETE: { if (mUserId != mAccountId) return false; mService.destroyUserList(mAccountId, mUserListId); break; } case MENU_EXTENSIONS: { final Intent intent = new Intent(INTENT_ACTION_EXTENSION_OPEN_USER_LIST); final Bundle extras = new Bundle(); extras.putParcelable(INTENT_KEY_USER_LIST, new ParcelableUserList(mUserList, mAccountId)); intent.putExtras(extras); startActivity(Intent.createChooser(intent, getString(R.string.open_with_extensions))); break; } } return true; } @Override public void onStart() { mDisplayName = mPreferences.getBoolean(PREFERENCE_KEY_DISPLAY_NAME, false); super.onStart(); final IntentFilter filter = new IntentFilter(BROADCAST_USER_LIST_DETAILS_UPDATED); filter.addAction(BROADCAST_USER_LIST_SUBSCRIPTION_CHANGED); registerReceiver(mStatusReceiver, filter); } @Override public void onStop() { unregisterReceiver(mStatusReceiver); super.onStop(); } private void reloadUserListInfo() { getUserListInfo(false, mAccountId, mUserListId, mUserName, mUserId, mUserName); } public static class AddMemberDialogFragment extends BaseDialogFragment implements DialogInterface.OnClickListener { private AutoCompleteTextView mEditText; private String mText; private long mAccountId; private ServiceInterface mService; private int mListId; private UserAutoCompleteAdapter mUserAutoCompleteAdapter; @Override public void onClick(final DialogInterface dialog, final int which) { if (mListId <= 0 || mAccountId <= 0) return; switch (which) { case DialogInterface.BUTTON_POSITIVE: { mText = parseString(mEditText.getText()); if (mText == null || mText.length() <= 0) return; mService.addUserListMember(mAccountId, mListId, -1, mText); break; } } } @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { mService = getApplication().getServiceInterface(); final Bundle bundle = savedInstanceState == null ? getArguments() : savedInstanceState; mAccountId = bundle != null ? bundle.getLong(INTENT_KEY_ACCOUNT_ID, -1) : -1; mListId = bundle != null ? bundle.getInt(INTENT_KEY_LIST_ID, -1) : -1; mText = bundle != null ? bundle.getString(INTENT_KEY_TEXT) : null; final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); final View view = LayoutInflater.from(getActivity()) .inflate(R.layout.auto_complete_textview_default_style, null); builder.setView(view); mEditText = (AutoCompleteTextView) view.findViewById(R.id.edit_text); if (mText != null) { mEditText.setText(mText); } mUserAutoCompleteAdapter = new UserAutoCompleteAdapter(getActivity()); mEditText.setAdapter(mUserAutoCompleteAdapter); mEditText.setThreshold(1); mEditText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(20) }); builder.setTitle(R.string.screen_name); builder.setPositiveButton(android.R.string.ok, this); builder.setNegativeButton(android.R.string.cancel, this); return builder.create(); } @Override public void onSaveInstanceState(final Bundle outState) { outState.putLong(INTENT_KEY_ACCOUNT_ID, mAccountId); outState.putInt(INTENT_KEY_LIST_ID, mListId); outState.putString(INTENT_KEY_TEXT, mText); super.onSaveInstanceState(outState); } } public static class EditUserListDialogFragment extends BaseDialogFragment implements DialogInterface.OnClickListener { private EditText mEditName, mEditDescription; private CheckBox mPublicCheckBox; private String mName, mDescription; private long mAccountId; private int mListId; private boolean mIsPublic; private ServiceInterface mService; @Override public void onClick(final DialogInterface dialog, final int which) { if (mAccountId <= 0) return; switch (which) { case DialogInterface.BUTTON_POSITIVE: { mName = parseString(mEditName.getText()); mDescription = parseString(mEditDescription.getText()); mIsPublic = mPublicCheckBox.isChecked(); if (mName == null || mName.length() <= 0) return; mService.updateUserListDetails(mAccountId, mListId, mIsPublic, mName, mDescription); break; } } } @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { mService = getApplication().getServiceInterface(); final Bundle bundle = savedInstanceState == null ? getArguments() : savedInstanceState; mAccountId = bundle != null ? bundle.getLong(INTENT_KEY_ACCOUNT_ID, -1) : -1; mListId = bundle != null ? bundle.getInt(INTENT_KEY_LIST_ID, -1) : -1; mName = bundle != null ? bundle.getString(INTENT_KEY_LIST_NAME) : null; mDescription = bundle != null ? bundle.getString(INTENT_KEY_DESCRIPTION) : null; mIsPublic = bundle != null ? bundle.getBoolean(INTENT_KEY_IS_PUBLIC, true) : true; final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); final View view = LayoutInflater.from(getActivity()).inflate(R.layout.user_list_detail_dialog_view, null); builder.setView(view); mEditName = (EditText) view.findViewById(R.id.name); mEditDescription = (EditText) view.findViewById(R.id.description); mPublicCheckBox = (CheckBox) view.findViewById(R.id.is_public); if (mName != null) { mEditName.setText(mName); } if (mDescription != null) { mEditDescription.setText(mDescription); } mPublicCheckBox.setChecked(mIsPublic); builder.setTitle(R.string.user_list); builder.setPositiveButton(android.R.string.ok, this); builder.setNegativeButton(android.R.string.cancel, this); return builder.create(); } @Override public void onSaveInstanceState(final Bundle outState) { outState.putLong(INTENT_KEY_ACCOUNT_ID, mAccountId); outState.putInt(INTENT_KEY_LIST_ID, mListId); outState.putString(INTENT_KEY_LIST_NAME, mName); outState.putString(INTENT_KEY_DESCRIPTION, mDescription); outState.putBoolean(INTENT_KEY_IS_PUBLIC, mIsPublic); super.onSaveInstanceState(outState); } } public static class ListInfoLoader extends AsyncTaskLoader<Response<UserList>> { private final Twitter twitter; private final long user_id; private final int list_id; private final String screen_name, list_name; private ListInfoLoader(final Context context, final long account_id, final int list_id, final String list_name, final long user_id, final String screen_name) { super(context); this.user_id = user_id; this.list_id = list_id; this.screen_name = screen_name; this.list_name = list_name; twitter = getTwitterInstance(context, account_id, true); } @Override public Response<UserList> loadInBackground() { try { if (list_id > 0) return new Response<UserList>(twitter.showUserList(list_id), null); else return new Response<UserList>(findUserList(twitter, user_id, screen_name, list_name), null); } catch (final TwitterException e) { return new Response<UserList>(null, e); } } public void onStartLoading() { forceLoad(); } } class ListMembersAction extends ListAction { @Override public long getId() { return 2; } @Override public String getName() { return getString(R.string.list_members); } @Override public String getSummary() { if (mUserList == null) return null; return String.valueOf(mUserList.getMemberCount()); } @Override public void onClick() { openUserListMembers(getActivity(), mAccountId, mUserListId, mUserId, mUserScreenName, mListName); } } class ListSubscribersAction extends ListAction { @Override public long getId() { return 3; } @Override public String getName() { return getString(R.string.list_subscribers); } @Override public String getSummary() { if (mUserList == null) return null; return String.valueOf(mUserList.getSubscriberCount()); } @Override public void onClick() { openUserListSubscribers(getActivity(), mAccountId, mUserListId, mUserId, mUserScreenName, mListName); } } class ListTimelineAction extends ListAction { @Override public long getId() { return 1; } @Override public String getName() { return getString(R.string.list_timeline); } @Override public void onClick() { if (mUserList == null) return; openUserListTimeline(getActivity(), mAccountId, mUserListId, mUserId, mUserName, mListName); } } static class Response<T> { public final T value; public final TwitterException exception; public Response(final T value, final TwitterException exception) { this.value = value; this.exception = exception; } } }