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
1943db6d26d8cfc7004c0f71f7e8f8de59081f6ccdMatthew Ngimport android.app.ActivityManager;
20303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.content.Context;
21b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ngimport android.content.res.Configuration;
22c620bafde865f7599401f5adf0521820ee9d4a9cWinson Chungimport android.content.res.Resources;
23c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson
24e4e41ba4a65ea792f8bf1fb1c46e0ce41a2b7e4aJiaquan Heimport android.os.SystemProperties;
2543db6d26d8cfc7004c0f71f7e8f8de59081f6ccdMatthew Ng
262f2ca08baa072376b3dfd60506625496aa05903fWinson Chungimport com.android.systemui.R;
2756e09b42a0f1670970872bef611a8036904ad6bfJason Monkimport com.android.systemui.recents.misc.SystemServicesProxy;
286519c1b0fe85c5f25115539e936e4333e8537098Winson Chungimport com.android.systemui.recents.views.DockState;
296519c1b0fe85c5f25115539e936e4333e8537098Winson Chungimport com.android.systemui.shared.recents.model.TaskStack;
30b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng
31b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng/**
32b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng * Represents the dock regions for each orientation.
33b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng */
34b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ngclass DockRegion {
356519c1b0fe85c5f25115539e936e4333e8537098Winson Chung    public static DockState[] PHONE_LANDSCAPE = {
36b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng            // We only allow docking to the left in landscape for now on small devices
376519c1b0fe85c5f25115539e936e4333e8537098Winson Chung            DockState.LEFT
38b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng    };
396519c1b0fe85c5f25115539e936e4333e8537098Winson Chung    public static DockState[] PHONE_PORTRAIT = {
40b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng            // We only allow docking to the top for now on small devices
416519c1b0fe85c5f25115539e936e4333e8537098Winson Chung            DockState.TOP
42b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng    };
436519c1b0fe85c5f25115539e936e4333e8537098Winson Chung    public static DockState[] TABLET_LANDSCAPE = {
446519c1b0fe85c5f25115539e936e4333e8537098Winson Chung            DockState.LEFT,
456519c1b0fe85c5f25115539e936e4333e8537098Winson Chung            DockState.RIGHT
46b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng    };
476519c1b0fe85c5f25115539e936e4333e8537098Winson Chung    public static DockState[] TABLET_PORTRAIT = PHONE_PORTRAIT;
48b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng}
49303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
5035f3050959e43bf378f9a0adcaef13729206c7e4Winson/**
5135f3050959e43bf378f9a0adcaef13729206c7e4Winson * Application resources that can be retrieved from the application context and are not specifically
5235f3050959e43bf378f9a0adcaef13729206c7e4Winson * tied to the current activity.
5335f3050959e43bf378f9a0adcaef13729206c7e4Winson */
54303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungpublic class RecentsConfiguration {
5535f3050959e43bf378f9a0adcaef13729206c7e4Winson
5635f3050959e43bf378f9a0adcaef13729206c7e4Winson    private static final int LARGE_SCREEN_MIN_DP = 600;
5735f3050959e43bf378f9a0adcaef13729206c7e4Winson    private static final int XLARGE_SCREEN_MIN_DP = 720;
5835f3050959e43bf378f9a0adcaef13729206c7e4Winson
5935f3050959e43bf378f9a0adcaef13729206c7e4Winson    // Launch states
6053ec42cb17693b2d631746e1e5d31021a3359163Winson    public RecentsActivityLaunchState mLaunchState = new RecentsActivityLaunchState();
61918c0723a169cef46b8bf59c06fd3bb8021d0defWinson Chung
6235f3050959e43bf378f9a0adcaef13729206c7e4Winson    // Since the positions in Recents has to be calculated globally (before the RecentsActivity
6335f3050959e43bf378f9a0adcaef13729206c7e4Winson    // starts), we need to calculate some resource values ourselves, instead of relying on framework
6435f3050959e43bf378f9a0adcaef13729206c7e4Winson    // resources.
6535f3050959e43bf378f9a0adcaef13729206c7e4Winson    public final boolean isLargeScreen;
6635f3050959e43bf378f9a0adcaef13729206c7e4Winson    public final boolean isXLargeScreen;
6735f3050959e43bf378f9a0adcaef13729206c7e4Winson    public final int smallestWidth;
68b44c24fb50845dfbc1f49e78085cf5e01a32067fWinson Chung
69a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung    /** Misc **/
70cb5570316d55c6fe2ff717fa6b94b14d13980263Jorim Jaggi    public boolean fakeShadows;
7135f3050959e43bf378f9a0adcaef13729206c7e4Winson    public int svelteLevel;
72a0e88b5013d708ac6ed6518817d83c64c87ae4b1Winson Chung
73e4e41ba4a65ea792f8bf1fb1c46e0ce41a2b7e4aJiaquan He    // Whether this product supports Grid-based Recents. If this is field is set to true, then
74e4e41ba4a65ea792f8bf1fb1c46e0ce41a2b7e4aJiaquan He    // Recents will layout task views in a grid mode when there's enough space in the screen.
75e4e41ba4a65ea792f8bf1fb1c46e0ce41a2b7e4aJiaquan He    public boolean isGridEnabled;
76e4e41ba4a65ea792f8bf1fb1c46e0ce41a2b7e4aJiaquan He
7743db6d26d8cfc7004c0f71f7e8f8de59081f6ccdMatthew Ng    // Support for Android Recents for low ram devices. If this field is set to true, then Recents
7843db6d26d8cfc7004c0f71f7e8f8de59081f6ccdMatthew Ng    // will use the alternative layout.
7943db6d26d8cfc7004c0f71f7e8f8de59081f6ccdMatthew Ng    public boolean isLowRamDevice;
8043db6d26d8cfc7004c0f71f7e8f8de59081f6ccdMatthew Ng
8143db6d26d8cfc7004c0f71f7e8f8de59081f6ccdMatthew Ng    // Enable drag and drop split from Recents. Disabled for low ram devices.
8243db6d26d8cfc7004c0f71f7e8f8de59081f6ccdMatthew Ng    public boolean dragToSplitEnabled;
8343db6d26d8cfc7004c0f71f7e8f8de59081f6ccdMatthew Ng
84b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng    private final Context mAppContext;
85b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng
8653ec42cb17693b2d631746e1e5d31021a3359163Winson    public RecentsConfiguration(Context context) {
8735f3050959e43bf378f9a0adcaef13729206c7e4Winson        // Load only resources that can not change after the first load either through developer
8835f3050959e43bf378f9a0adcaef13729206c7e4Winson        // settings or via multi window
8953ec42cb17693b2d631746e1e5d31021a3359163Winson        SystemServicesProxy ssp = Recents.getSystemServices();
90b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng        mAppContext = context.getApplicationContext();
91b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng        Resources res = mAppContext.getResources();
9235f3050959e43bf378f9a0adcaef13729206c7e4Winson        fakeShadows = res.getBoolean(R.bool.config_recents_fake_shadows);
9335f3050959e43bf378f9a0adcaef13729206c7e4Winson        svelteLevel = res.getInteger(R.integer.recents_svelte_level);
94e4e41ba4a65ea792f8bf1fb1c46e0ce41a2b7e4aJiaquan He        isGridEnabled = SystemProperties.getBoolean("ro.recents.grid", false);
9543db6d26d8cfc7004c0f71f7e8f8de59081f6ccdMatthew Ng        isLowRamDevice = ActivityManager.isLowRamDeviceStatic();
9643db6d26d8cfc7004c0f71f7e8f8de59081f6ccdMatthew Ng        dragToSplitEnabled = !isLowRamDevice;
9735f3050959e43bf378f9a0adcaef13729206c7e4Winson
9859924fe0d9136cf349759bea1e06b661603f95feWinson        float screenDensity = context.getResources().getDisplayMetrics().density;
9935f3050959e43bf378f9a0adcaef13729206c7e4Winson        smallestWidth = ssp.getDeviceSmallestWidth();
10059924fe0d9136cf349759bea1e06b661603f95feWinson        isLargeScreen = smallestWidth >= (int) (screenDensity * LARGE_SCREEN_MIN_DP);
10159924fe0d9136cf349759bea1e06b661603f95feWinson        isXLargeScreen = smallestWidth >= (int) (screenDensity * XLARGE_SCREEN_MIN_DP);
10235f3050959e43bf378f9a0adcaef13729206c7e4Winson    }
10335f3050959e43bf378f9a0adcaef13729206c7e4Winson
10435f3050959e43bf378f9a0adcaef13729206c7e4Winson    /**
10535f3050959e43bf378f9a0adcaef13729206c7e4Winson     * Returns the activity launch state.
10635f3050959e43bf378f9a0adcaef13729206c7e4Winson     * TODO: This will be refactored out of RecentsConfiguration.
10735f3050959e43bf378f9a0adcaef13729206c7e4Winson     */
10835f3050959e43bf378f9a0adcaef13729206c7e4Winson    public RecentsActivityLaunchState getLaunchState() {
10935f3050959e43bf378f9a0adcaef13729206c7e4Winson        return mLaunchState;
11056e09b42a0f1670970872bef611a8036904ad6bfJason Monk    }
111b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng
112b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng    /**
113b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng     * Returns the preferred dock states for the current orientation.
114b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng     * @return a list of dock states for device and its orientation
115b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng     */
1166519c1b0fe85c5f25115539e936e4333e8537098Winson Chung    public DockState[] getDockStatesForCurrentOrientation() {
117b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng        boolean isLandscape = mAppContext.getResources().getConfiguration().orientation ==
118b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng                Configuration.ORIENTATION_LANDSCAPE;
119b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng        RecentsConfiguration config = Recents.getConfiguration();
120b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng        if (config.isLargeScreen) {
121b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng            return isLandscape ? DockRegion.TABLET_LANDSCAPE : DockRegion.TABLET_PORTRAIT;
122b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng        } else {
123b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng            return isLandscape ? DockRegion.PHONE_LANDSCAPE : DockRegion.PHONE_PORTRAIT;
124b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng        }
125b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng    }
126b7035f3a4738efdf40dc0ad06f19303ffcd784f7Matthew Ng
127303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung}
128