1 /* 2 * Copyright (C) 2017 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.car.media.drawer; 17 18 import android.content.ComponentName; 19 import android.os.Bundle; 20 import android.support.annotation.Nullable; 21 import android.support.v4.widget.DrawerLayout; 22 import android.view.View; 23 24 import com.android.car.app.CarDrawerActivity; 25 import com.android.car.app.CarDrawerAdapter; 26 import com.android.car.media.MediaManager; 27 import com.android.car.media.MediaPlaybackModel; 28 import com.android.car.media.R; 29 30 /** 31 * Manages overall Drawer functionality. 32 * <p> 33 * Maintains separate MediaPlaybackModel for media browsing and control. Sets up root Drawer 34 * adapter with root of media-browse tree (using MediaBrowserItemsFetcher). Supports switching the 35 * rootAdapter to show the queue-items (using MediaQueueItemsFetcher). 36 */ 37 public class MediaDrawerController { 38 private static final String TAG = "MediaDrawerController"; 39 private static final String EXTRA_ICON_SIZE = 40 "com.google.android.gms.car.media.BrowserIconSize"; 41 42 private final CarDrawerActivity mActivity; 43 private final MediaPlaybackModel mMediaPlaybackModel; 44 private MediaDrawerAdapter mRootAdapter; 45 46 public MediaDrawerController(CarDrawerActivity activity) { 47 mActivity = activity; 48 Bundle extras = new Bundle(); 49 extras.putInt(EXTRA_ICON_SIZE, 50 mActivity.getResources().getDimensionPixelSize(R.dimen.car_list_item_icon_size)); 51 mMediaPlaybackModel = new MediaPlaybackModel(mActivity, extras); 52 mMediaPlaybackModel.addListener(mModelListener); 53 54 // TODO(sriniv): Needs smallLayout below. But breaks when showing queue items (b/36573125). 55 mRootAdapter = new MediaDrawerAdapter(mActivity, false /* useSmallLayout */); 56 // Start with a empty title since we depend on the mMediaManagerListener callback to 57 // know which app is being used and set the actual title there. 58 mRootAdapter.setTitle(""); 59 60 // Kick off MediaBrowser/MediaController connection. 61 mMediaPlaybackModel.start(); 62 } 63 64 public void cleanup() { 65 mRootAdapter.cleanup(); 66 mMediaPlaybackModel.stop(); 67 } 68 69 /** 70 * @return Adapter to display root items of MediaBrowse tree. {@link #showQueueInDrawer()} can 71 * be used to display items from the queue. 72 */ 73 public CarDrawerAdapter getRootAdapter() { 74 return mRootAdapter; 75 } 76 77 private MediaItemsFetcher createRootMediaItemsFetcher() { 78 return new MediaBrowserItemsFetcher(mActivity, mMediaPlaybackModel, 79 mMediaPlaybackModel.getMediaBrowser().getRoot(), true /* showQueueItem */); 80 } 81 82 private final MediaPlaybackModel.Listener mModelListener = 83 new MediaPlaybackModel.AbstractListener() { 84 @Override 85 public void onMediaAppChanged(@Nullable ComponentName currentName, 86 @Nullable ComponentName newName) { 87 // Only store MediaManager instance to a local variable when it is short lived. 88 MediaManager mediaManager = MediaManager.getInstance(mActivity); 89 mRootAdapter.setTitle(mediaManager.getMediaClientName()); 90 } 91 92 @Override 93 public void onMediaConnected() { 94 mRootAdapter.setFetcher(createRootMediaItemsFetcher()); 95 } 96 }; 97 98 /** 99 * Switch the rootAdapter to show items from the currently playing Queue and open the drawer. 100 * When the drawer is closed, the adapter items are switched back to media-browse root. 101 */ 102 public void showQueueInDrawer() { 103 mRootAdapter.setFetcher(new MediaQueueItemsFetcher(mActivity, mMediaPlaybackModel)); 104 mRootAdapter.setTitle(mMediaPlaybackModel.getQueueTitle()); 105 mActivity.openDrawer(); 106 mActivity.addDrawerListener(new DrawerLayout.DrawerListener() { 107 @Override 108 public void onDrawerClosed(View drawerView) { 109 mRootAdapter.setFetcher(createRootMediaItemsFetcher()); 110 mActivity.removeDrawerListener(this); 111 mRootAdapter.setTitle( 112 MediaManager.getInstance(mActivity).getMediaClientName()); 113 } 114 115 @Override 116 public void onDrawerSlide(View drawerView, float slideOffset) {} 117 @Override 118 public void onDrawerOpened(View drawerView) {} 119 @Override 120 public void onDrawerStateChanged(int newState) {} 121 }); 122 } 123 }