/* * 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.AlertDialog; import android.app.ListFragment; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; 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.TapchatApp; import com.tapchatapp.android.app.activity.AddNetworkActivity; import com.tapchatapp.android.app.activity.BuffersActivity; import com.tapchatapp.android.app.activity.EditNetworkActivity; import com.tapchatapp.android.app.event.ConnectionAddedEvent; import com.tapchatapp.android.app.event.ConnectionChangedEvent; import com.tapchatapp.android.app.event.ConnectionRemovedEvent; import com.tapchatapp.android.app.event.ServiceStateChangedEvent; import com.tapchatapp.android.app.ui.FilterableListAdapter; import com.tapchatapp.android.client.TapchatService; import com.tapchatapp.android.client.model.Connection; import java.util.Comparator; import java.util.List; import javax.inject.Inject; public class NetworksFragment extends ListFragment { @Inject Bus mBus; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TapchatApp.get().inject(this); setHasOptionsMenu(true); } @Override public void onResume() { super.onResume(); mBus.register(this); } @Override public void onPause() { super.onPause(); mBus.unregister(this); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); registerForContextMenu(getListView()); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.networks, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.add_network) { startActivity(new Intent(getActivity(), AddNetworkActivity.class)); return true; } else if (item.getItemId() == android.R.id.home) { getActivity().finish(); return true; } return false; } @Override public void onListItemClick(ListView l, View v, int position, long id) { l.showContextMenuForChild(v); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { getActivity().getMenuInflater().inflate(R.menu.network, menu); AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; Connection connection = (Connection) getListAdapter().getItem(info.position); boolean isDisconnected = (connection.getState() == Connection.STATE_DISCONNECTED); menu.findItem(R.id.connect).setVisible(isDisconnected); menu.findItem(R.id.disconnect).setVisible(!isDisconnected); } @Override public boolean onContextItemSelected(android.view.MenuItem item) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); final Connection connection = (Connection) getListAdapter().getItem(info.position); switch (item.getItemId()) { case R.id.connect: { connection.reconnect(); return true; } case R.id.disconnect: { connection.disconnect(); return true; } case R.id.edit_network: { Intent intent = new Intent(getActivity(), EditNetworkActivity.class); intent.putExtra(EditNetworkActivity.EXTRA_CID, connection.getId()); startActivity(intent); return true; } case R.id.remove_network: new AlertDialog.Builder(getActivity()) .setMessage(R.string.confirm_delete_network) .setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { connection.delete(); } }) .setNegativeButton(android.R.string.cancel, null) .show(); return true; case R.id.view_console: { Intent intent = new Intent(getActivity(), BuffersActivity.class); intent.setData(new Uri.Builder() .scheme("tapchat") .authority(String.valueOf(connection.getId())) .path(String.valueOf(connection.getConsoleBuffer().getId())) .appendQueryParameter("display", "console") .build()); startActivity(intent); return true; } } return false; } @Subscribe public void onServiceStateChanged(ServiceStateChangedEvent event) { final TapchatService service = event.getService(); if (service.getConnectionState() == TapchatService.STATE_LOADED) { if (getView() != null) { setListShown(true); } if (getListAdapter() == null) { setListAdapter(new NetworksListAdapter(service.getConnections())); } else { ((NetworksListAdapter) getListAdapter()).updateItems(service.getConnections()); } } } @Subscribe public void onConnectionAdded(ConnectionAddedEvent event) { final Connection connection = event.getConnection(); final NetworksListAdapter adapter = (NetworksListAdapter) getListAdapter(); if (adapter != null && !adapter.contains(connection)) { adapter.addItem(connection); } } @Subscribe public void onConnectionChanged(ConnectionChangedEvent event) { final NetworksListAdapter adapter = (NetworksListAdapter) getListAdapter(); if (adapter != null) { adapter.notifyDataSetChanged(); } } @Subscribe public void onConnectionRemoved(ConnectionRemovedEvent event) { final Connection connection = event.getConnection(); final NetworksListAdapter adapter = (NetworksListAdapter) getListAdapter(); if (adapter != null && adapter.contains(connection)) { adapter.removeItem(connection); } } private class NetworksListAdapter extends FilterableListAdapter<Connection> { private NetworksListAdapter(List<Connection> connections) { super(); updateItems(connections); } @Override public View getView(int position, View convertView, ViewGroup group) { Connection connection = getItem(position); if (convertView == null) { convertView = View.inflate(getActivity(), android.R.layout.simple_list_item_2, null); } ((TextView) convertView.findViewById(android.R.id.text1)).setText(connection.getDisplayName()); ((TextView) convertView.findViewById(android.R.id.text2)).setText(connection.getDisplayState(getActivity())); return convertView; } @Override protected Comparator<? super Connection> getComparator() { return Connection.COMPARATOR; } } }