package com.simplemobiletools.gallery.helpers import android.content.Context import android.content.res.Configuration import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.simplemobiletools.commons.helpers.BaseConfig import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED import com.simplemobiletools.commons.helpers.SORT_DESCENDING import com.simplemobiletools.gallery.R import com.simplemobiletools.gallery.models.AlbumCover import java.util.* class Config(context: Context) : BaseConfig(context) { companion object { fun newInstance(context: Context) = Config(context) } var fileSorting: Int get() = prefs.getInt(SORT_ORDER, SORT_BY_DATE_MODIFIED or SORT_DESCENDING) set(order) = prefs.edit().putInt(SORT_ORDER, order).apply() var directorySorting: Int get() = prefs.getInt(DIRECTORY_SORT_ORDER, SORT_BY_DATE_MODIFIED or SORT_DESCENDING) set(order) = prefs.edit().putInt(DIRECTORY_SORT_ORDER, order).apply() fun saveFileSorting(path: String, value: Int) { if (path.isEmpty()) { fileSorting = value } else { prefs.edit().putInt(SORT_FOLDER_PREFIX + path.toLowerCase(), value).apply() } } fun getFileSorting(path: String) = prefs.getInt(SORT_FOLDER_PREFIX + path.toLowerCase(), fileSorting) fun removeFileSorting(path: String) { prefs.edit().remove(SORT_FOLDER_PREFIX + path.toLowerCase()).apply() } fun hasCustomSorting(path: String) = prefs.contains(SORT_FOLDER_PREFIX + path.toLowerCase()) var wasHideFolderTooltipShown: Boolean get() = prefs.getBoolean(HIDE_FOLDER_TOOLTIP_SHOWN, false) set(wasShown) = prefs.edit().putBoolean(HIDE_FOLDER_TOOLTIP_SHOWN, wasShown).apply() var shouldShowHidden = showHiddenMedia || temporarilyShowHidden var showHiddenMedia: Boolean get() = prefs.getBoolean(SHOW_HIDDEN_MEDIA, false) set(showHiddenFolders) = prefs.edit().putBoolean(SHOW_HIDDEN_MEDIA, showHiddenFolders).apply() var temporarilyShowHidden: Boolean get() = prefs.getBoolean(TEMPORARILY_SHOW_HIDDEN, false) set(temporarilyShowHidden) = prefs.edit().putBoolean(TEMPORARILY_SHOW_HIDDEN, temporarilyShowHidden).apply() var isThirdPartyIntent: Boolean get() = prefs.getBoolean(IS_THIRD_PARTY_INTENT, false) set(isThirdPartyIntent) = prefs.edit().putBoolean(IS_THIRD_PARTY_INTENT, isThirdPartyIntent).apply() var pinnedFolders: Set get() = prefs.getStringSet(PINNED_FOLDERS, HashSet()) set(pinnedFolders) = prefs.edit().putStringSet(PINNED_FOLDERS, pinnedFolders).apply() var showAll: Boolean get() = prefs.getBoolean(SHOW_ALL, false) set(showAll) = prefs.edit().putBoolean(SHOW_ALL, showAll).apply() fun addPinnedFolders(paths: Set) { val currPinnedFolders = HashSet(pinnedFolders) currPinnedFolders.addAll(paths) pinnedFolders = currPinnedFolders } fun removePinnedFolders(paths: Set) { val currPinnedFolders = HashSet(pinnedFolders) currPinnedFolders.removeAll(paths) pinnedFolders = currPinnedFolders } fun addExcludedFolder(path: String) { addExcludedFolders(HashSet(Arrays.asList(path))) } fun addExcludedFolders(paths: Set) { val currExcludedFolders = HashSet(excludedFolders) currExcludedFolders.addAll(paths) excludedFolders = currExcludedFolders } fun removeExcludedFolder(path: String) { val currExcludedFolders = HashSet(excludedFolders) currExcludedFolders.remove(path) excludedFolders = currExcludedFolders } var excludedFolders: MutableSet get() = prefs.getStringSet(EXCLUDED_FOLDERS, getDataFolder()) set(excludedFolders) = prefs.edit().remove(EXCLUDED_FOLDERS).putStringSet(EXCLUDED_FOLDERS, excludedFolders).apply() private fun getDataFolder(): Set { val folders = HashSet() val dataFolder = context.externalCacheDir?.parentFile?.parent?.trimEnd('/') ?: "" if (dataFolder.endsWith("data")) folders.add(dataFolder) return folders } fun addIncludedFolder(path: String) { val currIncludedFolders = HashSet(includedFolders) currIncludedFolders.add(path) includedFolders = currIncludedFolders } fun removeIncludedFolder(path: String) { val currIncludedFolders = HashSet(includedFolders) currIncludedFolders.remove(path) includedFolders = currIncludedFolders } var includedFolders: MutableSet get() = prefs.getStringSet(INCLUDED_FOLDERS, HashSet()) set(includedFolders) = prefs.edit().remove(INCLUDED_FOLDERS).putStringSet(INCLUDED_FOLDERS, includedFolders).apply() fun saveFolderMedia(path: String, json: String) { prefs.edit().putString(SAVE_FOLDER_PREFIX + path, json).apply() } fun loadFolderMedia(path: String) = prefs.getString(SAVE_FOLDER_PREFIX + path, "") var autoplayVideos: Boolean get() = prefs.getBoolean(AUTOPLAY_VIDEOS, false) set(autoplay) = prefs.edit().putBoolean(AUTOPLAY_VIDEOS, autoplay).apply() var animateGifs: Boolean get() = prefs.getBoolean(ANIMATE_GIFS, false) set(animateGifs) = prefs.edit().putBoolean(ANIMATE_GIFS, animateGifs).apply() var maxBrightness: Boolean get() = prefs.getBoolean(MAX_BRIGHTNESS, false) set(maxBrightness) = prefs.edit().putBoolean(MAX_BRIGHTNESS, maxBrightness).apply() var cropThumbnails: Boolean get() = prefs.getBoolean(CROP_THUMBNAILS, true) set(cropThumbnails) = prefs.edit().putBoolean(CROP_THUMBNAILS, cropThumbnails).apply() var screenRotation: Int get() = prefs.getInt(SCREEN_ROTATION, ROTATE_BY_SYSTEM_SETTING) set(screenRotation) = prefs.edit().putInt(SCREEN_ROTATION, screenRotation).apply() var loopVideos: Boolean get() = prefs.getBoolean(LOOP_VIDEOS, false) set(loop) = prefs.edit().putBoolean(LOOP_VIDEOS, loop).apply() var displayFileNames: Boolean get() = prefs.getBoolean(DISPLAY_FILE_NAMES, false) set(display) = prefs.edit().putBoolean(DISPLAY_FILE_NAMES, display).apply() var darkBackground: Boolean get() = prefs.getBoolean(DARK_BACKGROUND, false) set(darkBackground) = prefs.edit().putBoolean(DARK_BACKGROUND, darkBackground).apply() var filterMedia: Int get() = prefs.getInt(FILTER_MEDIA, IMAGES or VIDEOS or GIFS) set(filterMedia) = prefs.edit().putInt(FILTER_MEDIA, filterMedia).apply() var dirColumnCnt: Int get() = prefs.getInt(getDirectoryColumnsField(), getDefaultDirectoryColumnCount()) set(dirColumnCnt) = prefs.edit().putInt(getDirectoryColumnsField(), dirColumnCnt).apply() private fun getDirectoryColumnsField(): String { val isPortrait = context.resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT return if (isPortrait) { if (scrollHorizontally) { DIR_HORIZONTAL_COLUMN_CNT } else { DIR_COLUMN_CNT } } else { if (scrollHorizontally) { DIR_LANDSCAPE_HORIZONTAL_COLUMN_CNT } else { DIR_LANDSCAPE_COLUMN_CNT } } } private fun getDefaultDirectoryColumnCount() = context.resources.getInteger(if (scrollHorizontally) R.integer.directory_columns_horizontal_scroll else R.integer.directory_columns_vertical_scroll) var mediaColumnCnt: Int get() = prefs.getInt(getMediaColumnsField(), getDefaultMediaColumnCount()) set(mediaColumnCnt) = prefs.edit().putInt(getMediaColumnsField(), mediaColumnCnt).apply() private fun getMediaColumnsField(): String { val isPortrait = context.resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT return if (isPortrait) { if (scrollHorizontally) { MEDIA_HORIZONTAL_COLUMN_CNT } else { MEDIA_COLUMN_CNT } } else { if (scrollHorizontally) { MEDIA_LANDSCAPE_HORIZONTAL_COLUMN_CNT } else { MEDIA_LANDSCAPE_COLUMN_CNT } } } private fun getDefaultMediaColumnCount() = context.resources.getInteger(if (scrollHorizontally) R.integer.media_columns_horizontal_scroll else R.integer.media_columns_vertical_scroll) var directories: String get() = prefs.getString(DIRECTORIES, "") set(directories) = prefs.edit().putString(DIRECTORIES, directories).apply() var albumCovers: String get() = prefs.getString(ALBUM_COVERS, "") set(albumCovers) = prefs.edit().putString(ALBUM_COVERS, albumCovers).apply() fun parseAlbumCovers(): ArrayList { val listType = object : TypeToken>() {}.type return Gson().fromJson>(albumCovers, listType) ?: ArrayList(1) } var scrollHorizontally: Boolean get() = prefs.getBoolean(SCROLL_HORIZONTALLY, false) set(scrollHorizontally) = prefs.edit().putBoolean(SCROLL_HORIZONTALLY, scrollHorizontally).apply() var hideSystemUI: Boolean get() = prefs.getBoolean(HIDE_SYSTEM_UI, false) set(hideSystemUI) = prefs.edit().putBoolean(HIDE_SYSTEM_UI, hideSystemUI).apply() var replaceShare: Boolean get() = prefs.getBoolean(REPLACE_SHARE_WITH_ROTATE, false) set(replaceShare) = prefs.edit().putBoolean(REPLACE_SHARE_WITH_ROTATE, replaceShare).apply() var deleteEmptyFolders: Boolean get() = prefs.getBoolean(DELETE_EMPTY_FOLDERS, true) set(deleteEmptyFolders) = prefs.edit().putBoolean(DELETE_EMPTY_FOLDERS, deleteEmptyFolders).apply() var allowVideoGestures: Boolean get() = prefs.getBoolean(ALLOW_VIDEO_GESTURES, true) set(allowVideoGestures) = prefs.edit().putBoolean(ALLOW_VIDEO_GESTURES, allowVideoGestures).apply() var slideshowInterval: Int get() = prefs.getInt(SLIDESHOW_INTERVAL, SLIDESHOW_DEFAULT_INTERVAL) set(slideshowInterval) = prefs.edit().putInt(SLIDESHOW_INTERVAL, slideshowInterval).apply() var slideshowIncludePhotos: Boolean get() = prefs.getBoolean(SLIDESHOW_INCLUDE_PHOTOS, true) set(slideshowIncludePhotos) = prefs.edit().putBoolean(SLIDESHOW_INCLUDE_PHOTOS, slideshowIncludePhotos).apply() var slideshowIncludeVideos: Boolean get() = prefs.getBoolean(SLIDESHOW_INCLUDE_VIDEOS, false) set(slideshowIncludeVideos) = prefs.edit().putBoolean(SLIDESHOW_INCLUDE_VIDEOS, slideshowIncludeVideos).apply() var slideshowIncludeGIFs: Boolean get() = prefs.getBoolean(SLIDESHOW_INCLUDE_GIFS, false) set(slideshowIncludeGIFs) = prefs.edit().putBoolean(SLIDESHOW_INCLUDE_GIFS, slideshowIncludeGIFs).apply() var slideshowRandomOrder: Boolean get() = prefs.getBoolean(SLIDESHOW_RANDOM_ORDER, false) set(slideshowRandomOrder) = prefs.edit().putBoolean(SLIDESHOW_RANDOM_ORDER, slideshowRandomOrder).apply() var slideshowUseFade: Boolean get() = prefs.getBoolean(SLIDESHOW_USE_FADE, false) set(slideshowUseFade) = prefs.edit().putBoolean(SLIDESHOW_USE_FADE, slideshowUseFade).apply() var slideshowMoveBackwards: Boolean get() = prefs.getBoolean(SLIDESHOW_MOVE_BACKWARDS, false) set(slideshowMoveBackwards) = prefs.edit().putBoolean(SLIDESHOW_MOVE_BACKWARDS, slideshowMoveBackwards).apply() var loopSlideshow: Boolean get() = prefs.getBoolean(SLIDESHOW_LOOP, false) set(loopSlideshow) = prefs.edit().putBoolean(SLIDESHOW_LOOP, loopSlideshow).apply() var tempFolderPath: String get() = prefs.getString(TEMP_FOLDER_PATH, "") set(tempFolderPath) = prefs.edit().putString(TEMP_FOLDER_PATH, tempFolderPath).apply() var viewTypeFolders: Int get() = prefs.getInt(VIEW_TYPE_FOLDERS, VIEW_TYPE_GRID) set(viewTypeFolders) = prefs.edit().putInt(VIEW_TYPE_FOLDERS, viewTypeFolders).apply() var viewTypeFiles: Int get() = prefs.getInt(VIEW_TYPE_FILES, VIEW_TYPE_GRID) set(viewTypeFiles) = prefs.edit().putInt(VIEW_TYPE_FILES, viewTypeFiles).apply() var showExtendedDetails: Boolean get() = prefs.getBoolean(SHOW_EXTENDED_DETAILS, false) set(showExtendedDetails) = prefs.edit().putBoolean(SHOW_EXTENDED_DETAILS, showExtendedDetails).apply() var extendedDetails: Int get() = prefs.getInt(EXTENDED_DETAILS, EXT_RESOLUTION or EXT_LAST_MODIFIED or EXT_EXIF_PROPERTIES) set(extendedDetails) = prefs.edit().putInt(EXTENDED_DETAILS, extendedDetails).apply() }