RecentsConfiguration.java revision c0d7058b14c24cd07912f5629c26b39b7b4673d5
1303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung/*
2303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Copyright (C) 2014 The Android Open Source Project
3303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *
4303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Licensed under the Apache License, Version 2.0 (the "License");
5303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * you may not use this file except in compliance with the License.
6303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * You may obtain a copy of the License at
7303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *
8303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *      http://www.apache.org/licenses/LICENSE-2.0
9303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *
10303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Unless required by applicable law or agreed to in writing, software
11303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * distributed under the License is distributed on an "AS IS" BASIS,
12303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * See the License for the specific language governing permissions and
14303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * limitations under the License.
15303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung */
16303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
17303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungpackage com.android.systemui.recents;
18303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
19303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.content.Context;
20c620bafde865f7599401f5adf0521820ee9d4a9cWinson Chungimport android.content.res.Resources;
21303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.graphics.Rect;
22c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson
232f2ca08baa072376b3dfd60506625496aa05903fWinson Chungimport com.android.systemui.R;
2456e09b42a0f1670970872bef611a8036904ad6bfJason Monkimport com.android.systemui.recents.misc.SystemServicesProxy;
25303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
2635f3050959e43bf378f9a0adcaef13729206c7e4Winson/**
2735f3050959e43bf378f9a0adcaef13729206c7e4Winson * Application resources that can be retrieved from the application context and are not specifically
2835f3050959e43bf378f9a0adcaef13729206c7e4Winson * tied to the current activity.
2935f3050959e43bf378f9a0adcaef13729206c7e4Winson */
30303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungpublic class RecentsConfiguration {
3135f3050959e43bf378f9a0adcaef13729206c7e4Winson
3235f3050959e43bf378f9a0adcaef13729206c7e4Winson    private static final int LARGE_SCREEN_MIN_DP = 600;
3335f3050959e43bf378f9a0adcaef13729206c7e4Winson    private static final int XLARGE_SCREEN_MIN_DP = 720;
3435f3050959e43bf378f9a0adcaef13729206c7e4Winson
3535f3050959e43bf378f9a0adcaef13729206c7e4Winson    // Variables that are used for global calculations
3635f3050959e43bf378f9a0adcaef13729206c7e4Winson    private static final float STACK_SIDE_PADDING_PHONES_PCT = 0.03333f;
3735f3050959e43bf378f9a0adcaef13729206c7e4Winson    private static final float STACK_SIZE_PADDING_TABLETS_PCT = 0.075f;
3835f3050959e43bf378f9a0adcaef13729206c7e4Winson    private static final float STACK_SIZE_PADDING_LARGE_TABLETS_PCT = 0.15f;
3935f3050959e43bf378f9a0adcaef13729206c7e4Winson    private static final int SEARCH_BAR_SPACE_HEIGHT_PHONES_DPS = 64;
4035f3050959e43bf378f9a0adcaef13729206c7e4Winson    private static final int SEARCH_BAR_SPACE_HEIGHT_TABLETS_DPS = 72;
41303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
4296d704186621f6310e0e7d39db57caff67baa96cWinson Chung    /** Levels of svelte in increasing severity/austerity. */
4396d704186621f6310e0e7d39db57caff67baa96cWinson Chung    // No svelting.
4496d704186621f6310e0e7d39db57caff67baa96cWinson Chung    public static final int SVELTE_NONE = 0;
4596d704186621f6310e0e7d39db57caff67baa96cWinson Chung    // Limit thumbnail cache to number of visible thumbnails when Recents was loaded, disable
4696d704186621f6310e0e7d39db57caff67baa96cWinson Chung    // caching thumbnails as you scroll.
4796d704186621f6310e0e7d39db57caff67baa96cWinson Chung    public static final int SVELTE_LIMIT_CACHE = 1;
4896d704186621f6310e0e7d39db57caff67baa96cWinson Chung    // Disable the thumbnail cache, load thumbnails asynchronously when the activity loads and
4996d704186621f6310e0e7d39db57caff67baa96cWinson Chung    // evict all thumbnails when hidden.
5096d704186621f6310e0e7d39db57caff67baa96cWinson Chung    public static final int SVELTE_DISABLE_CACHE = 2;
5196d704186621f6310e0e7d39db57caff67baa96cWinson Chung    // Disable all thumbnail loading.
5296d704186621f6310e0e7d39db57caff67baa96cWinson Chung    public static final int SVELTE_DISABLE_LOADING = 3;
5396d704186621f6310e0e7d39db57caff67baa96cWinson Chung
5435f3050959e43bf378f9a0adcaef13729206c7e4Winson    // Launch states
5553ec42cb17693b2d631746e1e5d31021a3359163Winson    public RecentsActivityLaunchState mLaunchState = new RecentsActivityLaunchState();
56918c0723a169cef46b8bf59c06fd3bb8021d0defWinson Chung
5735f3050959e43bf378f9a0adcaef13729206c7e4Winson    // TODO: Values determined by the current context, needs to be refactored into something that is
5835f3050959e43bf378f9a0adcaef13729206c7e4Winson    //       agnostic of the activity context, but still calculable from the Recents component for
5935f3050959e43bf378f9a0adcaef13729206c7e4Winson    //       the transition into recents
6027acf761229779e1777d380616846ac07f484ed6Winson Chung    boolean hasTransposedSearchBar;
6127acf761229779e1777d380616846ac07f484ed6Winson Chung    boolean hasTransposedNavBar;
62d42a6cfe2bf632222617450a1ed340268e82f06cWinson Chung    public float taskStackWidthPaddingPct;
63cd23c849afefe58b213d5abb1c581f15d3ad543aWinson Chung
6435f3050959e43bf378f9a0adcaef13729206c7e4Winson    // Since the positions in Recents has to be calculated globally (before the RecentsActivity
6535f3050959e43bf378f9a0adcaef13729206c7e4Winson    // starts), we need to calculate some resource values ourselves, instead of relying on framework
6635f3050959e43bf378f9a0adcaef13729206c7e4Winson    // resources.
6735f3050959e43bf378f9a0adcaef13729206c7e4Winson    public final boolean isLargeScreen;
6835f3050959e43bf378f9a0adcaef13729206c7e4Winson    public final boolean isXLargeScreen;
6935f3050959e43bf378f9a0adcaef13729206c7e4Winson    public final int smallestWidth;
70b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung
71a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung    /** Misc **/
72e8199c582d826a39e6e47b0d8418834c15242fecSelim Cinek    public boolean useHardwareLayers;
73cb5570316d55c6fe2ff717fa6b94b14d13980263Jorim Jaggi    public boolean fakeShadows;
7435f3050959e43bf378f9a0adcaef13729206c7e4Winson    public int svelteLevel;
7535f3050959e43bf378f9a0adcaef13729206c7e4Winson    public int searchBarSpaceHeightPx;
76a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung
7753ec42cb17693b2d631746e1e5d31021a3359163Winson    public RecentsConfiguration(Context context) {
7835f3050959e43bf378f9a0adcaef13729206c7e4Winson        // Load only resources that can not change after the first load either through developer
7935f3050959e43bf378f9a0adcaef13729206c7e4Winson        // settings or via multi window
8053ec42cb17693b2d631746e1e5d31021a3359163Winson        SystemServicesProxy ssp = Recents.getSystemServices();
8135f3050959e43bf378f9a0adcaef13729206c7e4Winson        Context appContext = context.getApplicationContext();
8235f3050959e43bf378f9a0adcaef13729206c7e4Winson        Resources res = appContext.getResources();
8335f3050959e43bf378f9a0adcaef13729206c7e4Winson        useHardwareLayers = res.getBoolean(R.bool.config_recents_use_hardware_layers);
8435f3050959e43bf378f9a0adcaef13729206c7e4Winson        fakeShadows = res.getBoolean(R.bool.config_recents_fake_shadows);
8535f3050959e43bf378f9a0adcaef13729206c7e4Winson        svelteLevel = res.getInteger(R.integer.recents_svelte_level);
8635f3050959e43bf378f9a0adcaef13729206c7e4Winson
8735f3050959e43bf378f9a0adcaef13729206c7e4Winson        float density = context.getResources().getDisplayMetrics().density;
8835f3050959e43bf378f9a0adcaef13729206c7e4Winson        smallestWidth = ssp.getDeviceSmallestWidth();
8935f3050959e43bf378f9a0adcaef13729206c7e4Winson        isLargeScreen = smallestWidth >= (int) (density * LARGE_SCREEN_MIN_DP);
9035f3050959e43bf378f9a0adcaef13729206c7e4Winson        isXLargeScreen = smallestWidth >= (int) (density * XLARGE_SCREEN_MIN_DP);
9135f3050959e43bf378f9a0adcaef13729206c7e4Winson        searchBarSpaceHeightPx = isLargeScreen ?
9235f3050959e43bf378f9a0adcaef13729206c7e4Winson                (int) (density * SEARCH_BAR_SPACE_HEIGHT_TABLETS_DPS) :
9335f3050959e43bf378f9a0adcaef13729206c7e4Winson                (int) (density * SEARCH_BAR_SPACE_HEIGHT_PHONES_DPS);
9435f3050959e43bf378f9a0adcaef13729206c7e4Winson        if (isLargeScreen) {
9535f3050959e43bf378f9a0adcaef13729206c7e4Winson            taskStackWidthPaddingPct = STACK_SIZE_PADDING_TABLETS_PCT;
9635f3050959e43bf378f9a0adcaef13729206c7e4Winson        } else if (isXLargeScreen) {
9735f3050959e43bf378f9a0adcaef13729206c7e4Winson            taskStackWidthPaddingPct = STACK_SIZE_PADDING_LARGE_TABLETS_PCT;
9835f3050959e43bf378f9a0adcaef13729206c7e4Winson        } else {
9935f3050959e43bf378f9a0adcaef13729206c7e4Winson            taskStackWidthPaddingPct = STACK_SIDE_PADDING_PHONES_PCT;
10035f3050959e43bf378f9a0adcaef13729206c7e4Winson        }
10135f3050959e43bf378f9a0adcaef13729206c7e4Winson    }
10235f3050959e43bf378f9a0adcaef13729206c7e4Winson
10335f3050959e43bf378f9a0adcaef13729206c7e4Winson    /**
10435f3050959e43bf378f9a0adcaef13729206c7e4Winson     * Updates the configuration based on the current state of the system
10535f3050959e43bf378f9a0adcaef13729206c7e4Winson     */
106931c51f54599a227422b2a1c71e922e1458e0291Winson Chung    void update(Rect windowRect) {
10735f3050959e43bf378f9a0adcaef13729206c7e4Winson        // Recompute some values based on the given state, since we can not rely on the resource
10835f3050959e43bf378f9a0adcaef13729206c7e4Winson        // system to get certain values.
10935f3050959e43bf378f9a0adcaef13729206c7e4Winson        boolean isLandscape = windowRect.width() > windowRect.height();
11023746d51d922d3df2cdd2635d0c133366c754438Winson        hasTransposedNavBar = isLandscape && !isXLargeScreen;
11123746d51d922d3df2cdd2635d0c133366c754438Winson        hasTransposedSearchBar = isLandscape && !isXLargeScreen;
11206795630f62e1e7ad89825db23d7656f8dcd6c5aWinson Chung    }
113303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
11435f3050959e43bf378f9a0adcaef13729206c7e4Winson    /**
11535f3050959e43bf378f9a0adcaef13729206c7e4Winson     * Returns the activity launch state.
11635f3050959e43bf378f9a0adcaef13729206c7e4Winson     * TODO: This will be refactored out of RecentsConfiguration.
11735f3050959e43bf378f9a0adcaef13729206c7e4Winson     */
11835f3050959e43bf378f9a0adcaef13729206c7e4Winson    public RecentsActivityLaunchState getLaunchState() {
11935f3050959e43bf378f9a0adcaef13729206c7e4Winson        return mLaunchState;
12056e09b42a0f1670970872bef611a8036904ad6bfJason Monk    }
12156e09b42a0f1670970872bef611a8036904ad6bfJason Monk
122e7f138c7f0a190c86cec10fb32fa106aacae4093Winson    /**
123e7f138c7f0a190c86cec10fb32fa106aacae4093Winson     * Called when the configuration has changed, and we want to reset any configuration specific
124e7f138c7f0a190c86cec10fb32fa106aacae4093Winson     * members.
125e7f138c7f0a190c86cec10fb32fa106aacae4093Winson     */
126b01ed681fe97ff5e98471c120ff9581a78db13c5Winson Chung    public void updateOnConfigurationChange() {
12735f3050959e43bf378f9a0adcaef13729206c7e4Winson        mLaunchState.updateOnConfigurationChange();
128521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung    }
129521e7dc0a6782371a710ee81bf804f7e97aaa292Winson Chung
130f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    /**
131f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung     * Returns the task stack bounds in the current orientation. These bounds do not account for
132f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung     * the system insets.
133f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung     */
13488f00ab1df35928ad0aa0c64f75ecad88d86096cWinson    public void getTaskStackBounds(Rect windowBounds, int topInset,
135af3bb6936786a8c14ac01da3d81d196d17b68b96Winson Chung            int rightInset, Rect searchBarBounds, Rect taskStackBounds) {
13635f3050959e43bf378f9a0adcaef13729206c7e4Winson        if (hasTransposedNavBar) {
13735f3050959e43bf378f9a0adcaef13729206c7e4Winson            // In landscape phones, the search bar appears on the left, but we overlay it on top
138ead5c0fc20e5c60a68cd017af0b8eacaf1167a1cWinson Chung            taskStackBounds.set(windowBounds.left, windowBounds.top + topInset,
139ead5c0fc20e5c60a68cd017af0b8eacaf1167a1cWinson Chung                    windowBounds.right - rightInset, windowBounds.bottom);
140f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        } else {
141dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung            // In portrait, the search bar appears on the top (which already has the inset)
1422364f26dc24191e5bfbab45bc1bdf9babe13af80Winson            int top = searchBarBounds.isEmpty() ? topInset : 0;
1433e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson            taskStackBounds.set(windowBounds.left, windowBounds.top + searchBarBounds.bottom + top,
144ead5c0fc20e5c60a68cd017af0b8eacaf1167a1cWinson Chung                    windowBounds.right - rightInset, windowBounds.bottom);
145f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        }
146f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    }
147f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung
148f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung    /**
149f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung     * Returns the search bar bounds in the current orientation.  These bounds do not account for
150f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung     * the system insets.
151f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung     */
152147ecaf3ba5d72872e8ff324aa32c0d228ada7f5Winson    public void getSearchBarBounds(Rect windowBounds, int topInset, Rect searchBarSpaceBounds) {
153ecd9b3031c9a322bd69380eae2810d53839e8f64Winson Chung        // Return empty rects if search is not enabled
154dcfa7976fa836ae90bb4a579892a18a0abf35b3cWinson Chung        int searchBarSize = searchBarSpaceHeightPx;
15535f3050959e43bf378f9a0adcaef13729206c7e4Winson        if (hasTransposedSearchBar) {
15635f3050959e43bf378f9a0adcaef13729206c7e4Winson            // In landscape phones, the search bar appears on the left
157147ecaf3ba5d72872e8ff324aa32c0d228ada7f5Winson            searchBarSpaceBounds.set(windowBounds.left, windowBounds.top + topInset,
158147ecaf3ba5d72872e8ff324aa32c0d228ada7f5Winson                    windowBounds.left + searchBarSize, windowBounds.bottom);
159f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        } else {
160f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung            // In portrait, the search bar appears on the top
161147ecaf3ba5d72872e8ff324aa32c0d228ada7f5Winson            searchBarSpaceBounds.set(windowBounds.left, windowBounds.top + topInset,
162147ecaf3ba5d72872e8ff324aa32c0d228ada7f5Winson                    windowBounds.right, windowBounds.top + topInset + searchBarSize);
163f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung        }
164ecd9b3031c9a322bd69380eae2810d53839e8f64Winson Chung    }
165303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung}
166