Home | History | Annotate | Download | only in base
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 package org.chromium.base;
      6 
      7 import android.content.Context;
      8 
      9 import java.util.Map;
     10 import java.util.concurrent.ConcurrentHashMap;
     11 
     12 /**
     13  * Maintains the {@link Context}-to-"context type" mapping. The context type
     14  * {@code MODE_APP} is chosen for the application context associated with
     15  * the activity running in application mode, while {@code MODE_NORMAL} for main
     16  * Chromium activity.
     17  *
     18  * <p>Used as singleton instance.
     19  */
     20 public class ContextTypes {
     21 
     22     // Available context types.
     23     public static final int CONTEXT_TYPE_NORMAL = 1;
     24     public static final int CONTEXT_TYPE_WEBAPP = 2;
     25 
     26     private final Map<Context, Integer> mContextMap;
     27 
     28     private ContextTypes() {
     29         mContextMap = new ConcurrentHashMap<Context, Integer>();
     30     }
     31 
     32     private static class ContextTypesHolder {
     33         private static final ContextTypes INSTANCE = new ContextTypes();
     34     }
     35 
     36     public static ContextTypes getInstance() {
     37         return ContextTypesHolder.INSTANCE;
     38     }
     39 
     40     /**
     41      * Adds the mapping for the given {@link Context}.
     42      *
     43      * @param context {@link Context} in interest
     44      * @param type the type associated with the context
     45      * @throws IllegalArgumentException if type is not a valid one.
     46      */
     47     public void put(Context context, int type) throws IllegalArgumentException {
     48         if (type != CONTEXT_TYPE_NORMAL && type != CONTEXT_TYPE_WEBAPP) {
     49             throw new IllegalArgumentException("Wrong context type");
     50         }
     51         mContextMap.put(context, type);
     52     }
     53 
     54     /**
     55      * Removes the mapping for the given context.
     56      *
     57      * @param context {@link Context} in interest
     58      */
     59     public void remove(Context context) {
     60         mContextMap.remove(context);
     61     }
     62 
     63     /**
     64      * Returns type of the given context.
     65      *
     66      * @param context {@link Context} in interest
     67      * @return type associated with the context. Returns {@code MODE_NORMAL} by
     68      *     default if the mapping for the queried context is not present.
     69      */
     70     public int getType(Context context) {
     71         Integer contextType = mContextMap.get(context);
     72         return contextType == null ? CONTEXT_TYPE_NORMAL : contextType;
     73     }
     74 
     75     /**
     76      * Returns whether activity is running in web app mode.
     77      *
     78      * @param appContext {@link Context} in interest
     79      * @return {@code true} when activity is running in web app mode.
     80      */
     81     @CalledByNative
     82     public static boolean isRunningInWebapp(Context appContext) {
     83         return ContextTypes.getInstance().getType(appContext)
     84                 == CONTEXT_TYPE_WEBAPP;
     85     }
     86 
     87     /**
     88      * Checks if the mapping exists for the given context.
     89      *
     90      * @param context {@link Context} in interest
     91      * @return {@code true} if the mapping exists; otherwise {@code false}
     92      */
     93     public boolean contains(Context context) {
     94         return mContextMap.containsKey(context);
     95     }
     96 }
     97