package com.eleks.tesla.mainApp; import android.content.Context; import android.content.res.Resources; import android.os.Bundle; import android.support.wearable.view.CircledImageView; import android.view.View; import android.view.ViewTreeObserver; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.eleks.tesla.teslalib.ApiPathConstants; 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.mainApp.widget.RadialPicker; import de.greenrobot.event.EventBus; /** * Created by Ihor.Demedyuk on 24.02.2015. */ public class SetValueActivity extends CommunicationActivity implements RadialPicker.ValueChangeListener, View.OnClickListener { public static final String SELECTOR_TYPE = "selector_type"; public static final int SELECTOR_TYPE_CONDITIONING = 1; public static final int SELECTOR_TYPE_CHARGING = 2; private ValueActivityState mState; private int mType; private int mValue; private String mValueFormatter; private TextView mValueTextView; private RadialPicker mRadialPicker; private View mToggleButton; private ImageView mToggleImage; private CircledImageView mCircledImageView; private int mButtonSideSize; private int mButtonMargin; protected int mImageSideSize; private boolean mIsToggleOn = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_set_value); mValueTextView = (TextView) findViewById(R.id.value_text); mRadialPicker = (RadialPicker) findViewById(R.id.radial_picker); mToggleButton = findViewById(R.id.segment_top); mToggleButton.setOnClickListener(this); mToggleImage = (ImageView) findViewById(R.id.top_image_1); mCircledImageView = (CircledImageView) findViewById(R.id.top_image_background); final RelativeLayout root = (RelativeLayout) findViewById(R.id.root); root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { setToggleButtonPosition(root.getWidth()); root.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); mType = getIntent().getIntExtra(SELECTOR_TYPE, SELECTOR_TYPE_CONDITIONING); if (mType == SELECTOR_TYPE_CHARGING) { mState = new ChargeState(); mValue = 75; } else { mState = new TermoState(); mValue = 20; } mCircledImageView.setCircleColor(getResources().getColor(mState.getToggleColorId())); mToggleImage.setImageResource(mIsToggleOn ? mState.getOnToggleImageResource() : mState.getOffToggleImageResource()); mRadialPicker.setMinValue(mState.getMinValue()); mRadialPicker.setMaxValue(mState.getMaxValue()); mRadialPicker.setColors(mState.getGradientColors(this)); mValueFormatter = mState.getTextFormatter(); mRadialPicker.setValuechangeListener(this); mRadialPicker.setValue(mValue); onValueChanged(mValue); } protected void setToggleButtonPosition(int width) { mButtonSideSize = width / 4; mImageSideSize = width / 6; mButtonMargin = (int) (((float) width) / 32 * 3); if (mCircledImageView != null) { mCircledImageView.setCircleRadius(mButtonSideSize / 2); } if (mToggleImage != null) { FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mToggleImage.getLayoutParams(); params.width = mImageSideSize; params.height = mImageSideSize; mToggleImage.setLayoutParams(params); } if (mToggleButton != null) { RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mToggleButton.getLayoutParams(); params.width = mButtonSideSize; params.height = mButtonSideSize; params.setMargins(0, mButtonMargin, 0, 0); mToggleButton.setLayoutParams(params); } } @Override protected void onResume() { super.onResume(); EventBus.getDefault().registerSticky(this); } @Override protected void onPause() { super.onPause(); EventBus.getDefault().unregister(this); } @Override public void onValueChanged(int value) { mValueTextView.setText(String.format(mValueFormatter, value)); } public void onEvent(ChargeStateLoadedEvent event) { if (mType != SELECTOR_TYPE_CHARGING) { return; } mValue = event.getChargeState().getMaxRangeChargeCounter(); onValueChanged(mValue); } public void onEvent(ClimateStateLoadedEvent event) { if (mType == SELECTOR_TYPE_CONDITIONING) { mValue = (int) event.getClimateState().getDriverTempSetting(); } else if (mType == SELECTOR_TYPE_CONDITIONING) { mValue = (int) event.getClimateState().getPassengerTempSetting(); } else { return; } onValueChanged(mValue); } @Override public void onClick(View v) { if (v.getId() == R.id.segment_top) { performToggleClick(); } } private void performToggleClick() { mIsToggleOn = !mIsToggleOn; Object event; if (mType == SELECTOR_TYPE_CHARGING) { AnimationUtils.performToggleAnimation(mToggleImage, mImageSideSize, mIsToggleOn ? R.drawable.charge_on : R.drawable.charge_off); event = new ToHandHoldRequestEvent(mIsToggleOn ? ApiPathConstants.WEAR_ACTION_CHARGING_START : ApiPathConstants.WEAR_ACTION_CHARGING_STOP); } else { AnimationUtils.performToggleAnimation(mToggleImage, mImageSideSize, mIsToggleOn ? R.drawable.hvac_on : R.drawable.hvac_off); event = new ToHandHoldRequestEvent(mIsToggleOn ? ApiPathConstants.WEAR_ACTION_AUTO_CONDITIONING_START : ApiPathConstants.WEAR_ACTION_AUTO_CONDITIONING_STOP); } EventBus.getDefault().post(event); } private interface ValueActivityState { public int getMaxValue(); public int getMinValue(); public int getToggleColorId(); public int[] getGradientColors(Context ctx); public int getOnToggleImageResource(); public int getOffToggleImageResource(); public String getTextFormatter(); } private static class TermoState implements ValueActivityState { private static final String TEMP_VALUE_FORMATER = "%d °C"; private static final int MAX_VALUE = 30; private static final int MIX_VALUE = 16; @Override public int getMaxValue() { return MAX_VALUE; } @Override public int getMinValue() { return MIX_VALUE; } @Override public int getToggleColorId() { return R.color.category_condition; } @Override public int[] getGradientColors(Context ctx) { Resources res = ctx.getResources(); int blueColor = res.getColor(R.color.gradient_blue); int greenColor = res.getColor(R.color.gradient_green); int redColor = res.getColor(R.color.gradient_red); return new int[]{blueColor, greenColor, redColor}; } @Override public int getOnToggleImageResource() { return R.drawable.hvac_on; } @Override public int getOffToggleImageResource() { return R.drawable.hvac_off; } @Override public String getTextFormatter() { return TEMP_VALUE_FORMATER; } } private static class ChargeState implements ValueActivityState { private static final String BATTARY_CHARGE_FORMATTER = "%d%%"; private static final int MAX_VALUE = 100; private static final int MIN_VALUE = 50; @Override public int getMaxValue() { return MAX_VALUE; } @Override public int getMinValue() { return MIN_VALUE; } @Override public int getToggleColorId() { return R.color.category_charge; } @Override public int[] getGradientColors(Context ctx) { Resources res = ctx.getResources(); int blueColor = res.getColor(R.color.gradient_blue); int greenColor = res.getColor(R.color.gradient_green); int redColor = res.getColor(R.color.gradient_red); return new int[]{redColor, blueColor, greenColor}; } @Override public int getOnToggleImageResource() { return R.drawable.charge_on; } @Override public int getOffToggleImageResource() { return R.drawable.charge_off; } @Override public String getTextFormatter() { return BATTARY_CHARGE_FORMATTER; } } }