• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
MediaDrawerController(CarDrawerActivity activity)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 
cleanup()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      */
getRootAdapter()73     public CarDrawerAdapter getRootAdapter() {
74         return mRootAdapter;
75     }
76 
createRootMediaItemsFetcher()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      */
showQueueInDrawer()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 }