1c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler/* 2c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * Copyright (C) 2012 The Android Open Source Project 3c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * 4c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * Licensed under the Apache License, Version 2.0 (the "License"); 5c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * you may not use this file except in compliance with the License. 6c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * You may obtain a copy of the License at 7c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * 8c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * http://www.apache.org/licenses/LICENSE-2.0 9c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * 10c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * Unless required by applicable law or agreed to in writing, software 11c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * distributed under the License is distributed on an "AS IS" BASIS, 12c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * See the License for the specific language governing permissions and 14c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * limitations under the License. 15c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler */ 16c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler 17c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerpackage com.android.systemui.statusbar.phone; 18c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler 19c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.content.Context; 20c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.util.AttributeSet; 215de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wrenimport android.util.Log; 22c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.view.KeyEvent; 235de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wrenimport android.view.MotionEvent; 24c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.widget.FrameLayout; 259b2cd15f0fed990f532f35590c2a2896b90dc7fcChris Wrenimport android.widget.ScrollView; 26c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.widget.TextSwitcher; 27c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler 285de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wrenimport com.android.systemui.ExpandHelper; 295de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wrenimport com.android.systemui.R; 305de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wrenimport com.android.systemui.statusbar.policy.NotificationRowLayout; 315de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren 32c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler 33c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerpublic class StatusBarWindowView extends FrameLayout 34c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler{ 355de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren private static final String TAG = "StatusBarWindowView"; 365de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren 375de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren private ExpandHelper mExpandHelper; 385de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren private NotificationRowLayout latestItems; 395de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren 40c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler PhoneStatusBar mService; 41c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler 42c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler public StatusBarWindowView(Context context, AttributeSet attrs) { 43c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler super(context, attrs); 445de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren setMotionEventSplittingEnabled(false); 455de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren } 465de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren 475de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren @Override 485de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren protected void onAttachedToWindow () { 495de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren super.onAttachedToWindow(); 505de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren latestItems = (NotificationRowLayout) findViewById(R.id.latestItems); 519b2cd15f0fed990f532f35590c2a2896b90dc7fcChris Wren ScrollView scroller = (ScrollView) findViewById(R.id.scroll); 525de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_min_height); 535de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren int maxHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_max_height); 545de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren mExpandHelper = new ExpandHelper(mContext, latestItems, minHeight, maxHeight); 555de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren mExpandHelper.setEventSource(this); 56c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler } 57c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler 58c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler @Override 59c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler public boolean dispatchKeyEvent(KeyEvent event) { 60c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler boolean down = event.getAction() == KeyEvent.ACTION_DOWN; 61c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler switch (event.getKeyCode()) { 62c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler case KeyEvent.KEYCODE_BACK: 63c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler if (!down) { 64c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler mService.animateCollapse(); 65c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler } 66c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler return true; 67c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler } 68c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler return super.dispatchKeyEvent(event); 69c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler } 705de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren 715de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren @Override 725de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren public boolean onInterceptTouchEvent(MotionEvent ev) { 735de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren MotionEvent cancellation = MotionEvent.obtain(ev); 745de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren cancellation.setAction(MotionEvent.ACTION_CANCEL); 755de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren 765de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren boolean intercept = mExpandHelper.onInterceptTouchEvent(ev) || 775de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren super.onInterceptTouchEvent(ev); 785de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren if (intercept) { 795de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren latestItems.onInterceptTouchEvent(cancellation); 805de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren } 815de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren return intercept; 825de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren } 835de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren 845de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren @Override 855de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren public boolean onTouchEvent(MotionEvent ev) { 865de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren boolean handled = mExpandHelper.onTouchEvent(ev) || 875de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren super.onTouchEvent(ev); 885de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren return handled; 895de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren } 90c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler} 91c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler 92