Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / content / public / android / java / src / org / chromium / content / browser / TracingControllerAndroid.java
index e405922..172a016 100644 (file)
@@ -15,7 +15,6 @@ import android.widget.Toast;
 
 import org.chromium.base.CalledByNative;
 import org.chromium.base.JNINamespace;
-import org.chromium.base.TraceEvent;
 import org.chromium.content.R;
 
 import java.io.File;
@@ -47,6 +46,7 @@ public class TracingControllerAndroid {
 
     private static final String ACTION_START = "GPU_PROFILER_START";
     private static final String ACTION_STOP = "GPU_PROFILER_STOP";
+    private static final String ACTION_LIST_CATEGORIES = "GPU_PROFILER_LIST_CATEGORIES";
     private static final String FILE_EXTRA = "file";
     private static final String CATEGORIES_EXTRA = "categories";
     private static final String RECORD_CONTINUOUSLY_EXTRA = "continuous";
@@ -114,19 +114,13 @@ public class TracingControllerAndroid {
     }
 
     /**
-     * Start profiling to a new file in the Downloads directory.
-     *
-     * Calls #startTracing(String, boolean, String, boolean) with a new timestamped filename.
-     * @see #startTracing(String, boolean, String, boolean)
+     * Generates a unique filename to be used for tracing in the Downloads directory.
      */
-    public boolean startTracing(boolean showToasts, String categories,
-            boolean recordContinuously) {
-        mShowToasts = showToasts;
+    @CalledByNative
+    private static String generateTracingFilePath() {
         String state = Environment.getExternalStorageState();
         if (!Environment.MEDIA_MOUNTED.equals(state)) {
-            logAndToastError(
-                    mContext.getString(R.string.profiler_no_storage_toast));
-            return false;
+            return null;
         }
 
         // Generate a hopefully-unique filename using the UTC timestamp.
@@ -138,8 +132,31 @@ public class TracingControllerAndroid {
                 Environment.DIRECTORY_DOWNLOADS);
         File file = new File(
                 dir, "chrome-profile-results-" + formatter.format(new Date()));
+        return file.getPath();
+    }
 
-        return startTracing(file.getPath(), showToasts, categories, recordContinuously);
+    /**
+     * Start profiling to a new file in the Downloads directory.
+     *
+     * Calls #startTracing(String, boolean, String, boolean) with a new timestamped filename.
+     * @see #startTracing(String, boolean, String, boolean)
+     */
+    public boolean startTracing(boolean showToasts, String categories,
+            boolean recordContinuously) {
+        mShowToasts = showToasts;
+
+        String filePath = generateTracingFilePath();
+        if (filePath == null) {
+          logAndToastError(
+              mContext.getString(R.string.profiler_no_storage_toast));
+        }
+        return startTracing(filePath, showToasts, categories, recordContinuously);
+    }
+
+    private void initializeNativeControllerIfNeeded() {
+        if (mNativeTracingControllerAndroid == 0) {
+            mNativeTracingControllerAndroid = nativeInit();
+        }
     }
 
     /**
@@ -167,17 +184,14 @@ public class TracingControllerAndroid {
             return false;
         }
         // Lazy initialize the native side, to allow construction before the library is loaded.
-        if (mNativeTracingControllerAndroid == 0) {
-            mNativeTracingControllerAndroid = nativeInit();
-        }
-        if (!nativeStartTracing(mNativeTracingControllerAndroid, filename, categories,
+        initializeNativeControllerIfNeeded();
+        if (!nativeStartTracing(mNativeTracingControllerAndroid, categories,
                 recordContinuously)) {
             logAndToastError(mContext.getString(R.string.profiler_error_toast));
             return false;
         }
 
         logAndToastInfo(mContext.getString(R.string.profiler_started_toast) + ": " + categories);
-        TraceEvent.setEnabledToMatchNative();
         mFilename = filename;
         mIsTracing = true;
         return true;
@@ -188,7 +202,7 @@ public class TracingControllerAndroid {
      */
     public void stopTracing() {
         if (isTracing()) {
-            nativeStopTracing(mNativeTracingControllerAndroid);
+            nativeStopTracing(mNativeTracingControllerAndroid, mFilename);
         }
     }
 
@@ -205,11 +219,21 @@ public class TracingControllerAndroid {
 
         logAndToastInfo(
                 mContext.getString(R.string.profiler_stopped_toast, mFilename));
-        TraceEvent.setEnabledToMatchNative();
         mIsTracing = false;
         mFilename = null;
     }
 
+    /**
+     * Get known category groups.
+     */
+    public void getCategoryGroups() {
+        // Lazy initialize the native side, to allow construction before the library is loaded.
+        initializeNativeControllerIfNeeded();
+        if (!nativeGetKnownCategoryGroupsAsync(mNativeTracingControllerAndroid)) {
+            Log.e(TAG, "Unable to fetch tracing record groups list.");
+        }
+    }
+
     @Override
     protected void finalize() {
         if (mNativeTracingControllerAndroid != 0) {
@@ -232,6 +256,7 @@ public class TracingControllerAndroid {
         TracingIntentFilter(Context context) {
             addAction(context.getPackageName() + "." + ACTION_START);
             addAction(context.getPackageName() + "." + ACTION_STOP);
+            addAction(context.getPackageName() + "." + ACTION_LIST_CATEGORIES);
         }
     }
 
@@ -256,6 +281,8 @@ public class TracingControllerAndroid {
                 }
             } else if (intent.getAction().endsWith(ACTION_STOP)) {
                 stopTracing();
+            } else if (intent.getAction().endsWith(ACTION_LIST_CATEGORIES)) {
+                getCategoryGroups();
             } else {
                 Log.e(TAG, "Unexpected intent: " + intent);
             }
@@ -265,8 +292,9 @@ public class TracingControllerAndroid {
     private long mNativeTracingControllerAndroid;
     private native long nativeInit();
     private native void nativeDestroy(long nativeTracingControllerAndroid);
-    private native boolean nativeStartTracing(long nativeTracingControllerAndroid, String filename,
-            String categories, boolean recordContinuously);
-    private native void nativeStopTracing(long nativeTracingControllerAndroid);
+    private native boolean nativeStartTracing(
+            long nativeTracingControllerAndroid, String categories, boolean recordContinuously);
+    private native void nativeStopTracing(long nativeTracingControllerAndroid, String filename);
+    private native boolean nativeGetKnownCategoryGroupsAsync(long nativeTracingControllerAndroid);
     private native String nativeGetDefaultCategories();
 }