/* ThetaDeviceApplication Copyright (c) 2015 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.theta; import android.app.Application; import android.content.Context; import android.support.v4.util.LruCache; import org.deviceconnect.android.deviceplugin.theta.core.SphericalViewApi; import org.deviceconnect.android.deviceplugin.theta.core.ThetaDeviceManager; import org.deviceconnect.android.deviceplugin.theta.core.sensor.AbstractHeadTracker; import org.deviceconnect.android.deviceplugin.theta.core.sensor.DefaultHeadTracker; import org.deviceconnect.android.deviceplugin.theta.core.sensor.HeadTracker; import org.deviceconnect.android.deviceplugin.theta.core.sensor.HeadTrackingListener; import org.deviceconnect.android.logger.AndroidHandler; import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; /** * Theta Device Application. * * @author NTT DOCOMO, INC. */ public class ThetaDeviceApplication extends Application { private final Logger[] mLoggers = { Logger.getLogger("theta.dplugin"), Logger.getLogger("theta.sampleapp") }; private ThetaDeviceManager mDeviceMgr; private HeadTracker mHeadTracker; private SphericalViewApi mSphericalViewApi; /** * Cache size of thumbnail. * * 3 Thumbnails will be cached. * * The size per thumbnail is about 3 KBytes. * * Unit: byte. */ private static final int THUMBNAIL_CACHE_SIZE = (2 * 1024 * 1024) * 3; private LruCache<String, byte[]> mThumbnailCache = new LruCache<String, byte[]>(THUMBNAIL_CACHE_SIZE) { @Override protected int sizeOf(final String key, final byte[] value) { return value.length / 1024; } }; @Override public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { for (Logger logger : mLoggers) { AndroidHandler handler = new AndroidHandler(logger.getName()); handler.setFormatter(new SimpleFormatter()); handler.setLevel(Level.ALL); logger.addHandler(handler); logger.setLevel(Level.ALL); } } else { for (Logger logger : mLoggers) { logger.setLevel(Level.OFF); } } Context context = getApplicationContext(); mDeviceMgr = new ThetaDeviceManager(context); mHeadTracker = new HeadTrackerWrapper(new DefaultHeadTracker(context)); mSphericalViewApi = new SphericalViewApi(context); } public ThetaDeviceManager getDeviceManager() { return mDeviceMgr; } public HeadTracker getHeadTracker() { return mHeadTracker; } public SphericalViewApi getSphericalViewApi() { return mSphericalViewApi; } public LruCache<String, byte[]> getCache() { return mThumbnailCache; } private static class HeadTrackerWrapper implements HeadTracker { private final AbstractHeadTracker mHeadTracker; public HeadTrackerWrapper(final AbstractHeadTracker tracker) { mHeadTracker = tracker; } @Override public void start() { mHeadTracker.start(); } @Override public void stop() { mHeadTracker.stop(); } @Override public void reset() { mHeadTracker.reset(); } @Override public synchronized void registerTrackingListener(final HeadTrackingListener listener) { if (mHeadTracker.getListenerCount() == 0) { mHeadTracker.start(); } mHeadTracker.registerTrackingListener(listener); } @Override public synchronized void unregisterTrackingListener(final HeadTrackingListener listener) { mHeadTracker.unregisterTrackingListener(listener); if (mHeadTracker.getListenerCount() == 0) { mHeadTracker.stop(); } } } }