/* KadecotServiceDiscoveryProfile Copyright (c) 2015 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.kadecot.profile; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.AsyncTask; import org.deviceconnect.android.deviceplugin.kadecot.KadecotDeviceApplication; import org.deviceconnect.android.deviceplugin.kadecot.KadecotDeviceService; import org.deviceconnect.android.deviceplugin.kadecot.kadecotdevice.ENLObject; import org.deviceconnect.android.deviceplugin.kadecot.kadecotdevice.KadecotDevice; import org.deviceconnect.android.deviceplugin.kadecot.service.KadecotService; import org.deviceconnect.android.profile.ServiceDiscoveryProfile; import org.deviceconnect.android.profile.api.DConnectApi; import org.deviceconnect.android.profile.api.GetApi; import org.deviceconnect.android.service.DConnectService; import org.deviceconnect.android.service.DConnectServiceProvider; import org.json.JSONArray; import org.json.JSONObject; import java.util.ArrayList; /** * Kadecot Service Discovery Profile. * * @author NTT DOCOMO, INC. */ public class KadecotServiceDiscoveryProfile extends ServiceDiscoveryProfile { /** Kadecot device list. */ private ArrayList<KadecotDevice> mKadecotDevices = new ArrayList<>(); /** * Constructor. * @param provider an instance of {@link DConnectServiceProvider} */ public KadecotServiceDiscoveryProfile(final DConnectServiceProvider provider) { super(provider); addApi(mServiceDiscoveryApi); } private final DConnectApi mServiceDiscoveryApi = new GetApi() { @Override public boolean onRequest(final Intent request, final Intent response) { new DeviceSearchAsyncTask().execute(response); return false; } }; /** * Get NickName. * * @param serviceId ServiceId. * @return Nickname(Success) / null(not found) */ public String getNickName(final String serviceId) { for (KadecotDevice device : mKadecotDevices) { String id = device.getServiceId(); if (id != null && id.equals(serviceId)) { return device.getNickname(); } } return null; } /** * Device search async task. */ private class DeviceSearchAsyncTask extends AsyncTask<Intent, Void, Void> { private final ContentResolver mResolver = getContext().getContentResolver(); private final KadecotDeviceApplication mApp = ((KadecotDeviceService) getContext()).getKadecotDeviceApplication(); @Override protected Void doInBackground(final Intent... intents) { Intent response = intents[0]; String urlstr = "content://com.sonycsl.kadecot.json.provider/jsonp/v1/devices/"; Cursor cursor = mResolver.query(Uri.parse(urlstr), null, null, null, null); if (cursor != null) { cursor.moveToFirst(); try { JSONObject rootObject = new JSONObject(cursor.getString(0)); JSONArray resultArray = rootObject.getJSONArray("deviceList"); int count = resultArray.length(); JSONObject[] kadecotObject = new JSONObject[count]; for (int i = 0; i < count; i++) { kadecotObject[i] = resultArray.getJSONObject(i); } mKadecotDevices.clear(); for (JSONObject obj : kadecotObject) { KadecotDevice kadecotDevice = new KadecotDevice(); kadecotDevice.setDeviceId(obj.getString("deviceId")); kadecotDevice.setProtocol(obj.getString("protocol")); kadecotDevice.setDeviceType(obj.getString("deviceType")); kadecotDevice.setDescription(obj.getString("description")); kadecotDevice.setStatus(obj.getString("status")); kadecotDevice.setNickname(obj.getString("nickname")); kadecotDevice.setIpAddr(obj.getString("ip_addr")); kadecotDevice.setLocation(obj.getString("location")); mKadecotDevices.add(kadecotDevice); if (kadecotDevice.getProtocol().equals("echonetlite")) { String serviceId = ""; ENLObject object = mApp.getENLObject(); String deviceType = object.exchangeServiceId(kadecotDevice.getDeviceType()); if (deviceType != null) { serviceId += "kadecot_" + kadecotDevice.getDeviceId() + "." + deviceType; kadecotDevice.setServiceId(serviceId); DConnectService service = getServiceProvider().getService(serviceId); if (service == null) { service = new KadecotService(kadecotDevice, object); getServiceProvider().addService(service); } service.setOnline(kadecotDevice.getStatus().equals("true")); } } } appendServiceList(response); sendResponse(response); } catch (Exception e) { e.printStackTrace(); } cursor.close(); } return null; } } }