From f3d1eb70c0bc6684d5ba18c2e9ef8e5fcb6bfe61 Mon Sep 17 00:00:00 2001
From: Christian Oder <myself5@carbonrom.org>
Date: Tue, 26 Nov 2019 23:35:01 +0100
Subject: [PATCH] fwb: Introduce DataSwitchTile

* Based on OnePlus' OxygenOS tile, reworked to work with AOSP toggling without requirements on proprietary telephony-ext features
* AICPfy

Change-Id: Ie2e280c07f24f9da6b4ee218b72501a2713ce429
---

diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 2c22e70..3198739 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -282,6 +282,9 @@
     <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
     <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
 
+    <!-- DataSwitch tile -->
+    <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />
+
     <application
         android:name=".SystemUIApplication"
         android:persistent="true"
diff --git a/packages/SystemUI/res/drawable/ic_qs_data_switch_1.xml b/packages/SystemUI/res/drawable/ic_qs_data_switch_1.xml
new file mode 100644
index 0000000..1747678
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_data_switch_1.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:aapt="http://schemas.android.com/aapt" android:height="48dp" android:width="48dp" android:viewportWidth="72" android:viewportHeight="72">
+    <path android:fillColor="#ffffffff" android:pathData="m36,66 l-18,0c-3.3,0 -6,-2.7 -6,-6L12,24 30,6 54,6c3.3,0 5.97,2.7 5.97,6l0.02,33 -20.99,0C37.35,45 36,46.34 36,47.99zM42,28 L48,35 54,28zM54,19 L48,12 42,19zM51.32,66 L47.36,66 47.36,53.39 43.47,54.53 43.47,51.53 50.96,48.94 51.32,48.94z" android:strokeColor="#00000000"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_data_switch_2.xml b/packages/SystemUI/res/drawable/ic_qs_data_switch_2.xml
new file mode 100644
index 0000000..438fc94
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_data_switch_2.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:aapt="http://schemas.android.com/aapt" android:height="48dp" android:width="48dp" android:viewportWidth="72" android:viewportHeight="72">
+    <path android:fillColor="#ffffffff" android:pathData="m36,66 l-18,0c-3.3,0 -6,-2.7 -6,-6L12,24 30,6 54,6c3.3,0 5.97,2.7 5.97,6l0.02,33 -20.99,0C37.35,45 36,46.34 36,47.99zM42,28 L48,35 54,28zM48,12 L42,19 54,19zM54.48,66 L42.57,66 42.57,63.42 48.06,57.66c0.73,-0.83 1.25,-1.54 1.56,-2.13 0.31,-0.59 0.47,-1.1 0.47,-1.54 0,-0.73 -0.16,-1.29 -0.48,-1.68 -0.32,-0.38 -0.79,-0.57 -1.39,-0.57 -0.3,0 -0.58,0.07 -0.83,0.21 -0.25,0.14 -0.46,0.33 -0.64,0.57 -0.18,0.24 -0.31,0.53 -0.41,0.85 -0.1,0.32 -0.15,0.68 -0.15,1.06l-3.96,0c0,-0.78 0.15,-1.52 0.44,-2.21 0.29,-0.7 0.71,-1.3 1.24,-1.83 0.54,-0.52 1.18,-0.94 1.92,-1.24 0.75,-0.3 1.57,-0.45 2.48,-0.45 0.95,0 1.78,0.11 2.49,0.33 0.71,0.22 1.31,0.54 1.8,0.97 0.48,0.42 0.85,0.94 1.1,1.55 0.25,0.61 0.37,1.31 0.37,2.09 0,0.59 -0.09,1.16 -0.28,1.71 -0.19,0.54 -0.46,1.08 -0.81,1.62 -0.35,0.54 -0.78,1.09 -1.29,1.65 -0.51,0.56 -1.08,1.16 -1.71,1.79l-2.2,2.54 6.71,0z" android:strokeColor="#00000000"/>
+</vector>
diff --git a/packages/SystemUI/res/values/aicp_config.xml b/packages/SystemUI/res/values/aicp_config.xml
index 81b7d02..b9a2e38 100644
--- a/packages/SystemUI/res/values/aicp_config.xml
+++ b/packages/SystemUI/res/values/aicp_config.xml
@@ -23,7 +23,7 @@
 
     <!-- The default tiles to display in QuickSettings -->
     <string name="quick_settings_tiles_extra" translatable="false">
