package com.elmz.drift; import android.app.Activity; import android.app.Fragment; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.google.gson.JsonElement; public class LoginFragment extends Fragment { private EditText inpUsername; private EditText inpPassword; private Button btnLoginSubmit; private ProgressBar loginSpinner; private TextView loginStatus; private ImageView loginDone; private ImageView connectDone; private FrameLayout noDevice; private LinearLayout foundDevice; private TextView deviceId; private Listener mListener; private boolean loginOk = false; private boolean deviceOk = false; private SharedPreferences sp; public interface Listener { public void home(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.login_connect, container, false); sp = getActivity().getSharedPreferences(getString(R.string.preference_file_key), Context.MODE_PRIVATE); inpUsername = (EditText) view.findViewById(R.id.text_input_username); inpPassword = (EditText) view.findViewById(R.id.text_input_password); btnLoginSubmit = (Button) view.findViewById(R.id.btn_login_submit); loginSpinner = (ProgressBar) view.findViewById(R.id.prog_login_spinner); loginStatus = (TextView) view.findViewById(R.id.text_login_status); loginDone = (ImageView) view.findViewById(R.id.ic_done_login); connectDone = (ImageView) view.findViewById(R.id.ic_done_connect); noDevice = (FrameLayout) view.findViewById(R.id.message_no_device); foundDevice = (LinearLayout) view.findViewById(R.id.message_device_found); deviceId = (TextView) view.findViewById(R.id.text_device_id); btnLoginSubmit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { inpUsername.setEnabled(false); inpPassword.setEnabled(false); btnLoginSubmit.setEnabled(false); btnLoginSubmit.setVisibility(View.GONE); loginSpinner.setVisibility(View.VISIBLE); loginStatus.setText("Authorizing..."); final String username = inpUsername.getText().toString(); final String password = inpPassword.getText().toString(); APIRequestFragment arf = new APIRequestFragment(new ICallback() { @Override public void callback(JsonElement tok) { if(tok.isJsonNull() || tok.getAsString().length() == 0){ Log.d(getString(R.string.log_tag), "Login rejected"); loginStatus.setText("Invalid username or password."); inpUsername.setEnabled(true); inpPassword.setEnabled(true); btnLoginSubmit.setEnabled(true); btnLoginSubmit.setVisibility(View.VISIBLE); loginSpinner.setVisibility(View.GONE); } else { Log.d(getString(R.string.log_tag), "Login accepted"); SharedPreferences.Editor editor = sp.edit(); editor.putString("authToken", tok.getAsString()); editor.putString("username", username); editor.commit(); onLogin(); } } }); arf.execute("POST", "authUser", username, password); } }); if (sp.getString("authToken", null) != null && sp.getString("username", null) != null) { loginStatus.setText("Checking stored authorization..."); inpUsername.setEnabled(false); inpPassword.setEnabled(false); btnLoginSubmit.setEnabled(false); btnLoginSubmit.setVisibility(View.GONE); loginSpinner.setVisibility(View.VISIBLE); inpUsername.setText(sp.getString("username", "")); APIRequestFragment arf = new APIRequestFragment(new ICallback() { @Override public void callback(JsonElement arg) { String status; if (!arg.isJsonNull()) { status = arg.getAsString(); Log.d(getString(R.string.log_tag), "Auth validation: " + status); if (status.equals("true")) { onLogin(); } else { loginStatus.setText("Invalid stored authorization."); inpUsername.setEnabled(true); inpPassword.setEnabled(true); btnLoginSubmit.setEnabled(true); btnLoginSubmit.setVisibility(View.VISIBLE); loginSpinner.setVisibility(View.GONE); } } else { Log.d(getString(R.string.log_tag), "Auth returned null"); } } }); arf.execute("POST", "isValid", sp.getString("username", ""), sp.getString("authToken", "")); } // TODO: remove this view.findViewById(R.id.message_no_device).setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ onDevice(true); } }); return view; } @Override public void onAttach(Activity activity) { super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception try { mListener = (Listener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement LoginFragment.Listener"); } } void onLogin(){ loginStatus.setText("Authorized."); loginDone.setVisibility(View.VISIBLE); loginStatus.requestFocus(); loginOk = true; inpPassword.setText(""); loginSpinner.setVisibility(View.GONE); checkForCompletion(); } void onDevice(boolean enabled) { if (enabled) { connectDone.setVisibility(View.VISIBLE); noDevice.setVisibility(View.GONE); deviceId.setText("OpenBCI connected"); foundDevice.setVisibility(View.VISIBLE); deviceOk = true; checkForCompletion(); } else { connectDone.setVisibility(View.GONE); noDevice.setVisibility(View.VISIBLE); foundDevice.setVisibility(View.GONE); deviceOk = false; } } private void checkForCompletion(){ if(loginOk && deviceOk){ Log.d(getString(R.string.log_tag), "Passing to MainActivity"); mListener.home(); } } }