package com.kuxhausen.huemore.net.hue.ui;
import com.google.gson.Gson;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import com.android.volley.RequestQueue;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.Volley;
import com.kuxhausen.huemore.R;
import com.kuxhausen.huemore.net.hue.HubData;
import com.kuxhausen.huemore.net.hue.api.Bridge;
import com.kuxhausen.huemore.net.hue.api.NetworkMethods;
import com.kuxhausen.huemore.net.hue.api.RegistrationResponse;
import com.kuxhausen.huemore.persistence.Definitions;
import com.kuxhausen.huemore.persistence.Definitions.InternalArguments;
public class RegisterWithHubDialogFragment extends DialogFragment {
public final long length_in_milliseconds = 30000;
public final long period_in_milliseconds = 1000;
public ProgressBar progressBar;
public CountDownTimer countDownTimer;
Bridge[] bridges;
Gson gson = new Gson();
RequestQueue rq;
HubData mHubData;
public void setHubData(HubData hd) {
mHubData = hd;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
rq = Volley.newRequestQueue(this.getActivity());
if (this.getArguments() != null) {
bridges =
gson.fromJson(this.getArguments().getString(InternalArguments.BRIDGES), Bridge[].class);
} else if (mHubData != null) {
Bridge[] fakes = new Bridge[2];
fakes[0] = new Bridge();
fakes[0].internalipaddress = mHubData.localHubAddress;
fakes[1] = new Bridge();
fakes[1].internalipaddress = mHubData.portForwardedAddress;
bridges = fakes;
} else {
this.dismiss();
}
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
View registerWithHubView = inflater.inflate(R.layout.register_with_hub, null);
builder.setView(registerWithHubView);
progressBar = (ProgressBar) registerWithHubView.findViewById(R.id.timerProgressBar);
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
countDownTimer = new CountDownTimer(length_in_milliseconds, period_in_milliseconds) {
private boolean warned = false;
@Override
public void onTick(long millisUntilFinished) {
if (isAdded()) {
progressBar
.setProgress((int) (((length_in_milliseconds - millisUntilFinished) * 100.0)
/ length_in_milliseconds));
NetworkMethods.register(rq, getListeners(), bridges, getDeviceType());
}
}
@Override
public void onFinish() {
if (isAdded()) {
// try one last time
NetworkMethods.register(rq, getListeners(), bridges, getDeviceType());
// launch the failed registration dialog
RegistrationFailDialogFragment rfdf = new RegistrationFailDialogFragment();
rfdf.show(getFragmentManager(), InternalArguments.FRAG_MANAGER_DIALOG_TAG);
dismiss();
}
}
};
countDownTimer.start();
// Create the AlertDialog object and return it
return builder.create();
}
protected Listener<RegistrationResponse[]>[] getListeners() {
Listener<RegistrationResponse[]>[] listeners = new Listener[bridges.length];
for (int i = 0; i < bridges.length; i++) {
if (bridges[i] != null && bridges[i].internalipaddress != null) {
listeners[i] = new RegistrationListener(bridges[i].internalipaddress);
}
}
return listeners;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
countDownTimer.cancel();
onDestroyView();
}
public String getDeviceType() {
return getString(R.string.app_name);
}
class RegistrationListener implements Listener<RegistrationResponse[]> {
public String bridgeIP;
public RegistrationListener(String ip) {
bridgeIP = ip;
}
@Override
public void onResponse(RegistrationResponse[] response) {
if (response[0].success != null) {
countDownTimer.cancel();
if (getFragmentManager() != null) {
// Show the success dialog
RegistrationSuccessDialogFragment rsdf = new RegistrationSuccessDialogFragment();
rsdf.show(getFragmentManager(), InternalArguments.FRAG_MANAGER_DIALOG_TAG);
// Add connection to the database
if (mHubData == null) {
mHubData = new HubData();
}
if (mHubData.portForwardedAddress != null
&& bridgeIP.equals(mHubData.portForwardedAddress)) {
// don't need to adjust addresses
} else {
mHubData.localHubAddress = bridgeIP;
}
mHubData.hashedUsername = response[0].success.getUsername();
ContentValues cv = new ContentValues();
cv.put(Definitions.NetConnectionColumns.TYPE_COLUMN,
Definitions.NetBulbColumns.NetBulbType.PHILIPS_HUE);
cv.put(Definitions.NetConnectionColumns.JSON_COLUMN, gson.toJson(mHubData));
cv.put(Definitions.NetConnectionColumns.NAME_COLUMN, "?");
RegisterWithHubDialogFragment.this.getActivity().getContentResolver()
.insert(Definitions.NetConnectionColumns.URI, cv);
// done with registration dialog
dismiss();
}
}
}
}
}