blob: 3d9b163875251540e188d0a79ff79582a05ac0c1 [file] [log] [blame]
package org.robolectric.shadows;
import static org.robolectric.shadow.api.Shadow.directlyOn;
import android.app.ActivityManager;
import android.app.IActivityManager;
import android.content.pm.ConfigurationInfo;
import android.os.Process;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.RealObject;
import org.robolectric.annotation.Resetter;
import org.robolectric.util.ReflectionHelpers;
@Implements(ActivityManager.class)
public class ShadowActivityManager {
private int memoryClass = 16;
private String backgroundPackage;
private ActivityManager.MemoryInfo memoryInfo;
private final List<ActivityManager.RunningTaskInfo> tasks = new CopyOnWriteArrayList<>();
private final List<ActivityManager.RunningServiceInfo> services = new CopyOnWriteArrayList<>();
private static List<ActivityManager.RunningAppProcessInfo> processes =
new CopyOnWriteArrayList<>();
@RealObject private ActivityManager realObject;
private Boolean isLowRamDeviceOverride = null;
public ShadowActivityManager() {
ActivityManager.RunningAppProcessInfo processInfo = new ActivityManager.RunningAppProcessInfo();
fillInProcessInfo(processInfo);
processInfo.processName = RuntimeEnvironment.application.getPackageName();
processInfo.pkgList = new String[] {RuntimeEnvironment.application.getPackageName()};
processes.add(processInfo);
}
@Implementation
public int getMemoryClass() {
return memoryClass;
}
@Implementation
public static boolean isUserAMonkey() {
return false;
}
@Implementation
public List<ActivityManager.RunningTaskInfo> getRunningTasks(int maxNum) {
return tasks;
}
@Implementation
public List<ActivityManager.RunningServiceInfo> getRunningServices(int maxNum) {
return services;
}
@Implementation
public List<ActivityManager.RunningAppProcessInfo> getRunningAppProcesses() {
// This method is explicitly documented not to return an empty list
if (processes.isEmpty()) {
return null;
}
return processes;
}
/** Returns information seeded by {@link #setProcesses}. */
@Implementation
protected static void getMyMemoryState(ActivityManager.RunningAppProcessInfo inState) {
fillInProcessInfo(inState);
for (ActivityManager.RunningAppProcessInfo info : processes) {
if (info.pid == Process.myPid()) {
inState.importance = info.importance;
inState.lru = info.lru;
inState.importanceReasonCode = info.importanceReasonCode;
inState.importanceReasonPid = info.importanceReasonPid;
inState.lastTrimLevel = info.lastTrimLevel;
inState.pkgList = info.pkgList;
inState.processName = info.processName;
}
}
}
private static void fillInProcessInfo(ActivityManager.RunningAppProcessInfo processInfo) {
processInfo.pid = Process.myPid();
processInfo.uid = Process.myUid();
}
@Implementation
public void killBackgroundProcesses(String packageName) {
backgroundPackage = packageName;
}
@Implementation
public void getMemoryInfo(ActivityManager.MemoryInfo outInfo) {
if (memoryInfo != null) {
outInfo.availMem = memoryInfo.availMem;
outInfo.lowMemory = memoryInfo.lowMemory;
outInfo.threshold = memoryInfo.threshold;
outInfo.totalMem = memoryInfo.totalMem;
}
}
@Implementation
public android.content.pm.ConfigurationInfo getDeviceConfigurationInfo() {
return new ConfigurationInfo();
}
/**
* @param tasks List of running tasks.
*/
public void setTasks(List<ActivityManager.RunningTaskInfo> tasks) {
this.tasks.clear();
this.tasks.addAll(tasks);
}
/**
* @param services List of running services.
*/
public void setServices(List<ActivityManager.RunningServiceInfo> services) {
this.services.clear();
this.services.addAll(services);
}
/**
* @param processes List of running processes.
*/
public void setProcesses(List<ActivityManager.RunningAppProcessInfo> processes) {
this.processes.clear();
this.processes.addAll(processes);
}
/**
* @return Get the package name of the last background processes killed.
*/
public String getBackgroundPackage() {
return backgroundPackage;
}
/**
* @param memoryClass Set the application's memory class.
*/
public void setMemoryClass(int memoryClass) {
this.memoryClass = memoryClass;
}
/**
* @param memoryInfo Set the application's memory info.
*/
public void setMemoryInfo(ActivityManager.MemoryInfo memoryInfo) {
this.memoryInfo = memoryInfo;
}
@Implementation
public static IActivityManager getService() {
return ReflectionHelpers.createNullProxy(IActivityManager.class);
}
@Implementation
public boolean isLowRamDevice() {
if (isLowRamDeviceOverride != null) {
return isLowRamDeviceOverride;
}
return directlyOn(realObject, ActivityManager.class, "isLowRamDevice");
}
/**
* Override the return value of isLowRamDevice().
*/
public ShadowActivityManager setIsLowRamDevice(boolean isLowRamDevice) {
isLowRamDeviceOverride = isLowRamDevice;
return this;
}
@Resetter
public static void reset() {
processes.clear();
}
}