| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.server.wifi; |
| |
| import android.os.IBinder; |
| import android.os.IBinder.DeathRecipient; |
| import android.os.RemoteException; |
| import com.android.internal.util.StateMachine; |
| |
| /** |
| * Allows StateMachine instances to subscribe to binder death. |
| * |
| * @hide |
| */ |
| public class StateMachineDeathRecipient implements DeathRecipient { |
| |
| private final StateMachine mStateMachine; |
| private final int mDeathCommand; |
| private IBinder mLinkedBinder; |
| |
| /** |
| * Construct a StateMachineDeathRecipient. |
| * |
| * @param sm StateMachine instance to receive a message upon Binder death. |
| * @param command message to send the state machine. |
| */ |
| public StateMachineDeathRecipient(StateMachine sm, int command) { |
| mStateMachine = sm; |
| mDeathCommand = command; |
| } |
| |
| /** |
| * Listen for the death of a binder. |
| * |
| * This method will unlink from death notifications from any |
| * previously linked IBinder instance. |
| * |
| * @param binder remote object to listen for death. |
| * @return true iff we have successfully subscribed to death notifications of a live |
| * IBinder instance. |
| */ |
| public boolean linkToDeath(IBinder binder) { |
| unlinkToDeath(); |
| try { |
| binder.linkToDeath(this, 0); |
| } catch (RemoteException e) { |
| // The remote has already died. |
| return false; |
| } |
| mLinkedBinder = binder; |
| return true; |
| } |
| |
| /** |
| * Unlink from notifications from the last linked IBinder instance. |
| */ |
| public void unlinkToDeath() { |
| if (mLinkedBinder == null) { |
| return; |
| } |
| mLinkedBinder.unlinkToDeath(this, 0); |
| mLinkedBinder = null; |
| } |
| |
| /** |
| * Called by the binder subsystem upon remote object death. |
| */ |
| @Override |
| public void binderDied() { |
| mStateMachine.sendMessage(mDeathCommand); |
| } |
| } |