/* IRKitWiFiSelectionFragment.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.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import org.deviceconnect.android.deviceplugin.irkit.IRKitManager; import org.deviceconnect.android.deviceplugin.irkit.IRKitManager.CheckingIRKitCallback; import org.deviceconnect.android.deviceplugin.irkit.IRKitManager.GetClientKeyCallback; import org.deviceconnect.android.deviceplugin.irkit.IRKitManager.GetNewDeviceCallback; import org.deviceconnect.android.deviceplugin.irkit.R; import org.deviceconnect.android.deviceplugin.irkit.settings.activity.IRKitSettingActivity; /** * WiFi選択画面用フラグメント. * @author NTT DOCOMO, INC. */ public class IRKitWiFiSelectionFragment extends IRKitBaseFragment { /** * ステート定数. */ private enum State { /** Idling. */ IDLING, /** Got Device. */ GOT_DEVICE, /** Waiting IRKit SSID. */ WAITING_IRKIT_SSID, /** Checking IRKit. */ CHECKING_IRKIT, } /** * キー ステート. */ private static final String STATE = "state"; /** * ステート. */ private State mState; @SuppressLint("InflateParams") @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View root = inflater.inflate(R.layout.irkit_settings_step_3, null); Button wifiBtn = (Button) root.findViewById(R.id.buttonWiFiOpen); wifiBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { startActivity(new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS)); } }); synchronized (this) { if (savedInstanceState != null) { String stateName = savedInstanceState.getString(STATE); if (stateName == null) { mState = State.IDLING; } else { mState = State.valueOf(stateName); } } else { mState = State.IDLING; } } return root; } @Override public void onSaveInstanceState(final Bundle outState) { super.onSaveInstanceState(outState); outState.putString(STATE, mState.name()); } /** * インターネット接続がない旨を表示する. */ private void showNoNetworkError() { showAlert(R.string.alert_title_error, R.string.alert_message_no_network, R.string.alert_btn_close, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { getActivity().finish(); } }); } /** * デバイス情報を新たに生成する. * * @param clientKey クライアントキー */ private void createNewDevice(final String clientKey) { IRKitManager.INSTANCE.createNewDevice(clientKey, new GetNewDeviceCallback() { @Override public void onGetDevice(final String serviceId, final String deviceKey) { Activity a = getActivity(); if (a == null || !(a instanceof IRKitSettingActivity)) { return; } final boolean success = (serviceId != null && deviceKey != null); if (success) { IRKitSettingActivity sa = (IRKitSettingActivity) a; sa.setServiceId(serviceId); sa.setDeviceKey(deviceKey); synchronized (IRKitWiFiSelectionFragment.this) { mState = State.GOT_DEVICE; } } a.runOnUiThread(new Runnable() { @Override public void run() { closeProgress(); if (success) { showAlert(R.string.alert_title_prepared, R.string.alert_message_prepared, R.string.alert_btn_close, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { switchViewEnable(false); synchronized (IRKitWiFiSelectionFragment.this) { mState = State.WAITING_IRKIT_SSID; } } }); } else { showNoNetworkError(); } } }); } }); } @Override public void onAppear() { super.onAppear(); Activity a = getActivity(); if (a == null || !(a instanceof IRKitSettingActivity)) { return; } String clientKey = ((IRKitSettingActivity) a).getClientKey(); if (clientKey == null) { ConnectivityManager cm = (ConnectivityManager) a.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = cm.getActiveNetworkInfo(); if (ni == null || !ni.isConnected()) { showNoNetworkError(); } else { showProgress(); IRKitManager.INSTANCE.fetchClientKey(new GetClientKeyCallback() { @Override public void onGetClientKey(final String clientKey) { Activity a = getActivity(); if (a == null || !(a instanceof IRKitSettingActivity)) { return; } if (clientKey != null) { ((IRKitSettingActivity) a).saveClientKey(clientKey); createNewDevice(clientKey); } else { a.runOnUiThread(new Runnable() { @Override public void run() { closeProgress(); showNoNetworkError(); } }); } } }); } } else { IRKitSettingActivity sa = (IRKitSettingActivity) a; if (sa.getDeviceKey() == null) { showProgress(); createNewDevice(clientKey); } } } @Override public synchronized void onEnterForeground() { super.onEnterForeground(); if (mState == State.WAITING_IRKIT_SSID) { mState = State.CHECKING_IRKIT; showProgress(); IRKitManager.INSTANCE.checkIfTargetIsIRKit(IRKitManager.DEVICE_HOST, new CheckingIRKitCallback() { @Override public void onChecked(final boolean isIRKit) { Activity a = getActivity(); if (a == null || !(a instanceof IRKitSettingActivity)) { return; } DialogInterface.OnClickListener listener = null; int title, message; if (isIRKit) { synchronized (IRKitWiFiSelectionFragment.this) { mState = State.IDLING; } title = R.string.alert_title_prepared; message = R.string.alert_message_is_irkit; listener = new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { switchViewEnable(true); } }; } else { title = R.string.alert_title_error; message = R.string.alert_message_is_not_irkit; listener = new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { synchronized (IRKitWiFiSelectionFragment.this) { mState = State.WAITING_IRKIT_SSID; switchViewEnable(false); } } }; } final int ft = title; final int fm = message; final DialogInterface.OnClickListener fl = listener; a.runOnUiThread(new Runnable() { @Override public void run() { closeProgress(); showAlert(ft, fm, R.string.alert_btn_close, fl); } }); } }); } } }