package net.unverschaemt.pinfever;
import android.content.Context;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.StrictMode;
import com.google.gson.JsonObject;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
/**
* Created by D060338 on 26.05.2015.
*/
public class ServerAPI {
public final static String serverURL = "http://87.106.19.69:8080";
public final static String errorObject = "err";
public final static String errorInfo = "info";
public final static String dataObject = "data";
public final static String playerObject = "player";
public final static String autoGameObject = "autoGame";
public final static String turnbasedMatchObject = "TurnBasedMatch";
public final static String friends = "friends";
public final static String players = "players";
public final static String id = "_id";
public final static String displayName = "displayName";
public final static String level = "level";
public final static String avatar = "avatar";
public final static String token = "token";
public final static String state = "state";
public final static String status = "status";
public final static String mode = "mode";
public final static String participants = "participants";
public final static String matchId = "matchId";
public final static String rounds = "turns";
public final static String paramAuthToken = "api-auth-token";
public final static String paramEmail = "email";
public final static String paramPassword = "password";
public final static String paramDisplayName = "displayName";
public final static String paramPlayerId = "playerId";
public final static String urlLogin = "/auth/login";
public final static String urlRegister = "/auth/register";
public final static String urlAddFriend = "/players/me/addfriend/";
public final static String urlFriendsList = "/players/me/friends";
public final static String urlPlayersSearch = "/players/search/";
public final static String urlGetPlayer = "/players/";
public final static String urlSetPlayer = "/players/me/set";
public final static String urlUploadAvatar = "/players/me/avatarupload";
public final static String urlGetPlayerMe = "me";
public final static String urlFindAutoGame = "/turnbasedmatch/findauto";
public final static String urlCreateGame = "/turnbasedmatch/create";
public final static String urlGetGame = "/turnbasedmatch/";
private java.util.Map<String, RequestMethod> requestMethods = new HashMap<String, RequestMethod>();
private java.util.Map<String, ContentType> contentTypes = new HashMap<String, ContentType>();
private final Context context;
public ServerAPI(Context context) {
this.context = context;
requestMethods.put(urlLogin, RequestMethod.POST);
contentTypes.put(urlLogin, ContentType.JSON);
requestMethods.put(urlRegister, RequestMethod.POST);
contentTypes.put(urlRegister, ContentType.JSON);
requestMethods.put(urlAddFriend, RequestMethod.POST);
contentTypes.put(urlAddFriend, ContentType.JSON);
requestMethods.put(urlFriendsList, RequestMethod.GET);
requestMethods.put(urlPlayersSearch, RequestMethod.GET);
requestMethods.put(urlGetPlayer, RequestMethod.GET);
requestMethods.put(urlSetPlayer, RequestMethod.POST);
contentTypes.put(urlSetPlayer, ContentType.JSON);
requestMethods.put(urlUploadAvatar, RequestMethod.POST);
contentTypes.put(urlUploadAvatar, ContentType.FORM_DATA);
requestMethods.put(urlFindAutoGame, RequestMethod.POST);
contentTypes.put(urlFindAutoGame, ContentType.JSON);
requestMethods.put(urlCreateGame, RequestMethod.POST);
contentTypes.put(urlCreateGame, ContentType.JSON);
requestMethods.put(urlGetGame, RequestMethod.GET);
StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
public void connect(String urlRequest, String urlParameters, Object postObject, FutureCallback callback) {
ConnectivityManager connMgr = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
RequestMethod requestMethod = requestMethods.get(urlRequest);
switch (requestMethod) {
case GET:
makeGETRequest(urlRequest, urlParameters, callback);
break;
case POST:
makePostRequest(urlRequest, urlParameters, postObject, callback);
break;
}
} else {
JsonObject error = new JsonObject();
error.addProperty(errorObject, "connection failed");
error.addProperty(errorInfo, context.getString(R.string.message_NoInternetConnection));
callback.onCompleted(null, error);
}
}
public void downloadFile(String urlRequest, String urlParameters, File file, FutureCallback callback) {
ConnectivityManager connMgr = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
Ion.with(context)
.load(ServerAPI.serverURL + urlRequest + urlParameters)
.addHeader(ServerAPI.paramAuthToken, getToken())
.write(file)
.setCallback(callback);
} else {
JsonObject error = new JsonObject();
error.addProperty(errorObject, "connection failed");
error.addProperty(errorInfo, context.getString(R.string.message_NoInternetConnection));
callback.onCompleted(null, error);
}
}
private void makeGETRequest(String urlRequest, String urlParameters, FutureCallback callback) {
Ion.with(context)
.load(ServerAPI.serverURL + urlRequest + urlParameters)
.addHeader(ServerAPI.paramAuthToken, getToken())
.asJsonObject()
.setCallback(callback);
return;
}
private void makePostRequest(String urlRequest, String urlParameters, Object postObject, FutureCallback callback) {
ContentType contentType = contentTypes.get(urlRequest);
switch (contentType) {
case JSON:
JsonObject jsonObject = (JsonObject) postObject;
Ion.with(context)
.load(ServerAPI.serverURL + urlRequest + urlParameters)
.addHeader(ServerAPI.paramAuthToken, getToken())
.setJsonObjectBody(jsonObject)
.asJsonObject()
.setCallback(callback);
break;
case FORM_DATA:
File file = (File) postObject;
Ion.with(context)
.load(ServerAPI.serverURL + urlRequest + urlParameters)
.addHeader(ServerAPI.paramAuthToken, getToken())
.setMultipartFile("image", "image/jpeg", file)
.setMultipartContentType("multipart/form-data")
.asJsonObject()
.setCallback(callback);
break;
}
}
public String getToken() {
SharedPreferences sharedPreferences = context.getSharedPreferences(ServerAPI.token, Context.MODE_PRIVATE);
return sharedPreferences.getString(ServerAPI.token, "");
}
public static User convertJSONToUser(JsonObject playerJSON) {
User player = new User();
player.setId(playerJSON.get(ServerAPI.id).getAsString());
player.setUserName(playerJSON.get(ServerAPI.displayName).getAsString());
player.setScore(playerJSON.get(ServerAPI.level).getAsInt());
return player;
}
}