package org.deviceconnect.android.manager.util; import android.content.Context; import android.util.Log; import org.deviceconnect.android.manager.BuildConfig; import org.deviceconnect.android.profile.ServiceDiscoveryProfile; import org.deviceconnect.message.DConnectMessage; import org.deviceconnect.profile.ServiceDiscoveryProfileConstants; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; public class ServiceDiscovery extends Authorization { private static final boolean DEBUG = BuildConfig.DEBUG; private static final String TAG = "Manager"; public ServiceDiscovery(final Context context) { super(context); } @Override protected List<ServiceContainer> doInBackground(final Void... params) { return parseServiceList(executeServiceDiscovery(getAccessToken())); } private String executeServiceDiscovery(final String accessToken) { Map<String, String> params = new HashMap<String, String>() { {put("accessToken", accessToken);} }; String uri = getUri(ServiceDiscoveryProfile.PATH_PROFILE, params); byte[] bytes = HttpUtil.get(uri); if (bytes != null) { return new String(bytes); } return null; } private List<ServiceContainer> parseServiceList(final String jsonString) { List<ServiceContainer> services = new ArrayList<>(); if (jsonString == null) { return services; } try { JSONObject json = new JSONObject(jsonString); int result = json.getInt("result"); if (result == DConnectMessage.RESULT_OK) { JSONArray serviceArray = json.getJSONArray(ServiceDiscoveryProfile.PARAM_SERVICES); for (int i = 0; i < serviceArray.length(); i++) { services.add(parseService(serviceArray.getJSONObject(i))); } } else { int code = json.getInt("errorCode"); switch (DConnectMessage.ErrorCode.getInstance(code)) { case AUTHORIZATION: case EXPIRED_ACCESS_TOKEN: case NOT_FOUND_CLIENT_ID: clearAccessToken(); return services; default: if (DEBUG) { Log.w(TAG, ""); } break; } } } catch (JSONException e) { if (DEBUG) { Log.e(TAG, "", e); } } Collections.sort(services, mComparator); return services; } private ServiceContainer parseService(final JSONObject obj) throws JSONException { ServiceContainer service = new ServiceContainer(); service.setId(obj.getString(ServiceDiscoveryProfile.PARAM_ID)); service.setName(obj.getString(ServiceDiscoveryProfile.PARAM_NAME)); if (obj.has(ServiceDiscoveryProfile.PARAM_TYPE)) { service.setNetworkType(ServiceDiscoveryProfile.NetworkType.getInstance(obj.getString(ServiceDiscoveryProfile.PARAM_TYPE))); } else { service.setNetworkType(ServiceDiscoveryProfileConstants.NetworkType.UNKNOWN); } service.setOnline(obj.getBoolean(ServiceDiscoveryProfile.PARAM_ONLINE)); return service; } private Comparator<ServiceContainer> mComparator = new Comparator<ServiceContainer>() { @Override public int compare(final ServiceContainer lhs, final ServiceContainer rhs) { String name1 = lhs.getName(); String name2 = rhs.getName(); if (name1 == null || name2 == null) { return 0; } return name1.compareTo(name2); } }; }