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

Commit d841ef62 authored by zfu's avatar zfu Committed by Linux Build Service Account
Browse files

add network related API into ActivityTrigger

This API is used for specific apps, which have
high requirement for the quality of mobile network.
AMS is the right client to trigger this feature.
Hooks are added in several senarios in AMS:
1.app start.
2.app die.
3.device goes to sleep mode.
4.device is in Keyguard mode.
5.WIFI/MOBILE switch.
6.Aipplane mode switch.

Change-Id: I322737edc4d343c36445c91d60d9fb2abe127e75
CRs-Fixed: 1036319
parent 2f1b2812
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -111,6 +111,11 @@ public class ActivityTrigger
        return native_at_animationScalesCheck(activity, scaleType);
    }

    /** &hide */
    public void networkOptsCheck (int flag, int netType, String packageName) {
        native_at_networkOptsCheck(flag, netType, packageName);
    }

    private native int native_at_startActivity(String activity, int flags);
    private native void native_at_resumeActivity(String activity);
    private native void native_at_pauseActivity(String activity);
@@ -118,4 +123,5 @@ public class ActivityTrigger
    private native void native_at_deinit();
    private native void native_at_startProcessActivity(String process, int pid);
    private native float native_at_animationScalesCheck(String activity, int scaleType);
    private native void native_at_networkOptsCheck(int flag, int netType, String packageName);
}
 No newline at end of file
