/**
* Wire
* Copyright (C) 2016 Wire Swiss GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.waz.zclient.ui.cursor;
import android.content.Context;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.GestureDetectorCompat;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import com.waz.zclient.ui.R;
import com.waz.zclient.ui.utils.CursorUtils;
import com.waz.zclient.ui.views.CursorIconButton;
import java.util.List;
public class CursorToolbar extends LinearLayout {
private Callback callback;
private int buttonWidth;
private View touchedButtonContainer;
private GestureDetectorCompat detector;
private List<CursorMenuItem> cursorItems;
private CursorIconButton cursorIconButtonCamera;
private CursorIconButton cursorIconButtonAudio;
private boolean isEphemeralMode;
private int accentColor;
public void setAccentColor(int accentColor) {
this.accentColor = accentColor;
if (cursorIconButtonAudio == null ||
cursorIconButtonCamera == null) {
return;
}
if (!isEphemeralMode) {
cursorIconButtonCamera.initTextColor(accentColor);
cursorIconButtonAudio.initTextColor(accentColor);
}
}
public void showEphemeralMode(int color) {
isEphemeralMode = true;
for (int i = 0; i < getChildCount(); i++) {
FrameLayout containerView = (FrameLayout) getChildAt(i);
CursorIconButton cursorIconButton = (CursorIconButton) containerView.getChildAt(0);
cursorIconButton.showEphemeralMode(color);
}
}
public void hideEphemeraMode(int color) {
isEphemeralMode = false;
for (int i = 0; i < getChildCount(); i++) {
FrameLayout containerView = (FrameLayout) getChildAt(i);
CursorIconButton cursorIconButton = (CursorIconButton) containerView.getChildAt(0);
cursorIconButton.hideEphemeralMode(color);
}
setAccentColor(accentColor);
}
private GestureDetector.OnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
if (callback != null) {
CursorMenuItem item = (CursorMenuItem) touchedButtonContainer.getTag();
if (item != CursorMenuItem.AUDIO_MESSAGE &&
item != CursorMenuItem.DUMMY) {
callback.onShowTooltip(item, getResources().getString(item.resTooltip), touchedButtonContainer);
}
callback.onCursorButtonLongPressed(item);
}
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
if (callback != null) {
CursorMenuItem item = (CursorMenuItem) touchedButtonContainer.getTag();
callback.onCursorButtonClicked(item);
switch (item) {
case CAMERA:
cursorIconButtonCamera.setSelected(true);
cursorIconButtonAudio.setSelected(false);
break;
case AUDIO_MESSAGE:
cursorIconButtonCamera.setSelected(false);
cursorIconButtonAudio.setSelected(true);
break;
}
}
return true;
}
};
public CursorToolbar(Context context) {
this(context, null);
}
public CursorToolbar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CursorToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
detector = new GestureDetectorCompat(getContext(), gestureListener);
setOrientation(LinearLayout.HORIZONTAL);
buttonWidth = getResources().getDimensionPixelSize(R.dimen.new_cursor_menu_button_width);
}
public void setCursorItems(List<CursorMenuItem> cursorItems) {
this.cursorItems = cursorItems;
createItems();
}
public void setCallback(Callback callback) {
this.callback = callback;
}
private void createItems() {
LayoutInflater inflater = LayoutInflater.from(getContext());
int diameter = getResources().getDimensionPixelSize(R.dimen.cursor__menu_button__diameter);
int rightMargin;
/*
As long as 4 mainItems are shown in the toolbar, they are spread out equally in phone
*/
rightMargin = CursorUtils.getMarginBetweenCursorButtons(getContext());
CursorIconButton cursorIconButton;
for (int i = 0; i < cursorItems.size(); i++) {
final CursorMenuItem item = cursorItems.get(i);
final FrameLayout buttonContainer = new FrameLayout(getContext());
buttonContainer.setId(item.resId);
cursorIconButton = (CursorIconButton) inflater.inflate(R.layout.cursor__item,
this,
false);
cursorIconButton.setCursorMenuItem(item);
cursorIconButton.setPressedBackgroundColor(ContextCompat.getColor(getContext(), R.color.light_graphite));
switch (item) {
case CAMERA:
cursorIconButtonCamera = cursorIconButton;
break;
case AUDIO_MESSAGE:
cursorIconButtonAudio = cursorIconButton;
break;
}
if (item == CursorMenuItem.DUMMY) {
cursorIconButton.initTextColor(ContextCompat.getColor(getContext(), R.color.transparent));
cursorIconButton.setPressedBackgroundColor(ContextCompat.getColor(getContext(), R.color.transparent));
cursorIconButton.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.transparent));
}
buttonContainer.setTag(item);
buttonContainer.setLongClickable(true);
buttonContainer.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
CursorMenuItem item = (CursorMenuItem) view.getTag();
touchedButtonContainer = buttonContainer;
if (callback != null &&
item == CursorMenuItem.AUDIO_MESSAGE) {
callback.onMotionEvent(item, motionEvent);
}
detector.onTouchEvent(motionEvent);
return false;
}
});
FrameLayout.LayoutParams paramsButton = new FrameLayout.LayoutParams(diameter, diameter);
paramsButton.gravity = Gravity.CENTER;
buttonContainer.addView(cursorIconButton, paramsButton);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(buttonWidth,
ViewGroup.LayoutParams.MATCH_PARENT);
if (i < cursorItems.size() - 1) {
params.rightMargin = rightMargin;
}
addView(buttonContainer, params);
}
}
public void unselectItems() {
cursorIconButtonCamera.setSelected(false);
cursorIconButtonAudio.setSelected(false);
}
public interface Callback {
void onCursorButtonClicked(CursorMenuItem cursorMenuItem);
void onCursorButtonLongPressed(CursorMenuItem cursorMenuItem);
void onMotionEvent(CursorMenuItem cursorMenuItem, MotionEvent motionEvent);
void onShowTooltip(CursorMenuItem item, String message, View anchor);
}
}