| 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
|
|
|