1 /*
2  * Copyright 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.view;
18 
19 import com.android.internal.annotations.VisibleForTesting;
20 
21 import java.util.concurrent.Executor;
22 
23 /**
24  * Listens for tunnel mode enabled/disabled events from SurfaceFlinger.
25  * {@hide}
26  */
27 public abstract class TunnelModeEnabledListener {
28 
29     private long mNativeListener;
30     private final Executor mExecutor;
31 
TunnelModeEnabledListener(Executor executor)32     public TunnelModeEnabledListener(Executor executor) {
33         mExecutor = executor;
34         mNativeListener = nativeCreate(this);
35     }
36 
37     /**
38      * Destroys the listener.
39      */
destroy()40     public void destroy() {
41         if (mNativeListener == 0) {
42             return;
43         }
44         unregister(this);
45         nativeDestroy(mNativeListener);
46         mNativeListener = 0;
47     }
48 
49     @Override
finalize()50     protected void finalize() throws Throwable {
51         try {
52             destroy();
53         } finally {
54             super.finalize();
55         }
56     }
57 
58     /**
59      * Reports when tunnel mode has been enabled/disabled.
60      */
onTunnelModeEnabledChanged(boolean tunnelModeEnabled)61     public abstract void onTunnelModeEnabledChanged(boolean tunnelModeEnabled);
62 
63     /**
64      * Registers a listener.
65      */
register(TunnelModeEnabledListener listener)66     public static void register(TunnelModeEnabledListener listener) {
67         if (listener.mNativeListener == 0) {
68             return;
69         }
70         nativeRegister(listener.mNativeListener);
71     }
72 
73     /**
74      * Unregisters a listener.
75      */
unregister(TunnelModeEnabledListener listener)76     public static void unregister(TunnelModeEnabledListener listener) {
77         if (listener.mNativeListener == 0) {
78             return;
79         }
80         nativeUnregister(listener.mNativeListener);
81     }
82 
83     /**
84      * Dispatch tunnel mode enabled.
85      *
86      * Called from native code on a binder thread.
87      */
88     @VisibleForTesting
dispatchOnTunnelModeEnabledChanged(TunnelModeEnabledListener listener, boolean tunnelModeEnabled)89     public static void dispatchOnTunnelModeEnabledChanged(TunnelModeEnabledListener listener,
90             boolean tunnelModeEnabled) {
91         listener.mExecutor.execute(() -> listener.onTunnelModeEnabledChanged(tunnelModeEnabled));
92     }
93 
nativeCreate(TunnelModeEnabledListener thiz)94     private static native long nativeCreate(TunnelModeEnabledListener thiz);
nativeDestroy(long ptr)95     private static native void nativeDestroy(long ptr);
nativeRegister(long ptr)96     private static native void nativeRegister(long ptr);
nativeUnregister(long ptr)97     private static native void nativeUnregister(long ptr);
98 }
99