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);
}
};
}