package org.mozilla.vrbrowser.ui.views; import android.content.Context; import android.content.res.TypedArray; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import org.mozilla.vrbrowser.R; import org.mozilla.vrbrowser.utils.DeviceType; import org.mozilla.vrbrowser.utils.SystemUtils; public class HoneycombButton extends LinearLayout { private static final String LOGTAG = SystemUtils.createLogtag(HoneycombButton.class); private ImageView mIcon; private TextView mText; private TextView mSecondaryText; private String mButtonText; private float mButtonTextSize; private String mSecondaryButtonText; private Drawable mButtonIcon; private boolean mButtonIconHover; private VectorClippedEventDelegate mEventDelegate; public HoneycombButton(Context context, @Nullable AttributeSet attrs) { this(context, attrs, R.style.honeycombButtonTheme); } public HoneycombButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.HoneycombButton, defStyleAttr, 0); mButtonText = attributes.getString(R.styleable.HoneycombButton_honeycombButtonText); mButtonTextSize = attributes.getDimension(R.styleable.HoneycombButton_honeycombButtonTextSize, 0.0f); mButtonIcon = attributes.getDrawable(R.styleable.HoneycombButton_honeycombButtonIcon); mButtonIconHover = attributes.getBoolean(R.styleable.HoneycombButton_honeycombButtonIconHover, true); String iconIdStr = attributes.getString(R.styleable.HoneycombButton_honeycombButtonIcon); int deviceTypeId = DeviceType.getType(); switch (deviceTypeId) { case DeviceType.OculusGo: if (attributes.hasValue(R.styleable.HoneycombButton_honeycombButtonIconOculus3dof)) { Log.d(LOGTAG, "Using Oculus 3DoF icon for '" + iconIdStr + "' honeycomb icon"); try { mButtonIcon = attributes.getDrawable(R.styleable.HoneycombButton_honeycombButtonIconOculus3dof); } catch (Exception ex) { Log.d(LOGTAG, "Could not use Oculus 3DoF icon for '" + iconIdStr + "' honeycomb icon: " + ex.getMessage()); } } break; case DeviceType.OculusQuest: if (attributes.hasValue(R.styleable.HoneycombButton_honeycombButtonIconOculus6dof)) { Log.d(LOGTAG, "Using Oculus 6DoF icon for '" + iconIdStr + "' honeycomb icon"); try { mButtonIcon = attributes.getDrawable(R.styleable.HoneycombButton_honeycombButtonIconOculus6dof); } catch (Exception ex) { Log.d(LOGTAG, "Could not use Oculus 6DoF icon for '" + iconIdStr + "' honeycomb icon: " + ex.getMessage()); } } break; default: if (attributes.hasValue(R.styleable.HoneycombButton_honeycombButtonIconOculus3dof) || attributes.hasValue(R.styleable.HoneycombButton_honeycombButtonIconOculus6dof)) { Log.d(LOGTAG, "Using generic icon for '" + iconIdStr + "' honeycomb icon"); } mButtonIcon = attributes.getDrawable(R.styleable.HoneycombButton_honeycombButtonIcon); break; } mSecondaryButtonText = attributes.getString(R.styleable.HoneycombButton_honeycombSecondaryText); initialize(context); } private void initialize(Context aContext) { inflate(aContext, R.layout.honeycomb_button, this); setClickable(true); setLongClickable(false); mIcon = findViewById(R.id.settings_button_icon); if (mIcon != null) { mIcon.setImageDrawable(mButtonIcon); mIcon.setClickable(false); } mText = findViewById(R.id.settings_button_text); if (mText != null) { mText.setText(mButtonText); if (mButtonTextSize > 0) { mText.getLayoutParams().width = (int) mButtonTextSize; } mText.setClickable(false); } mSecondaryText = findViewById(R.id.settings_secondary_text); if (mSecondaryText != null) { mSecondaryText.setText(mSecondaryButtonText); mSecondaryText.setClickable(false); } mEventDelegate = new VectorClippedEventDelegate(R.drawable.settings_honeycomb_background, this); setOnHoverListener(mEventDelegate); setOnTouchListener(mEventDelegate); } @Override public void setOnClickListener(@Nullable OnClickListener aListener) { mEventDelegate.setOnClickListener(aListener); } @Override public boolean onHoverEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_HOVER_ENTER: if (mIcon != null && mText != null) { if (mButtonIconHover) { mIcon.setColorFilter(new PorterDuffColorFilter(getResources().getColor(R.color.asphalt, getContext().getTheme()), PorterDuff.Mode.MULTIPLY)); } mText.setTextColor(getContext().getColor(R.color.asphalt)); mSecondaryText.setTextColor(getContext().getColor(R.color.asphalt)); } break; case MotionEvent.ACTION_HOVER_EXIT: if (mIcon != null && mText != null) { if (mButtonIconHover) { mIcon.setColorFilter(new PorterDuffColorFilter(getResources().getColor(R.color.fog, getContext().getTheme()), PorterDuff.Mode.MULTIPLY)); } mText.setTextColor(getContext().getColor(R.color.fog)); mSecondaryText.setTextColor(getContext().getColor(R.color.fog)); } break; } if (mEventDelegate.isInside(event)) { return super.onHoverEvent(event); } else { setHovered(false); if (mIcon != null && mText != null) { if (mButtonIconHover) { mIcon.setColorFilter(new PorterDuffColorFilter(getResources().getColor(R.color.fog, getContext().getTheme()), PorterDuff.Mode.MULTIPLY)); } mText.setTextColor(getContext().getColor(R.color.fog)); mSecondaryText.setTextColor(getContext().getColor(R.color.fog)); } return false; } } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return true; } public void setText(@StringRes int text) { mText.setText(text); } public void setImageDrawable(@NonNull Drawable drawable) { mIcon.setImageDrawable(drawable); } }