Home | History | Annotate | Download | only in recents
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.systemui.recents;
     18 
     19 import android.content.Context;
     20 import android.content.res.Configuration;
     21 import android.content.res.Resources;
     22 import android.graphics.Rect;
     23 
     24 import android.os.SystemProperties;
     25 import com.android.systemui.R;
     26 import com.android.systemui.recents.misc.SystemServicesProxy;
     27 import com.android.systemui.recents.model.TaskStack;
     28 
     29 /**
     30  * Represents the dock regions for each orientation.
     31  */
     32 class DockRegion {
     33     public static TaskStack.DockState[] PHONE_LANDSCAPE = {
     34             // We only allow docking to the left in landscape for now on small devices
     35             TaskStack.DockState.LEFT
     36     };
     37     public static TaskStack.DockState[] PHONE_PORTRAIT = {
     38             // We only allow docking to the top for now on small devices
     39             TaskStack.DockState.TOP
     40     };
     41     public static TaskStack.DockState[] TABLET_LANDSCAPE = {
     42             TaskStack.DockState.LEFT,
     43             TaskStack.DockState.RIGHT
     44     };
     45     public static TaskStack.DockState[] TABLET_PORTRAIT = PHONE_PORTRAIT;
     46 }
     47 
     48 /**
     49  * Application resources that can be retrieved from the application context and are not specifically
     50  * tied to the current activity.
     51  */
     52 public class RecentsConfiguration {
     53 
     54     private static final int LARGE_SCREEN_MIN_DP = 600;
     55     private static final int XLARGE_SCREEN_MIN_DP = 720;
     56 
     57     /** Levels of svelte in increasing severity/austerity. */
     58     // No svelting.
     59     public static final int SVELTE_NONE = 0;
     60     // Limit thumbnail cache to number of visible thumbnails when Recents was loaded, disable
     61     // caching thumbnails as you scroll.
     62     public static final int SVELTE_LIMIT_CACHE = 1;
     63     // Disable the thumbnail cache, load thumbnails asynchronously when the activity loads and
     64     // evict all thumbnails when hidden.
     65     public static final int SVELTE_DISABLE_CACHE = 2;
     66     // Disable all thumbnail loading.
     67     public static final int SVELTE_DISABLE_LOADING = 3;
     68 
     69     // Launch states
     70     public RecentsActivityLaunchState mLaunchState = new RecentsActivityLaunchState();
     71 
     72     // Since the positions in Recents has to be calculated globally (before the RecentsActivity
     73     // starts), we need to calculate some resource values ourselves, instead of relying on framework
     74     // resources.
     75     public final boolean isLargeScreen;
     76     public final boolean isXLargeScreen;
     77     public final int smallestWidth;
     78 
     79     /** Misc **/
     80     public boolean fakeShadows;
     81     public int svelteLevel;
     82 
     83     // Whether this product supports Grid-based Recents. If this is field is set to true, then
     84     // Recents will layout task views in a grid mode when there's enough space in the screen.
     85     public boolean isGridEnabled;
     86 
     87     private final Context mAppContext;
     88 
     89     public RecentsConfiguration(Context context) {
     90         // Load only resources that can not change after the first load either through developer
     91         // settings or via multi window
     92         SystemServicesProxy ssp = Recents.getSystemServices();
     93         mAppContext = context.getApplicationContext();
     94         Resources res = mAppContext.getResources();
     95         fakeShadows = res.getBoolean(R.bool.config_recents_fake_shadows);
     96         svelteLevel = res.getInteger(R.integer.recents_svelte_level);
     97         isGridEnabled = SystemProperties.getBoolean("ro.recents.grid", false);
     98 
     99         float screenDensity = context.getResources().getDisplayMetrics().density;
    100         smallestWidth = ssp.getDeviceSmallestWidth();
    101         isLargeScreen = smallestWidth >= (int) (screenDensity * LARGE_SCREEN_MIN_DP);
    102         isXLargeScreen = smallestWidth >= (int) (screenDensity * XLARGE_SCREEN_MIN_DP);
    103     }
    104 
    105     /**
    106      * Returns the activity launch state.
    107      * TODO: This will be refactored out of RecentsConfiguration.
    108      */
    109     public RecentsActivityLaunchState getLaunchState() {
    110         return mLaunchState;
    111     }
    112 
    113     /**
    114      * Returns the preferred dock states for the current orientation.
    115      * @return a list of dock states for device and its orientation
    116      */
    117     public TaskStack.DockState[] getDockStatesForCurrentOrientation() {
    118         boolean isLandscape = mAppContext.getResources().getConfiguration().orientation ==
    119                 Configuration.ORIENTATION_LANDSCAPE;
    120         RecentsConfiguration config = Recents.getConfiguration();
    121         if (config.isLargeScreen) {
    122             return isLandscape ? DockRegion.TABLET_LANDSCAPE : DockRegion.TABLET_PORTRAIT;
    123         } else {
    124             return isLandscape ? DockRegion.PHONE_LANDSCAPE : DockRegion.PHONE_PORTRAIT;
    125         }
    126     }
    127 
    128 }
    129