Skip to content

Instantly share code, notes, and snippets.

@daniel-stoneuk
Created March 8, 2017 21:27
Show Gist options
  • Save daniel-stoneuk/18d9d13fe539ce519420093d1768d5ce to your computer and use it in GitHub Desktop.
Save daniel-stoneuk/18d9d13fe539ce519420093d1768d5ce to your computer and use it in GitHub Desktop.
package com.danielstone.energyhive.intro;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.design.widget.Snackbar;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.danielstone.energyhive.R;
import com.danielstone.energyhive.utilities.DemoManager;
import com.danielstone.energyhive.utilities.Utility;
import com.heinrichreimersoftware.materialintro.view.parallax.ParallaxSlideFragment;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class LogInFragment extends ParallaxSlideFragment {
private static final String TAG = LogInFragment.class.getSimpleName();
private TextView titleTextView, descriptionTextView;
private EditText usernameEditText, passwordEditText;
private Button loginButton, efergyDemoButton, energyhiveDemoButton;
public static final int STATE_OK = 0;
public static final int STATE_LOADING = 1;
public static final int RESULT_OK = 0;
public static final int RESULT_WRONG_CREDENTIALS = 1;
public static final int RESULT_OTHER = 2;
private int mState = STATE_OK;
private boolean loggedIn = false;
private boolean mKeyboardShowing = false;
public interface LoginCallbacks {
void manualButtonPressed(LogInFragment logInFragment);
void onLoggedIn();
}
private class LoginTask extends AsyncTask<String, Void, String> {
OkHttpClient client = new OkHttpClient();
String username = "";
@Override
protected String doInBackground(String... strings) {
username = strings[0];
final String USERNAME_PARAM = "username";
final String PASSWORD_PARAM = "password";
final String SERVICE_PARAM = "service";
final String DEVICE_PARAM = "device";
String device = "Monitor App - " + getDeviceName();
final String LOGIN_BASE_URL = getActivity().getString(R.string.api_gettoken_base_url);
Uri builtUri = Uri.parse(LOGIN_BASE_URL);
Log.i(TAG, "doInBackground: builtUri: " + builtUri);
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(USERNAME_PARAM, strings[0])
.addFormDataPart(PASSWORD_PARAM, strings[1])
.addFormDataPart(SERVICE_PARAM, "Monitor")
.addFormDataPart(DEVICE_PARAM, device)
.build();
Request request = new Request.Builder()
.url(builtUri.toString())
.post(requestBody)
.build();
Response response;
String responseString = "";
try {
response = client.newCall(request).execute();
responseString = response.body().string();
} catch (IOException e) {
e.printStackTrace();
responseString = "error";
}
return responseString;
}
@Override
protected void onPostExecute(String responseString) {
mState = STATE_OK;
if (getActivity() != null) {
int resultCode = RESULT_OTHER;
if (!responseString.equals("error")) {
try {
final String STATUS = "status";
final String TOKEN = "token";
final String DESC = "desc";
JSONObject result = new JSONObject(responseString);
if (result.getString(STATUS).equals("ok")) {
String appToken = result.getString(TOKEN);
Log.i(TAG, "" + appToken);
setToken(appToken, DemoManager.DEMO_OFF, username);
resultCode = RESULT_OK;
} else {
if (result.getString(DESC).equals("Invalid credentials")) {
resultCode = RESULT_WRONG_CREDENTIALS;
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
switch (resultCode) {
case RESULT_OK: {
loginButton.setText(R.string.intro_login_signed_in);
loggedIn = true;
updateNavigation();
((LoginCallbacks) getActivity()).onLoggedIn();
return;
}
case RESULT_WRONG_CREDENTIALS: {
makeErrorSnackbar(getContext().getString(R.string.intro_login_credentials));
break;
}
case RESULT_OTHER: {
if (Utility.isNetworkAvailable(getContext())) {
makeErrorSnackbar(getContext().getString(R.string.intro_login_failed));
} else {
makeErrorSnackbar(getContext().getString(R.string.intro_login_no_connection));
}
break;
}
}
loginButton.setEnabled(true);
usernameEditText.setEnabled(true);
passwordEditText.setEnabled(true);
loginButton.setText(R.string.intro_login_button);
}
}
private void makeErrorSnackbar(String message) {
if (getActivity() != null) {
View contentView = getActivity().findViewById(android.R.id.content);
if (contentView != null)
Snackbar.make(contentView, message,
Snackbar.LENGTH_LONG)
.setAction(R.string.intro_login_manually_set_apptoken, new View.OnClickListener() {
@Override
public void onClick(View view) {
((LoginCallbacks) getActivity()).manualButtonPressed(LogInFragment.this);
}
}).show();
}
}
}
public LogInFragment() {
// Required empty public constructor
}
public static LogInFragment newInstance() {
return new LogInFragment();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.intro_slide_login, container, false);
titleTextView = (TextView) root.findViewById(R.id.app_intro_login_title);
descriptionTextView = (TextView) root.findViewById(R.id.app_intro_login_description);
loginButton = (Button) root.findViewById(R.id.app_intro_login_button);
usernameEditText = (EditText) root.findViewById(R.id.app_intro_login_username);
passwordEditText = (EditText) root.findViewById(R.id.app_intro_login_password);
String oldUsername = PreferenceManager.getDefaultSharedPreferences(getActivity()).getString(getString(R.string.pref_key_username),"");
usernameEditText.setText((oldUsername.equals("Demo Mode") ? "" : oldUsername));
passwordEditText.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
// If the event is a key-down event on the "enter" button
if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
(keyCode == KeyEvent.KEYCODE_ENTER)) {
// Perform action on key press
signIn(DemoManager.DEMO_OFF);
return true;
}
return false;
}
});
efergyDemoButton = (Button) root.findViewById(R.id.demo_button_efergy);
efergyDemoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: onClickListener demo mode");
signIn(DemoManager.DEMO_EFERGY);
}
});
energyhiveDemoButton = (Button) root.findViewById(R.id.demo_button_energyhive);
energyhiveDemoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: onClickListener demo mode");
signIn(DemoManager.DEMO_ENERGYHIVE);
}
});
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
signIn(DemoManager.DEMO_OFF);
}
});
return root;
}
private void setToken(String token, int demo, String username) {
if (demo != DemoManager.DEMO_OFF) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt(getString(R.string.pref_key_demo), demo);
editor.putString(getString(R.string.pref_key_appkey), getString(R.string.demo_mode_apptoken));
editor.putString(getString(R.string.pref_key_username), username);
editor.apply();
} else {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(getString(R.string.pref_key_appkey), token);
editor.putString(getString(R.string.pref_key_username), username);
editor.apply();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
Utility.clearAppShortcuts(getActivity());
}
}
public void signIn(int demo) {
if (mState != STATE_LOADING) {
mState = STATE_LOADING;
usernameEditText.setEnabled(false);
passwordEditText.setEnabled(false);
loginButton.setEnabled(false);
if (demo == DemoManager.DEMO_OFF) {
loginButton.setText(R.string.capital_l_loading);
String username = usernameEditText.getText().toString();
String password = passwordEditText.getText().toString();
LoginTask loginTask = new LoginTask();
loginTask.execute(username, password);
} else {
setToken("", demo, "Demo Mode");
loginButton.setText(R.string.intro_login_demo_mode);
View contentView = getActivity().findViewById(android.R.id.content);
Snackbar.make(contentView, R.string.intro_login_demo_mode_selected,
Snackbar.LENGTH_LONG).show();
loggedIn = true;
updateNavigation();
((LoginCallbacks) getActivity()).onLoggedIn();
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public boolean canGoForward() {
return loggedIn;
}
public String getDeviceName() {
String manufacturer = Build.MANUFACTURER;
String model = Build.MODEL;
if (model.startsWith(manufacturer)) {
return capitalize(model);
} else {
return capitalize(manufacturer) + " " + model;
}
}
private String capitalize(String s) {
if (s == null || s.length() == 0) {
return "";
}
char first = s.charAt(0);
if (Character.isUpperCase(first)) {
return s;
} else {
return Character.toUpperCase(first) + s.substring(1);
}
}
public void setKeyboardShowing(boolean keyboardShowing) {
mKeyboardShowing = keyboardShowing;
Log.i(TAG, "setKeyboardShowing: " + keyboardShowing);
if (mKeyboardShowing) {
titleTextView.setVisibility(View.GONE);
descriptionTextView.setVisibility(View.GONE);
} else {
if (titleTextView.getVisibility() != View.VISIBLE) {
titleTextView.setAlpha(0f);
titleTextView.setVisibility(View.VISIBLE);
titleTextView.animate().alpha(1f).setDuration(500);
} else titleTextView.setVisibility(View.VISIBLE);
if (descriptionTextView.getVisibility() != View.VISIBLE) {
descriptionTextView.setAlpha(0f);
descriptionTextView.setVisibility(View.VISIBLE);
descriptionTextView.animate().alpha(1f).setDuration(500);
} else descriptionTextView.setVisibility(View.VISIBLE);
}
}
}
package com.danielstone.energyhive.intro;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.design.widget.Snackbar;
import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver;
import com.danielstone.energyhive.R;
import com.danielstone.energyhive.utilities.DemoManager;
import com.danielstone.energyhive.utilities.Utility;
import com.heinrichreimersoftware.materialintro.app.OnNavigationBlockedListener;
import com.heinrichreimersoftware.materialintro.slide.FragmentSlide;
import com.heinrichreimersoftware.materialintro.slide.SimpleSlide;
public class MainIntroActivity extends com.heinrichreimersoftware.materialintro.app.IntroActivity implements LogInFragment.LoginCallbacks, AppTokenFragment.AppTokenCallbacks {
private boolean manualMode = false;
private final static String TAG = MainIntroActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
manualMode = sharedPreferences.getBoolean(getString(R.string.pref_key_manual_apptoken), Boolean.parseBoolean(getString(R.string.pref_default_manual_apptoken)));
/**
* Standard slide (like Google's intros)
*/
addSlide(new SimpleSlide.Builder()
.title(R.string.intro_title_1)
.description(R.string.intro_description_1)
.image(R.drawable.intro_icon)
.background(R.color.color_intro_one)
.backgroundDark(R.color.color_intro_one_dark)
.layout(R.layout.slide_intro)
.build());
if (manualMode) {
addSlide(new FragmentSlide.Builder()
.background(R.color.color_intro_three)
.backgroundDark(R.color.color_intro_three_dark)
.fragment(AppTokenFragment.newInstance(manualMode))
.build());
} else {
addSlide(new FragmentSlide.Builder()
.background(R.color.color_intro_login)
.backgroundDark(R.color.color_intro_login_dark)
.fragment(LogInFragment.newInstance())
.build());
}
addSlide(new SimpleSlide.Builder()
.title(R.string.intro_signed_in_title)
.description(R.string.intro_signed_in_description)
.image(R.drawable.ic_verified_user_white_48px)
.background(R.color.colorPrimary)
.backgroundDark(R.color.colorPrimaryDark)
.layout(R.layout.slide_intro)
.build());
addOnNavigationBlockedListener(new OnNavigationBlockedListener() {
@Override
public void onNavigationBlocked(int position, int direction) {
View contentView = findViewById(android.R.id.content);
if (contentView != null) {
if (manualMode) {
Snackbar.make(contentView, (position == 1) ?
getString(R.string.enter_apptoken_error) : getString(R.string.somethings_wrong),
Snackbar.LENGTH_LONG).show();
} else if (!manualMode)
if (getSlide(1).getFragment() != null)
((LogInFragment) getSlide(1).getFragment()).signIn(DemoManager.DEMO_OFF);
}
}
});
final View activityRootView = findViewById(android.R.id.content);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
if (!manualMode && getSlide(1).getFragment() != null) {
if (getSlide(1).getFragment() instanceof LogInFragment) {
LogInFragment logInFragment = (LogInFragment) getSlide(1).getFragment();
if (heightDiff > Utility.dpToPx(MainIntroActivity.this, 200)) { // if more than 200 dp, it's probably a keyboard...
logInFragment.setKeyboardShowing(true);
} else {
logInFragment.setKeyboardShowing(false);
}
}
}
}
});
}
@Override
public void onBackPressed() {
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
}
// @Override
// public void manualButtonPressed(TutorialFragment tutorialFragment) {
// Log.d(TAG, "manualButtonPressed: ");
// if (!manualMode) {
// SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
// SharedPreferences.Editor editor = sharedPreferences.edit();
// editor.putBoolean(getString(R.string.pref_key_manual_apptoken), true);
// editor.apply();
//
// finish();
// }
// }
@Override
public void automaticButtonPressed(AppTokenFragment appTokenFragment) {
Log.d(TAG, "automaticButtonPressed: ");
Log.d(TAG, "manualButtonPressed: ");
if (manualMode) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(getString(R.string.pref_key_manual_apptoken), false);
editor.apply();
finish();
}
}
@Override
public void manualButtonPressed(LogInFragment logInFragment) {
Log.d(TAG, "manualButtonPressed: ");
if (!manualMode) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(getString(R.string.pref_key_manual_apptoken), true);
editor.apply();
finish();
}
}
@Override
public void onLoggedIn() {
Log.i(TAG, "onLoggedIn: ");
nextSlide();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment