package com.eleks.tesla.mainApp.fragments; import android.animation.AnimatorSet; import android.animation.ValueAnimator; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.LinearInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import com.eleks.tesla.teslalib.models.ChargeState; import com.eleks.tesla.R; import com.eleks.tesla.events.ChargeStateLoadedEvent; import com.eleks.tesla.events.ClimateStateLoadedEvent; import com.eleks.tesla.events.ToHandHoldRequestEvent; import com.eleks.tesla.events.VehicleStateLoadedEvent; import com.eleks.tesla.mainApp.SetValueActivity; import de.greenrobot.event.EventBus; import static com.eleks.tesla.teslalib.ApiPathConstants.*; /** * Created by maryan.melnychuk on 18.02.2015. */ public class ActionTeslaFragment extends BaseTeslaFragment implements View.OnClickListener { private static final int START_ANIMATION_TIME = 135; private static final float START_ANIMATION_OUT_SCALE_START = 1; private static final float START_ANIMATION_OUT_SCALE_END = 0.71f; private static final int MIDDLE_ANIMATION_TIME = 365; private static final float MIDDLE_ANIMATION_OUT_SCALE_START = 0.71f; private static final float MIDDLE_ANIMATION_OUT_SCALE_END = 1.19f; private static final float MIDDLE_ANIMATION_IN_SCALE_START = 0.68f; private static final float MIDDLE_ANIMATION_IN_SCALE_END = 1.28f; private static final float MIDDLE_ANIMATION_OUT_ALPHA_START = 1f; private static final float MIDDLE_ANIMATION_OUT_ALPHA_END = 0f; private static final float MIDDLE_ANIMATION_IN_ALPHA_START = 0f; private static final float MIDDLE_ANIMATION_IN_ALPHA_END = 0.45f; private static final int END_ANIMATION_TIME = 112; private static final float END_ANIMATION_IN_SCALE_START = 1.28f; private static final float END_ANIMATION_IN_SCALE_END = 1f; private static final float END_ANIMATION_IN_ALPHA_START = 0.45f; private static final float END_ANIMATION_IN_ALPHA_END = 1f; private int mActionId; private ImageView mActionImage1, mActionImage2; private TextView mActionLabel1, mActionLabel2, mActionButtonText; private int mNormalImageSize = -1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle args = getArguments(); // if (args != null) { // mActionId = args.getInt(TeslaAppAdapter.ARG_FRAGMENT_ID, TeslaAppAdapter.SCREENS_HORN); // } } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_action, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mActionImage1 = (ImageView) view.findViewById(R.id.action_image_1); mActionImage2 = (ImageView) view.findViewById(R.id.action_image_2); mActionLabel1 = (TextView) view.findViewById(R.id.action_label_1); mActionLabel2 = (TextView) view.findViewById(R.id.action_label_2); mActionButtonText = (TextView) view.findViewById(R.id.action_button_text); view.setOnClickListener(this); setViews(); } private void setViews() { switch (mActionId) { // case TeslaAppAdapter.SCREENS_HORN: // setHornViews(); // break; // case TeslaAppAdapter.SCREENS_DOOR_LOCK: // setDoorViews(); // break; // case TeslaAppAdapter.SCREENS_FLASHLIGHT: // setFlashlightViews(); // break; // case TeslaAppAdapter.SCREENS_CHARGING_START: // setChargingViews(); // break; // case TeslaAppAdapter.SCREENS_AUTO_CONDITIONING: // setAutoConditioningViews(); // break; // case TeslaAppAdapter.SCREENS_SET_TEMP_DRIVER: // setSetDriverTempViews(); // break; // case TeslaAppAdapter.SCREENS_SET_TEMP_PASSENGER: // setSetPassengerTempViews(); // break; // case TeslaAppAdapter.SCREENS_SET_MAX_CHARGING: // setSetMaxChargingViews(); // break; } } @Override public void onClick(View v) { switch (mActionId) { // case TeslaAppAdapter.SCREENS_HORN: // performHornClick(); // break; // case TeslaAppAdapter.SCREENS_DOOR_LOCK: // performDoorClick(); // break; // case TeslaAppAdapter.SCREENS_FLASHLIGHT: // performFlashlightClick(); // break; // case TeslaAppAdapter.SCREENS_CHARGING_START: // performChargingClick(); // break; // case TeslaAppAdapter.SCREENS_AUTO_CONDITIONING: // performAutoConditioningClick(); // break; // case TeslaAppAdapter.SCREENS_SET_TEMP_DRIVER: // case TeslaAppAdapter.SCREENS_SET_TEMP_PASSENGER: // case TeslaAppAdapter.SCREENS_SET_MAX_CHARGING: // openSetValueActivity(); // break; } } private void performSwitchAnimation(boolean inOrder) { mNormalImageSize = mActionImage1.getHeight(); if (inOrder) { performSwitchAnimation(mActionImage1, mActionImage2, mActionLabel1, mActionLabel2); } else { performSwitchAnimation(mActionImage2, mActionImage1, mActionLabel2, mActionLabel1); } } private void performSwitchAnimation(View viewOut, View viewIn, View textOut, View textIn) { ValueAnimator startAnim = ValueAnimator.ofInt(mNormalImageSize, getSizeFromCoef(START_ANIMATION_OUT_SCALE_END)); startAnim.addUpdateListener(new ScaleAnimateListener(viewOut)); startAnim.setDuration(START_ANIMATION_TIME); AnimatorSet middleAnim = new AnimatorSet(); ValueAnimator middleOutScale = ValueAnimator.ofInt(getSizeFromCoef(MIDDLE_ANIMATION_OUT_SCALE_START), getSizeFromCoef(MIDDLE_ANIMATION_OUT_SCALE_END)); middleOutScale.addUpdateListener(new ScaleAnimateListener(viewOut)); ValueAnimator middleInScale = ValueAnimator.ofInt(getSizeFromCoef(MIDDLE_ANIMATION_IN_SCALE_START), getSizeFromCoef(MIDDLE_ANIMATION_IN_SCALE_END)); middleInScale.addUpdateListener(new ScaleAnimateListener(viewIn)); ValueAnimator middleOutAlpha = ValueAnimator.ofFloat(MIDDLE_ANIMATION_OUT_ALPHA_START, MIDDLE_ANIMATION_OUT_ALPHA_END); middleOutAlpha.addUpdateListener(new AlphaAnimateListener(viewOut)); ValueAnimator middleInAlpha = ValueAnimator.ofFloat(MIDDLE_ANIMATION_IN_ALPHA_START, MIDDLE_ANIMATION_IN_ALPHA_END); middleInAlpha.addUpdateListener(new AlphaAnimateListener(viewIn)); ValueAnimator middleOutTextAlpha = ValueAnimator.ofFloat(1f, 0f); middleOutTextAlpha.addUpdateListener(new AlphaAnimateListener(textOut)); ValueAnimator middleInTextAlpha = ValueAnimator.ofFloat(0f, 1f); middleInTextAlpha.addUpdateListener(new AlphaAnimateListener(textIn)); middleAnim.playTogether(middleOutScale, middleInScale, middleOutAlpha, middleInAlpha, middleOutTextAlpha, middleInTextAlpha); middleAnim.setDuration(MIDDLE_ANIMATION_TIME); AnimatorSet endAnim = new AnimatorSet(); ValueAnimator endInScale = ValueAnimator.ofInt(getSizeFromCoef(END_ANIMATION_IN_SCALE_START), getSizeFromCoef(END_ANIMATION_IN_SCALE_END)); endInScale.addUpdateListener(new ScaleAnimateListener(viewIn)); ValueAnimator endInAlpha = ValueAnimator.ofFloat(END_ANIMATION_IN_ALPHA_START, END_ANIMATION_IN_ALPHA_END); endInAlpha.addUpdateListener(new AlphaAnimateListener(viewIn)); endAnim.playTogether(endInScale, endInAlpha); endAnim.setDuration(END_ANIMATION_TIME); AnimatorSet mainAnim = new AnimatorSet(); mainAnim.playSequentially(startAnim, middleAnim, endAnim); mainAnim.setInterpolator(new LinearInterpolator()); mainAnim.start(); } private void performActionAnimation(View view) { ValueAnimator startAnim = ValueAnimator.ofInt(mNormalImageSize, getSizeFromCoef(START_ANIMATION_OUT_SCALE_END)); startAnim.addUpdateListener(new ScaleAnimateListener(view)); startAnim.setDuration(START_ANIMATION_TIME); AnimatorSet middleAnim = new AnimatorSet(); ValueAnimator middleOutScale = ValueAnimator.ofInt(getSizeFromCoef(MIDDLE_ANIMATION_OUT_SCALE_START), getSizeFromCoef(MIDDLE_ANIMATION_OUT_SCALE_END)); middleOutScale.addUpdateListener(new ScaleAnimateListener(view)); ValueAnimator middleInAlpha = ValueAnimator.ofFloat(MIDDLE_ANIMATION_IN_ALPHA_START, MIDDLE_ANIMATION_IN_ALPHA_END); middleInAlpha.addUpdateListener(new AlphaAnimateListener(view)); middleAnim.playTogether(middleOutScale, middleInAlpha); middleAnim.setDuration(MIDDLE_ANIMATION_TIME); AnimatorSet endAnim = new AnimatorSet(); ValueAnimator endInScale = ValueAnimator.ofInt(getSizeFromCoef(END_ANIMATION_IN_SCALE_START), getSizeFromCoef(END_ANIMATION_IN_SCALE_END)); endInScale.addUpdateListener(new ScaleAnimateListener(view)); ValueAnimator endInAlpha = ValueAnimator.ofFloat(END_ANIMATION_IN_ALPHA_START, END_ANIMATION_IN_ALPHA_END); endInAlpha.addUpdateListener(new AlphaAnimateListener(view)); endAnim.playTogether(endInScale, endInAlpha); endAnim.setDuration(END_ANIMATION_TIME); AnimatorSet mainAnim = new AnimatorSet(); mainAnim.playSequentially(startAnim, middleAnim, endAnim); mainAnim.setInterpolator(new LinearInterpolator()); mainAnim.start(); } private int getSizeFromCoef(float coef) { return Math.round(mNormalImageSize * coef); } private void setViewSize(View view, int size) { FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams(); params.width = size; params.height = size; view.setLayoutParams(params); view.requestLayout(); } private class ScaleAnimateListener implements ValueAnimator.AnimatorUpdateListener { private View mView; private ScaleAnimateListener(View view) { mView = view; } @Override public void onAnimationUpdate(ValueAnimator animation) { setViewSize(mView, (int) animation.getAnimatedValue()); } } private class AlphaAnimateListener implements ValueAnimator.AnimatorUpdateListener { private View mView; private AlphaAnimateListener(View view) { mView = view; } @Override public void onAnimationUpdate(ValueAnimator animation) { mView.setAlpha((float) animation.getAnimatedValue()); } } private void openSetValueActivity() { performActionAnimation(mActionButtonText); Intent intent = new Intent(getActivity(), SetValueActivity.class); intent.putExtra(SetValueActivity.SELECTOR_TYPE, mActionId); startActivity(intent); } private void performAutoConditioningClick() { ClimateStateLoadedEvent event = EventBus.getDefault().getStickyEvent(ClimateStateLoadedEvent.class); if (event != null) { if (event.getClimateState().isIsAutoConditioningOn()) { EventBus.getDefault().post(new ToHandHoldRequestEvent(WEAR_ACTION_AUTO_CONDITIONING_STOP)); event.getClimateState().setIsAutoConditioningOn(false); performSwitchAnimation(true); } else { EventBus.getDefault().post(new ToHandHoldRequestEvent(WEAR_ACTION_AUTO_CONDITIONING_START)); event.getClimateState().setIsAutoConditioningOn(true); performSwitchAnimation(false); } } } private void performChargingClick() { ChargeStateLoadedEvent event = EventBus.getDefault().getStickyEvent(ChargeStateLoadedEvent.class); if (event != null) { if (ChargeState.STATE_CHARGING.equals(event.getChargeState().getChargingState())) { EventBus.getDefault().post(new ToHandHoldRequestEvent(WEAR_ACTION_CHARGING_STOP)); event.getChargeState().setChargingState(ChargeState.STATE_COMPLETE); performSwitchAnimation(true); } else { EventBus.getDefault().post(new ToHandHoldRequestEvent(WEAR_ACTION_CHARGING_START)); event.getChargeState().setChargingState(ChargeState.STATE_CHARGING); performSwitchAnimation(false); } } } private void performFlashlightClick() { EventBus.getDefault().post(new ToHandHoldRequestEvent(WEAR_ACTION_FLASHLIGHTS)); performActionAnimation(mActionImage1); } private void performDoorClick() { VehicleStateLoadedEvent event = EventBus.getDefault().getStickyEvent(VehicleStateLoadedEvent.class); if (event != null) { if (event.getVehicleState().isLocked()) { EventBus.getDefault().post(new ToHandHoldRequestEvent(WEAR_ACTION_DOOR_UNLOCK)); event.getVehicleState().setLocked(false); performSwitchAnimation(true); } else { EventBus.getDefault().post(new ToHandHoldRequestEvent(WEAR_ACTION_DOOR_LOCK)); event.getVehicleState().setLocked(true); performSwitchAnimation(false); } } } private void performHornClick() { EventBus.getDefault().post(new ToHandHoldRequestEvent(WEAR_ACTION_HORN)); performActionAnimation(mActionImage1); } private void setHornViews() { // mActionImage1.setImageResource(R.drawable.action_horn); mActionLabel1.setText(getString(R.string.action_horn)); } private void setDoorViews() { VehicleStateLoadedEvent event = EventBus.getDefault().getStickyEvent(VehicleStateLoadedEvent.class); if (event != null) { if (event.getVehicleState().isLocked()) { setFirstViewActive(); } else { setSecondViewsActive(); } } else { setSecondViewsActive(); } // mActionImage1.setImageResource(R.drawable.action_car_lock); mActionLabel2.setText(getString(R.string.action_door_unlock)); // mActionImage2.setImageResource(R.drawable.action_car_unlock); mActionLabel1.setText(getString(R.string.action_door_lock)); } private void setFlashlightViews() { mActionImage1.setImageResource(R.drawable.action_lights); mActionLabel1.setText(getString(R.string.action_flash_lights)); } private void setChargingViews() { ChargeStateLoadedEvent event = EventBus.getDefault().getStickyEvent(ChargeStateLoadedEvent.class); if (event != null) { if (ChargeState.STATE_CHARGING.equals(event.getChargeState().getChargingState())) { setFirstViewActive(); } else { setSecondViewsActive(); } } else { setSecondViewsActive(); } // mActionImage2.setImageResource(R.drawable.action_charge_stop); mActionLabel2.setText(getString(R.string.action_charging_stop)); // mActionImage1.setImageResource(R.drawable.action_charge_start); mActionLabel1.setText(getString(R.string.action_charging_start)); } private void setFirstViewActive() { mActionImage1.setAlpha(1f); mActionLabel1.setAlpha(1f); mActionImage2.setAlpha(0f); mActionLabel2.setAlpha(0f); } private void setSecondViewsActive() { mActionImage1.setAlpha(1f); mActionLabel1.setAlpha(1f); mActionImage2.setAlpha(0f); mActionLabel2.setAlpha(0f); } private void setAutoConditioningViews() { ClimateStateLoadedEvent event = EventBus.getDefault().getStickyEvent(ClimateStateLoadedEvent.class); if (event != null) { if (event.getClimateState().isIsAutoConditioningOn()) { setFirstViewActive(); } else { setSecondViewsActive(); } } else { setFirstViewActive(); } // mActionImage1.setImageResource(R.drawable.action_ac_start); mActionLabel1.setText(getString(R.string.action_auto_conditioning_start)); // mActionImage2.setImageResource(R.drawable.action_ac_stop); mActionLabel2.setText(getString(R.string.action_auto_conditioning_stop)); } private void setSetMaxChargingViews() { ChargeStateLoadedEvent event = EventBus.getDefault().getStickyEvent(ChargeStateLoadedEvent.class); if (event != null) { mActionButtonText.setText(String.valueOf(event.getChargeState().getMaxRangeChargeCounter()) + "%"); } mActionLabel1.setText(getString(R.string.set_charging_limit)); } private void setSetPassengerTempViews() { ClimateStateLoadedEvent event = EventBus.getDefault().getStickyEvent(ClimateStateLoadedEvent.class); if (event != null) { mActionButtonText.setText(String.valueOf(event.getClimateState().getPassengerTempSetting()) + "°C"); } mActionLabel1.setText(getString(R.string.set_passenger_temp)); } private void setSetDriverTempViews() { ClimateStateLoadedEvent event = EventBus.getDefault().getStickyEvent(ClimateStateLoadedEvent.class); if (event != null) { mActionButtonText.setText(String.valueOf(event.getClimateState().getDriverTempSetting()) + "°C"); } mActionLabel1.setText(getString(R.string.set_driver_temp)); } }