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

Commit f1e62eef authored by Guntawee Tiwapong's avatar Guntawee Tiwapong
Browse files

Add Connectivity Engine (CnE) WQE support

Enhanced connectivity features viz. Wifi Quality Estimation.
Supports dual network mode - wifi & mobile simultaneously.
Use QcConnectivityService when CnE is enabled for all CnE features.

Change-Id: I14b02e21515bfc1b5fd2fc4f28e5190fa80f83f8

server: Initialize ConnectivityService on low memory device

Skip initialization of QcConnectivityService and
use ConnectivityService.java for a low memory device

CRs-Fixed: 531430

Change-Id: I2111ec32f6e40ca79b7fc91ec4cef97ac27f3b3a
parent e79e09fe
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
/*
/*
 * Copyright (c) 2012, 2013. The Linux Foundation. All rights reserved.
 * Not a Contribution.
 * Copyright (C) 2008 The Android Open Source Project
 * Copyright (C) 2008 The Android Open Source Project
 *
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * Licensed under the Apache License, Version 2.0 (the "License");
@@ -429,6 +431,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {


    TelephonyManager mTelephonyManager;
    TelephonyManager mTelephonyManager;


    protected ConnectivityService() { }

    public ConnectivityService(Context context, INetworkManagementService netd,
    public ConnectivityService(Context context, INetworkManagementService netd,
            INetworkStatsService statsService, INetworkPolicyManager policyManager) {
            INetworkStatsService statsService, INetworkPolicyManager policyManager) {
        // Currently, omitting a NetworkFactory will create one internally
        // Currently, omitting a NetworkFactory will create one internally
@@ -3695,7 +3699,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
     * be done whenever a better abstraction is developed.
     * be done whenever a better abstraction is developed.
     */
     */
    public class VpnCallback {
    public class VpnCallback {
        private VpnCallback() {
        protected VpnCallback() {
        }
        }


        public void onStateChanged(NetworkInfo info) {
        public void onStateChanged(NetworkInfo info) {
@@ -4831,4 +4835,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
        long wakeupTime = SystemClock.elapsedRealtime() + timeoutInMilliseconds;
        long wakeupTime = SystemClock.elapsedRealtime() + timeoutInMilliseconds;
        mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, wakeupTime, intent);
        mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, wakeupTime, intent);
    }
    }

    protected void updateBlockedUids(int uid, boolean isBlocked) {
    }
}
}
+52 −40
Original line number Original line Diff line number Diff line
@@ -30,10 +30,13 @@ import android.content.res.Configuration;
import android.media.AudioService;
import android.media.AudioService;
import android.net.wifi.p2p.WifiP2pService;
import android.net.wifi.p2p.WifiP2pService;
import android.os.Environment;
import android.os.Environment;
import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService;
import android.os.IBinder;
import android.os.IBinder;
import android.os.Handler;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Looper;
import android.os.INetworkManagementService;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager;
import android.os.StrictMode;
import android.os.StrictMode;
@@ -50,6 +53,7 @@ import android.view.WindowManager;
import com.android.internal.R;
import com.android.internal.R;
import com.android.internal.os.BinderInternal;
import com.android.internal.os.BinderInternal;
import com.android.internal.os.SamplingProfilerIntegration;
import com.android.internal.os.SamplingProfilerIntegration;
import com.android.internal.util.MemInfoReader;
import com.android.server.accessibility.AccessibilityManagerService;
import com.android.server.accessibility.AccessibilityManagerService;
import com.android.server.accounts.AccountManagerService;
import com.android.server.accounts.AccountManagerService;
import com.android.server.am.ActivityManagerService;
import com.android.server.am.ActivityManagerService;
@@ -143,7 +147,7 @@ class ServerThread {
        NetworkStatsService networkStats = null;
        NetworkStatsService networkStats = null;
        NetworkPolicyManagerService networkPolicy = null;
        NetworkPolicyManagerService networkPolicy = null;
        ConnectivityService connectivity = null;
        ConnectivityService connectivity = null;
        Object cneObj = null;
        Object qcCon = null;
        WifiP2pService wifiP2p = null;
        WifiP2pService wifiP2p = null;
        WifiService wifi = null;
        WifiService wifi = null;
        NsdService serviceDiscovery= null;
        NsdService serviceDiscovery= null;
@@ -523,43 +527,40 @@ class ServerThread {
                }
                }


               try {
               try {
                    Slog.i(TAG, "Connectivity Service");
                   int enableCne = 1;
                    connectivity = new ConnectivityService(
                   if (!deviceHasSufficientMemory()) {
                       enableCne = SystemProperties.getInt("persist.cne.override.memlimit", 0);
                   }
                   int cneFeature = (enableCne == 1) ?
                       SystemProperties.getInt("persist.cne.feature", 0) : 0;

                   if ( cneFeature > 0 && cneFeature < 7 ) {
                       Slog.i(TAG, "QcConnectivity Service");
                       PathClassLoader qcsClassLoader =
                           new PathClassLoader("/system/framework/services-ext.jar",
                                   ClassLoader.getSystemClassLoader());
                       Class qcsClass =
                           qcsClassLoader.loadClass("com.android.server.QcConnectivityService");
                       Constructor qcsConstructor = qcsClass.getConstructor
                           (new Class[] {Context.class, INetworkManagementService.class,
                            INetworkStatsService.class, INetworkPolicyManager.class});
                       qcCon = qcsConstructor.newInstance(
                               context, networkManagement, networkStats, networkPolicy);
                               context, networkManagement, networkStats, networkPolicy);
                       connectivity = (ConnectivityService) qcCon;
                   } else {
                       Slog.i(TAG, "Connectivity Service");
                       connectivity = new ConnectivityService( context, networkManagement,
                               networkStats, networkPolicy);
                   }
                   if (connectivity != null) {
                       ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
                       ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
                       networkStats.bindConnectivityManager(connectivity);
                       networkStats.bindConnectivityManager(connectivity);
                       networkPolicy.bindConnectivityManager(connectivity);
                       networkPolicy.bindConnectivityManager(connectivity);

                    wifiP2p.connectivityServiceReady();
                       wifi.checkAndStartWifi();
                       wifi.checkAndStartWifi();
                } catch (Throwable e) {
                       wifiP2p.connectivityServiceReady();
                    reportWtf("starting Connectivity Service", e);
                }

                try {
                    int value = SystemProperties.getInt("persist.cne.feature", 0);
                    if(value > 0) {
                        try {
                            PathClassLoader cneClassLoader =
                                new PathClassLoader("/system/framework/com.quicinc.cne.jar",
                                        ClassLoader.getSystemClassLoader());
                            Class cneClass = cneClassLoader.loadClass("com.quicinc.cne.CNE");
                            Constructor cneConstructor = cneClass.getConstructor
                                (new Class[] {Context.class, Handler.class});
                            cneObj = cneConstructor.newInstance(context, null);
                        } catch (Exception e) {
                            Slog.e(TAG,"Failed to load CNE class", e);
                            cneObj = null;
                            reportWtf("Creating Connectivity Engine Service", e);
                        }
                        if (cneObj != null && (cneObj instanceof IBinder)) {
                            ServiceManager.addService("cneservice", (IBinder)cneObj);
                            Slog.i(TAG, "starting cneservice");
                        }
                   }
                   }
               } catch (Throwable e) {
               } catch (Throwable e) {
                    Slog.e(TAG,"Loading CNEService failed: ", e);
                   reportWtf("starting Connectivity Service", e);
                    reportWtf("starting Connectivity Engine Service", e);
               }
               }


                try {
                try {
@@ -1129,6 +1130,17 @@ class ServerThread {
        //Slog.d(TAG, "Starting service: " + intent);
        //Slog.d(TAG, "Starting service: " + intent);
        context.startServiceAsUser(intent, UserHandle.OWNER);
        context.startServiceAsUser(intent, UserHandle.OWNER);
    }
    }

    private static final boolean deviceHasSufficientMemory() {
        final long MEMORY_SIZE_MIN = 512 * 1024 * 1024;

        MemInfoReader minfo = new MemInfoReader();
        minfo.readMemInfo();
        if (minfo.getTotalSize() <= MEMORY_SIZE_MIN) {
            return false;
        }
        return true;
    }
}
}


public class SystemServer {
public class SystemServer {