1 /*
2  * Copyright (C) 2010 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 #define LOG_TAG "Configuration"
18 #include <utils/Log.h>
19 
20 #include <androidfw/AssetManager2.h>
21 
22 #include <android_runtime/android_content_res_Configuration.h>
23 #include <android_runtime/android_util_AssetManager.h>
24 
25 using namespace android;
26 
AConfiguration_new()27 AConfiguration* AConfiguration_new() {
28     AConfiguration* config = new AConfiguration;
29     memset(config, 0, sizeof(AConfiguration));
30     return config;
31 }
32 
AConfiguration_delete(AConfiguration * config)33 void AConfiguration_delete(AConfiguration* config) {
34     delete config;
35 }
36 
AConfiguration_fromAssetManager(AConfiguration * out,AAssetManager * am)37 void AConfiguration_fromAssetManager(AConfiguration* out, AAssetManager* am) {
38     ScopedLock<AssetManager2> locked_mgr(*AssetManagerForNdkAssetManager(am));
39     ResTable_config config = locked_mgr->GetConfiguration();
40 
41     // AConfiguration is not a virtual subclass, so we can memcpy.
42     memcpy(out, &config, sizeof(config));
43 }
44 
AConfiguration_copy(AConfiguration * dest,AConfiguration * src)45 void AConfiguration_copy(AConfiguration* dest, AConfiguration* src) {
46     *dest = *src;
47 }
48 
AConfiguration_getMcc(AConfiguration * config)49 int32_t AConfiguration_getMcc(AConfiguration* config) {
50     return config->mcc;
51 }
52 
AConfiguration_getMnc(AConfiguration * config)53 int32_t AConfiguration_getMnc(AConfiguration* config) {
54     return config->mnc;
55 }
56 
AConfiguration_getLanguage(AConfiguration * config,char * outLanguage)57 void AConfiguration_getLanguage(AConfiguration* config, char* outLanguage) {
58     outLanguage[0] = config->language[0];
59     outLanguage[1] = config->language[1];
60 }
61 
AConfiguration_getCountry(AConfiguration * config,char * outCountry)62 void AConfiguration_getCountry(AConfiguration* config, char* outCountry) {
63     outCountry[0] = config->country[0];
64     outCountry[1] = config->country[1];
65 }
66 
AConfiguration_getOrientation(AConfiguration * config)67 int32_t AConfiguration_getOrientation(AConfiguration* config) {
68     return config->orientation;
69 }
70 
AConfiguration_getTouchscreen(AConfiguration * config)71 int32_t AConfiguration_getTouchscreen(AConfiguration* config) {
72     return config->touchscreen;
73 }
74 
AConfiguration_getDensity(AConfiguration * config)75 int32_t AConfiguration_getDensity(AConfiguration* config) {
76     return config->density;
77 }
78 
AConfiguration_getKeyboard(AConfiguration * config)79 int32_t AConfiguration_getKeyboard(AConfiguration* config) {
80     return config->keyboard;
81 }
82 
AConfiguration_getNavigation(AConfiguration * config)83 int32_t AConfiguration_getNavigation(AConfiguration* config) {
84     return config->navigation;
85 }
86 
AConfiguration_getKeysHidden(AConfiguration * config)87 int32_t AConfiguration_getKeysHidden(AConfiguration* config) {
88     return config->inputFlags&ResTable_config::MASK_KEYSHIDDEN;
89 }
90 
AConfiguration_getNavHidden(AConfiguration * config)91 int32_t AConfiguration_getNavHidden(AConfiguration* config) {
92     return (config->inputFlags&ResTable_config::MASK_NAVHIDDEN)
93             >> ResTable_config::SHIFT_NAVHIDDEN;
94 }
95 
AConfiguration_getSdkVersion(AConfiguration * config)96 int32_t AConfiguration_getSdkVersion(AConfiguration* config) {
97     return config->sdkVersion;
98 }
99 
AConfiguration_getScreenSize(AConfiguration * config)100 int32_t AConfiguration_getScreenSize(AConfiguration* config) {
101     return config->screenLayout&ResTable_config::MASK_SCREENSIZE;
102 }
103 
AConfiguration_getScreenLong(AConfiguration * config)104 int32_t AConfiguration_getScreenLong(AConfiguration* config) {
105     return (config->screenLayout&ResTable_config::MASK_SCREENLONG)
106             >> ResTable_config::SHIFT_SCREENLONG;
107 }
108 
AConfiguration_getScreenRound(AConfiguration * config)109 int32_t AConfiguration_getScreenRound(AConfiguration* config) {
110     return (config->screenLayout2&ResTable_config::MASK_SCREENROUND);
111 }
112 
AConfiguration_getUiModeType(AConfiguration * config)113 int32_t AConfiguration_getUiModeType(AConfiguration* config) {
114     return config->uiMode&ResTable_config::MASK_UI_MODE_TYPE;
115 }
116 
AConfiguration_getUiModeNight(AConfiguration * config)117 int32_t AConfiguration_getUiModeNight(AConfiguration* config) {
118     return (config->uiMode&ResTable_config::MASK_UI_MODE_NIGHT)
119             >> ResTable_config::SHIFT_UI_MODE_NIGHT;
120 
121 }
122 
AConfiguration_getScreenWidthDp(AConfiguration * config)123 int32_t AConfiguration_getScreenWidthDp(AConfiguration* config) {
124     return config->screenWidthDp;
125 }
126 
AConfiguration_getScreenHeightDp(AConfiguration * config)127 int32_t AConfiguration_getScreenHeightDp(AConfiguration* config) {
128     return config->screenHeightDp;
129 }
130 
AConfiguration_getSmallestScreenWidthDp(AConfiguration * config)131 int32_t AConfiguration_getSmallestScreenWidthDp(AConfiguration* config) {
132     return config->smallestScreenWidthDp;
133 }
134 
AConfiguration_getLayoutDirection(AConfiguration * config)135 int32_t AConfiguration_getLayoutDirection(AConfiguration* config) {
136     return (config->screenLayout&ResTable_config::MASK_LAYOUTDIR)
137             >> ResTable_config::SHIFT_LAYOUTDIR;
138 }
139 
140 // ----------------------------------------------------------------------
141 
AConfiguration_setMcc(AConfiguration * config,int32_t mcc)142 void AConfiguration_setMcc(AConfiguration* config, int32_t mcc) {
143     config->mcc = mcc;
144 }
145 
AConfiguration_setMnc(AConfiguration * config,int32_t mnc)146 void AConfiguration_setMnc(AConfiguration* config, int32_t mnc) {
147     config->mnc = mnc;
148 }
149 
AConfiguration_setLanguage(AConfiguration * config,const char * language)150 void AConfiguration_setLanguage(AConfiguration* config, const char* language) {
151     config->language[0] = language[0];
152     config->language[1] = language[1];
153 }
154 
AConfiguration_setCountry(AConfiguration * config,const char * country)155 void AConfiguration_setCountry(AConfiguration* config, const char* country) {
156     config->country[0] = country[0];
157     config->country[1] = country[1];
158 }
159 
AConfiguration_setOrientation(AConfiguration * config,int32_t orientation)160 void AConfiguration_setOrientation(AConfiguration* config, int32_t orientation) {
161     config->orientation = orientation;
162 }
163 
AConfiguration_setTouchscreen(AConfiguration * config,int32_t touchscreen)164 void AConfiguration_setTouchscreen(AConfiguration* config, int32_t touchscreen) {
165     config->touchscreen = touchscreen;
166 }
167 
AConfiguration_setDensity(AConfiguration * config,int32_t density)168 void AConfiguration_setDensity(AConfiguration* config, int32_t density) {
169     config->density = density;
170 }
171 
AConfiguration_setKeyboard(AConfiguration * config,int32_t keyboard)172 void AConfiguration_setKeyboard(AConfiguration* config, int32_t keyboard) {
173     config->keyboard = keyboard;
174 }
175 
AConfiguration_setNavigation(AConfiguration * config,int32_t navigation)176 void AConfiguration_setNavigation(AConfiguration* config, int32_t navigation) {
177     config->navigation = navigation;
178 }
179 
AConfiguration_setKeysHidden(AConfiguration * config,int32_t keysHidden)180 void AConfiguration_setKeysHidden(AConfiguration* config, int32_t keysHidden) {
181     config->inputFlags = (config->inputFlags&~ResTable_config::MASK_KEYSHIDDEN)
182             | (keysHidden&ResTable_config::MASK_KEYSHIDDEN);
183 }
184 
AConfiguration_setNavHidden(AConfiguration * config,int32_t navHidden)185 void AConfiguration_setNavHidden(AConfiguration* config, int32_t navHidden) {
186     config->inputFlags = (config->inputFlags&~ResTable_config::MASK_NAVHIDDEN)
187             | ((navHidden<<ResTable_config::SHIFT_NAVHIDDEN)&ResTable_config::MASK_NAVHIDDEN);
188 }
189 
AConfiguration_setSdkVersion(AConfiguration * config,int32_t sdkVersion)190 void AConfiguration_setSdkVersion(AConfiguration* config, int32_t sdkVersion) {
191     config->sdkVersion = sdkVersion;
192 }
193 
AConfiguration_setScreenSize(AConfiguration * config,int32_t screenSize)194 void AConfiguration_setScreenSize(AConfiguration* config, int32_t screenSize) {
195     config->screenLayout = (config->screenLayout&~ResTable_config::MASK_SCREENSIZE)
196             | (screenSize&ResTable_config::MASK_SCREENSIZE);
197 }
198 
AConfiguration_setScreenLong(AConfiguration * config,int32_t screenLong)199 void AConfiguration_setScreenLong(AConfiguration* config, int32_t screenLong) {
200     config->screenLayout = (config->screenLayout&~ResTable_config::MASK_SCREENLONG)
201             | ((screenLong<<ResTable_config::SHIFT_SCREENLONG)&ResTable_config::MASK_SCREENLONG);
202 }
203 
AConfiguration_setScreenRound(AConfiguration * config,int32_t screenRound)204 void AConfiguration_setScreenRound(AConfiguration* config, int32_t screenRound) {
205     config->screenLayout2 = (config->screenLayout2&~ResTable_config::MASK_SCREENROUND)
206             | (screenRound&ResTable_config::MASK_SCREENROUND);
207 }
208 
AConfiguration_setUiModeType(AConfiguration * config,int32_t uiModeType)209 void AConfiguration_setUiModeType(AConfiguration* config, int32_t uiModeType) {
210     config->uiMode = (config->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
211             | (uiModeType&ResTable_config::MASK_UI_MODE_TYPE);
212 }
213 
AConfiguration_setUiModeNight(AConfiguration * config,int32_t uiModeNight)214 void AConfiguration_setUiModeNight(AConfiguration* config, int32_t uiModeNight) {
215     config->uiMode = (config->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
216             | ((uiModeNight<<ResTable_config::SHIFT_UI_MODE_NIGHT)&ResTable_config::MASK_UI_MODE_NIGHT);
217 
218 }
219 
AConfiguration_setScreenWidthDp(AConfiguration * config,int32_t value)220 void AConfiguration_setScreenWidthDp(AConfiguration* config, int32_t value) {
221     config->screenWidthDp = value;
222 }
223 
AConfiguration_setScreenHeightDp(AConfiguration * config,int32_t value)224 void AConfiguration_setScreenHeightDp(AConfiguration* config, int32_t value) {
225     config->screenHeightDp = value;
226 }
227 
AConfiguration_setSmallestScreenWidthDp(AConfiguration * config,int32_t value)228 void AConfiguration_setSmallestScreenWidthDp(AConfiguration* config, int32_t value) {
229     config->smallestScreenWidthDp = value;
230 }
231 
AConfiguration_setLayoutDirection(AConfiguration * config,int32_t value)232 void AConfiguration_setLayoutDirection(AConfiguration* config, int32_t value) {
233     config->screenLayout = (config->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
234             | ((value<<ResTable_config::SHIFT_LAYOUTDIR)&ResTable_config::MASK_LAYOUTDIR);
235 }
236 
237 // ----------------------------------------------------------------------
238 
AConfiguration_diff(AConfiguration * config1,AConfiguration * config2)239 int32_t AConfiguration_diff(AConfiguration* config1, AConfiguration* config2) {
240     return (config1->diff(*config2));
241 }
242 
AConfiguration_match(AConfiguration * base,AConfiguration * requested)243 int32_t AConfiguration_match(AConfiguration* base, AConfiguration* requested) {
244     return base->match(*requested);
245 }
246 
AConfiguration_isBetterThan(AConfiguration * base,AConfiguration * test,AConfiguration * requested)247 int32_t AConfiguration_isBetterThan(AConfiguration* base, AConfiguration* test,
248         AConfiguration* requested) {
249     return base->isBetterThan(*test, requested);
250 }
251