/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.amnesica.kryptey.inputmethod.latin.settings;

import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.view.inputmethod.EditorInfo;

import com.amnesica.kryptey.inputmethod.R;
import com.amnesica.kryptey.inputmethod.latin.InputAttributes;

// Non-final for testing via mock library.
public class SettingsValues {
  public static final float DEFAULT_SIZE_SCALE = 1.0f; // 100%

  // From resources:
  public final SpacingAndPunctuations mSpacingAndPunctuations;
  // From configuration:
  public final boolean mHasHardwareKeyboard;
  public final int mDisplayOrientation;
  // From preferences, in the same order as xml/prefs.xml:
  public final boolean mAutoCap;
  public final boolean mVibrateOn;
  public final boolean mSoundOn;
  public final boolean mKeyPreviewPopupOn;
  public final boolean mShowsLanguageSwitchKey;
  public final boolean mImeSwitchEnabled;
  public final int mKeyLongpressTimeout;
  public final boolean mHideSpecialChars;
  public final boolean mShowNumberRow;
  public final boolean mSpaceSwipeEnabled;
  public final boolean mDeleteSwipeEnabled;
  public final boolean mUseMatchingNavbarColor;

  // From the input box
  public final InputAttributes mInputAttributes;

  // Deduced settings
  public final int mKeypressVibrationDuration;
  public final float mKeypressSoundVolume;
  public final int mKeyPreviewPopupDismissDelay;

  // Debug settings
  public final float mKeyboardHeightScale;

  public SettingsValues(final SharedPreferences prefs, final Resources res,
                        final InputAttributes inputAttributes) {
    // Get the resources
    mSpacingAndPunctuations = new SpacingAndPunctuations(res);

    // Store the input attributes
    mInputAttributes = inputAttributes;

    // Get the settings preferences
    mAutoCap = prefs.getBoolean(Settings.PREF_AUTO_CAP, true);
    mVibrateOn = Settings.readVibrationEnabled(prefs, res);
    mSoundOn = Settings.readKeypressSoundEnabled(prefs, res);
    mKeyPreviewPopupOn = Settings.readKeyPreviewPopupEnabled(prefs, res);
    mShowsLanguageSwitchKey = Settings.readShowLanguageSwitchKey(prefs);
    mImeSwitchEnabled = Settings.readEnableImeSwitch(prefs);
    mHasHardwareKeyboard = Settings.readHasHardwareKeyboard(res.getConfiguration());

    // Compute other readable settings
    mKeyLongpressTimeout = Settings.readKeyLongpressTimeout(prefs, res);
    mKeypressVibrationDuration = Settings.readKeypressVibrationDuration(prefs, res);
    mKeypressSoundVolume = Settings.readKeypressSoundVolume(prefs, res);
    mKeyPreviewPopupDismissDelay = res.getInteger(R.integer.config_key_preview_linger_timeout);
    mKeyboardHeightScale = Settings.readKeyboardHeight(prefs, DEFAULT_SIZE_SCALE);
    mDisplayOrientation = res.getConfiguration().orientation;
    mHideSpecialChars = Settings.readHideSpecialChars(prefs);
    mShowNumberRow = Settings.readShowNumberRow(prefs);
    mSpaceSwipeEnabled = Settings.readSpaceSwipeEnabled(prefs);
    mDeleteSwipeEnabled = Settings.readDeleteSwipeEnabled(prefs);
    mUseMatchingNavbarColor = Settings.readUseMatchingNavbarColor(prefs);
  }

  public boolean isWordSeparator(final int code) {
    return mSpacingAndPunctuations.isWordSeparator(code);
  }

  public boolean isLanguageSwitchKeyDisabled() {
    return !mShowsLanguageSwitchKey;
  }

  public boolean isSameInputType(final EditorInfo editorInfo) {
    return mInputAttributes.isSameInputType(editorInfo);
  }

  public boolean hasSameOrientation(final Configuration configuration) {
    return mDisplayOrientation == configuration.orientation;
  }
}
