115 lines
4.9 KiB
Java
Executable File
115 lines
4.9 KiB
Java
Executable File
// Copyright 2013 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
package org.chromium.base;
|
|
|
|
import android.app.Activity;
|
|
import android.content.ComponentCallbacks2;
|
|
import android.content.Context;
|
|
import android.content.res.Configuration;
|
|
|
|
|
|
/**
|
|
* This is an internal implementation of the C++ counterpart.
|
|
* It registers a ComponentCallbacks2 with the system, and dispatches into
|
|
* native for levels that are considered actionable.
|
|
*/
|
|
public class MemoryPressureListener {
|
|
/**
|
|
* Sending an intent with this action to Chrome will cause it to issue a call to onLowMemory
|
|
* thus simulating a low memory situations.
|
|
*/
|
|
private static final String ACTION_LOW_MEMORY = "org.chromium.base.ACTION_LOW_MEMORY";
|
|
|
|
/**
|
|
* Sending an intent with this action to Chrome will cause it to issue a call to onTrimMemory
|
|
* thus simulating a low memory situations.
|
|
*/
|
|
private static final String ACTION_TRIM_MEMORY = "org.chromium.base.ACTION_TRIM_MEMORY";
|
|
|
|
/**
|
|
* Sending an intent with this action to Chrome will cause it to issue a call to onTrimMemory
|
|
* with notification level TRIM_MEMORY_RUNNING_CRITICAL thus simulating a low memory situation
|
|
*/
|
|
private static final String ACTION_TRIM_MEMORY_RUNNING_CRITICAL =
|
|
"org.chromium.base.ACTION_TRIM_MEMORY_RUNNING_CRITICAL";
|
|
|
|
/**
|
|
* Sending an intent with this action to Chrome will cause it to issue a call to onTrimMemory
|
|
* with notification level TRIM_MEMORY_MODERATE thus simulating a low memory situation
|
|
*/
|
|
private static final String ACTION_TRIM_MEMORY_MODERATE =
|
|
"org.chromium.base.ACTION_TRIM_MEMORY_MODERATE";
|
|
|
|
@CalledByNative
|
|
private static void registerSystemCallback(Context context) {
|
|
context.registerComponentCallbacks(
|
|
new ComponentCallbacks2() {
|
|
@Override
|
|
public void onTrimMemory(int level) {
|
|
maybeNotifyMemoryPresure(level);
|
|
}
|
|
|
|
@Override
|
|
public void onLowMemory() {
|
|
nativeOnMemoryPressure(MemoryPressureLevelList.MEMORY_PRESSURE_CRITICAL);
|
|
}
|
|
|
|
@Override
|
|
public void onConfigurationChanged(Configuration configuration) {
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Used by applications to simulate a memory pressure signal. By throwing certain intent
|
|
* actions.
|
|
*/
|
|
public static boolean handleDebugIntent(Activity activity, String action) {
|
|
if (ACTION_LOW_MEMORY.equals(action)) {
|
|
simulateLowMemoryPressureSignal(activity);
|
|
} else if (ACTION_TRIM_MEMORY.equals(action)) {
|
|
simulateTrimMemoryPressureSignal(activity, ComponentCallbacks2.TRIM_MEMORY_COMPLETE);
|
|
} else if (ACTION_TRIM_MEMORY_RUNNING_CRITICAL.equals(action)) {
|
|
simulateTrimMemoryPressureSignal(activity, ComponentCallbacks2.TRIM_MEMORY_MODERATE);
|
|
} else if (ACTION_TRIM_MEMORY_MODERATE.equals(action)) {
|
|
simulateTrimMemoryPressureSignal(activity,
|
|
ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL);
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public static void maybeNotifyMemoryPresure(int level) {
|
|
if (level >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE) {
|
|
nativeOnMemoryPressure(MemoryPressureLevelList.MEMORY_PRESSURE_CRITICAL);
|
|
} else if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND ||
|
|
level == ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL) {
|
|
// Don't notifiy on TRIM_MEMORY_UI_HIDDEN, since this class only
|
|
// dispatches actionable memory pressure signals to native.
|
|
nativeOnMemoryPressure(MemoryPressureLevelList.MEMORY_PRESSURE_MODERATE);
|
|
}
|
|
}
|
|
|
|
private static void simulateLowMemoryPressureSignal(Activity activity) {
|
|
// The Application and the Activity each have a list of callbacks they notify when this
|
|
// method is called. Notifying these will simulate the event at the App/Activity level
|
|
// as well as trigger the listener bound from native in this process.
|
|
activity.getApplication().onLowMemory();
|
|
activity.onLowMemory();
|
|
}
|
|
|
|
private static void simulateTrimMemoryPressureSignal(Activity activity, int level) {
|
|
// The Application and the Activity each have a list of callbacks they notify when this
|
|
// method is called. Notifying these will simulate the event at the App/Activity level
|
|
// as well as trigger the listener bound from native in this process.
|
|
activity.getApplication().onTrimMemory(level);
|
|
activity.onTrimMemory(level);
|
|
}
|
|
|
|
private static native void nativeOnMemoryPressure(int memoryPressureType);
|
|
}
|