-        cpuinfo,compass,music,screenshot,scr,reboot,usb_tether,caffeine,aicp_extras,heads_up,smartpixels,adb_network,aod,locale,sound,onthego,sync,weather,soundsearch
+        cpuinfo,compass,music,screenshot,scr,reboot,usb_tether,caffeine,aicp_extras,heads_up,smartpixels,adb_network,aod,locale,sound,onthego,sync,weather,soundsearch,dataswitch
     </string>
 
     <!-- The CPU temperature sensor path, defaults to empty -->
diff --git a/packages/SystemUI/res/values/aicp_strings.xml b/packages/SystemUI/res/values/aicp_strings.xml
index a6aa66e..33c4c78 100644
--- a/packages/SystemUI/res/values/aicp_strings.xml
+++ b/packages/SystemUI/res/values/aicp_strings.xml
@@ -248,4 +248,11 @@
     <string name="status_bar_location">Location</string>
 
     <string name="qs_footer_aicp_text" translatable="false">#Aicp</string>
+
+    <!-- DataSwitch Tile -->
+    <string name="qs_data_switch_label">Switch data card</string>
+    <string name="qs_data_switch_toast_0">Currently no SIM card is inserted</string>
+    <string name="qs_data_switch_toast_1">Currently only one SIM card is inserted</string>
+    <string name="qs_data_switch_changed_1">Switch data card to SIM 1.</string>
+    <string name="qs_data_switch_changed_2">Switch data card to SIM 2.</string>
 </resources>
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
index d4042fa..aec7d87 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
@@ -64,6 +64,7 @@
 import com.android.systemui.qs.tiles.WeatherTile;
 import com.android.systemui.qs.tiles.WifiTile;
 import com.android.systemui.qs.tiles.WorkModeTile;
+import com.android.systemui.qs.tiles.DataSwitchTile;
 import com.android.systemui.util.leak.GarbageMonitor;
 
 import javax.inject.Inject;
@@ -97,6 +98,7 @@
     private final Provider<ScreenrecordTile> mScrTileProvider;
     private final Provider<SmartPixelsTile> mSmartPixelsTileProvider;
     private final Provider<SoundSearchTile> mSoundSearchTileProvider;
+    private final Provider<DataSwitchTile> mDataSwitchTileProvider;
 
     private QSTileHost mHost;
 
@@ -122,7 +124,8 @@
             Provider<UiModeNightTile> uiModeNightTileProvider,
             Provider<ScreenrecordTile> scrTileProvider,
             Provider<SmartPixelsTile> smartPixelsTileProvider,
