1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.android.car.kitchensink.audio;
18 
19 import static android.media.AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;
20 
21 import static com.google.android.car.kitchensink.audio.AudioPlayer.PLAYER_STATE_COMPLETED;
22 import static com.google.android.car.kitchensink.audio.AudioPlayer.PLAYER_STATE_DELAYED;
23 import static com.google.android.car.kitchensink.audio.AudioPlayer.PLAYER_STATE_PAUSED;
24 import static com.google.android.car.kitchensink.audio.AudioPlayer.PLAYER_STATE_STARTED;
25 import static com.google.android.car.kitchensink.audio.AudioPlayer.PLAYER_STATE_STOPPED;
26 import static com.google.android.car.kitchensink.audio.AudioTestFragment.getAudioLogTag;
27 
28 import android.media.AudioAttributes;
29 import android.os.Handler;
30 import android.os.Looper;
31 import android.view.LayoutInflater;
32 import android.view.View;
33 import android.view.ViewGroup;
34 import android.widget.TextView;
35 
36 import com.android.internal.widget.RecyclerView;
37 
38 import com.google.android.car.kitchensink.R;
39 import com.google.android.car.kitchensink.audio.AudioPlayer.AudioPlayerState;
40 
41 import java.util.List;
42 
43 public final class PlayerAdapter extends RecyclerView.Adapter<PlayerAdapter.ViewHolder> {
44     private static final String TAG = getAudioLogTag(PlayerAdapter.class);
45     private static final long STOP_DELAY_TIME_MS = 3_000;
46 
47     private final List<AudioPlayer> mPlayers;
48     private final Handler mHandler;
49 
PlayerAdapter(List<AudioPlayer> players)50     public PlayerAdapter(List<AudioPlayer> players) {
51         mHandler = new Handler(Looper.getMainLooper());
52         mPlayers = players;
53     }
54 
55     public final class ViewHolder extends RecyclerView.ViewHolder {
56         private final TextView mUsageTextView;
57         private final TextView mStatusTextView;
58         private AudioPlayer mPlayer;
59 
ViewHolder(View v)60         private ViewHolder(View v) {
61             super(v);
62             mUsageTextView = v.findViewById(R.id.player_usage);
63             mStatusTextView = v.findViewById(R.id.player_status);
64             v.findViewById(R.id.player_start).setOnClickListener(e -> startPlayer());
65             v.findViewById(R.id.player_play_once).setOnClickListener(e -> {
66                 startPlayer();
67                 mHandler.postDelayed(() -> stopPlayer(), STOP_DELAY_TIME_MS);
68             });
69             v.findViewById(R.id.player_stop).setOnClickListener(e -> stopPlayer());
70         }
71 
setPlayer(AudioPlayer audioPlayer)72         private void setPlayer(AudioPlayer audioPlayer) {
73             mPlayer = audioPlayer;
74             mUsageTextView.setText(AudioAttributes.usageToString(mPlayer.getUsage()));
75         }
76 
startPlayer()77         private void startPlayer() {
78             mPlayer.start(true, true, AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, state -> {
79                 handleStateChange(state);
80             });
81         }
82 
handleStateChange(@udioPlayerState int state)83         private void handleStateChange(@AudioPlayerState int state) {
84             switch (state) {
85                 case PLAYER_STATE_STARTED:
86                     mStatusTextView.setText(R.string.player_started);
87                     return;
88                 case PLAYER_STATE_DELAYED:
89                     mStatusTextView.setText(R.string.player_delayed);
90                     return;
91                 case PLAYER_STATE_PAUSED:
92                     mStatusTextView.setText(R.string.player_paused);
93                     return;
94                 case PLAYER_STATE_STOPPED:
95                 case PLAYER_STATE_COMPLETED:
96                 default:
97                     mStatusTextView.setText(R.string.player_stopped);
98             }
99         }
100 
stopPlayer()101         private void stopPlayer() {
102             mPlayer.stop();
103             mStatusTextView.setText(R.string.player_stopped);
104         }
105     }
106 
107     @Override
onCreateViewHolder(ViewGroup viewGroup, int viewType)108     public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
109         View playerView = LayoutInflater.from(viewGroup.getContext())
110                 .inflate(R.layout.audio_player_item, viewGroup, false);
111 
112         return new ViewHolder(playerView);
113     }
114 
115 
116     @Override
onBindViewHolder(ViewHolder viewHolder, final int position)117     public void onBindViewHolder(ViewHolder viewHolder, final int position) {
118         viewHolder.setPlayer(mPlayers.get(position));
119     }
120 
121     @Override
getItemCount()122     public int getItemCount() {
123         return mPlayers.size();
124     }
125 }
126