1 /* 2 * Copyright (C) 2020 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 com.android.internal.listeners; 18 19 import android.annotation.Nullable; 20 21 import java.util.Objects; 22 import java.util.concurrent.Executor; 23 import java.util.function.Consumer; 24 25 /** 26 * A listener transport object which can run listener operations on an executor. 27 * 28 * @param <TListener> listener type 29 */ 30 public interface ListenerTransport<TListener> { 31 32 /** 33 * Should return a valid listener until {@link #unregister()} is invoked, and must return 34 * null after that. Recommended (but not required) that this is implemented via a volatile 35 * variable. 36 */ getListener()37 @Nullable TListener getListener(); 38 39 /** 40 * Must be implemented so that {@link #getListener()} returns null after this is invoked. 41 */ unregister()42 void unregister(); 43 44 /** 45 * Executes the given operation for the listener. 46 */ execute(Executor executor, Consumer<TListener> operation)47 default void execute(Executor executor, Consumer<TListener> operation) { 48 Objects.requireNonNull(operation); 49 50 if (getListener() == null) { 51 return; 52 } 53 54 executor.execute(() -> { 55 TListener listener = getListener(); 56 if (listener == null) { 57 return; 58 } 59 60 operation.accept(listener); 61 }); 62 } 63 } 64