184769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay/* 284769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * Copyright (C) 2016 The Android Open Source Project 384769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * 484769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * Licensed under the Apache License, Version 2.0 (the "License"); 584769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * you may not use this file except in compliance with the License. 684769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * You may obtain a copy of the License at 784769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * 884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * http://www.apache.org/licenses/LICENSE-2.0 984769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * 1084769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * Unless required by applicable law or agreed to in writing, software 1184769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * distributed under the License is distributed on an "AS IS" BASIS, 1284769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1384769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * See the License for the specific language governing permissions and 1484769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay * limitations under the License. 1584769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay */ 1684769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay 171c45629929c31cf7903cf955a48f170a8cdee255Ben Linpackage com.android.documentsui; 1884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay 19da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanimport com.android.documentsui.DragAndDropManager.State; 20da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan 2184769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.content.Context; 2284769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.graphics.Canvas; 23d8d7c255cde4da887bb83667520a54e01726b6b1Ben Linimport android.graphics.Color; 24d8d7c255cde4da887bb83667520a54e01726b6b1Ben Linimport android.graphics.Paint; 2584769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.graphics.Point; 2684769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.graphics.Rect; 2784769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.graphics.drawable.Drawable; 2884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.view.LayoutInflater; 2984769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.view.View; 3084769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKayimport android.widget.TextView; 3184769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay 32da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanclass DragShadowBuilder extends View.DragShadowBuilder { 3384769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay 3484769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay private final View mShadowView; 3584769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay private final TextView mTitle; 36166c5c6fc17461cb52f2b83eaec86cfc15b53004Ben Lin private final DropBadgeView mIcon; 3784769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay private final int mWidth; 3884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay private final int mHeight; 39d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin private final int mShadowRadius; 40d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin private int mPadding; 41d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin private Paint paint; 4284769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay 43da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan DragShadowBuilder(Context context) { 4484769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay mWidth = context.getResources().getDimensionPixelSize(R.dimen.drag_shadow_width); 451c45629929c31cf7903cf955a48f170a8cdee255Ben Lin mHeight = context.getResources().getDimensionPixelSize(R.dimen.drag_shadow_height); 46d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin mShadowRadius = context.getResources().getDimensionPixelSize(R.dimen.drag_shadow_radius); 47d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin mPadding = context.getResources().getDimensionPixelSize(R.dimen.drag_shadow_padding); 4884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay 4984769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay mShadowView = LayoutInflater.from(context).inflate(R.layout.drag_shadow_layout, null); 5084769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay mTitle = (TextView) mShadowView.findViewById(android.R.id.title); 51166c5c6fc17461cb52f2b83eaec86cfc15b53004Ben Lin mIcon = (DropBadgeView) mShadowView.findViewById(android.R.id.icon); 5284769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay 53d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin // Important for certain APIs 54d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin mShadowView.setLayerType(View.LAYER_TYPE_SOFTWARE, paint); 55d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin paint = new Paint(Paint.ANTI_ALIAS_FLAG); 5684769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay } 5784769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay 5884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay @Override 5984769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay public void onProvideShadowMetrics( 6084769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay Point shadowSize, Point shadowTouchPoint) { 6184769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay shadowSize.set(mWidth, mHeight); 6284769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay shadowTouchPoint.set(mWidth, mHeight); 6384769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay } 6484769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay 6584769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay @Override 6684769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay public void onDrawShadow(Canvas canvas) { 6784769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay Rect r = canvas.getClipBounds(); 6884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay // Calling measure is necessary in order for all child views to get correctly laid out. 6984769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay mShadowView.measure( 7084769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay View.MeasureSpec.makeMeasureSpec(r.right- r.left, View.MeasureSpec.EXACTLY), 71d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin View.MeasureSpec.makeMeasureSpec(r.bottom - r.top , View.MeasureSpec.EXACTLY)); 7284769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay mShadowView.layout(r.left, r.top, r.right, r.bottom); 73d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin 74d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin // Since DragShadow is not an actual view drawn in hardware-accelerated window, 75d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin // android:elevation does not work; we need to draw the shadow ourselves manually. 76d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin paint.setColor(Color.TRANSPARENT); 77d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin // Shadow 1 78d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin int opacity = (int) (255 * 0.1); 79d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin paint.setShadowLayer(mShadowRadius, 0, 0, Color.argb(opacity, 0, 0, 0)); 80d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin canvas.drawRect(r.left + mPadding, r.top + mPadding, r.right - mPadding, 81d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin r.bottom - mPadding, paint); 82d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin // Shadow 2 83d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin opacity = (int) (255 * 0.24); 84d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin paint.setShadowLayer(mShadowRadius, 0, mShadowRadius, Color.argb(opacity, 0, 0, 0)); 85d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin canvas.drawRect(r.left + mPadding, r.top + mPadding, r.right - mPadding, 86d8d7c255cde4da887bb83667520a54e01726b6b1Ben Lin r.bottom - mPadding, paint); 8784769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay mShadowView.draw(canvas); 8884769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay } 89f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay 90da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan void updateTitle(String title) { 911c45629929c31cf7903cf955a48f170a8cdee255Ben Lin mTitle.setText(title); 921c45629929c31cf7903cf955a48f170a8cdee255Ben Lin } 931c45629929c31cf7903cf955a48f170a8cdee255Ben Lin 94da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan void updateIcon(Drawable icon) { 95166c5c6fc17461cb52f2b83eaec86cfc15b53004Ben Lin mIcon.updateIcon(icon); 961c45629929c31cf7903cf955a48f170a8cdee255Ben Lin } 971c45629929c31cf7903cf955a48f170a8cdee255Ben Lin 98da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan void onStateUpdated(@State int state) { 99da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan mIcon.updateState(state); 100f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay } 10184769b8205cf4a100c9d4f65c41cf72ba7a3b40fSteve McKay} 102