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