| /* |
| * Copyright (C) 2016 The Android Open Source 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.pip.phone; |
| |
| import android.content.Context; |
| import android.graphics.PixelFormat; |
| import android.graphics.Rect; |
| import android.view.Gravity; |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.view.View.OnLayoutChangeListener; |
| import android.view.WindowManager; |
| |
| import com.android.systemui.Interpolators; |
| import com.android.systemui.R; |
| |
| public class PipDismissViewController { |
| |
| // This delay controls how long to wait before we show the target when the user first moves |
| // the PIP, to prevent the target from animating if the user just wants to fling the PIP |
| private static final int SHOW_TARGET_DELAY = 100; |
| private static final int SHOW_TARGET_DURATION = 200; |
| |
| private Context mContext; |
| private WindowManager mWindowManager; |
| |
| private View mDismissView; |
| private Rect mDismissTargetScreenBounds = new Rect(); |
| |
| public PipDismissViewController(Context context) { |
| mContext = context; |
| mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); |
| } |
| |
| /** |
| * Creates the dismiss target for showing via {@link #showDismissTarget()}. |
| */ |
| public void createDismissTarget() { |
| if (mDismissView == null) { |
| // Create a new view for the dismiss target |
| int dismissTargetSize = mContext.getResources().getDimensionPixelSize( |
| R.dimen.pip_dismiss_target_size); |
| LayoutInflater inflater = LayoutInflater.from(mContext); |
| mDismissView = inflater.inflate(R.layout.pip_dismiss_view, null); |
| mDismissView.addOnLayoutChangeListener(new OnLayoutChangeListener() { |
| @Override |
| public void onLayoutChange(View v, int left, int top, int right, int bottom, |
| int oldLeft, int oldTop, int oldRight, int oldBottom) { |
| if (mDismissView != null) { |
| mDismissView.getBoundsOnScreen(mDismissTargetScreenBounds); |
| } |
| } |
| }); |
| |
| // Add the target to the window |
| WindowManager.LayoutParams lp = new WindowManager.LayoutParams( |
| dismissTargetSize, |
| dismissTargetSize, |
| WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG, |
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
| | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
| | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, |
| PixelFormat.TRANSLUCENT); |
| lp.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; |
| mWindowManager.addView(mDismissView, lp); |
| } |
| mDismissView.animate().cancel(); |
| } |
| |
| /** |
| * Shows the dismiss target. |
| */ |
| public void showDismissTarget() { |
| mDismissView.animate() |
| .alpha(1f) |
| .setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN) |
| .setStartDelay(SHOW_TARGET_DELAY) |
| .setDuration(SHOW_TARGET_DURATION) |
| .start(); |
| } |
| |
| /** |
| * Hides and destroys the dismiss target. |
| */ |
| public void destroyDismissTarget() { |
| if (mDismissView != null) { |
| mDismissView.animate() |
| .alpha(0f) |
| .setInterpolator(Interpolators.FAST_OUT_LINEAR_IN) |
| .setStartDelay(0) |
| .setDuration(SHOW_TARGET_DURATION) |
| .withEndAction(new Runnable() { |
| @Override |
| public void run() { |
| mWindowManager.removeView(mDismissView); |
| mDismissView = null; |
| } |
| }) |
| .start(); |
| } |
| } |
| |
| /** |
| * @return the dismiss target screen bounds. |
| */ |
| public Rect getDismissBounds() { |
| return mDismissTargetScreenBounds; |
| } |
| |
| } |