1/*
2 * Copyright (C) 2014 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 */
16package com.android.onemedia;
17
18
19import android.app.Activity;
20import android.app.Notification;
21import android.app.NotificationManager;
22import android.app.PendingIntent;
23import android.content.ComponentName;
24import android.content.Intent;
25import android.graphics.Bitmap;
26import android.graphics.BitmapFactory;
27import android.media.MediaMetadata;
28import android.media.session.PlaybackState;
29import android.net.Uri;
30import android.os.Bundle;
31import android.provider.MediaStore;
32import android.text.format.DateUtils;
33import android.util.Log;
34import android.view.Menu;
35import android.view.View;
36import android.widget.Button;
37import android.widget.CheckBox;
38import android.widget.EditText;
39import android.widget.ImageView;
40import android.widget.TextView;
41
42import java.io.IOException;
43
44public class OnePlayerActivity extends Activity {
45    private static final String TAG = "OnePlayerActivity";
46
47    private static final int READ_REQUEST_CODE = 42;
48
49    protected PlayerController mPlayer;
50
51    private Button mStartButton;
52    private Button mPlayButton;
53    private Button mRouteButton;
54    private TextView mStatusView;
55
56    private EditText mContentText;
57    private EditText mNextContentText;
58    private CheckBox mHasVideo;
59    private ImageView mArtView;
60
61    private PlaybackState mPlaybackState;
62    private Bitmap mAlbumArtBitmap;
63
64    @Override
65    protected void onCreate(Bundle savedInstanceState) {
66        super.onCreate(savedInstanceState);
67        setContentView(R.layout.activity_one_player);
68        mPlayer = new PlayerController(this, OnePlayerService.getServiceIntent(this));
69
70
71        mStartButton = findViewById(R.id.start_button);
72        mPlayButton = findViewById(R.id.play_button);
73        mRouteButton = findViewById(R.id.route_button);
74        mStatusView = findViewById(R.id.status);
75        mContentText = findViewById(R.id.content);
76        mNextContentText = findViewById(R.id.next_content);
77        mHasVideo = findViewById(R.id.has_video);
78        mArtView = findViewById(R.id.art);
79
80        final Button artPicker = findViewById(R.id.art_picker);
81        artPicker.setOnClickListener(mButtonListener);
82
83        mStartButton.setOnClickListener(mButtonListener);
84        mPlayButton.setOnClickListener(mButtonListener);
85        mRouteButton.setOnClickListener(mButtonListener);
86
87    }
88
89    @Override
90    public boolean onCreateOptionsMenu(Menu menu) {
91        // Inflate the menu; this adds items to the action bar if it is present.
92        getMenuInflater().inflate(R.menu.main, menu);
93        return true;
94    }
95
96    @Override
97    public void onResume() {
98        super.onResume();
99        mPlayer.onResume();
100        mPlayer.setListener(mListener);
101    }
102
103    @Override
104    public void onPause() {
105        mPlayer.setListener(null);
106        mPlayer.onPause();
107        super.onPause();
108    }
109
110    @Override
111    public void onActivityResult(int requestCode, int resultCode,
112            Intent resultData) {
113        if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
114            Uri uri = null;
115            if (resultData != null) {
116                uri = resultData.getData();
117                Log.i(TAG, "Uri: " + uri.toString());
118                mAlbumArtBitmap = null;
119                try {
120                    mAlbumArtBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
121                } catch (IOException e) {
122                    Log.v(TAG, "Couldn't load album art", e);
123                }
124                mArtView.setImageBitmap(mAlbumArtBitmap);
125                if (mAlbumArtBitmap != null) {
126                    mArtView.setVisibility(View.VISIBLE);
127                } else {
128                    mArtView.setVisibility(View.GONE);
129                }
130                mPlayer.setArt(mAlbumArtBitmap);
131            }
132        }
133    }
134
135    private void setControlsEnabled(boolean enabled) {
136        mStartButton.setEnabled(enabled);
137        mPlayButton.setEnabled(enabled);
138    }
139
140    private View.OnClickListener mButtonListener = new View.OnClickListener() {
141        @Override
142        public void onClick(View v) {
143            final int state = mPlaybackState.getState();
144            switch (v.getId()) {
145                case R.id.play_button:
146                    Log.d(TAG, "Play button pressed, in state " + state);
147                    if (state == PlaybackState.STATE_PAUSED
148                            || state == PlaybackState.STATE_STOPPED) {
149                        mPlayer.play();
150                    } else if (state == PlaybackState.STATE_PLAYING) {
151                        mPlayer.pause();
152                    }
153                    break;
154                case R.id.start_button:
155                    Log.d(TAG, "Start button pressed, in state " + state);
156                    mPlayer.setContent(mContentText.getText().toString());
157                    break;
158                case R.id.route_button:
159                    mPlayer.showRoutePicker();
160                    break;
161                case R.id.art_picker:
162                    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
163                    intent.addCategory(Intent.CATEGORY_OPENABLE);
164                    intent.setType("image/*");
165
166                    startActivityForResult(intent, READ_REQUEST_CODE);
167                    break;
168            }
169
170        }
171    };
172
173    private PlayerController.Listener mListener = new PlayerController.Listener() {
174        public MediaMetadata mMetadata;
175
176        @Override
177        public void onPlaybackStateChange(PlaybackState state) {
178            mPlaybackState = state;
179            boolean enablePlay = false;
180            boolean enableControls = true;
181            StringBuilder statusBuilder = new StringBuilder();
182            switch (mPlaybackState.getState()) {
183                case PlaybackState.STATE_PLAYING:
184                    statusBuilder.append("playing");
185                    mPlayButton.setText("Pause");
186                    enablePlay = true;
187                    break;
188                case PlaybackState.STATE_PAUSED:
189                    statusBuilder.append("paused");
190                    mPlayButton.setText("Play");
191                    enablePlay = true;
192                    break;
193                case PlaybackState.STATE_STOPPED:
194                    statusBuilder.append("ended");
195                    mPlayButton.setText("Play");
196                    enablePlay = true;
197                    break;
198                case PlaybackState.STATE_ERROR:
199                    statusBuilder.append("error: ").append(state.getErrorMessage());
200                    break;
201                case PlaybackState.STATE_BUFFERING:
202                    statusBuilder.append("buffering");
203                    break;
204                case PlaybackState.STATE_NONE:
205                    statusBuilder.append("none");
206                    break;
207                case PlaybackState.STATE_CONNECTING:
208                    statusBuilder.append("connecting");
209                    enableControls = false;
210                    break;
211                default:
212                    statusBuilder.append(mPlaybackState);
213            }
214            statusBuilder.append(" -- At position: ").append(state.getPosition());
215            mStatusView.setText(statusBuilder.toString());
216            mPlayButton.setEnabled(enablePlay);
217            setControlsEnabled(enableControls);
218        }
219
220        @Override
221        public void onConnectionStateChange(int state) {
222            if (state == PlayerController.STATE_DISCONNECTED) {
223                setControlsEnabled(false);
224            } else if (state == PlayerController.STATE_CONNECTED) {
225                setControlsEnabled(true);
226            }
227        }
228
229        @Override
230        public void onMetadataChange(MediaMetadata metadata) {
231            mMetadata = metadata;
232        }
233    };
234}
235