SkQP: fix Filterable.filter

Change-Id: Id50c24d16a3ba6810fbf49b91a7a93c3df5cb743
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/223296
Reviewed-by: Hal Canary <halcanary@google.com>
Commit-Queue: Hal Canary <halcanary@google.com>
diff --git a/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java b/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java
index 8e360c8..e65d618 100644
--- a/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java
+++ b/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java
@@ -29,6 +29,7 @@
 public class SkQPRunner extends Runner implements Filterable {
     private int mShouldRunTestCount;
     private Description[] mTests;
+    private Description mDescription;
     private boolean[] mShouldSkipTest;
     private String mOutputDirectory;
     private SkQP mImpl;
@@ -52,8 +53,9 @@
         AssetManager assetManager = context.getResources().getAssets();
         mImpl.nInit(assetManager, mOutputDirectory);
 
-        mTests = new Description[this.testCount()];
-        mShouldSkipTest = new boolean[mTests.length]; // = {false, false, ....};
+        int totalCount = mImpl.mUnitTests.length + mImpl.mGMs.length * mImpl.mBackends.length;
+        mTests = new Description[totalCount];
+        mShouldSkipTest = new boolean[totalCount]; // = {false, false, ....};
         int index = 0;
         for (int backend = 0; backend < mImpl.mBackends.length; backend++) {
             for (int gm = 0; gm < mImpl.mGMs.length; gm++) {
@@ -65,37 +67,35 @@
             mTests[index++] = Description.createTestDescription(SkQPRunner.class,
                     "unitTest_" + mImpl.mUnitTests[unitTest]);
         }
-        assert(index == mTests.length);
-        mShouldRunTestCount = mTests.length;
+        assert(index == totalCount);
+        this.updateDescription(null);
+    }
+
+    private void updateDescription(Filter filter) {
+        mShouldRunTestCount = 0;
+        mDescription = Description.createSuiteDescription(SkQP.class);
+        assert(mTests.length == mShouldSkipTest.length);
+        for (int i = 0; i < mTests.length; ++i) {
+            boolean doRunTest = filter != null ? filter.shouldRun(mTests[i]) : true;
+            mShouldSkipTest[i] = !doRunTest;
+            if (doRunTest) {
+                mDescription.addChild(mTests[i]);
+                ++mShouldRunTestCount;
+            }
+        }
     }
 
     @Override
     public void filter(Filter filter) throws NoTestsRemainException {
-        int count = 0;
-        for (int i = 0; i < mTests.length; ++i) {
-            mShouldSkipTest[i] = !filter.shouldRun(mTests[i]);
-            if (!mShouldSkipTest[i]) {
-                ++count;
-            }
-        }
-        mShouldRunTestCount = count;
-        if (0 == count) {
+        this.updateDescription(filter);
+        if (0 == mShouldRunTestCount) {
             throw new NoTestsRemainException();
         }
     }
 
     @Override
     public Description getDescription() {
-        Description d = Description.createSuiteDescription(SkQP.class);
-        for (int i = 0; i < mTests.length; ++i) {
-            d.addChild(mTests[i]);
-        }
-        return d;
-    }
-
-    @Override
-    public int testCount() {
-        return mImpl.mUnitTests.length + mImpl.mGMs.length * mImpl.mBackends.length;
+        return mDescription;
     }
 
     @Override