diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java index dc4ea395e..ce54eb30e 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java @@ -30,275 +30,281 @@ import static org.mariotaku.twidere.annotation.Preference.Type.STRING; public interface SharedPreferenceConstants { - public static final String FORMAT_PATTERN_TITLE = "[TITLE]"; - public static final String FORMAT_PATTERN_TEXT = "[TEXT]"; - public static final String FORMAT_PATTERN_NAME = "[NAME]"; - public static final String FORMAT_PATTERN_LINK = "[LINK]"; + String FORMAT_PATTERN_TITLE = "[TITLE]"; + String FORMAT_PATTERN_TEXT = "[TEXT]"; + String FORMAT_PATTERN_NAME = "[NAME]"; + String FORMAT_PATTERN_LINK = "[LINK]"; - public static final String VALUE_NONE = "none"; - public static final String VALUE_LINK_HIGHLIGHT_OPTION_NONE = VALUE_NONE; - public static final String VALUE_LINK_HIGHLIGHT_OPTION_HIGHLIGHT = "highlight"; - public static final String VALUE_LINK_HIGHLIGHT_OPTION_UNDERLINE = "underline"; - public static final String VALUE_LINK_HIGHLIGHT_OPTION_BOTH = "both"; - public static final int VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE = 0x0; - public static final int VALUE_LINK_HIGHLIGHT_OPTION_CODE_HIGHLIGHT = 0x1; - public static final int VALUE_LINK_HIGHLIGHT_OPTION_CODE_UNDERLINE = 0x2; - public static final int VALUE_LINK_HIGHLIGHT_OPTION_CODE_BOTH = VALUE_LINK_HIGHLIGHT_OPTION_CODE_HIGHLIGHT + String VALUE_NONE = "none"; + String VALUE_LINK_HIGHLIGHT_OPTION_NONE = VALUE_NONE; + String VALUE_LINK_HIGHLIGHT_OPTION_HIGHLIGHT = "highlight"; + String VALUE_LINK_HIGHLIGHT_OPTION_UNDERLINE = "underline"; + String VALUE_LINK_HIGHLIGHT_OPTION_BOTH = "both"; + int VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE = 0x0; + int VALUE_LINK_HIGHLIGHT_OPTION_CODE_HIGHLIGHT = 0x1; + int VALUE_LINK_HIGHLIGHT_OPTION_CODE_UNDERLINE = 0x2; + int VALUE_LINK_HIGHLIGHT_OPTION_CODE_BOTH = VALUE_LINK_HIGHLIGHT_OPTION_CODE_HIGHLIGHT | VALUE_LINK_HIGHLIGHT_OPTION_CODE_UNDERLINE; - public static final String VALUE_MEDIA_PREVIEW_STYLE_CROP = "crop"; - public static final String VALUE_MEDIA_PREVIEW_STYLE_SCALE = "scale"; - public static final String VALUE_MEDIA_PREVIEW_STYLE_NONE = VALUE_NONE; + String VALUE_MEDIA_PREVIEW_STYLE_CROP = "crop"; + String VALUE_MEDIA_PREVIEW_STYLE_SCALE = "scale"; + String VALUE_MEDIA_PREVIEW_STYLE_NONE = VALUE_NONE; - public static final int VALUE_MEDIA_PREVIEW_STYLE_CODE_CROP = 1; - public static final int VALUE_MEDIA_PREVIEW_STYLE_CODE_SCALE = 2; - public static final int VALUE_MEDIA_PREVIEW_STYLE_CODE_NONE = 0; + int VALUE_MEDIA_PREVIEW_STYLE_CODE_CROP = 1; + int VALUE_MEDIA_PREVIEW_STYLE_CODE_SCALE = 2; + int VALUE_MEDIA_PREVIEW_STYLE_CODE_NONE = 0; - public static final String VALUE_THEME_FONT_FAMILY_REGULAR = "sans-serif"; - public static final String VALUE_THEME_FONT_FAMILY_CONDENSED = "sans-serif-condensed"; - public static final String VALUE_THEME_FONT_FAMILY_LIGHT = "sans-serif-light"; - public static final String VALUE_THEME_FONT_FAMILY_THIN = "sans-serif-thin"; + String VALUE_THEME_FONT_FAMILY_REGULAR = "sans-serif"; + String VALUE_THEME_FONT_FAMILY_CONDENSED = "sans-serif-condensed"; + String VALUE_THEME_FONT_FAMILY_LIGHT = "sans-serif-light"; + String VALUE_THEME_FONT_FAMILY_THIN = "sans-serif-thin"; - public static final int VALUE_NOTIFICATION_FLAG_NONE = 0x0; - public static final int VALUE_NOTIFICATION_FLAG_RINGTONE = 0x1; - public static final int VALUE_NOTIFICATION_FLAG_VIBRATION = 0x2; - public static final int VALUE_NOTIFICATION_FLAG_LIGHT = 0x4; + int VALUE_NOTIFICATION_FLAG_NONE = 0x0; + int VALUE_NOTIFICATION_FLAG_RINGTONE = 0x1; + int VALUE_NOTIFICATION_FLAG_VIBRATION = 0x2; + int VALUE_NOTIFICATION_FLAG_LIGHT = 0x4; - public static final String VALUE_COMPOSE_QUIT_ACTION_ASK = "ask"; - public static final String VALUE_COMPOSE_QUIT_ACTION_SAVE = "save"; - public static final String VALUE_COMPOSE_QUIT_ACTION_DISCARD = "discard"; + String VALUE_COMPOSE_QUIT_ACTION_ASK = "ask"; + String VALUE_COMPOSE_QUIT_ACTION_SAVE = "save"; + String VALUE_COMPOSE_QUIT_ACTION_DISCARD = "discard"; - public static final String VALUE_TAB_DIPLAY_OPTION_ICON = "icon"; - public static final String VALUE_TAB_DIPLAY_OPTION_LABEL = "label"; - public static final String VALUE_TAB_DIPLAY_OPTION_BOTH = "both"; - public static final int VALUE_TAB_DIPLAY_OPTION_CODE_ICON = 0x1; - public static final int VALUE_TAB_DIPLAY_OPTION_CODE_LABEL = 0x2; - public static final int VALUE_TAB_DIPLAY_OPTION_CODE_BOTH = VALUE_TAB_DIPLAY_OPTION_CODE_ICON + String VALUE_TAB_DIPLAY_OPTION_ICON = "icon"; + String VALUE_TAB_DIPLAY_OPTION_LABEL = "label"; + String VALUE_TAB_DIPLAY_OPTION_BOTH = "both"; + int VALUE_TAB_DIPLAY_OPTION_CODE_ICON = 0x1; + int VALUE_TAB_DIPLAY_OPTION_CODE_LABEL = 0x2; + int VALUE_TAB_DIPLAY_OPTION_CODE_BOTH = VALUE_TAB_DIPLAY_OPTION_CODE_ICON | VALUE_TAB_DIPLAY_OPTION_CODE_LABEL; - public static final String VALUE_THEME_BACKGROUND_DEFAULT = "default"; - public static final String VALUE_THEME_BACKGROUND_SOLID = "solid"; - public static final String VALUE_THEME_BACKGROUND_TRANSPARENT = "transparent"; + String VALUE_THEME_BACKGROUND_DEFAULT = "default"; + String VALUE_THEME_BACKGROUND_SOLID = "solid"; + String VALUE_THEME_BACKGROUND_TRANSPARENT = "transparent"; - public static final String VALUE_THEME_NAME_TWIDERE = "twidere"; - public static final String VALUE_THEME_NAME_DARK = "dark"; - public static final String VALUE_THEME_NAME_LIGHT = "light"; + String VALUE_THEME_NAME_TWIDERE = "twidere"; + String VALUE_THEME_NAME_DARK = "dark"; + String VALUE_THEME_NAME_LIGHT = "light"; - public static final String VALUE_PROFILE_IMAGE_STYLE_ROUND = "round"; - public static final String VALUE_PROFILE_IMAGE_STYLE_SQUARE = "square"; + String VALUE_PROFILE_IMAGE_STYLE_ROUND = "round"; + String VALUE_PROFILE_IMAGE_STYLE_SQUARE = "square"; - public static final String VALUE_COMPOSE_NOW_ACTION_COMPOSE = "compose"; - public static final String VALUE_COMPOSE_NOW_ACTION_TAKE_PHOTO = "take_photo"; - public static final String VALUE_COMPOSE_NOW_ACTION_PICK_IMAGE = "pick_image"; + String VALUE_COMPOSE_NOW_ACTION_COMPOSE = "compose"; + String VALUE_COMPOSE_NOW_ACTION_TAKE_PHOTO = "take_photo"; + String VALUE_COMPOSE_NOW_ACTION_PICK_IMAGE = "pick_image"; - public static final String VALUE_CARD_HIGHLIGHT_OPTION_NONE = VALUE_NONE; - public static final String VALUE_CARD_HIGHLIGHT_OPTION_BACKGROUND = "background"; - public static final String VALUE_CARD_HIGHLIGHT_OPTION_LINE = "line"; + String VALUE_CARD_HIGHLIGHT_OPTION_NONE = VALUE_NONE; + String VALUE_CARD_HIGHLIGHT_OPTION_BACKGROUND = "background"; + String VALUE_CARD_HIGHLIGHT_OPTION_LINE = "line"; - public static final int VALUE_CARD_HIGHLIGHT_OPTION_CODE_NONE = 0x0; - public static final int VALUE_CARD_HIGHLIGHT_OPTION_CODE_BACKGROUND = 0x1; - public static final int VALUE_CARD_HIGHLIGHT_OPTION_CODE_LINE = 0x2; + int VALUE_CARD_HIGHLIGHT_OPTION_CODE_NONE = 0x0; + int VALUE_CARD_HIGHLIGHT_OPTION_CODE_BACKGROUND = 0x1; + int VALUE_CARD_HIGHLIGHT_OPTION_CODE_LINE = 0x2; - public static final String DEFAULT_THEME = VALUE_THEME_NAME_TWIDERE; - public static final String DEFAULT_THEME_BACKGROUND = VALUE_THEME_BACKGROUND_DEFAULT; - public static final String DEFAULT_THEME_FONT_FAMILY = VALUE_THEME_FONT_FAMILY_REGULAR; - public static final int DEFAULT_THEME_BACKGROUND_ALPHA = 160; + String DEFAULT_THEME = VALUE_THEME_NAME_TWIDERE; + String DEFAULT_THEME_BACKGROUND = VALUE_THEME_BACKGROUND_DEFAULT; + String DEFAULT_THEME_FONT_FAMILY = VALUE_THEME_FONT_FAMILY_REGULAR; + int DEFAULT_THEME_BACKGROUND_ALPHA = 160; - public static final String DEFAULT_QUOTE_FORMAT = "RT @" + FORMAT_PATTERN_NAME + ": " + FORMAT_PATTERN_TEXT; - public static final String DEFAULT_SHARE_FORMAT = FORMAT_PATTERN_TITLE + " - " + FORMAT_PATTERN_TEXT; - public static final String DEFAULT_IMAGE_UPLOAD_FORMAT = FORMAT_PATTERN_TEXT + " " + FORMAT_PATTERN_LINK; + String DEFAULT_QUOTE_FORMAT = "RT @" + FORMAT_PATTERN_NAME + ": " + FORMAT_PATTERN_TEXT; + String DEFAULT_SHARE_FORMAT = FORMAT_PATTERN_TITLE + " - " + FORMAT_PATTERN_TEXT; + String DEFAULT_IMAGE_UPLOAD_FORMAT = FORMAT_PATTERN_TEXT + " " + FORMAT_PATTERN_LINK; - public static final String DEFAULT_REFRESH_INTERVAL = "15"; - public static final boolean DEFAULT_AUTO_REFRESH = true; - public static final boolean DEFAULT_AUTO_REFRESH_HOME_TIMELINE = false; - public static final boolean DEFAULT_AUTO_REFRESH_MENTIONS = true; - public static final boolean DEFAULT_AUTO_REFRESH_DIRECT_MESSAGES = true; - public static final boolean DEFAULT_AUTO_REFRESH_TRENDS = false; - public static final boolean DEFAULT_NOTIFICATION = true; - public static final int DEFAULT_NOTIFICATION_TYPE_HOME = VALUE_NOTIFICATION_FLAG_NONE; - public static final int DEFAULT_NOTIFICATION_TYPE_MENTIONS = VALUE_NOTIFICATION_FLAG_VIBRATION + String DEFAULT_REFRESH_INTERVAL = "15"; + boolean DEFAULT_AUTO_REFRESH = true; + boolean DEFAULT_AUTO_REFRESH_HOME_TIMELINE = false; + boolean DEFAULT_AUTO_REFRESH_MENTIONS = true; + boolean DEFAULT_AUTO_REFRESH_DIRECT_MESSAGES = true; + boolean DEFAULT_AUTO_REFRESH_TRENDS = false; + boolean DEFAULT_NOTIFICATION = true; + int DEFAULT_NOTIFICATION_TYPE_HOME = VALUE_NOTIFICATION_FLAG_NONE; + int DEFAULT_NOTIFICATION_TYPE_MENTIONS = VALUE_NOTIFICATION_FLAG_VIBRATION | VALUE_NOTIFICATION_FLAG_LIGHT; - public static final int DEFAULT_NOTIFICATION_TYPE_DIRECT_MESSAGES = VALUE_NOTIFICATION_FLAG_RINGTONE + int DEFAULT_NOTIFICATION_TYPE_DIRECT_MESSAGES = VALUE_NOTIFICATION_FLAG_RINGTONE | VALUE_NOTIFICATION_FLAG_VIBRATION | VALUE_NOTIFICATION_FLAG_LIGHT; - public static final boolean DEFAULT_HOME_TIMELINE_NOTIFICATION = false; - public static final boolean DEFAULT_MENTIONS_NOTIFICATION = true; - public static final boolean DEFAULT_DIRECT_MESSAGES_NOTIFICATION = true; + boolean DEFAULT_HOME_TIMELINE_NOTIFICATION = false; + boolean DEFAULT_MENTIONS_NOTIFICATION = true; + boolean DEFAULT_DIRECT_MESSAGES_NOTIFICATION = true; - public static final int DEFAULT_DATABASE_ITEM_LIMIT = 100; - public static final int DEFAULT_LOAD_ITEM_LIMIT = 20; - public static final String DEFAULT_CARD_HIGHLIGHT_OPTION = VALUE_CARD_HIGHLIGHT_OPTION_BACKGROUND; + int DEFAULT_DATABASE_ITEM_LIMIT = 100; + int DEFAULT_LOAD_ITEM_LIMIT = 20; + String DEFAULT_CARD_HIGHLIGHT_OPTION = VALUE_CARD_HIGHLIGHT_OPTION_BACKGROUND; @Preference(type = INT, hasDefault = true, defaultInt = DEFAULT_DATABASE_ITEM_LIMIT) - public static final String KEY_DATABASE_ITEM_LIMIT = "database_item_limit"; + String KEY_DATABASE_ITEM_LIMIT = "database_item_limit"; @Preference(type = INT, hasDefault = true, defaultInt = DEFAULT_LOAD_ITEM_LIMIT) - public static final String KEY_LOAD_ITEM_LIMIT = "load_item_limit"; + String KEY_LOAD_ITEM_LIMIT = "load_item_limit"; @Preference(type = INT, hasDefault = true, defaultInt = 15) - public static final String KEY_TEXT_SIZE = "text_size_int"; + String KEY_TEXT_SIZE = "text_size_int"; @Preference(type = STRING, hasDefault = true, defaultString = DEFAULT_THEME) - public static final String KEY_THEME = "theme"; + String KEY_THEME = "theme"; @Preference(type = STRING, hasDefault = true, defaultString = DEFAULT_THEME_BACKGROUND) - public static final String KEY_THEME_BACKGROUND = "theme_background"; + String KEY_THEME_BACKGROUND = "theme_background"; @Preference(type = INT, hasDefault = true, defaultInt = DEFAULT_THEME_BACKGROUND_ALPHA) - public static final String KEY_THEME_BACKGROUND_ALPHA = "theme_background_alpha"; + String KEY_THEME_BACKGROUND_ALPHA = "theme_background_alpha"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = true) - public static final String KEY_THEME_DARK_ACTIONBAR = "theme_dark_actionbar"; + String KEY_THEME_DARK_ACTIONBAR = "theme_dark_actionbar"; @Preference(type = INT) - public static final String KEY_THEME_COLOR = "theme_color"; + String KEY_THEME_COLOR = "theme_color"; @Preference(type = STRING, hasDefault = true, defaultString = DEFAULT_THEME_FONT_FAMILY) - public static final String KEY_THEME_FONT_FAMILY = "theme_font_family"; + String KEY_THEME_FONT_FAMILY = "theme_font_family"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = true) - public static final String KEY_DISPLAY_PROFILE_IMAGE = "display_profile_image"; + String KEY_DISPLAY_PROFILE_IMAGE = "display_profile_image"; @Preference(type = BOOLEAN) - public static final String KEY_LEFTSIDE_COMPOSE_BUTTON = "leftside_compose_button"; + String KEY_LEFTSIDE_COMPOSE_BUTTON = "leftside_compose_button"; @Preference(type = BOOLEAN) - public static final String KEY_ATTACH_LOCATION = "attach_location"; + String KEY_ATTACH_LOCATION = "attach_location"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = true) - public static final String KEY_GZIP_COMPRESSING = "gzip_compressing"; + String KEY_GZIP_COMPRESSING = "gzip_compressing"; @Preference(type = BOOLEAN) - public static final String KEY_IGNORE_SSL_ERROR = "ignore_ssl_error"; + String KEY_IGNORE_SSL_ERROR = "ignore_ssl_error"; @Preference(type = BOOLEAN) - public static final String KEY_LOAD_MORE_AUTOMATICALLY = "load_more_automatically"; + String KEY_LOAD_MORE_AUTOMATICALLY = "load_more_automatically"; @Preference(type = STRING) - public static final String KEY_QUOTE_FORMAT = "quote_format"; + String KEY_QUOTE_FORMAT = "quote_format"; @Preference(type = BOOLEAN) - public static final String KEY_REMEMBER_POSITION = "remember_position"; + String KEY_REMEMBER_POSITION = "remember_position"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) - public static final String KEY_READ_FROM_BOTTOM = "read_from_bottom"; + String KEY_READ_FROM_BOTTOM = "read_from_bottom"; @Preference(type = INT, exportable = false) - public static final String KEY_SAVED_TAB_POSITION = "saved_tab_position"; + String KEY_SAVED_TAB_POSITION = "saved_tab_position"; @Preference(type = BOOLEAN) - public static final String KEY_ENABLE_PROXY = "enable_proxy"; + String KEY_ENABLE_PROXY = "enable_proxy"; @Preference(type = STRING) - public static final String KEY_PROXY_HOST = "proxy_host"; + String KEY_PROXY_HOST = "proxy_host"; @Preference(type = STRING) - public static final String KEY_PROXY_PORT = "proxy_port"; + String KEY_PROXY_PORT = "proxy_port"; @Preference(type = BOOLEAN) - public static final String KEY_REFRESH_ON_START = "refresh_on_start"; + String KEY_REFRESH_ON_START = "refresh_on_start"; @Preference(type = BOOLEAN) - public static final String KEY_REFRESH_AFTER_TWEET = "refresh_after_tweet"; + String KEY_REFRESH_AFTER_TWEET = "refresh_after_tweet"; @Preference(type = BOOLEAN) - public static final String KEY_AUTO_REFRESH = "auto_refresh"; + String KEY_AUTO_REFRESH = "auto_refresh"; @Preference(type = STRING) - public static final String KEY_REFRESH_INTERVAL = "refresh_interval"; + String KEY_REFRESH_INTERVAL = "refresh_interval"; @Preference(type = BOOLEAN) - public static final String KEY_AUTO_REFRESH_HOME_TIMELINE = "auto_refresh_home_timeline"; + String KEY_AUTO_REFRESH_HOME_TIMELINE = "auto_refresh_home_timeline"; @Preference(type = BOOLEAN) - public static final String KEY_AUTO_REFRESH_MENTIONS = "auto_refresh_mentions"; + String KEY_AUTO_REFRESH_MENTIONS = "auto_refresh_mentions"; @Preference(type = BOOLEAN) - public static final String KEY_AUTO_REFRESH_DIRECT_MESSAGES = "auto_refresh_direct_messages"; + String KEY_AUTO_REFRESH_DIRECT_MESSAGES = "auto_refresh_direct_messages"; @Preference(type = BOOLEAN) - public static final String KEY_AUTO_REFRESH_TRENDS = "auto_refresh_trends"; + String KEY_AUTO_REFRESH_TRENDS = "auto_refresh_trends"; @Preference(type = BOOLEAN) - public static final String KEY_HOME_TIMELINE_NOTIFICATION = "home_timeline_notification"; + String KEY_HOME_TIMELINE_NOTIFICATION = "home_timeline_notification"; @Preference(type = BOOLEAN) - public static final String KEY_MENTIONS_NOTIFICATION = "mentions_notification"; + String KEY_MENTIONS_NOTIFICATION = "mentions_notification"; @Preference(type = BOOLEAN) - public static final String KEY_DIRECT_MESSAGES_NOTIFICATION = "direct_messages_notification"; + String KEY_DIRECT_MESSAGES_NOTIFICATION = "direct_messages_notification"; @Preference(type = INT) - public static final String KEY_LOCAL_TRENDS_WOEID = "local_trends_woeid"; - public static final String KEY_NOTIFICATION_RINGTONE = "notification_ringtone"; - public static final String KEY_NOTIFICATION_LIGHT_COLOR = "notification_light_color"; - public static final String KEY_SHARE_FORMAT = "share_format"; - public static final String KEY_HOME_REFRESH_MENTIONS = "home_refresh_mentions"; - public static final String KEY_HOME_REFRESH_DIRECT_MESSAGES = "home_refresh_direct_messages"; - public static final String KEY_HOME_REFRESH_TRENDS = "home_refresh_trends"; - public static final String KEY_IMAGE_UPLOAD_FORMAT = "image_upload_format"; - public static final String KEY_STATUS_SHORTENER = "status_shortener"; - public static final String KEY_MEDIA_UPLOADER = "media_uploader"; + String KEY_LOCAL_TRENDS_WOEID = "local_trends_woeid"; + String KEY_NOTIFICATION_RINGTONE = "notification_ringtone"; + String KEY_NOTIFICATION_LIGHT_COLOR = "notification_light_color"; + String KEY_SHARE_FORMAT = "share_format"; + String KEY_HOME_REFRESH_MENTIONS = "home_refresh_mentions"; + String KEY_HOME_REFRESH_DIRECT_MESSAGES = "home_refresh_direct_messages"; + String KEY_HOME_REFRESH_TRENDS = "home_refresh_trends"; + String KEY_IMAGE_UPLOAD_FORMAT = "image_upload_format"; + String KEY_STATUS_SHORTENER = "status_shortener"; + String KEY_MEDIA_UPLOADER = "media_uploader"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) - public static final String KEY_SHOW_ABSOLUTE_TIME = "show_absolute_time"; + String KEY_SHOW_ABSOLUTE_TIME = "show_absolute_time"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) - public static final String KEY_QUICK_SEND = "quick_send"; + String KEY_QUICK_SEND = "quick_send"; @Preference(type = STRING, exportable = false) - public static final String KEY_COMPOSE_ACCOUNTS = "compose_accounts"; + String KEY_COMPOSE_ACCOUNTS = "compose_accounts"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) - public static final String KEY_TCP_DNS_QUERY = "tcp_dns_query"; + String KEY_TCP_DNS_QUERY = "tcp_dns_query"; @Preference(type = STRING, hasDefault = true, defaultString = "8.8.8.8") - public static final String KEY_DNS_SERVER = "dns_server"; - public static final String KEY_CONNECTION_TIMEOUT = "connection_timeout"; + String KEY_DNS_SERVER = "dns_server"; + String KEY_CONNECTION_TIMEOUT = "connection_timeout"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = true) - public static final String KEY_NAME_FIRST = "name_first"; - public static final String KEY_STOP_AUTO_REFRESH_WHEN_BATTERY_LOW = "stop_auto_refresh_when_battery_low"; + String KEY_NAME_FIRST = "name_first"; + String KEY_STOP_AUTO_REFRESH_WHEN_BATTERY_LOW = "stop_auto_refresh_when_battery_low"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) - public static final String KEY_DISPLAY_SENSITIVE_CONTENTS = "display_sensitive_contents"; + String KEY_DISPLAY_SENSITIVE_CONTENTS = "display_sensitive_contents"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = true) - public static final String KEY_PHISHING_LINK_WARNING = "phishing_link_warning"; + String KEY_PHISHING_LINK_WARNING = "phishing_link_warning"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) - public static final String KEY_FAST_SCROLL_THUMB = "fast_scroll_thumb"; - public static final String KEY_LINK_HIGHLIGHT_OPTION = "link_highlight_option"; + String KEY_FAST_SCROLL_THUMB = "fast_scroll_thumb"; + String KEY_LINK_HIGHLIGHT_OPTION = "link_highlight_option"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = true) - public static final String KEY_INDICATE_MY_STATUS = "indicate_my_status"; - public static final String KEY_PRELOAD_PROFILE_IMAGES = "preload_profile_images"; - public static final String KEY_PRELOAD_PREVIEW_IMAGES = "preload_preview_images"; + String KEY_INDICATE_MY_STATUS = "indicate_my_status"; + String KEY_PRELOAD_PROFILE_IMAGES = "preload_profile_images"; + String KEY_PRELOAD_PREVIEW_IMAGES = "preload_preview_images"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = true) - public static final String KEY_PRELOAD_WIFI_ONLY = "preload_wifi_only"; + String KEY_PRELOAD_WIFI_ONLY = "preload_wifi_only"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = true) - public static final String KEY_LINK_TO_QUOTED_TWEET = "link_to_quoted_tweet"; + String KEY_LINK_TO_QUOTED_TWEET = "link_to_quoted_tweet"; @Preference(type = BOOLEAN) - public static final String KEY_BACKGROUND_TOAST_NOTIFICATION = "background_toast_notification"; + String KEY_BACKGROUND_TOAST_NOTIFICATION = "background_toast_notification"; @Preference(type = STRING) - public static final String KEY_COMPOSE_QUIT_ACTION = "compose_quit_action"; + String KEY_COMPOSE_QUIT_ACTION = "compose_quit_action"; @Preference(type = BOOLEAN) - public static final String KEY_NO_CLOSE_AFTER_TWEET_SENT = "no_close_after_tweet_sent"; + String KEY_NO_CLOSE_AFTER_TWEET_SENT = "no_close_after_tweet_sent"; @Preference(type = BOOLEAN) - public static final String KEY_FAST_IMAGE_LOADING = "fast_image_loading"; + String KEY_FAST_IMAGE_LOADING = "fast_image_loading"; @Preference(type = STRING, hasDefault = false) - public static final String KEY_API_URL_FORMAT = "api_url_format"; + String KEY_API_URL_FORMAT = "api_url_format"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) - public static final String KEY_SAME_OAUTH_SIGNING_URL = "same_oauth_signing_url"; + String KEY_SAME_OAUTH_SIGNING_URL = "same_oauth_signing_url"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) - public static final String KEY_NO_VERSION_SUFFIX = "no_version_suffix"; + String KEY_NO_VERSION_SUFFIX = "no_version_suffix"; @Preference(type = INT, hasDefault = true, defaultInt = Accounts.AUTH_TYPE_OAUTH) - public static final String KEY_AUTH_TYPE = "auth_type"; + String KEY_AUTH_TYPE = "auth_type"; @Preference(type = STRING, hasDefault = true, defaultString = TwidereConstants.TWITTER_CONSUMER_KEY_3) - public static final String KEY_CONSUMER_KEY = "consumer_key"; + String KEY_CONSUMER_KEY = "consumer_key"; @Preference(type = STRING, hasDefault = true, defaultString = TwidereConstants.TWITTER_CONSUMER_SECRET_3) - public static final String KEY_CONSUMER_SECRET = "consumer_secret"; - public static final String KEY_FILTERS_IN_HOME_TIMELINE = "filters_in_home_timeline"; - public static final String KEY_FILTERS_IN_MENTIONS_TIMELINE = "filters_in_mentions"; - public static final String KEY_FILTERS_FOR_RTS = "filters_for_rts"; - public static final String KEY_SETTINGS_WIZARD_COMPLETED = "settings_wizard_completed"; + String KEY_CONSUMER_SECRET = "consumer_secret"; + String KEY_FILTERS_IN_HOME_TIMELINE = "filters_in_home_timeline"; + String KEY_FILTERS_IN_MENTIONS_TIMELINE = "filters_in_mentions"; + String KEY_FILTERS_FOR_RTS = "filters_for_rts"; + String KEY_SETTINGS_WIZARD_COMPLETED = "settings_wizard_completed"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = true) - public static final String KEY_CARD_ANIMATION = "card_animation"; - public static final String KEY_UNREAD_COUNT = "unread_count"; - public static final String KEY_NOTIFICATION = "notification"; - public static final String KEY_NOTIFICATION_TYPE_HOME = "notification_type_home"; - public static final String KEY_NOTIFICATION_TYPE_MENTIONS = "notification_type_mentions"; - public static final String KEY_NOTIFICATION_TYPE_DIRECT_MESSAGES = "notification_type_direct_messages"; - public static final String KEY_NOTIFICATION_FOLLOWING_ONLY = "notification_following_only"; + String KEY_CARD_ANIMATION = "card_animation"; + String KEY_UNREAD_COUNT = "unread_count"; + String KEY_NOTIFICATION = "notification"; + String KEY_NOTIFICATION_TYPE_HOME = "notification_type_home"; + String KEY_NOTIFICATION_TYPE_MENTIONS = "notification_type_mentions"; + String KEY_NOTIFICATION_TYPE_DIRECT_MESSAGES = "notification_type_direct_messages"; + String KEY_NOTIFICATION_FOLLOWING_ONLY = "notification_following_only"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) - public static final String KEY_COMPACT_CARDS = "compact_cards"; + String KEY_COMPACT_CARDS = "compact_cards"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) - public static final String KEY_FORCE_USING_PRIVATE_APIS = "force_using_private_apis"; + String KEY_FORCE_USING_PRIVATE_APIS = "force_using_private_apis"; @Preference(type = STRING, hasDefault = true, defaultString = "140") - public static final String KEY_STATUS_TEXT_LIMIT = "status_text_limit"; + String KEY_STATUS_TEXT_LIMIT = "status_text_limit"; @Preference(type = STRING, hasDefault = true, defaultString = VALUE_COMPOSE_NOW_ACTION_COMPOSE) - public static final String KEY_COMPOSE_NOW_ACTION = "compose_now_action"; - public static final String KEY_FALLBACK_TWITTER_LINK_HANDLER = "fallback_twitter_link_handler"; + String KEY_COMPOSE_NOW_ACTION = "compose_now_action"; + String KEY_FALLBACK_TWITTER_LINK_HANDLER = "fallback_twitter_link_handler"; @Preference(type = STRING, hasDefault = true, defaultString = VALUE_MEDIA_PREVIEW_STYLE_CROP) - public static final String KEY_MEDIA_PREVIEW_STYLE = "media_preview_style"; + String KEY_MEDIA_PREVIEW_STYLE = "media_preview_style"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) - public static final String KEY_MEDIA_PREVIEW = "media_preview"; + String KEY_MEDIA_PREVIEW = "media_preview"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) - public static final String KEY_SORT_TIMELINE_BY_ID = "sort_timeline_by_id"; + String KEY_SORT_TIMELINE_BY_ID = "sort_timeline_by_id"; @Preference(type = STRING, hasDefault = true) - public static final String KEY_PROFILE_IMAGE_STYLE = "profile_image_style"; + String KEY_PROFILE_IMAGE_STYLE = "profile_image_style"; - public static final String KEY_QUICK_MENU_EXPANDED = "quick_menu_expanded"; + String KEY_QUICK_MENU_EXPANDED = "quick_menu_expanded"; @Preference(type = STRING) - public static final String KEY_TRANSLATION_DESTINATION = "translation_destination"; + String KEY_TRANSLATION_DESTINATION = "translation_destination"; @Preference(type = STRING) - public static final String KEY_TAB_DISPLAY_OPTION = "tab_display_option"; + String KEY_TAB_DISPLAY_OPTION = "tab_display_option"; @Preference(type = STRING) - public static final String KEY_CARD_HIGHLIGHT_OPTION = "card_highlight_option"; + String KEY_CARD_HIGHLIGHT_OPTION = "card_highlight_option"; @Preference(type = INT, exportable = false) - public static final String KEY_LIVE_WALLPAPER_SCALE = "live_wallpaper_scale"; + String KEY_LIVE_WALLPAPER_SCALE = "live_wallpaper_scale"; @Preference(type = LONG, exportable = false) - public static final String KEY_API_LAST_CHANGE = "api_last_change"; + String KEY_API_LAST_CHANGE = "api_last_change"; @Preference(type = LONG, exportable = false) - public static final String KEY_DEFAULT_ACCOUNT_ID = "default_account_id"; + String KEY_DEFAULT_ACCOUNT_ID = "default_account_id"; + + + @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) + String KEY_THUMBOR_ENABLED = "thumbor_enabled"; + String KEY_THUMBOR_ADDRESS = "thumbor_address"; + String KEY_THUMBOR_SECURITY_KEY = "thumbor_security_key"; } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java index b8b6a5224..345cd5eee 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java @@ -92,7 +92,7 @@ public class ParcelableStatus implements TwidereParcelable, Comparable REVERSE_ID_COMPARATOR = new Comparator() { @Override @@ -104,11 +104,12 @@ public class ParcelableStatus implements TwidereParcelable, Comparable Integer.MAX_VALUE) return Integer.MAX_VALUE; + if (diff < Integer.MIN_VALUE) return Integer.MIN_VALUE; + return (int) diff; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (!(obj instanceof ParcelableStatus)) return false; + final ParcelableStatus other = (ParcelableStatus) obj; + return account_id == other.account_id && id == other.id; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (int) (account_id ^ account_id >>> 32); + result = prime * result + (int) (id ^ id >>> 32); + return result; + } + @Override public String toString() { return "ParcelableStatus{" + @@ -378,90 +529,6 @@ public class ParcelableStatus implements TwidereParcelable, Comparable Integer.MAX_VALUE) return Integer.MAX_VALUE; - if (diff < Integer.MIN_VALUE) return Integer.MIN_VALUE; - return (int) diff; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) return true; - if (obj == null) return false; - if (!(obj instanceof ParcelableStatus)) return false; - final ParcelableStatus other = (ParcelableStatus) obj; - return account_id == other.account_id && id == other.id; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (int) (account_id ^ account_id >>> 32); - result = prime * result + (int) (id ^ id >>> 32); - return result; - } - @Override public void writeToParcel(final JSONParcel out) { out.writeLong("status_id", id); @@ -502,6 +569,22 @@ public class ParcelableStatus implements TwidereParcelable, Comparable CREATOR = new Parcelable.Creator() { @@ -687,15 +741,6 @@ public class ParcelableStatus implements TwidereParcelable, Comparable * Type: TEXT NOT NULL */ - public static final String SCREEN_NAME = "screen_name"; + String SCREEN_NAME = "screen_name"; - public static final String NAME = "name"; + String NAME = "name"; /** * Unique ID of the account
* Type: INTEGER (long) */ - public static final String ACCOUNT_ID = "account_id"; + String ACCOUNT_ID = "account_id"; /** * Auth type of the account.
Type: INTEGER */ - public static final String AUTH_TYPE = "auth_type"; + String AUTH_TYPE = "auth_type"; /** * Password of the account. (It will not stored)
* Type: TEXT */ - public static final String PASSWORD = "password"; + String PASSWORD = "password"; - public static final String BASIC_AUTH_USERNAME = "basic_auth_username"; + String BASIC_AUTH_USERNAME = "basic_auth_username"; /** * Password of the account for basic auth.
* Type: TEXT */ - public static final String BASIC_AUTH_PASSWORD = "basic_auth_password"; + String BASIC_AUTH_PASSWORD = "basic_auth_password"; /** * OAuth Token of the account.
* Type: TEXT */ - public static final String OAUTH_TOKEN = "oauth_token"; + String OAUTH_TOKEN = "oauth_token"; /** * Token Secret of the account.
* Type: TEXT */ - public static final String OAUTH_TOKEN_SECRET = "oauth_token_secret"; + String OAUTH_TOKEN_SECRET = "oauth_token_secret"; - public static final String COLOR = "color"; + String COLOR = "color"; /** * Set to a non-zero integer if the account is activated.
* Type: INTEGER (boolean) */ - public static final String IS_ACTIVATED = "is_activated"; + String IS_ACTIVATED = "is_activated"; - public static final String CONSUMER_KEY = "consumer_key"; + String CONSUMER_KEY = "consumer_key"; - public static final String CONSUMER_SECRET = "consumer_secret"; + String CONSUMER_SECRET = "consumer_secret"; - public static final String SORT_POSITION = "sort_position"; + String SORT_POSITION = "sort_position"; /** * User's profile image URL of the status.
* Type: TEXT */ - public static final String PROFILE_IMAGE_URL = "profile_image_url"; + String PROFILE_IMAGE_URL = "profile_image_url"; - public static final String PROFILE_BANNER_URL = "profile_banner_url"; - public static final String API_URL_FORMAT = "api_url_format"; - public static final String SAME_OAUTH_SIGNING_URL = "same_oauth_signing_url"; - public static final String NO_VERSION_SUFFIX = "no_version_suffix"; + String PROFILE_BANNER_URL = "profile_banner_url"; + String API_URL_FORMAT = "api_url_format"; + String SAME_OAUTH_SIGNING_URL = "same_oauth_signing_url"; + String NO_VERSION_SUFFIX = "no_version_suffix"; - public static final String[] COLUMNS_NO_CREDENTIALS = new String[]{_ID, NAME, SCREEN_NAME, ACCOUNT_ID, + String[] COLUMNS_NO_CREDENTIALS = new String[]{_ID, NAME, SCREEN_NAME, ACCOUNT_ID, PROFILE_IMAGE_URL, PROFILE_BANNER_URL, COLOR, IS_ACTIVATED}; - public static final String[] COLUMNS = new String[]{_ID, NAME, SCREEN_NAME, ACCOUNT_ID, AUTH_TYPE, + String[] COLUMNS = new String[]{_ID, NAME, SCREEN_NAME, ACCOUNT_ID, AUTH_TYPE, BASIC_AUTH_USERNAME, BASIC_AUTH_PASSWORD, OAUTH_TOKEN, OAUTH_TOKEN_SECRET, CONSUMER_KEY, CONSUMER_SECRET, API_URL_FORMAT, SAME_OAUTH_SIGNING_URL, NO_VERSION_SUFFIX, PROFILE_IMAGE_URL, PROFILE_BANNER_URL, COLOR, IS_ACTIVATED, SORT_POSITION}; - public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL, TYPE_TEXT_NOT_NULL, + String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL, TYPE_TEXT_NOT_NULL, TYPE_INT_UNIQUE, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_BOOLEAN, TYPE_INT}; @@ -154,49 +154,49 @@ public interface TwidereDataStore { public static interface CachedHashtags extends CachedValues { - public static final String[] COLUMNS = new String[]{_ID, NAME}; - public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT}; + String[] COLUMNS = new String[]{_ID, NAME}; + String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT}; - public static final String TABLE_NAME = "cached_hashtags"; - public static final String CONTENT_PATH = TABLE_NAME; + String TABLE_NAME = "cached_hashtags"; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); } public static interface CachedImages extends BaseColumns { - public static final String TABLE_NAME = "cached_images"; - public static final String CONTENT_PATH = TABLE_NAME; + String TABLE_NAME = "cached_images"; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final String URL = "url"; + String URL = "url"; - public static final String PATH = "path"; + String PATH = "path"; - public static final String[] MATRIX_COLUMNS = new String[]{URL, PATH}; + String[] MATRIX_COLUMNS = new String[]{URL, PATH}; - public static final String[] COLUMNS = new String[]{_ID, URL, PATH}; + String[] COLUMNS = new String[]{_ID, URL, PATH}; } public static interface CachedStatuses extends Statuses { - public static final String TABLE_NAME = "cached_statuses"; - public static final String CONTENT_PATH = TABLE_NAME; + String TABLE_NAME = "cached_statuses"; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); } public static interface CachedTrends extends CachedValues { - public static final String TIMESTAMP = "timestamp"; + String TIMESTAMP = "timestamp"; - public static final String[] COLUMNS = new String[]{_ID, NAME, TIMESTAMP}; - public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_INT}; + String[] COLUMNS = new String[]{_ID, NAME, TIMESTAMP}; + String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_INT}; public static interface Local extends CachedTrends { - public static final String TABLE_NAME = "local_trends"; - public static final String CONTENT_PATH = TABLE_NAME; + String TABLE_NAME = "local_trends"; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); } @@ -204,85 +204,85 @@ public interface TwidereDataStore { public static interface CachedUsers extends CachedValues { - public static final String TABLE_NAME = "cached_users"; + String TABLE_NAME = "cached_users"; - public static final String CONTENT_PATH = TABLE_NAME; + String CONTENT_PATH = TABLE_NAME; - public static final String CONTENT_PATH_WITH_RELATIONSHIP = TABLE_NAME + "/with_relationship"; + String CONTENT_PATH_WITH_RELATIONSHIP = TABLE_NAME + "/with_relationship"; - public static final String CONTENT_PATH_WITH_SCORE = TABLE_NAME + "/with_score"; + String CONTENT_PATH_WITH_SCORE = TABLE_NAME + "/with_score"; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI_WITH_RELATIONSHIP = Uri.withAppendedPath(BASE_CONTENT_URI, + Uri CONTENT_URI_WITH_RELATIONSHIP = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH_WITH_RELATIONSHIP); - public static final Uri CONTENT_URI_WITH_SCORE = Uri.withAppendedPath(BASE_CONTENT_URI, + Uri CONTENT_URI_WITH_SCORE = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH_WITH_SCORE); - public static final String USER_ID = "user_id"; + String USER_ID = "user_id"; - public static final String CREATED_AT = "created_at"; + String CREATED_AT = "created_at"; - public static final String IS_PROTECTED = "is_protected"; + String IS_PROTECTED = "is_protected"; - public static final String IS_VERIFIED = "is_verified"; + String IS_VERIFIED = "is_verified"; - public static final String IS_FOLLOWING = "is_following"; + String IS_FOLLOWING = "is_following"; - public static final String DESCRIPTION_PLAIN = "description_plain"; + String DESCRIPTION_PLAIN = "description_plain"; - public static final String DESCRIPTION_HTML = "description_html"; + String DESCRIPTION_HTML = "description_html"; - public static final String DESCRIPTION_EXPANDED = "description_expanded"; + String DESCRIPTION_EXPANDED = "description_expanded"; - public static final String LOCATION = "location"; + String LOCATION = "location"; - public static final String URL = "url"; + String URL = "url"; - public static final String URL_EXPANDED = "url_expanded"; + String URL_EXPANDED = "url_expanded"; - public static final String PROFILE_BANNER_URL = "profile_banner_url"; + String PROFILE_BANNER_URL = "profile_banner_url"; - public static final String FOLLOWERS_COUNT = "followers_count"; + String FOLLOWERS_COUNT = "followers_count"; - public static final String FRIENDS_COUNT = "friends_count"; + String FRIENDS_COUNT = "friends_count"; - public static final String STATUSES_COUNT = "statuses_count"; + String STATUSES_COUNT = "statuses_count"; - public static final String FAVORITES_COUNT = "favorites_count"; + String FAVORITES_COUNT = "favorites_count"; - public static final String LISTED_COUNT = "listed_count"; + String LISTED_COUNT = "listed_count"; - public static final String BACKGROUND_COLOR = "background_color"; + String BACKGROUND_COLOR = "background_color"; - public static final String LINK_COLOR = "link_color"; + String LINK_COLOR = "link_color"; - public static final String TEXT_COLOR = "text_color"; + String TEXT_COLOR = "text_color"; /** * User's screen name of the status.
* Type: TEXT */ - public static final String SCREEN_NAME = "screen_name"; + String SCREEN_NAME = "screen_name"; /** * User's profile image URL of the status.
* Type: TEXT NOT NULL */ - public static final String PROFILE_IMAGE_URL = "profile_image_url"; + String PROFILE_IMAGE_URL = "profile_image_url"; - public static final String LAST_SEEN = "last_seen"; + String LAST_SEEN = "last_seen"; - public static final String[] COLUMNS = new String[]{_ID, USER_ID, CREATED_AT, NAME, SCREEN_NAME, + String[] COLUMNS = new String[]{_ID, USER_ID, CREATED_AT, NAME, SCREEN_NAME, DESCRIPTION_PLAIN, LOCATION, URL, PROFILE_IMAGE_URL, PROFILE_BANNER_URL, IS_PROTECTED, IS_VERIFIED, IS_FOLLOWING, FOLLOWERS_COUNT, FRIENDS_COUNT, STATUSES_COUNT, FAVORITES_COUNT, LISTED_COUNT, DESCRIPTION_HTML, DESCRIPTION_EXPANDED, URL_EXPANDED, BACKGROUND_COLOR, LINK_COLOR, TEXT_COLOR, LAST_SEEN}; - public static final String[] BASIC_COLUMNS = new String[]{_ID, USER_ID, + String[] BASIC_COLUMNS = new String[]{_ID, USER_ID, NAME, SCREEN_NAME, PROFILE_IMAGE_URL}; - public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT_UNIQUE, TYPE_INT, + String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT_UNIQUE, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT}; @@ -291,132 +291,132 @@ public interface TwidereDataStore { public static interface CachedValues extends BaseColumns { - public static final String NAME = "name"; + String NAME = "name"; } public static interface CacheFiles extends BaseColumns { - public static final String TABLE_NAME = "cache_files"; - public static final String CONTENT_PATH = TABLE_NAME; + String TABLE_NAME = "cache_files"; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final String NAME = "name"; + String NAME = "name"; - public static final String PATH = "path"; + String PATH = "path"; - public static final String[] MATRIX_COLUMNS = new String[]{NAME, PATH}; + String[] MATRIX_COLUMNS = new String[]{NAME, PATH}; - public static final String[] COLUMNS = new String[]{_ID, NAME, PATH}; + String[] COLUMNS = new String[]{_ID, NAME, PATH}; } public static interface DirectMessages extends BaseColumns { - public static final String TABLE_NAME = "messages"; - public static final String CONTENT_PATH = TABLE_NAME; + String TABLE_NAME = "messages"; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final String ACCOUNT_ID = "account_id"; - public static final String MESSAGE_ID = "message_id"; - public static final String MESSAGE_TIMESTAMP = "message_timestamp"; - public static final String SENDER_ID = "sender_id"; - public static final String RECIPIENT_ID = "recipient_id"; - public static final String CONVERSATION_ID = "conversation_id"; + String ACCOUNT_ID = "account_id"; + String MESSAGE_ID = "message_id"; + String MESSAGE_TIMESTAMP = "message_timestamp"; + String SENDER_ID = "sender_id"; + String RECIPIENT_ID = "recipient_id"; + String CONVERSATION_ID = "conversation_id"; - public static final String IS_OUTGOING = "is_outgoing"; + String IS_OUTGOING = "is_outgoing"; - public static final String TEXT_HTML = "text_html"; - public static final String TEXT_PLAIN = "text_plain"; - public static final String TEXT_UNESCAPED = "text_unescaped"; - public static final String SENDER_NAME = "sender_name"; - public static final String RECIPIENT_NAME = "recipient_name"; - public static final String SENDER_SCREEN_NAME = "sender_screen_name"; - public static final String RECIPIENT_SCREEN_NAME = "recipient_screen_name"; - public static final String SENDER_PROFILE_IMAGE_URL = "sender_profile_image_url"; - public static final String RECIPIENT_PROFILE_IMAGE_URL = "recipient_profile_image_url"; + String TEXT_HTML = "text_html"; + String TEXT_PLAIN = "text_plain"; + String TEXT_UNESCAPED = "text_unescaped"; + String SENDER_NAME = "sender_name"; + String RECIPIENT_NAME = "recipient_name"; + String SENDER_SCREEN_NAME = "sender_screen_name"; + String RECIPIENT_SCREEN_NAME = "recipient_screen_name"; + String SENDER_PROFILE_IMAGE_URL = "sender_profile_image_url"; + String RECIPIENT_PROFILE_IMAGE_URL = "recipient_profile_image_url"; - public static final String MEDIA_LIST = "media_list"; + String MEDIA_LIST = "media_list"; - public static final String[] COLUMNS = new String[]{_ID, ACCOUNT_ID, MESSAGE_ID, MESSAGE_TIMESTAMP, + String[] COLUMNS = new String[]{_ID, ACCOUNT_ID, MESSAGE_ID, MESSAGE_TIMESTAMP, SENDER_ID, RECIPIENT_ID, CONVERSATION_ID, IS_OUTGOING, TEXT_HTML, TEXT_PLAIN, TEXT_UNESCAPED, SENDER_NAME, RECIPIENT_NAME, SENDER_SCREEN_NAME, RECIPIENT_SCREEN_NAME, SENDER_PROFILE_IMAGE_URL, RECIPIENT_PROFILE_IMAGE_URL, MEDIA_LIST}; - public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, + String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT}; - public static final String DEFAULT_SORT_ORDER = MESSAGE_ID + " DESC"; + String DEFAULT_SORT_ORDER = MESSAGE_ID + " DESC"; public static interface Conversation extends DirectMessages { - public static final String DEFAULT_SORT_ORDER = MESSAGE_TIMESTAMP + " ASC"; + String DEFAULT_SORT_ORDER = MESSAGE_TIMESTAMP + " ASC"; - public static final String CONTENT_PATH_SEGMENT = "conversation"; - public static final String CONTENT_PATH_SEGMENT_SCREEN_NAME = "conversation_screen_name"; + String CONTENT_PATH_SEGMENT = "conversation"; + String CONTENT_PATH_SEGMENT_SCREEN_NAME = "conversation_screen_name"; - public static final String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final String CONTENT_PATH_SCREEN_NAME = DirectMessages.CONTENT_PATH + "/" + String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + String CONTENT_PATH_SCREEN_NAME = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT_SCREEN_NAME; - public static final Uri CONTENT_URI = Uri + Uri CONTENT_URI = Uri .withAppendedPath(DirectMessages.CONTENT_URI, CONTENT_PATH_SEGMENT); - public static final Uri CONTENT_URI_SCREEN_NAME = Uri.withAppendedPath(DirectMessages.CONTENT_URI, + Uri CONTENT_URI_SCREEN_NAME = Uri.withAppendedPath(DirectMessages.CONTENT_URI, CONTENT_PATH_SEGMENT_SCREEN_NAME); } public static interface ConversationEntries extends BaseColumns { - public static final String TABLE_NAME = "messages_conversation_entries"; + String TABLE_NAME = "messages_conversation_entries"; - public static final String CONTENT_PATH_SEGMENT = "conversation_entries"; - public static final String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + String CONTENT_PATH_SEGMENT = "conversation_entries"; + String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final Uri CONTENT_URI = Uri + Uri CONTENT_URI = Uri .withAppendedPath(DirectMessages.CONTENT_URI, CONTENT_PATH_SEGMENT); - public static final String MESSAGE_ID = DirectMessages.MESSAGE_ID; - public static final String ACCOUNT_ID = DirectMessages.ACCOUNT_ID; - public static final String IS_OUTGOING = DirectMessages.IS_OUTGOING; - public static final String MESSAGE_TIMESTAMP = DirectMessages.MESSAGE_TIMESTAMP; - public static final String NAME = "name"; - public static final String SCREEN_NAME = "screen_name"; - public static final String PROFILE_IMAGE_URL = "profile_image_url"; - public static final String TEXT_HTML = DirectMessages.TEXT_HTML; - public static final String CONVERSATION_ID = "conversation_id"; + String MESSAGE_ID = DirectMessages.MESSAGE_ID; + String ACCOUNT_ID = DirectMessages.ACCOUNT_ID; + String IS_OUTGOING = DirectMessages.IS_OUTGOING; + String MESSAGE_TIMESTAMP = DirectMessages.MESSAGE_TIMESTAMP; + String NAME = "name"; + String SCREEN_NAME = "screen_name"; + String PROFILE_IMAGE_URL = "profile_image_url"; + String TEXT_HTML = DirectMessages.TEXT_HTML; + String CONVERSATION_ID = "conversation_id"; - public static final int IDX__ID = 0; - public static final int IDX_MESSAGE_TIMESTAMP = 1; - public static final int IDX_MESSAGE_ID = 2; - public static final int IDX_ACCOUNT_ID = 3; - public static final int IDX_IS_OUTGOING = 4; - public static final int IDX_NAME = 5; - public static final int IDX_SCREEN_NAME = 6; - public static final int IDX_PROFILE_IMAGE_URL = 7; - public static final int IDX_TEXT = 8; - public static final int IDX_CONVERSATION_ID = 9; + int IDX__ID = 0; + int IDX_MESSAGE_TIMESTAMP = 1; + int IDX_MESSAGE_ID = 2; + int IDX_ACCOUNT_ID = 3; + int IDX_IS_OUTGOING = 4; + int IDX_NAME = 5; + int IDX_SCREEN_NAME = 6; + int IDX_PROFILE_IMAGE_URL = 7; + int IDX_TEXT = 8; + int IDX_CONVERSATION_ID = 9; } public static interface Inbox extends DirectMessages { - public static final String TABLE_NAME = "messages_inbox"; + String TABLE_NAME = "messages_inbox"; - public static final String CONTENT_PATH_SEGMENT = "inbox"; - public static final String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + String CONTENT_PATH_SEGMENT = "inbox"; + String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final Uri CONTENT_URI = Uri + Uri CONTENT_URI = Uri .withAppendedPath(DirectMessages.CONTENT_URI, CONTENT_PATH_SEGMENT); } public static interface Outbox extends DirectMessages { - public static final String TABLE_NAME = "messages_outbox"; + String TABLE_NAME = "messages_outbox"; - public static final String CONTENT_PATH_SEGMENT = "outbox"; - public static final String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + String CONTENT_PATH_SEGMENT = "outbox"; + String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final Uri CONTENT_URI = Uri + Uri CONTENT_URI = Uri .withAppendedPath(DirectMessages.CONTENT_URI, CONTENT_PATH_SEGMENT); } @@ -425,475 +425,490 @@ public interface TwidereDataStore { public static interface SearchHistory extends BaseColumns { - public static final String TABLE_NAME = "search_history"; - public static final String CONTENT_PATH = TABLE_NAME; + String TABLE_NAME = "search_history"; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final String QUERY = "query"; + String QUERY = "query"; - public static final String RECENT_QUERY = "recent_query"; + String RECENT_QUERY = "recent_query"; - public static final String[] COLUMNS = new String[]{_ID, RECENT_QUERY, QUERY}; - public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT, TYPE_TEXT_NOT_NULL_UNIQUE}; - public static final String DEFAULT_SORT_ORDER = RECENT_QUERY + " DESC"; + String[] COLUMNS = new String[]{_ID, RECENT_QUERY, QUERY}; + String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT, TYPE_TEXT_NOT_NULL_UNIQUE}; + String DEFAULT_SORT_ORDER = RECENT_QUERY + " DESC"; } public static interface DNS extends BaseColumns { - public static final String TABLE_NAME = "dns"; - public static final String CONTENT_PATH = TABLE_NAME; + String TABLE_NAME = "dns"; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final String HOST = "host"; + String HOST = "host"; - public static final String ADDRESS = "address"; + String ADDRESS = "address"; - public static final String[] MATRIX_COLUMNS = new String[]{HOST, ADDRESS}; + String[] MATRIX_COLUMNS = new String[]{HOST, ADDRESS}; - public static final String[] COLUMNS = new String[]{_ID, HOST, ADDRESS}; + String[] COLUMNS = new String[]{_ID, HOST, ADDRESS}; } public static interface SavedSearches extends BaseColumns { - public static final String TABLE_NAME = "saved_searches"; + String TABLE_NAME = "saved_searches"; - public static final String CONTENT_PATH = TABLE_NAME; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final String ACCOUNT_ID = "account_id"; - public static final String SEARCH_ID = "search_id"; - public static final String QUERY = "query"; - public static final String NAME = "name"; - public static final String CREATED_AT = "created_at"; + String ACCOUNT_ID = "account_id"; + String SEARCH_ID = "search_id"; + String QUERY = "query"; + String NAME = "name"; + String CREATED_AT = "created_at"; - public static final String[] COLUMNS = new String[]{_ID, ACCOUNT_ID, SEARCH_ID, CREATED_AT, + String[] COLUMNS = new String[]{_ID, ACCOUNT_ID, SEARCH_ID, CREATED_AT, QUERY, NAME}; - public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, + String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT}; - public static final String DEFAULT_SORT_ORDER = CREATED_AT + " DESC"; + String DEFAULT_SORT_ORDER = CREATED_AT + " DESC"; } public static interface Drafts extends BaseColumns { - public static final int ACTION_UPDATE_STATUS = 1; - public static final int ACTION_SEND_DIRECT_MESSAGE = 2; - public static final int ACTION_CREATE_FRIENDSHIP = 3; + int ACTION_UPDATE_STATUS = 1; + int ACTION_SEND_DIRECT_MESSAGE = 2; + int ACTION_CREATE_FRIENDSHIP = 3; - public static final String TABLE_NAME = "drafts"; - public static final String CONTENT_PATH = TABLE_NAME; - public static final String CONTENT_PATH_UNSENT = TABLE_NAME + "/unsent"; + String TABLE_NAME = "drafts"; + String CONTENT_PATH = TABLE_NAME; + String CONTENT_PATH_UNSENT = TABLE_NAME + "/unsent"; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI_UNSENT = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH_UNSENT); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI_UNSENT = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH_UNSENT); /** * Status content.
* Type: TEXT */ - public static final String TEXT = "text"; + String TEXT = "text"; /** * Account IDs of unsent status.
* Type: TEXT */ - public static final String ACCOUNT_IDS = "account_ids"; + String ACCOUNT_IDS = "account_ids"; - public static final String LOCATION = "location"; + String LOCATION = "location"; - public static final String IN_REPLY_TO_STATUS_ID = "in_reply_to_status_id"; + String IN_REPLY_TO_STATUS_ID = "in_reply_to_status_id"; - public static final String MEDIA = "media"; + String MEDIA = "media"; - public static final String IS_POSSIBLY_SENSITIVE = "is_possibly_sensitive"; + String IS_POSSIBLY_SENSITIVE = "is_possibly_sensitive"; - public static final String TIMESTAMP = "timestamp"; + String TIMESTAMP = "timestamp"; - public static final String ACTION_TYPE = "action_type"; + String ACTION_TYPE = "action_type"; - public static final String ACTION_EXTRAS = "action_extras"; + String ACTION_EXTRAS = "action_extras"; - public static final String[] COLUMNS = new String[]{_ID, TEXT, ACCOUNT_IDS, LOCATION, MEDIA, + String[] COLUMNS = new String[]{_ID, TEXT, ACCOUNT_IDS, LOCATION, MEDIA, IN_REPLY_TO_STATUS_ID, IS_POSSIBLY_SENSITIVE, TIMESTAMP, ACTION_TYPE, ACTION_EXTRAS}; - public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, + String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_BOOLEAN, TYPE_INT, TYPE_INT, TYPE_TEXT}; } public static interface Filters extends BaseColumns { - public static final String CONTENT_PATH = "filters"; + String CONTENT_PATH = "filters"; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final String VALUE = "value"; + String VALUE = "value"; - public static final String ENABLE_IN_HOME_TIMELINE = "enable_in_home_timeline"; + String ENABLE_IN_HOME_TIMELINE = "enable_in_home_timeline"; - public static final String ENABLE_IN_MENTIONS = "enable_in_mentions"; + String ENABLE_IN_MENTIONS = "enable_in_mentions"; - public static final String ENABLE_FOR_RETWEETS = "enable_for_retweets"; + String ENABLE_FOR_RETWEETS = "enable_for_retweets"; - public static final String[] COLUMNS = new String[]{_ID, VALUE}; + String[] COLUMNS = new String[]{_ID, VALUE}; - public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL_UNIQUE}; + String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL_UNIQUE}; public static interface Keywords extends Filters { - public static final String TABLE_NAME = "filtered_keywords"; - public static final String CONTENT_PATH_SEGMENT = "keywords"; - public static final String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); + String TABLE_NAME = "filtered_keywords"; + String CONTENT_PATH_SEGMENT = "keywords"; + String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); } public static interface Links extends Filters { - public static final String TABLE_NAME = "filtered_links"; - public static final String CONTENT_PATH_SEGMENT = "links"; - public static final String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); + String TABLE_NAME = "filtered_links"; + String CONTENT_PATH_SEGMENT = "links"; + String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); } public static interface Sources extends Filters { - public static final String TABLE_NAME = "filtered_sources"; - public static final String CONTENT_PATH_SEGMENT = "sources"; - public static final String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); + String TABLE_NAME = "filtered_sources"; + String CONTENT_PATH_SEGMENT = "sources"; + String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); } public static interface Users extends BaseColumns { - public static final String TABLE_NAME = "filtered_users"; - public static final String CONTENT_PATH_SEGMENT = "users"; - public static final String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); + String TABLE_NAME = "filtered_users"; + String CONTENT_PATH_SEGMENT = "users"; + String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); - public static final String USER_ID = "user_id"; - public static final String NAME = "name"; - public static final String SCREEN_NAME = "screen_name"; + String USER_ID = "user_id"; + String NAME = "name"; + String SCREEN_NAME = "screen_name"; - public static final String[] COLUMNS = new String[]{_ID, USER_ID, NAME, SCREEN_NAME}; + String[] COLUMNS = new String[]{_ID, USER_ID, NAME, SCREEN_NAME}; - public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT_UNIQUE, TYPE_TEXT_NOT_NULL, + String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT_UNIQUE, TYPE_TEXT_NOT_NULL, TYPE_TEXT_NOT_NULL}; } } public static interface Mentions extends Statuses { - public static final String TABLE_NAME = "mentions"; - public static final String CONTENT_PATH = TABLE_NAME; + String TABLE_NAME = "mentions"; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); } public static interface Notifications extends BaseColumns { - public static final String TABLE_NAME = "notifications"; + String TABLE_NAME = "notifications"; - public static final String CONTENT_PATH = TABLE_NAME; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final String ID = "id"; + String ID = "id"; - public static final String COUNT = "count"; + String COUNT = "count"; - public static final String[] MATRIX_COLUMNS = new String[]{ID, COUNT}; + String[] MATRIX_COLUMNS = new String[]{ID, COUNT}; - public static final String[] COLUMNS = new String[]{_ID, ID, COUNT}; + String[] COLUMNS = new String[]{_ID, ID, COUNT}; } public static interface Permissions extends BaseColumns { - public static final String TABLE_NAME = "permissions"; - public static final String CONTENT_PATH = TABLE_NAME; + String TABLE_NAME = "permissions"; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final String PERMISSION = "permissions"; + String PERMISSION = "permissions"; - public static final String PACKAGE_NAME = "package_name"; + String PACKAGE_NAME = "package_name"; - public static final String[] MATRIX_COLUMNS = new String[]{PACKAGE_NAME, PERMISSION}; + String[] MATRIX_COLUMNS = new String[]{PACKAGE_NAME, PERMISSION}; - public static final String[] COLUMNS = new String[]{_ID, PACKAGE_NAME, PERMISSION}; + String[] COLUMNS = new String[]{_ID, PACKAGE_NAME, PERMISSION}; } public static interface Preferences extends BaseColumns { - public static final String TABLE_NAME = "preferences"; - public static final String CONTENT_PATH = TABLE_NAME; + String TABLE_NAME = "preferences"; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final int TYPE_INVALID = -1; + int TYPE_INVALID = -1; - public static final int TYPE_NULL = 0; + int TYPE_NULL = 0; - public static final int TYPE_BOOLEAN = 1; + int TYPE_BOOLEAN = 1; - public static final int TYPE_INTEGER = 2; + int TYPE_INTEGER = 2; - public static final int TYPE_LONG = 3; + int TYPE_LONG = 3; - public static final int TYPE_FLOAT = 4; + int TYPE_FLOAT = 4; - public static final int TYPE_STRING = 5; + int TYPE_STRING = 5; - public static final String KEY = "key"; + String KEY = "key"; - public static final String VALUE = "value"; + String VALUE = "value"; - public static final String TYPE = "type"; + String TYPE = "type"; - public static final String[] MATRIX_COLUMNS = new String[]{KEY, VALUE, TYPE}; + String[] MATRIX_COLUMNS = new String[]{KEY, VALUE, TYPE}; - public static final String[] COLUMNS = new String[]{_ID, KEY, VALUE, TYPE}; + String[] COLUMNS = new String[]{_ID, KEY, VALUE, TYPE}; } public static interface Statuses extends BaseColumns { - public static final String TABLE_NAME = "statuses"; - public static final String CONTENT_PATH = TABLE_NAME; + String TABLE_NAME = "statuses"; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); /** * Account ID of the status.
* Type: TEXT */ - public static final String ACCOUNT_ID = "account_id"; + String ACCOUNT_ID = "account_id"; /** * Status content, in HTML. Please note, this is not actually original * text.
* Type: TEXT */ - public static final String TEXT_HTML = "text_html"; + String TEXT_HTML = "text_html"; /** * */ - public static final String TEXT_PLAIN = "text_plain"; + String TEXT_PLAIN = "text_plain"; - public static final String TEXT_UNESCAPED = "text_unescaped"; + String TEXT_UNESCAPED = "text_unescaped"; /** * User name of the status.
* Type: TEXT */ - public static final String USER_NAME = "name"; + String USER_NAME = "name"; /** * User's screen name of the status.
* Type: TEXT */ - public static final String USER_SCREEN_NAME = "screen_name"; + String USER_SCREEN_NAME = "screen_name"; /** * User's profile image URL of the status.
* Type: TEXT NOT NULL */ - public static final String USER_PROFILE_IMAGE_URL = "profile_image_url"; + String USER_PROFILE_IMAGE_URL = "profile_image_url"; /** * Unique id of the status.
* Type: INTEGER UNIQUE(long) */ - public static final String STATUS_ID = "status_id"; + String STATUS_ID = "status_id"; /** * Retweet count of the status.
* Type: INTEGER (long) */ - public static final String RETWEET_COUNT = "retweet_count"; - public static final String FAVORITE_COUNT = "favorite_count"; - public static final String REPLY_COUNT = "reply_count"; - public static final String DESCENDENT_REPLY_COUNT = "descendent_reply_count"; + String RETWEET_COUNT = "retweet_count"; + String FAVORITE_COUNT = "favorite_count"; + String REPLY_COUNT = "reply_count"; + String DESCENDENT_REPLY_COUNT = "descendent_reply_count"; /** * Set to an non-zero integer if the status is a retweet, set to * negative value if the status is retweeted by user.
* Type: INTEGER */ - public static final String IS_RETWEET = "is_retweet"; + String IS_RETWEET = "is_retweet"; + + String IS_QUOTE = "is_quote"; /** * Set to 1 if the status is a favorite.
* Type: INTEGER (boolean) */ - public static final String IS_FAVORITE = "is_favorite"; + String IS_FAVORITE = "is_favorite"; - public static final String IS_POSSIBLY_SENSITIVE = "is_possibly_sensitive"; + String IS_POSSIBLY_SENSITIVE = "is_possibly_sensitive"; /** * Set to 1 if the status is a gap.
* Type: INTEGER (boolean) */ - public static final String IS_GAP = "is_gap"; + String IS_GAP = "is_gap"; - public static final String LOCATION = "location"; + String LOCATION = "location"; - public static final String PLACE_FULL_NAME = "place_full_name"; + String PLACE_FULL_NAME = "place_full_name"; /** * User's ID of the status.
* Type: INTEGER (long) */ - public static final String USER_ID = "user_id"; + String USER_ID = "user_id"; - public static final String IN_REPLY_TO_STATUS_ID = "in_reply_to_status_id"; + String IN_REPLY_TO_STATUS_ID = "in_reply_to_status_id"; - public static final String IN_REPLY_TO_USER_ID = "in_reply_to_user_id"; + String IN_REPLY_TO_USER_ID = "in_reply_to_user_id"; - public static final String IN_REPLY_TO_USER_NAME = "in_reply_to_user_name"; + String IN_REPLY_TO_USER_NAME = "in_reply_to_user_name"; - public static final String IN_REPLY_TO_USER_SCREEN_NAME = "in_reply_to_user_screen_name"; + String IN_REPLY_TO_USER_SCREEN_NAME = "in_reply_to_user_screen_name"; - public static final String SOURCE = "source"; + String SOURCE = "source"; - public static final String IS_PROTECTED = "is_protected"; + String IS_PROTECTED = "is_protected"; - public static final String IS_VERIFIED = "is_verified"; + String IS_VERIFIED = "is_verified"; - public static final String IS_FOLLOWING = "is_following"; + String IS_FOLLOWING = "is_following"; - public static final String RETWEET_ID = "retweet_id"; + String RETWEET_ID = "retweet_id"; - public static final String RETWEET_TIMESTAMP = "retweet_timestamp"; + String RETWEET_TIMESTAMP = "retweet_timestamp"; - public static final String RETWEETED_BY_USER_ID = "retweeted_by_user_id"; + String RETWEETED_BY_USER_ID = "retweeted_by_user_id"; - public static final String RETWEETED_BY_USER_NAME = "retweeted_by_user_name"; + String RETWEETED_BY_USER_NAME = "retweeted_by_user_name"; - public static final String RETWEETED_BY_USER_SCREEN_NAME = "retweeted_by_user_screen_name"; + String RETWEETED_BY_USER_SCREEN_NAME = "retweeted_by_user_screen_name"; - public static final String RETWEETED_BY_USER_PROFILE_IMAGE = "retweeted_by_user_profile_image"; + String RETWEETED_BY_USER_PROFILE_IMAGE = "retweeted_by_user_profile_image"; /** * Timestamp of the status.
* Type: INTEGER (long) */ - public static final String STATUS_TIMESTAMP = "status_timestamp"; + String STATUS_TIMESTAMP = "status_timestamp"; - public static final String MY_RETWEET_ID = "my_retweet_id"; + String MY_RETWEET_ID = "my_retweet_id"; - public static final String MEDIA_LIST = "media_list"; + String MY_QUOTE_ID = "my_quote_id"; - public static final String MENTIONS_LIST = "mentions_list"; + String MEDIA_LIST = "media_list"; - public static final String CARD = "card"; + String MENTIONS_LIST = "mentions_list"; - public static final String CARD_NAME = "card_type"; + String CARD = "card"; - public static final String SORT_ORDER_TIMESTAMP_DESC = STATUS_TIMESTAMP + " DESC"; + String CARD_NAME = "card_type"; - public static final String SORT_ORDER_STATUS_ID_DESC = STATUS_ID + " DESC"; + String SORT_ORDER_TIMESTAMP_DESC = STATUS_TIMESTAMP + " DESC"; - public static final String DEFAULT_SORT_ORDER = SORT_ORDER_TIMESTAMP_DESC; + String SORT_ORDER_STATUS_ID_DESC = STATUS_ID + " DESC"; - public static final String[] COLUMNS = new String[]{_ID, ACCOUNT_ID, STATUS_ID, USER_ID, + String DEFAULT_SORT_ORDER = SORT_ORDER_TIMESTAMP_DESC; + + String QUOTE_ID = "quote_id"; + String QUOTE_TEXT_HTML = "quote_text_html"; + String QUOTE_TEXT_PLAIN = "quote_text_plain"; + String QUOTE_TEXT_UNESCAPED = "quote_text_unescaped"; + String QUOTE_TIMESTAMP = "quote_timestamp"; + String QUOTED_BY_USER_ID = "quoted_by_user_id"; + String QUOTED_BY_USER_NAME = "quoted_by_user_name"; + String QUOTED_BY_USER_SCREEN_NAME = "quoted_by_user_screen_name"; + String QUOTED_BY_USER_PROFILE_IMAGE = "quoted_by_user_profile_image"; + + String[] COLUMNS = new String[]{_ID, ACCOUNT_ID, STATUS_ID, USER_ID, STATUS_TIMESTAMP, TEXT_HTML, TEXT_PLAIN, TEXT_UNESCAPED, USER_NAME, USER_SCREEN_NAME, USER_PROFILE_IMAGE_URL, IN_REPLY_TO_STATUS_ID, IN_REPLY_TO_USER_ID, IN_REPLY_TO_USER_NAME, IN_REPLY_TO_USER_SCREEN_NAME, SOURCE, LOCATION, RETWEET_COUNT, FAVORITE_COUNT, REPLY_COUNT, DESCENDENT_REPLY_COUNT, RETWEET_ID, RETWEET_TIMESTAMP, RETWEETED_BY_USER_ID, RETWEETED_BY_USER_NAME, RETWEETED_BY_USER_SCREEN_NAME, RETWEETED_BY_USER_PROFILE_IMAGE, -// QUOTE_ID, QUOTE_TEXT_HTML, QUOTE_TEXT_PLAIN, QUOTE_TEXT_UNESCAPED, QUOTE_TIMESTAMP, -// QUOTED_BY_USER_ID, QUOTED_BY_USER_NAME, QUOTED_BY_USER_SCREEN_NAME, QUOTED_BY_USER_PROFILE_IMAGE, - MY_RETWEET_ID, IS_RETWEET, IS_FAVORITE, IS_PROTECTED, IS_VERIFIED, IS_FOLLOWING, IS_GAP, + QUOTE_ID, QUOTE_TEXT_HTML, QUOTE_TEXT_PLAIN, QUOTE_TEXT_UNESCAPED, QUOTE_TIMESTAMP, + QUOTED_BY_USER_ID, QUOTED_BY_USER_NAME, QUOTED_BY_USER_SCREEN_NAME, QUOTED_BY_USER_PROFILE_IMAGE, + MY_RETWEET_ID, IS_RETWEET, IS_QUOTE, IS_FAVORITE, IS_PROTECTED, IS_VERIFIED, IS_FOLLOWING, IS_GAP, IS_POSSIBLY_SENSITIVE, MEDIA_LIST, MENTIONS_LIST, CARD_NAME, CARD, PLACE_FULL_NAME}; - public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, + String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, - TYPE_TEXT, TYPE_INT, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, - TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, - TYPE_TEXT}; + TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_TEXT, + TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, + TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, + TYPE_TEXT, TYPE_TEXT}; } public static interface Tabs extends BaseColumns { - public static final String TABLE_NAME = "tabs"; - public static final String CONTENT_PATH = TABLE_NAME; + String TABLE_NAME = "tabs"; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final String NAME = "name"; + String NAME = "name"; - public static final String ICON = "icon"; + String ICON = "icon"; - public static final String TYPE = "type"; + String TYPE = "type"; - public static final String ARGUMENTS = "arguments"; + String ARGUMENTS = "arguments"; - public static final String EXTRAS = "extras"; + String EXTRAS = "extras"; - public static final String POSITION = "position"; + String POSITION = "position"; - public static final String[] COLUMNS = new String[]{_ID, NAME, ICON, TYPE, ARGUMENTS, EXTRAS, + String[] COLUMNS = new String[]{_ID, NAME, ICON, TYPE, ARGUMENTS, EXTRAS, POSITION}; - public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_TEXT, + String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT_NOT_NULL, TYPE_TEXT, TYPE_TEXT, TYPE_INT}; - public static final String DEFAULT_SORT_ORDER = POSITION + " ASC"; + String DEFAULT_SORT_ORDER = POSITION + " ASC"; } public static interface CachedRelationships extends BaseColumns { - public static final String TABLE_NAME = "cached_relationships"; - public static final String CONTENT_PATH = TABLE_NAME; + String TABLE_NAME = "cached_relationships"; + String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final String ACCOUNT_ID = "account_id"; + String ACCOUNT_ID = "account_id"; - public static final String USER_ID = "user_id"; + String USER_ID = "user_id"; - public static final String FOLLOWING = "following"; + String FOLLOWING = "following"; - public static final String FOLLOWED_BY = "followed_by"; + String FOLLOWED_BY = "followed_by"; - public static final String BLOCKING = "blocking"; + String BLOCKING = "blocking"; - public static final String BLOCKED_BY = "blocked_by"; + String BLOCKED_BY = "blocked_by"; - public static final String MUTING = "muting"; + String MUTING = "muting"; - public static final String[] COLUMNS = {_ID, ACCOUNT_ID, USER_ID, FOLLOWING, FOLLOWED_BY, BLOCKING, + String[] COLUMNS = {_ID, ACCOUNT_ID, USER_ID, FOLLOWING, FOLLOWED_BY, BLOCKING, BLOCKED_BY, MUTING}; - public static final String[] TYPES = {TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_BOOLEAN_DEFAULT_FALSE, + String[] TYPES = {TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_BOOLEAN_DEFAULT_FALSE, TYPE_BOOLEAN_DEFAULT_FALSE, TYPE_BOOLEAN_DEFAULT_FALSE, TYPE_BOOLEAN_DEFAULT_FALSE, TYPE_BOOLEAN_DEFAULT_FALSE}; } public static interface UnreadCounts extends BaseColumns { - public static final String CONTENT_PATH = "unread_counts"; + String CONTENT_PATH = "unread_counts"; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final String TAB_POSITION = "tab_position"; + String TAB_POSITION = "tab_position"; - public static final String TAB_TYPE = "tab_type"; + String TAB_TYPE = "tab_type"; - public static final String COUNT = "count"; + String COUNT = "count"; - public static final String[] MATRIX_COLUMNS = new String[]{TAB_POSITION, TAB_TYPE, COUNT}; + String[] MATRIX_COLUMNS = new String[]{TAB_POSITION, TAB_TYPE, COUNT}; - public static final String[] COLUMNS = new String[]{_ID, TAB_POSITION, TAB_TYPE, COUNT}; + String[] COLUMNS = new String[]{_ID, TAB_POSITION, TAB_TYPE, COUNT}; public static interface ByType extends UnreadCounts { - public static final String CONTENT_PATH_SEGMENT = "by_type"; + String CONTENT_PATH_SEGMENT = "by_type"; - public static final String CONTENT_PATH = UnreadCounts.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + String CONTENT_PATH = UnreadCounts.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final Uri CONTENT_URI = Uri.withAppendedPath(UnreadCounts.CONTENT_URI, CONTENT_PATH_SEGMENT); + Uri CONTENT_URI = Uri.withAppendedPath(UnreadCounts.CONTENT_URI, CONTENT_PATH_SEGMENT); } } } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java index 148c832cd..531a3b851 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java @@ -307,10 +307,9 @@ public final class ContentValuesCreator implements TwidereConstants { values.put(Statuses.ACCOUNT_ID, accountId); values.put(Statuses.STATUS_ID, orig.getId()); values.put(Statuses.STATUS_TIMESTAMP, orig.getCreatedAt().getTime()); - final boolean isRetweet = orig.isRetweet(); final Status status; - final Status retweetedStatus = isRetweet ? orig.getRetweetedStatus() : null; - if (retweetedStatus != null) { + if (orig.isRetweet()) { + final Status retweetedStatus = orig.getRetweetedStatus(); final User retweetUser = orig.getUser(); final long retweetedById = retweetUser.getId(); values.put(Statuses.RETWEET_ID, retweetedStatus.getId()); @@ -319,12 +318,34 @@ public final class ContentValuesCreator implements TwidereConstants { values.put(Statuses.RETWEETED_BY_USER_NAME, retweetUser.getName()); values.put(Statuses.RETWEETED_BY_USER_SCREEN_NAME, retweetUser.getScreenName()); values.put(Statuses.RETWEETED_BY_USER_PROFILE_IMAGE, ParseUtils.parseString(retweetUser.getProfileImageUrlHttps())); + values.put(Statuses.IS_RETWEET, true); if (retweetedById == accountId) { values.put(Statuses.MY_RETWEET_ID, orig.getId()); } else { values.put(Statuses.MY_RETWEET_ID, orig.getCurrentUserRetweet()); } status = retweetedStatus; + } else if (orig.isQuote()) { + final Status quotedStatus = orig.getQuotedStatus(); + final User quoteUser = orig.getUser(); + final long quotedById = quoteUser.getId(); + values.put(Statuses.QUOTE_ID, quotedStatus.getId()); + final String textHtml = TwitterContentUtils.formatStatusText(orig); + values.put(Statuses.QUOTE_TEXT_HTML, textHtml); + values.put(Statuses.QUOTE_TEXT_PLAIN, orig.getText()); + values.put(Statuses.QUOTE_TEXT_UNESCAPED, toPlainText(textHtml)); + values.put(Statuses.QUOTE_TIMESTAMP, quotedStatus.getCreatedAt().getTime()); + values.put(Statuses.QUOTED_BY_USER_ID, quotedById); + values.put(Statuses.QUOTED_BY_USER_NAME, quoteUser.getName()); + values.put(Statuses.QUOTED_BY_USER_SCREEN_NAME, quoteUser.getScreenName()); + values.put(Statuses.QUOTED_BY_USER_PROFILE_IMAGE, ParseUtils.parseString(quoteUser.getProfileImageUrlHttps())); + values.put(Statuses.IS_QUOTE, true); + if (quotedById == accountId) { + values.put(Statuses.MY_QUOTE_ID, orig.getId()); +// } else { +// values.put(Statuses.MY_QUOTE_ID, orig.getCurrentUserRetweet()); + } + status = quotedStatus; } else { values.put(Statuses.MY_RETWEET_ID, orig.getCurrentUserRetweet()); status = orig; @@ -340,10 +361,10 @@ public final class ContentValuesCreator implements TwidereConstants { values.put(Statuses.IS_VERIFIED, user.isVerified()); values.put(Statuses.USER_PROFILE_IMAGE_URL, profileImageUrl); values.put(CachedUsers.IS_FOLLOWING, user.isFollowing()); - final String text_html = TwitterContentUtils.formatStatusText(status); - values.put(Statuses.TEXT_HTML, text_html); + final String textHtml = TwitterContentUtils.formatStatusText(status); + values.put(Statuses.TEXT_HTML, textHtml); values.put(Statuses.TEXT_PLAIN, status.getText()); - values.put(Statuses.TEXT_UNESCAPED, toPlainText(text_html)); + values.put(Statuses.TEXT_UNESCAPED, toPlainText(textHtml)); values.put(Statuses.RETWEET_COUNT, status.getRetweetCount()); values.put(Statuses.REPLY_COUNT, status.getReplyCount()); values.put(Statuses.FAVORITE_COUNT, status.getFavoriteCount()); @@ -362,7 +383,6 @@ public final class ContentValuesCreator implements TwidereConstants { if (place != null) { values.put(Statuses.PLACE_FULL_NAME, place.getFullName()); } - values.put(Statuses.IS_RETWEET, isRetweet); values.put(Statuses.IS_FAVORITE, status.isFavorited()); final ParcelableMedia[] media = ParcelableMedia.fromEntities(status); if (media != null) { diff --git a/twidere.component.twitter4j/src/main/java/twitter4j/Status.java b/twidere.component.twitter4j/src/main/java/twitter4j/Status.java index c9e28cad9..55bc4d797 100644 --- a/twidere.component.twitter4j/src/main/java/twitter4j/Status.java +++ b/twidere.component.twitter4j/src/main/java/twitter4j/Status.java @@ -114,6 +114,8 @@ public interface Status extends Comparable, TwitterResponse, ExtendedEnt */ Status getRetweetedStatus(); + Status getQuotedStatus(); + /** * returns the source of the tweet * @@ -151,6 +153,8 @@ public interface Status extends Comparable, TwitterResponse, ExtendedEnt */ boolean isRetweet(); + boolean isQuote(); + /** * Returns true if the authenticating user has retweeted this tweet, or * false when the tweet was created before this feature was enabled. diff --git a/twidere.component.twitter4j/src/main/java/twitter4j/http/HttpClientWrapper.java b/twidere.component.twitter4j/src/main/java/twitter4j/http/HttpClientWrapper.java index b7d4e0db7..55ae16144 100644 --- a/twidere.component.twitter4j/src/main/java/twitter4j/http/HttpClientWrapper.java +++ b/twidere.component.twitter4j/src/main/java/twitter4j/http/HttpClientWrapper.java @@ -95,7 +95,7 @@ public final class HttpClientWrapper { } public HttpResponse get(final String url, final String signUrl) throws TwitterException { - return get(url, signUrl, null, null); + return get(url, signUrl, null, null, null); } public HttpResponse get(final String url, final String signUrl, final Authorization authorization) @@ -105,12 +105,37 @@ public final class HttpClientWrapper { public HttpResponse get(final String url, final String signUrl, final HttpParameter[] parameters) throws TwitterException { - return get(url, signUrl, parameters, null); + return get(url, signUrl, parameters, null, null); } public HttpResponse get(final String url, final String signUrl, final HttpParameter[] parameters, final Authorization authorization) throws TwitterException { - return request(new HttpRequest(GET, url, signUrl, parameters, authorization, requestHeaders)); + return get(url, signUrl, parameters, authorization, null); + } + + public HttpResponse get(final String url, final String signUrl, final HttpParameter[] parameters, + final Map> requestHeaders) throws TwitterException { + return get(url, signUrl, parameters, null, requestHeaders); + } + + public HttpResponse get(final String url, final String signUrl, final Map> requestHeaders) + throws TwitterException { + return get(url, signUrl, null, null, requestHeaders); + } + + public HttpResponse get(final String url, final String signUrl, final Authorization authorization, + final Map> requestHeaders) throws TwitterException { + return get(url, signUrl, null, authorization, requestHeaders); + } + + public HttpResponse get(final String url, final String signUrl, final HttpParameter[] parameters, + final Authorization authorization, final Map> requestHeaders) + throws TwitterException { + final Map> headers = new HashMap<>(this.requestHeaders); + if (requestHeaders != null) { + headers.putAll(requestHeaders); + } + return request(new HttpRequest(GET, url, signUrl, parameters, authorization, headers)); } @Override diff --git a/twidere.component.twitter4j/src/main/java/twitter4j/internal/json/StatusJSONImpl.java b/twidere.component.twitter4j/src/main/java/twitter4j/internal/json/StatusJSONImpl.java index a52c036b4..66168bf50 100644 --- a/twidere.component.twitter4j/src/main/java/twitter4j/internal/json/StatusJSONImpl.java +++ b/twidere.component.twitter4j/src/main/java/twitter4j/internal/json/StatusJSONImpl.java @@ -92,6 +92,7 @@ final class StatusJSONImpl extends TwitterResponseImpl implements Status { private long[] contributorsIDs; private Status retweetedStatus; + private Status quotedStatus; private UserMentionEntity[] userMentionEntities; private URLEntity[] urlEntities; private HashtagEntity[] hashtagEntities; @@ -252,6 +253,11 @@ final class StatusJSONImpl extends TwitterResponseImpl implements Status { return retweetedStatus; } + @Override + public Status getQuotedStatus() { + return quotedStatus; + } + /** * {@inheritDoc} */ @@ -318,6 +324,11 @@ final class StatusJSONImpl extends TwitterResponseImpl implements Status { return retweetedStatus != null; } + @Override + public boolean isQuote() { + return quotedStatus != null; + } + /** * {@inheritDoc} */ @@ -395,6 +406,16 @@ final class StatusJSONImpl extends TwitterResponseImpl implements Status { logger.warn("failed to parse retweeted_status:" + json); } } + + if (!json.isNull("quoted_status")) { + try { + quotedStatus = new StatusJSONImpl(json.getJSONObject("quoted_status")); + } catch (final JSONException ignore) { + ignore.printStackTrace(); + logger.warn("failed to parse retweeted_status:" + json); + } + } + if (!json.isNull("contributors")) { try { final JSONArray contributorsArray = json.getJSONArray("contributors"); diff --git a/twidere/build.gradle b/twidere/build.gradle index ad9e87cc1..8e5d654ed 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -55,6 +55,7 @@ repositories { jcenter() mavenCentral() maven { url 'https://repo.commonsware.com.s3.amazonaws.com' } + maven { url 'https://github.com/suckgamony/RapidDecoder/raw/master/repository' } maven { url "https://jitpack.io" } } @@ -75,16 +76,18 @@ dependencies { compile 'com.squareup:otto:1.3.6' compile 'dnsjava:dnsjava:2.1.7' compile 'com.commonsware.cwac:merge:1.1.1' - compile 'com.diegocarloslima:byakugallery:0.1.0' + compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.1.3' compile 'com.rengwuxian.materialedittext:library:2.0.3' compile 'com.pnikosis:materialish-progress:1.5' compile 'com.squareup.okhttp:okhttp:2.3.0' - compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.3' + // Disabled temporarilly due to attribute clash with subsampling-scale-image-view + // compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.3' compile 'com.github.mariotaku:MessageBubbleView:1.0' compile 'com.github.mariotaku:DragSortListView:0.6.1' compile 'com.github.mariotaku:SlidingMenu:1.3' compile 'com.github.uucky:ColorPicker-Android:0.9.1' compile 'com.sprylab.android.texturevideoview:texturevideoview:1.0.0' + compile 'com.squareup:pollexor:2.0.2' googleCompile 'com.google.android.gms:play-services-maps:7.0.0' googleCompile 'com.google.maps.android:android-maps-utils:0.3.4' fdroidCompile 'org.osmdroid:osmdroid-android:4.3' diff --git a/twidere/src/main/java/org/mariotaku/twidere/Constants.java b/twidere/src/main/java/org/mariotaku/twidere/Constants.java index 9a4433be7..1dfea7834 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/Constants.java +++ b/twidere/src/main/java/org/mariotaku/twidere/Constants.java @@ -33,7 +33,7 @@ import static org.mariotaku.twidere.annotation.Preference.Type.STRING; public interface Constants extends TwidereConstants { String DATABASES_NAME = "twidere.sqlite"; - int DATABASES_VERSION = 93; + int DATABASES_VERSION = 94; int MENU_GROUP_STATUS_EXTENSION = 10; int MENU_GROUP_COMPOSE_EXTENSION = 11; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java index 48b7c590f..bd1ee86d3 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java @@ -17,7 +17,6 @@ package org.mariotaku.twidere.activity.support; import android.content.Intent; -import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask.Status; import android.os.Bundle; @@ -39,12 +38,9 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLayoutChangeListener; import android.view.ViewGroup; -import android.webkit.WebView; -import android.widget.Toast; -import android.widget.VideoView; -import com.diegocarloslima.byakugallery.lib.TileBitmapDrawable; -import com.diegocarloslima.byakugallery.lib.TileBitmapDrawable.OnInitializeListener; +import com.davemorrissey.labs.subscaleview.ImageSource; +import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; import com.pnikosis.materialishprogress.ProgressWheel; import com.sprylab.android.widget.TextureVideoView; @@ -66,15 +62,9 @@ import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.VideoLoader; import org.mariotaku.twidere.util.VideoLoader.VideoLoadingListener; -import org.mariotaku.twidere.view.TouchImageView; -import org.mariotaku.twidere.view.TouchImageView.ZoomListener; import java.io.File; -import java.io.FileDescriptor; -import java.io.IOException; -import java.io.RandomAccessFile; -import pl.droidsonroids.gif.GifDrawable; public final class MediaViewerActivity extends ThemedActionBarActivity implements Constants, OnPageChangeListener { @@ -284,9 +274,9 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement } public static final class ImagePageFragment extends BaseSupportFragment - implements DownloadListener, LoaderCallbacks, OnLayoutChangeListener, OnClickListener, ZoomListener { + implements DownloadListener, LoaderCallbacks, OnLayoutChangeListener, OnClickListener { - private TouchImageView mImageView; + private SubsamplingScaleImageView mImageView; private ProgressWheel mProgressBar; private boolean mLoaderInitialized; private float mContentLength; @@ -295,7 +285,7 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement @Override public void onBaseViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onBaseViewCreated(view, savedInstanceState); - mImageView = (TouchImageView) view.findViewById(R.id.image_view); + mImageView = (SubsamplingScaleImageView) view.findViewById(R.id.image_view); mProgressBar = (ProgressWheel) view.findViewById(R.id.progress); } @@ -326,40 +316,24 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement mImageView.setVisibility(View.VISIBLE); mImageView.setTag(data.file); if (data.useDecoder) { - TileBitmapDrawable.attachTileBitmapDrawable(mImageView, data.file.getAbsolutePath(), - null, new OnInitializeListener() { - @Override - public void onStartInitialization() { - - } - - @Override - public void onEndInitialization() { - mImageView.post(new Runnable() { - @Override - public void run() { - updateScaleLimit(); - } - }); - } - }); + mImageView.setImage(ImageSource.uri(Uri.fromFile(data.file))); } else if ("image/gif".equals(data.options.outMimeType)) { - try { - final FileDescriptor fd = new RandomAccessFile(data.file, "r").getFD(); - mImageView.setImageDrawable(new GifDrawable(fd)); - } catch (IOException e) { - mImageView.setImageDrawable(null); - mImageView.setTag(null); - mImageView.setVisibility(View.GONE); - Utils.showErrorMessage(getActivity(), null, e, true); - } +// try { +// final FileDescriptor fd = new RandomAccessFile(data.file, "r").getFD(); +// mImageView.setImageDrawable(new GifDrawable(fd)); +// } catch (IOException e) { +// mImageView.setImage(null); +// mImageView.setTag(null); +// mImageView.setVisibility(View.GONE); +// Utils.showErrorMessage(getActivity(), null, e, true); +// } updateScaleLimit(); } else { - mImageView.setImageBitmap(data.bitmap); + mImageView.setImage(ImageSource.bitmap(data.bitmap)); updateScaleLimit(); } } else { - mImageView.setImageDrawable(null); + mImageView.setImage(null); mImageView.setTag(null); mImageView.setVisibility(View.GONE); Utils.showErrorMessage(getActivity(), null, data.exception, true); @@ -371,10 +345,10 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement @Override public void onLoaderReset(final Loader loader) { - final Drawable drawable = mImageView.getDrawable(); - if (drawable instanceof GifDrawable) { - ((GifDrawable) drawable).recycle(); - } +// final Drawable drawable = mImageView.getDrawable(); +// if (drawable instanceof GifDrawable) { +// ((GifDrawable) drawable).recycle(); +// } } @Override @@ -462,7 +436,6 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); mImageView.setOnClickListener(this); - mImageView.setZoomListener(this); loadImage(); } @@ -510,13 +483,11 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement } - @Override public void onZoomOut() { final MediaViewerActivity activity = (MediaViewerActivity) getActivity(); activity.setBarVisibility(true); } - @Override public void onZoomIn() { final MediaViewerActivity activity = (MediaViewerActivity) getActivity(); activity.setBarVisibility(false); @@ -533,16 +504,16 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement } private void updateScaleLimit() { - final int viewWidth = mImageView.getWidth(), viewHeight = mImageView.getHeight(); - final Drawable drawable = mImageView.getDrawable(); - if (drawable == null || viewWidth <= 0 || viewHeight <= 0) return; - final int drawableWidth = drawable.getIntrinsicWidth(); - final int drawableHeight = drawable.getIntrinsicHeight(); - if (drawableWidth <= 0 || drawableHeight <= 0) return; - final float widthRatio = viewWidth / (float) drawableWidth; - final float heightRatio = viewHeight / (float) drawableHeight; - mImageView.setMaxScale(Math.max(1, Math.max(heightRatio, widthRatio))); - mImageView.resetScale(); +// final int viewWidth = mImageView.getWidth(), viewHeight = mImageView.getHeight(); +// final Drawable drawable = mImageView.getDrawable(); +// if (drawable == null || viewWidth <= 0 || viewHeight <= 0) return; +// final int drawableWidth = drawable.getIntrinsicWidth(); +// final int drawableHeight = drawable.getIntrinsicHeight(); +// if (drawableWidth <= 0 || drawableHeight <= 0) return; +// final float widthRatio = viewWidth / (float) drawableWidth; +// final float heightRatio = viewHeight / (float) drawableHeight; +// mImageView.setMaxScale(Math.max(1, Math.max(heightRatio, widthRatio))); +// mImageView.resetScale(); } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java index fabfdab6c..03404991f 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java @@ -38,9 +38,9 @@ import org.mariotaku.twidere.view.holder.StatusViewHolder; */ public abstract class AbsStatusesAdapter extends Adapter implements Constants, IStatusesAdapter { - public static final int ITEM_VIEW_TYPE_STATUS = 0; + public static final int ITEM_VIEW_TYPE_LOAD_INDICATOR = 0; public static final int ITEM_VIEW_TYPE_GAP = 1; - public static final int ITEM_VIEW_TYPE_LOAD_INDICATOR = 2; + public static final int ITEM_VIEW_TYPE_STATUS = 2; private final Context mContext; private final LayoutInflater mInflater; diff --git a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java index 08a95dd5c..4a98a2d6c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java +++ b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java @@ -114,7 +114,7 @@ public class TwidereApplication extends MultiDexApplication implements Constants public ImageDownloader getFullImageDownloader() { if (mFullImageDownloader != null) return mFullImageDownloader; - return mFullImageDownloader = new TwidereImageDownloader(this, true); + return mFullImageDownloader = new TwidereImageDownloader(this, true, true); } public Handler getHandler() { @@ -133,7 +133,7 @@ public class TwidereApplication extends MultiDexApplication implements Constants public ImageDownloader getImageDownloader() { if (mImageDownloader != null) return mImageDownloader; - return mImageDownloader = new TwidereImageDownloader(this, false); + return mImageDownloader = new TwidereImageDownloader(this, false, true); } public ImageLoader getImageLoader() { @@ -274,7 +274,8 @@ public class TwidereApplication extends MultiDexApplication implements Constants startUsageStatisticsServiceIfNeeded(this); //end } else if (KEY_CONSUMER_KEY.equals(key) || KEY_CONSUMER_SECRET.equals(key) || KEY_API_URL_FORMAT.equals(key) - || KEY_AUTH_TYPE.equals(key) || KEY_SAME_OAUTH_SIGNING_URL.equals(key)) { + || KEY_AUTH_TYPE.equals(key) || KEY_SAME_OAUTH_SIGNING_URL.equals(key) || KEY_THUMBOR_ENABLED.equals(key) + || KEY_THUMBOR_ADDRESS.equals(key) || KEY_THUMBOR_SECURITY_KEY.equals(key)) { final SharedPreferences.Editor editor = preferences.edit(); editor.putLong(KEY_API_LAST_CHANGE, System.currentTimeMillis()); editor.apply(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java index 4ba69c054..727fb90af 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java @@ -68,7 +68,6 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.webkit.URLUtil; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.Space; import android.widget.TextView; @@ -106,6 +105,7 @@ import org.mariotaku.twidere.util.TwitterCardUtils; import org.mariotaku.twidere.util.UserColorNameUtils; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils.OnMediaClickListener; +import org.mariotaku.twidere.view.CardMediaContainer; import org.mariotaku.twidere.view.ShapedImageView; import org.mariotaku.twidere.view.StatusTextView; import org.mariotaku.twidere.view.TwitterCardContainer; @@ -525,7 +525,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac private final View retweetedByContainer; private final View mediaPreviewContainer; private final View mediaPreviewLoad; - private final LinearLayout mediaPreviewGrid; + private final CardMediaContainer mediaPreview; private final TextView locationView; private final TwitterCardContainer twitterCard; @@ -549,9 +549,9 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac repliesCountView = (TextView) itemView.findViewById(R.id.replies_count); retweetsCountView = (TextView) itemView.findViewById(R.id.retweets_count); favoritesCountView = (TextView) itemView.findViewById(R.id.favorites_count); - mediaPreviewContainer = itemView.findViewById(R.id.media_preview); + mediaPreviewContainer = itemView.findViewById(R.id.media_preview_container); mediaPreviewLoad = itemView.findViewById(R.id.media_preview_load); - mediaPreviewGrid = (LinearLayout) itemView.findViewById(R.id.media_preview_grid); + mediaPreview = (CardMediaContainer) itemView.findViewById(R.id.media_preview); locationView = (TextView) itemView.findViewById(R.id.location_view); profileContainer = itemView.findViewById(R.id.profile_container); twitterCard = (TwitterCardContainer) itemView.findViewById(R.id.twitter_card); @@ -640,16 +640,13 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac } else if (adapter.isDetailMediaExpanded()) { mediaPreviewContainer.setVisibility(View.VISIBLE); mediaPreviewLoad.setVisibility(View.GONE); - mediaPreviewGrid.setVisibility(View.VISIBLE); - mediaPreviewGrid.removeAllViews(); - final int maxColumns = resources.getInteger(R.integer.grid_column_image_preview); - Utils.addToLinearLayout(mediaPreviewGrid, loader, status.media, status.account_id, - maxColumns, adapter.getFragment()); + mediaPreview.setVisibility(View.VISIBLE); + mediaPreview.displayMedia(status.media, loader, status.account_id, + adapter.getFragment(), adapter.getImageLoadingHandler()); } else { mediaPreviewContainer.setVisibility(View.VISIBLE); mediaPreviewLoad.setVisibility(View.VISIBLE); - mediaPreviewGrid.setVisibility(View.GONE); - mediaPreviewGrid.removeAllViews(); + mediaPreview.setVisibility(View.GONE); } if (TwitterCardUtils.isCardSupported(status.card)) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/preference/SwitchSettingsDetailsPreference.java b/twidere/src/main/java/org/mariotaku/twidere/preference/SwitchSettingsDetailsPreference.java new file mode 100644 index 000000000..ba44cc666 --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/preference/SwitchSettingsDetailsPreference.java @@ -0,0 +1,86 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * 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 3 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, see . + */ + +package org.mariotaku.twidere.preference; + +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Bundle; +import android.preference.SwitchPreference; +import android.support.annotation.NonNull; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Switch; + +import org.mariotaku.twidere.Constants; +import org.mariotaku.twidere.fragment.SettingsDetailsFragment; + +/** + * Created by mariotaku on 15/4/7. + */ +public class SwitchSettingsDetailsPreference extends SwitchPreference implements Constants { + + public SwitchSettingsDetailsPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + final TypedArray a = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.src}); + setFragment(SettingsDetailsFragment.class.getName()); + final Bundle extras = getExtras(); + extras.putInt(EXTRA_RESID, a.getResourceId(0, 0)); + a.recycle(); + + } + + public SwitchSettingsDetailsPreference(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.switchPreferenceStyle); + } + + public SwitchSettingsDetailsPreference(Context context) { + this(context, null); + } + + @Override + protected void onBindView(@NonNull View view) { + super.onBindView(view); + if (view instanceof ViewGroup) { + ((ViewGroup) view).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); + } + final Switch switchView = (Switch) findViewByType(view, Switch.class); + if (switchView != null) { + switchView.setClickable(true); + switchView.setFocusable(true); + } + } + + private static View findViewByType(View view, Class cls) { + if (cls.isAssignableFrom(view.getClass())) return view; + if (view instanceof ViewGroup) { + for (int i = 0, j = ((ViewGroup) view).getChildCount(); i < j; i++) { + final View found = findViewByType(((ViewGroup) view).getChildAt(i), cls); + if (found != null) return found; + } + } + return null; + } + + @Override + protected void onClick() { + + } +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java b/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java index 7c1593cc4..268754101 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java +++ b/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java @@ -407,7 +407,6 @@ public class BackgroundOperationService extends IntentService implements Constan final ContentLengthInputStream is = new ContentLengthInputStream(file); is.setReadListener(new MessageMediaUploadListener(this, mNotificationManager, builder, text)); final MediaUploadResponse uploadResp = twitter.uploadMedia(file.getName(), is, o.outMimeType); -// final MediaUploadResponse uploadResp = twitter.uploadMediaBase64(is); directMessage = new ParcelableDirectMessage(twitter.sendDirectMessage(recipientId, text, uploadResp.getId()), accountId, true); if (!file.delete()) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ImageLoadingHandler.java b/twidere/src/main/java/org/mariotaku/twidere/util/ImageLoadingHandler.java index 8c21b30ea..86705a43a 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/ImageLoadingHandler.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/ImageLoadingHandler.java @@ -20,7 +20,10 @@ package org.mariotaku.twidere.util; import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.support.v4.content.res.ResourcesCompat; import android.view.View; +import android.view.ViewGroup; import android.view.ViewParent; import android.widget.ImageView; import android.widget.ProgressBar; @@ -30,6 +33,8 @@ import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener; import org.mariotaku.twidere.R; +import org.mariotaku.twidere.model.ParcelableMedia; +import org.mariotaku.twidere.view.ForegroundImageView; import java.util.HashMap; import java.util.Map; @@ -55,6 +60,9 @@ public class ImageLoadingHandler implements ImageLoadingListener, ImageLoadingPr public void onLoadingCancelled(final String imageUri, final View view) { if (view == null || imageUri == null || imageUri.equals(mLoadingUris.get(view))) return; mLoadingUris.remove(view); + if (view instanceof ForegroundImageView) { + ((ForegroundImageView) view).setForeground(null); + } final ProgressBar progress = findProgressBar(view.getParent()); if (progress != null) { progress.setVisibility(View.GONE); @@ -65,18 +73,38 @@ public class ImageLoadingHandler implements ImageLoadingListener, ImageLoadingPr public void onLoadingComplete(final String imageUri, final View view, final Bitmap bitmap) { if (view == null) return; mLoadingUris.remove(view); - final ProgressBar progress = findProgressBar(view.getParent()); + final ViewGroup parent = (ViewGroup) view.getParent(); + if (view instanceof ForegroundImageView) { + final Drawable foreground; + if (isVideoItem(parent)) { + foreground = ResourcesCompat.getDrawable(view.getResources(), R.drawable.ic_card_media_play, null); + } else { + foreground = null; + } + ((ForegroundImageView) view).setForeground(foreground); + } + final ProgressBar progress = findProgressBar(parent); if (progress != null) { progress.setVisibility(View.GONE); } } + private static boolean isVideoItem(ViewGroup parent) { + final Object tag = parent.getTag(); + if (tag instanceof ParcelableMedia) { + return ((ParcelableMedia) tag).type == ParcelableMedia.TYPE_VIDEO; + } + return false; + } + @Override public void onLoadingFailed(final String imageUri, final View view, final FailReason reason) { if (view == null) return; - if (view instanceof ImageView) { + if (view instanceof ForegroundImageView) { ((ImageView) view).setImageDrawable(null); - view.setBackgroundResource(R.drawable.image_preview_refresh); + final Drawable foreground = ResourcesCompat.getDrawable(view.getResources(), + R.drawable.image_preview_refresh, null); + ((ForegroundImageView) view).setForeground(foreground); } mLoadingUris.remove(view); final ProgressBar progress = findProgressBar(view.getParent()); @@ -88,8 +116,8 @@ public class ImageLoadingHandler implements ImageLoadingListener, ImageLoadingPr @Override public void onLoadingStarted(final String imageUri, final View view) { if (view == null || imageUri == null || imageUri.equals(mLoadingUris.get(view))) return; - if (view instanceof ImageView) { - view.setBackgroundResource(0); + if (view instanceof ForegroundImageView) { + ((ForegroundImageView) view).setForeground(null); } mLoadingUris.put(view, imageUri); final ProgressBar progress = findProgressBar(view.getParent()); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/OAuthPasswordAuthenticator.java b/twidere/src/main/java/org/mariotaku/twidere/util/OAuthPasswordAuthenticator.java index d2f36e5a7..5540ccb61 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/OAuthPasswordAuthenticator.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/OAuthPasswordAuthenticator.java @@ -73,7 +73,7 @@ public class OAuthPasswordAuthenticator implements Constants { final String oauthToken = requestToken.getToken(); final String authorizationUrl = requestToken.getAuthorizationURL(); final HashMap inputMap = new HashMap<>(); - final HttpResponse authorizePage = client.get(authorizationUrl, authorizationUrl, null, null); + final HttpResponse authorizePage = client.get(authorizationUrl, authorizationUrl, null, null, null); final List cookieHeaders = authorizePage.getResponseHeaders("Set-Cookie"); readInputFromHtml(authorizePage.asReader(), inputMap, INPUT_AUTHENTICITY_TOKEN, INPUT_REDIRECT_AFTER_LOGIN); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java index a4896e1a5..3272aa8c6 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java @@ -95,7 +95,6 @@ import android.util.TypedValue; import android.view.Gravity; import android.view.KeyCharacterMap; import android.view.KeyEvent; -import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; @@ -106,8 +105,6 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.webkit.MimeTypeMap; import android.widget.AbsListView; -import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; @@ -233,8 +230,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; import java.util.List; -import java.util.ListIterator; import java.util.Locale; import java.util.Map.Entry; import java.util.regex.Matcher; @@ -486,52 +483,6 @@ public final class Utils implements Constants, TwitterConstants { } } - public static void addToLinearLayout(final LinearLayout container, final MediaLoaderWrapper loader, - final List mediaList, final long accountId, - final int maxColumnCount, final OnMediaClickListener mediaClickListener) { - if (container.getOrientation() != LinearLayout.VERTICAL) - throw new IllegalArgumentException(); - final Context context = container.getContext(); - final ImageLoadingHandler loadingHandler = new ImageLoadingHandler(R.id.media_preview_progress); - final LayoutInflater inflater = LayoutInflater.from(context); - final ListIterator iterator = mediaList.listIterator(); - final int imageCount = mediaList.size(); - final double imageCountSqrt = Math.sqrt(imageCount); - final int bestColumnCount = imageCountSqrt % 1 == 0 ? (int) imageCountSqrt : maxColumnCount; - final int firstColumn = imageCount % bestColumnCount, fullRowCount = imageCount / bestColumnCount; - final int rowCount = fullRowCount + (firstColumn > 0 ? 1 : 0); - final View.OnClickListener clickListener = new ImageGridClickListener(mediaClickListener, accountId); - container.setMotionEventSplittingEnabled(false); - for (int currentRow = 0; currentRow < rowCount; currentRow++) { - final LinearLayout rowContainer = new LinearLayout(context); - rowContainer.setOrientation(LinearLayout.HORIZONTAL); - rowContainer.setMotionEventSplittingEnabled(false); - container.addView(rowContainer, LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.WRAP_CONTENT); - final int columnCount = currentRow == 0 && firstColumn > 0 ? firstColumn : bestColumnCount; - for (int currentColumn = 0; currentColumn < columnCount; currentColumn++) { - final ParcelableMedia media = iterator.next(); - final View item = inflater.inflate(R.layout.grid_item_media_preview, rowContainer, false); - item.setTag(media); - if (mediaClickListener != null) { - item.setOnClickListener(clickListener); - } - final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) item.getLayoutParams(); - lp.weight = 1.0f; - rowContainer.addView(item, lp); - final ImageView imageView = (ImageView) item.findViewById(R.id.media_preview_item); - loader.displayPreviewImage(imageView, media.page_url, loadingHandler); - } - } - } - - public static void addToLinearLayout(final LinearLayout container, final MediaLoaderWrapper loader, - final ParcelableMedia[] mediaArray, final long accountId, - final int maxColumnCount, final OnMediaClickListener listener) { - addToLinearLayout(container, loader, Arrays.asList(mediaArray), accountId, maxColumnCount, - listener); - } - public static void announceForAccessibilityCompat(final Context context, final View view, final CharSequence text, final Class cls) { final AccessibilityManager accessibilityManager = (AccessibilityManager) context @@ -2194,13 +2145,15 @@ public final class Utils implements Constants, TwitterConstants { } public static HttpResponse getRedirectedHttpResponse(final HttpClientWrapper client, final String url, - final String signUrl, final Authorization auth) throws TwitterException { + final String signUrl, final Authorization auth, + final HashMap> additionalHeaders) + throws TwitterException { if (url == null) return null; final ArrayList urls = new ArrayList<>(); urls.add(url); HttpResponse resp; try { - resp = client.get(url, signUrl, auth); + resp = client.get(url, signUrl, auth, additionalHeaders); } catch (final TwitterException te) { if (isRedirected(te.getStatusCode())) { resp = te.getHttpResponse(); @@ -2213,7 +2166,7 @@ public final class Utils implements Constants, TwitterConstants { if (urls.contains(request_url)) throw new TwitterException("Too many redirects"); urls.add(request_url); try { - resp = client.get(request_url, request_url); + resp = client.get(request_url, request_url, additionalHeaders); } catch (final TwitterException te) { if (isRedirected(te.getStatusCode())) { resp = te.getHttpResponse(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/VideoLoader.java b/twidere/src/main/java/org/mariotaku/twidere/util/VideoLoader.java index 711825a69..7538481ce 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/VideoLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/VideoLoader.java @@ -30,6 +30,7 @@ import com.squareup.otto.Bus; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.SingleResponse; import org.mariotaku.twidere.task.ManagedAsyncTask; +import org.mariotaku.twidere.util.imageloader.TwidereImageDownloader; import org.mariotaku.twidere.util.message.VideoLoadFinishedEvent; import java.io.File; @@ -52,7 +53,7 @@ public class VideoLoader { final TwidereApplication app = TwidereApplication.getInstance(context); mContext = context; mDiskCache = app.getDiskCache(); - mImageDownloader = app.getImageDownloader(); + mImageDownloader = new TwidereImageDownloader(context, false, false); mTaskManager = app.getAsyncTaskManager(); mBus = app.getMessageBus(); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/imageloader/TwidereImageDownloader.java b/twidere/src/main/java/org/mariotaku/twidere/util/imageloader/TwidereImageDownloader.java index d4ccc1a84..a9bcf1773 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/imageloader/TwidereImageDownloader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/imageloader/TwidereImageDownloader.java @@ -21,17 +21,23 @@ package org.mariotaku.twidere.util.imageloader; import android.content.Context; import android.net.Uri; +import android.os.Build; import android.text.TextUtils; +import android.webkit.URLUtil; import com.nostra13.universalimageloader.core.assist.ContentLengthInputStream; import com.nostra13.universalimageloader.core.download.BaseImageDownloader; +import com.squareup.pollexor.Thumbor; +import com.squareup.pollexor.ThumborUrlBuilder; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; +import org.mariotaku.twidere.constant.SharedPreferenceConstants; import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.model.ParcelableAccount.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.util.MediaPreviewUtils; +import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.Utils; import java.io.IOException; @@ -40,6 +46,7 @@ import java.util.Locale; import twitter4j.TwitterException; import twitter4j.auth.Authorization; +import twitter4j.http.HeaderMap; import twitter4j.http.HttpClientWrapper; import twitter4j.http.HttpResponse; @@ -52,106 +59,134 @@ import static org.mariotaku.twidere.util.Utils.getTwitterProfileImageOfSize; public class TwidereImageDownloader extends BaseImageDownloader implements Constants { - private final Context mContext; - private HttpClientWrapper mClient; - private boolean mFastImageLoading; - private final boolean mFullImage; - private final String mTwitterProfileImageSize; + private final Context mContext; + private final SharedPreferencesWrapper mPreferences; + private final boolean mUseThumbor; + private Thumbor mThumbor; + private HttpClientWrapper mClient; + private boolean mFastImageLoading; + private final boolean mFullImage; + private final String mTwitterProfileImageSize; - public TwidereImageDownloader(final Context context, final boolean fullImage) { - super(context); - mContext = context; - mFullImage = fullImage; - mTwitterProfileImageSize = context.getString(R.string.profile_image_size); - reloadConnectivitySettings(); - } + public TwidereImageDownloader(final Context context, final boolean fullImage, final boolean useThumbor) { + super(context); + mContext = context; + mPreferences = SharedPreferencesWrapper.getInstance(context, SHARED_PREFERENCES_NAME, + Context.MODE_PRIVATE, SharedPreferenceConstants.class); + mFullImage = fullImage; + mTwitterProfileImageSize = context.getString(R.string.profile_image_size); + mUseThumbor = useThumbor; + reloadConnectivitySettings(); - public void reloadConnectivitySettings() { - mClient = getImageLoaderHttpClient(mContext); - mFastImageLoading = mContext.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE).getBoolean( - KEY_FAST_IMAGE_LOADING, true); - } + } - @Override - protected InputStream getStreamFromNetwork(final String uriString, final Object extras) throws IOException { - if (uriString == null) return null; - final ParcelableMedia media = MediaPreviewUtils.getAllAvailableImage(uriString, mFullImage, mFullImage - || !mFastImageLoading ? mClient : null); - try { - final String mediaUrl = media != null ? media.media_url : uriString; - if (isTwitterProfileImage(uriString)) { - final String replaced = getTwitterProfileImageOfSize(mediaUrl, mTwitterProfileImageSize); - return getStreamFromNetworkInternal(replaced, extras); - } else - return getStreamFromNetworkInternal(mediaUrl, extras); - } catch (final TwitterException e) { - final int statusCode = e.getStatusCode(); - if (statusCode != -1 && isTwitterProfileImage(uriString) && !uriString.contains("_normal.")) { - try { - return getStreamFromNetworkInternal(getNormalTwitterProfileImage(uriString), extras); - } catch (final TwitterException e2) { + public void reloadConnectivitySettings() { + mClient = getImageLoaderHttpClient(mContext); + mFastImageLoading = mPreferences.getBoolean(KEY_FAST_IMAGE_LOADING); + if (mUseThumbor && mPreferences.getBoolean(KEY_THUMBOR_ENABLED)) { + final String address = mPreferences.getString(KEY_THUMBOR_ADDRESS, null); + final String securityKey = mPreferences.getString(KEY_THUMBOR_SECURITY_KEY, null); + if (URLUtil.isValidUrl(address)) { + if (TextUtils.isEmpty(securityKey)) { + mThumbor = Thumbor.create(address); + } else { + mThumbor = Thumbor.create(address, securityKey); + } + } else { + mThumbor = null; + } + } else { + mThumbor = null; + } + } - } - } - throw new IOException(String.format(Locale.US, "Error downloading image %s, error code: %d", uriString, - statusCode)); - } - } + @Override + protected InputStream getStreamFromNetwork(final String uriString, final Object extras) throws IOException { + if (uriString == null) return null; + final ParcelableMedia media = MediaPreviewUtils.getAllAvailableImage(uriString, mFullImage, mFullImage + || !mFastImageLoading ? mClient : null); + try { + final String mediaUrl = media != null ? media.media_url : uriString; + if (isTwitterProfileImage(uriString)) { + final String replaced = getTwitterProfileImageOfSize(mediaUrl, mTwitterProfileImageSize); + return getStreamFromNetworkInternal(replaced, extras); + } else + return getStreamFromNetworkInternal(mediaUrl, extras); + } catch (final TwitterException e) { + final int statusCode = e.getStatusCode(); + if (statusCode != -1 && isTwitterProfileImage(uriString) && !uriString.contains("_normal.")) { + try { + return getStreamFromNetworkInternal(getNormalTwitterProfileImage(uriString), extras); + } catch (final TwitterException e2) { - private String getReplacedUri(final Uri uri, final String apiUrlFormat) { - if (uri == null) return null; - if (apiUrlFormat == null) return uri.toString(); - if (isTwitterUri(uri)) { - final StringBuilder sb = new StringBuilder(); - final String domain = uri.getHost().replaceAll("\\.?twitter.com", ""); - final String path = uri.getPath(); - sb.append(Utils.getApiUrl(apiUrlFormat, domain, path)); - final String query = uri.getQuery(); - if (!TextUtils.isEmpty(query)) { - sb.append("?"); - sb.append(query); - } - final String fragment = uri.getFragment(); - if (!TextUtils.isEmpty(fragment)) { - sb.append("#"); - sb.append(fragment); - } - return sb.toString(); - } - return uri.toString(); - } + } + } + throw new IOException(String.format(Locale.US, "Error downloading image %s, error code: %d", uriString, + statusCode)); + } + } - private ContentLengthInputStream getStreamFromNetworkInternal(final String uriString, final Object extras) - throws IOException, TwitterException { - final Uri uri = Uri.parse(uriString); - final Authorization auth; - final ParcelableCredentials account; - if (isTwitterAuthRequired(uri) && extras instanceof AccountExtra) { - final AccountExtra accountExtra = (AccountExtra) extras; - account = ParcelableAccount.getCredentials(mContext, accountExtra.account_id); - auth = getTwitterAuthorization(mContext, accountExtra.account_id); - } else { - account = null; - auth = null; - } - final String modifiedUri = getReplacedUri(uri, account != null ? account.api_url_format : null); - final HttpResponse resp = getRedirectedHttpResponse(mClient, modifiedUri, uriString, auth); - return new ContentLengthInputStream(resp.asStream(), (int) resp.getContentLength()); - } + private String getReplacedUri(final Uri uri, final String apiUrlFormat) { + if (uri == null) return null; + if (apiUrlFormat == null) return uri.toString(); + if (isTwitterUri(uri)) { + final StringBuilder sb = new StringBuilder(); + final String domain = uri.getHost().replaceAll("\\.?twitter.com", ""); + final String path = uri.getPath(); + sb.append(Utils.getApiUrl(apiUrlFormat, domain, path)); + final String query = uri.getQuery(); + if (!TextUtils.isEmpty(query)) { + sb.append("?"); + sb.append(query); + } + final String fragment = uri.getFragment(); + if (!TextUtils.isEmpty(fragment)) { + sb.append("#"); + sb.append(fragment); + } + return sb.toString(); + } + return uri.toString(); + } - private boolean isTwitterAuthRequired(final Uri uri) { - if (uri == null) return false; - return "ton.twitter.com".equalsIgnoreCase(uri.getHost()); - } + private ContentLengthInputStream getStreamFromNetworkInternal(final String uriString, final Object extras) + throws IOException, TwitterException { + final Uri uri = Uri.parse(uriString); + final Authorization auth; + final ParcelableCredentials account; + if (isTwitterAuthRequired(uri) && extras instanceof AccountExtra) { + final AccountExtra accountExtra = (AccountExtra) extras; + account = ParcelableAccount.getCredentials(mContext, accountExtra.account_id); + auth = getTwitterAuthorization(mContext, accountExtra.account_id); + } else { + account = null; + auth = null; + } + String modifiedUri = getReplacedUri(uri, account != null ? account.api_url_format : null); + if (mThumbor != null) { + modifiedUri = mThumbor.buildImage(modifiedUri).filter(ThumborUrlBuilder.quality(85)).toUrl(); + } + final HeaderMap additionalHeaders = new HeaderMap(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + additionalHeaders.addHeader("Accept", "image/webp, */*"); + } + final HttpResponse resp = getRedirectedHttpResponse(mClient, modifiedUri, uriString, auth, additionalHeaders); + return new ContentLengthInputStream(resp.asStream(), (int) resp.getContentLength()); + } - private boolean isTwitterProfileImage(final String uriString) { - if (TextUtils.isEmpty(uriString)) return false; - return PATTERN_TWITTER_PROFILE_IMAGES.matcher(uriString).matches(); - } + private boolean isTwitterAuthRequired(final Uri uri) { + if (uri == null) return false; + return "ton.twitter.com".equalsIgnoreCase(uri.getHost()); + } - private boolean isTwitterUri(final Uri uri) { - if (uri == null) return false; - return "ton.twitter.com".equalsIgnoreCase(uri.getHost()); - } + private boolean isTwitterProfileImage(final String uriString) { + if (TextUtils.isEmpty(uriString)) return false; + return PATTERN_TWITTER_PROFILE_IMAGES.matcher(uriString).matches(); + } + + private boolean isTwitterUri(final Uri uri) { + if (uri == null) return false; + return "ton.twitter.com".equalsIgnoreCase(uri.getHost()); + } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/MediaViewPager.java b/twidere/src/main/java/org/mariotaku/twidere/view/MediaViewPager.java index 08b3ec4a4..dee3d497d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/MediaViewPager.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/MediaViewPager.java @@ -25,22 +25,18 @@ import android.util.AttributeSet; import android.view.View; public class MediaViewPager extends ViewPager { - - - public MediaViewPager(Context context) { - this(context, null); - } - public MediaViewPager(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { - if (v instanceof TouchImageView) { - return v.canScrollHorizontally(dx); - } else { - return super.canScroll(v, checkV, dx, x, y); - } - } + + public MediaViewPager(Context context) { + this(context, null); + } + + public MediaViewPager(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { + return super.canScroll(v, checkV, dx, x, y); + } } \ No newline at end of file diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/TouchImageView.java b/twidere/src/main/java/org/mariotaku/twidere/view/TouchImageView.java deleted file mode 100644 index 96f80bfe6..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/view/TouchImageView.java +++ /dev/null @@ -1,533 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2015 Mariotaku Lee - * - * 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 3 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, see . - */ - -package org.mariotaku.twidere.view; - -import android.annotation.TargetApi; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Matrix; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.support.v4.view.ViewCompat; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.ScaleGestureDetector; -import android.view.animation.Animation; -import android.view.animation.LinearInterpolator; -import android.view.animation.Transformation; -import android.widget.ImageView; - -import com.diegocarloslima.byakugallery.lib.FlingScroller; -import com.diegocarloslima.byakugallery.lib.TouchGestureDetector; - -public class TouchImageView extends ImageView { - - private static final int DOUBLE_TAP_ANIMATION_DURATION = 300; - private static final int SCALE_END_ANIMATION_DURATION = 200; - - private Drawable mDrawable; - private int mDrawableIntrinsicWidth; - private int mDrawableIntrinsicHeight; - - private final TouchGestureDetector mTouchGestureDetector; - - private final Matrix mMatrix = new Matrix(); - private final float[] mMatrixValues = new float[9]; - - private float mScale; - private float mMaxScale = 1; - private float mTranslationX; - private float mTranslationY; - - private Float mLastFocusX; - private Float mLastFocusY; - - private final FlingScroller mFlingScroller = new FlingScroller(); - private boolean mIsAnimatingBack; - private ZoomListener mZoomListener; - - public TouchImageView(Context context) { - this(context, null); - } - - public TouchImageView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public TouchImageView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - final TouchGestureDetector.OnTouchGestureListener listener = new TouchGestureDetector.OnTouchGestureListener() { - - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - return performClick(); - } - - @Override - public void onLongPress(MotionEvent e) { - performLongClick(); - } - - @Override - public boolean onDoubleTap(MotionEvent e) { - loadMatrixValues(); - - final float minScale = getMinScale(); - // If we have already zoomed in, we should return to our initial scale value (minScale). Otherwise, scale to full size - final boolean shouldZoomOut = mScale > minScale; - final float targetScale = shouldZoomOut ? minScale : mMaxScale; - - // First, we try to keep the focused point in the same position when the animation ends - final float desiredTranslationX = e.getX() - (e.getX() - mTranslationX) * (targetScale / mScale); - final float desiredTranslationY = e.getY() - (e.getY() - mTranslationY) * (targetScale / mScale); - - // Here, we apply a correction to avoid unwanted blank spaces - final float targetTranslationX = desiredTranslationX + computeTranslation(getMeasuredWidth(), mDrawableIntrinsicWidth * targetScale, desiredTranslationX, 0); - final float targetTranslationY = desiredTranslationY + computeTranslation(getMeasuredHeight(), mDrawableIntrinsicHeight * targetScale, desiredTranslationY, 0); - - clearAnimation(); - final Animation animation = new TouchAnimation(targetScale, targetTranslationX, targetTranslationY); - animation.setDuration(DOUBLE_TAP_ANIMATION_DURATION); - startAnimation(animation); - - if (mZoomListener != null) { - if (shouldZoomOut) { - mZoomListener.onZoomOut(); - } else { - mZoomListener.onZoomIn(); - } - } - return true; - } - - @Override - public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { - // Sometimes, this method is called just after an onScaleEnd event. In this case, we want to wait until we animate back our image - if (mIsAnimatingBack) { - return false; - } - - loadMatrixValues(); - - final float currentDrawableWidth = mDrawableIntrinsicWidth * mScale; - final float currentDrawableHeight = mDrawableIntrinsicHeight * mScale; - - final float dx = computeTranslation(getMeasuredWidth(), currentDrawableWidth, mTranslationX, -distanceX); - final float dy = computeTranslation(getMeasuredHeight(), currentDrawableHeight, mTranslationY, -distanceY); - mMatrix.postTranslate(dx, dy); - - clearAnimation(); - ViewCompat.postInvalidateOnAnimation(TouchImageView.this); - - return true; - } - - @Override - public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - // Sometimes, this method is called just after an onScaleEnd event. In this case, we want to wait until we animate back our image - if (mIsAnimatingBack) { - return false; - } - - loadMatrixValues(); - - final float horizontalSideFreeSpace = (getMeasuredWidth() - mDrawableIntrinsicWidth * mScale) / 2F; - final float minTranslationX = horizontalSideFreeSpace > 0 ? horizontalSideFreeSpace : getMeasuredWidth() - mDrawableIntrinsicWidth * mScale; - final float maxTranslationX = horizontalSideFreeSpace > 0 ? horizontalSideFreeSpace : 0; - - final float verticalSideFreeSpace = (getMeasuredHeight() - mDrawableIntrinsicHeight * mScale) / 2F; - final float minTranslationY = verticalSideFreeSpace > 0 ? verticalSideFreeSpace : getMeasuredHeight() - mDrawableIntrinsicHeight * mScale; - final float maxTranslationY = verticalSideFreeSpace > 0 ? verticalSideFreeSpace : 0; - - // Using FlingScroller here. The results were better than the Scroller class - // https://android.googlesource.com/platform/packages/apps/Gallery2/+/master/src/com/android/gallery3d/ui/FlingScroller.java - mFlingScroller.fling(Math.round(mTranslationX), Math.round(mTranslationY), Math.round(velocityX), Math.round(velocityY), Math.round(minTranslationX), Math.round(maxTranslationX), Math.round(minTranslationY), Math.round(maxTranslationY)); - - clearAnimation(); - final Animation animation = new FlingAnimation(); - animation.setDuration(mFlingScroller.getDuration()); - animation.setInterpolator(new LinearInterpolator()); - startAnimation(animation); - - return true; - } - - @Override - public boolean onScaleBegin(ScaleGestureDetector detector) { - mLastFocusX = null; - mLastFocusY = null; - - return true; - } - - @Override - public boolean onScale(ScaleGestureDetector detector) { - loadMatrixValues(); - - float currentDrawableWidth = mDrawableIntrinsicWidth * mScale; - float currentDrawableHeight = mDrawableIntrinsicHeight * mScale; - - final float focusX = computeFocus(getMeasuredWidth(), currentDrawableWidth, mTranslationX, detector.getFocusX()); - final float focusY = computeFocus(getMeasuredHeight(), currentDrawableHeight, mTranslationY, detector.getFocusY()); - - // Here, we provide the ability to scroll while scaling - if (mLastFocusX != null && mLastFocusY != null) { - final float dx = computeScaleTranslation(getMeasuredWidth(), currentDrawableWidth, mTranslationX, focusX - mLastFocusX); - final float dy = computeScaleTranslation(getMeasuredHeight(), currentDrawableHeight, mTranslationY, focusY - mLastFocusY); - - if (dx != 0 || dy != 0) { - mMatrix.postTranslate(dx, dy); - } - } - - final float scale = computeScale(getMinScale(), mMaxScale, mScale, detector.getScaleFactor()); - mMatrix.postScale(scale, scale, focusX, focusY); - - mLastFocusX = focusX; - mLastFocusY = focusY; - - clearAnimation(); - ViewCompat.postInvalidateOnAnimation(TouchImageView.this); - - return true; - } - - @Override - public void onScaleEnd(ScaleGestureDetector detector) { - loadMatrixValues(); - - final float currentDrawableWidth = mDrawableIntrinsicWidth * mScale; - final float currentDrawableHeight = mDrawableIntrinsicHeight * mScale; - - final float dx = computeTranslation(getMeasuredWidth(), currentDrawableWidth, mTranslationX, 0); - final float dy = computeTranslation(getMeasuredHeight(), currentDrawableHeight, mTranslationY, 0); - - if (Math.abs(dx) < 1 && Math.abs(dy) < 1) { - return; - } - - final float targetTranslationX = mTranslationX + dx; - final float targetTranslationY = mTranslationY + dy; - - clearAnimation(); - final Animation animation = new TouchAnimation(mScale, targetTranslationX, targetTranslationY); - animation.setDuration(SCALE_END_ANIMATION_DURATION); - startAnimation(animation); - - mIsAnimatingBack = true; - } - }; - - mTouchGestureDetector = new TouchGestureDetector(context, listener); - - super.setScaleType(ScaleType.MATRIX); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - final int oldMeasuredWidth = getMeasuredWidth(); - final int oldMeasuredHeight = getMeasuredHeight(); - - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - if (oldMeasuredWidth != getMeasuredWidth() || oldMeasuredHeight != getMeasuredHeight()) { - resetToInitialState(); - } - } - - @Override - protected void onDraw(Canvas canvas) { - super.setImageMatrix(mMatrix); - super.onDraw(canvas); - } - - @Override - public void setImageMatrix(Matrix matrix) { - if (matrix == null) { - matrix = new Matrix(); - } - - if (!mMatrix.equals(matrix)) { - mMatrix.set(matrix); - invalidate(); - } - } - - @Override - public Matrix getImageMatrix() { - return mMatrix; - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - mTouchGestureDetector.onTouchEvent(event); - return true; - } - - @Override - public void clearAnimation() { - super.clearAnimation(); - mIsAnimatingBack = false; - } - - @Override - public void setImageDrawable(Drawable drawable) { - super.setImageDrawable(drawable); - if (mDrawable != drawable) { - mDrawable = drawable; - if (drawable != null) { - mDrawableIntrinsicWidth = drawable.getIntrinsicWidth(); - mDrawableIntrinsicHeight = drawable.getIntrinsicHeight(); - resetToInitialState(); - } else { - mDrawableIntrinsicWidth = 0; - mDrawableIntrinsicHeight = 0; - } - } - } - - @Override - public void setScaleType(ScaleType scaleType) { - if (scaleType != ScaleType.MATRIX) { - throw new IllegalArgumentException("Unsupported scaleType. Only ScaleType.MATRIX is allowed."); - } - super.setScaleType(scaleType); - } - - @Override - public boolean canScrollHorizontally(int direction) { - loadMatrixValues(); - return canScroll(getMeasuredWidth(), mDrawableIntrinsicWidth * mScale, mTranslationX, direction); - } - - @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) - @Override - public boolean canScrollVertically(int direction) { - loadMatrixValues(); - return canScroll(getMeasuredHeight(), mDrawableIntrinsicHeight * mScale, mTranslationY, direction); - } - - public void setMaxScale(float maxScale) { - mMaxScale = maxScale; - } - - public void resetScale() { - loadMatrixValues(); - - // If we have already zoomed in, we should return to our initial scale value (minScale). Otherwise, scale to full size - final float targetScale = getMinScale(); - - // First, we try to keep the focused point in the same position when the animation ends - final float desiredTranslationX = getWidth() / 2; - final float desiredTranslationY = getHeight() / 2; - - // Here, we apply a correction to avoid unwanted blank spaces - final float targetTranslationX = desiredTranslationX + computeTranslation(getMeasuredWidth(), mDrawableIntrinsicWidth * targetScale, desiredTranslationX, 0); - final float targetTranslationY = desiredTranslationY + computeTranslation(getMeasuredHeight(), mDrawableIntrinsicHeight * targetScale, desiredTranslationY, 0); - - clearAnimation(); - final Animation animation = new TouchAnimation(targetScale, targetTranslationX, targetTranslationY); - animation.setDuration(0); - startAnimation(animation); - - } - - private void resetToInitialState() { - mMatrix.reset(); - final float minScale = getMinScale(); - mMatrix.postScale(minScale, minScale); - - final float[] values = new float[9]; - mMatrix.getValues(values); - - final float freeSpaceHorizontal = (getMeasuredWidth() - (mDrawableIntrinsicWidth * minScale)) / 2F; - final float freeSpaceVertical = (getMeasuredHeight() - (mDrawableIntrinsicHeight * minScale)) / 2F; - mMatrix.postTranslate(freeSpaceHorizontal, freeSpaceVertical); - - invalidate(); - } - - private void loadMatrixValues() { - mMatrix.getValues(mMatrixValues); - mScale = mMatrixValues[Matrix.MSCALE_X]; - mTranslationX = mMatrixValues[Matrix.MTRANS_X]; - mTranslationY = mMatrixValues[Matrix.MTRANS_Y]; - } - - private float getMinScale() { - float minScale = Math.min(getMeasuredWidth() / (float) mDrawableIntrinsicWidth, getMeasuredHeight() / (float) mDrawableIntrinsicHeight); - if (minScale > mMaxScale) { - minScale = mMaxScale; - } - return minScale; - } - - private static boolean canScroll(float viewSize, float drawableSize, float currentTranslation, int direction) { - if (direction > 0) { - return Math.round(currentTranslation) < 0; - } else if (direction < 0) { - return Math.round(currentTranslation) > viewSize - Math.round(drawableSize); - } - return false; - } - - // The translation values must be in [0, viewSize - drawableSize], except if we have free space. In that case we will translate to half of the free space - private static float computeTranslation(float viewSize, float drawableSize, float currentTranslation, float delta) { - final float sideFreeSpace = (viewSize - drawableSize) / 2F; - - if (sideFreeSpace > 0) { - return sideFreeSpace - currentTranslation; - } else if (currentTranslation + delta > 0) { - return -currentTranslation; - } else if (currentTranslation + delta < viewSize - drawableSize) { - return viewSize - drawableSize - currentTranslation; - } - - return delta; - } - - private static float computeScaleTranslation(float viewSize, float drawableSize, float currentTranslation, float delta) { - final float minTranslation = viewSize > drawableSize ? 0 : viewSize - drawableSize; - final float maxTranslation = viewSize > drawableSize ? viewSize - drawableSize : 0; - - if (currentTranslation < minTranslation && delta > 0) { - if (currentTranslation + delta > maxTranslation) { - return maxTranslation - currentTranslation; - } else { - return delta; - } - } else if (currentTranslation > maxTranslation && delta < 0) { - if (currentTranslation + delta < minTranslation) { - return minTranslation - currentTranslation; - } else { - return delta; - } - } else if (currentTranslation > minTranslation && currentTranslation < maxTranslation) { - if (currentTranslation + delta < minTranslation) { - return minTranslation - currentTranslation; - } else if (currentTranslation + delta > maxTranslation) { - return maxTranslation - currentTranslation; - } else { - return delta; - } - } - return 0; - } - - // If our focal point is outside the image, we will project it to our image bounds - private static float computeFocus(float viewSize, float drawableSize, float currentTranslation, float focusCoordinate) { - if (currentTranslation > 0 && focusCoordinate < currentTranslation) { - return currentTranslation; - } else if (currentTranslation < viewSize - drawableSize && focusCoordinate > currentTranslation + drawableSize) { - return drawableSize + currentTranslation; - } - - return focusCoordinate; - } - - // The scale values must be in [minScale, maxScale] - private static float computeScale(float minScale, float maxScale, float currentScale, float delta) { - if (currentScale * delta < minScale) { - return minScale / currentScale; - } else if (currentScale * delta > maxScale) { - return maxScale / currentScale; - } - - return delta; - } - - private class FlingAnimation extends Animation { - - @Override - protected void applyTransformation(float interpolatedTime, Transformation t) { - mFlingScroller.computeScrollOffset(interpolatedTime); - - loadMatrixValues(); - - final float dx = mFlingScroller.getCurrX() - mTranslationX; - final float dy = mFlingScroller.getCurrY() - mTranslationY; - mMatrix.postTranslate(dx, dy); - - ViewCompat.postInvalidateOnAnimation(TouchImageView.this); - } - } - - private class TouchAnimation extends Animation { - - private float initialScale; - private float initialTranslationX; - private float initialTranslationY; - - private float targetScale; - private float targetTranslationX; - private float targetTranslationY; - - TouchAnimation(float targetScale, float targetTranslationX, float targetTranslationY) { - loadMatrixValues(); - - this.initialScale = mScale; - this.initialTranslationX = mTranslationX; - this.initialTranslationY = mTranslationY; - - this.targetScale = targetScale; - this.targetTranslationX = targetTranslationX; - this.targetTranslationY = targetTranslationY; - } - - @Override - protected void applyTransformation(float interpolatedTime, Transformation t) { - loadMatrixValues(); - - if (interpolatedTime >= 1) { - mMatrix.getValues(mMatrixValues); - mMatrixValues[Matrix.MSCALE_X] = this.targetScale; - mMatrixValues[Matrix.MSCALE_Y] = this.targetScale; - mMatrixValues[Matrix.MTRANS_X] = this.targetTranslationX; - mMatrixValues[Matrix.MTRANS_Y] = this.targetTranslationY; - mMatrix.setValues(mMatrixValues); - - } else { - final float scaleFactor = (this.initialScale + interpolatedTime * (this.targetScale - this.initialScale)) / mScale; - mMatrix.postScale(scaleFactor, scaleFactor); - - mMatrix.getValues(mMatrixValues); - final float currentTranslationX = mMatrixValues[Matrix.MTRANS_X]; - final float currentTranslationY = mMatrixValues[Matrix.MTRANS_Y]; - - final float dx = this.initialTranslationX + interpolatedTime * (this.targetTranslationX - this.initialTranslationX) - currentTranslationX; - final float dy = this.initialTranslationY + interpolatedTime * (this.targetTranslationY - this.initialTranslationY) - currentTranslationY; - mMatrix.postTranslate(dx, dy); - } - - ViewCompat.postInvalidateOnAnimation(TouchImageView.this); - } - } - - public void setZoomListener(ZoomListener listener) { - mZoomListener = listener; - } - - public static interface ZoomListener { - void onZoomOut(); - - void onZoomIn(); - } -} \ No newline at end of file diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java b/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java index fb2965c61..ce9639927 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java @@ -2,7 +2,6 @@ package org.mariotaku.twidere.view.holder; import android.content.Context; import android.database.Cursor; -import android.graphics.PorterDuff.Mode; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.CardView; @@ -35,6 +34,7 @@ import org.mariotaku.twidere.util.UserColorNameUtils; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils.OnMediaClickListener; import org.mariotaku.twidere.view.CardMediaContainer; +import org.mariotaku.twidere.view.ForegroundColorView; import org.mariotaku.twidere.view.ShapedImageView; import org.mariotaku.twidere.view.ShortTimeView; import org.mariotaku.twidere.view.iface.IColorLabelView; @@ -62,12 +62,16 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan private final ImageView profileTypeView; private final ImageView extraTypeView; private final TextView textView; + private final TextView quoteTextView; private final TextView nameView, screenNameView; + private final TextView quotedNameView, quotedScreenNameView; private final TextView replyRetweetView; private final ShortTimeView timeView; - private final CardMediaContainer mediaPreviewContainer; + private final CardMediaContainer mediaPreview; private final TextView replyCountView, retweetCountView, favoriteCountView; + private final View quotedNameContainer; private final IColorLabelView itemContent; + private final ForegroundColorView quoteIndicator; private StatusClickListener statusClickListener; @@ -79,13 +83,19 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan profileTypeView = (ImageView) itemView.findViewById(R.id.profile_type); extraTypeView = (ImageView) itemView.findViewById(R.id.extra_type); textView = (TextView) itemView.findViewById(R.id.text); + quoteTextView = (TextView) itemView.findViewById(R.id.quote_text); nameView = (TextView) itemView.findViewById(R.id.name); screenNameView = (TextView) itemView.findViewById(R.id.screen_name); + quotedNameView = (TextView) itemView.findViewById(R.id.quoted_name); + quotedScreenNameView = (TextView) itemView.findViewById(R.id.quoted_screen_name); replyRetweetIcon = (ImageView) itemView.findViewById(R.id.reply_retweet_icon); replyRetweetView = (TextView) itemView.findViewById(R.id.reply_retweet_status); timeView = (ShortTimeView) itemView.findViewById(R.id.time); - mediaPreviewContainer = (CardMediaContainer) itemView.findViewById(R.id.media_preview_container); + mediaPreview = (CardMediaContainer) itemView.findViewById(R.id.media_preview); + quotedNameContainer = itemView.findViewById(R.id.quoted_name_container); + + quoteIndicator = (ForegroundColorView) itemView.findViewById(R.id.quote_indicator); replyCountView = (TextView) itemView.findViewById(R.id.reply_count); retweetCountView = (TextView) itemView.findViewById(R.id.retweet_count); @@ -100,7 +110,7 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan screenNameView.setText("@" + TWIDERE_PREVIEW_SCREEN_NAME); textView.setText(toPlainText(TWIDERE_PREVIEW_TEXT_HTML)); timeView.setTime(System.currentTimeMillis()); - mediaPreviewContainer.displayMedia(R.drawable.nyan_stars_background); + mediaPreview.displayMedia(R.drawable.nyan_stars_background); } public void displayStatus(final ParcelableStatus status, final boolean displayInReplyTo) { @@ -109,42 +119,35 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan public void displayStatus(@NonNull final ParcelableStatus status, @Nullable final TranslationResult translation, final boolean displayInReplyTo, final boolean shouldDisplayExtraType) { - final Context context = adapter.getContext(); final MediaLoaderWrapper loader = adapter.getImageLoader(); - final ImageLoadingHandler handler = adapter.getImageLoadingHandler(); final AsyncTwitterWrapper twitter = adapter.getTwitterWrapper(); final TwidereLinkify linkify = adapter.getTwidereLinkify(); - final boolean displayProfileImage = adapter.isProfileImageEnabled(); - final boolean displayMediaPreview = adapter.isMediaPreviewEnabled(); - final boolean displayAccountsColor = adapter.shouldShowAccountsColor(); + final Context context = adapter.getContext(); final boolean nameFirst = adapter.isNameFirst(); - final int profileImageStyle = adapter.getProfileImageStyle(); - final int mediaPreviewStyle = adapter.getMediaPreviewStyle(); - final int linkHighlightingStyle = adapter.getLinkHighlightingStyle(); - final ParcelableMedia[] media = status.media; - replyRetweetIcon.setColorFilter(replyRetweetView.getCurrentTextColor(), Mode.SRC_ATOP); + final long reply_count = status.reply_count; + final long retweet_count; + final long favorite_count; + if (status.retweet_id > 0) { - replyRetweetView.setVisibility(View.VISIBLE); - replyRetweetIcon.setVisibility(View.VISIBLE); final String retweetedBy = UserColorNameUtils.getDisplayName(context, status.retweeted_by_id, status.retweeted_by_name, status.retweeted_by_screen_name, nameFirst); replyRetweetView.setText(context.getString(R.string.name_retweeted, retweetedBy)); replyRetweetIcon.setImageResource(R.drawable.ic_activity_action_retweet); - } else if (status.in_reply_to_status_id > 0 && status.in_reply_to_user_id > 0 && displayInReplyTo) { replyRetweetView.setVisibility(View.VISIBLE); replyRetweetIcon.setVisibility(View.VISIBLE); + } else if (status.in_reply_to_status_id > 0 && status.in_reply_to_user_id > 0 && displayInReplyTo) { final String inReplyTo = UserColorNameUtils.getDisplayName(context, status.in_reply_to_user_id, status.in_reply_to_name, status.in_reply_to_screen_name, nameFirst); replyRetweetView.setText(context.getString(R.string.in_reply_to_name, inReplyTo)); replyRetweetIcon.setImageResource(R.drawable.ic_activity_action_reply); + replyRetweetView.setVisibility(View.VISIBLE); + replyRetweetIcon.setVisibility(View.VISIBLE); } else { replyRetweetView.setVisibility(View.GONE); replyRetweetIcon.setVisibility(View.GONE); - replyRetweetView.setText(null); } - final int typeIconRes = getUserTypeIconRes(status.user_is_verified, status.user_is_protected); if (typeIconRes != 0) { profileTypeView.setImageResource(typeIconRes); @@ -154,64 +157,102 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan profileTypeView.setVisibility(View.GONE); } - nameView.setText(status.user_name); - screenNameView.setText("@" + status.user_screen_name); - timeView.setTime(status.timestamp); + if (status.is_quote) { + quotedNameView.setText(status.user_name); + quotedScreenNameView.setText("@" + status.user_screen_name); + timeView.setTime(status.quote_timestamp); + nameView.setText(status.quoted_by_user_name); + screenNameView.setText("@" + status.quoted_by_user_screen_name); - final int userColor = UserColorNameUtils.getUserColor(context, status.user_id); - itemContent.drawStart(userColor); + if (adapter.getLinkHighlightingStyle() == VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE) { + quoteTextView.setText(status.quote_text_unescaped); + } else { + quoteTextView.setText(Html.fromHtml(status.quote_text_html)); + linkify.applyAllLinks(quoteTextView, status.account_id, getLayoutPosition(), + status.is_possibly_sensitive, adapter.getLinkHighlightingStyle()); + quoteTextView.setMovementMethod(null); + } - if (displayAccountsColor) { + quotedNameContainer.setVisibility(View.VISIBLE); + quoteTextView.setVisibility(View.VISIBLE); + quoteIndicator.setVisibility(View.VISIBLE); + + quoteIndicator.setColor(UserColorNameUtils.getUserColor(context, status.user_id)); + + if (adapter.isProfileImageEnabled()) { + profileTypeView.setVisibility(View.VISIBLE); + profileImageView.setVisibility(View.VISIBLE); + loader.displayProfileImage(profileImageView, status.quoted_by_user_profile_image); + } else { + profileTypeView.setVisibility(View.GONE); + profileImageView.setVisibility(View.GONE); + loader.cancelDisplayTask(profileImageView); + } + + final int userColor = UserColorNameUtils.getUserColor(context, status.quoted_by_user_id); + itemContent.drawStart(userColor); + } else { + nameView.setText(status.user_name); + screenNameView.setText("@" + status.user_screen_name); + timeView.setTime(status.timestamp); + + quotedNameContainer.setVisibility(View.GONE); + quoteTextView.setVisibility(View.GONE); + quoteIndicator.setVisibility(View.GONE); + + if (adapter.isProfileImageEnabled()) { + final String user_profile_image_url = status.user_profile_image_url; + profileTypeView.setVisibility(View.VISIBLE); + profileImageView.setVisibility(View.VISIBLE); + loader.displayProfileImage(profileImageView, user_profile_image_url); + } else { + profileTypeView.setVisibility(View.GONE); + profileImageView.setVisibility(View.GONE); + loader.cancelDisplayTask(profileImageView); + } + final int userColor = UserColorNameUtils.getUserColor(context, status.user_id); + itemContent.drawStart(userColor); + } + + + if (adapter.shouldShowAccountsColor()) { itemContent.drawEnd(Utils.getAccountColor(context, status.account_id)); } else { itemContent.drawEnd(); } - profileImageView.setStyle(profileImageStyle); - if (displayProfileImage) { - profileTypeView.setVisibility(View.VISIBLE); - profileImageView.setVisibility(View.VISIBLE); - loader.displayProfileImage(profileImageView, status.user_profile_image_url); - } else { - profileTypeView.setVisibility(View.GONE); - profileImageView.setVisibility(View.GONE); - loader.cancelDisplayTask(profileImageView); - } - if (displayMediaPreview) { - mediaPreviewContainer.setStyle(mediaPreviewStyle); - if (media != null && media.length > 0) { - mediaPreviewContainer.setVisibility(View.VISIBLE); - } else { - mediaPreviewContainer.setVisibility(View.GONE); - } - mediaPreviewContainer.displayMedia(media, loader, status.account_id, this, handler); + if (adapter.isMediaPreviewEnabled()) { + mediaPreview.setStyle(adapter.getMediaPreviewStyle()); + mediaPreview.setVisibility(status.media != null && status.media.length > 0 ? View.VISIBLE : View.GONE); + mediaPreview.displayMedia(status.media, loader, status.account_id, this, + adapter.getImageLoadingHandler()); } else { - mediaPreviewContainer.setVisibility(View.GONE); + mediaPreview.setVisibility(View.GONE); } - if (translation != null) { - textView.setText(translation.getText()); - } else if (linkHighlightingStyle == VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE) { + if (adapter.getLinkHighlightingStyle() == VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE) { textView.setText(status.text_unescaped); } else { textView.setText(Html.fromHtml(status.text_html)); linkify.applyAllLinks(textView, status.account_id, getLayoutPosition(), - status.is_possibly_sensitive, linkHighlightingStyle); + status.is_possibly_sensitive, + adapter.getLinkHighlightingStyle()); + textView.setMovementMethod(null); } - if (status.reply_count > 0) { - replyCountView.setText(Utils.getLocalizedNumber(Locale.getDefault(), status.reply_count)); + if (reply_count > 0) { + replyCountView.setText(Utils.getLocalizedNumber(Locale.getDefault(), reply_count)); } else { replyCountView.setText(null); } - final long retweet_count; if (twitter.isDestroyingStatus(status.account_id, status.my_retweet_id)) { retweetCountView.setActivated(false); - retweet_count = Math.max(0, status.favorite_count - 1); + retweet_count = Math.max(0, status.retweet_count - 1); } else { final boolean creatingRetweet = twitter.isCreatingRetweet(status.account_id, status.id); - retweetCountView.setActivated(creatingRetweet || Utils.isMyRetweet(status)); + retweetCountView.setActivated(creatingRetweet || Utils.isMyRetweet(status.account_id, + status.retweeted_by_id, status.my_retweet_id)); retweet_count = status.retweet_count + (creatingRetweet ? 1 : 0); } if (retweet_count > 0) { @@ -219,9 +260,6 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan } else { retweetCountView.setText(null); } - retweetCountView.setEnabled(!status.user_is_protected); - - final long favorite_count; if (twitter.isDestroyingFavorite(status.account_id, status.id)) { favoriteCountView.setActivated(false); favorite_count = Math.max(0, status.favorite_count - 1); @@ -255,7 +293,6 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan final long favorite_count; final long account_id = cursor.getLong(indices.account_id); - final long timestamp = cursor.getLong(indices.status_timestamp); final long user_id = cursor.getLong(indices.user_id); final long status_id = cursor.getLong(indices.status_id); final long retweet_id = cursor.getLong(indices.retweet_id); @@ -264,15 +301,8 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan final long in_reply_to_status_id = cursor.getLong(indices.in_reply_to_status_id); final long in_reply_to_user_id = cursor.getLong(indices.in_reply_to_user_id); - final boolean user_is_protected = cursor.getInt(indices.is_protected) == 1; - final String user_name = cursor.getString(indices.user_name); final String user_screen_name = cursor.getString(indices.user_screen_name); - final String user_profile_image_url = cursor.getString(indices.user_profile_image_url); - final String retweeted_by_name = cursor.getString(indices.retweeted_by_user_name); - final String retweeted_by_screen_name = cursor.getString(indices.retweeted_by_user_screen_name); - final String in_reply_to_name = cursor.getString(indices.in_reply_to_user_name); - final String in_reply_to_screen_name = cursor.getString(indices.in_reply_to_user_screen_name); final String card_name = cursor.getString(indices.card_name); final String place_full_name = cursor.getString(indices.place_full_name); @@ -282,6 +312,8 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan cursor.getString(indices.location)); if (retweet_id > 0) { + final String retweeted_by_name = cursor.getString(indices.retweeted_by_user_name); + final String retweeted_by_screen_name = cursor.getString(indices.retweeted_by_user_screen_name); final String retweetedBy = UserColorNameUtils.getDisplayName(context, retweeted_by_id, retweeted_by_name, retweeted_by_screen_name, nameFirst); replyRetweetView.setText(context.getString(R.string.name_retweeted, retweetedBy)); @@ -289,6 +321,8 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan replyRetweetView.setVisibility(View.VISIBLE); replyRetweetIcon.setVisibility(View.VISIBLE); } else if (in_reply_to_status_id > 0 && in_reply_to_user_id > 0 && displayInReplyTo) { + final String in_reply_to_name = cursor.getString(indices.in_reply_to_user_name); + final String in_reply_to_screen_name = cursor.getString(indices.in_reply_to_user_screen_name); final String inReplyTo = UserColorNameUtils.getDisplayName(context, in_reply_to_user_id, in_reply_to_name, in_reply_to_screen_name, nameFirst); replyRetweetView.setText(context.getString(R.string.in_reply_to_name, inReplyTo)); @@ -300,8 +334,8 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan replyRetweetIcon.setVisibility(View.GONE); } - final int typeIconRes = getUserTypeIconRes(cursor.getInt(indices.is_verified) == 1, - user_is_protected); + final int typeIconRes = getUserTypeIconRes(cursor.getShort(indices.is_verified) == 1, + cursor.getShort(indices.is_protected) == 1); if (typeIconRes != 0) { profileTypeView.setImageResource(typeIconRes); profileTypeView.setVisibility(View.VISIBLE); @@ -310,12 +344,64 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan profileTypeView.setVisibility(View.GONE); } - nameView.setText(user_name); - screenNameView.setText("@" + user_screen_name); - timeView.setTime(timestamp); + if (cursor.getShort(indices.is_quote) == 1) { + quotedNameView.setText(user_name); + quotedScreenNameView.setText("@" + user_screen_name); + timeView.setTime(cursor.getLong(indices.quote_timestamp)); + nameView.setText(cursor.getString(indices.quoted_by_user_name)); + screenNameView.setText("@" + cursor.getString(indices.quoted_by_user_screen_name)); + + if (adapter.getLinkHighlightingStyle() == VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE) { + quoteTextView.setText(cursor.getString(indices.quote_text_unescaped)); + } else { + quoteTextView.setText(Html.fromHtml(cursor.getString(indices.quote_text_html))); + linkify.applyAllLinks(quoteTextView, account_id, getLayoutPosition(), + cursor.getShort(indices.is_possibly_sensitive) == 1, + adapter.getLinkHighlightingStyle()); + quoteTextView.setMovementMethod(null); + } + + quotedNameContainer.setVisibility(View.VISIBLE); + quoteTextView.setVisibility(View.VISIBLE); + quoteIndicator.setVisibility(View.VISIBLE); + + quoteIndicator.setColor(UserColorNameUtils.getUserColor(context, user_id)); + + if (adapter.isProfileImageEnabled()) { + profileTypeView.setVisibility(View.VISIBLE); + profileImageView.setVisibility(View.VISIBLE); + loader.displayProfileImage(profileImageView, cursor.getString(indices.quoted_by_user_profile_image)); + } else { + profileTypeView.setVisibility(View.GONE); + profileImageView.setVisibility(View.GONE); + loader.cancelDisplayTask(profileImageView); + } + + final int userColor = UserColorNameUtils.getUserColor(context, cursor.getLong(indices.quoted_by_user_id)); + itemContent.drawStart(userColor); + } else { + nameView.setText(user_name); + screenNameView.setText("@" + user_screen_name); + timeView.setTime(cursor.getLong(indices.status_timestamp)); + + quotedNameContainer.setVisibility(View.GONE); + quoteTextView.setVisibility(View.GONE); + quoteIndicator.setVisibility(View.GONE); + + if (adapter.isProfileImageEnabled()) { + final String user_profile_image_url = cursor.getString(indices.user_profile_image_url); + profileTypeView.setVisibility(View.VISIBLE); + profileImageView.setVisibility(View.VISIBLE); + loader.displayProfileImage(profileImageView, user_profile_image_url); + } else { + profileTypeView.setVisibility(View.GONE); + profileImageView.setVisibility(View.GONE); + loader.cancelDisplayTask(profileImageView); + } + final int userColor = UserColorNameUtils.getUserColor(context, user_id); + itemContent.drawStart(userColor); + } - final int userColor = UserColorNameUtils.getUserColor(context, user_id); - itemContent.drawStart(userColor); if (adapter.shouldShowAccountsColor()) { itemContent.drawEnd(Utils.getAccountColor(context, account_id)); @@ -323,25 +409,14 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan itemContent.drawEnd(); } - profileImageView.setStyle(adapter.getProfileImageStyle()); - - if (adapter.isProfileImageEnabled()) { - profileTypeView.setVisibility(View.VISIBLE); - profileImageView.setVisibility(View.VISIBLE); - loader.displayProfileImage(profileImageView, user_profile_image_url); - } else { - profileTypeView.setVisibility(View.GONE); - profileImageView.setVisibility(View.GONE); - loader.cancelDisplayTask(profileImageView); - } if (adapter.isMediaPreviewEnabled()) { - mediaPreviewContainer.setStyle(adapter.getMediaPreviewStyle()); - mediaPreviewContainer.setVisibility(media != null && media.length > 0 ? View.VISIBLE : View.GONE); - mediaPreviewContainer.displayMedia(media, loader, account_id, this, + mediaPreview.setStyle(adapter.getMediaPreviewStyle()); + mediaPreview.setVisibility(media != null && media.length > 0 ? View.VISIBLE : View.GONE); + mediaPreview.displayMedia(media, loader, account_id, this, adapter.getImageLoadingHandler()); } else { - mediaPreviewContainer.setVisibility(View.GONE); + mediaPreview.setVisibility(View.GONE); } if (adapter.getLinkHighlightingStyle() == VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE) { textView.setText(cursor.getString(indices.text_unescaped)); @@ -350,6 +425,7 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan linkify.applyAllLinks(textView, account_id, getLayoutPosition(), cursor.getShort(indices.is_possibly_sensitive) == 1, adapter.getLinkHighlightingStyle()); + textView.setMovementMethod(null); } if (reply_count > 0) { @@ -372,15 +448,12 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan } else { retweetCountView.setText(null); } - retweetCountView.setEnabled(!user_is_protected); - - favoriteCountView.setActivated(cursor.getInt(indices.is_favorite) == 1); if (twitter.isDestroyingFavorite(account_id, status_id)) { favoriteCountView.setActivated(false); favorite_count = Math.max(0, cursor.getLong(indices.favorite_count) - 1); } else { final boolean creatingFavorite = twitter.isCreatingFavorite(account_id, status_id); - favoriteCountView.setActivated(creatingFavorite || cursor.getInt(indices.is_favorite) == 1); + favoriteCountView.setActivated(creatingFavorite || cursor.getShort(indices.is_favorite) == 1); favorite_count = cursor.getLong(indices.favorite_count) + (creatingFavorite ? 1 : 0); } if (favorite_count > 0) { @@ -454,8 +527,11 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan public void setTextSize(final float textSize) { nameView.setTextSize(textSize); + quotedNameView.setTextSize(textSize); textView.setTextSize(textSize); + quoteTextView.setTextSize(textSize); screenNameView.setTextSize(textSize * 0.85f); + quotedScreenNameView.setTextSize(textSize * 0.85f); timeView.setTextSize(textSize * 0.85f); replyRetweetView.setTextSize(textSize * 0.75f); replyCountView.setTextSize(textSize); @@ -465,7 +541,8 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan public void setupViewOptions() { setTextSize(adapter.getTextSize()); - mediaPreviewContainer.setStyle(adapter.getMediaPreviewStyle()); + mediaPreview.setStyle(adapter.getMediaPreviewStyle()); + profileImageView.setStyle(adapter.getProfileImageStyle()); } private void displayExtraTypeIcon(String cardName, ParcelableMedia[] media, ParcelableLocation location, String placeFullName) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/iface/IForegroundView.java b/twidere/src/main/java/org/mariotaku/twidere/view/iface/IForegroundView.java index 420179474..c22abddcb 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/iface/IForegroundView.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/iface/IForegroundView.java @@ -96,32 +96,35 @@ public interface IForegroundView { } public void dispatchOnDraw(final Canvas canvas) { - if (mForeground != null) { - final Drawable foreground = mForeground; + draw(canvas); + } - if (mForegroundBoundsChanged) { - mForegroundBoundsChanged = false; - final Rect selfBounds = mSelfBounds; - final Rect overlayBounds = mOverlayBounds; + public void draw(Canvas canvas) { + final Drawable foreground = mForeground; + if (foreground == null) return; - final int w = mView.getRight() - mView.getLeft(); - final int h = mView.getBottom() - mView.getTop(); + if (mForegroundBoundsChanged) { + mForegroundBoundsChanged = false; + final Rect selfBounds = mSelfBounds; + final Rect overlayBounds = mOverlayBounds; - if (mForegroundInPadding) { - selfBounds.set(0, 0, w, h); - } else { - selfBounds.set(mView.getPaddingLeft(), mView.getPaddingTop(), w - mView.getPaddingRight(), h - - mView.getPaddingBottom()); - } + final int w = mView.getRight() - mView.getLeft(); + final int h = mView.getBottom() - mView.getTop(); - final int layoutDirection = ViewCompat.getLayoutDirection(mView); - GravityCompat.apply(mForegroundGravity, foreground.getIntrinsicWidth(), - foreground.getIntrinsicHeight(), selfBounds, overlayBounds, layoutDirection); - foreground.setBounds(overlayBounds); + if (mForegroundInPadding) { + selfBounds.set(0, 0, w, h); + } else { + selfBounds.set(mView.getPaddingLeft(), mView.getPaddingTop(), w - mView.getPaddingRight(), h + - mView.getPaddingBottom()); } - foreground.draw(canvas); + final int layoutDirection = ViewCompat.getLayoutDirection(mView); + GravityCompat.apply(mForegroundGravity, foreground.getIntrinsicWidth(), + foreground.getIntrinsicHeight(), selfBounds, overlayBounds, layoutDirection); + foreground.setBounds(overlayBounds); } + + foreground.draw(canvas); } public void dispatchOnLayout(final boolean changed, final int left, final int top, final int right, @@ -133,35 +136,6 @@ public interface IForegroundView { mForegroundBoundsChanged = true; } - public void draw(final Canvas canvas) { - if (mForeground != null) { - final Drawable foreground = mForeground; - - if (mForegroundBoundsChanged) { - mForegroundBoundsChanged = false; - final Rect selfBounds = mSelfBounds; - final Rect overlayBounds = mOverlayBounds; - - final int w = mView.getRight() - mView.getLeft(); - final int h = mView.getBottom() - mView.getTop(); - - if (mForegroundInPadding) { - selfBounds.set(0, 0, w, h); - } else { - selfBounds.set(mView.getPaddingLeft(), mView.getPaddingTop(), w - mView.getPaddingRight(), h - - mView.getPaddingBottom()); - } - - final int layoutDirection = ViewCompat.getLayoutDirection(mView); - GravityCompat.apply(mForegroundGravity, foreground.getIntrinsicWidth(), - foreground.getIntrinsicHeight(), selfBounds, overlayBounds, layoutDirection); - foreground.setBounds(overlayBounds); - } - - foreground.draw(canvas); - } - } - public void drawableStateChanged() { if (mForeground != null && mForeground.isStateful()) { mForeground.setState(mView.getDrawableState()); diff --git a/twidere/src/main/res-localized/values-ar/strings.xml b/twidere/src/main/res-localized/values-ar/strings.xml index 8c1c88963..b7cee3f1e 100755 --- a/twidere/src/main/res-localized/values-ar/strings.xml +++ b/twidere/src/main/res-localized/values-ar/strings.xml @@ -263,8 +263,8 @@ %d العناصر المحددة عرض تعيين المضيف مخصص - المضيف - العنوان (يمكن أن يكون عنوان مضيف آخر) + المضيف + العنوان (يمكن أن يكون عنوان مضيف آخر) خادم DNS الاحداث المتعلقة بي أنشطة الأصدقاء diff --git a/twidere/src/main/res-localized/values-ca/strings.xml b/twidere/src/main/res-localized/values-ca/strings.xml index 4815d3f35..1b52265ed 100755 --- a/twidere/src/main/res-localized/values-ca/strings.xml +++ b/twidere/src/main/res-localized/values-ca/strings.xml @@ -271,8 +271,8 @@ Mostra Associacions de servidors personalitzades Associa servidors com el fitxer /etc/hosts sense requerir permisos addicionals. - Servidor - Adreça (pot ser una altra adreça de servidor) + Servidor + Adreça (pot ser una altra adreça de servidor) Afegeix una associació de servidor Petició DNS per TCP Utilitza el protocol TCP per fer peticions DNS per evitar l\'«Enverinament de la Memòria Cau de DNS». diff --git a/twidere/src/main/res-localized/values-de/strings.xml b/twidere/src/main/res-localized/values-de/strings.xml index 6ee7f12a2..55769b5c5 100755 --- a/twidere/src/main/res-localized/values-de/strings.xml +++ b/twidere/src/main/res-localized/values-de/strings.xml @@ -271,8 +271,8 @@ Ansicht Individuelles Host-Mapping Host-Mapping wie /ect/hosts, ohne zusätzlich erforderliche Rechte. - Host - Adresse(Kann auch eine andere Host-Adresse sein) + Host + Adresse(Kann auch eine andere Host-Adresse sein) Füge host mapping hinzu TCP DNS-Abfrage Benutze TCP für DNS Anfragen, um DNS Cache Poisoning zu vermeiden. diff --git a/twidere/src/main/res-localized/values-es/strings.xml b/twidere/src/main/res-localized/values-es/strings.xml index 73b5eff47..e6b3829b6 100755 --- a/twidere/src/main/res-localized/values-es/strings.xml +++ b/twidere/src/main/res-localized/values-es/strings.xml @@ -273,8 +273,8 @@ Vista Asignación de host personalizado Funciona como \"/etc/hosts\", pero no requiere permisos adicionales. - Host - Dirección (puede ser otra dirección de host) + Host + Dirección (puede ser otra dirección de host) Añadir asignación de host Consulta DNS usando TCP Utilizar el protocolo TCP para las peticiones DNS, puede evitar envenenamiento de caché DNS. diff --git a/twidere/src/main/res-localized/values-fi/strings.xml b/twidere/src/main/res-localized/values-fi/strings.xml index 0e23b6834..d970b2766 100755 --- a/twidere/src/main/res-localized/values-fi/strings.xml +++ b/twidere/src/main/res-localized/values-fi/strings.xml @@ -270,8 +270,8 @@ Näytä Mukautettu Host Mapping -määrittely Verkkonimet määritellään kuten /etc/hosts -tiedostossa, mutta ylimääräisiä oikeuksia ei tarvita. - Host - Osoite (voi olla toinen host-osoite) + Host + Osoite (voi olla toinen host-osoite) Lisää host mapping TCP DNS -kysely Käytä TCP-yhteyskäytäntöä DNS-pyyntöihin, jotta vältyttäisiin DNS Cache Poisoning -verkkohuijauksilta. diff --git a/twidere/src/main/res-localized/values-fr/strings.xml b/twidere/src/main/res-localized/values-fr/strings.xml index 3dfff2e1f..d40bba63a 100755 --- a/twidere/src/main/res-localized/values-fr/strings.xml +++ b/twidere/src/main/res-localized/values-fr/strings.xml @@ -271,8 +271,8 @@ Voir Mappage d\'hôte personnalisée Mappage d\'hôte comme /etc/hosts, mais n\'exige pas de permissions supplémentaires. - Hôte - Adresse (peut-être une autre adresse hôte) + Hôte + Adresse (peut-être une autre adresse hôte) Ajouter un hôte personnalisé Requête DNS TCP Utiliser le protocole TCP pour faire des requêtes DNS, cela peut éviter un empoisonnement du cache DNS. diff --git a/twidere/src/main/res-localized/values-hu/strings.xml b/twidere/src/main/res-localized/values-hu/strings.xml index d248b4b24..46a33ef4b 100755 --- a/twidere/src/main/res-localized/values-hu/strings.xml +++ b/twidere/src/main/res-localized/values-hu/strings.xml @@ -243,8 +243,8 @@ Nézet Egyedi host hozzárendelés Host hozzárendelés, mint a /etc/hosts, de nem kell hozzá plusz jog. - Host - Cím (Lehet egy másik host címe) + Host + Cím (Lehet egy másik host címe) Host hozzárendelés hozzáadása TCP DNS lekérdezés DNS lekérdezések TCP protokoll felett, ezzel elkerülhető a DNS gyorsítótár mérgezés. diff --git a/twidere/src/main/res-localized/values-in/strings.xml b/twidere/src/main/res-localized/values-in/strings.xml index 46d91adfe..2013c8001 100755 --- a/twidere/src/main/res-localized/values-in/strings.xml +++ b/twidere/src/main/res-localized/values-in/strings.xml @@ -273,8 +273,8 @@ Lihat Kustom host mapping Host pemetaan sperti /etc/hosts, tanpa butuh permisi tambahan. - Host - Alamat (dapat berupa alamat host lain) + Host + Alamat (dapat berupa alamat host lain) Tambah pemetaan host TCP DNS Query Gunakan protokol TCP untuk permintaan DNS dan menghindari DNS Cache Posioning. diff --git a/twidere/src/main/res-localized/values-it/strings.xml b/twidere/src/main/res-localized/values-it/strings.xml index c3b97812e..7ce1722e2 100755 --- a/twidere/src/main/res-localized/values-it/strings.xml +++ b/twidere/src/main/res-localized/values-it/strings.xml @@ -273,8 +273,8 @@ Visualizza Mappatura host personalizzata Mappa gli host come in /etc/hosts, ma non richiede permessi aggiuntivi. - Host - Indirizzo (può essere un altro indirizzo host) + Host + Indirizzo (può essere un altro indirizzo host) Aggiungi mappatura host TCP DNS Query Usa il protocollo TCP per effettuare le richieste DNS, utile per evitare il DNS Cache Poisoning. diff --git a/twidere/src/main/res-localized/values-ja/strings.xml b/twidere/src/main/res-localized/values-ja/strings.xml index e22aaef28..017d12644 100755 --- a/twidere/src/main/res-localized/values-ja/strings.xml +++ b/twidere/src/main/res-localized/values-ja/strings.xml @@ -264,8 +264,8 @@ 表示 ホストマッピングの設定 rootedでなくても/etc/hostsのようにホストマッピングができます。 - ホスト - アドレス (他のホストアドレスも可) + ホスト + アドレス (他のホストアドレスも可) ホストマッピングを追加 TCP DNS クエリー TCP プロトコルでDNS リクエストを通信し、DNSキャッシュ汚染を回避できます。 diff --git a/twidere/src/main/res-localized/values-ko/strings.xml b/twidere/src/main/res-localized/values-ko/strings.xml index dd6f7fbe5..d336fab47 100755 --- a/twidere/src/main/res-localized/values-ko/strings.xml +++ b/twidere/src/main/res-localized/values-ko/strings.xml @@ -270,8 +270,8 @@ 보기 커스텀 호스트 매핑 /etc/hosts 에 지정하는 것처럼 호스트를 매핑합니다. 다른 권한은 전혀 필요 없습니다. - 호스트 - 주소 (대체 호스트 주소가 될 수 있음) + 호스트 + 주소 (대체 호스트 주소가 될 수 있음) 호스트 매핑 추가 TCP DNS 쿼리 TCP 프로토콜로 DNS 요청을 통신하고 DNS 캐시의 오염을 막습니다. diff --git a/twidere/src/main/res-localized/values-ms/strings.xml b/twidere/src/main/res-localized/values-ms/strings.xml index 0df646d7e..c46ce647f 100755 --- a/twidere/src/main/res-localized/values-ms/strings.xml +++ b/twidere/src/main/res-localized/values-ms/strings.xml @@ -35,8 +35,8 @@ Tunjukkan masa mutlak Tunjukkan masa mutlak di tweet Sebutan pengguna - Hos - Alamat (Boleh jadi sebagai alamat host yang lain) + Hos + Alamat (Boleh jadi sebagai alamat host yang lain) Tambah pemetaan hos TCP DNS Query Tetapkan pelayan DNS untuk permintaan API. diff --git a/twidere/src/main/res-localized/values-nl/strings.xml b/twidere/src/main/res-localized/values-nl/strings.xml index 35c744e44..3ab8ef2dc 100755 --- a/twidere/src/main/res-localized/values-nl/strings.xml +++ b/twidere/src/main/res-localized/values-nl/strings.xml @@ -254,8 +254,8 @@ Bekijk Aangepaste host toewijzingen Host toewijzingen zoals /etc/hosts, maar heeft geen aanvullende rechten nodig. - Host - Adres (Kan een ander host adres zijn) + Host + Adres (Kan een ander host adres zijn) Voeg host toewijzing toe TCP DNS Query Gebruik TCP Protocol om DNS aanvragen te doen. Dit kan DNS Cache Poisoning vermijden. diff --git a/twidere/src/main/res-localized/values-pl/strings.xml b/twidere/src/main/res-localized/values-pl/strings.xml index 16afbd4e7..e35a74176 100755 --- a/twidere/src/main/res-localized/values-pl/strings.xml +++ b/twidere/src/main/res-localized/values-pl/strings.xml @@ -269,8 +269,8 @@ Wyświetl Ustawianie mapowania hosta Mapowanie hostów, nie wymaga żadnych dodatkowych uprawnień. - Host - Adres (może być inny adres hosta) + Host + Adres (może być inny adres hosta) Dodaj mapowanie hosta TCP DNS Query Używa protokołu TCP do zapytań DNS, może pozwolić uniknąć zatrucia DNS. diff --git a/twidere/src/main/res-localized/values-pt/strings.xml b/twidere/src/main/res-localized/values-pt/strings.xml index eab34f366..e08614ad8 100755 --- a/twidere/src/main/res-localized/values-pt/strings.xml +++ b/twidere/src/main/res-localized/values-pt/strings.xml @@ -256,8 +256,8 @@ Ver Mapeamento de hosts personalizado Mapear hosts tais como /etc/hosts, mas não requer outras permissões adicionais. - Host - Endereço (pode ser outro endereço de host) + Host + Endereço (pode ser outro endereço de host) Adicionar mapeamento de hosts Consultar TCP DNS Usar protocolo de TCP para solicitar DNS, isso pode evitar interrupções na Cache DNS. diff --git a/twidere/src/main/res-localized/values-ru/strings.xml b/twidere/src/main/res-localized/values-ru/strings.xml index 2d5de56c4..7be397f55 100755 --- a/twidere/src/main/res-localized/values-ru/strings.xml +++ b/twidere/src/main/res-localized/values-ru/strings.xml @@ -271,8 +271,8 @@ Вид Перенаправление узлов Перенаправление узлов, как с помощью /etc/hosts, но не требующее дополнительных разрешений. - Хост - Адрес (Может быть указан другой адрес) + Хост + Адрес (Может быть указан другой адрес) Добавить перенаправление узлов TCP DNS-запрос Использовать протокол TCP для запросов DNS в целях предотвращения DNS Cache Poisoning. diff --git a/twidere/src/main/res-localized/values-th/strings.xml b/twidere/src/main/res-localized/values-th/strings.xml index d6c110593..84a68c6a9 100755 --- a/twidere/src/main/res-localized/values-th/strings.xml +++ b/twidere/src/main/res-localized/values-th/strings.xml @@ -244,8 +244,8 @@ เปิดดู กำหนดที่อยู่ host เอง กำหนดที่อยู่ host เอง (เหมือนในไฟล์ /etc/hosts) ซึ่งการกระทำนี้ไม่ต้องการสิทธิ์ใดๆ เพิ่มเติม - โฮสต์ - ที่อยู่ (สามารถใช้ที่อยู่โฮสต์อื่นได้) + โฮสต์ + ที่อยู่ (สามารถใช้ที่อยู่โฮสต์อื่นได้) เพิ่มการกำหนดโฮสต์ การสืบค้น DNS ทาง TCP ใช้โปรโตคอล TCP เพื่อร้องขอ DNS ซึ่งสามารถหลบเลี่ยงการโจมตีแบบ DNS Cache Poisoning ได้ diff --git a/twidere/src/main/res-localized/values-tr/strings.xml b/twidere/src/main/res-localized/values-tr/strings.xml index 511a47fb7..51b65f561 100755 --- a/twidere/src/main/res-localized/values-tr/strings.xml +++ b/twidere/src/main/res-localized/values-tr/strings.xml @@ -273,8 +273,8 @@ Görüntüle Özel sunucu haritalama /etc/hosts şeklinde sunucu haritalama, ancak ekstra izin gerektirmez. - Sunucu - Adres (başka bir sunucu adresi olabilir) + Sunucu + Adres (başka bir sunucu adresi olabilir) Sunucu haritalama ekle TCP DNS sorgualama DNS Sunucusu diff --git a/twidere/src/main/res-localized/values-uk/strings.xml b/twidere/src/main/res-localized/values-uk/strings.xml index e242fce4a..48bfa0bd5 100755 --- a/twidere/src/main/res-localized/values-uk/strings.xml +++ b/twidere/src/main/res-localized/values-uk/strings.xml @@ -244,8 +244,8 @@ Вигляд Перенаправлення вузлів Перенаправлення вузлів, як за допомогою /etc/hosts, але не потребує додаткових дозволів. - Хост - Адреса (може бути інша адреса) + Хост + Адреса (може бути інша адреса) Додати перенаправлення вузлів TCP DNS запит Використовувати протокол TCP для DNS-запитів, це допоможе уникнути DNS Cache Poisoning. diff --git a/twidere/src/main/res-localized/values-zh-rCN/strings.xml b/twidere/src/main/res-localized/values-zh-rCN/strings.xml index b50ce69e0..5b6852a6b 100755 --- a/twidere/src/main/res-localized/values-zh-rCN/strings.xml +++ b/twidere/src/main/res-localized/values-zh-rCN/strings.xml @@ -273,8 +273,8 @@ 查看 自定义主机映射 如同/etc/hosts的主机映射,但不需要任何额外的权限 - 主机名 - 地址(可以是另一个主机名) + 主机名 + 地址(可以是另一个主机名) 添加主机名映射 TCP DNS查询方式 使用TCP协议进行DNS查询,这可以避免DNS缓存投毒 diff --git a/twidere/src/main/res-localized/values-zh/strings.xml b/twidere/src/main/res-localized/values-zh/strings.xml index 93f2c278a..abccf6136 100755 --- a/twidere/src/main/res-localized/values-zh/strings.xml +++ b/twidere/src/main/res-localized/values-zh/strings.xml @@ -273,8 +273,8 @@ 檢視 自訂主機對應 如同/etc/hosts的主機對應,但不需要任何額外的權限 - 主機名 - 地址(可以是另一個主機名) + 主機名 + 地址(可以是另一個主機名) 新增主機名對應 TCP DNS 查詢方式 使用 TCP 協議進行 DNS 查詢,這可以避免 DNS 快取污染 diff --git a/twidere/src/main/res/drawable-hdpi/ic_card_media_play.png b/twidere/src/main/res/drawable-hdpi/ic_card_media_play.png new file mode 100755 index 000000000..6120cdef0 Binary files /dev/null and b/twidere/src/main/res/drawable-hdpi/ic_card_media_play.png differ diff --git a/twidere/src/main/res/drawable-mdpi/ic_card_media_play.png b/twidere/src/main/res/drawable-mdpi/ic_card_media_play.png new file mode 100755 index 000000000..c86f3969d Binary files /dev/null and b/twidere/src/main/res/drawable-mdpi/ic_card_media_play.png differ diff --git a/twidere/src/main/res/drawable-xhdpi/ic_card_media_play.png b/twidere/src/main/res/drawable-xhdpi/ic_card_media_play.png new file mode 100755 index 000000000..4e2f66ea7 Binary files /dev/null and b/twidere/src/main/res/drawable-xhdpi/ic_card_media_play.png differ diff --git a/twidere/src/main/res/drawable-xxhdpi/ic_card_media_play.png b/twidere/src/main/res/drawable-xxhdpi/ic_card_media_play.png new file mode 100755 index 000000000..cd7858b94 Binary files /dev/null and b/twidere/src/main/res/drawable-xxhdpi/ic_card_media_play.png differ diff --git a/twidere/src/main/res/layout/card_item_status_common.xml b/twidere/src/main/res/layout/card_item_status_common.xml index c2f7da214..155e3dc31 100644 --- a/twidere/src/main/res/layout/card_item_status_common.xml +++ b/twidere/src/main/res/layout/card_item_status_common.xml @@ -2,7 +2,7 @@ - - - - - - - - \ No newline at end of file diff --git a/twidere/src/main/res/layout/grid_item_selector_account.xml b/twidere/src/main/res/layout/grid_item_selector_account.xml index e15d9e33e..4637b5880 100644 --- a/twidere/src/main/res/layout/grid_item_selector_account.xml +++ b/twidere/src/main/res/layout/grid_item_selector_account.xml @@ -20,7 +20,6 @@ - diff --git a/twidere/src/main/res/layout/layout_media_preview.xml b/twidere/src/main/res/layout/layout_media_preview.xml index 408bc9e29..f39f40323 100644 --- a/twidere/src/main/res/layout/layout_media_preview.xml +++ b/twidere/src/main/res/layout/layout_media_preview.xml @@ -19,16 +19,23 @@ --> - + android:layout_marginTop="@dimen/element_spacing_normal" + android:horizontalSpacing="@dimen/element_spacing_xsmall" + android:verticalSpacing="@dimen/element_spacing_xsmall"> + + + + + android:orientation="horizontal" + android:showDividers="middle"> - - View Custom host mapping Host mapping like /etc/hosts, but does not require any additional permissions. - Host - Address (Can be another host address) + Host + Address (Can be another host address) Add host mapping TCP DNS Query Use TCP Protocol to make DNS requests, which can avoid DNS Cache Poisoning. @@ -739,6 +739,9 @@ Shorten tweet Upload media Sync timeline + Thumbor integration + Server address + Security key \ No newline at end of file diff --git a/twidere/src/main/res/xml/preferences_network.xml b/twidere/src/main/res/xml/preferences_network.xml index 3d57ff5c5..e3aac8e50 100644 --- a/twidere/src/main/res/xml/preferences_network.xml +++ b/twidere/src/main/res/xml/preferences_network.xml @@ -64,6 +64,12 @@ + + \ No newline at end of file diff --git a/twidere/src/main/res/xml/preferences_thumbor.xml b/twidere/src/main/res/xml/preferences_thumbor.xml new file mode 100644 index 000000000..b578c79a8 --- /dev/null +++ b/twidere/src/main/res/xml/preferences_thumbor.xml @@ -0,0 +1,34 @@ + + + + + + + + + \ No newline at end of file