Index: chrome/android/javatests/src/org/chromium/chrome/browser/SmartClipProviderTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ContentViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/SmartClipProviderTest.java |
similarity index 52% |
rename from chrome/android/javatests/src/org/chromium/chrome/browser/ContentViewTest.java |
rename to chrome/android/javatests/src/org/chromium/chrome/browser/SmartClipProviderTest.java |
index abfb6524e92efb28c7a469c4ceec5464c597f6d4..c9a3bde05f7034771bf50067c9aa8bb4990da7b2 100644 |
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ContentViewTest.java |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/SmartClipProviderTest.java |
@@ -4,26 +4,36 @@ |
package org.chromium.chrome.browser; |
+import android.content.pm.ApplicationInfo; |
+import android.content.pm.PackageManager; |
import android.graphics.Rect; |
import android.os.Bundle; |
import android.os.Handler; |
import android.os.HandlerThread; |
import android.os.Message; |
import android.test.suitebuilder.annotation.MediumTest; |
+import android.view.View; |
+import android.view.ViewGroup; |
import org.chromium.base.ThreadUtils; |
import org.chromium.base.test.util.Feature; |
import org.chromium.chrome.shell.ChromeShellActivity; |
import org.chromium.chrome.shell.ChromeShellTestBase; |
-import org.chromium.content.browser.ContentView; |
+import org.chromium.chrome.shell.R; |
import org.chromium.content.browser.test.util.CallbackHelper; |
+import java.lang.reflect.Method; |
import java.util.concurrent.TimeoutException; |
/** |
- * Tests for the ContentView. |
+ * Tests for the SmartClipProvider. |
*/ |
-public class ContentViewTest extends ChromeShellTestBase implements Handler.Callback { |
+public class SmartClipProviderTest extends ChromeShellTestBase implements Handler.Callback { |
+ // This is a key for meta-data in the package manifest. It should NOT |
+ // change, as OEMs will use it when they look for the SmartClipProvider |
+ // interface. |
+ private static final String SMART_CLIP_PROVIDER_KEY = |
+ "org.chromium.content.browser.SMART_CLIP_PROVIDER"; |
private static class MyCallbackHelper extends CallbackHelper { |
public String getTitle() { |
@@ -66,6 +76,9 @@ public class ContentViewTest extends ChromeShellTestBase implements Handler.Call |
private MyCallbackHelper mCallbackHelper; |
private HandlerThread mHandlerThread; |
private Handler mHandler; |
+ private Class<?> mSmartClipProviderClass; |
+ private Method mSetSmartClipResultHandlerMethod; |
+ private Method mExtractSmartClipDataMethod; |
@Override |
public void setUp() throws Exception { |
@@ -75,6 +88,14 @@ public class ContentViewTest extends ChromeShellTestBase implements Handler.Call |
mHandlerThread = new HandlerThread("ContentViewTest thread"); |
mHandlerThread.start(); |
mHandler = new Handler(mHandlerThread.getLooper(), this); |
+ |
+ mSmartClipProviderClass = getSmartClipProviderClass(); |
+ assertNotNull(mSmartClipProviderClass); |
+ mSetSmartClipResultHandlerMethod = mSmartClipProviderClass.getDeclaredMethod( |
+ "setSmartClipResultHandler", new Class[] { Handler.class }); |
+ mExtractSmartClipDataMethod = mSmartClipProviderClass.getDeclaredMethod( |
+ "extractSmartClipData", |
+ new Class[] { Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE }); |
} |
@Override |
@@ -101,16 +122,54 @@ public class ContentViewTest extends ChromeShellTestBase implements Handler.Call |
return true; |
} |
+ // Create SmartClipProvider interface from package meta-data. |
+ private Class<?> getSmartClipProviderClass() throws Exception { |
+ ApplicationInfo ai = mActivity.getPackageManager().getApplicationInfo( |
+ mActivity.getPackageName(), PackageManager.GET_META_DATA); |
+ Bundle bundle = ai.metaData; |
+ String className = bundle.getString(SMART_CLIP_PROVIDER_KEY); |
+ assertNotNull(className); |
+ return Class.forName(className); |
+ } |
+ |
+ // Returns the first smart clip provider under the root view using DFS. |
+ private Object findSmartClipProvider(View v) { |
+ if (mSmartClipProviderClass.isInstance(v)) { |
+ return v; |
+ } else if (v instanceof ViewGroup) { |
+ ViewGroup viewGroup = (ViewGroup) v; |
+ int count = viewGroup.getChildCount(); |
+ for (int i = 0; i < count; ++i) { |
+ View c = viewGroup.getChildAt(i); |
+ Object found = findSmartClipProvider(c); |
+ if (found != null) |
+ return found; |
+ } |
+ } |
+ return null; |
+ } |
+ |
@MediumTest |
@Feature({"SmartClip"}) |
public void testSmartClipDataCallback() throws InterruptedException, TimeoutException { |
ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
@Override |
public void run() { |
- ContentView cv = (ContentView) getActivity().getActiveTab().getView(); |
- assertNotNull(cv); |
- cv.setSmartClipResultHandler(mHandler); |
- cv.extractSmartClipData(10, 20, 100, 70); |
+ // This emulates what OEM will be doing when they want to call |
+ // functions on SmartClipProvider through view hierarchy. |
+ |
+ // Implementation of SmartClipProvider such as ContentView or |
+ // JellyBeanContentView can be found somewhere under content_container. |
+ Object scp = findSmartClipProvider( |
+ getActivity().findViewById(R.id.content_container)); |
+ assertNotNull(scp); |
+ try { |
+ mSetSmartClipResultHandlerMethod.invoke(scp, mHandler); |
+ mExtractSmartClipDataMethod.invoke(scp, 10, 20, 100, 70); |
+ } catch (Exception e) { |
+ e.printStackTrace(); |
+ fail(); |
+ } |
} |
}); |
mCallbackHelper.waitForCallback(0, 1); // call count: 0 --> 1 |