+28 −3
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ typedef struct dlLibHandler {
    void (*pauseActivity)(const char *);
    void (*stopActivity)(const char *);
    void (*animationScalesCheck)(const char *, int, float *);
    void (*networkOptsCheck)(int, int, const char *);
    void (*init)(void);
    void (*deinit)(void);
    void (*startProcessActivity)(const char *, int);
@@ -68,9 +69,9 @@ typedef struct dlLibHandler {
 * library -both handlers for Start and Resume events.
 */
static dlLibHandler mDlLibHandlers[] = {
    {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
     "ro.vendor.at_library"},
    {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
     "ro.vendor.gt_library"},
};

@@ -149,7 +150,12 @@ com_android_internal_app_ActivityTrigger_native_at_init()
                errored = true;
            }
        }

        if (!errored) {
            *(void **) (&mDlLibHandlers[i].networkOptsCheck) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_networkOptsCheck");
            if ((rc = dlerror()) != NULL) {
                errored = true;
            }
        }
        if (errored) {
            mDlLibHandlers[i].startActivity  = NULL;
            mDlLibHandlers[i].resumeActivity = NULL;
@@ -157,6 +163,7 @@ com_android_internal_app_ActivityTrigger_native_at_init()
            mDlLibHandlers[i].stopActivity = NULL;
            mDlLibHandlers[i].startProcessActivity = NULL;
            mDlLibHandlers[i].animationScalesCheck = NULL;
            mDlLibHandlers[i].networkOptsCheck = NULL;
            if (mDlLibHandlers[i].dlhandle) {
                dlclose(mDlLibHandlers[i].dlhandle);
                mDlLibHandlers[i].dlhandle = NULL;
@@ -181,6 +188,7 @@ com_android_internal_app_ActivityTrigger_native_at_deinit(JNIEnv *env, jobject c
            mDlLibHandlers[i].stopActivity = NULL;
            mDlLibHandlers[i].startProcessActivity = NULL;
            mDlLibHandlers[i].animationScalesCheck = NULL;
            mDlLibHandlers[i].networkOptsCheck = NULL;

            *(void **) (&mDlLibHandlers[i].deinit) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_deinit");
            if (mDlLibHandlers[i].deinit) {
@@ -285,6 +293,22 @@ com_android_internal_app_ActivityTrigger_native_at_animationScalesCheck(JNIEnv *
    }
    return scaleValue;
}

static void
com_android_internal_app_ActivityTrigger_native_at_networkOptsCheck(JNIEnv *env, jobject clazz, jint flag, jint netType, jstring packageName)
{
    size_t numlibs = sizeof (mDlLibHandlers) / sizeof (*mDlLibHandlers);

    for (size_t i = 0; i < numlibs; i++) {
        if (mDlLibHandlers[i].networkOptsCheck && packageName) {
            const char *actStr = env->GetStringUTFChars(packageName, NULL);
            if (actStr) {
                (*mDlLibHandlers[i].networkOptsCheck)(flag, netType, actStr);
                env->ReleaseStringUTFChars(packageName, actStr);
            }
        }
    }
}
// ----------------------------------------------------------------------------

static JNINativeMethod gMethods[] = {
@@ -295,6 +319,7 @@ static JNINativeMethod gMethods[] = {
    {"native_at_deinit",         "()V",                   (void *)com_android_internal_app_ActivityTrigger_native_at_deinit},
    {"native_at_startProcessActivity", "(Ljava/lang/String;I)V", (void *)com_android_internal_app_ActivityTrigger_native_at_startProcessActivity},
    {"native_at_animationScalesCheck", "(Ljava/lang/String;I)F", (void *)com_android_internal_app_ActivityTrigger_native_at_animationScalesCheck},
    {"native_at_networkOptsCheck", "(IILjava/lang/String;)V", (void *)com_android_internal_app_ActivityTrigger_native_at_networkOptsCheck},
};


+70 −0
Original line number Diff line number Diff line
@@ -150,6 +150,8 @@ import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.Rect;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Proxy;
import android.net.ProxyInfo;
import android.net.Uri;
@@ -1550,6 +1552,9 @@ public final class ActivityManagerService extends ActivityManagerNative
    boolean mEnableBServicePropagation =
            SystemProperties.getBoolean("ro.sys.fw.bservice_enable", false);
    static final boolean mEnableNetOpts =
            SystemProperties.getBoolean("persist.netopts.enable",false);
    /**
     * Flag whether the current user is a "monkey", i.e. whether
     * the UI is driven by a UI automation tool.
@@ -2929,6 +2934,25 @@ public final class ActivityManagerService extends ActivityManagerNative
        return mAppBindArgs;
    }
    private final void networkOptsCheck(int flag, String packageName) {
        ConnectivityManager connectivityManager =
            (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivityManager != null) {
            NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo();
            if (netInfo != null) {
                /* netType: 0 for Mobile, 1 for WIFI*/
                int netType = netInfo.getType();
                if (mActivityTrigger != null) {
                    mActivityTrigger.networkOptsCheck(flag, netType, packageName);
                }
            } else {
                if (mActivityTrigger != null) {
                    mActivityTrigger.networkOptsCheck(flag, ConnectivityManager.TYPE_NONE, packageName);
                }
            }
        }
    }
    boolean setFocusedActivityLocked(ActivityRecord r, String reason) {
        if (r == null || mFocusedActivity == r) {
            return false;
@@ -2948,6 +2972,10 @@ public final class ActivityManagerService extends ActivityManagerNative
        final ActivityRecord last = mFocusedActivity;
        mFocusedActivity = r;
        if (mEnableNetOpts) {
                networkOptsCheck(0, r.processName);
        }
        if (r.task.isApplicationTask()) {
            if (mCurAppTimeTracker != r.appTimeTracker) {
                // We are switching app tracking.  Complete the current one.
@@ -5189,6 +5217,9 @@ public final class ActivityManagerService extends ActivityManagerNative
                Slog.i(TAG, "Process " + app.processName + " (pid " + pid
                        + ") has died");
                mAllowLowerMemLevel = true;
                if (mEnableNetOpts) {
                    networkOptsCheck(1, app.processName);
                }
            } else {
                // Note that we always want to do oom adj to update our state with the
                // new number of procs.
@@ -6781,6 +6812,27 @@ public final class ActivityManagerService extends ActivityManagerNative
            }
        }, dumpheapFilter);
        if (mEnableNetOpts) {
            IntentFilter netInfoFilter = new IntentFilter();
            netInfoFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
            netInfoFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
            mContext.registerReceiver(new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    ActivityStack stack = mStackSupervisor.getLastStack();
                    if (stack != null) {
                        ActivityRecord r = stack.topRunningActivityLocked();
                        if (r != null) {
                            PowerManager powerManager =
                                (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
                            if (powerManager != null && powerManager.isInteractive())
                                    networkOptsCheck(0, r.processName);
                        }
                    }
                }
            }, netInfoFilter);
        }
        // Let system services know.
        mSystemServiceManager.startBootPhase(SystemService.PHASE_BOOT_COMPLETED);
@@ -21623,6 +21675,15 @@ public final class ActivityManagerService extends ActivityManagerNative
            synchronized (ActivityManagerService.this) {
                SleepTokenImpl token = new SleepTokenImpl(tag);
                mSleepTokens.add(token);
                if (mEnableNetOpts) {
                    ActivityStack stack = mStackSupervisor.getLastStack();
                    if (stack != null) {
                        ActivityRecord r = stack.topRunningActivityLocked();
                        if (r != null) {
                            networkOptsCheck(1, r.processName);
                        }
                    }
                }
                updateSleepIfNeededLocked();
                return token;
            }
@@ -21747,6 +21808,15 @@ public final class ActivityManagerService extends ActivityManagerNative
        public void release() {
            synchronized (ActivityManagerService.this) {
                if (mSleepTokens.remove(this)) {
                    if (mEnableNetOpts) {
                        ActivityStack stack = mStackSupervisor.getLastStack();
                        if (stack != null) {
                            ActivityRecord r = stack.topRunningActivityLocked();
                            if (r != null) {
                                networkOptsCheck(0, r.processName);
                            }
                        }
                    }
                    updateSleepIfNeededLocked();
                }
            }