blob: 15b6f9735bf17bae3174534ef1388a2fc384460f [file] [log] [blame]
/*
* Copyright (C) 2020 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 static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER;
import android.content.res.Resources;
import android.text.TextUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Policy that manages DisplayAreas.
*/
public abstract class DisplayAreaPolicy {
protected final WindowManagerService mWmService;
protected final DisplayContent mContent;
/**
* The root DisplayArea. Attach all DisplayAreas to this area (directly or indirectly).
*/
protected final DisplayArea.Root mRoot;
/**
* The IME container. The IME's windows are automatically added to this container.
*/
protected final DisplayArea<? extends WindowContainer> mImeContainer;
/**
* The task display areas. Tasks etc. are automatically added to these containers.
*/
protected final List<TaskDisplayArea> mTaskDisplayAreas;
/**
* Construct a new {@link DisplayAreaPolicy}
*
* @param wmService the window manager service instance
* @param content the display content for which the policy applies
* @param root the root display area under which the policy operates
* @param imeContainer the ime container that the policy must attach
* @param taskDisplayAreas the task display areas that the policy must attach
*
* @see #attachDisplayAreas()
*/
protected DisplayAreaPolicy(WindowManagerService wmService,
DisplayContent content, DisplayArea.Root root,
DisplayArea<? extends WindowContainer> imeContainer,
List<TaskDisplayArea> taskDisplayAreas) {
mWmService = wmService;
mContent = content;
mRoot = root;
mImeContainer = imeContainer;
mTaskDisplayAreas = taskDisplayAreas;
}
/**
* Called to ask the policy to set up the DisplayArea hierarchy. At a minimum this must:
*
* - attach mImeContainer to mRoot (or one of its descendants)
* - attach mTaskStacks to mRoot (or one of its descendants)
*
* Additionally, this is the right place to set up any other DisplayAreas as desired.
*/
public abstract void attachDisplayAreas();
/**
* Called to ask the policy to attach the given WindowToken to the DisplayArea hierarchy.
*
* This must attach the token to mRoot (or one of its descendants).
*/
public abstract void addWindow(WindowToken token);
/**
* @return the number of task display areas on the display.
*/
public int getTaskDisplayAreaCount() {
return mTaskDisplayAreas.size();
}
/**
* @return the task display area at index.
*/
public TaskDisplayArea getTaskDisplayAreaAt(int index) {
return mTaskDisplayAreas.get(index);
}
/** Provider for platform-default display area policy. */
static final class DefaultProvider implements DisplayAreaPolicy.Provider {
@Override
public DisplayAreaPolicy instantiate(WindowManagerService wmService,
DisplayContent content, DisplayArea.Root root,
DisplayArea<? extends WindowContainer> imeContainer) {
final TaskDisplayArea defaultTaskDisplayArea = new TaskDisplayArea(content, wmService,
"DefaultTaskDisplayArea", FEATURE_DEFAULT_TASK_CONTAINER);
final List<TaskDisplayArea> tdaList = new ArrayList<>();
tdaList.add(defaultTaskDisplayArea);
return new DisplayAreaPolicyBuilder()
.build(wmService, content, root, imeContainer, tdaList);
}
}
/**
* Provider for {@link DisplayAreaPolicy} instances.
*
* By implementing this interface and overriding the
* {@code config_deviceSpecificDisplayAreaPolicyProvider}, a device-specific implementations
* of {@link DisplayAreaPolicy} can be supplied.
*/
public interface Provider {
/**
* Instantiate a new DisplayAreaPolicy.
*
* @see DisplayAreaPolicy#DisplayAreaPolicy
*/
DisplayAreaPolicy instantiate(WindowManagerService wmService,
DisplayContent content, DisplayArea.Root root,
DisplayArea<? extends WindowContainer> imeContainer);
/**
* Instantiate the device-specific {@link Provider}.
*/
static Provider fromResources(Resources res) {
String name = res.getString(
com.android.internal.R.string.config_deviceSpecificDisplayAreaPolicyProvider);
if (TextUtils.isEmpty(name)) {
return new DisplayAreaPolicy.DefaultProvider();
}
try {
return (Provider) Class.forName(name).newInstance();
} catch (ReflectiveOperationException | ClassCastException e) {
throw new IllegalStateException("Couldn't instantiate class " + name
+ " for config_deviceSpecificDisplayAreaPolicyProvider:"
+ " make sure it has a public zero-argument constructor"
+ " and implements DisplayAreaPolicy.Provider", e);
}
}
}
}