From b050ab8a78e306f9d7bc7864438504fab9cadcd0 Mon Sep 17 00:00:00 2001 From: Jerry Chang Date: Tue, 10 Mar 2020 10:21:27 +0800 Subject: [PATCH] Prevent dream service finishSelf before it was attached Bring back stopSelf logic to prevent dream service finishSelf before any token attached. Fix: 150818348 Test: manual test, won't throw exp while leaving dream service. Merged-In: I31bb4f32013b9fa0aa2263b94117060e4d3a7341 Change-Id: I31bb4f32013b9fa0aa2263b94117060e4d3a7341 --- .../android/service/dreams/DreamService.java | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index e70311fb9429d..efe28d9b544a7 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -906,22 +906,27 @@ public class DreamService extends Service implements Window.Callback { if (!mActivity.isFinishing()) { // In case the activity is not finished yet, do it now. mActivity.finishAndRemoveTask(); - return; } - } else if (!mWindowless) { - Slog.w(TAG, "Finish was called before the dream was attached."); + return; } - if (!mFinished) { - mFinished = true; + if (mFinished) { + return; + } + mFinished = true; - try { - // finishSelf will unbind the dream controller from the dream service. This will - // trigger DreamService.this.onDestroy and DreamService.this will die. - mDreamManager.finishSelf(mDreamToken, true /*immediate*/); - } catch (RemoteException ex) { - // system server died - } + if (mDreamToken == null) { + Slog.w(TAG, "Finish was called before the dream was attached."); + stopSelf(); + return; + } + + try { + // finishSelf will unbind the dream controller from the dream service. This will + // trigger DreamService.this.onDestroy and DreamService.this will die. + mDreamManager.finishSelf(mDreamToken, true /*immediate*/); + } catch (RemoteException ex) { + // system server died } }