/* SonyCameraServiceListActivity Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.sonycamera.activity; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Bundle; import org.deviceconnect.android.deviceplugin.sonycamera.R; import org.deviceconnect.android.deviceplugin.sonycamera.SonyCameraDeviceService; import org.deviceconnect.android.deviceplugin.sonycamera.SonyCameraManager; import org.deviceconnect.android.deviceplugin.sonycamera.service.SonyCameraService; import org.deviceconnect.android.deviceplugin.sonycamera.utils.SonyCameraUtil; import org.deviceconnect.android.deviceplugin.sonycamera.utils.UserSettings; import org.deviceconnect.android.message.DConnectMessageService; import org.deviceconnect.android.service.DConnectService; import org.deviceconnect.android.ui.activity.DConnectServiceListActivity; import java.util.List; /** * SonyCameraサービス一覧画面. * * @author NTT DOCOMO, INC. */ public class SonyCameraServiceListActivity extends DConnectServiceListActivity { private WifiManager mWifiMgr; private UserSettings mSettings; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); mWifiMgr = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); mSettings = new UserSettings(this); saveWiFiSSID(); } @Override protected Class<? extends DConnectMessageService> getMessageServiceClass() { return SonyCameraDeviceService.class; } @Override protected Class<? extends Activity> getSettingManualActivityClass() { return SonyCameraSettingActivity.class; } @Override public void onServiceRemoved(final DConnectService service) { super.onServiceRemoved(service); SonyCameraDeviceService s = (SonyCameraDeviceService) getMessageService(); if (s != null) { SonyCameraManager manager = s.getSonyCameraManager(); manager.removeSonyCameraService((SonyCameraService) service); } } @Override protected boolean enablesItemClick() { return true; } @Override protected void onItemClick(final DConnectService service) { if (!mWifiMgr.isWifiEnabled()) { confirmEnableWifi(); } else { if (!service.isOnline()) { confirmConnectSonyCamera(service); } else { String ssid = mSettings.getSSID(); if (ssid != null) { confirmConnectWiFi(ssid); } } } } /** * 元々接続してあるWiFiのSSIDを保存します. */ private void saveWiFiSSID() { String ssid = SonyCameraUtil.getSSID(this); if (ssid != null && !SonyCameraUtil.checkSSID(ssid)) { mSettings.setSSID(ssid); } } /** * Wifiの機能を有効にする. */ private void turnOnWifi() { mWifiMgr.setWifiEnabled(true); } /** * Wifi機能を入れる確認を行う. */ private void confirmEnableWifi() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setIcon(android.R.drawable.ic_dialog_alert); builder.setTitle(R.string.sonycamera_confirm_wifi); builder.setMessage(R.string.sonycamera_confirm_wifi_enable); builder.setPositiveButton(R.string.sonycamera_ok, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int whichButton) { turnOnWifi(); } }); builder.setNegativeButton(R.string.sonycamera_cancel, null); builder.setCancelable(true); builder.show(); } /** * SonyCamera接続確認. */ private void confirmConnectSonyCamera(final DConnectService service) { saveWiFiSSID(); confirmConnectWiFi(service.getId()); } /** * 元のWiFiのアクセスポイントに接続確認. */ private void confirmConnectWiFi(final String ssid) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setIcon(android.R.drawable.ic_dialog_alert); builder.setTitle(R.string.sonycamera_confirm_wifi); builder.setMessage(getString(R.string.sonycamera_confirm_connect_wifi, ssid)); builder.setPositiveButton(R.string.sonycamera_ok, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int whichButton) { new Thread(new Runnable() { @Override public void run() { connectWifi2(ssid); } }).start(); } }); builder.setNegativeButton(R.string.sonycamera_cancel, null); builder.setCancelable(true); builder.show(); } /** * 指定されたネットワークが反映されているかをチェックして、接続を行う. * * @param networkId ネットワークID * @param targetSSID 接続するSSID * @return 接続に成功した場合はtrue、それ以外はfalse */ private boolean connectWifi(final int networkId, final String targetSSID) { String ssid = targetSSID.replace("\"", ""); mWifiMgr.startScan(); for (ScanResult result : mWifiMgr.getScanResults()) { if (result.SSID.replace("\"", "").equals(ssid)) { WifiInfo info = mWifiMgr.getConnectionInfo(); if (info != null) { mWifiMgr.disableNetwork(info.getNetworkId()); } return mWifiMgr.enableNetwork(networkId, true); } } return false; } /** * 既にWifiConfigurationにネットワーク情報が存在する場合には、既存の情報で接続する. * @param id サービスのSSID * @return 接続処理が行われた場合にはtrue、それ以外の場合にはfalse */ private boolean connectWifi2(final String id) { String ssid = '"' + id + '"'; List<WifiConfiguration> wifiConfigurations = mWifiMgr.getConfiguredNetworks(); for (WifiConfiguration configuration : wifiConfigurations) { if (configuration.SSID.contains(ssid)) { return connectWifi(configuration.networkId, configuration.SSID); } } return false; } }