content: /*
   * Copyright (C) 2014 AChep@xda <artemchep@gmail.com>
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version 2
   * of the License, or (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   * MA  02110-1301, USA.
   */
  package com.achep.acdisplay;
  
  import android.content.Context;
  import android.content.res.Resources;
  import androidx.annotation.NonNull;
  import androidx.annotation.Nullable;
  import android.util.DisplayMetrics;
  import android.util.TypedValue;
  
  import com.achep.acdisplay.notifications.NotificationPresenter;
  import com.achep.acdisplay.plugins.powertoggles.ToggleReceiver;
  import com.achep.acdisplay.services.KeyguardService;
  import com.achep.acdisplay.services.SensorsDumpService;
  import com.achep.acdisplay.services.activemode.ActiveModeService;
  import com.achep.base.content.ConfigBase;
  
  import java.util.Map;
  
  /**
   * Saves all the configurations for the app.
   *
   * @author Artem Chepurnoy
   * @since 21.01.14
   */
  @SuppressWarnings({"ConstantConditions", "unused"})
  public final class Config extends ConfigBase {
  
      private static final String TAG = "Config";
  
      public static final String KEY_ENABLED = "enabled";
      public static final String KEY_ONLY_WHILE_CHARGING = "only_while_charging";
  
      // notifications
      public static final String KEY_NOTIFY_MIN_PRIORITY = "notify_min_priority";
      public static final String KEY_NOTIFY_MAX_PRIORITY = "notify_max_priority";
      public static final String KEY_NOTIFY_WAKE_UP_ON = "notify_wake_up_on";
      public static final String KEY_NOTIFY_GLANCE = "notify_glance";
  
      // inactive time
      public static final String KEY_INACTIVE_TIME_FROM = "inactive_time_from";
      public static final String KEY_INACTIVE_TIME_TO = "inactive_time_to";
      public static final String KEY_INACTIVE_TIME_ENABLED = "inactive_time_enabled";
  
      // timeouts
      public static final String KEY_TIMEOUT_NORMAL = "timeout_normal";
      public static final String KEY_TIMEOUT_SHORT = "timeout_short";
  
      // keyguard
      public static final String KEY_KEYGUARD = "keyguard";
      public static final String KEY_KEYGUARD_RESPECT_INACTIVE_TIME = "keyguard_respect_inactive_time";
      public static final String KEY_KEYGUARD_WITHOUT_NOTIFICATIONS = "keyguard_without_notifications";
      public static final String KEY_KEYGUARD_LOCK_DELAY = "keyguard_lock_delay";
  
      // active mode
      public static final String KEY_ACTIVE_MODE = "active_mode";
      public static final String KEY_ACTIVE_MODE_RESPECT_INACTIVE_TIME = "active_mode_respect_inactive_time";
      public static final String KEY_ACTIVE_MODE_WITHOUT_NOTIFICATIONS = "active_mode_without_notifications";
      public static final String KEY_ACTIVE_MODE_ACTIVE_CHARGING = "active_mode_active_charging";
      public static final String KEY_ACTIVE_MODE_DISABLE_ON_LOW_BATTERY = "active_mode_disable_on_low_battery";
      public static final String KEY_ACTIVE_MODE_WAVE_TO_WAKE = "active_mode_wave_to_wake";
  
      // interface
      public static final String KEY_UI_FULLSCREEN = "ui_fullscreen";
      public static final String KEY_UI_WALLPAPER_SHOWN = "wallpaper_shown";
      public static final String KEY_UI_DYNAMIC_BACKGROUND_MODE = "dynamic_background_mode";
      public static final int DYNAMIC_BG_ARTWORK_MASK = 1;
      public static final int DYNAMIC_BG_NOTIFICATION_MASK = 2;
      public static final String KEY_UI_STATUS_BATTERY_STICKY = "ui_status_battery_sticky";
      public static final String KEY_UI_ICON_SIZE = "ui_condensed_view_size";
      public static final String ICON_SIZE_PX = "px";
      public static final String ICON_SIZE_DP = "dp";
      public static final String KEY_UI_UNLOCK_ANIMATION = "unlock_animation";
      public static final String KEY_UI_CIRCLE_COLOR_INNER = "ui_circle_color_inner";
      public static final String KEY_UI_CIRCLE_COLOR_OUTER = "ui_circle_color_outer";
      public static final String KEY_UI_OVERRIDE_FONTS = "ui_override_fonts";
      public static final String KEY_UI_EMOTICONS = "ui_emoticons";
      public static final String KEY_UI_CUSTOM_WIDGET = "ui_custom_widget";
      public static final String KEY_UI_CUSTOM_WIDGET_ID = "ui_custom_widget_id";
      public static final String KEY_UI_CUSTOM_WIDGET_HEIGHT_DP = "ui_custom_widget_height";
      public static final String KEY_UI_CUSTOM_WIDGET_WIDTH_DP = "ui_custom_widget_width";
      public static final String KEY_UI_CUSTOM_WIDGET_TOUCHABLE = "ui_custom_widget_touchable";
  
      // behavior
      public static final String KEY_FEEL_SCREEN_OFF_AFTER_LAST_NOTIFY = "feel_widget_screen_off_after_last_notify";
      public static final String KEY_FEEL_WIDGET_PINNABLE = "feel_widget_pinnable";
      public static final String KEY_FEEL_WIDGET_READABLE = "feel_widget_readable";
      public static final String KEY_PRIVACY = "privacy_mode";
      public static final int PRIVACY_HIDE_CONTENT_MASK = 1;
      public static final int PRIVACY_HIDE_ACTIONS_MASK = 2;
      public static final String KEY_DOUBLE_TAP_TO_SLEEP = "double_tap_to_sleep";
      public static final String KEY_MEDIA_WIDGET = "media_widget";
      public static final String KEY_CORNER_ACTION_LEFT_TOP = "corner_action_left_top";
      public static final String KEY_CORNER_ACTION_RIGHT_TOP = "corner_action_right_top";
      public static final String KEY_CORNER_ACTION_LEFT_BOTTOM = "corner_action_left_bottom";
      public static final String KEY_CORNER_ACTION_RIGHT_BOTTOM = "corner_action_right_bottom";
      /**
       * The default corner's action. Simply unlocks the device.
       */
      public static final int CORNER_UNLOCK = 0;
      /**
       * Launches a camera.
       */
      public static final int CORNER_LAUNCH_CAMERA = 1;
      /**
       * Launches a dialer.
       */
      public static final int CORNER_LAUNCH_DIALER = 2;
  
      // development
      public static final String KEY_DEV_SENSORS_DUMP = "dev_sensors_dump";
  
      // triggers
      public static final String KEY_TRIG_PREVIOUS_VERSION = "trigger_previous_version";
      public static final String KEY_TRIG_HELP_READ = "trigger_dialog_help";
      public static final String KEY_TRIG_TRANSLATED = "trigger_translated";
      public static final String KEY_TRIG_LAUNCH_COUNT = "trigger_launch_count";
      public static final String KEY_TRIG_DONATION_ASKED = "trigger_donation_asked";
  
      private static Config sConfig;
  
      private boolean mEnabled;
      private boolean mKeyguardEnabled;
      private boolean mKeyguardRespectInactiveTime;
      private boolean mKeyguardWithoutNotifies;
      private boolean mActiveMode;
      private boolean mActiveModeRespectInactiveTime;
      private boolean mActiveModeWithoutNotifies;
      private boolean mActiveModeActiveCharging;
      private boolean mActiveModeDisableOnLowBattery;
      private boolean mActiveModeWave2Wake;
      private boolean mEnabledOnlyWhileCharging;
      private boolean mScreenOffAfterLastNotify;
      private boolean mDoubleTapToSleep;
      private boolean mMediaWidget;
      private boolean mFeelWidgetPinnable;
      private boolean mFeelWidgetReadable;
      private boolean mNotifyWakeUpOn;
      private boolean mNotifyGlance;
      private int mNotifyMinPriority;
      private int mNotifyMaxPriority;
      private int mTimeoutNormal;
      private int mTimeoutShort;
      private int mInactiveTimeFrom;
      private int mInactiveTimeTo;
      private int mUiDynamicBackground;
      private int mUiIconSize; // dp.
      private int mUiCustomWidgetId;
      private int mUiCustomWidgetWidthDp;
      private int mUiCustomWidgetHeightDp;
      private int mUiCircleColorInner;
      private int mUiCircleColorOuter;
      private int mPrivacyMode;
      private int mCornerActionLeftTop;
      private int mCornerActionRightTop;
      private int mCornerActionLeftBottom;
      private int mCornerActionRightBottom;
      private int mKeyguardLockDelay;
      private boolean mInactiveTimeEnabled;
      private boolean mUiFullScreen;
      private boolean mUiOverrideFonts;
      private boolean mUiEmoticons;
      private boolean mUiWallpaper;
      private boolean mUiBatterySticky;
      private boolean mUiUnlockAnimation;
      private boolean mUiCustomWidget;
      private boolean mUiCustomWidgetTouchable;
  
      private boolean mDevSensorsDump;
  
      private final Triggers mTriggers;
      private int mTrigPreviousVersion;
      private int mTrigLaunchCount;
      private boolean mTrigTranslated;
      private boolean mTrigHelpRead;
      private boolean mTrigDonationAsked;
  
      @NonNull
      public static synchronized Config getInstance() {
          if (sConfig == null) {
              sConfig = new Config();
          }
          return sConfig;
      }
  
      private Config() {
          mTriggers = new Triggers();
      }
  
      /**
       * Loads saved values from shared preferences.
       * This is called on {@link App app's} create.
       */
      void init(@NonNull Context context) {
          initInternal(context);
      }
  
      public void reset(@NonNull Context context) {
          resetInternal(context);
      }
  
      @Override
      protected void onCreateMap(@NonNull Map<String, Option> map) {
          map.put(KEY_ENABLED, new ConfigBase.Option(
                  "mEnabled", "setEnabled", "isEnabled", boolean.class)
                  .setDefaultRes(R.bool.config_default_enabled));
          map.put(KEY_KEYGUARD, new ConfigBase.Option(
                  "mKeyguardEnabled", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_keyguard_enabled));
          map.put(KEY_KEYGUARD_RESPECT_INACTIVE_TIME, new ConfigBase.Option(
                  "mKeyguardRespectInactiveTime", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_keyguard_respect_inactive_time));
          map.put(KEY_KEYGUARD_WITHOUT_NOTIFICATIONS, new ConfigBase.Option(
                  "mKeyguardWithoutNotifies", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_keyguard_without_notifies_enabled));
          map.put(KEY_KEYGUARD_LOCK_DELAY, new ConfigBase.Option(
                  "mKeyguardLockDelay", null, null, int.class)
                  .setDefaultRes(R.integer.config_default_keyguard_lock_delay));
          map.put(KEY_ACTIVE_MODE, new ConfigBase.Option(
                  "mActiveMode", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_active_mode_enabled));
          map.put(KEY_ACTIVE_MODE_RESPECT_INACTIVE_TIME, new ConfigBase.Option(
                  "mActiveModeRespectInactiveTime", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_active_mode_respect_inactive_time));
          map.put(KEY_ACTIVE_MODE_WITHOUT_NOTIFICATIONS, new ConfigBase.Option(
                  "mActiveModeWithoutNotifies", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_active_mode_without_notifies_enabled));
          map.put(KEY_ACTIVE_MODE_ACTIVE_CHARGING, new ConfigBase.Option(
                  "mActiveModeActiveCharging", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_active_mode_active_charging));
          map.put(KEY_ACTIVE_MODE_DISABLE_ON_LOW_BATTERY, new ConfigBase.Option(
                  "mActiveModeDisableOnLowBattery", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_active_mode_disable_on_low_battery));
          map.put(KEY_ACTIVE_MODE_WAVE_TO_WAKE, new ConfigBase.Option(
                  "mActiveModeWave2Wake", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_active_mode_wave_to_wake));
  
          // notifications
          map.put(KEY_NOTIFY_WAKE_UP_ON, new ConfigBase.Option(
                  "mNotifyWakeUpOn", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_notify_wake_up_on));
          map.put(KEY_NOTIFY_GLANCE, new ConfigBase.Option(
                  "mNotifyGlance", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_notify_glance));
          map.put(KEY_NOTIFY_MIN_PRIORITY, new ConfigBase.Option(
                  "mNotifyMinPriority", null, null, int.class)
                  .setDefaultRes(R.integer.config_default_notify_min_priority));
          map.put(KEY_NOTIFY_MAX_PRIORITY, new ConfigBase.Option(
                  "mNotifyMaxPriority", null, null, int.class)
                  .setDefaultRes(R.integer.config_default_notify_max_priority));
  
          // timeout
          map.put(KEY_TIMEOUT_NORMAL, new ConfigBase.Option(
                  "mTimeoutNormal", null, null, int.class)
                  .setDefaultRes(R.integer.config_default_timeout_normal));
          map.put(KEY_TIMEOUT_SHORT, new ConfigBase.Option(
                  "mTimeoutShort", null, null, int.class)
                  .setDefaultRes(R.integer.config_default_timeout_short));
  
          // inactive time
          map.put(KEY_INACTIVE_TIME_ENABLED, new ConfigBase.Option(
                  "mInactiveTimeEnabled", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_inactive_time_enabled));
          map.put(KEY_INACTIVE_TIME_FROM, new ConfigBase.Option(
                  "mInactiveTimeFrom", null, null, int.class)
                  .setDefaultRes(R.integer.config_default_inactive_time_from));
          map.put(KEY_INACTIVE_TIME_TO, new ConfigBase.Option(
                  "mInactiveTimeTo", null, null, int.class)
                  .setDefaultRes(R.integer.config_default_inactive_time_to));
  
          // interface
          map.put(KEY_UI_FULLSCREEN, new ConfigBase.Option(
                  "mUiFullScreen", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_ui_full_screen));
          map.put(KEY_UI_WALLPAPER_SHOWN, new ConfigBase.Option(
                  "mUiWallpaper", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_ui_show_wallpaper));
          map.put(KEY_UI_STATUS_BATTERY_STICKY, new ConfigBase.Option(
                  "mUiBatterySticky", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_ui_status_battery_sticky));
          map.put(KEY_UI_DYNAMIC_BACKGROUND_MODE, new ConfigBase.Option(
                  "mUiDynamicBackground", null, null, int.class)
                  .setDefaultRes(R.integer.config_default_ui_show_shadow_dynamic_bg));
          map.put(KEY_UI_CIRCLE_COLOR_INNER, new ConfigBase.Option(
                  "mUiCircleColorInner", null, null, int.class)
                  .setDefault(0xFFF0F0F0));
          map.put(KEY_UI_CIRCLE_COLOR_OUTER, new ConfigBase.Option(
                  "mUiCircleColorOuter", null, null, int.class)
                  .setDefault(0xFF303030));
          map.put(KEY_UI_UNLOCK_ANIMATION, new ConfigBase.Option(
                  "mUiUnlockAnimation", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_ui_unlock_animation));
          map.put(KEY_UI_EMOTICONS, new ConfigBase.Option(
                  "mUiEmoticons", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_ui_emoticons));
          map.put(KEY_UI_OVERRIDE_FONTS, new ConfigBase.Option(
                  "mUiOverrideFonts", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_ui_override_fonts));
          map.put(KEY_UI_CUSTOM_WIDGET, new ConfigBase.Option(
                  "mUiCustomWidget", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_ui_custom_widget));
          map.put(KEY_UI_CUSTOM_WIDGET_ID, new ConfigBase.Option(
                  "mUiCustomWidgetId", null, null, int.class)
                  .setDefault(-1));
          map.put(KEY_UI_CUSTOM_WIDGET_WIDTH_DP, new ConfigBase.Option(
                  "mUiCustomWidgetWidthDp", null, null, int.class)
                  .setDefault(0));
          map.put(KEY_UI_CUSTOM_WIDGET_HEIGHT_DP, new ConfigBase.Option(
                  "mUiCustomWidgetHeightDp", null, null, int.class)
                  .setDefault(0));
          map.put(KEY_UI_CUSTOM_WIDGET_TOUCHABLE, new ConfigBase.Option(
                  "mUiCustomWidgetTouchable", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_ui_custom_widget_touchable));
          map.put(KEY_UI_ICON_SIZE, new ConfigBase.Option(
                  "mUiIconSize", null, null, int.class)
                  .setDefaultRes(R.integer.config_default_ui_icon_size_dp));
  
          // development
          map.put(KEY_DEV_SENSORS_DUMP, new ConfigBase.Option(
                  "mDevSensorsDump", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_dev_sensors_dump));
  
          // other
          map.put(KEY_ONLY_WHILE_CHARGING, new ConfigBase.Option(
                  "mEnabledOnlyWhileCharging", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_enabled_only_while_charging));
          map.put(KEY_FEEL_SCREEN_OFF_AFTER_LAST_NOTIFY, new ConfigBase.Option(
                  "mScreenOffAfterLastNotify", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_feel_screen_off_after_last_notify));
          map.put(KEY_FEEL_WIDGET_PINNABLE, new ConfigBase.Option(
                  "mFeelWidgetPinnable", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_feel_widget_pinnable));
          map.put(KEY_FEEL_WIDGET_READABLE, new ConfigBase.Option(
                  "mFeelWidgetReadable", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_feel_widget_readable));
          map.put(KEY_PRIVACY, new ConfigBase.Option(
                  "mPrivacyMode", null, null, int.class)
                  .setDefaultRes(R.integer.config_default_privacy_mode));
          map.put(KEY_DOUBLE_TAP_TO_SLEEP, new ConfigBase.Option(
                  "mDoubleTapToSleep", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_double_tap_to_sleep));
          map.put(KEY_MEDIA_WIDGET, new ConfigBase.Option(
                  "mMediaWidget", null, null, boolean.class)
                  .setDefaultRes(R.bool.config_default_media_widget));
          map.put(KEY_CORNER_ACTION_LEFT_TOP, new ConfigBase.Option(
                  "mCornerActionLeftTop", null, null, int.class)
                  .setDefaultRes(R.integer.config_default_corner_left_top));
          map.put(KEY_CORNER_ACTION_RIGHT_TOP, new ConfigBase.Option(
                  "mCornerActionRightTop", null, null, int.class)
                  .setDefaultRes(R.integer.config_default_corner_right_top));
          map.put(KEY_CORNER_ACTION_LEFT_BOTTOM, new ConfigBase.Option(
                  "mCornerActionLeftBottom", null, null, int.class)
                  .setDefaultRes(R.integer.config_default_corner_left_bottom));
          map.put(KEY_CORNER_ACTION_RIGHT_BOTTOM, new ConfigBase.Option(
                  "mCornerActionRightBottom", null, null, int.class)
                  .setDefaultRes(R.integer.config_default_corner_right_bottom));
  
          // triggers
          map.put(KEY_TRIG_DONATION_ASKED, new ConfigBase.Option(
                  "mTrigDonationAsked", null, null, boolean.class)
                  .setDefault(false));
          map.put(KEY_TRIG_HELP_READ, new ConfigBase.Option(
                  "mTrigHelpRead", null, null, boolean.class)
                  .setDefault(false));
          map.put(KEY_TRIG_LAUNCH_COUNT, new ConfigBase.Option(
                  "mTrigLaunchCount", null, null, int.class)
                  .setDefault(0));
          map.put(KEY_TRIG_PREVIOUS_VERSION, new ConfigBase.Option(
                  "mTrigPreviousVersion", null, null, int.class)
                  .setDefault(0));
          map.put(KEY_TRIG_TRANSLATED, new ConfigBase.Option(
                  "mTrigTranslated", null, null, boolean.class)
                  .setDefault(false));
      }
  
      @Override
      protected void onOptionChanged(@NonNull Option option, @NonNull String key) {
          switch (key) {
              case KEY_ACTIVE_MODE:
                  ActiveModeService.handleState(getContext());
                  break;
              case KEY_KEYGUARD:
                  KeyguardService.handleState(getContext());
                  break;
              case KEY_ENABLED:
                  ToggleReceiver.sendStateUpdate(ToggleReceiver.class, mEnabled, getContext());
                  NotificationPresenter.getInstance().setOnNotificationPostedListener(isEnabled()
                          ? Presenter.getInstance()
                          : null);
              case KEY_ONLY_WHILE_CHARGING:
                  ActiveModeService.handleState(getContext());
                  KeyguardService.handleState(getContext());
                  break;
              case KEY_DEV_SENSORS_DUMP:
                  SensorsDumpService.handleState(getContext());
                  break;
              /*
              case KEY_UI_CUSTOM_WIDGET_ID:
                  // Track the current appwidget and delete unused ones.
                  // TODO: Ensure cleaning-up old AppWidgets is required.
                  Object previous = getPreviousValue();
                  if (previous != null) {
                      final int id = (int) previous;
                      if (AppWidgetUtils.isValidId(id)) {
                          // Release previously allocated appwidget to avoid of
                          // memory leaks and a bad carma.
                          AppWidgetHost host = new MyAppWidgetHost(getContext(), HostWidget.HOST_ID);
                          host.deleteAppWidgetId(id);
                          Log.i(TAG, "Deleted AppWidget[" + id + "]");
                      }
                  }
                  break;
                  */
          }
      }
  
      /**
       * Separated group of different internal triggers.
       */
      @NonNull
      public Triggers getTriggers() {
          return mTriggers;
      }
  
      // //////////////////////////////////////////
      // ///////////// -- OPTIONS -- //////////////
      // //////////////////////////////////////////
  
      /**
       * Setter for the entire app enabler.
       */
      public void setEnabled(@NonNull Context context, boolean enabled,
                             @Nullable OnConfigChangedListener listener) {
          writeFromMain(context, getOption(KEY_ENABLED), enabled, listener);
      }
  
      /**
       * Setter to enable "night mode".
       */
      public void setInactiveTimeEnabled(@NonNull Context context, boolean enabled,
                                         @Nullable OnConfigChangedListener listener) {
          writeFromMain(context, getOption(KEY_INACTIVE_TIME_ENABLED), enabled, listener);
      }
  
      /**
       * Setter for the time "night mode" should start
       */
      public void setInactiveTimeFrom(@NonNull Context context, int minutes,
                                      @Nullable OnConfigChangedListener listener) {
          writeFromMain(context, getOption(KEY_INACTIVE_TIME_FROM), minutes, listener);
      }
  
      /**
       * Setter for the time "night mode" should end.
       */
      public void setInactiveTimeTo(@NonNull Context context, int minutes,
                                    @Nullable OnConfigChangedListener listener) {
          writeFromMain(context, getOption(KEY_INACTIVE_TIME_TO), minutes, listener);
      }
  
      /**
       * Sets the size (or height only) of collapsed views.
       *
       * @param size preferred size in dip.
       * @see #getIconSizePx()
       * @see #getIconSize(String)
       */
      public void setIconSizeDp(@NonNull Context context, int size,
                                @Nullable OnConfigChangedListener listener) {
          writeFromMain(context, getOption(KEY_UI_ICON_SIZE), size, listener);
      }
  
      /**
       * @return the delay between turning screen off  and actual locking, in millis
       */
      public int getKeyguardLockDelayMillis() {
          return mKeyguardLockDelay;
      }
  
      /**
       * @return minimal {@link android.app.Notification#priority} of notification to be shown.
       * @see #getNotifyMaxPriority()
       * @see android.app.Notification#priority
       */
      public int getNotifyMinPriority() {
          return mNotifyMinPriority;
      }
  
      /**
       * @return maximum {@link android.app.Notification#priority} of notification to be shown.
       * @see #getNotifyMinPriority()
       * @see android.app.Notification#priority
       */
      public int getNotifyMaxPriority() {
          return mNotifyMaxPriority;
      }
  
      /**
       * @return the color of unlock circle
       * @see #getCircleOuterColor()
       */
      public int getCircleInnerColor() {
          return mUiCircleColorInner;
      }
  
      /**
       * @return the background color of the unlock circle
       * @see #getCircleInnerColor()
       */
      public int getCircleOuterColor() {
          return mUiCircleColorOuter;
      }
  
      public int getTimeoutNormal() {
          return mTimeoutNormal;
      }
  
      public int getTimeoutShort() {
          return mTimeoutShort;
      }
  
      public int getInactiveTimeFrom() {
          return mInactiveTimeFrom;
      }
  
      public int getInactiveTimeTo() {
          return mInactiveTimeTo;
      }
  
      public int getDynamicBackgroundMode() {
          return mUiDynamicBackground;
      }
  
      /**
       * Gets the current privacy mode.
       *
       * @return the bit-mask containing different privacy options.
       * @see #PRIVACY_HIDE_ACTIONS_MASK
       * @see #PRIVACY_HIDE_CONTENT_MASK
       */
      public int getPrivacyMode() {
          return mPrivacyMode;
      }
  
      public int getCustomWidgetId() {
          return mUiCustomWidgetId;
      }
  
      public int getCustomWidgetWidthDp() {
          return mUiCustomWidgetWidthDp;
      }
  
      public int getCustomWidgetHeightDp() {
          return mUiCustomWidgetHeightDp;
      }
  
      /**
       * @return an action of the left top corner of the screen.
       * @see com.achep.acdisplay.ui.CornerHelper
       */
      public int getCornerActionLeftTop() {
          return mCornerActionLeftTop;
      }
  
      /**
       * @return an action of the right top corner of the screen.
       * @see com.achep.acdisplay.ui.CornerHelper
       */
      public int getCornerActionRightTop() {
          return mCornerActionRightTop;
      }
  
      /**
       * @return an action of the left bottom corner of the screen.
       * @see com.achep.acdisplay.ui.CornerHelper
       */
      public int getCornerActionLeftBottom() {
          return mCornerActionLeftBottom;
      }
  
      /**
       * @return an action of the right bottom corner of the screen.
       * @see com.achep.acdisplay.ui.CornerHelper
       */
      public int getCornerActionRightBottom() {
          return mCornerActionRightBottom;
      }
  
      /**
       * @return the size (or height only) of collapsed views in pixels.
       * @see #getIconSize(String)
       */
      public int getIconSizePx() {
          return getIconSize(ICON_SIZE_PX);
      }
  
      /**
       * @return the size (or height only) of collapsed views.
       * @see #getIconSizePx()
       * @see #ICON_SIZE_DP
       * @see #ICON_SIZE_PX
       */
      public int getIconSize(@NonNull String type) {
          switch (type) {
              case ICON_SIZE_PX:
                  DisplayMetrics dm = Resources.getSystem().getDisplayMetrics();
                  return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mUiIconSize, dm);
              case ICON_SIZE_DP:
                  return mUiIconSize;
              default:
                  throw new IllegalArgumentException(type + " is not a valid icon size type.");
          }
      }
  
      public boolean isEnabled() {
          return mEnabled;
      }
  
      public boolean isKeyguardEnabled() {
          return mKeyguardEnabled;
      }
  
      public boolean isKeyguardWithoutNotifiesEnabled() {
          return mKeyguardWithoutNotifies;
      }
  
      public boolean isActiveModeEnabled() {
          return mActiveMode;
      }
  
      public boolean isActiveModeWithoutNotifiesEnabled() {
          return mActiveModeWithoutNotifies;
      }
  
      /**
       * @return {@code true} if you may always listen to every device's sensors while
       * it's charging, {@code false} otherwise.
       */
      public boolean isActiveModeActiveChargingEnabled() {
          return mActiveModeActiveCharging;
      }
  
      public boolean isEnabledOnlyWhileCharging() {
          return mEnabledOnlyWhileCharging;
      }
  
      public boolean isNotifyWakingUp() {
          return mNotifyWakeUpOn;
      }
  
      public boolean isNotifyGlanceEnabled() {
          return mNotifyGlance;
      }
  
      public boolean isWallpaperShown() {
          return mUiWallpaper;
      }
  
      public boolean isStatusBatterySticky() {
          return mUiBatterySticky;
      }
  
      public boolean isWidgetPinnable() {
          return mFeelWidgetPinnable;
      }
  
      public boolean isWidgetReadable() {
          return mFeelWidgetReadable;
      }
  
      public boolean isInactiveTimeEnabled() {
          return mInactiveTimeEnabled;
      }
  
      public boolean isFullScreen() {
          return mUiFullScreen;
      }
  
      public boolean isOverridingFontsEnabled() {
          return mUiOverrideFonts;
      }
  
      public boolean isEmoticonsEnabled() {
          return mUiEmoticons;
      }
  
      public boolean isScreenOffAfterLastWidget() {
          return mScreenOffAfterLastNotify;
      }
  
      public boolean isDoubleTapToSleepEnabled() {
          return mDoubleTapToSleep;
      }
  
      public boolean isMediaWidgetEnabled() {
          return mMediaWidget;
      }
  
      public boolean isUnlockAnimationEnabled() {
          return mUiUnlockAnimation;
      }
  
      public boolean isDevSensorsDumpEnabled() {
          return mDevSensorsDump;
      }
  
      public boolean isCustomWidgetEnabled() {
          return mUiCustomWidget;
      }
  
      public boolean isCustomWidgetTouchable() {
          return mUiCustomWidgetTouchable;
      }
  
      public boolean isActiveModeWaveToWakeEnabled() {
          return mActiveModeWave2Wake;
      }
  
      // //////////////////////////////////////////
      // //////////// -- TRIGGERS -- //////////////
      // //////////////////////////////////////////
  
      /**
       * Contains
       *
       * @author Artem Chepurnoy
       */
      public class Triggers {
  
          public void setPreviousVersion(@NonNull Context context, int versionCode,
                                         @Nullable OnConfigChangedListener listener) {
              writeFromMain(context, getOption(KEY_TRIG_PREVIOUS_VERSION), versionCode, listener);
          }
  
          public void setHelpRead(@NonNull Context context, boolean isRead,
                                  @Nullable OnConfigChangedListener listener) {
              writeFromMain(context, getOption(KEY_TRIG_HELP_READ), isRead, listener);
          }
  
          public void setDonationAsked(@NonNull Context context, boolean isAsked,
                                       @Nullable OnConfigChangedListener listener) {
              writeFromMain(context, getOption(KEY_TRIG_DONATION_ASKED), isAsked, listener);
          }
  
          public void setTranslated(@NonNull Context context, boolean translated,
                                    @Nullable OnConfigChangedListener listener) {
              writeFromMain(context, getOption(KEY_TRIG_TRANSLATED), translated, listener);
          }
  
          /**
           * @see #setLaunchCount(android.content.Context, int, com.achep.base.content.ConfigBase.OnConfigChangedListener)
           * @see #getLaunchCount()
           */
          public void incrementLaunchCount(@NonNull Context context,
                                           @Nullable OnConfigChangedListener listener) {
              setLaunchCount(context, getLaunchCount() + 1, listener);
          }
  
          /**
           * @see #incrementLaunchCount(android.content.Context, com.achep.base.content.ConfigBase.OnConfigChangedListener)
           * @see #getLaunchCount()
           */
          public void setLaunchCount(@NonNull Context context, int launchCount,
                                     @Nullable OnConfigChangedListener listener) {
              writeFromMain(context, getOption(KEY_TRIG_LAUNCH_COUNT), launchCount, listener);
          }
  
          /**
           * As set by {@link com.achep.acdisplay.ui.activities.MainActivity}, it returns version
           * code of previously installed AcDisplay, {@code 0} if first install.
           *
           * @return version code of previously installed AcDisplay, {@code 0} on first installation.
           * @see #setPreviousVersion(android.content.Context, int, Config.OnConfigChangedListener)
           */
          public int getPreviousVersion() {
              return mTrigPreviousVersion;
          }
  
          /**
           * @return the number of {@link com.achep.acdisplay.ui.activities.AcDisplayActivity}'s creations.
           * @see #incrementLaunchCount(android.content.Context, com.achep.base.content.ConfigBase.OnConfigChangedListener)
           * @see #setLaunchCount(android.content.Context, int, com.achep.base.content.ConfigBase.OnConfigChangedListener)
           */
          public int getLaunchCount() {
              return mTrigLaunchCount;
          }
  
          /**
           * @return {@code true} if {@link com.achep.base.ui.fragments.dialogs.HelpDialog} been read,
           * {@code false} otherwise
           * @see #setHelpRead(android.content.Context, boolean, Config.OnConfigChangedListener)
           */
          public boolean isHelpRead() {
              return mTrigHelpRead;
          }
  
          /**
           * @return {@code true} if the app is fully translated to currently used locale,
           * {@code false} otherwise.
           * @see #setDonationAsked(android.content.Context, boolean, com.achep.base.content.ConfigBase.OnConfigChangedListener)
           */
          public boolean isTranslated() {
              return mTrigTranslated;
          }
  
          public boolean isDonationAsked() {
              return mTrigDonationAsked;
          }
  
      }
  
  }
  