/*
* Copyright (C) 2014 Eric Butler
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.tapchatapp.android.app.fragment;
import android.app.ListFragment;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;
import com.tapchatapp.android.R;
import com.tapchatapp.android.app.event.ServiceStateChangedEvent;
import com.tapchatapp.android.app.ui.FilterableListAdapter;
import com.tapchatapp.android.app.TapchatApp;
import com.tapchatapp.android.client.TapchatService;
import com.tapchatapp.android.client.model.ChannelBuffer;
import com.tapchatapp.android.client.model.Member;
import java.util.Comparator;
import java.util.List;
import javax.inject.Inject;
public class MemberListFragment extends ListFragment {
private ChannelBuffer mChannel;
@Inject Bus mBus;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TapchatApp.get().inject(this);
}
@Override public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getListView().setSelector(R.drawable.list_selector);
updateView();
}
@Override public void onResume() {
super.onResume();
mBus.register(this);
}
@Override public void onPause() {
super.onPause();
mBus.unregister(this);
mChannel = null;
}
@Override public void onListItemClick(ListView l, View v, int position, long id) {
Member member = ((MemberListAdapter) getListAdapter()).getItem(position);
mChannel.getConnection().openBuffer(member.getNick());
getActivity().finish();
}
@Subscribe public void onServiceStateChanged(ServiceStateChangedEvent event) {
TapchatService service = event.getService();
if (mChannel == null && service.getConnectionState() == TapchatService.STATE_LOADED) {
long connectionId = getArguments().getLong(BufferFragment.ARG_CONNECTION_ID);
long bufferId = getArguments().getLong(BufferFragment.ARG_BUFFER_ID);
mChannel = (ChannelBuffer) service.getBuffer(connectionId, bufferId);
if (mChannel == null) {
throw new IllegalStateException("Channel buffer not found. " + connectionId + " " + bufferId);
}
}
updateView();
}
private void updateView() {
if (getView() == null) {
return;
}
if (mChannel != null) {
int numMembers = mChannel.getMembers().size();
String title = getResources().getQuantityString(R.plurals.channel_members_format, numMembers, String.valueOf(numMembers), mChannel.getName());
getActivity().setTitle(title);
if (getListAdapter() == null) {
setListAdapter(new MemberListAdapter(mChannel.getMembers()));
} else {
((MemberListAdapter) getListAdapter()).updateItems(mChannel.getMembers());
}
}
}
private class MemberListAdapter extends FilterableListAdapter<Member> {
private MemberListAdapter(List<Member> members) {
updateItems(members);
}
@Override
public View getView(int position, View convertView, ViewGroup group) {
if (convertView == null) {
convertView = View.inflate(getActivity(), android.R.layout.simple_list_item_1, null);
}
Member member = getItem(position);
((TextView) convertView).setText(member.getNick());
return convertView;
}
@Override protected Comparator<? super Member> getComparator() {
return new Comparator<Member>() {
@Override
public int compare(Member member, Member member1) {
Integer weight1 = getMemberWeight(member);
Integer weight2 = getMemberWeight(member1);
if (weight1.equals(weight2)) {
return member.getNick().compareToIgnoreCase(member1.getNick());
} else {
return weight2.compareTo(weight1);
}
}
};
}
private int getMemberWeight(Member member) {
int weight = 0;
if (member.isOp()) {
weight += 2;
} else if (member.isVoiced()) {
weight += 1;
}
return weight;
}
}
}