package akechi.projectl;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import java.io.EOFException;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import akechi.projectl.async.LingrTaskLoader;
import jp.michikusa.chitose.lingr.LingrClient;
import jp.michikusa.chitose.lingr.LingrClientFactory;
import jp.michikusa.chitose.lingr.LingrException;
import jp.michikusa.chitose.lingr.Room;
public class RoomListFragment
extends Fragment
implements ListView.OnItemClickListener, LoaderManager.LoaderCallbacks<Iterable<String>>, SwipeRefreshLayout.OnRefreshListener
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.getLoaderManager().initLoader(0, null, this);
final AppContext appContext= (AppContext)this.getActivity().getApplicationContext();
if(appContext.getAccount() != null)
{
this.getLoaderManager().getLoader(0).forceLoad();
}
final LocalBroadcastManager lbMan= LocalBroadcastManager.getInstance(this.getActivity().getApplicationContext());
{
final IntentFilter ifilter= new IntentFilter(Event.AccountChange.ACTION);
final BroadcastReceiver receiver= new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent)
{
RoomListFragment.this.swipeRefreshLayout.setRefreshing(true);
RoomListFragment.this.onRefresh();
}
};
lbMan.registerReceiver(receiver, ifilter);
this.receivers.add(receiver);
}
{
final IntentFilter ifilter= new IntentFilter(Event.PreferenceChange.ACTION);
final BroadcastReceiver receiver= new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent)
{
RoomListFragment.this.swipeRefreshLayout.setRefreshing(true);
RoomListFragment.this.onRefresh();
}
};
lbMan.registerReceiver(receiver, ifilter);
this.receivers.add(receiver);
}
}
@Override
public void onDestroy()
{
super.onDestroy();
final LocalBroadcastManager lbMan= LocalBroadcastManager.getInstance(this.getActivity().getApplicationContext());
for(final BroadcastReceiver receiver : this.receivers)
{
lbMan.unregisterReceiver(receiver);
}
this.receivers.clear();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
final View view = inflater.inflate(R.layout.fragment_room_list, container, false);
this.swipeRefreshLayout= (SwipeRefreshLayout) view.findViewById(R.id.swipeRefreshView);
this.swipeRefreshLayout.setOnRefreshListener(this);
this.listView = (ListView)view.findViewById(android.R.id.list);
this.listView.setAdapter(new ArrayAdapter<String>(
this.getActivity(),
android.R.layout.simple_list_item_1,
new String[0]
));
this.listView.setOnItemClickListener(this);
return view;
}
@Override
public void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
final String[] ids= new String[this.listView.getAdapter().getCount()];
for(int i= 0; i < this.listView.getAdapter().getCount(); ++i)
{
ids[i]= (String)this.listView.getAdapter().getItem(i);
}
outState.putStringArray("roomIds", ids);
}
@Override
public void onViewStateRestored(Bundle savedInstanceState)
{
super.onViewStateRestored(savedInstanceState);
if(savedInstanceState == null)
{
return;
}
final String[] ids= savedInstanceState.getStringArray("roomIds");
this.listView.setAdapter(new ArrayAdapter<String>(
this.getActivity(),
android.R.layout.simple_list_item_1,
ids
));
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final CharSequence roomId= (CharSequence) this.listView.getAdapter().getItem(position);
final AppContext appContext= (AppContext)this.getActivity().getApplicationContext();
final Account account= appContext.getAccount();
final String oldRoomId= appContext.getRoomId(account);
final Intent intent= new Intent(Event.RoomChange.ACTION);
intent.putExtra(Event.RoomChange.KEY_ROOM_ID, roomId.toString());
intent.putExtra(Event.RoomChange.KEY_OLD_ROOM_ID, oldRoomId);
final LocalBroadcastManager lbMan= LocalBroadcastManager.getInstance(this.getActivity().getApplicationContext());
lbMan.sendBroadcast(intent);
}
@Override
public Loader<Iterable<String>> onCreateLoader(int id, final Bundle args)
{
return new RoomListLoader(this.getActivity());
}
@Override
public void onLoadFinished(Loader<Iterable<String>> loader, Iterable<String> data) {
this.swipeRefreshLayout.setRefreshing(false);
final Iterable<String> loaded = (data != null) ? data : Collections.<String>emptyList();
final List<String> roomIds= Lists.newArrayList();
for(final String roomId : loaded)
{
roomIds.add(roomId);
}
this.listView.setAdapter(new ArrayAdapter<String>(
this.getActivity(),
android.R.layout.simple_list_item_1,
roomIds.toArray(new String[0]))
);
Log.i("RoomListFragment", "Done for refreshing");
}
@Override
public void onLoaderReset(Loader<Iterable<String>> loader) {
Log.i("RoomListFragment", "On reset");
/* Log.i("RoomListFragment", "On reset, force loading"); */
/* loader.forceLoad(); */
}
@Override
public void onRefresh() {
Log.i("RoomListFragment", "On refresh, restart");
this.getLoaderManager().getLoader(0).forceLoad();
}
private static final class RoomListLoader
extends LingrTaskLoader<Iterable<String>>
{
public RoomListLoader(Context context)
{
super(context);
}
@Override
public Iterable<String> loadInBackground(CharSequence authToken, LingrClient lingr)
throws IOException, LingrException
{
final AppContext appContext= this.getApplicationContext();
final Account account= appContext.getAccount();
final Iterable<String> roomIds= appContext.getRoomIds(account);
if(Iterables.isEmpty(roomIds))
{
return lingr.getRooms(authToken);
}
else
{
return roomIds;
}
}
}
private SwipeRefreshLayout swipeRefreshLayout;
private ListView listView;
private final List<BroadcastReceiver> receivers= Lists.newLinkedList();
}