Skip to content

Commit 23aa259

Browse files
BiliBoomBoWangyang Dailalitb
authored
Add device class field for Android (#951)
* add device class for Android * Fix CI build fail and add test for device_class * Fix test build fail * Resolve comments Co-authored-by: Wangyang Dai <[email protected]> Co-authored-by: Lalit Kumar Bhasin <[email protected]>
1 parent 7453cbf commit 23aa259

File tree

3 files changed

+62
-6
lines changed

3 files changed

+62
-6
lines changed

lib/android_build/maesdk/src/main/java/com/microsoft/applications/events/HttpClient.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import android.content.IntentFilter;
1616
import android.content.pm.PackageInfo;
1717
import android.content.pm.PackageManager;
18+
import android.content.res.Configuration;
1819
import android.net.ConnectivityManager;
1920
import android.net.Network;
2021
import android.net.NetworkCapabilities;
@@ -184,6 +185,8 @@ public void run() {
184185

185186
public class HttpClient {
186187
private static final int MAX_HTTP_THREADS = 2; // Collector wants no more than 2 at a time
188+
private static final String ANDROID_DEVICE_CLASS_PC = "Android.PC";
189+
private static final String ANDROID_DEVICE_CLASS_PHONE = "Android.Phone";
187190

188191
/** Shim FutureTask: we would like to @Keep the cancel method for JNI */
189192
static class FutureShim extends FutureTask<Boolean> {
@@ -270,9 +273,11 @@ private void calculateAndSetSystemInfo(android.content.Context context) {
270273
if (pInfo != null && pInfo.versionName != null) {
271274
app_version = pInfo.versionName;
272275
}
273-
String app_language = getLanguageTag(context.getResources().getConfiguration().locale);
276+
final String app_language = getLanguageTag(context.getResources().getConfiguration().locale);
274277

275-
String time_zone = getTimeZone();
278+
final String time_zone = getTimeZone();
279+
280+
final String device_class = getDeviceClass(context);
276281

277282
String os_major_version = Build.VERSION.RELEASE;
278283
if (os_major_version == null) {
@@ -285,7 +290,8 @@ private void calculateAndSetSystemInfo(android.content.Context context) {
285290
app_language,
286291
os_major_version,
287292
os_full_version,
288-
time_zone);
293+
time_zone,
294+
device_class);
289295
}
290296

291297
private String calculateID(android.content.Context context) {
@@ -306,6 +312,14 @@ private String calculateID(android.content.Context context) {
306312
}
307313
}
308314

315+
private String getDeviceClass(android.content.Context context) {
316+
if (context.getResources().getConfiguration().isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE)) {
317+
return ANDROID_DEVICE_CLASS_PC;
318+
} else {
319+
return ANDROID_DEVICE_CLASS_PHONE;
320+
}
321+
}
322+
309323
protected ExecutorService createExecutor() {
310324
return Executors.newFixedThreadPool(MAX_HTTP_THREADS);
311325
}
@@ -348,7 +362,8 @@ public native void setSystemInfo(
348362
String app_language,
349363
String os_major_version,
350364
String os_full_version,
351-
String time_zone);
365+
String time_zone,
366+
String deviceClass);
352367

353368
public native void dispatchCallback(String id, int response, Object[] headers, byte[] body);
354369

lib/android_build/maesdk/src/test/java/com/microsoft/applications/events/EventsUnitTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,8 @@ public void setSystemInfo(
180180
String app_language,
181181
String os_major_version,
182182
String os_full_version,
183-
String time_zone
183+
String time_zone,
184+
String device_class
184185
)
185186
{
186187
assertEquals("A:com.microsoft.nemotronics.doodad", app_id);
@@ -189,6 +190,7 @@ public void setSystemInfo(
189190
assertEquals("GECOS III", os_major_version);
190191
assertEquals("GECOS III null", os_full_version);
191192
assertTrue(Pattern.matches("^([-+])\\d\\d:\\d\\d", time_zone));
193+
assertEquals("Android.PC", device_class);
192194
}
193195
}
194196

@@ -212,6 +214,7 @@ public void connectMocks() throws PackageManager.NameNotFoundException {
212214
when(mockContext.getResources()).thenReturn(mockResources);
213215
mockConfiguration.locale = new Locale("foobar");
214216
when(mockResources.getConfiguration()).thenReturn(mockConfiguration);
217+
when(mockConfiguration.isLayoutSizeAtLeast(anyInt())).thenReturn(true);
215218
assertEquals(mockPackageManager, mockContext.getPackageManager());
216219
assertEquals(mockPackageInfo, mockPackageManager.getPackageInfo("foobar", 0));
217220
assertEquals("FunTimes.3", mockPackageInfo.versionName);

lib/pal/posix/SystemInformationImpl_Android.cpp

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ namespace PAL_NS_BEGIN {
2323

2424
static std::string s_time_zone;
2525

26+
static std::string s_device_class;
27+
2628
static void setValue(JNIEnv *env, std::string & s, jstring js)
2729
{
2830
const char *start = env->GetStringUTFChars(js, nullptr);
@@ -45,13 +47,16 @@ namespace PAL_NS_BEGIN {
4547
jclass localeClass = pEnv->FindClass("java/util/Locale");
4648
jclass packageInfoClass = pEnv->FindClass("android/content/pm/PackageInfo");
4749
jclass packageManagerClass = pEnv->FindClass("android/content/pm/PackageManager");
50+
jclass resourcesClass = pEnv->FindClass("android/content/res/Resources");
51+
jclass configurationClass = pEnv->FindClass("android/content/res/Configuration");
4852

4953
jfieldID sdkIntFid = pEnv->GetStaticFieldID(buildVersionClass, "SDK_INT", "I");
5054
int SDK_INT = pEnv->GetStaticIntField(buildVersionClass, sdkIntFid);
5155

5256
jfieldID versionNameFid = pEnv->GetFieldID(packageInfoClass, "versionName", "Ljava/lang/String;");
5357
jfieldID releaseFid = pEnv->GetStaticFieldID(buildVersionClass, "RELEASE", "Ljava/lang/String;");
5458
jfieldID incrementalFid = pEnv->GetStaticFieldID(buildVersionClass, "INCREMENTAL", "Ljava/lang/String;");
59+
jfieldID screenLayoutSizeLargeFid = pEnv->GetStaticFieldID(configurationClass, "SCREENLAYOUT_SIZE_LARGE", "I");
5560

5661
// public String getPackageName ()
5762
jmethodID getPackageNameMid = pEnv->GetMethodID(contextClass, "getPackageName", "()Ljava/lang/String;");
@@ -68,6 +73,29 @@ namespace PAL_NS_BEGIN {
6873

6974
// public static Locale getDefault ()
7075
jmethodID getDefaultLocaleMid = pEnv->GetStaticMethodID(localeClass, "getDefault", "()Ljava/util/Locale;");
76+
77+
// public abstract Resources getResources ()
78+
jmethodID getResourceMid = pEnv->GetMethodID(contextClass, "getResources", "()Landroid/content/res/Resources");
79+
80+
// public abstract Configuration getConfiguration ()
81+
jmethodID getConfigurationMid = pEnv->GetMethodID(resourcesClass, "getConfiguration", "()Landroid/content/res/Configuration");
82+
83+
// public abstract boolean isLayoutSizeAtLeast (int layoutSize)
84+
jmethodID isLayoutSizeAtLeastMid = pEnv->GetMethodID(configurationClass, "isLayoutSizeAtLeast", "(I)Z");
85+
86+
jint screenLayoutSizeLargeJint = reinterpret_cast<jint>(pEnv->GetStaticIntField(configurationClass, screenLayoutSizeLargeFid));
87+
88+
// call context.getResources().getConfiguration().isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE)
89+
jobject resources = pEnv->CallObjectMethod(activity, getResourceMid);
90+
jobject configuration = pEnv->CallObjectMethod(resources, getConfigurationMid);
91+
jboolean isTablet = reinterpret_cast<jboolean>(pEnv->CallBooleanMethod(configuration, isLayoutSizeAtLeastMid, screenLayoutSizeLargeJint));
92+
93+
std::string device_class;
94+
if (isTablet) {
95+
device_class = "Android.PC";
96+
} else {
97+
device_class = "Android.Phone";
98+
}
7199

72100
const char* jStr;
73101
jboolean isCopy;
@@ -117,6 +145,7 @@ namespace PAL_NS_BEGIN {
117145
AndroidSystemInformationConnector::s_app_version = std::move(versionName);
118146
AndroidSystemInformationConnector::s_os_full_version = std::move(osVersion);
119147
AndroidSystemInformationConnector::s_os_major_version = std::move(versionRelease);
148+
AndroidSystemInformationConnector::s_device_class = (std::move(device_class));
120149
}
121150

122151
};
@@ -131,6 +160,8 @@ namespace PAL_NS_BEGIN {
131160

132161
std::string AndroidSystemInformationConnector::s_time_zone;
133162

163+
std::string AndroidSystemInformationConnector::s_device_class;
164+
134165
SystemInformationImpl::SystemInformationImpl(IRuntimeConfig& configuration) :
135166
m_info_helper(),
136167
m_os_name("Android")
@@ -148,6 +179,7 @@ namespace PAL_NS_BEGIN {
148179
m_os_major_version = AndroidSystemInformationConnector::s_os_major_version;
149180
m_os_full_version = AndroidSystemInformationConnector::s_os_full_version;
150181
m_user_timezone = AndroidSystemInformationConnector::s_time_zone;
182+
m_device_class = AndroidSystemInformationConnector::s_device_class;
151183
}
152184

153185
SystemInformationImpl::~SystemInformationImpl()
@@ -179,7 +211,9 @@ extern "C" JNIEXPORT void JNICALL Java_com_microsoft_applications_events_HttpCli
179211

180212
jstring os_major_version,
181213
jstring os_full_version,
182-
jstring time_zone
214+
jstring time_zone,
215+
216+
jstring deviceClass
183217
)
184218
{
185219
PAL::AndroidSystemInformationConnector::setValue(
@@ -206,5 +240,9 @@ extern "C" JNIEXPORT void JNICALL Java_com_microsoft_applications_events_HttpCli
206240
env,
207241
PAL::AndroidSystemInformationConnector::s_time_zone,
208242
time_zone);
243+
PAL::AndroidSystemInformationConnector::setValue(
244+
env,
245+
PAL::AndroidSystemInformationConnector::s_device_class,
246+
deviceClass);
209247
}
210248

0 commit comments

Comments
 (0)