/* * Copyright 2015 Hippo Seven * * 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.hippo.nimingban.util; import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.net.Uri; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; import com.hippo.nimingban.NMBAppConfig; import com.hippo.unifile.UniFile; import com.hippo.yorozuya.IOUtils; import com.hippo.yorozuya.MathUtils; import com.hippo.yorozuya.NumberUtils; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public final class Settings { private static Context sContext; private static SharedPreferences sSettingsPre; private static boolean sCheckExtendFeedId = false; private static String sExtendFeedId = null; public static void initialize(Context context) { sContext = context.getApplicationContext(); sSettingsPre = PreferenceManager.getDefaultSharedPreferences(sContext); } public static boolean getBoolean(String key, boolean defValue) { return sSettingsPre.getBoolean(key, defValue); } public static void putBoolean(String key, boolean value) { sSettingsPre.edit().putBoolean(key, value).apply(); } public static int getInt(String key, int defValue) { return sSettingsPre.getInt(key, defValue); } public static void putInt(String key, int value) { sSettingsPre.edit().putInt(key, value).apply(); } public static long getLong(String key, long defValue) { return sSettingsPre.getLong(key, defValue); } public static void putLong(String key, long value) { sSettingsPre.edit().putLong(key, value).apply(); } public static float getFloat(String key, float defValue) { return sSettingsPre.getFloat(key, defValue); } public static void putFloat(String key, float value) { sSettingsPre.edit().putFloat(key, value).apply(); } public static String getString(String key, String defValue) { return sSettingsPre.getString(key, defValue); } public static void putString(String key, String value) { sSettingsPre.edit().putString(key, value).apply(); } public static int getIntFromStr(String key, int defValue) { return NumberUtils.parseIntSafely(sSettingsPre.getString(key, Integer.toString(defValue)), defValue); } public static void putIntToStr(String key, int value) { sSettingsPre.edit().putString(key, Integer.toString(value)).apply(); } public static final int IMAGE_LOADING_STRATEGY_ALL = 0; public static final int IMAGE_LOADING_STRATEGY_WIFI = 1; public static final int IMAGE_LOADING_STRATEGY_NO = 2; public static final String KEY_DARK_THEME = "dark_theme"; public static final boolean DEFAULT_DARK_THEME = false; public static final String KEY_PRETTY_TIME = "pretty_time"; public static final boolean DEFAULT_PRETTY_TIME = true; public static final String KEY_FONT_SIZE = "font_size"; public static final int DEFAULT_FONT_SIZE = 16; public static final String KEY_LINE_SPACING = "line_spacing"; public static final int DEFAULT_LINE_SPACING = 1; public static final String KEY_DYNAMIC_COMMENTS = "dynamic_comments"; public static final boolean DEFAULT_DYNAMIC_COMMENTS = true; public static final String KEY_FAST_SCROLLER = "fast_scroller"; public static final boolean DEFAULT_FAST_SCROLLER = true; public static final String KEY_COLOR_STATUS_BAR = "color_status_bar"; public static final boolean DEFAULT_COLOR_STATUS_BAR = true; public static final String KEY_FIX_EMOJI_DISPLAY = "fix_emoji_display"; public static final boolean DEFAULT_FIX_EMOJI_DISPLAY = false; public static final String KEY_WATERMARK = "watermark"; public static final boolean DEFAULT_WATERMARKD = true; public static final String KEY_FEED_ID = "feed_id"; public static final String DEFAULT_FEED_ID = null; public static final String KEY_SAVE_IMAGE_AUTO = "save_image_auto"; public static final boolean DEFAULT_SAVE_IMAGE_AUTO = false; public static final String KEY_IMAGE_LOADING_STRATEGY = "image_loading_strategy"; public static final int DEFAULT_IMAGE_LOADING_STRATEGY = 0; public static final String KEY_IMAGE_SAVE_LOACTION = "image_save_location"; public static final String KEY_IMAGE_LOADING_STRATEGY_2 = "image_loading_strategy_2"; public static final boolean DEFAULT_IMAGE_LOADING_STRATEGY_2 = false; public static final String KEY_IMAGE_SAVE_SCHEME = "image_scheme"; public static final String KEY_IMAGE_SAVE_AUTHORITY = "image_authority"; public static final String KEY_IMAGE_SAVE_PATH = "image_path"; public static final String KEY_IMAGE_SAVE_QUERY = "image_query"; public static final String KEY_IMAGE_SAVE_FRAGMENT = "image_fragment"; public static final String KEY_CHAOS_LEVEL = "chaos_level"; public static final int DEFAULT_CHAOS_LEVEL = 0; public static final String KEY_SET_ANALYSIS = "set_analysis"; public static final boolean DEFAULT_SET_ANALYSIS = false; public static final String KEY_ANALYSIS = "analysis"; public static final boolean DEFAULT_ANALYSIS = false; public static boolean getDarkTheme() { return getBoolean(KEY_DARK_THEME, DEFAULT_DARK_THEME); } public static void putDarkTheme(boolean value) { putBoolean(KEY_DARK_THEME, value); } public static boolean getPrettyTime() { return getBoolean(KEY_PRETTY_TIME, DEFAULT_PRETTY_TIME); } public static int getFontSize() { return getInt(KEY_FONT_SIZE, DEFAULT_FONT_SIZE); } public static void putFontSize(int value) { putInt(KEY_FONT_SIZE, value); } public static int getLineSpacing() { return getInt(KEY_LINE_SPACING, DEFAULT_LINE_SPACING); } public static void putLineSpacing(int value) { putInt(KEY_LINE_SPACING, value); } public static boolean getDynamicComments() { return getBoolean(KEY_DYNAMIC_COMMENTS, DEFAULT_DYNAMIC_COMMENTS); } public static boolean getFastScroller() { return getBoolean(KEY_FAST_SCROLLER, DEFAULT_FAST_SCROLLER); } public static boolean getColorStatusBar() { return getBoolean(KEY_COLOR_STATUS_BAR, DEFAULT_COLOR_STATUS_BAR); } public static boolean getFixEmojiDisplay() { return getBoolean(KEY_FIX_EMOJI_DISPLAY, DEFAULT_FIX_EMOJI_DISPLAY); } public static boolean getWatermark() { return getBoolean(KEY_WATERMARK, DEFAULT_WATERMARKD); } public static String getFeedId() { if (!sCheckExtendFeedId) { sCheckExtendFeedId = true; // Get extend feed id File feedIdFile = NMBAppConfig.getFileInAppDir(KEY_FEED_ID); if (feedIdFile != null) { FileInputStream fis; try { fis = new FileInputStream(feedIdFile); String feedId = IOUtils.readString(fis, "UTF-8"); if (!TextUtils.isEmpty(feedId)) { sExtendFeedId = feedId; putFeedId(sExtendFeedId); } } catch (IOException e) { // Ignore } } } if (sExtendFeedId != null) { return sExtendFeedId; } else { String feedId = getString(KEY_FEED_ID, DEFAULT_FEED_ID); if (!TextUtils.isEmpty(feedId)) { return feedId; } else { feedId = getRandomFeedId(); putFeedId(feedId); return feedId; } } } public static void putFeedId(String value) { putString(KEY_FEED_ID, value); sExtendFeedId = value; // Put it to file File file = NMBAppConfig.getFileInAppDir(KEY_FEED_ID); if (file != null) { FileOutputStream os = null; try { os = new FileOutputStream(file); IOUtils.copy(new ByteArrayInputStream(value.getBytes()), os); os.flush(); } catch (IOException e) { file.delete(); } finally { IOUtils.closeQuietly(os); } } } public static @NonNull String getRandomFeedId() { int length = 20; StringBuilder sb = new StringBuilder(length); for (int i = 0; i < length; i++) { if (MathUtils.random(0, 1 + 1) == 0) { sb.append((char) MathUtils.random('a', 'z' + 1)); } else { sb.append((char) MathUtils.random('0', '9' + 1)); } } return sb.toString(); } public static String getMacFeedId() { WifiManager wifi = (WifiManager) sContext.getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); if (info == null) { return null; } String mac = info.getMacAddress(); if (mac == null) { return null; } String id; try { MessageDigest digest = MessageDigest.getInstance("MD5"); digest.update(mac.getBytes()); id = bytesToHexString(digest.digest()); } catch (NoSuchAlgorithmException e) { id = String.valueOf(mac.hashCode()); } return id; } public static boolean getSaveImageAuto() { return getBoolean(KEY_SAVE_IMAGE_AUTO, DEFAULT_SAVE_IMAGE_AUTO); } public static int getImageLoadingStrategy() { return getIntFromStr(KEY_IMAGE_LOADING_STRATEGY, DEFAULT_IMAGE_LOADING_STRATEGY); } public static boolean getImageLoadingStrategy2() { return getBoolean(KEY_IMAGE_LOADING_STRATEGY_2, DEFAULT_IMAGE_LOADING_STRATEGY_2); } @Nullable public static UniFile getImageSaveLocation() { UniFile dir = null; try { Uri.Builder builder = new Uri.Builder(); builder.scheme(getString(KEY_IMAGE_SAVE_SCHEME, null)); builder.encodedAuthority(getString(KEY_IMAGE_SAVE_AUTHORITY, null)); builder.encodedPath(getString(KEY_IMAGE_SAVE_PATH, null)); builder.encodedQuery(getString(KEY_IMAGE_SAVE_QUERY, null)); builder.encodedFragment(getString(KEY_IMAGE_SAVE_FRAGMENT, null)); dir = UniFile.fromUri(sContext, builder.build()); } catch (Exception e) { e.printStackTrace(); } return dir != null ? dir : UniFile.fromFile(NMBAppConfig.getImageDir()); } public static void putImageSaveLocation(@NonNull UniFile location) { Uri uri = location.getUri(); putString(KEY_IMAGE_SAVE_SCHEME, uri.getScheme()); putString(KEY_IMAGE_SAVE_AUTHORITY, uri.getEncodedAuthority()); putString(KEY_IMAGE_SAVE_PATH, uri.getEncodedPath()); putString(KEY_IMAGE_SAVE_QUERY, uri.getEncodedQuery()); putString(KEY_IMAGE_SAVE_FRAGMENT, uri.getEncodedFragment()); } public static int getChaosLevel() { return getIntFromStr(KEY_CHAOS_LEVEL, DEFAULT_CHAOS_LEVEL); } public static boolean getSetAnalysis() { return getBoolean(KEY_SET_ANALYSIS, DEFAULT_SET_ANALYSIS); } public static void putSetAnalysis(boolean value) { putBoolean(KEY_SET_ANALYSIS, value); } public static boolean getAnalysis() { return getBoolean(KEY_ANALYSIS, DEFAULT_ANALYSIS); } public static void putAnalysis(boolean value) { putBoolean(KEY_ANALYSIS, value); } private static final String KEY_VERSION_CODE = "version_code"; private static final int DEFAULT_VERSION_CODE = 0; public static int getVersionCode() { return getInt(KEY_VERSION_CODE, DEFAULT_VERSION_CODE); } public static void putVersionCode(int value) { putInt(KEY_VERSION_CODE, value); } public static final String KEY_GUIDE_LIST_ACTIVITY = "guide_list_activity"; public static final boolean VALUE_GUIDE_LIST_ACTIVITY = true; public static boolean getGuideListActivity() { return getBoolean(KEY_GUIDE_LIST_ACTIVITY, VALUE_GUIDE_LIST_ACTIVITY); } public static void putGuideListActivity(boolean value) { putBoolean(KEY_GUIDE_LIST_ACTIVITY, value); } public static final String KEY_NEW_ICON = "new_icon"; public static final boolean VALUE_NEW_ICON = true; public static boolean getNewIcon() { return getBoolean(KEY_NEW_ICON, VALUE_NEW_ICON); } public static void putNewIcon(boolean value) { putBoolean(KEY_NEW_ICON, value); } public static final String[] ICON_ACTIVITY_ARRAY = { "com.hippo.nimingban.ui.ListActivity", "com.hippo.nimingban.ui.ListActivity-ibuki", }; public static String getDefaultIconActivity() { return ICON_ACTIVITY_ARRAY[0]; } public static String getCurrentIconActivity() { return ICON_ACTIVITY_ARRAY[getIntFromStr("app_icon", 0)]; } public static final String KEY_GUIDE_SORT_FORUMS_ACTIVITY = "guide_sort_forums_activity"; public static final boolean VALUE_GUIDE_SORT_FORUMS_ACTIVITY = true; public static boolean getGuideSortForumsActivity() { return getBoolean(KEY_GUIDE_SORT_FORUMS_ACTIVITY, VALUE_GUIDE_SORT_FORUMS_ACTIVITY); } public static void putGuideSortForumsActivity(boolean value) { putBoolean(KEY_GUIDE_SORT_FORUMS_ACTIVITY, value); } public static final String KEY_GUIDE_TYPE_SEND = "guide_type_send"; public static final boolean VALUE_GUIDE_TYPE_SEND = true; public static boolean getGuideTypeSend() { return getBoolean(KEY_GUIDE_TYPE_SEND, VALUE_GUIDE_TYPE_SEND); } public static void putGuideTypeSend(boolean value) { putBoolean(KEY_GUIDE_TYPE_SEND, value); } public static final String KEY_NOTICE_DATE = "notice_date"; public static final long VALUE_NOTICE_DATE = -1; public static long getNoticeDate() { return getLong(KEY_NOTICE_DATE, VALUE_NOTICE_DATE); } public static void putNoticeDate(long value) { putLong(KEY_NOTICE_DATE, value); } public static final String KEY_CRASH_FILENAME = "crash_filename"; public static final String VALUE_CRASH_FILENAME = null; public static String getCrashFilename() { return getString(KEY_CRASH_FILENAME, VALUE_CRASH_FILENAME); } @SuppressLint("CommitPrefEdits") public static void putCrashFilename(String value) { sSettingsPre.edit().putString(KEY_CRASH_FILENAME, value).commit(); } /** * http://stackoverflow.com/questions/332079 * * @param bytes The bytes to convert. * @return A {@link String} converted from the bytes of a hashable key used * to store a filename on the disk, to hex digits. */ private static String bytesToHexString(final byte[] bytes) { final StringBuilder builder = new StringBuilder(); for (final byte b : bytes) { final String hex = Integer.toHexString(0xFF & b); if (hex.length() == 1) { builder.append('0'); } builder.append(hex); } return builder.toString(); } }