Exemplo n.º 1
0
  /**
   * Instantiates a new user preferences wrapper.
   *
   * @param context The application context.
   */
  @SuppressWarnings("deprecation")
  @SuppressLint("InlinedApi")
  @TargetApi(17)
  public GlobalPrefs(Context context) {
    AppData appData = new AppData(context);
    mPreferences = PreferenceManager.getDefaultSharedPreferences(context);

    // Locale
    mLocaleCode = mPreferences.getString(KEY_LOCALE_OVERRIDE, DEFAULT_LOCALE_OVERRIDE);
    mLocale = TextUtils.isEmpty(mLocaleCode) ? Locale.getDefault() : createLocale(mLocaleCode);
    Locale[] availableLocales = Locale.getAvailableLocales();
    String[] values = context.getResources().getStringArray(R.array.localeOverride_values);
    String[] entries = new String[values.length];
    for (int i = values.length - 1; i > 0; i--) {
      Locale locale = createLocale(values[i]);

      // Get intersection of languages (available on device) and (translated for Mupen)
      if (ArrayUtils.contains(availableLocales, locale)) {
        // Get the name of the language, as written natively
        entries[i] = WordUtils.capitalize(locale.getDisplayName(locale));
      } else {
        // Remove the item from the list
        entries = (String[]) ArrayUtils.remove(entries, i);
        values = (String[]) ArrayUtils.remove(values, i);
      }
    }
    entries[0] = context.getString(R.string.localeOverride_entrySystemDefault);
    mLocaleNames = entries;
    mLocaleCodes = values;

    // Files
    userDataDir = mPreferences.getString("pathGameSaves", "");
    galleryCacheDir = userDataDir + "/GalleryCache";
    coverArtDir = galleryCacheDir + "/CoverArt";
    unzippedRomsDir = galleryCacheDir + "/UnzippedRoms";
    profilesDir = userDataDir + "/Profiles";
    crashLogDir = userDataDir + "/CrashLogs";
    coreUserDataDir = userDataDir + "/CoreConfig/UserData";
    coreUserCacheDir = userDataDir + "/CoreConfig/UserCache";
    hiResTextureDir =
        coreUserDataDir + "/mupen64plus/hires_texture/"; // MUST match what rice assumes natively
    romInfoCache_cfg = galleryCacheDir + "/romInfoCache.cfg";
    controllerProfiles_cfg = profilesDir + "/controller.cfg";
    touchscreenProfiles_cfg = profilesDir + "/touchscreen.cfg";
    emulationProfiles_cfg = profilesDir + "/emulation.cfg";
    customCheats_txt = profilesDir + "/customCheats.txt";

    // Plug-ins
    audioPlugin = new Plugin(mPreferences, appData.libsDir, "audioPlugin");

    // Library prefs
    isRecentShown = mPreferences.getBoolean("showRecentlyPlayed", true);
    isFullNameShown = mPreferences.getBoolean("showFullNames", true);

    // Touchscreen prefs
    isTouchscreenFeedbackEnabled = mPreferences.getBoolean("touchscreenFeedback", false);
    isTouchscreenAnimated = mPreferences.getBoolean("touchscreenAnimation", false);
    touchscreenScale = ((float) mPreferences.getInt("touchscreenScale", 100)) / 100.0f;
    touchscreenTransparency = (255 * mPreferences.getInt("touchscreenTransparency", 100)) / 100;
    touchscreenSkin =
        appData.touchscreenSkinsDir + "/" + mPreferences.getString("touchscreenStyle", "Outline");
    touchscreenAutoHold = getSafeInt(mPreferences, "touchscreenAutoHold", 0);

    // Xperia PLAY touchpad prefs
    isTouchpadEnabled =
        appData.hardwareInfo.isXperiaPlay && mPreferences.getBoolean("touchpadEnabled", true);
    isTouchpadFeedbackEnabled = mPreferences.getBoolean("touchpadFeedback", false);
    touchpadSkin = appData.touchpadSkinsDir + "/Xperia-Play";
    ConfigFile touchpad_cfg = new ConfigFile(appData.touchpadProfiles_cfg);
    ConfigSection section = touchpad_cfg.get(mPreferences.getString("touchpadLayout", ""));
    if (section != null) touchpadProfile = new Profile(true, section);
    else touchpadProfile = null;

    // Video prefs
    displayOrientation = getSafeInt(mPreferences, "displayOrientation", 0);
    displayPosition = getSafeInt(mPreferences, "displayPosition", Gravity.CENTER_VERTICAL);
    int transparencyPercent = mPreferences.getInt("displayActionBarTransparency", 50);
    displayActionBarTransparency = (255 * transparencyPercent) / 100;
    isFpsEnabled = mPreferences.getBoolean("displayFps", false);
    int selectedHardwareType = getSafeInt(mPreferences, "videoHardwareType", -1);
    isPolygonOffsetHackEnabled = selectedHardwareType > -2;
    videoHardwareType =
        selectedHardwareType < 0 ? appData.hardwareInfo.hardwareType : selectedHardwareType;
    switch (videoHardwareType) {
      case HardwareInfo.HARDWARE_TYPE_OMAP:
        videoPolygonOffset = 0.2f;
        break;
      case HardwareInfo.HARDWARE_TYPE_OMAP_2:
        videoPolygonOffset = -1.5f;
        break;
      case HardwareInfo.HARDWARE_TYPE_QUALCOMM:
        videoPolygonOffset = -0.2f;
        break;
      case HardwareInfo.HARDWARE_TYPE_IMAP:
        videoPolygonOffset = -0.001f;
        break;
      case HardwareInfo.HARDWARE_TYPE_TEGRA:
        videoPolygonOffset = -2.0f;
        break;
      case HardwareInfo.HARDWARE_TYPE_UNKNOWN:
        videoPolygonOffset = -1.5f;
        break;
      default:
        videoPolygonOffset =
            SafeMethods.toFloat(mPreferences.getString("videoPolygonOffset", "-1.5"), -1.5f);
        break;
    }
    isImmersiveModeEnabled = mPreferences.getBoolean("displayImmersiveMode", false);

    // Audio prefs
    audioSwapChannels = mPreferences.getBoolean("audioSwapChannels", false);
    audioSDLSecondaryBufferSize = getSafeInt(mPreferences, "audioSDLBufferSize", 2048);
    audioSLESSecondaryBufferSize = getSafeInt(mPreferences, "audioSLESBufferSize", 1024);
    audioSLESSecondaryBufferNbr = getSafeInt(mPreferences, "audioSLESBufferNbr", 2);

    if (audioPlugin.enabled)
      isFramelimiterEnabled = mPreferences.getBoolean("audioSynchronize", true);
    else isFramelimiterEnabled = !mPreferences.getString("audioPlugin", "").equals("nospeedlimit");

    // User interface modes
    String navMode = mPreferences.getString("navigationMode", "auto");
    if (navMode.equals("bigscreen")) isBigScreenMode = true;
    else if (navMode.equals("standard")) isBigScreenMode = false;
    else
      isBigScreenMode =
          AppData.IS_OUYA_HARDWARE
              || appData.isAndroidTv; // TODO: Add other systems as they enter market
    isActionBarAvailable = AppData.IS_HONEYCOMB && !isBigScreenMode;

    // Peripheral share mode
    isControllerShared = mPreferences.getBoolean("inputShareController", false);

    // Determine the key codes that should not be mapped to controls
    boolean volKeysMappable = mPreferences.getBoolean("inputVolumeMappable", false);
    List<Integer> unmappables = new ArrayList<Integer>();
    unmappables.add(KeyEvent.KEYCODE_MENU);
    if (AppData.IS_HONEYCOMB) {
      // Back key is needed to show/hide the action bar in HC+
      unmappables.add(KeyEvent.KEYCODE_BACK);
    }
    if (!volKeysMappable) {
      unmappables.add(KeyEvent.KEYCODE_VOLUME_UP);
      unmappables.add(KeyEvent.KEYCODE_VOLUME_DOWN);
      unmappables.add(KeyEvent.KEYCODE_VOLUME_MUTE);
    }
    unmappableKeyCodes = Collections.unmodifiableList(unmappables);

    // Determine the pixel dimensions of the rendering context and view surface
    {
      // Screen size
      final WindowManager windowManager =
          (WindowManager) context.getSystemService(android.content.Context.WINDOW_SERVICE);
      Display display = windowManager.getDefaultDisplay();
      int stretchWidth;
      int stretchHeight;
      if (display == null) {
        stretchWidth = stretchHeight = 0;
      } else if (AppData.IS_KITKAT && isImmersiveModeEnabled) {
        DisplayMetrics metrics = new DisplayMetrics();
        display.getRealMetrics(metrics);
        stretchWidth = metrics.widthPixels;
        stretchHeight = metrics.heightPixels;
      } else {
        stretchWidth = display.getWidth();
        stretchHeight = display.getHeight();
      }

      float aspect = 0.75f; // TODO: Handle PAL
      boolean isLetterboxed = ((float) stretchHeight / (float) stretchWidth) > aspect;
      int zoomWidth = isLetterboxed ? stretchWidth : Math.round((float) stretchHeight / aspect);
      int zoomHeight = isLetterboxed ? Math.round((float) stretchWidth * aspect) : stretchHeight;
      int cropWidth = isLetterboxed ? Math.round((float) stretchHeight / aspect) : stretchWidth;
      int cropHeight = isLetterboxed ? stretchHeight : Math.round((float) stretchWidth * aspect);

      int hResolution = getSafeInt(mPreferences, "displayResolution", 0);
      String scaling = mPreferences.getString("displayScaling", "zoom");
      if (hResolution == 0) {
        // Native resolution
        if (scaling.equals("stretch")) {
          videoRenderWidth = videoSurfaceWidth = stretchWidth;
          videoRenderHeight = videoSurfaceHeight = stretchHeight;
        } else if (scaling.equals("crop")) {
          videoRenderWidth = videoSurfaceWidth = cropWidth;
          videoRenderHeight = videoSurfaceHeight = cropHeight;
        } else // scaling.equals( "zoom") || scaling.equals( "none" )
        {
          videoRenderWidth = videoSurfaceWidth = zoomWidth;
          videoRenderHeight = videoSurfaceHeight = zoomHeight;
        }
      } else {
        // Non-native resolution
        switch (hResolution) {
          case 720:
            videoRenderWidth = 960;
            videoRenderHeight = 720;
            break;
          case 600:
            videoRenderWidth = 800;
            videoRenderHeight = 600;
            break;
          case 480:
            videoRenderWidth = 640;
            videoRenderHeight = 480;
            break;
          case 360:
            videoRenderWidth = 480;
            videoRenderHeight = 360;
            break;
          case 240:
            videoRenderWidth = 320;
            videoRenderHeight = 240;
            break;
          case 120:
            videoRenderWidth = 160;
            videoRenderHeight = 120;
            break;
          default:
            videoRenderWidth = Math.round((float) hResolution / aspect);
            videoRenderHeight = hResolution;
            break;
        }
        if (scaling.equals("zoom")) {
          videoSurfaceWidth = zoomWidth;
          videoSurfaceHeight = zoomHeight;
        } else if (scaling.equals("crop")) {
          videoSurfaceWidth = cropWidth;
          videoSurfaceHeight = cropHeight;
        } else if (scaling.equals("stretch")) {
          videoSurfaceWidth = stretchWidth;
          videoSurfaceHeight = stretchHeight;
        } else // scaling.equals( "none" )
        {
          videoSurfaceWidth = videoRenderWidth;
          videoSurfaceHeight = videoRenderHeight;
        }
      }
    }
  }