1527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez/* 2527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * Copyright 2018 The Android Open Source Project 3527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * 4527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * Licensed under the Apache License, Version 2.0 (the "License"); 5527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * you may not use this file except in compliance with the License. 6527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * You may obtain a copy of the License at 7527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * 8527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * http://www.apache.org/licenses/LICENSE-2.0 9527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * 10527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * Unless required by applicable law or agreed to in writing, software 11527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * distributed under the License is distributed on an "AS IS" BASIS, 12527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * See the License for the specific language governing permissions and 14527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * limitations under the License. 15527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez */ 16527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 17527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perezpackage com.android.car.media.common; 18527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 19527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perezimport android.content.Context; 20527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perezimport android.graphics.PorterDuff; 21527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perezimport android.support.annotation.IntDef; 22527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perezimport android.util.AttributeSet; 23527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perezimport android.util.Log; 24527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perezimport android.widget.ImageView; 25527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 26527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perezimport com.android.car.apps.common.FabDrawable; 27527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 28527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perezimport java.lang.annotation.Retention; 29527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perezimport java.lang.annotation.RetentionPolicy; 30527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 31527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez/** 32527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * Custom {@link android.widget.ImageButton} that has four custom states: 33527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * <ul> 34527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * <li>state_playing</li> 35527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * <li>state_paused</li> 36527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * <li>state_stopped</li> 37527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * <li>state_disabled</li> 38527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * </ul> 39527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez */ 40527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perezpublic class PlayPauseStopImageView extends ImageView { 41527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez private static final String TAG = "PlayPauseStopImageView"; 42527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 43527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez private static final int[] STATE_PAUSE = {R.attr.state_pause}; 44527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez private static final int[] STATE_STOP = {R.attr.state_stop}; 45527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez private static final int[] STATE_PLAY = {R.attr.state_play}; 46527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez private static final int[] STATE_DISABLED = {R.attr.state_disabled}; 47527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 48527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez /** 49527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * Possible states of this view 50527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez */ 51527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez @IntDef({ACTION_PLAY, ACTION_STOP, ACTION_PAUSE, ACTION_DISABLED}) 52527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez @Retention(RetentionPolicy.SOURCE) 53527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez public @interface Action {} 54527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 55527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez /** Used when no action can be executed at this time */ 56527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez public static final int ACTION_DISABLED = 0; 57527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez /** Used when the media source is ready to start playing */ 58527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez public static final int ACTION_PLAY = 1; 59527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez /** Used when the media source is playing and it only support stop action */ 60527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez public static final int ACTION_STOP = 2; 61527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez /** Used when the media source is playing and it supports pause action */ 62527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez public static final int ACTION_PAUSE = 3; 63527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 64527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez private int mAction = ACTION_DISABLED; 65527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 66527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez /** 67527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * Constructs an instance of this view 68527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez */ 69527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez public PlayPauseStopImageView(Context context, AttributeSet attrs) { 70527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez super(context, attrs); 71527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez setBackground(new FabDrawable(context)); 72527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez } 73527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 74527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez /** 75527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * Sets the action to display on this view 76527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * 77527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * @param action one of {@link Action} 78527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez */ 79527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez public void setAction(@Action int action) { 80527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez mAction = action; 81527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez refreshDrawableState(); 82527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez } 83527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 84527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez /** 85527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * @return currently selected action 86527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez */ 87527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez public int getAction() { 88527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez return mAction; 89527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez } 90527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 91527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez @Override 92527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez public int[] onCreateDrawableState(int extraSpace) { 93527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez // + 1 so we can potentially add our custom PlayState 94527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); 95527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 96527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez switch(mAction) { 97527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez case ACTION_PLAY: 98527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez mergeDrawableStates(drawableState, STATE_PLAY); 99527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez break; 100527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez case ACTION_STOP: 101527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez mergeDrawableStates(drawableState, STATE_STOP); 102527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez break; 103527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez case ACTION_PAUSE: 104527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez mergeDrawableStates(drawableState, STATE_PAUSE); 105527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez break; 106527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez case ACTION_DISABLED: 107527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez mergeDrawableStates(drawableState, STATE_DISABLED); 108527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez break; 109527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez default: 110527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez Log.e(TAG, "Unknown action: " + mAction); 111527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez } 112527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez if (getBackground() != null) { 113527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez getBackground().setState(drawableState); 114527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez } 115527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez return drawableState; 116527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez } 117527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez 118527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez /** 119527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * Updates the primary color of this view. 120527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * @param color fill or main color 121527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez * @param tintColor contrast color 122527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez */ 123527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez public void setPrimaryActionColor(int color, int tintColor) { 124527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez ((FabDrawable) getBackground()).setFabAndStrokeColor(color); 125527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez if (getDrawable() != null) { 126527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez getDrawable().setColorFilter(tintColor, PorterDuff.Mode.SRC_IN); 127527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez } 128527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez } 129527333c658e8e24d7e23735dcf2be7b7eacd97f9Roberto Perez} 130