1fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler/* 2fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * Copyright (C) 2011 The Android Open Source Project 3fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * 4fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * Licensed under the Apache License, Version 2.0 (the "License"); 5fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * you may not use this file except in compliance with the License. 6fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * You may obtain a copy of the License at 7fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * 8fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * http://www.apache.org/licenses/LICENSE-2.0 9fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * 10fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * Unless required by applicable law or agreed to in writing, software 11fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * distributed under the License is distributed on an "AS IS" BASIS, 12fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * See the License for the specific language governing permissions and 14fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * limitations under the License. 15fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler */ 16fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 17fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerpackage com.android.systemui.statusbar.policy; 18fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 19fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.animation.Animator; 20fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.animation.AnimatorListenerAdapter; 21fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.animation.LayoutTransition; 22fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.animation.ObjectAnimator; 23fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.animation.ValueAnimator; 24fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.content.Context; 25fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.content.res.Configuration; 26fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.content.res.TypedArray; 27fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.graphics.Rect; 28fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.graphics.drawable.Drawable; 29fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.util.AttributeSet; 30fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.util.Log; 31fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.util.Slog; 32fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.view.MotionEvent; 33fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.view.View; 34fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.view.View.OnClickListener; 35fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.view.ViewConfiguration; 36fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.view.ViewGroup; 37fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.widget.LinearLayout; 38fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.widget.RemoteViews; 39fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 40fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport com.android.systemui.R; 41fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport com.android.systemui.SwipeHelper; 42fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport com.android.systemui.statusbar.BaseStatusBar; 43fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 44fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport java.util.HashMap; 45fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 46fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerpublic class IntruderAlertView extends LinearLayout implements SwipeHelper.Callback { 47fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler private static final String TAG = "IntruderAlertView"; 48fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler private static final boolean DEBUG = false; 49fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 50fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler Rect mTmpRect = new Rect(); 51fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 52fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler private SwipeHelper mSwipeHelper; 53fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 54fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler BaseStatusBar mBar; 55fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler private ViewGroup mContentHolder; 56fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 57fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler private RemoteViews mIntruderRemoteViews; 58fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler private OnClickListener mOnClickListener; 59fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 60fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler public IntruderAlertView(Context context, AttributeSet attrs) { 61fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler this(context, attrs, 0); 62fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 63fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 64fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler public IntruderAlertView(Context context, AttributeSet attrs, int defStyle) { 65fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler super(context, attrs, defStyle); 66fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 67fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler setOrientation(LinearLayout.VERTICAL); 68fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 69fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 70fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler @Override 71fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler public void onAttachedToWindow() { 72fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler float densityScale = getResources().getDisplayMetrics().density; 73fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop(); 74fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, pagingTouchSlop); 75fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 76fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler mContentHolder = (ViewGroup) findViewById(R.id.contentHolder); 77fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler if (mIntruderRemoteViews != null) { 78fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler // whoops, we're on already! 79fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler applyIntruderContent(mIntruderRemoteViews, mOnClickListener); 80fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 81fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 82fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 83fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler public void setBar(BaseStatusBar bar) { 84fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler mBar = bar; 85fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 86fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 87fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler @Override 88fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler public boolean onInterceptTouchEvent(MotionEvent ev) { 89fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler if (DEBUG) Log.v(TAG, "onInterceptTouchEvent()"); 90fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler return mSwipeHelper.onInterceptTouchEvent(ev) || 91fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler super.onInterceptTouchEvent(ev); 92fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 93fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 94fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler @Override 95fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler public boolean onTouchEvent(MotionEvent ev) { 96fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler return mSwipeHelper.onTouchEvent(ev) || 97fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler super.onTouchEvent(ev); 98fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 99fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 100fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler public boolean canChildBeDismissed(View v) { 101fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler return true; 102fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 103fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 104fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler public void onChildDismissed(View v) { 105fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler Slog.v(TAG, "User swiped intruder to dismiss"); 106fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler mBar.dismissIntruder(); 107fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 108fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 109fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler public void onBeginDrag(View v) { 110fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 111fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 112fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler public void onDragCancelled(View v) { 113fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler mContentHolder.setAlpha(1f); // sometimes this isn't quite reset 114fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 115fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 116fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler public View getChildAtPosition(MotionEvent ev) { 117fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler return mContentHolder; 118fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 119fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 120fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler public View getChildContentView(View v) { 121fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler return v; 122fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 123fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 124fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler @Override 125fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler protected void onConfigurationChanged(Configuration newConfig) { 126fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler super.onConfigurationChanged(newConfig); 127fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler float densityScale = getResources().getDisplayMetrics().density; 128fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler mSwipeHelper.setDensityScale(densityScale); 129fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop(); 130fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler mSwipeHelper.setPagingTouchSlop(pagingTouchSlop); 131fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 132fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 133fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler @Override 134fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler public void onDraw(android.graphics.Canvas c) { 135fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler super.onDraw(c); 136fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler if (DEBUG) { 137fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler //Slog.d(TAG, "onDraw: canvas height: " + c.getHeight() + "px; measured height: " 138fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler // + getMeasuredHeight() + "px"); 139fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler c.save(); 140fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler c.clipRect(6, 6, c.getWidth() - 6, getMeasuredHeight() - 6, 141fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler android.graphics.Region.Op.DIFFERENCE); 142fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler c.drawColor(0xFFcc00cc); 143fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler c.restore(); 144fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 145fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 146fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 147fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler public void applyIntruderContent(RemoteViews intruderView, OnClickListener listener) { 148fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler if (DEBUG) { 149fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler Slog.v(TAG, "applyIntruderContent: view=" + intruderView + " listener=" + listener); 150fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 151fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler mIntruderRemoteViews = intruderView; 152fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler mOnClickListener = listener; 153fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler if (mContentHolder == null) { 154fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler // too soon! 155fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler return; 156fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 157fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler mContentHolder.setX(0); 158fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler mContentHolder.setVisibility(View.VISIBLE); 159fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler mContentHolder.setAlpha(1f); 160fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler mContentHolder.removeAllViews(); 161fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler final View content = intruderView.apply(getContext(), mContentHolder); 162fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler if (listener != null) { 163fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler content.setOnClickListener(listener); 164fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 165fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler //content.setBackgroundResource(R.drawable.intruder_row_bg); 166fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler Drawable bg = getResources().getDrawable(R.drawable.intruder_row_bg); 167fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler if (bg == null) { 168fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler Log.e(TAG, String.format("Can't find background drawable id=0x%08x", R.drawable.intruder_row_bg)); 169fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } else { 170fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler content.setBackgroundDrawable(bg); 171fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 172fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 173fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler mContentHolder.addView(content); 174fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler 175fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler } 176fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler}