Commit 5397eb37 authored by David Trainor's avatar David Trainor Committed by Commit Bot

Add Android system info to collected feedback.

Add the following system properties to the feedback collection
mechanism:
- CPU Architecture
- GPU Vendor
- GPU Model
- Total MB memory
- Available MB memory
- Total MB storage (of data directory)
- Available MB storage (of data directory)

BUG=773397,773399,773400,773402

Change-Id: I49fdc3955bf71577d77dfac18029e5b4d7895ae0
Reviewed-on: https://chromium-review.googlesource.com/794852
Commit-Queue: David Trainor <dtrainor@chromium.org>
Reviewed-by: default avatarTommy Nyquist <nyquist@chromium.org>
Cr-Commit-Position: refs/heads/master@{#520668}
parent 09fb8b74
......@@ -92,6 +92,7 @@ public class FeedbackCollector implements Runnable {
// This is the list of all asynchronous sources of feedback. Please add new asynchronous
// entries here.
sources.add(new ConnectivityFeedbackSource(profile));
sources.add(new SystemInfoFeedbackSource());
return sources;
}
......
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.feedback;
import android.os.AsyncTask;
import android.os.AsyncTask.Status;
import android.os.Environment;
import android.os.StatFs;
import android.util.Pair;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.CollectionUtil;
import org.chromium.base.annotations.JNINamespace;
import java.io.File;
import java.util.Map;
import java.util.concurrent.ExecutionException;
/** Grabs feedback about the current system. */
@JNINamespace("chrome::android")
public class SystemInfoFeedbackSource implements AsyncFeedbackSource {
private StorageTask mStorageTask;
private static class StorageTask extends AsyncTask<Void, Void, StatFs> {
private Runnable mCallback;
public StorageTask(Runnable callback) {
mCallback = callback;
}
Long getAvailableSpaceMB() {
if (getStatus() != Status.FINISHED) return null;
try {
StatFs statFs = get();
if (statFs == null) return null;
long blockSize = ApiCompatibilityUtils.getBlockSize(statFs);
return ApiCompatibilityUtils.getAvailableBlocks(statFs) * blockSize / 1024 / 1024;
} catch (ExecutionException | InterruptedException e) {
return null;
}
}
Long getTotalSpaceMB() {
if (getStatus() != Status.FINISHED) return null;
try {
StatFs statFs = get();
if (statFs == null) return null;
long blockSize = ApiCompatibilityUtils.getBlockSize(statFs);
return ApiCompatibilityUtils.getBlockCount(statFs) * blockSize / 1024 / 1024;
} catch (ExecutionException | InterruptedException e) {
return null;
}
}
// AsyncTask implementation.
@Override
protected StatFs doInBackground(Void... params) {
File directory = Environment.getDataDirectory();
if (!directory.exists()) return null;
return new StatFs(directory.getPath());
}
@Override
protected void onPostExecute(StatFs result) {
super.onPostExecute(result);
mCallback.run();
}
}
SystemInfoFeedbackSource() {}
// AsyncFeedbackSource implementation.
@Override
public boolean isReady() {
return mStorageTask != null && mStorageTask.getStatus() == Status.FINISHED;
}
@Override
public void start(Runnable callback) {
if (mStorageTask != null) return;
mStorageTask = new StorageTask(callback);
mStorageTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
@Override
public Map<String, String> getFeedback() {
Map<String, String> feedback = CollectionUtil.newHashMap(
Pair.create("CPU Architecture", nativeGetCpuArchitecture()),
Pair.create(
"Available Memory (MB)", Integer.toString(nativeGetAvailableMemoryMB())),
Pair.create("Total Memory (MB)", Integer.toString(nativeGetTotalMemoryMB())),
Pair.create("GPU Vendor", nativeGetGpuVendor()),
Pair.create("GPU Model", nativeGetGpuModel()));
if (isReady()) {
Long availSpace = mStorageTask.getAvailableSpaceMB();
Long totalSpace = mStorageTask.getTotalSpaceMB();
if (availSpace != null) feedback.put("Available Storage (MB)", availSpace.toString());
if (totalSpace != null) feedback.put("Total Storage (MB)", totalSpace.toString());
}
return feedback;
}
private static native String nativeGetCpuArchitecture();
private static native String nativeGetGpuVendor();
private static native String nativeGetGpuModel();
private static native int nativeGetAvailableMemoryMB();
private static native int nativeGetTotalMemoryMB();
}
\ No newline at end of file
......@@ -421,6 +421,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/feedback/ScreenshotSource.java",
"java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java",
"java/src/org/chromium/chrome/browser/feedback/StaticScreenshotSource.java",
"java/src/org/chromium/chrome/browser/feedback/SystemInfoFeedbackSource.java",
"java/src/org/chromium/chrome/browser/feedback/UrlFeedbackSource.java",
"java/src/org/chromium/chrome/browser/feedback/VariationsFeedbackSource.java",
"java/src/org/chromium/chrome/browser/findinpage/FindInPageBridge.java",
......
......@@ -1952,6 +1952,7 @@ split_static_library("browser") {
"android/feature_utilities.h",
"android/feedback/connectivity_checker.cc",
"android/feedback/screenshot_task.cc",
"android/feedback/system_info_feedback_source.cc",
"android/find_in_page/find_in_page_bridge.cc",
"android/find_in_page/find_in_page_bridge.h",
"android/foreign_session_helper.cc",
......@@ -4186,6 +4187,7 @@ if (is_android) {
"../android/java/src/org/chromium/chrome/browser/feature_engagement/TrackerFactory.java",
"../android/java/src/org/chromium/chrome/browser/feedback/ConnectivityChecker.java",
"../android/java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java",
"../android/java/src/org/chromium/chrome/browser/feedback/SystemInfoFeedbackSource.java",
"../android/java/src/org/chromium/chrome/browser/findinpage/FindInPageBridge.java",
"../android/java/src/org/chromium/chrome/browser/history/BrowsingHistoryBridge.java",
"../android/java/src/org/chromium/chrome/browser/historyreport/HistoryReportJniBridge.java",
......
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
#include "base/sys_info.h"
#include "content/public/browser/gpu_data_manager.h"
#include "gpu/config/gpu_info.h"
#include "jni/SystemInfoFeedbackSource_jni.h"
using base::android::ConvertUTF8ToJavaString;
using base::android::JavaParamRef;
using base::android::ScopedJavaLocalRef;
namespace chrome {
namespace android {
ScopedJavaLocalRef<jstring> JNI_SystemInfoFeedbackSource_GetCpuArchitecture(
JNIEnv* env,
const JavaParamRef<jclass>& clazz) {
return ConvertUTF8ToJavaString(env,
base::SysInfo::OperatingSystemArchitecture());
}
ScopedJavaLocalRef<jstring> JNI_SystemInfoFeedbackSource_GetGpuVendor(
JNIEnv* env,
const JavaParamRef<jclass>& clazz) {
gpu::GPUInfo info = content::GpuDataManager::GetInstance()->GetGPUInfo();
return ConvertUTF8ToJavaString(env, info.active_gpu().vendor_string);
}
ScopedJavaLocalRef<jstring> JNI_SystemInfoFeedbackSource_GetGpuModel(
JNIEnv* env,
const JavaParamRef<jclass>& clazz) {
gpu::GPUInfo info = content::GpuDataManager::GetInstance()->GetGPUInfo();
return ConvertUTF8ToJavaString(env, info.active_gpu().device_string);
}
int JNI_SystemInfoFeedbackSource_GetAvailableMemoryMB(
JNIEnv* env,
const JavaParamRef<jclass>& clazz) {
return base::saturated_cast<int>(
base::SysInfo::AmountOfAvailablePhysicalMemory() / 1024 / 1024);
}
int JNI_SystemInfoFeedbackSource_GetTotalMemoryMB(
JNIEnv* env,
const JavaParamRef<jclass>& clazz) {
return base::SysInfo::AmountOfPhysicalMemoryMB();
}
} // namespace android
} // namespace chrome
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment