package org.hacked.io.hue;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import org.json.JSONObject;
import java.text.MessageFormat;
import static org.hacked.io.hue.Constants.*;
/**
* Created by evelyne24 on 20/07/2013.
*/
public class ConnectFragment extends BaseFragment implements View.OnClickListener, TextWatcher {
private static final String TAG = "HueGame";
private static final String CONNECT_URL = "/hello/{0}";
private EditText serverEditText;
private View connectButton;
private String baseServerUrl;
private String serverUrl;
public static ConnectFragment getInstance(Bundle args) {
ConnectFragment fragment = new ConnectFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.connect_fragment, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
serverEditText = (EditText) view.findViewById(R.id.server_url);
connectButton = view.findViewById(R.id.connect);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
serverEditText.addTextChangedListener(this);
connectButton.setOnClickListener(this);
}
// TODO File a bug in Volley when the url is not valid it throws NPE!!!
@Override
public void onClick(View view) {
final int viewId = view.getId();
switch (viewId) {
case R.id.connect:
if (validateData()) {
doRegisterDevice(serverUrl);
}
break;
default:
break;
}
}
private boolean validateData() {
baseServerUrl = serverEditText.getText().toString();
String deviceId = Utils.getDeviceId(getActivity());
if (TextUtils.isEmpty(baseServerUrl)) {
serverEditText.setError(getString(R.string.game_server_empty_url));
return false;
}
serverUrl = baseServerUrl + MessageFormat.format(CONNECT_URL, deviceId);
if (Uri.parse(serverUrl).getHost() == null) {
serverEditText.setError(getString(R.string.game_server_invalid_url));
return false;
}
if (TextUtils.isEmpty(deviceId)) {
Log.e(TAG, "Device ID is empty!");
return false;
}
return true;
}
private void doRegisterDevice(String serverUrl) {
showLoadingFragment(true);
connectButton.setEnabled(false);
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, serverUrl, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, "Response OK: " + response.toString());
onDeviceConnectSuccess();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Response ERROR: " + error.getMessage());
onDeviceConnectError();
}
});
requestQueue.add(request);
}
private void onDeviceConnectSuccess() {
showLoadingFragment(false);
connectButton.setEnabled(true);
final SharedPreferences sharedPreferences = getActivity().getSharedPreferences(PREFERENCES, Context.MODE_PRIVATE);
sharedPreferences.edit().putString(KEY_SERVER_URL, baseServerUrl).commit();
sharedPreferences.edit().putString(KEY_DEVICE_ID, Utils.getDeviceId(getActivity())).commit();
Intent connectedIntent = new Intent(MainActivity.ACTION_DEVICE_CONNECTED);
connectedIntent.putExtras(getArguments());
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(connectedIntent);
}
private void onDeviceConnectError() {
showLoadingFragment(false);
connectButton.setEnabled(true);
Toast.makeText(getActivity(), R.string.game_server_error, Toast.LENGTH_LONG).show();
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
if (serverEditText.getError() != null) {
serverEditText.setError(null);
}
}
@Override
public void afterTextChanged(Editable editable) {}
}