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