blob: e1715bde603a011632f75f322a90d9c214ab921e [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.car.media.drawer;
import android.content.ComponentName;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.widget.DrawerLayout;
import android.view.View;
import com.android.car.app.CarDrawerActivity;
import com.android.car.app.CarDrawerAdapter;
import com.android.car.media.MediaManager;
import com.android.car.media.MediaPlaybackModel;
import com.android.car.media.R;
/**
* Manages overall Drawer functionality.
* <p>
* Maintains separate MediaPlaybackModel for media browsing and control. Sets up root Drawer
* adapter with root of media-browse tree (using MediaBrowserItemsFetcher). Supports switching the
* rootAdapter to show the queue-items (using MediaQueueItemsFetcher).
*/
public class MediaDrawerController {
private static final String TAG = "MediaDrawerController";
private static final String EXTRA_ICON_SIZE =
"com.google.android.gms.car.media.BrowserIconSize";
private final CarDrawerActivity mActivity;
private final MediaPlaybackModel mMediaPlaybackModel;
private MediaDrawerAdapter mRootAdapter;
public MediaDrawerController(CarDrawerActivity activity) {
mActivity = activity;
Bundle extras = new Bundle();
extras.putInt(EXTRA_ICON_SIZE,
mActivity.getResources().getDimensionPixelSize(R.dimen.car_list_item_icon_size));
mMediaPlaybackModel = new MediaPlaybackModel(mActivity, extras);
mMediaPlaybackModel.addListener(mModelListener);
// TODO(sriniv): Needs smallLayout below. But breaks when showing queue items (b/36573125).
mRootAdapter = new MediaDrawerAdapter(mActivity, false /* useSmallLayout */);
// Start with a empty title since we depend on the mMediaManagerListener callback to
// know which app is being used and set the actual title there.
mRootAdapter.setTitle("");
// Kick off MediaBrowser/MediaController connection.
mMediaPlaybackModel.start();
}
public void cleanup() {
mRootAdapter.cleanup();
mMediaPlaybackModel.stop();
}
/**
* @return Adapter to display root items of MediaBrowse tree. {@link #showQueueInDrawer()} can
* be used to display items from the queue.
*/
public CarDrawerAdapter getRootAdapter() {
return mRootAdapter;
}
private MediaItemsFetcher createRootMediaItemsFetcher() {
return new MediaBrowserItemsFetcher(mActivity, mMediaPlaybackModel,
mMediaPlaybackModel.getMediaBrowser().getRoot(), true /* showQueueItem */);
}
private final MediaPlaybackModel.Listener mModelListener =
new MediaPlaybackModel.AbstractListener() {
@Override
public void onMediaAppChanged(@Nullable ComponentName currentName,
@Nullable ComponentName newName) {
// Only store MediaManager instance to a local variable when it is short lived.
MediaManager mediaManager = MediaManager.getInstance(mActivity);
mRootAdapter.setTitle(mediaManager.getMediaClientName());
}
@Override
public void onMediaConnected() {
mRootAdapter.setFetcher(createRootMediaItemsFetcher());
}
};
/**
* Switch the rootAdapter to show items from the currently playing Queue and open the drawer.
* When the drawer is closed, the adapter items are switched back to media-browse root.
*/
public void showQueueInDrawer() {
mRootAdapter.setFetcher(new MediaQueueItemsFetcher(mActivity, mMediaPlaybackModel));
mRootAdapter.setTitle(mMediaPlaybackModel.getQueueTitle());
mActivity.openDrawer();
mActivity.addDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerClosed(View drawerView) {
mRootAdapter.setFetcher(createRootMediaItemsFetcher());
mActivity.removeDrawerListener(this);
mRootAdapter.setTitle(
MediaManager.getInstance(mActivity).getMediaClientName());
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {}
@Override
public void onDrawerOpened(View drawerView) {}
@Override
public void onDrawerStateChanged(int newState) {}
});
}
}