/*
HostConnectionProfile.java
Copyright (c) 2017 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.host.profile;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.wifi.WifiManager;
import android.nfc.NfcAdapter;
import android.util.Log;
import org.deviceconnect.android.deviceplugin.host.BuildConfig;
import org.deviceconnect.android.deviceplugin.host.activity.BluetoothManageActivity;
import org.deviceconnect.android.event.EventError;
import org.deviceconnect.android.event.EventManager;
import org.deviceconnect.android.message.MessageUtils;
import org.deviceconnect.android.profile.ConnectionProfile;
import org.deviceconnect.android.profile.api.DConnectApi;
import org.deviceconnect.android.profile.api.DeleteApi;
import org.deviceconnect.android.profile.api.GetApi;
import org.deviceconnect.android.profile.api.PutApi;
import org.deviceconnect.message.DConnectMessage;
import org.deviceconnect.message.intent.message.IntentDConnectMessage;
/**
* Connection プロファイル.
*
* @author NTT DOCOMO, INC.
*/
public class HostConnectionProfile extends ConnectionProfile {
/** Debug Tag. */
private static final String TAG = "HOST";
/** Bluetooth Adapter. */
private BluetoothAdapter mBluetoothAdapter;
private final DConnectApi mGetWifiApi = new GetApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_WIFI;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
getEnabledOfWiFi(request, response);
setResult(response, IntentDConnectMessage.RESULT_OK);
return true;
}
};
private final DConnectApi mGetBluetoothApi = new GetApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_BLUETOOTH;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
getEnabledBluetooth(request, response);
setResult(response, IntentDConnectMessage.RESULT_OK);
return true;
}
};
private final DConnectApi mGetBleApi = new GetApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_BLE;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
getEnabledOfBluetoothLowEnery(request, response);
setResult(response, IntentDConnectMessage.RESULT_OK);
return true;
}
};
private final DConnectApi mGetNfcApi = new GetApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_NFC;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
NfcAdapter adapter = NfcAdapter.getDefaultAdapter(getContext());
if (adapter != null) {
if (adapter.isEnabled()) {
response.putExtra(PARAM_ENABLE, true);
} else {
response.putExtra(PARAM_ENABLE, false);
}
} else {
response.putExtra(PARAM_ENABLE, false);
}
setResult(response, IntentDConnectMessage.RESULT_OK);
return true;
}
};
private final DConnectApi mPutWifiApi = new PutApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_WIFI;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
setEnabledOfWiFi(request, response, true);
return true;
}
};
private final DConnectApi mPutBluetoothApi = new PutApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_BLUETOOTH;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
setEnabledBluetooth(request, response, true);
return true;
}
};
private final DConnectApi mPutBleApi = new PutApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_BLE;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
setEnabledBluetooth(request, response, true);
return true;
}
};
private final DConnectApi mDeleteWifiApi = new DeleteApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_WIFI;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
setEnabledOfWiFi(request, response, false);
return true;
}
};
private final DConnectApi mDeleteBluetoothApi = new DeleteApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_BLUETOOTH;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
setEnabledBluetooth(request, response, false);
return true;
}
};
private final DConnectApi mDeleteBleApi = new DeleteApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_BLE;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
setEnabledBluetooth(request, response, false);
return true;
}
};
private final DConnectApi mPutOnWifiChangeApi = new PutApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_WIFI_CHANGE;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
String serviceId = getServiceID(request);
setResult(response, DConnectMessage.RESULT_OK);
// イベントの登録
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
return true;
} else {
setResult(response, DConnectMessage.RESULT_ERROR);
return true;
}
}
};
private final DConnectApi mPutOnBluetoothChangeApi = new PutApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_BLUETOOTH_CHANGE;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
String serviceId = getServiceID(request);
// イベントの登録
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
} else {
setResult(response, DConnectMessage.RESULT_ERROR);
}
return true;
}
};
private final DConnectApi mDeleteOnWifiChange = new DeleteApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_WIFI_CHANGE;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
// イベントの解除
EventError error = EventManager.INSTANCE.removeEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
return true;
} else {
MessageUtils.setInvalidRequestParameterError(response, "Can not unregister event.");
return true;
}
}
};
private final DConnectApi mDeleteOnBluetoothChange = new DeleteApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_BLUETOOTH_CHANGE;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
// イベントの解除
EventError error = EventManager.INSTANCE.removeEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
return true;
} else {
MessageUtils.setInvalidRequestParameterError(response, "Can not unregister event.");
return true;
}
}
};
/**
* コンストラクタ.
*
* @param bluetoothAdapter Bluetoothアダプタ.
*/
public HostConnectionProfile(final BluetoothAdapter bluetoothAdapter) {
mBluetoothAdapter = bluetoothAdapter;
addApi(mGetWifiApi);
addApi(mGetBluetoothApi);
addApi(mGetBleApi);
addApi(mGetNfcApi);
addApi(mPutWifiApi);
addApi(mPutBluetoothApi);
addApi(mPutBleApi);
addApi(mDeleteWifiApi);
addApi(mDeleteBluetoothApi);
addApi(mDeleteBleApi);
addApi(mPutOnWifiChangeApi);
addApi(mPutOnBluetoothChangeApi);
addApi(mDeleteOnWifiChange);
addApi(mDeleteOnBluetoothChange);
}
/**
* WiFi接続の状態を取得する.
*
* @param request リクエスト
* @param response レスポンス
*/
protected void getEnabledOfWiFi(final Intent request, final Intent response) {
setResult(response, IntentDConnectMessage.RESULT_OK);
WifiManager mWifiManager = getWifiManager();
if (BuildConfig.DEBUG) {
Log.i(TAG, "WifiManager:" + mWifiManager.isWifiEnabled());
}
response.putExtra(PARAM_ENABLE, mWifiManager.isWifiEnabled());
}
/**
* WiFi接続の状態を設定する.
*
* @param request リクエスト
* @param response レスポンス
* @param enabled WiFi接続状態
*/
protected void setEnabledOfWiFi(final Intent request, final Intent response, final boolean enabled) {
WifiManager wifiMgr = getWifiManager();
if (wifiMgr.setWifiEnabled(enabled)) {
setResult(response, IntentDConnectMessage.RESULT_OK);
} else {
String msg;
if (enabled) {
msg = "Failed to enable WiFi.";
} else {
msg = "Failed to disable WiFi.";
}
MessageUtils.setUnknownError(response, msg);
}
}
/**
* Bluetooth接続の状態を取得する.
*
* @param request リクエスト
* @param response レスポンス
*/
protected void getEnabledBluetooth(final Intent request, final Intent response) {
setResult(response, IntentDConnectMessage.RESULT_OK);
response.putExtra(PARAM_ENABLE, mBluetoothAdapter.isEnabled());
}
/**
* Bluetooth接続の状態を設定する.
*
* @param request リクエスト
* @param response レスポンス
* @param enabled Bluetooth接続状態
*/
protected void setEnabledBluetooth(final Intent request, final Intent response, final boolean enabled) {
if (enabled) {
// enable bluetooth
if (!mBluetoothAdapter.isEnabled()) {
Intent intent = new Intent(request);
intent.setClass(getContext(), BluetoothManageActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getContext().startActivity(intent);
setResult(response, IntentDConnectMessage.RESULT_OK);
} else {
// bluetooth has already enabled
setResult(response, IntentDConnectMessage.RESULT_OK);
}
} else {
// disable bluetooth
boolean result = mBluetoothAdapter.disable();
// create response
if (result) {
setResult(response, IntentDConnectMessage.RESULT_OK);
} else {
setResult(response, IntentDConnectMessage.RESULT_ERROR);
}
}
}
/**
* Bluetooth Low Enery接続の状態を取得する.
*
* @param request リクエスト
* @param response レスポンス
*/
protected void getEnabledOfBluetoothLowEnery(final Intent request, final Intent response) {
// Bluetoothが機能していないときはBluetooth LEも機能しない扱いに。
if (this.getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)
&& mBluetoothAdapter.isEnabled()) {
response.putExtra(PARAM_ENABLE, true);
} else {
response.putExtra(PARAM_ENABLE, false);
}
}
private WifiManager getWifiManager() {
return (WifiManager) getContext().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
}
}