/* LinkingDeviceListFragment.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.linking.setting.fragment; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import org.deviceconnect.android.deviceplugin.linking.LinkingApplication; import org.deviceconnect.android.deviceplugin.linking.R; import org.deviceconnect.android.deviceplugin.linking.linking.LinkingDevice; import org.deviceconnect.android.deviceplugin.linking.linking.LinkingDeviceManager; import org.deviceconnect.android.deviceplugin.linking.setting.LinkingDeviceActivity; import org.deviceconnect.android.deviceplugin.linking.setting.LinkingInductionActivity; import org.deviceconnect.android.deviceplugin.linking.setting.fragment.dialog.ConfirmationDialogFragment; import org.deviceconnect.android.deviceplugin.linking.setting.fragment.dialog.DiscoveryDeviceDialogFragment; import java.util.List; /** * Fragment for show Linking Devices. * * @author NTT DOCOMO, INC. */ public class LinkingDeviceListFragment extends Fragment implements ConfirmationDialogFragment.OnDialogEventListener { private DiscoveryDeviceDialogFragment mDiscoveryDeviceDialogFragment; private ListAdapter mAdapter; public static LinkingDeviceListFragment newInstance() { return new LinkingDeviceListFragment(); } @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { mAdapter = new ListAdapter(getActivity(), -1); final View root = inflater.inflate(R.layout.fragment_linking_device_list, container, false); ListView listView = (ListView) root.findViewById(R.id.fragment_device_list_view); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { DeviceItem item = (DeviceItem) view.getTag(); if (item != null) { transitionDeviceControl(item); } } }); listView.setAdapter(mAdapter); Button searchBtn = (Button) root.findViewById(R.id.fragment_device_search); searchBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { discoverDevices(root); } }); Button linkingBtn = (Button) root.findViewById(R.id.fragment_device_guidance_btn); linkingBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { transitionLinkingApp(); } }); return root; } @Override public void onResume() { super.onResume(); discoverDevices(getView()); LinkingDeviceManager mgr = getLinkingDeviceManager(); if (mgr != null) { mgr.addConnectListener(mOnConnectListener); } } @Override public void onPause() { super.onPause(); LinkingDeviceManager mgr = getLinkingDeviceManager(); if (mgr != null) { mgr.removeConnectListener(mOnConnectListener); } } @Override public void onPositiveClick(final DialogFragment fragment) { transitionLinkingApp(); } @Override public void onNegativeClick(final DialogFragment fragment) { // do nothing } private LinkingDeviceManager getLinkingDeviceManager() { LinkingApplication app = (LinkingApplication) getActivity().getApplication(); return app.getLinkingDeviceManager(); } private void transitionDeviceControl(final DeviceItem item) { if (item.isConnected) { Intent intent = new Intent(); intent.putExtra(LinkingDeviceActivity.EXTRA_ADDRESS, item.mDevice.getBdAddress()); intent.setClass(getContext(), LinkingDeviceActivity.class); getActivity().startActivity(intent); } else { String title = getString(R.string.fragment_device_error_title); String message = getString(R.string.fragment_device_error_message, item.mDevice.getDisplayName()); String positive = getString(R.string.fragment_device_error_positive); String negative = getString(R.string.fragment_device_error_negative); ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(title, message, positive, negative, this); dialog.show(getFragmentManager(), "error"); } } private void transitionLinkingApp() { Intent intent = new Intent(); intent.setClass(getContext(), LinkingInductionActivity.class); getActivity().startActivity(intent); } private void showGuidance() { if (getView() == null) { return; } View view = getView().findViewById(R.id.fragment_device_guidance); if (view != null) { if (mAdapter.getCount() == 0) { view.setVisibility(View.VISIBLE); } else { view.setVisibility(View.GONE); } } } private void refreshDeviceList() { if (getActivity() == null) { return; } getActivity().runOnUiThread(new Runnable() { @Override public void run() { discoverDevices(getView()); } }); } private void discoverDevices(final View root) { if (mDiscoveryDeviceDialogFragment != null) { return; } if (root == null) { return; } AsyncTask<Void, Void, List<LinkingDevice>> task = new AsyncTask<Void, Void, List<LinkingDevice>>() { @Override protected void onPreExecute() { mDiscoveryDeviceDialogFragment = DiscoveryDeviceDialogFragment.newInstance(getString(R.string.fragment_device_discovery)); mDiscoveryDeviceDialogFragment.show(getFragmentManager(), "progress"); mAdapter.clear(); mAdapter.notifyDataSetChanged(); } @Override protected List<LinkingDevice> doInBackground(final Void... params) { try { LinkingApplication app = (LinkingApplication) getActivity().getApplicationContext(); LinkingDeviceManager manager = app.getLinkingDeviceManager(); return manager.getDevices(); } catch (Exception e) { return null; } } @Override protected void onPostExecute(final List<LinkingDevice> devices) { mDiscoveryDeviceDialogFragment.dismiss(); mDiscoveryDeviceDialogFragment = null; if (devices != null) { ListView listView = (ListView) root.findViewById(R.id.fragment_device_list_view); for (LinkingDevice device : devices) { DeviceItem item = new DeviceItem(); item.mDevice = device; item.isConnected = device.isConnected(); mAdapter.add(item); } listView.setAdapter(mAdapter); } showGuidance(); } }; task.execute(); } private class ListAdapter extends ArrayAdapter<DeviceItem> { public ListAdapter(final Context context, final int textViewId) { super(context, textViewId); } @Override public View getView(final int position, View convertView, final ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.item_linking_device, null); } DeviceItem item = getItem(position); String deviceName = item.mDevice.getDisplayName(); TextView textView = (TextView) convertView.findViewById(R.id.item_device_name); textView.setText(deviceName); TextView statusView = (TextView) convertView.findViewById(R.id.item_device_status); if (item.isConnected) { textView.setTextColor(Color.BLACK); statusView.setText(getString(R.string.fragment_device_status_online)); statusView.setTextColor(Color.BLACK); } else { textView.setTextColor(Color.GRAY); statusView.setText(getString(R.string.fragment_device_status_offline)); statusView.setTextColor(Color.GRAY); } convertView.setTag(item); return convertView; } } private class DeviceItem { LinkingDevice mDevice; boolean isConnected = false; } private LinkingDeviceManager.OnConnectListener mOnConnectListener = new LinkingDeviceManager.OnConnectListener() { @Override public void onConnect(final LinkingDevice device) { refreshDeviceList(); } @Override public void onDisconnect(final LinkingDevice device) { refreshDeviceList(); } }; }