package com.dwdesign.tweetings.fragment;
import static com.dwdesign.tweetings.util.Utils.getActivatedAccountIds;
import static com.dwdesign.tweetings.util.Utils.getAccountUsername;
import static com.dwdesign.tweetings.util.Utils.openUserListTimeline;
import java.util.ArrayList;
import java.util.List;
import com.dwdesign.popupmenu.PopupMenu.OnMenuItemClickListener;
import com.dwdesign.tweetings.activity.HomeActivity;
import com.dwdesign.tweetings.adapter.SeparatedListAdapter;
import com.dwdesign.tweetings.adapter.UserListsAdapter;
import com.dwdesign.tweetings.app.TweetingsApplication;
import com.dwdesign.tweetings.loader.BaseUserListsLoader;
import com.dwdesign.tweetings.loader.UserListsLoader;
import com.dwdesign.tweetings.model.ListAction;
import com.dwdesign.tweetings.model.Panes;
import com.dwdesign.tweetings.model.ParcelableUserList;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListView;
public class ListsFragment extends BaseListFragment implements
LoaderCallbacks<List<ParcelableUserList>>, OnItemClickListener, OnItemLongClickListener,
Panes.Left, OnMenuItemClickListener {
private SeparatedListAdapter<UserListsAdapter> mAdapter;
private SharedPreferences mPreferences;
private ListView mListView;
private TweetingsApplication mApplication;
private long mCursor = -1;
private Fragment mDetailFragment;
private final BroadcastReceiver mStatusReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
final String action = intent.getAction();
if (BROADCAST_ACCOUNT_LIST_DATABASE_UPDATED.equals(action)) {
if (!getLoaderManager().hasRunningLoaders()) {
ListsFragment.this.resetLists();
}
}
}
};
public void resetLists() {
mAdapter.clear();
final long[] activated_ids = getActivatedAccountIds(getActivity());
int i = 0;
for (final long account_id : activated_ids) {
UserListsAdapter listAdapter = new UserListsAdapter(getActivity());
String user_name = getAccountUsername(getActivity(), account_id);
final float text_size = mPreferences.getFloat(PREFERENCE_KEY_TEXT_SIZE, PREFERENCE_DEFAULT_TEXT_SIZE);
final boolean display_profile_image = mPreferences.getBoolean(PREFERENCE_KEY_DISPLAY_PROFILE_IMAGE, true);
final boolean display_name = mPreferences.getBoolean(PREFERENCE_KEY_DISPLAY_NAME, false);
listAdapter.setDisplayProfileImage(display_profile_image);
listAdapter.setTextSize(text_size);
listAdapter.setDisplayName(display_name);
mAdapter.addSection("@" + user_name, listAdapter);
final Bundle args = new Bundle();
args.putLong(INTENT_KEY_ACCOUNT_ID, account_id);
args.putLong(INTENT_KEY_USER_ID, account_id);
args.putString(INTENT_KEY_SCREEN_NAME, user_name);
args.putInt(INTENT_KEY_POSITION, i);
try {
getLoaderManager().destroyLoader(i);
} catch (Exception e) {
}
getLoaderManager().initLoader(i, args, this);
i++;
}
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mApplication = getApplication();
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
mAdapter = new SeparatedListAdapter<UserListsAdapter>(getActivity());
resetLists();
mListView = getListView();
setListAdapter(mAdapter);
mListView.setOnItemClickListener(this);
mListView.setOnItemLongClickListener(this);
}
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public final void onItemClick(final AdapterView<?> adapter, final View view, final int position, final long id) {
final Object obj = mAdapter.getItem(position);
final ParcelableUserList list = (ParcelableUserList) obj;
openUserListTimeline(getActivity(), list.account_id, list.list_id, list.user_id, list.user_name, list.name);
}
@Override
public boolean onItemLongClick(final AdapterView<?> parent, final View view, final int position, final long id) {
final Object obj = mAdapter.getItem(position);
final ParcelableUserList list = (ParcelableUserList) obj;
openUserListDetails(getActivity(), list.account_id, list.list_id, list.user_id,
list.user_screen_name, list.name);
return true;
}
private void openUserListDetails(final Activity activity, final long account_id, final int list_id, final long user_id, final String screen_name,
final String list_name) {
if (activity == null) return;
if (activity instanceof HomeActivity && ((HomeActivity) activity).isDualPaneMode()) {
final HomeActivity home_activity = (HomeActivity) activity;
if (mDetailFragment instanceof UserProfileFragment && mDetailFragment.isAdded()) {
((UserProfileFragment) mDetailFragment).getUserInfo(account_id, user_id, screen_name);
} else {
mDetailFragment = new UserListDetailsFragment();
final Bundle args = new Bundle();
args.putLong(INTENT_KEY_ACCOUNT_ID, account_id);
args.putInt(INTENT_KEY_LIST_ID, list_id);
args.putLong(INTENT_KEY_USER_ID, user_id);
args.putString(INTENT_KEY_SCREEN_NAME, screen_name);
args.putString(INTENT_KEY_LIST_NAME, list_name);
mDetailFragment.setArguments(args);
home_activity.showAtPane(HomeActivity.PANE_RIGHT, mDetailFragment, true);
}
} else {
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWEETINGS);
builder.authority(AUTHORITY_LIST_DETAILS);
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_ID, String.valueOf(account_id));
if (list_id > 0) {
builder.appendQueryParameter(QUERY_PARAM_LIST_ID, String.valueOf(list_id));
}
if (user_id > 0) {
builder.appendQueryParameter(QUERY_PARAM_USER_ID, String.valueOf(user_id));
}
if (screen_name != null) {
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screen_name);
}
if (list_name != null) {
builder.appendQueryParameter(QUERY_PARAM_LIST_NAME, list_name);
}
activity.startActivity(new Intent(Intent.ACTION_VIEW, builder.build()));
}
}
@Override
public void onStart() {
super.onStart();
//final IntentFilter filter = new IntentFilter(BROADCAST_ACCOUNT_LIST_DATABASE_UPDATED);
//registerReceiver(mStatusReceiver, filter);
}
@Override
public void onStop() {
super.onStop();
//unregisterReceiver(mStatusReceiver);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
return false;
}
public Loader<List<ParcelableUserList>> newLoaderInstance(final long account_id, final long user_id, final String screen_name, final int position) {
return new UserListsLoader(getActivity(), account_id, user_id, screen_name, -1, null, position);
}
@Override
public Loader<List<ParcelableUserList>> onCreateLoader(final int id, final Bundle args) {
setProgressBarIndeterminateVisibility(true);
long account_id = args.getLong(INTENT_KEY_ACCOUNT_ID, -1);
long user_id = args.getLong(INTENT_KEY_USER_ID, -1);
String screen_name = args.getString(INTENT_KEY_SCREEN_NAME);
int position = args.getInt(INTENT_KEY_POSITION, 0);
return newLoaderInstance(account_id, user_id, screen_name, position);
}
@Override
public void onLoaderReset(final Loader<List<ParcelableUserList>> loader) {
setProgressBarIndeterminateVisibility(false);
}
@Override
public void onLoadFinished(final Loader<List<ParcelableUserList>> loader, final List<ParcelableUserList> data) {
setProgressBarIndeterminateVisibility(false);
int position = ((UserListsLoader)loader).getPosition();
if (position >= 0) {
ArrayList<UserListsAdapter> adapters = mAdapter.getAdapters();
try {
UserListsAdapter listAdapter = adapters.get(position);
listAdapter.setData(data, true);
listAdapter.notifyDataSetChanged();
mAdapter.notifyDataSetChanged();
}
catch (Exception e) {
}
}
if (loader instanceof BaseUserListsLoader) {
final long cursor = ((BaseUserListsLoader) loader).getNextCursor();
if (cursor != -2) {
mCursor = cursor;
}
}
setListShown(true);
}
}