/* * Copyright (C) 2015 The CyanogenMod 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.systemui.statusbar; import android.content.Context; import android.content.res.Resources; import android.media.session.MediaController; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewStub; import com.android.systemui.R; import com.android.systemui.tuner.TunerService; public class MediaExpandableNotificationRow extends ExpandableNotificationRow implements TunerService.Tunable { private static final String TAG = MediaExpandableNotificationRow.class.getSimpleName(); public static final boolean DEBUG = false; public static final int MAX_QUEUE_ENTRIES = 3; private QueueView mQueue; private int mMaxQueueHeight; private int mRowHeight; private int mShadowHeight; private int mDisplayedRows; private boolean mQueueEnabled = false; private static final String NOTIFICATION_PLAY_QUEUE = "cmsystem:" + cyanogenmod.providers.CMSettings.System.NOTIFICATION_PLAY_QUEUE; public MediaExpandableNotificationRow(Context context, AttributeSet attrs) { super(context, attrs); Resources res = mContext.getResources(); // 3 * queue_row_height + shadow height mRowHeight = res.getDimensionPixelSize(R.dimen.queue_row_height); mShadowHeight = res.getDimensionPixelSize(R.dimen.queue_top_shadow); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); TunerService.get(getContext()).addTunable(this, NOTIFICATION_PLAY_QUEUE); } @Override protected void onDetachedFromWindow() { TunerService.get(getContext()).removeTunable(this); super.onDetachedFromWindow(); } @Override public void onTuningChanged(String key, String newValue) { if (NOTIFICATION_PLAY_QUEUE.equals(key) && mQueue != null) { boolean show = newValue == null || Integer.valueOf(newValue) == 1; showQueue(show); } } @Override public boolean inflateGuts() { if (getGuts() == null) { View guts = mGutsStub.inflate(); ViewStub mediaGuts = (ViewStub) guts.findViewById(R.id.notification_guts_media_stub); mediaGuts.inflate(); } if (!mQueueEnabled) { return true; } return !mQueue.isUserSelectingRow(); } @Override protected void onFinishInflate() { super.onFinishInflate(); mQueue = (QueueView) findViewById(R.id.queue_view); showQueue(mQueueEnabled); } private void showQueue(boolean show) { if (show != mQueueEnabled) { mQueueEnabled = show; mQueue.setQueueEnabled(mQueueEnabled); mQueue.setVisibility(mQueueEnabled ? View.VISIBLE : View.GONE); requestLayout(); } } public void setMediaController(MediaController mediaController) { if (DEBUG) Log.d(TAG, "setMediaController() called with " + "mediaController = [" + mediaController + "]"); if (mQueue != null && mQueue.setController(mediaController) && mQueueEnabled) { notifyHeightChanged(true); } } @Override protected void updateMaxHeights() { // update queue height based on number of rows int rows = mQueue != null ? mQueue.getCurrentQueueRowCount() : 0; if (rows != mDisplayedRows) { mMaxQueueHeight = rows * mRowHeight; if (mMaxQueueHeight > 0) { mMaxQueueHeight += mShadowHeight; } mDisplayedRows = rows; } int intrinsicBefore = getIntrinsicHeight(); View expandedChild = mPrivateLayout.getExpandedChild(); if (expandedChild == null) { expandedChild = mPrivateLayout.getContractedChild(); } mMaxExpandHeight = expandedChild.getHeight() + mMaxQueueHeight; View headsUpChild = mPrivateLayout.getHeadsUpChild(); if (headsUpChild == null) { headsUpChild = mPrivateLayout.getContractedChild(); } mHeadsUpHeight = headsUpChild.getHeight(); if (intrinsicBefore != getIntrinsicHeight()) { notifyHeightChanged(false /* needsAnimation */); } } @Override public int getMaxContentHeight() { return super.getMaxContentHeight() + mMaxQueueHeight; } @Override public boolean dispatchTouchEvent(MotionEvent event) { if (mQueueEnabled && isExpanded() && mQueue.isUserSelectingRow() && event.getActionMasked() != MotionEvent.ACTION_DOWN && event.getActionMasked() != MotionEvent.ACTION_UP && event.getActionMasked() != MotionEvent.ACTION_CANCEL) { // this is for hotspot propogation? return false; } return super.dispatchTouchEvent(event); } }