Doing provisioning check for wifi tethering from SystemUI

+ Calling activity which calls provisioning app only if provisioning
is needed.
+ Hiding Hotspot tile from quick settings when screen is locked.

Bug: 18368949
Change-Id: I5b92a7f2d46c8b5d9b323d6a5d49315694c599f7
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 926b53e..d013ee1 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -303,6 +303,9 @@
     -->
     </string-array>
 
+    <!-- Activity name to enable wifi tethering after provisioning app succeeds -->
+    <string translatable="false" name="config_wifi_tether_enable">com.android.settings/.EnableWifiTether</string>
+
     <!-- Array of ConnectivityManager.TYPE_xxxx values allowable for tethering -->
     <!-- Common options are [1, 4] for TYPE_WIFI and TYPE_MOBILE_DUN or
     <!== [0,1,5,7] for TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI and TYPE_BLUETOOTH -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index e861ab2..5075c0b 100755
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1877,6 +1877,7 @@
 
   <!-- From Settings -->
   <java-symbol type="array" name="config_mobile_hotspot_provision_app" />
+  <java-symbol type="string" name="config_wifi_tether_enable" />
   <java-symbol type="bool" name="config_intrusiveNotificationLed" />
   <java-symbol type="dimen" name="preference_fragment_padding_bottom" />
   <java-symbol type="dimen" name="preference_fragment_padding_side" />
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
index 9744dca..6e710ef 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
@@ -24,6 +24,7 @@
 import com.android.systemui.qs.UsageTracker;
 import com.android.systemui.qs.QSTile;
 import com.android.systemui.statusbar.policy.HotspotController;
+import com.android.systemui.statusbar.policy.KeyguardMonitor;
 
 /** Quick settings tile: Hotspot **/
 public class HotspotTile extends QSTile<QSTile.BooleanState> {
@@ -34,12 +35,14 @@
     private final HotspotController mController;
     private final Callback mCallback = new Callback();
     private final UsageTracker mUsageTracker;
+    private final KeyguardMonitor mKeyguard;
 
     public HotspotTile(Host host) {
         super(host);
         mController = host.getHotspotController();
         mUsageTracker = newUsageTracker(host.getContext());
         mUsageTracker.setListening(true);
+        mKeyguard = host.getKeyguardMonitor();
     }
 
     @Override
@@ -85,7 +88,9 @@
 
     @Override
     protected void handleUpdateState(BooleanState state, Object arg) {
-        state.visible = mController.isHotspotSupported() && mUsageTracker.isRecentlyUsed();
+        state.visible = mController.isHotspotSupported() && mUsageTracker.isRecentlyUsed()
+                && !(mController.isProvisioningNeeded() && mKeyguard.isSecure()
+                && mKeyguard.isShowing());
         state.label = mContext.getString(R.string.quick_settings_hotspot_label);
 
         state.value = mController.isHotspotEnabled();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java
index 8f40011..b05cb31 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java
@@ -18,6 +18,7 @@
 
 import android.app.ActivityManager;
 import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
@@ -35,9 +36,6 @@
 
     private static final String TAG = "HotspotController";
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-    private static final String TETHER_ENABLE_PACKAGE = "com.android.settings";
-    private static final String TETHER_ENABLE_CLASS = "com.android.settings.EnableWifiTether";
-
     private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>();
     private final Receiver mReceiver = new Receiver();
     private final Context mContext;
@@ -95,10 +93,22 @@
         final ContentResolver cr = mContext.getContentResolver();
         // Call provisioning app which is called when enabling Tethering from Settings
         if (enabled) {
-            Intent intent = new Intent();
-            intent.setClassName(TETHER_ENABLE_PACKAGE, TETHER_ENABLE_CLASS);
-            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            mContext.startActivity(intent);
+            if (isProvisioningNeeded()) {
+                String tetherEnable = mContext.getResources().getString(
+                        com.android.internal.R.string.config_wifi_tether_enable);
+                Intent intent = new Intent();
+                intent.setComponent(ComponentName.unflattenFromString(tetherEnable));
+                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                mContext.startActivityAsUser(intent, UserHandle.CURRENT);
+            } else {
+                int wifiState = mWifiManager.getWifiState();
+                if ((wifiState == WifiManager.WIFI_STATE_ENABLING) ||
+                        (wifiState == WifiManager.WIFI_STATE_ENABLED)) {
+                    mWifiManager.setWifiEnabled(false);
+                    Settings.Global.putInt(cr, Settings.Global.WIFI_SAVED_STATE, 1);
+                }
+                mWifiManager.setWifiApEnabled(null, true);
+            }
         } else {
             mWifiManager.setWifiApEnabled(null, false);
             if (Settings.Global.getInt(cr, Settings.Global.WIFI_SAVED_STATE, 0) == 1) {