package com.ubergeek42.WeechatAndroid.fragments; import android.support.v4.app.ListFragment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import android.content.Context; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ListView; import android.widget.RelativeLayout; import com.ubergeek42.WeechatAndroid.adapters.BufferListAdapter; import com.ubergeek42.WeechatAndroid.R; import com.ubergeek42.WeechatAndroid.WeechatActivity; import com.ubergeek42.WeechatAndroid.relay.Buffer; import com.ubergeek42.WeechatAndroid.relay.BufferList; import com.ubergeek42.WeechatAndroid.relay.BufferListEye; import com.ubergeek42.WeechatAndroid.service.Events; import com.ubergeek42.WeechatAndroid.service.P; import static com.ubergeek42.WeechatAndroid.service.RelayService.STATE.*; import de.greenrobot.event.EventBus; public class BufferListFragment extends ListFragment implements BufferListEye, View.OnClickListener { private static Logger logger = LoggerFactory.getLogger("BufferListFragment"); final private static boolean DEBUG_LIFECYCLE = false; final private static boolean DEBUG_MESSAGES = false; final private static boolean DEBUG_PREFERENCES = false; final private static boolean DEBUG_CLICK = false; private WeechatActivity activity; private BufferListAdapter adapter; private RelativeLayout uiFilterBar; private EditText uiFilter; private ImageButton uiFilterClear; //////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// lifecycle //////////////////////////////////////////////////////////////////////////////////////////////// /** This makes sure that the container activity has implemented ** the callback interface. If not, it throws an exception. */ @Override public void onAttach(Context context) { if (DEBUG_LIFECYCLE) logger.debug("onAttach()"); super.onAttach(context); this.activity = (WeechatActivity) context; } /** Supposed to be called only once ** since we are setting setRetainInstance(true) */ @Override public void onCreate(Bundle savedInstanceState) { if (DEBUG_LIFECYCLE) logger.debug("onCreate()"); super.onCreate(savedInstanceState); setRetainInstance(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (DEBUG_LIFECYCLE) logger.debug("onCreateView()"); View view = inflater.inflate(R.layout.bufferlist, container, false); uiFilter = (EditText) view.findViewById(R.id.bufferlist_filter); uiFilter.addTextChangedListener(filterTextWatcher); uiFilterClear = (ImageButton) view.findViewById(R.id.bufferlist_filter_clear); uiFilterClear.setOnClickListener(this); uiFilterBar = (RelativeLayout) view.findViewById(R.id.filter_bar); return view; } @Override public void onDestroyView() { if (DEBUG_LIFECYCLE) logger.debug("onDestroyView()"); super.onDestroyView(); uiFilter.removeTextChangedListener(filterTextWatcher); } @Override public void onStart() { if (DEBUG_LIFECYCLE) logger.debug("onStart()"); super.onStart(); EventBus.getDefault().registerSticky(this); uiFilterBar.setVisibility(P.showBufferFilter ? View.VISIBLE : View.GONE); } @Override public void onStop() { if (DEBUG_LIFECYCLE) logger.debug("onStop()"); EventBus.getDefault().unregister(this); super.onStop(); detachFromBufferList(); } //////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// event //////////////////////////////////////////////////////////////////////////////////////////////// @SuppressWarnings("unused") public void onEvent(Events.StateChangedEvent event) { logger.debug("onEvent({})", event); if (event.state.contains(LISTED)) attachToBufferList(); } //////////////////////////////////////////////////////////////////////////////////////////////// the juice private void attachToBufferList() { adapter = new BufferListAdapter(activity); BufferList.setBufferListEye(this); activity.runOnUiThread(new Runnable() { @Override public void run() { setListAdapter(adapter); } }); setFilter(uiFilter.getText()); onBuffersChanged(); } private void detachFromBufferList() { BufferList.setBufferListEye(null); } //////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// on click //////////////////////////////////////////////////////////////////////////////////////////////// /** this is the mother method, it actually opens buffers */ @Override public void onListItemClick(ListView listView, View view, int position, long id) { if (DEBUG_CLICK) logger.debug("onListItemClick(..., ..., {}, ...)", position); Object obj = getListView().getItemAtPosition(position); if (obj instanceof Buffer) activity.openBuffer(((Buffer) obj).fullName); } //////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// BufferListEye //////////////////////////////////////////////////////////////////////////////////////////////// @Override public void onBuffersChanged() { if (DEBUG_MESSAGES) logger.debug("onBuffersChanged()"); adapter.onBuffersChanged(); } @Override public void onHotCountChanged() { if (DEBUG_MESSAGES) logger.debug("onHotCountChanged()"); activity.updateHotCount(BufferList.getHotCount()); } //////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// other //////////////////////////////////////////////////////////////////////////////////////////////// /** TextWatcher object used for filtering the buffer list */ private TextWatcher filterTextWatcher = new TextWatcher() { @Override public void afterTextChanged(Editable a) {} @Override public void beforeTextChanged(CharSequence arg0, int a, int b, int c) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (DEBUG_PREFERENCES) logger.debug("onTextChanged({}, ...)", s); if (adapter != null) { setFilter(s); adapter.onBuffersChanged(); } } }; private void setFilter(final CharSequence s) { BufferList.setFilter(s.toString()); activity.runOnUiThread(new Runnable() { @Override public void run() { uiFilterClear.setVisibility((s.length() == 0) ? View.INVISIBLE : View.VISIBLE); } }); } /** the only button we've got: clear text in the filter */ @Override public void onClick(View v) { uiFilter.setText(null); } @Override public String toString() { return "BL"; } }