Home | History | Annotate | Download | only in drawer
      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 }