blob: fd0cb08c3d2f888f4abf7a8a3499ec978ce2a5e0 [file] [log] [blame]
Jorim Jaggibe565df2014-04-28 17:51:23 +02001/*
2 * Copyright (C) 2014 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
17package com.android.systemui.statusbar;
18
19import android.content.Context;
20import android.graphics.Rect;
21import android.util.AttributeSet;
22import android.view.Gravity;
23import android.view.View;
24
25import com.android.systemui.R;
26
27/**
28 * A frame layout containing the actual payload of the notification, including the contracted and
29 * expanded layout. This class is responsible for clipping the content and and switching between the
30 * expanded and contracted view depending on its clipped size.
31 */
32public class NotificationContentView extends ExpandableView {
33
34 private final Rect mClipBounds = new Rect();
35
36 private View mContractedChild;
37 private View mExpandedChild;
38
39 private int mSmallHeight;
40
41 public NotificationContentView(Context context, AttributeSet attrs) {
42 super(context, attrs);
43 mSmallHeight = getResources().getDimensionPixelSize(R.dimen.notification_min_height);
44 mActualHeight = mSmallHeight;
45 }
46
47 @Override
48 protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
49 super.onLayout(changed, left, top, right, bottom);
50 updateClipping();
51 }
52
53 public void setContractedChild(View child) {
54 if (mContractedChild != null) {
55 removeView(mContractedChild);
56 }
57 sanitizeContractedLayoutParams(child);
58 addView(child);
59 mContractedChild = child;
60 selectLayout();
61 }
62
63 public void setExpandedChild(View child) {
64 if (mExpandedChild != null) {
65 removeView(mExpandedChild);
66 }
67 addView(child);
68 mExpandedChild = child;
69 selectLayout();
70 }
71
72 @Override
73 public void setActualHeight(int actualHeight) {
74 super.setActualHeight(actualHeight);
75 selectLayout();
76 updateClipping();
77 }
78
79 @Override
80 public int getMaxHeight() {
81
82 // The maximum height is just the laid out height.
83 return getHeight();
84 }
85
86 @Override
87 public void setClipTopAmount(int clipTopAmount) {
88 super.setClipTopAmount(clipTopAmount);
89 updateClipping();
90 }
91
92 public int getClipTopAmount() {
93 return mClipTopAmount;
94 }
95
96 private void updateClipping() {
97 mClipBounds.set(0, mClipTopAmount, getWidth(), mActualHeight);
98 setClipBounds(mClipBounds);
99 }
100
101 private void sanitizeContractedLayoutParams(View contractedChild) {
102 LayoutParams lp = (LayoutParams) contractedChild.getLayoutParams();
103 lp.height = mSmallHeight;
104 contractedChild.setLayoutParams(lp);
105 }
106
107 private void selectLayout() {
108 if (mActualHeight <= mSmallHeight || mExpandedChild == null) {
109 if (mContractedChild.getVisibility() != View.VISIBLE) {
110 mContractedChild.setVisibility(View.VISIBLE);
111 }
112 if (mExpandedChild != null && mExpandedChild.getVisibility() != View.INVISIBLE) {
113 mExpandedChild.setVisibility(View.INVISIBLE);
114 }
115 } else {
116 if (mExpandedChild.getVisibility() != View.VISIBLE) {
117 mExpandedChild.setVisibility(View.VISIBLE);
118 }
119 if (mContractedChild.getVisibility() != View.INVISIBLE) {
120 mContractedChild.setVisibility(View.INVISIBLE);
121 }
122 }
123 }
124
125 public void notifyContentUpdated() {
126 selectLayout();
127 }
128}