blob: f812b991f5cae66ea833399d7fb885a302f5826a [file] [log] [blame]
/*
* Copyright (C) 2015 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 android.support.test.launcherhelper;
import android.support.test.uiautomator.UiDevice;
import android.util.Log;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Factory class that handles registering of {@link ILauncherStrategy} and providing a suitable
* launcher helper based on current launcher available
*/
public class LauncherStrategyFactory {
private static final String LOG_TAG = LauncherStrategyFactory.class.getSimpleName();
private static LauncherStrategyFactory sInstance;
private UiDevice mUiDevice;
private Map<String, ILauncherStrategy> mInstanceMap;
private Set<Class <? extends ILauncherStrategy>> mKnownLauncherStrategies;
private boolean mIsDeviceSet;
private LauncherStrategyFactory(UiDevice uiDevice) {
mUiDevice = uiDevice;
mInstanceMap = new HashMap<>();
mKnownLauncherStrategies = new HashSet<>();
registerLauncherStrategy(AospLauncherStrategy.class);
registerLauncherStrategy(AutoLauncherStrategy.class);
registerLauncherStrategy(GoogleExperienceLauncherStrategy.class);
registerLauncherStrategy(Launcher3Strategy.class);
registerLauncherStrategy(NexusLauncherStrategy.class);
registerLauncherStrategy(PixelCLauncherStrategy.class);
registerLauncherStrategy(LeanbackLauncherStrategy.class);
registerLauncherStrategy(WearLauncherStrategy.class);
registerLauncherStrategy(TvLauncherStrategy.class);
}
/**
* Retrieves an instance of the {@link LauncherStrategyFactory}
* @param uiDevice
* @return
*/
public static LauncherStrategyFactory getInstance(UiDevice uiDevice) {
if (sInstance == null) {
sInstance = new LauncherStrategyFactory(uiDevice);
}
return sInstance;
}
/**
* Registers an {@link ILauncherStrategy}.
* <p>Note that the registration is by class so that the caller does not need to instantiate
* multiple instances of the same class.
* @param launcherStrategy
*/
public void registerLauncherStrategy(Class<? extends ILauncherStrategy> launcherStrategy) {
// ignore repeated registering attempts
if (!mKnownLauncherStrategies.contains(launcherStrategy)) {
try {
ILauncherStrategy strategy = launcherStrategy.newInstance();
mInstanceMap.put(strategy.getSupportedLauncherPackage(), strategy);
} catch (InstantiationException | IllegalAccessException e) {
Log.e(LOG_TAG, "exception while creating instance: "
+ launcherStrategy.getCanonicalName());
}
}
}
/**
* Retrieves a {@link ILauncherStrategy} that supports the current default launcher
* <p>
* {@link ILauncherStrategy} maybe registered via
* {@link LauncherStrategyFactory#registerLauncherStrategy(Class)} by identifying the
* launcher package name supported
* @throw RuntimeException if no valid launcher strategy is found
* @return
*/
public ILauncherStrategy getLauncherStrategy() {
String launcherPkg = mUiDevice.getLauncherPackageName();
if (mInstanceMap.containsKey(launcherPkg)) {
ILauncherStrategy strategy = mInstanceMap.get(launcherPkg);
if (!mIsDeviceSet) {
strategy.setUiDevice(mUiDevice);
mIsDeviceSet = true;
}
return strategy;
} else {
throw new RuntimeException(String.format(
"Could not find a launcher strategy for package, %s", launcherPkg));
}
}
/**
* Retrieves a {@link ILeanbackLauncherStrategy} that supports the current default launcher
* for TV. Either Leanback Launcher or new TV Launcher
* @return
*/
public ILeanbackLauncherStrategy getLeanbackLauncherStrategy() {
ILauncherStrategy launcherStrategy = getLauncherStrategy();
if (launcherStrategy instanceof ILeanbackLauncherStrategy) {
return (ILeanbackLauncherStrategy)launcherStrategy;
}
throw new RuntimeException("This LauncherStrategy is suitable for TV.");
}
/**
* Retrieves a {@link IAutoLauncherStrategy} that supports the current default auto
* launcher
* @return
*/
public IAutoLauncherStrategy getAutoLauncherStrategy() {
ILauncherStrategy launcherStrategy = getLauncherStrategy();
if (launcherStrategy instanceof IAutoLauncherStrategy) {
return (IAutoLauncherStrategy) launcherStrategy;
}
throw new RuntimeException("This LauncherStrategy is not for auto launcher.");
}
}