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

Commit 4ea9a4ec authored by Prasanth Kamuju's avatar Prasanth Kamuju Committed by Linux Build Service Account
Browse files

frameworks/base: activity pause/stop event triggers

Framework notifies about the app activity state changes for pause, stop.

Change-Id: I312ba09e7bb89c412660138aaeddd19ac1ecba5b
parent 514cce30
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -88,8 +88,28 @@ public class ActivityTrigger
        native_at_resumeActivity(activity);
    }

    public void activityPauseTrigger(Intent intent, ActivityInfo acInfo, ApplicationInfo appInfo) {
        ComponentName cn = intent.getComponent();
        String activity = null;
        Log.d(TAG, "ActivityTrigger activityPauseTrigger ");
        if (null != cn && null != appInfo)
            activity = cn.flattenToString() + "/" + appInfo.versionCode;
        native_at_pauseActivity(activity);
    }

    public void activityStopTrigger(Intent intent, ActivityInfo acInfo, ApplicationInfo appInfo) {
        ComponentName cn = intent.getComponent();
        String activity = null;
        Log.d(TAG, "ActivityTrigger activityStopTrigger ");
        if (null != cn && null != appInfo)
            activity = cn.flattenToString() + "/" + appInfo.versionCode;
        native_at_stopActivity(activity);
    }

    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);
    private native void native_at_stopActivity(String activity);
    private native void native_at_deinit();
    private native void native_at_startProcessActivity(String process, int pid);
}
+54 −4
Original line number Diff line number Diff line
@@ -54,6 +54,8 @@ typedef struct dlLibHandler {
    void *dlhandle;
    void (*startActivity)(const char *, int *);
    void (*resumeActivity)(const char *);
    void (*pauseActivity)(const char *);
    void (*stopActivity)(const char *);
    void (*init)(void);
    void (*deinit)(void);
    void (*startProcessActivity)(const char *, int);
@@ -65,12 +67,13 @@ 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,
     "ro.vendor.at_library"},
    {NULL, NULL, NULL, NULL, NULL, NULL,
     "ro.vendor.gt_library"}
    {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
     "ro.vendor.gt_library"},
};

static size_t gTotalNumLibs = 0;
// ----------------------------------------------------------------------------

