OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.base; | 5 package org.chromium.base; |
6 | 6 |
7 import android.content.Context; | 7 import android.content.Context; |
8 | 8 |
9 import org.chromium.base.annotations.CalledByNative; | |
10 import org.chromium.base.annotations.JNINamespace; | 9 import org.chromium.base.annotations.JNINamespace; |
11 | 10 |
12 /** | 11 /** |
13 * This class provides Android Context utility methods. | 12 * This class provides Android Context utility methods. |
14 */ | 13 */ |
15 @JNINamespace("base::android") | 14 @JNINamespace("base::android") |
16 public class ContextUtils { | 15 public class ContextUtils { |
| 16 private static final String TAG = "ContextUtils"; |
17 private static Context sApplicationContext; | 17 private static Context sApplicationContext; |
18 | 18 |
19 /** | 19 /** |
20 * Get the Android application context. | 20 * Get the Android application context. |
21 * | 21 * |
22 * Under normal circumstances there is only one application context in a pro
cess, so it's safe | 22 * Under normal circumstances there is only one application context in a pro
cess, so it's safe |
23 * to treat this as a global. In WebView it's possible for more than one app
using WebView to be | 23 * to treat this as a global. In WebView it's possible for more than one app
using WebView to be |
24 * running in a single process, but this mechanism is rarely used and this i
s not the only | 24 * running in a single process, but this mechanism is rarely used and this i
s not the only |
25 * problem in that scenario, so we don't currently forbid using it as a glob
al. | 25 * problem in that scenario, so we don't currently forbid using it as a glob
al. |
26 * | 26 * |
27 * Do not downcast the context returned by this method to Application (or an
y subclass). It may | 27 * Do not downcast the context returned by this method to Application (or an
y subclass). It may |
28 * not be an Application object; it may be wrapped in a ContextWrapper. The
only assumption you | 28 * not be an Application object; it may be wrapped in a ContextWrapper. The
only assumption you |
29 * may make is that it is a Context whose lifetime is the same as the lifeti
me of the process. | 29 * may make is that it is a Context whose lifetime is the same as the lifeti
me of the process. |
30 */ | 30 */ |
31 public static Context getApplicationContext() { | 31 public static Context getApplicationContext() { |
32 assert sApplicationContext != null; | |
33 return sApplicationContext; | 32 return sApplicationContext; |
34 } | 33 } |
35 | 34 |
36 /** | 35 /** |
37 * Initialize the Android application context. | 36 * Initializes the java application context. |
38 * | 37 * |
39 * Either this or the native equivalent base::android::InitApplicationContex
t must be called | 38 * This should be called exactly once early on during startup, before native
is loaded and |
40 * once during startup. JNI bindings must have been initialized, as the cont
ext is stored on | 39 * before any other clients make use of the application context through this
class. |
41 * both sides. | 40 * |
| 41 * @param appContext The application context. |
42 */ | 42 */ |
43 public static void initApplicationContext(Context appContext) { | 43 public static void initApplicationContext(Context appContext) { |
44 assert appContext != null; | 44 // Conceding that occasionally in tests, native is loaded before the bro
wser process is |
45 assert sApplicationContext == null || sApplicationContext == appContext; | 45 // started, in which case the browser process re-sets the application co
ntext. |
| 46 if (sApplicationContext != null && sApplicationContext != appContext) { |
| 47 throw new RuntimeException("Attempting to set multiple global applic
ation contexts."); |
| 48 } |
46 initJavaSideApplicationContext(appContext); | 49 initJavaSideApplicationContext(appContext); |
47 nativeInitNativeSideApplicationContext(appContext); | |
48 } | 50 } |
49 | 51 |
50 /** | 52 /** |
51 * JUnit Robolectric tests run without native code; allow them to set just t
he Java-side | 53 * Initialize the native Android application context to be the same as the j
ava counter-part. |
52 * context. Do not use in configurations that actually run on Android! | |
53 */ | 54 */ |
54 public static void initApplicationContextForJUnitTests(Context appContext) { | 55 public static void initApplicationContextForNative() { |
| 56 if (sApplicationContext == null) { |
| 57 throw new RuntimeException("Cannot have native global application co
ntext be null."); |
| 58 } |
| 59 nativeInitNativeSideApplicationContext(sApplicationContext); |
| 60 } |
| 61 |
| 62 /** |
| 63 * Occasionally tests cannot ensure the application context doesn't change b
etween tests (junit) |
| 64 * and sometimes specific tests has its own special needs, initApplicationCo
ntext should be used |
| 65 * as much as possible, but this method can be used to override it. |
| 66 * |
| 67 * @param appContext The new application context. |
| 68 */ |
| 69 @VisibleForTesting |
| 70 public static void initApplicationContextForTests(Context appContext) { |
55 initJavaSideApplicationContext(appContext); | 71 initJavaSideApplicationContext(appContext); |
56 } | 72 } |
57 | 73 |
58 @CalledByNative | |
59 private static void initJavaSideApplicationContext(Context appContext) { | 74 private static void initJavaSideApplicationContext(Context appContext) { |
| 75 if (appContext == null) { |
| 76 throw new RuntimeException("Global application context cannot be set
to null."); |
| 77 } |
60 sApplicationContext = appContext; | 78 sApplicationContext = appContext; |
61 } | 79 } |
62 | 80 |
63 private static native void nativeInitNativeSideApplicationContext(Context ap
pContext); | 81 private static native void nativeInitNativeSideApplicationContext(Context ap
pContext); |
64 } | 82 } |
OLD | NEW |