package com.wangdaye.mysplash.common.ui.activity;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.os.Build;
import android.os.Bundle;
import android.os.Message;
import android.support.annotation.IntDef;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.NestedScrollView;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import com.github.rahatarmanahmed.cpv.CircularProgressView;
import com.wangdaye.mysplash.R;
import com.wangdaye.mysplash.common.data.entity.unsplash.Me;
import com.wangdaye.mysplash.common.data.service.UserService;
import com.wangdaye.mysplash.common._basic.MysplashActivity;
import com.wangdaye.mysplash.common.ui.widget.SwipeBackCoordinatorLayout;
import com.wangdaye.mysplash.common.utils.DisplayUtils;
import com.wangdaye.mysplash.common.utils.manager.AuthManager;
import com.wangdaye.mysplash.common.ui.widget.coordinatorView.StatusBarView;
import com.wangdaye.mysplash.common.utils.helper.NotificationHelper;
import com.wangdaye.mysplash.common.utils.manager.ShortcutsManager;
import com.wangdaye.mysplash.common.utils.manager.ThemeManager;
import com.wangdaye.mysplash.common.utils.widget.SafeHandler;
import java.util.Timer;
import java.util.TimerTask;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit2.Call;
import retrofit2.Response;
/**
* Update me activity.
*
* This activity is used to update {@link Me}.
*
* */
public class UpdateMeActivity extends MysplashActivity
implements SwipeBackCoordinatorLayout.OnSwipeListener,
UserService.OnRequestMeProfileListener, SafeHandler.HandlerContainer {
@BindView(R.id.activity_update_me_container)
CoordinatorLayout container;
@BindView(R.id.activity_update_me_statusBar)
StatusBarView statusBar;
@BindView(R.id.activity_update_me_scrollView)
NestedScrollView scrollView;
@BindView(R.id.container_update_me_progressView)
CircularProgressView progressView;
@BindView(R.id.container_update_me_textContainer)
LinearLayout contentView;
private EditText usernameTxt;
private EditText firstNameTxt;
private EditText lastNameTxt;
private EditText emailTxt;
private EditText portfolioTxt;
private EditText locationTxt;
private EditText bioTxt;
private SafeHandler<UpdateMeActivity> handler;
private UserService service;
private boolean backPressed = false;
@StateRule
private int state;
private final static int INPUT_STATE = 0;
private final static int UPDATE_STATE = 1;
@IntDef({INPUT_STATE, UPDATE_STATE})
private @interface StateRule {}
private final String KEY_UPDATE_ME_ACTIVITY_USERNAME = "update_me_activity_username";
private final String KEY_UPDATE_ME_ACTIVITY_FIRSTNAME = "update_me_activity_firstname";
private final String KEY_UPDATE_ME_ACTIVITY_LASTNAME = "update_me_activity_lastname";
private final String KEY_UPDATE_ME_ACTIVITY_EMAIL = "update_me_activity_email";
private final String KEY_UPDATE_ME_ACTIVITY_PORTFOLIO = "update_me_activity_portfolio";
private final String KEY_UPDATE_ME_ACTIVITY_LOCATION = "update_me_activity_location";
private final String KEY_UPDATE_ME_ACTIVITY_BIO = "update_me_activity_bio";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update_me);
}
@Override
protected void onStart() {
super.onStart();
if (!isStarted()) {
setStarted();
ButterKnife.bind(this);
initData();
initWidget();
}
}
@Override
public void onDestroy() {
super.onDestroy();
service.cancel();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_UPDATE_ME_ACTIVITY_USERNAME, usernameTxt.getText().toString());
outState.putString(KEY_UPDATE_ME_ACTIVITY_FIRSTNAME, firstNameTxt.getText().toString());
outState.putString(KEY_UPDATE_ME_ACTIVITY_LASTNAME, lastNameTxt.getText().toString());
outState.putString(KEY_UPDATE_ME_ACTIVITY_EMAIL, emailTxt.getText().toString());
outState.putString(KEY_UPDATE_ME_ACTIVITY_PORTFOLIO, portfolioTxt.getText().toString());
outState.putString(KEY_UPDATE_ME_ACTIVITY_LOCATION, locationTxt.getText().toString());
outState.putString(KEY_UPDATE_ME_ACTIVITY_BIO, bioTxt.getText().toString());
}
@Override
protected void setTheme() {
if (ThemeManager.getInstance(this).isLightTheme()) {
setTheme(R.style.MysplashTheme_light_Translucent_Common);
} else {
setTheme(R.style.MysplashTheme_dark_Translucent_Common);
}
}
@Override
public void handleBackPressed() {
if (state == INPUT_STATE && backPressed) {
finishActivity(SwipeBackCoordinatorLayout.DOWN_DIR);
} else if (state == INPUT_STATE) {
backPressed = true;
NotificationHelper.showSnackbar(
getString(R.string.feedback_click_again_to_exit),
Snackbar.LENGTH_SHORT);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
handler.obtainMessage(1).sendToTarget();
}
}, 2000);
}
}
@Override
protected void backToTop() {
// do nothing.
}
@Override
public void finishActivity(int dir) {
finish();
switch (dir) {
case SwipeBackCoordinatorLayout.UP_DIR:
overridePendingTransition(0, R.anim.activity_slide_out_top);
break;
case SwipeBackCoordinatorLayout.DOWN_DIR:
overridePendingTransition(0, R.anim.activity_slide_out_bottom);
break;
}
}
@Override
public CoordinatorLayout getSnackbarContainer() {
return container;
}
// init.
private void initData() {
this.service = UserService.getService();
this.state = INPUT_STATE;
}
private void initWidget() {
this.handler = new SafeHandler<>(this);
SwipeBackCoordinatorLayout swipeBackView = ButterKnife.findById(
this, R.id.activity_update_me_swipeBackView);
swipeBackView.setOnSwipeListener(this);
ImageButton closeBtn = ButterKnife.findById(this, R.id.container_update_me_closeBtn);
ThemeManager.setImageResource(closeBtn, R.drawable.ic_close_light, R.drawable.ic_close_dark);
progressView.setVisibility(View.GONE);
contentView.setVisibility(View.VISIBLE);
this.usernameTxt = ButterKnife.findById(this, R.id.container_update_me_usernameTxt);
DisplayUtils.setTypeface(this, usernameTxt);
this.firstNameTxt = ButterKnife.findById(this, R.id.container_update_me_firstNameTxt);
DisplayUtils.setTypeface(this, firstNameTxt);
this.lastNameTxt = ButterKnife.findById(this, R.id.container_update_me_lastNameTxt);
DisplayUtils.setTypeface(this, lastNameTxt);
this.emailTxt = ButterKnife.findById(this, R.id.container_update_me_emailTxt);
DisplayUtils.setTypeface(this, emailTxt);
this.portfolioTxt = ButterKnife.findById(this, R.id.container_update_me_portfolioTxt);
DisplayUtils.setTypeface(this, portfolioTxt);
this.locationTxt = ButterKnife.findById(this, R.id.container_update_me_locationTxt);
DisplayUtils.setTypeface(this, locationTxt);
this.bioTxt = ButterKnife.findById(this, R.id.container_update_me_bioTxt);
DisplayUtils.setTypeface(this, bioTxt);
Button saveBtn = ButterKnife.findById(this, R.id.container_update_me_saveBtn);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
saveBtn.setBackgroundResource(R.drawable.button_login);
}
if (getBundle() == null) {
usernameTxt.setText(AuthManager.getInstance().getMe().username);
firstNameTxt.setText(AuthManager.getInstance().getMe().first_name);
lastNameTxt.setText(AuthManager.getInstance().getMe().last_name);
emailTxt.setText(AuthManager.getInstance().getMe().email);
portfolioTxt.setText(AuthManager.getInstance().getMe().portfolio_url);
locationTxt.setText(AuthManager.getInstance().getMe().location);
bioTxt.setText(AuthManager.getInstance().getMe().bio);
} else {
usernameTxt.setText(
getBundle().getString(
KEY_UPDATE_ME_ACTIVITY_USERNAME,
AuthManager.getInstance().getMe().username));
firstNameTxt.setText(
getBundle().getString(
KEY_UPDATE_ME_ACTIVITY_FIRSTNAME,
AuthManager.getInstance().getMe().first_name));
lastNameTxt.setText(
getBundle().getString(
KEY_UPDATE_ME_ACTIVITY_LASTNAME,
AuthManager.getInstance().getMe().last_name));
emailTxt.setText(
getBundle().getString(
KEY_UPDATE_ME_ACTIVITY_EMAIL,
AuthManager.getInstance().getMe().email));
portfolioTxt.setText(
getBundle().getString(
KEY_UPDATE_ME_ACTIVITY_PORTFOLIO,
AuthManager.getInstance().getMe().portfolio_url));
locationTxt.setText(
getBundle().getString(
KEY_UPDATE_ME_ACTIVITY_LOCATION,
AuthManager.getInstance().getMe().location));
bioTxt.setText(
getBundle().getString(
KEY_UPDATE_ME_ACTIVITY_BIO,
AuthManager.getInstance().getMe().bio));
}
}
// control.
private void setState(int newState) {
switch (newState) {
case INPUT_STATE:
if (state == UPDATE_STATE) {
animShow(contentView);
animHide(progressView);
}
break;
case UPDATE_STATE:
if (state == INPUT_STATE) {
animShow(progressView);
animHide(contentView);
}
break;
}
state = newState;
}
private void updateProfile() {
String username = usernameTxt.getText().toString();
if (!TextUtils.isEmpty(username)) {
service.updateMeProfile(
username,
firstNameTxt.getText().toString(),
lastNameTxt.getText().toString(),
emailTxt.getText().toString(),
portfolioTxt.getText().toString(),
locationTxt.getText().toString(),
bioTxt.getText().toString(),
this);
setState(UPDATE_STATE);
} else {
NotificationHelper.showSnackbar(
getString(R.string.feedback_name_is_required),
Snackbar.LENGTH_SHORT);
}
}
public void animShow(final View v) {
if (v.getVisibility() == View.GONE) {
v.setVisibility(View.VISIBLE);
}
ObjectAnimator
.ofFloat(v, "alpha", 0, 1)
.setDuration(300)
.start();
}
public void animHide(final View v) {
ObjectAnimator anim = ObjectAnimator
.ofFloat(v, "alpha", 1, 0)
.setDuration(300);
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
v.setVisibility(View.GONE);
}
});
anim.start();
}
// interface.
// on click listener.
@OnClick(R.id.container_update_me_closeBtn) void close() {
finishActivity(SwipeBackCoordinatorLayout.DOWN_DIR);
}
@OnClick(R.id.container_update_me_saveBtn) void save() {
updateProfile();
}
// on swipe listener.
@Override
public boolean canSwipeBack(int dir) {
return SwipeBackCoordinatorLayout.canSwipeBack(scrollView, dir);
}
@Override
public void onSwipeProcess(float percent) {
statusBar.setAlpha(1 - percent);
container.setBackgroundColor(SwipeBackCoordinatorLayout.getBackgroundColor(percent));
}
@Override
public void onSwipeFinish(int dir) {
finishActivity(dir);
}
// on request me profile listener.
@Override
public void onRequestMeProfileSuccess(Call<Me> call, Response<Me> response) {
if (response.isSuccessful() && response.body() != null) {
AuthManager.getInstance().writeUserInfo(response.body());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
ShortcutsManager.refreshShortcuts(this);
}
finishActivity(SwipeBackCoordinatorLayout.DOWN_DIR);
} else {
setState(INPUT_STATE);
NotificationHelper.showSnackbar(
getString(R.string.feedback_update_profile_failed),
Snackbar.LENGTH_SHORT);
}
}
@Override
public void onRequestMeProfileFailed(Call<Me> call, Throwable t) {
setState(INPUT_STATE);
NotificationHelper.showSnackbar(
getString(R.string.feedback_update_profile_failed),
Snackbar.LENGTH_SHORT);
}
// handler.
@Override
public void handleMessage(Message message) {
switch (message.what) {
case 1:
backPressed = false;
break;
}
}
}