/*
LinkingBeaconListFragment.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.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.CompoundButton;
import android.widget.ListView;
import android.widget.Switch;
import android.widget.TextView;
import org.deviceconnect.android.deviceplugin.linking.LinkingApplication;
import org.deviceconnect.android.deviceplugin.linking.R;
import org.deviceconnect.android.deviceplugin.linking.beacon.LinkingBeaconManager;
import org.deviceconnect.android.deviceplugin.linking.beacon.LinkingBeaconUtil;
import org.deviceconnect.android.deviceplugin.linking.beacon.data.LinkingBeacon;
import org.deviceconnect.android.deviceplugin.linking.linking.LinkingUtil;
import org.deviceconnect.android.deviceplugin.linking.setting.LinkingBeaconActivity;
import org.deviceconnect.android.deviceplugin.linking.setting.LinkingInductionActivity;
import org.deviceconnect.android.deviceplugin.linking.setting.fragment.dialog.ConfirmationDialogFragment;
public class LinkingBeaconListFragment extends Fragment implements ConfirmationDialogFragment.OnDialogEventListener,
LinkingBeaconManager.OnBeaconConnectListener, LinkingBeaconManager.OnBeaconScanStateListener {
private static final String TAG_DELETE_BEACON = "delete_beacon";
private static final String TAG_ERROR_BEACON = "error_beacon";
private ListAdapter mAdapter;
private LinkingBeacon mLinkingBeacon;
public static LinkingBeaconListFragment newInstance() {
return new LinkingBeaconListFragment();
}
@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_beacon_list, container, false);
ListView listView = (ListView) root.findViewById(R.id.fragment_beacon_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) {
transitionBeaconControl(item);
}
}
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
confirmDeleteBeacon(mAdapter.getItem(position).mDevice);
return true;
}
});
listView.setAdapter(mAdapter);
Switch switchBtn = (Switch) root.findViewById(R.id.fragment_beacon_scan_switch);
if (switchBtn != null) {
switchBtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) {
if (isChecked) {
getLinkingBeaconManager().startForceBeaconScan();
} else {
getLinkingBeaconManager().stopForceBeaconScan();
}
}
});
switchBtn.setChecked(getLinkingBeaconManager().isStartedForceBeaconScan());
}
return root;
}
@Override
public void onResume() {
super.onResume();
refresh();
if (getView() != null) {
Switch switchBtn = (Switch) getView().findViewById(R.id.fragment_beacon_scan_switch);
if (switchBtn != null) {
switchBtn.setEnabled(LinkingUtil.isApplicationInstalled(getContext()));
}
}
LinkingApplication app = (LinkingApplication) getActivity().getApplication();
LinkingBeaconManager mgr = app.getLinkingBeaconManager();
mgr.addOnBeaconConnectListener(this);
mgr.addOnBeaconScanStateListener(this);
}
@Override
public void onPause() {
LinkingApplication app = (LinkingApplication) getActivity().getApplication();
LinkingBeaconManager mgr = app.getLinkingBeaconManager();
mgr.removeOnBeaconConnectListener(this);
mgr.removeOnBeaconScanStateListener(this);
super.onPause();
}
@Override
public void onPositiveClick(final DialogFragment fragment) {
String tag = fragment.getTag();
if (TAG_ERROR_BEACON.equals(tag)) {
transitionLinkingApp();
} else if (TAG_DELETE_BEACON.equals(tag)) {
LinkingApplication app = (LinkingApplication) getActivity().getApplication();
LinkingBeaconManager mgr = app.getLinkingBeaconManager();
mgr.removeBeacon(mLinkingBeacon);
refresh();
}
}
@Override
public void onNegativeClick(final DialogFragment fragment) {
}
@Override
public void onConnected(final LinkingBeacon beacon) {
refresh();
}
@Override
public void onDisconnected(final LinkingBeacon beacon) {
refresh();
}
@Override
public void onScanState(final LinkingBeaconUtil.ScanState state, final LinkingBeaconUtil.ScanDetail detail) {
if (state != LinkingBeaconUtil.ScanState.RESULT_OK || detail != LinkingBeaconUtil.ScanDetail.DETAIL_OK) {
String message;
switch (detail) {
case DETAIL_TIMEOUT:
message = getString(R.string.linking_beacon_scan_detail_timeout);
break;
case DETAIL_META_DATA_NONE:
message = getString(R.string.linking_beacon_scan_detail_meta_data_none);
break;
case DETAIL_BT_DISABLED:
message = getString(R.string.linking_beacon_scan_detail_bt_disabled);
break;
case DETAIL_SDA_DISABLED:
message = getString(R.string.linking_beacon_scan_detail_sda_disabled);
break;
case DETAIL_PERMISSION_DENIED:
message = getString(R.string.linking_beacon_scan_detail_permission_denied);
break;
default:
message = "Unknown";
break;
}
showErrorDialog(message);
}
}
private void refresh() {
if (getActivity() == null) {
return;
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.clear();
mAdapter.notifyDataSetChanged();
LinkingApplication app = (LinkingApplication) getActivity().getApplication();
LinkingBeaconManager mgr = app.getLinkingBeaconManager();
View view = getView();
if (view != null) {
ListView listView = (ListView) view.findViewById(R.id.fragment_beacon_list_view);
for (LinkingBeacon device : mgr.getLinkingBeacons()) {
DeviceItem item = new DeviceItem();
item.mDevice = device;
mAdapter.add(item);
}
listView.setAdapter(mAdapter);
}
}
});
}
private void transitionLinkingApp() {
Intent intent = new Intent();
intent.setClass(getActivity(), LinkingInductionActivity.class);
startActivity(intent);
}
private void transitionBeaconControl(final DeviceItem item) {
if (item.mDevice.isOnline()) {
Intent intent = new Intent();
intent.putExtra(LinkingBeaconActivity.EXTRA_ID, item.mDevice.getExtraId());
intent.putExtra(LinkingBeaconActivity.VENDOR_ID, item.mDevice.getVendorId());
intent.setClass(getActivity(), LinkingBeaconActivity.class);
getActivity().startActivity(intent);
} else {
String message;
LinkingApplication app = (LinkingApplication) getActivity().getApplication();
if (app.getLinkingBeaconManager().isScanState()) {
message = getString(R.string.fragment_beacon_error_message, item.mDevice.getDisplayName());
} else {
message = getString(R.string.fragment_beacon_error_message_not_start_beacon_scan);
}
showErrorDialog(message);
}
}
private void confirmDeleteBeacon(final LinkingBeacon beacon) {
mLinkingBeacon = beacon;
String title = getString(R.string.activity_beacon_delete_dialog_title);
String message = getString(R.string.activity_beacon_delete_dialog_message, beacon.getDisplayName());
String positive = getString(R.string.activity_beacon_delete_dialog_positive);
String negative = getString(R.string.activity_beacon_delete_dialog_negative);
ConfirmationDialogFragment fragment = ConfirmationDialogFragment.newInstance(title, message, positive, negative, this);
fragment.show(getFragmentManager(), TAG_DELETE_BEACON);
}
private void showErrorDialog(final String message) {
String title = getString(R.string.fragment_beacon_error_title);
String positive = getString(R.string.fragment_beacon_error_positive);
String negative = getString(R.string.fragment_beacon_error_negative);
ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(title, message, positive, negative, this);
dialog.show(getFragmentManager(), TAG_ERROR_BEACON);
}
private LinkingBeaconManager getLinkingBeaconManager() {
LinkingApplication app = (LinkingApplication) getActivity().getApplication();
return app.getLinkingBeaconManager();
}
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.mDevice.isOnline()) {
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 {
LinkingBeacon mDevice;
}
}