static void
@@ -81,7 +84,7 @@ com_android_internal_app_ActivityTrigger_native_at_init()
    bool errored = false;
    size_t numlibs = 0;

    numlibs = sizeof (mDlLibHandlers) / sizeof (*mDlLibHandlers);
    gTotalNumLibs = numlibs = sizeof (mDlLibHandlers) / sizeof (*mDlLibHandlers);

    for(size_t i = 0; i < numlibs; i++) {
        errored = false;
@@ -115,6 +118,18 @@ com_android_internal_app_ActivityTrigger_native_at_init()
                errored = true;
            }
        }
        if (!errored) {
            *(void **) (&mDlLibHandlers[i].pauseActivity) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_pause");
            if ((rc = dlerror()) != NULL) {
                errored = true;
            }
        }
        if (!errored) {
            *(void **) (&mDlLibHandlers[i].stopActivity) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_stop");
            if ((rc = dlerror()) != NULL) {
                errored = true;
            }
        }
        if (!errored) {
            *(void **) (&mDlLibHandlers[i].init) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_init");
            if ((rc = dlerror()) != NULL) {
@@ -131,11 +146,14 @@ com_android_internal_app_ActivityTrigger_native_at_init()
        if (errored) {
            mDlLibHandlers[i].startActivity  = NULL;
            mDlLibHandlers[i].resumeActivity = NULL;
            mDlLibHandlers[i].pauseActivity  = NULL;
            mDlLibHandlers[i].stopActivity = NULL;
            mDlLibHandlers[i].startProcessActivity = NULL;
            if (mDlLibHandlers[i].dlhandle) {
                dlclose(mDlLibHandlers[i].dlhandle);
                mDlLibHandlers[i].dlhandle = NULL;
            }
            gTotalNumLibs = 0;
        } else {
            (*mDlLibHandlers[i].init)();
        }
@@ -151,6 +169,8 @@ com_android_internal_app_ActivityTrigger_native_at_deinit(JNIEnv *env, jobject c
        if (mDlLibHandlers[i].dlhandle) {
            mDlLibHandlers[i].startActivity  = NULL;
            mDlLibHandlers[i].resumeActivity = NULL;
            mDlLibHandlers[i].pauseActivity  = NULL;
            mDlLibHandlers[i].stopActivity = NULL;
            mDlLibHandlers[i].startProcessActivity = NULL;

            *(void **) (&mDlLibHandlers[i].deinit) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_deinit");
@@ -162,6 +182,7 @@ com_android_internal_app_ActivityTrigger_native_at_deinit(JNIEnv *env, jobject c
            mDlLibHandlers[i].dlhandle = NULL;
        }
    }
    gTotalNumLibs = 0;
}

static void
@@ -210,11 +231,40 @@ com_android_internal_app_ActivityTrigger_native_at_resumeActivity(JNIEnv *env, j
    }
}

static void
com_android_internal_app_ActivityTrigger_native_at_pauseActivity(JNIEnv *env, jobject clazz, jstring activity)
{
    for(size_t i = 0; i < gTotalNumLibs; i++){
        if(mDlLibHandlers[i].pauseActivity && activity) {
            const char *actStr = env->GetStringUTFChars(activity, NULL);
            if ( NULL != actStr) {
                (*mDlLibHandlers[i].pauseActivity)(actStr);
                env->ReleaseStringUTFChars(activity, actStr);
            }
        }
    }
}

static void
com_android_internal_app_ActivityTrigger_native_at_stopActivity(JNIEnv *env, jobject clazz, jstring activity)
{
    for(size_t i = 0; i < gTotalNumLibs; i++){
        if(mDlLibHandlers[i].stopActivity && activity) {
            const char *actStr = env->GetStringUTFChars(activity, NULL);
            if (NULL != actStr) {
                (*mDlLibHandlers[i].stopActivity)(actStr);
                env->ReleaseStringUTFChars(activity, actStr);
            }
        }
    }
}
// ----------------------------------------------------------------------------

static JNINativeMethod gMethods[] = {
    {"native_at_startActivity",  "(Ljava/lang/String;I)I", (void *)com_android_internal_app_ActivityTrigger_native_at_startActivity},
    {"native_at_resumeActivity", "(Ljava/lang/String;)V", (void *)com_android_internal_app_ActivityTrigger_native_at_resumeActivity},
    {"native_at_pauseActivity", "(Ljava/lang/String;)V", (void *)com_android_internal_app_ActivityTrigger_native_at_pauseActivity},
    {"native_at_stopActivity", "(Ljava/lang/String;)V", (void *)com_android_internal_app_ActivityTrigger_native_at_stopActivity},
    {"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},
};
+7 −0
Original line number Diff line number Diff line
@@ -1105,6 +1105,9 @@ final class ActivityStack {

        if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to PAUSING: " + prev);
        else if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Start pausing: " + prev);

        mActivityTrigger.activityPauseTrigger(prev.intent, prev.info, prev.appInfo);

        mResumedActivity = null;
        mPausingActivity = prev;
        mLastPausedActivity = prev;
@@ -3246,11 +3249,15 @@ final class ActivityStack {
            r.resumeKeyDispatchingLocked();
            try {
                r.stopped = false;

                if (DEBUG_STATES) Slog.v(TAG_STATES,
                        "Moving to STOPPING: " + r + " (stop requested)");
                r.state = ActivityState.STOPPING;
                if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY,
                        "Stopping visible=" + r.visible + " for " + r);

                mActivityTrigger.activityStopTrigger(r.intent, r.info, r.appInfo);

                if (!r.visible) {
                    mWindowManager.setAppVisibility(r.appToken, false);
                }