package org.wheelmap.android.app;
//import com.bugsense.trace.BugSenseHandler;
import org.mapsforge.android.maps.MapActivity;
import android.app.ActivityManager;
import android.content.Context;
import android.util.DisplayMetrics;
import de.akquinet.android.androlog.Log;
public class AppCapability {
private static final String TAG = AppCapability.class.getSimpleName();
private final static long MAX_MEMORY_DIVISOR = 1024 * 1024;
private final static int MAPSFORGE_MEMCACHE_CAPACITY_MAX = 16;
private final static int MAPSFORGE_MEMCACHE_CAPACITY_MED = 8;
private final static int MAPSFORGE_MEMCACHE_CAPACITY_MIN = 0;
private static int sMemoryClass;
private static int sMaxMemoryMB;
private static Capability sCapability;
public static void init(Context context) {
getMemoryInfo(context);
calcOverallCapability(context);
setMapsforgeSharedMemcacheSize();
setAcraData();
}
private static void getMemoryInfo(Context context) {
sMaxMemoryMB = (int) (Runtime.getRuntime().maxMemory() / MAX_MEMORY_DIVISOR);
Log.d(TAG, "mMaxMemoryMB = " + sMaxMemoryMB);
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
sMemoryClass = am.getMemoryClass();
Log.d(TAG, "memoryClass = " + sMemoryClass);
}
private static void calcOverallCapability(Context context) {
DisplayMetrics displaymetrics = context.getResources().getDisplayMetrics();
Log.d(TAG, "Screen density is = " + displaymetrics.densityDpi);
if (displaymetrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM) {
calcCapabilityLevel(new MediumDensityMemoryLimits());
} else if (displaymetrics.densityDpi == DisplayMetrics.DENSITY_LOW) {
calcCapabilityLevel(new LowDensityMemoryLimits());
} else {
calcCapabilityLevel(new HighDensityMemoryLimits());
}
}
private static void calcCapabilityLevel(MemoryLimits memoryLimits) {
// Log.d( TAG, "Limits: full = " + memoryLimits.FULL + " degraded min " + memoryLimits.DEGRADED_MIN + " degraded max " + memoryLimits.DEGRADED_MAX);
if (sMaxMemoryMB >= memoryLimits.FULL) {
sCapability = Capability.FULL;
} else if (sMaxMemoryMB < memoryLimits.FULL
&& sMaxMemoryMB >= memoryLimits.DEGRADED_MIN) {
sCapability = Capability.DEGRADED_MIN;
} else if (sMaxMemoryMB < memoryLimits.DEGRADED_MIN
&& sMaxMemoryMB >= memoryLimits.DEGRADED_MAX) {
sCapability = Capability.DEGRADED_MAX;
} else {
sCapability = Capability.NOTWORKING;
}
Log.d(TAG,
"Capability Levels = " + sCapability.name() + " with heap mem = " + sMaxMemoryMB);
}
private static void setMapsforgeSharedMemcacheSize() {
int capacity;
if (sCapability == Capability.FULL) {
capacity = MAPSFORGE_MEMCACHE_CAPACITY_MAX;
} else if (sCapability == Capability.DEGRADED_MAX) {
capacity = MAPSFORGE_MEMCACHE_CAPACITY_MED;
} else {
capacity = MAPSFORGE_MEMCACHE_CAPACITY_MIN;
}
MapActivity.setSharedRAMCacheCapacity(capacity);
}
private static void setAcraData() {
if (!WheelmapApp.getApp().isBugsenseInitCalled()) {
return;
}
}
public static int getMemoryClass() {
return sMemoryClass;
}
public static boolean isNotWorking() {
return sCapability == Capability.NOTWORKING;
}
public static boolean degradeDetailMapAsButton() {
return sCapability == Capability.DEGRADED_MAX;
}
public static boolean degradeLargeMapQuality() {
return (sCapability == Capability.DEGRADED_MIN || sCapability == Capability.DEGRADED_MAX);
}
private enum Capability {
FULL, DEGRADED_MIN, DEGRADED_MAX, NOTWORKING
}
static class MemoryLimits {
static int FULL = -1;
static int DEGRADED_MIN = -1;
static int DEGRADED_MAX = -1;
}
static class HighDensityMemoryLimits extends MemoryLimits {
HighDensityMemoryLimits() {
FULL = 28;
DEGRADED_MIN = 24;
DEGRADED_MAX = 20;
}
}
static class MediumDensityMemoryLimits extends MemoryLimits {
MediumDensityMemoryLimits() {
FULL = 24;
DEGRADED_MIN = 20;
DEGRADED_MAX = 16;
}
}
static class LowDensityMemoryLimits extends MemoryLimits {
LowDensityMemoryLimits() {
FULL = 20;
DEGRADED_MIN = 16;
DEGRADED_MAX = 12;
}
}
}