/* * Copyright (C) 2011 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.launcher3; import android.content.Context; import android.content.res.Resources; import android.graphics.Color; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; public class AppsCustomizeLayout extends FrameLayout implements LauncherTransitionable, Insettable { private AppsCustomizePagedView mAppsCustomizePane; private FrameLayout mContent; private boolean mInTransition; private boolean mTransitioningToWorkspace; private boolean mResetAfterTransition; private final Rect mInsets = new Rect(); public AppsCustomizeLayout(Context context, AttributeSet attrs) { super(context, attrs); int bgAlpha = (int) (255 * (getResources().getInteger( R.integer.config_appsCustomizeSpringLoadedBgAlpha) / 100f)); setBackgroundColor(Color.argb(bgAlpha, 0, 0, 0)); } @Override public void setInsets(Rect insets) { mInsets.set(insets); FrameLayout.LayoutParams flp = (LayoutParams) mContent.getLayoutParams(); flp.topMargin = insets.top; flp.bottomMargin = insets.bottom; flp.leftMargin = insets.left; flp.rightMargin = insets.right; mContent.setLayoutParams(flp); } /** * Setup the tab host and create all necessary tabs. */ @Override protected void onFinishInflate() { final AppsCustomizePagedView appsCustomizePane = (AppsCustomizePagedView) findViewById(R.id.apps_customize_pane_content); mAppsCustomizePane = appsCustomizePane; mContent = (FrameLayout) findViewById(R.id.apps_customize_content); if (mAppsCustomizePane == null) throw new Resources.NotFoundException(); /*findViewById(R.id.page_indicator).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mAppsCustomizePane.enterOverviewMode(); } });*/ } public boolean onInterceptTouchEvent(MotionEvent ev) { // If we are mid transitioning to the workspace, then intercept touch events here so we // can ignore them, otherwise we just let all apps handle the touch events. if (mInTransition && mTransitioningToWorkspace) { return true; } return super.onInterceptTouchEvent(ev); }; @Override public boolean onTouchEvent(MotionEvent event) { // Allow touch events to fall through to the workspace if we are transitioning there if (mInTransition && mTransitioningToWorkspace) { return super.onTouchEvent(event); } // Intercept all touch events up to the bottom of the AppsCustomizePane so they do not fall // through to the workspace and trigger showWorkspace() if (event.getY() < mAppsCustomizePane.getBottom()) { return true; } return super.onTouchEvent(event); } /** * Disable focus on anything under this view in the hierarchy if we are not visible. */ @Override public int getDescendantFocusability() { if (getVisibility() != View.VISIBLE) { return ViewGroup.FOCUS_BLOCK_DESCENDANTS; } return super.getDescendantFocusability(); } void reset() { if (mInTransition) { // Defer to after the transition to reset mResetAfterTransition = true; } else { // Reset immediately mAppsCustomizePane.reset(); } } private void enableAndBuildHardwareLayer() { // isHardwareAccelerated() checks if we're attached to a window and if that // window is HW accelerated-- we were sometimes not attached to a window // and buildLayer was throwing an IllegalStateException if (isHardwareAccelerated()) { // Turn on hardware layers for performance setLayerType(LAYER_TYPE_HARDWARE, null); // force building the layer, so you don't get a blip early in an animation // when the layer is created layer buildLayer(); } } @Override public View getContent() { View appsCustomizeContent = mAppsCustomizePane.getContent(); if (appsCustomizeContent != null) { return appsCustomizeContent; } return mContent; } /* LauncherTransitionable overrides */ @Override public void onLauncherTransitionPrepare(Launcher l, boolean animated, boolean toWorkspace) { mAppsCustomizePane.onLauncherTransitionPrepare(l, animated, toWorkspace); mInTransition = true; mTransitioningToWorkspace = toWorkspace; if (toWorkspace) { // Going from All Apps -> Workspace setVisibilityOfSiblingsWithLowerZOrder(VISIBLE); } else { // Going from Workspace -> All Apps mContent.setVisibility(VISIBLE); // Make sure the current page is loaded (we start loading the side pages after the // transition to prevent slowing down the animation) mAppsCustomizePane.loadAssociatedPages(mAppsCustomizePane.getCurrentPage(), true); } if (mResetAfterTransition) { mAppsCustomizePane.reset(); mResetAfterTransition = false; } } @Override public void onLauncherTransitionStart(Launcher l, boolean animated, boolean toWorkspace) { if (animated) { enableAndBuildHardwareLayer(); } // Dismiss the workspace cling l.getLauncherClings().dismissWorkspaceCling(null); } @Override public void onLauncherTransitionStep(Launcher l, float t) { mAppsCustomizePane.onLauncherTransitionStep(l, t); } @Override public void onLauncherTransitionEnd(Launcher l, boolean animated, boolean toWorkspace) { mAppsCustomizePane.onLauncherTransitionEnd(l, animated, toWorkspace); mInTransition = false; if (animated) { setLayerType(LAYER_TYPE_NONE, null); } if (!toWorkspace) { // Show the all apps cling (if not already shown) mAppsCustomizePane.showAllAppsCling(); // Make sure adjacent pages are loaded (we wait until after the transition to // prevent slowing down the animation) mAppsCustomizePane.loadAssociatedPages(mAppsCustomizePane.getCurrentPage()); // Going from Workspace -> All Apps // NOTE: We should do this at the end since we check visibility state in some of the // cling initialization/dismiss code above. setVisibilityOfSiblingsWithLowerZOrder(INVISIBLE); } } private void setVisibilityOfSiblingsWithLowerZOrder(int visibility) { ViewGroup parent = (ViewGroup) getParent(); if (parent == null) return; View overviewPanel = ((Launcher) getContext()).getOverviewPanel(); final int count = parent.getChildCount(); if (!isChildrenDrawingOrderEnabled()) { for (int i = 0; i < count; i++) { final View child = parent.getChildAt(i); if (child == this) { break; } else { if (child.getVisibility() == GONE || child == overviewPanel) { continue; } child.setVisibility(visibility); } } } else { throw new RuntimeException("Failed; can't get z-order of views"); } } public void onWindowVisible() { if (getVisibility() == VISIBLE) { mContent.setVisibility(VISIBLE); // We unload the widget previews when the UI is hidden, so need to reload pages // Load the current page synchronously, and the neighboring pages asynchronously mAppsCustomizePane.loadAssociatedPages(mAppsCustomizePane.getCurrentPage(), true); mAppsCustomizePane.loadAssociatedPages(mAppsCustomizePane.getCurrentPage()); } } public void onTrimMemory() { mContent.setVisibility(GONE); // Clear the widget pages of all their subviews - this will trigger the widget previews // to delete their bitmaps mAppsCustomizePane.clearAllWidgetPages(); } boolean isTransitioning() { return mInTransition; } }