Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 96c43397 authored by Jack Yu's avatar Jack Yu
Browse files

Allowing enabling new data by device config

cl/421423121 successfully pushed the default
flag to all T devices. This CL allows ramping
up new data stack from server side.

Note this is just the temp code. After 100%
penatration rate, this flag along with all
legacy data stack modules (e.g. DcTracker) will
be completely removed.

Bug: 204124694
Test: adb shell device_config get telephony enable_new_data_stack
Change-Id: I70acc0df688ba6b8a87235e81089792719476278
parent 7f8107ce
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.WorkSource;
import android.preference.PreferenceManager;
import android.provider.DeviceConfig;
import android.sysprop.TelephonyProperties;
import android.telecom.VideoProfile;
import android.telephony.AccessNetworkConstants;
@@ -620,8 +621,8 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
        // Initialize SMS stats
        mSmsStats = new SmsStats(this);

        mNewDataStackEnabled = false; /*(Boolean.parseBoolean(DeviceConfig.getProperty(
                DeviceConfig.NAMESPACE_TELEPHONY,"new_telephony_data_enabled"));*/
        mNewDataStackEnabled = Boolean.parseBoolean(DeviceConfig.getProperty(
                DeviceConfig.NAMESPACE_TELEPHONY, "enable_new_data_stack"));

        if (getPhoneType() == PhoneConstants.PHONE_TYPE_IMS) {
            return;
@@ -5014,8 +5015,8 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
    /**
     * @return {@code true} if using the new telephony data stack. See go/atdr for the design.
     */
    // TODO: Temp code. Use cl/399526916 for future canary process. After rolling out to 100%
    //  dogfooders, the code below should be completely removed.
    // TODO: Temp code. Use cl/421423121 for future canary process. After rolling out to 100%
    //  dogfooders, the code below should be completely removed before T AOSP release.
    public boolean isUsingNewDataStack() {
        return mNewDataStackEnabled;
    }
+20 −15
Original line number Diff line number Diff line
@@ -37,7 +37,6 @@ import android.app.UiModeManager;
import android.app.usage.UsageStatsManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
@@ -74,7 +73,6 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.provider.Telephony.ServiceStateTable;
import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
@@ -117,10 +115,11 @@ public class ContextFixture implements TestFixture<Context> {
    private static final String TAG = "ContextFixture";
    public static final String PERMISSION_ENABLE_ALL = "android.permission.STUB_PERMISSION";

    public class FakeContentProvider extends MockContentProvider {
    public static class FakeContentProvider extends MockContentProvider {
        private String[] mColumns = {"name", "value"};
        private HashMap<String, String> mKeyValuePairs = new HashMap<String, String>();
        private int mNumKeyValuePairs = 0;
        private HashMap<String, String> mFlags = new HashMap<>();

        @Override
        public int delete(Uri uri, String selection, String[] selectionArgs) {
@@ -156,17 +155,17 @@ public class ContextFixture implements TestFixture<Context> {
        @Override
        public Bundle call(String method, String request, Bundle args) {
            logd("call called, mNumKeyValuePairs: " + mNumKeyValuePairs + " method: " + method +
                    " request: " + request);
                    " request: " + request + ", args=" + args);
            Bundle bundle = new Bundle();
            switch(method) {
                case Settings.CALL_METHOD_GET_GLOBAL:
                case Settings.CALL_METHOD_GET_SECURE:
                case Settings.CALL_METHOD_GET_SYSTEM:
                    if (mKeyValuePairs.containsKey(request)) {
                        Bundle b = new Bundle(1);
                        b.putCharSequence("value", mKeyValuePairs.get(request));
                        bundle.putCharSequence("value", mKeyValuePairs.get(request));
                        logd("returning value pair: " + mKeyValuePairs.get(request) + " for " +
                                request);
                        return b;
                        return bundle;
                    }
                    break;
                case Settings.CALL_METHOD_PUT_GLOBAL:
@@ -176,6 +175,20 @@ public class ContextFixture implements TestFixture<Context> {
                    mKeyValuePairs.put(request, (String)args.get("value"));
                    mNumKeyValuePairs++;
                    break;
                case Settings.CALL_METHOD_LIST_CONFIG:
                    logd("LIST_config: " + mFlags);
                    Bundle result = new Bundle();
                    result.putSerializable(Settings.NameValueTable.VALUE, mFlags);
                    return result;
                case Settings.CALL_METHOD_SET_ALL_CONFIG:
                    mFlags = (args != null)
                            ? (HashMap) args.getSerializable(Settings.CALL_METHOD_FLAGS_KEY)
                            : new HashMap<>();
                    bundle.putInt(Settings.KEY_CONFIG_SET_ALL_RETURN,
                            Settings.SET_ALL_RESULT_SUCCESS);
                    return bundle;
                default:
                    logd("Unsupported method " + method);
            }
            return null;
        }
@@ -704,9 +717,6 @@ public class ContextFixture implements TestFixture<Context> {
    private final KeyguardManager mKeyguardManager = mock(KeyguardManager.class);
    private final VcnManager mVcnManager = mock(VcnManager.class);
    private final NetworkPolicyManager mNetworkPolicyManager = mock(NetworkPolicyManager.class);

    private final ContentProvider mContentProvider = spy(new FakeContentProvider());

    private final Configuration mConfiguration = new Configuration();
    private final DisplayMetrics mDisplayMetrics = new DisplayMetrics();
    private final SharedPreferences mSharedPreferences = PreferenceManager
@@ -765,11 +775,6 @@ public class ContextFixture implements TestFixture<Context> {

        mDisplayMetrics.density = 2.25f;
        doReturn(mDisplayMetrics).when(mResources).getDisplayMetrics();
        mContentResolver.addProvider(Settings.AUTHORITY, mContentProvider);
        // Settings caches the provider after first get/set call, this is needed to make sure
        // Settings is using mContentProvider as the cached provider across all tests.
        Settings.Global.getInt(mContentResolver, Settings.Global.AIRPLANE_MODE_ON, 0);
        mContentResolver.addProvider(ServiceStateTable.AUTHORITY, mContentProvider);
        mPermissionTable.add(PERMISSION_ENABLE_ALL);
    }

+17 −2
Original line number Diff line number Diff line
@@ -27,12 +27,14 @@ import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.spy;

import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.app.KeyguardManager;
import android.app.usage.NetworkStatsManager;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.Context;
import android.content.IIntentSender;
@@ -63,6 +65,7 @@ import android.permission.LegacyPermissionManager;
import android.provider.BlockedNumberContract;
import android.provider.DeviceConfig;
import android.provider.Settings;
import android.provider.Telephony;
import android.telephony.AccessNetworkConstants;
import android.telephony.CarrierConfigManager;
import android.telephony.CellIdentity;
@@ -376,6 +379,7 @@ public abstract class TelephonyTest {
    protected ContextFixture mContextFixture;
    protected Context mContext;
    protected FakeBlockedNumberContentProvider mFakeBlockedNumberContentProvider;
    private final ContentProvider mContentProvider = spy(new ContextFixture.FakeContentProvider());
    private Object mLock = new Object();
    private boolean mReady;
    protected HashMap<String, IBinder> mServiceManagerMockedServices = new HashMap<>();
@@ -495,6 +499,14 @@ public abstract class TelephonyTest {
        mFakeBlockedNumberContentProvider = new FakeBlockedNumberContentProvider();
        ((MockContentResolver)mContext.getContentResolver()).addProvider(
                BlockedNumberContract.AUTHORITY, mFakeBlockedNumberContentProvider);
        ((MockContentResolver) mContext.getContentResolver()).addProvider(
                Settings.AUTHORITY, mContentProvider);
        ((MockContentResolver) mContext.getContentResolver()).addProvider(
                Telephony.ServiceStateTable.AUTHORITY, mContentProvider);
        replaceContentProvider(mContentProvider);

        Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0);

        mPhone.mCi = mSimulatedCommands;
        mCT.mCi = mSimulatedCommands;
        doReturn(mUiccCard).when(mPhone).getUiccCard();
@@ -948,6 +960,10 @@ public abstract class TelephonyTest {
        // restrictions should be enabled; this results in a NPE when DeviceConfig uses
        // Activity.currentActivity.getContentResolver as the resolver for Settings.Config.getString
        // since the IContentProvider in the NameValueCache's provider holder is null.
        replaceContentProvider(new FakeSettingsConfigProvider());
    }

    private void replaceContentProvider(ContentProvider contentProvider) throws Exception {
        Class c = Class.forName("android.provider.Settings$Config");
        Field field = c.getDeclaredField("sNameValueCache");
        field.setAccessible(true);
@@ -958,10 +974,9 @@ public abstract class TelephonyTest {
        field.setAccessible(true);
        Object providerHolder = field.get(cache);

        FakeSettingsConfigProvider fakeSettingsProvider = new FakeSettingsConfigProvider();
        field = MockContentProvider.class.getDeclaredField("mIContentProvider");
        field.setAccessible(true);
        Object iContentProvider = field.get(fakeSettingsProvider);
        Object iContentProvider = field.get(contentProvider);

        replaceInstance(Class.forName("android.provider.Settings$ContentProviderHolder"),
                "mContentProvider", providerHolder, iContentProvider);