/* WebSocketListActivity.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.manager.setting; import android.app.ActionBar; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import org.deviceconnect.android.manager.DConnectApplication; import org.deviceconnect.android.manager.DConnectService; import org.deviceconnect.android.manager.R; import org.deviceconnect.android.manager.WebSocketInfo; import org.deviceconnect.android.manager.WebSocketInfoManager; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; /** * WebSocketを管理するためのActivity. * * @author NTT DOCOMO, INC. */ public class WebSocketListActivity extends Activity implements AlertDialogFragment.OnAlertDialogListener, WebSocketInfoManager.OnWebSocketEventListener { /** * WebSocket切断確認用ダイアログのタグ名を定義する. */ private static final String TAG_DELETE_WEB_SOCKET = "delete_web_socket"; /** * WebSocket管理クラス. */ private WebSocketInfoAdapter mWebSocketInfoAdapter; /** * 切断するWebSocketを一時的に保持するための変数. */ private WebSocketInfo mWebSocketInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_websocket_list); setTitle(R.string.activity_settings_manage_websocket); ActionBar actionBar = getActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); } mWebSocketInfoAdapter = new WebSocketInfoAdapter(); mWebSocketInfoAdapter.setWebSocketInfoList(getWebSocketInfoManager().getWebSocketInfos()); ListView listView = (ListView) findViewById(R.id.activity_websocket_list); if (listView != null) { listView.setAdapter(mWebSocketInfoAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) { showDeleteDialog(position); } }); } } @Override protected void onResume() { super.onResume(); getWebSocketInfoManager().setOnWebSocketEventListener(this); } @Override protected void onPause() { getWebSocketInfoManager().setOnWebSocketEventListener(null); super.onPause(); } @Override public boolean onOptionsItemSelected(final MenuItem item) { if (android.R.id.home == item.getItemId()) { finish(); return true; } return super.onOptionsItemSelected(item); } @Override public void onPositiveButton(final String tag) { if (TAG_DELETE_WEB_SOCKET.equals(tag) && mWebSocketInfo != null) { Intent intent = new Intent(); intent.setClass(this, DConnectService.class); intent.setAction(DConnectService.ACTION_DISCONNECT_WEB_SOCKET); intent.putExtra(DConnectService.EXTRA_WEBSOCKET_ID, mWebSocketInfo.getRawId()); startService(intent); } } @Override public void onNegativeButton(final String tag) { // ダイアログを閉じるだけで何もしない } @Override public void onDisconnect(final String origin) { runOnUiThread(new Runnable() { @Override public void run() { mWebSocketInfoAdapter.setWebSocketInfoList(getWebSocketInfoManager().getWebSocketInfos()); mWebSocketInfoAdapter.notifyDataSetChanged(); } }); } /** * 指定されたWebSocketを切断するか確認するダイアログを表示する. * @param position 切断するWebSocketのリストの位置 */ private void showDeleteDialog(final int position) { mWebSocketInfo = (WebSocketInfo) mWebSocketInfoAdapter.getItem(position); String title = getString(R.string.activity_websocket_delete_title); String message = getString(R.string.activity_websocket_delete_message); String positive = getString(R.string.activity_websocket_delete_positive); String negative = getString(R.string.activity_websocket_delete_negative); AlertDialogFragment dialog = AlertDialogFragment.create(TAG_DELETE_WEB_SOCKET, title, message, positive, negative); dialog.show(getFragmentManager(), TAG_DELETE_WEB_SOCKET); } /** * WebSocket管理クラスを取得する. * @return WebSocket管理クラス */ private WebSocketInfoManager getWebSocketInfoManager() { DConnectApplication app = (DConnectApplication) getApplication(); return app.getWebSocketInfoManager(); } /** * WebSocketリストを表示するためのアダプタ. * * @author NTT DOCOMO, INC. */ private class WebSocketInfoAdapter extends BaseAdapter { /** * 接続を開始した時間のフォーマットを定義する. */ private final SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm", Locale.JAPAN); /** * WebSocketのリスト. */ private List<WebSocketInfo> mWebSocketInfoList = new ArrayList<>(); /** * WebSocketのリストを設定する. * @param webSocketInfoList WebSocketのリスト */ public void setWebSocketInfoList(List<WebSocketInfo> webSocketInfoList) { mWebSocketInfoList = webSocketInfoList; } @Override public int getCount() { if (mWebSocketInfoList == null) { return 0; } return mWebSocketInfoList.size(); } @Override public Object getItem(int position) { return mWebSocketInfoList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { view = getLayoutInflater().inflate(R.layout.item_websocket_list, null); } WebSocketInfo info = (WebSocketInfo) getItem(position); TextView uriView = (TextView) view.findViewById(R.id.item_websocket_uri); if (uriView != null) { uriView.setText(info.getUri()); } TextView sessionKeyView = (TextView) view.findViewById(R.id.item_websocket_session_key); if (sessionKeyView != null) { sessionKeyView.setText(info.getRawId()); } TextView timeView = (TextView) view.findViewById(R.id.item_websocket_connect_time); if (timeView != null) { timeView.setText(mDateFormat.format(new Date(info.getConnectTime()))); } return view; } } }