Tel Testing Script: Add support for Tethering Entitlement Check.

1. Add SL4A API to get tethering check result.
2. Add test case into TelLiveDataTest to do tethering entitlement check test.

Change-Id: Iffa9370a1e561ae67e248f2ffd1df5e766c39d4d
diff --git a/Common/src/com/googlecode/android_scripting/facade/AndroidFacade.java b/Common/src/com/googlecode/android_scripting/facade/AndroidFacade.java
index 791c9eb..64a3e59 100644
--- a/Common/src/com/googlecode/android_scripting/facade/AndroidFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/AndroidFacade.java
@@ -16,6 +16,7 @@
 
 package com.googlecode.android_scripting.facade;
 
+import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Notification;
 import android.app.NotificationManager;
@@ -63,6 +64,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
 
 import org.json.JSONArray;
 import org.json.JSONException;
@@ -169,6 +171,37 @@
     }
   }
 
+  public int startActivityForResultCodeWithTimeout(final Intent intent,
+    final int request, final int timeout) {
+    FutureActivityTask<Integer> task = new FutureActivityTask<Integer>() {
+      @Override
+      public void onCreate() {
+        super.onCreate();
+        try {
+          startActivityForResult(intent, request);
+        } catch (Exception e) {
+          intent.putExtra("EXCEPTION", e.getMessage());
+        }
+      }
+
+      @Override
+      public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (request == requestCode){
+            setResult(resultCode);
+        }
+      }
+    };
+    mTaskQueue.execute(task);
+
+    try {
+      return task.getResult(timeout, TimeUnit.SECONDS);
+    } catch (Exception e) {
+      throw new RuntimeException(e);
+    } finally {
+      task.finish();
+    }
+  }
+
   // TODO(damonkohler): Pull this out into proper argument deserialization and support
   // complex/nested types being passed in.
   public static void putExtrasFromJsonObject(JSONObject extras,
diff --git a/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java b/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java
old mode 100755
new mode 100644
index 26395d2..ff63dea
--- a/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java
@@ -16,6 +16,7 @@
 
 package com.googlecode.android_scripting.facade.tele;
 
+import android.app.Activity;
 import android.app.Service;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -77,7 +78,6 @@
     private final AndroidFacade mAndroidFacade;
     private final EventFacade mEventFacade;
     private final TelephonyManager mTelephonyManager;
-
     private ITelephony mITelephony;
     private final SubscriptionManager mSubscriptionManager;
     private List<SubscriptionInfo> mSubInfos;
@@ -151,6 +151,62 @@
                                 SubscriptionManager.getDefaultSubId());
     }
 
+    @Rpc(description = "Tethering Entitlement Check")
+    public boolean phoneIsTetheringModeAllowed(String mode, Integer timeout) {
+        String[] mProvisionApp = mService.getResources().getStringArray(
+                com.android.internal.R.array.config_mobile_hotspot_provision_app);
+        /* following check defined in
+            packages/apps/Settings/src/com/android/settings/TetherSettings.java
+            isProvisioningNeeded
+        */
+        if ((mProvisionApp == null) || (mProvisionApp.length != 2)){
+            Log.d("phoneIsTetheringModeAllowed: no check is present.");
+            return true;
+        }
+        Log.d("phoneIsTetheringModeAllowed mProvisionApp 0 " + mProvisionApp[0]);
+        Log.d("phoneIsTetheringModeAllowed mProvisionApp 1 " + mProvisionApp[1]);
+
+        // FIXME: Need to use TetherSettings.xxx to replace the following private definitions.
+        /* defined in packages/apps/Settings/src/com/android/settings/TetherSettings.java
+        public static final int INVALID             = -1;
+        public static final int WIFI_TETHERING      = 0;
+        public static final int USB_TETHERING       = 1;
+        public static final int BLUETOOTH_TETHERING = 2;
+        private static final int PROVISION_REQUEST = 0;
+        */
+        final int INVALID             = -1;
+        final int WIFI_TETHERING      = 0;
+        final int USB_TETHERING       = 1;
+        final int BLUETOOTH_TETHERING = 2;
+        final int PROVISION_REQUEST = 0;
+
+        int mTetherChoice = INVALID;
+        if (mode.equals("wifi")){
+            mTetherChoice = WIFI_TETHERING;
+        } else if (mode.equals("usb")) {
+            mTetherChoice = USB_TETHERING;
+        } else if (mode.equals("bluetooth")) {
+            mTetherChoice = BLUETOOTH_TETHERING;
+        }
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setClassName(mProvisionApp[0], mProvisionApp[1]);
+        intent.putExtra("TETHER_TYPE", mTetherChoice);
+        int result;
+        try{
+            result = mAndroidFacade.startActivityForResultCodeWithTimeout(
+                intent, PROVISION_REQUEST, timeout);
+        } catch (Exception e) {
+            Log.d("phoneTetherCheck exception" + e.toString());
+            return false;
+        }
+
+        if (result == Activity.RESULT_OK) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
     @Rpc(description = "Set preferred network setting " +
                        "for specified subscription ID")
     public boolean phoneSetPreferredNetworkTypeForSubscription(String mode,
diff --git a/Common/src/com/googlecode/android_scripting/future/FutureActivityTask.java b/Common/src/com/googlecode/android_scripting/future/FutureActivityTask.java
index 7ecc2f2..3804604 100644
--- a/Common/src/com/googlecode/android_scripting/future/FutureActivityTask.java
+++ b/Common/src/com/googlecode/android_scripting/future/FutureActivityTask.java
@@ -24,10 +24,11 @@
 import android.view.Menu;
 import android.view.View;
 import android.view.Window;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Encapsulates an {@link Activity} and a {@link FutureObject}.
- * 
+ *
  * @author Damon Kohler (damonkohler@gmail.com)
  */
 public abstract class FutureActivityTask<T> {
@@ -80,6 +81,10 @@
     return mResult.get();
   }
 
+  public T getResult(long timeout, TimeUnit unit) throws InterruptedException {
+    return mResult.get(timeout, unit);
+  }
+
   public void finish() {
     mActivity.finish();
   }