blob: 3b8631ab3a8e4c1c6c5eb3842220b5316b20dd97 [file] [log] [blame]
/*
* Copyright (C) 2018 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.wm;
import android.annotation.Nullable;
import android.app.ActivityOptions;
import android.os.Handler;
import android.util.ArrayMap;
import android.view.RemoteAnimationAdapter;
/**
* Registry to keep track of remote animations to be run for activity starts from a certain package.
*
* @see ActivityTaskManagerService#registerRemoteAnimationForNextActivityStart
*/
class PendingRemoteAnimationRegistry {
private static final long TIMEOUT_MS = 3000;
private final ArrayMap<String, Entry> mEntries = new ArrayMap<>();
private final Handler mHandler;
private final WindowManagerGlobalLock mLock;
PendingRemoteAnimationRegistry(WindowManagerGlobalLock lock, Handler handler) {
mLock = lock;
mHandler = handler;
}
/**
* Adds a remote animation to be run for all activity starts originating from a certain package.
*/
void addPendingAnimation(String packageName, RemoteAnimationAdapter adapter) {
mEntries.put(packageName, new Entry(packageName, adapter));
}
/**
* Overrides the activity options with a registered remote animation for a certain calling
* package if such a remote animation is registered.
*/
ActivityOptions overrideOptionsIfNeeded(String callingPackage,
@Nullable ActivityOptions options) {
final Entry entry = mEntries.get(callingPackage);
if (entry == null) {
return options;
}
if (options == null) {
options = ActivityOptions.makeRemoteAnimation(entry.adapter);
} else {
options.setRemoteAnimationAdapter(entry.adapter);
}
mEntries.remove(callingPackage);
return options;
}
private class Entry {
final String packageName;
final RemoteAnimationAdapter adapter;
Entry(String packageName, RemoteAnimationAdapter adapter) {
this.packageName = packageName;
this.adapter = adapter;
mHandler.postDelayed(() -> {
synchronized (mLock) {
final Entry entry = mEntries.get(packageName);
if (entry == this) {
mEntries.remove(packageName);
}
}
}, TIMEOUT_MS);
}
}
}