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 */ 16 package com.android.onemedia; 17 18 19 import android.app.Activity; 20 import android.app.Notification; 21 import android.app.NotificationManager; 22 import android.app.PendingIntent; 23 import android.content.ComponentName; 24 import android.content.Intent; 25 import android.graphics.Bitmap; 26 import android.graphics.BitmapFactory; 27 import android.media.MediaMetadata; 28 import android.media.session.PlaybackState; 29 import android.net.Uri; 30 import android.os.Bundle; 31 import android.provider.MediaStore; 32 import android.text.format.DateUtils; 33 import android.util.Log; 34 import android.view.Menu; 35 import android.view.View; 36 import android.widget.Button; 37 import android.widget.CheckBox; 38 import android.widget.EditText; 39 import android.widget.ImageView; 40 import android.widget.TextView; 41 42 import java.io.IOException; 43 44 public 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 onCreate(Bundle savedInstanceState)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 onCreateOptionsMenu(Menu menu)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 onResume()97 public void onResume() { 98 super.onResume(); 99 mPlayer.onResume(); 100 mPlayer.setListener(mListener); 101 } 102 103 @Override onPause()104 public void onPause() { 105 mPlayer.setListener(null); 106 mPlayer.onPause(); 107 super.onPause(); 108 } 109 110 @Override onActivityResult(int requestCode, int resultCode, Intent resultData)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 setControlsEnabled(boolean enabled)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