/* IRKitEndingFragment.java Copyright (c) 2014 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.irkit.settings.fragment; import android.annotation.SuppressLint; import android.app.Activity; import android.app.Fragment; import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import org.deviceconnect.android.deviceplugin.irkit.IRKitApplication; import org.deviceconnect.android.deviceplugin.irkit.IRKitDevice; import org.deviceconnect.android.deviceplugin.irkit.IRKitDeviceService; import org.deviceconnect.android.deviceplugin.irkit.IRKitManager; import org.deviceconnect.android.deviceplugin.irkit.R; import org.deviceconnect.android.deviceplugin.irkit.data.IRKitDBHelper; import org.deviceconnect.android.deviceplugin.irkit.data.VirtualProfileData; import org.deviceconnect.android.deviceplugin.irkit.settings.activity.IRKitVirtualDeviceListActivity; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.List; /** * Virtual Profileに赤外線を登録する. * @author NTT DOCOMO, INC. */ public class IRKitRegisterIRFragment extends Fragment { /** Virtual Profile. */ private VirtualProfileData mProfile; /** インジケーター. */ private ProgressDialog mIndView; /** IRKit のデバイス.*/ private IRKitDevice mDevice; /** DB helper. */ private IRKitDBHelper mDBHelper; @SuppressLint("InflateParams") @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { setRetainInstance(true); mDBHelper = new IRKitDBHelper(getActivity()); View rootView = inflater.inflate(R.layout.fragment_register_ir, null); TextView apiView = (TextView) rootView.findViewById(R.id.api_name); apiView.setText(mProfile.getName()); final Button registerIR = (Button) rootView.findViewById(R.id.register_ir); registerIR.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showProgress(); List<IRKitDevice> devices = getIRKitDevices(); mDevice = null; if (devices != null) { for (IRKitDevice d : devices) { if (mProfile.getServiceId().contains(d.getName())) { mDevice = d; registerIR.getHandler().postDelayed(new Runnable() { @Override public void run() { IRKitManager.INSTANCE.fetchMessage(mDevice.getIp(), new IRKitManager.GetMessageCallback() { @Override public void onGetMessage(final String message) { if (getActivity() == null) { return; } getActivity().runOnUiThread(new Runnable() { @Override public void run() { if (message == null) { showFailureDialog(); } else if (!checkData(message)) { showFailureDialog(); } else { mProfile.setIr(message); mDBHelper.updateVirtualProfile(mProfile); showSuccessDialog(); sendEventOnUpdate(mProfile.getServiceId()); } dismissProgress(); } }); } }); } }, 5000); break; } } } if (mDevice == null) { showFailureDialog(); dismissProgress(); } } }); return rootView; } /** * 仮想デバイスの状態を更新する. * @param serviceId 仮想デバイスのサービスID */ private void sendEventOnUpdate(final String serviceId) { Activity activity = getActivity(); if (activity == null) { return; } Intent intent = new Intent(IRKitDeviceService.ACTION_VIRTUAL_DEVICE_UPDATED); intent.putExtra(IRKitDeviceService.EXTRA_VIRTUAL_DEVICE_ID, serviceId); LocalBroadcastManager.getInstance(activity).sendBroadcast(intent); } @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { final MenuItem menuItem = menu.add(getString(R.string.menu_close)); menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(final MenuItem item) { if (item.getTitle().equals(menuItem.getTitle())) { getActivity().finish(); } return true; } }); } /** * Virtual Profile を設定する。 * @param profile virtual Profile */ public void setProfile(final VirtualProfileData profile) { mProfile = profile; } /** * IRKitデバイスリストの取得 * @return IRKitデバイスリスト */ private List<IRKitDevice> getIRKitDevices() { IRKitVirtualDeviceListActivity activity = (IRKitVirtualDeviceListActivity) getActivity(); IRKitApplication application = (IRKitApplication) activity.getApplication(); return application.getIRKitDevices(); } /** * 赤外線照射中のダイアログを出す。 */ private void showProgress() { mIndView = new ProgressDialog(getActivity()); mIndView.setProgressStyle(ProgressDialog.STYLE_SPINNER); mIndView.setCancelable(false); mIndView.setMessage(getString(R.string.receiving)); mIndView.show(); } /** * Progress を消す。 */ private void dismissProgress() { if (mIndView != null) { mIndView.dismiss(); } } /** * 赤外線の登録失成功通知ダイアログ. * */ private void showSuccessDialog() { IRKitCreateVirtualDeviceDialogFragment.showAlert(getActivity(), getString(R.string.receive_success_title), getString(R.string.receive_success_message)); } /** * 赤外線の登録失敗通知ダイアログ. * */ private void showFailureDialog() { IRKitCreateVirtualDeviceDialogFragment.showAlert(getActivity(), getString(R.string.receive_failure_title), getString(R.string.receive_failure_message)); } /** * 送られてきたデータがIRKitに対応しているかチェックを行う. * @param message データ * @return フォーマットが問題ない場合はtrue、それ以外はfalse */ private boolean checkData(final String message) { if (message == null || message.length() == 0) { return false; } try { JSONObject json = new JSONObject(message); String format = json.getString("format"); int freq = json.getInt("freq"); JSONArray datas = json.getJSONArray("data"); return (format != null && freq > 0 && datas != null); } catch (JSONException e) { return false; } } }