/*
FaBoConnectFragment
Copyright (c) 2014 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.fabo.setting.fragment;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import org.deviceconnect.android.deviceplugin.fabo.FaBoDeviceService;
import org.deviceconnect.android.deviceplugin.fabo.R;
import org.deviceconnect.android.deviceplugin.fabo.param.FaBoConst;
import org.deviceconnect.android.deviceplugin.fabo.setting.FaBoSettingActivity;
import java.util.HashMap;
/**
* 設定画面用Fragment.
*
* @author NTT DOCOMO, INC.
*/
public class FaBoConnectFragment extends Fragment {
/** Context. */
private static Context mContext;
/** Activity. */
private static Activity mActivity;
/** TAG. */
private static final String TAG = "FABO_PLUGIN_SETTING";
/** TextView. */
private static TextView mTextViewCommment;
/** Button. */
private static Button mOutputButton;
/** Service Status. */
private static int mFaBoStatus;
/** Activity Status. */
private static int mActivityStatus;
/** 親Activity. */
private static FaBoSettingActivity mParent;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Root view.
View root = inflater.inflate(R.layout.connect, container, false);
// Get context.
mContext = getActivity().getBaseContext();
mActivity = getActivity();
// Set status.
mActivityStatus = FaBoConst.STATUS_ACTIVITY_DISPLAY;
mFaBoStatus = FaBoConst.STATUS_FABO_NOCONNECT;
// Textview.
mTextViewCommment = (TextView) root.findViewById(R.id.textViewComment);
// ボタンが押されたらUSBに接続.
mOutputButton = (Button) root.findViewById(R.id.outputButton);
mOutputButton.setEnabled(false);
mOutputButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Serviceにメッセージを送信.
Intent mIntent = new Intent(mContext, FaBoDeviceService.class);
mContext.startService(mIntent);
// USB OpenのコマンドをServiceにBroadcast.
Intent intent = new Intent(FaBoConst.DEVICE_TO_ARDUINO_OPEN_USB);
mContext.sendBroadcast(intent);
}
});
return root;
}
@Override
public void onResume() {
super.onResume();
// USBの結果受信用のBroadcast Receiverを設定.
IntentFilter mIntentFilter = new IntentFilter();
mIntentFilter.addAction(FaBoConst.DEVICE_TO_ARDUINO_OPEN_USB_RESULT);
mIntentFilter.addAction(FaBoConst.DEVICE_TO_ARDUINO_CHECK_USB_RESULT);
mIntentFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
mContext.registerReceiver(mUSBResultEvent, mIntentFilter);
// Arduino Unoとの接続状態をチェック.
Intent intent = new Intent(FaBoConst.DEVICE_TO_ARDUINO_CHECK_USB);
mContext.sendBroadcast(intent);
// USBデバイスのチェック.
UsbManager manager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
for (UsbDevice device : deviceList.values()) {
if (device.getVendorId() == 10755) {
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mTextViewCommment.setText(R.string.arduinoorg_find);
mOutputButton.setEnabled(false);
}
});
} else if (device.getVendorId() == 9025) {
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mTextViewCommment.setText(R.string.arduinocc_find);
mOutputButton.setEnabled(true);
}
});
break;
}
}
}
@Override
public void onStop() {
super.onStop();
mContext.unregisterReceiver(mUSBResultEvent);
mActivityStatus = FaBoConst.STATUS_ACTIVITY_PAUSE;
}
/**
* Broadcast receiver for usb event.
*/
private BroadcastReceiver mUSBResultEvent = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
String action = intent.getAction();
if(action.equals(FaBoConst.DEVICE_TO_ARDUINO_OPEN_USB_RESULT)) {
int resultId = intent.getIntExtra("resultId", 0);
Log.i(TAG, "resultId:" + resultId);
if(resultId == FaBoConst.CAN_NOT_FIND_USB){
mTextViewCommment.setText(R.string.not_found_arduino);
} else if (resultId == FaBoConst.FAILED_OPEN_USB){
mTextViewCommment.setText(R.string.failed_open_usb);
} else if (resultId == FaBoConst.FAILED_CONNECT_ARDUINO){
mTextViewCommment.setText(R.string.failed_connect_arduino);
} else if (resultId == FaBoConst.SUCCESS_CONNECT_ARDUINO){
mTextViewCommment.setText(R.string.success_connect_arduino);
} else if (resultId == FaBoConst.SUCCESS_CONNECT_FIRMATA){
mTextViewCommment.setText(R.string.success_connect);
mOutputButton.setEnabled(false);
mFaBoStatus = FaBoConst.STATUS_FABO_RUNNING;
} else if (resultId == FaBoConst.FAILED_CONNECT_FIRMATA){
mParent.moveWriteFirmata();
mFaBoStatus = FaBoConst.STATUS_FABO_NOCONNECT;
}
} else if(action.equals(FaBoConst.DEVICE_TO_ARDUINO_CHECK_USB_RESULT)) {
int statusId = intent.getIntExtra("statusId", 0);
if(statusId == FaBoConst.STATUS_FABO_NOCONNECT) {
// USBデバイスのチェック.
UsbManager manager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
for (UsbDevice device : deviceList.values()) {
if (device.getVendorId() == 10755) {
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mTextViewCommment.setText(R.string.arduinoorg_find);
mOutputButton.setEnabled(false);
}
});
} else if (device.getVendorId() == 9025) {
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mTextViewCommment.setText(R.string.arduinocc_find);
mOutputButton.setEnabled(true);
}
});
break;
}
}
mFaBoStatus = FaBoConst.STATUS_FABO_NOCONNECT;
} else if(statusId == FaBoConst.STATUS_FABO_INIT) {
mFaBoStatus = FaBoConst.STATUS_FABO_INIT;
} else if(statusId == FaBoConst.STATUS_FABO_RUNNING) {
mTextViewCommment.setText(R.string.success_connect);
mFaBoStatus = FaBoConst.STATUS_FABO_RUNNING;
mOutputButton.setEnabled(false);
}
} else if(action.equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) {
mTextViewCommment.setText(R.string.disconnect_usb);
mOutputButton.setEnabled(false);
mFaBoStatus = FaBoConst.STATUS_FABO_NOCONNECT;
Intent closeIntent = new Intent(FaBoConst.DEVICE_TO_ARDUINO_CLOSE_USB);
mContext.sendBroadcast(closeIntent);
}
}
};
@Override
public void onAttach(Activity activity) {
mParent = (FaBoSettingActivity) activity;
super.onAttach(activity);
}
}