@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
    settingsFragment = new SettingsFragment();

    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    sharedPreferences.registerOnSharedPreferenceChangeListener(this);

    // Debug
    //		setContentView(R.layout.title);

    mGLSurfaceView = new MyGLSurfaceView(this);
    // Create an OpenGL ES 2.0 context
    mGLSurfaceView.setEGLContextClientVersion(2);
    mGLSurfaceView.setPreserveEGLContextOnPause(true);
    //		mGLSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
    setContentView(mGLSurfaceView);

    // The app user object
    mUser = new User();

    mStarMapperRenderer = new StarMapperRenderer(this, mUser);

    // Set the StarMapperRenderer for drawing on the GLSurfaceView
    mGLSurfaceView.setRenderer(mStarMapperRenderer);

    // Retrieving location
    mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    Criteria locCriteria = new Criteria();
    // gps
    locCriteria.setAccuracy(Criteria.ACCURACY_FINE);
    locCriteria.setBearingRequired(false);
    locCriteria.setAltitudeRequired(false);
    locCriteria.setCostAllowed(true);
    locCriteria.setSpeedRequired(false);
    locCriteria.setPowerRequirement(Criteria.POWER_LOW);

    String locProvider = mLocationManager.getBestProvider(locCriteria, true);
    Location loc = mLocationManager.getLastKnownLocation(locProvider);

    mUser.setGeoLocation((float) loc.getLatitude(), (float) loc.getLongitude());
    mUser.setGeomagneticField();
    mUser.setZenith();

    // Initializing touch variables
    mPreviousX1 = 0;
    mPreviousY1 = 0;
    mPreviousX2 = 0;
    mPreviousY2 = 0;
    mPointerIndex = 0;
    mCurrentTouchState = TouchState.INIT;
    mZoomer = new Zoom();

    // Initializing auto sensors
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mAccelerometerSensor = null;
    mMagneticFieldSensor = null;
    mAccelerometerModel = null;
    mMagneticFieldModel = null;
    // Check for necessary sensors
    if ((mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) == null)
        || (mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) == null)) {
      // phone doesn't have appropriate sensors, only use manual mode
      mUseAutoSensorMode = false;
    } else {
      // phone has sensors, initialize them
      mAccelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
      mMagneticFieldSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
      mUseAutoSensorMode = true;
      mAccelerometerModel = new AccelerometerModel(mUser, mStarMapperRenderer, mGLSurfaceView);
      mMagneticFieldModel = new MagneticFieldModel(mUser, mStarMapperRenderer, mGLSurfaceView);
    }

    if (mAccelerometerSensor != null) {
      mSensorManager.registerListener(
          mAccelerometerModel, mAccelerometerSensor, SensorManager.SENSOR_DELAY_FASTEST);
    }
    if (mMagneticFieldSensor != null) {
      mSensorManager.registerListener(
          mMagneticFieldModel, mMagneticFieldSensor, SensorManager.SENSOR_DELAY_FASTEST);
    }
    // ****** DEBUG ******
    // mUseAutoSensorMode = false;

    // flinger
    flinger =
        new GestureDetector(
            this,
            new Flinger(
                new FlingListener() {
                  public void fling(float distanceX, float distanceY) {
                    float radsPerPixel =
                        mStarMapperRenderer.mFovYRad / mStarMapperRenderer.mScreenHeight;
                    changeMapX(-distanceX * radsPerPixel);
                    changeMapY(-distanceY * radsPerPixel);

                    mStarMapperRenderer.mLookX = mUser.getLookX();
                    mStarMapperRenderer.mLookY = mUser.getLookY();
                    mStarMapperRenderer.mLookZ = mUser.getLookZ();
                    mStarMapperRenderer.mUpX = mUser.getNormalX();
                    mStarMapperRenderer.mUpY = mUser.getNormalY();
                    mStarMapperRenderer.mUpZ = mUser.getNormalZ();
                  }
                }));
  }