1a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa/*
2a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * Copyright (C) 2014 The Android Open Source Project
3a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa *
4a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * Licensed under the Apache License, Version 2.0 (the "License");
5a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * you may not use this file except in compliance with the License.
6a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * You may obtain a copy of the License at
7a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa *
8a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa *      http://www.apache.org/licenses/LICENSE-2.0
9a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa *
10a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * Unless required by applicable law or agreed to in writing, software
11a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * distributed under the License is distributed on an "AS IS" BASIS,
12a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * See the License for the specific language governing permissions and
14a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * limitations under the License
15a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa */
16a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
17a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaapackage android.hardware.location;
18a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
19a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.Manifest;
20a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.content.Context;
21a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.os.RemoteCallbackList;
22a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.os.RemoteException;
23a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.text.TextUtils;
24a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaaimport android.util.Log;
25a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
26a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa/**
27a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * A class that implements an {@link IActivityRecognitionHardware} backed up by the Activity
28a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * Recognition HAL.
29a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa *
30a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa * @hide
31a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa */
32a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaapublic class ActivityRecognitionHardware extends IActivityRecognitionHardware.Stub {
33a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private static final String TAG = "ActivityRecognitionHardware";
34a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
35a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private static final String HARDWARE_PERMISSION = Manifest.permission.LOCATION_HARDWARE;
36a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private static final int INVALID_ACTIVITY_TYPE = -1;
37a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private static final int NATIVE_SUCCESS_RESULT = 0;
38a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
39a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private static ActivityRecognitionHardware sSingletonInstance = null;
40a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private static final Object sSingletonInstanceLock = new Object();
41a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
42a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private final Context mContext;
43a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private final String[] mSupportedActivities;
44a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
45a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private final RemoteCallbackList<IActivityRecognitionHardwareSink> mSinks =
46a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            new RemoteCallbackList<IActivityRecognitionHardwareSink>();
47a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
48a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private static class Event {
49a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        public int activity;
50a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        public int type;
51a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        public long timestamp;
52a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
53a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
54a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private ActivityRecognitionHardware(Context context) {
55a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        nativeInitialize();
56a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
57a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        mContext = context;
58a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        mSupportedActivities = fetchSupportedActivities();
59a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
60a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
61a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    public static ActivityRecognitionHardware getInstance(Context context) {
62a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        synchronized (sSingletonInstanceLock) {
63a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            if (sSingletonInstance == null) {
64a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa                sSingletonInstance = new ActivityRecognitionHardware(context);
65a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            }
66a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
67a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            return sSingletonInstance;
68a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        }
69a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
70a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
71a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    public static boolean isSupported() {
72a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        return nativeIsSupported();
73a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
74a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
75a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    @Override
76a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    public String[] getSupportedActivities() {
77a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        checkPermissions();
78a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        return mSupportedActivities;
79a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
80a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
81a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    @Override
82a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    public boolean isActivitySupported(String activity) {
83a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        checkPermissions();
84a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        int activityType = getActivityType(activity);
85a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        return activityType != INVALID_ACTIVITY_TYPE;
86a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
87a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
88a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    @Override
89a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    public boolean registerSink(IActivityRecognitionHardwareSink sink) {
90a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        checkPermissions();
91a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        return mSinks.register(sink);
92a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
93a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
94a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    @Override
95a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    public boolean unregisterSink(IActivityRecognitionHardwareSink sink) {
96a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        checkPermissions();
97a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        return mSinks.unregister(sink);
98a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
99a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
100a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    @Override
101a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    public boolean enableActivityEvent(String activity, int eventType, long reportLatencyNs) {
102a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        checkPermissions();
103a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
104a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        int activityType = getActivityType(activity);
105a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        if (activityType == INVALID_ACTIVITY_TYPE) {
106a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            return false;
107a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        }
108a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
109a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        int result = nativeEnableActivityEvent(activityType, eventType, reportLatencyNs);
110a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        return result == NATIVE_SUCCESS_RESULT;
111a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
112a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
113a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    @Override
114a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    public boolean disableActivityEvent(String activity, int eventType) {
115a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        checkPermissions();
116a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
117a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        int activityType = getActivityType(activity);
118a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        if (activityType == INVALID_ACTIVITY_TYPE) {
119a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            return false;
120a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        }
121a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
122a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        int result = nativeDisableActivityEvent(activityType, eventType);
123a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        return result == NATIVE_SUCCESS_RESULT;
124a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
125a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
126a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    @Override
127a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    public boolean flush() {
128a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        checkPermissions();
129a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        int result = nativeFlush();
130a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        return result == NATIVE_SUCCESS_RESULT;
131a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
132a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
133a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    /**
134a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa     * Called by the Activity-Recognition HAL.
135a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa     */
136a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private void onActivityChanged(Event[] events) {
1373b0224dc3c2e7ffb93dc56970395003d0e387545destradaa        if (events == null || events.length == 0) {
1383b0224dc3c2e7ffb93dc56970395003d0e387545destradaa            Log.d(TAG, "No events to broadcast for onActivityChanged.");
139a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            return;
140a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        }
141a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
142a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        int eventsLength = events.length;
143a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        ActivityRecognitionEvent activityRecognitionEventArray[] =
144a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa                new ActivityRecognitionEvent[eventsLength];
145a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        for (int i = 0; i < eventsLength; ++i) {
146a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            Event event = events[i];
147a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            String activityName = getActivityName(event.activity);
148a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            activityRecognitionEventArray[i] =
149a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa                    new ActivityRecognitionEvent(activityName, event.type, event.timestamp);
150a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        }
151a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        ActivityChangedEvent activityChangedEvent =
152a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa                new ActivityChangedEvent(activityRecognitionEventArray);
153a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
1543b0224dc3c2e7ffb93dc56970395003d0e387545destradaa        int size = mSinks.beginBroadcast();
155a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        for (int i = 0; i < size; ++i) {
156a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            IActivityRecognitionHardwareSink sink = mSinks.getBroadcastItem(i);
157a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            try {
158a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa                sink.onActivityChanged(activityChangedEvent);
159a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            } catch (RemoteException e) {
160a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa                Log.e(TAG, "Error delivering activity changed event.", e);
161a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            }
162a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        }
163a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        mSinks.finishBroadcast();
164a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
165a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
166a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
167a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private String getActivityName(int activityType) {
168a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        if (activityType < 0 || activityType >= mSupportedActivities.length) {
169a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            String message = String.format(
170a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa                    "Invalid ActivityType: %d, SupportedActivities: %d",
171a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa                    activityType,
172a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa                    mSupportedActivities.length);
173a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            Log.e(TAG, message);
174a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            return null;
175a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        }
176a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
177a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        return mSupportedActivities[activityType];
178a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
179a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
180a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private int getActivityType(String activity) {
181a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        if (TextUtils.isEmpty(activity)) {
182a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            return INVALID_ACTIVITY_TYPE;
183a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        }
184a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
1853b0224dc3c2e7ffb93dc56970395003d0e387545destradaa        int supportedActivitiesLength = mSupportedActivities.length;
1863b0224dc3c2e7ffb93dc56970395003d0e387545destradaa        for (int i = 0; i < supportedActivitiesLength; ++i) {
187a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            if (activity.equals(mSupportedActivities[i])) {
188a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa                return i;
189a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            }
190a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        }
191a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
192a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        return INVALID_ACTIVITY_TYPE;
193a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
194a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
195a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private void checkPermissions() {
196a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        String message = String.format(
197a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa                "Permission '%s' not granted to access ActivityRecognitionHardware",
198a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa                HARDWARE_PERMISSION);
199a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        mContext.enforceCallingPermission(HARDWARE_PERMISSION, message);
200a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
201a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
2023b0224dc3c2e7ffb93dc56970395003d0e387545destradaa    private String[] fetchSupportedActivities() {
203a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        String[] supportedActivities = nativeGetSupportedActivities();
204a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        if (supportedActivities != null) {
205a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            return supportedActivities;
206a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        }
207a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
208a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa        return new String[0];
209a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    }
210a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
211a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    // native bindings
212a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    static { nativeClassInit(); }
213a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa
214a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private static native void nativeClassInit();
215a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa    private static native boolean nativeIsSupported();
2163b0224dc3c2e7ffb93dc56970395003d0e387545destradaa
2173b0224dc3c2e7ffb93dc56970395003d0e387545destradaa    private native void nativeInitialize();
2183b0224dc3c2e7ffb93dc56970395003d0e387545destradaa    private native void nativeRelease();
2193b0224dc3c2e7ffb93dc56970395003d0e387545destradaa    private native String[] nativeGetSupportedActivities();
2203b0224dc3c2e7ffb93dc56970395003d0e387545destradaa    private native int nativeEnableActivityEvent(
221a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            int activityType,
222a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            int eventType,
223a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa            long reportLatenceNs);
2243b0224dc3c2e7ffb93dc56970395003d0e387545destradaa    private native int nativeDisableActivityEvent(int activityType, int eventType);
2253b0224dc3c2e7ffb93dc56970395003d0e387545destradaa    private native int nativeFlush();
226a4fa3b5aa53cf677b623fe346c585cb8a0c1ce26destradaa}
227