-            Provider<SoundSearchTile> soundSearchTileProvider) {
+            Provider<SoundSearchTile> soundSearchTileProvider,
+            Provider<DataSwitchTile> dataSwitchTileProvider) {
         mWifiTileProvider = wifiTileProvider;
         mBluetoothTileProvider = bluetoothTileProvider;
         mCellularTileProvider = cellularTileProvider;
@@ -145,6 +148,7 @@
         mScrTileProvider = scrTileProvider;
         mSmartPixelsTileProvider = smartPixelsTileProvider;
         mSoundSearchTileProvider = soundSearchTileProvider;
+        mDataSwitchTileProvider = dataSwitchTileProvider;
     }
 
     public void setHost(QSTileHost host) {
@@ -237,6 +241,8 @@
                 return new WeatherTile(mHost);
             case "soundsearch":
                 return mSoundSearchTileProvider.get();
+            case "dataswitch":
+                return mDataSwitchTileProvider.get();
         }
 
         // Intent tiles.
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSwitchTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSwitchTile.java
new file mode 100644
index 0000000..4047761
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSwitchTile.java
@@ -0,0 +1,233 @@
+package com.android.systemui.qs.tiles;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.AsyncTask;
+import android.os.ServiceManager;
+import android.os.SystemProperties;
+import android.provider.Settings;
+import android.telephony.PhoneStateListener;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.telephony.IccCardConstants;
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.systemui.Dependency;
+import com.android.systemui.R;
+import com.android.systemui.SysUIToast;
+import com.android.systemui.plugins.qs.QSTile.BooleanState;
+import com.android.systemui.qs.QSHost;
+import com.android.systemui.qs.tileimpl.QSTileImpl;
+import com.android.systemui.qs.tileimpl.QSTileImpl.ResourceIcon;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import javax.inject.Inject;
+
+public class DataSwitchTile extends QSTileImpl<BooleanState> {
+    private boolean mCanSwitch = true;
+    private MyCallStateListener mPhoneStateListener;
+    private boolean mRegistered = false;
+    private int mSimCount = 0;
+    BroadcastReceiver mSimReceiver = new BroadcastReceiver() {
+        public void onReceive(Context context, Intent intent) {
+            Log.d(TAG, "mSimReceiver:onReceive");
+            refreshState();
+        }
+    };
+    private SubscriptionManager mSubscriptionManager;
+    private TelephonyManager mTelephonyManager;
+
+    class MyCallStateListener extends PhoneStateListener {
+        MyCallStateListener() {
+        }
+
+        public void onCallStateChanged(int state, String arg1) {
+            mCanSwitch = mTelephonyManager.getCallState() == 0;
+            refreshState();
+        }
+    }
+
+    @Inject
+    public DataSwitchTile(QSHost host) {
+        super(host);
+        mSubscriptionManager = SubscriptionManager.from(host.getContext());
+        mTelephonyManager = TelephonyManager.from(host.getContext());
+        mPhoneStateListener = new MyCallStateListener();
+    }
+
+    @Override
+    public boolean isAvailable() {
+        int count = TelephonyManager.getDefault().getPhoneCount();
+        Log.d(TAG, "phoneCount: " + count);
+        return count >= 2;
+    }
+
+    @Override
+    public BooleanState newTileState() {
+        return new BooleanState();
+    }
+
+    @Override
+    public void handleSetListening(boolean listening) {
+        if (listening) {
+            if (!mRegistered) {
+                IntentFilter filter = new IntentFilter();
+                filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
+                mContext.registerReceiver(mSimReceiver, filter);
+                mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
+                mRegistered = true;
+            }
+            refreshState();
+        } else if (mRegistered) {
+            mContext.unregisterReceiver(mSimReceiver);
+            mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+            mRegistered = false;
+        }
+    }
+
+    private void updateSimCount() {
+        String simState = SystemProperties.get("gsm.sim.state");
+        Log.d(TAG, "DataSwitchTile:updateSimCount:simState=" + simState);
+        mSimCount = 0;
+        try {
+            String[] sims = TextUtils.split(simState, ",");
+            for (int i = 0; i < sims.length; i++) {
+                if (!sims[i].isEmpty()
+                        && !sims[i].equalsIgnoreCase(IccCardConstants.INTENT_VALUE_ICC_ABSENT)
+                        && !sims[i].equalsIgnoreCase(IccCardConstants.INTENT_VALUE_ICC_NOT_READY)) {
+                    mSimCount++;
+                }
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "Error to parse sim state");
+        }
+        Log.d(TAG, "DataSwitchTile:updateSimCount:mSimCount=" + mSimCount);
+    }
+
+    @Override
+    protected void handleClick() {
+        if (!mCanSwitch) {
+            Log.d(TAG, "Call state=" + mTelephonyManager.getCallState());
+        } else if (mSimCount == 0) {
+            Log.d(TAG, "handleClick:no sim card");
+            SysUIToast.makeText(mContext,
+                    mContext.getString(R.string.qs_data_switch_toast_0),
+                    Toast.LENGTH_LONG).show();
+        } else if (mSimCount == 1) {
+            Log.d(TAG, "handleClick:only one sim card");
+            SysUIToast.makeText(mContext,
+                    mContext.getString(R.string.qs_data_switch_toast_1),
+                    Toast.LENGTH_LONG).show();
+        } else {
+            AsyncTask.execute(new Runnable() {
+                public final void run() {
+                    toggleMobileDataEnabled();
+                    refreshState();
+                }
+            });
+        }
+    }
+
+    @Override
+    public Intent getLongClickIntent() {
+        return new Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS);
+    }
+
+    @Override
+    public CharSequence getTileLabel() {
+        return mContext.getString(R.string.qs_data_switch_label);
+    }
+
+    @Override
+    protected void handleUpdateState(BooleanState state, Object arg) {
+        boolean activeSIMZero;
+        if (arg == null) {
+            int defaultPhoneId = mSubscriptionManager.getDefaultDataPhoneId();
+            Log.d(TAG, "default data phone id=" + defaultPhoneId);
+            activeSIMZero = defaultPhoneId == 0;
+        } else {
+            activeSIMZero = (Boolean) arg;
+        }
+        updateSimCount();
+        switch (mSimCount) {
+            case 1:
+                state.icon = ResourceIcon.get(activeSIMZero
+                        ? R.drawable.ic_qs_data_switch_1
+                        : R.drawable.ic_qs_data_switch_2);
+                state.value = false;
+                break;
+            case 2:
+                state.icon = ResourceIcon.get(activeSIMZero
+                        ? R.drawable.ic_qs_data_switch_1
+                        : R.drawable.ic_qs_data_switch_2);
+                state.value = true;
+                break;
+            default:
+                state.icon = ResourceIcon.get(R.drawable.ic_qs_data_switch_1);
+                state.value = false;
+                break;
+        }
+        if (mSimCount < 2) {
+            state.state = 0;
+        } else if (!mCanSwitch) {
+            state.state = 0;
+            Log.d(TAG, "call state isn't idle, set to unavailable.");
+        } else {
+            state.state = state.value ? 2 : 1;
+        }
+
+        state.contentDescription =
+                mContext.getString(activeSIMZero
+                        ? R.string.qs_data_switch_changed_1
+                        : R.string.qs_data_switch_changed_2);
+        state.label = mContext.getString(R.string.qs_data_switch_label);
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsEvent.AICP_METRICS;
+    }
+
+    @Override
+    protected String composeChangeAnnouncement() {
+        return mContext.getString(mState.value
+                ? R.string.qs_data_switch_changed_1
+                : R.string.qs_data_switch_changed_2);
+    }
+
+    /**
+     * Set whether to enable data for {@code subId}, also whether to disable data for other
+     * subscription
+     */
+    private void toggleMobileDataEnabled() {
+        // Get opposite slot 2 ^ 3 = 1, 1 ^ 3 = 2
+        int subId = mSubscriptionManager.getDefaultDataSubscriptionId() ^ 3;
+        final TelephonyManager telephonyManager =
+                mTelephonyManager.createForSubscriptionId(subId);
+        telephonyManager.setDataEnabled(true);
+        mSubscriptionManager.setDefaultDataSubId(subId);
+        Log.d(TAG, "Enabled subID: " + subId);
+
+        List<SubscriptionInfo> subInfoList =
+                mSubscriptionManager.getActiveSubscriptionInfoList(true);
+        if (subInfoList != null) {
+            for (SubscriptionInfo subInfo : subInfoList) {
+                // We never disable mobile data for opportunistic subscriptions.
+                if (subInfo.getSubscriptionId() != subId && !subInfo.isOpportunistic()) {
+                    mTelephonyManager.createForSubscriptionId(
+                            subInfo.getSubscriptionId()).setDataEnabled(false);
+                    Log.d(TAG, "Disabled subID: " + subInfo.getSubscriptionId());
+                }
+            }
+        }
+    }
+}
