1
0
mirror of https://github.com/TwidereProject/Twidere-Android synced 2025-02-07 15:28:51 +01:00

improved combined emoji

improved user agent
improved dns
This commit is contained in:
Mariotaku Lee 2015-12-26 18:59:01 +08:00
parent 8c8bd746dc
commit ee48b63e63
9 changed files with 158 additions and 60 deletions

View File

@ -148,9 +148,9 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
}
@Override
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int position) {
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition) {
if (mActivityAdapterListener != null) {
mActivityAdapterListener.onMediaClick(holder, view, media, position);
mActivityAdapterListener.onMediaClick(holder, view, media, statusPosition);
}
}

View File

@ -163,9 +163,9 @@ public abstract class AbsStatusesAdapter<D> extends LoadMoreSupportAdapter<ViewH
}
@Override
public void onMediaClick(IStatusViewHolder holder, View view, final ParcelableMedia media, int position) {
public void onMediaClick(IStatusViewHolder holder, View view, final ParcelableMedia media, int statusPosition) {
if (mStatusAdapterListener == null) return;
mStatusAdapterListener.onMediaClick(holder, view, media, position);
mStatusAdapterListener.onMediaClick(holder, view, media, statusPosition);
}
@Override
@ -289,7 +289,7 @@ public abstract class AbsStatusesAdapter<D> extends LoadMoreSupportAdapter<ViewH
public interface StatusAdapterListener {
void onGapClick(GapViewHolder holder, int position);
void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int position);
void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition);
void onStatusActionClick(IStatusViewHolder holder, int id, int position);

View File

@ -325,9 +325,9 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentListRecyclerVi
}
@Override
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int position) {
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition) {
final AbsStatusesAdapter<Data> adapter = getAdapter();
final ParcelableStatus status = adapter.getStatus(position);
final ParcelableStatus status = adapter.getStatus(statusPosition);
if (status == null) return;
final Bundle options = Utils.createMediaViewerActivityOption(view);
Utils.openMedia(getActivity(), status, media, options);

View File

@ -80,6 +80,7 @@ import android.widget.TextView;
import com.squareup.otto.Subscribe;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
@ -369,8 +370,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
}
@Override
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int position) {
final ParcelableStatus status = mStatusAdapter.getStatus(position);
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition) {
final ParcelableStatus status = mStatusAdapter.getStatus(statusPosition);
if (status == null) return;
final Bundle options = Utils.createMediaViewerActivityOption(view);
Utils.openMedia(getActivity(), status, media, options);
@ -925,8 +926,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
private final ImageView profileTypeView;
private final TextView timeSourceView;
private final TextView retweetedByView;
private final View retweetsContainer, favoritesContainer;
private final TextView retweetsCountView, favoritesCountView;
private final View repliesContainer, retweetsContainer, favoritesContainer;
private final TextView repliesCountView, retweetsCountView, favoritesCountView;
private final View countsContainer;
private final TextView quoteOriginalLink;
@ -943,7 +944,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
private final TwitterCardContainer twitterCard;
private final StatusLinkClickHandler linkClickHandler;
private final TwidereLinkify linkify;
private final TextView retweetsLabel, favoritesLabel;
private final TextView repliesLabel, retweetsLabel, favoritesLabel;
private final View translateContainer;
private final TextView translateResultView;
private final RecyclerView interactUsersView;
@ -961,8 +962,10 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
profileTypeView = (ImageView) itemView.findViewById(R.id.profile_type);
timeSourceView = (TextView) itemView.findViewById(R.id.time_source);
retweetedByView = (TextView) itemView.findViewById(R.id.retweeted_by);
repliesContainer = itemView.findViewById(R.id.replies_container);
retweetsContainer = itemView.findViewById(R.id.retweets_container);
favoritesContainer = itemView.findViewById(R.id.favorites_container);
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_container);
@ -972,6 +975,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
quoteOriginalLink = (TextView) itemView.findViewById(R.id.quote_original_link);
profileContainer = (ColorLabelRelativeLayout) itemView.findViewById(R.id.profile_container);
twitterCard = (TwitterCardContainer) itemView.findViewById(R.id.twitter_card);
repliesLabel = (TextView) itemView.findViewById(R.id.replies_label);
retweetsLabel = (TextView) itemView.findViewById(R.id.retweets_label);
favoritesLabel = (TextView) itemView.findViewById(R.id.favorites_label);
@ -1096,19 +1101,24 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
locationView.setText(null);
}
final long retweetCount, favoriteCount;
final long repliesCount, retweetCount, favoriteCount;
if (statusActivity != null) {
repliesCount = statusActivity.getReplyCount();
retweetCount = statusActivity.getRetweetCount();
favoriteCount = statusActivity.getFavoriteCount();
} else {
repliesCount = status.reply_count;
retweetCount = status.retweet_count;
favoriteCount = status.favorite_count;
}
repliesContainer.setVisibility(repliesCount > 0 ? View.VISIBLE : View.GONE);
retweetsContainer.setVisibility(!status.user_is_protected && retweetCount > 0 ? View.VISIBLE : View.GONE);
favoritesContainer.setVisibility(favoriteCount > 0 ? View.VISIBLE : View.GONE);
if (retweetsContainer.getVisibility() == View.VISIBLE || favoritesContainer.getVisibility() == View.VISIBLE) {
if (retweetsContainer.getVisibility() == View.VISIBLE
|| favoritesContainer.getVisibility() == View.VISIBLE
|| repliesContainer.getVisibility() == View.VISIBLE) {
countsContainer.setVisibility(View.VISIBLE);
} else {
countsContainer.setVisibility(View.GONE);
@ -1116,6 +1126,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
final Locale locale = context.getResources().getConfiguration().locale;
repliesCountView.setText(Utils.getLocalizedNumber(locale, repliesCount));
retweetsCountView.setText(Utils.getLocalizedNumber(locale, retweetCount));
favoritesCountView.setText(Utils.getLocalizedNumber(locale, favoriteCount));
final UserProfileImagesAdapter interactUsersAdapter = (UserProfileImagesAdapter) interactUsersView.getAdapter();
@ -1316,6 +1327,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
retweetsCountView.setTextSize(defaultTextSize * 1.25f);
favoritesCountView.setTextSize(defaultTextSize * 1.25f);
repliesLabel.setTextSize(defaultTextSize * 0.85f);
retweetsLabel.setTextSize(defaultTextSize * 0.85f);
favoritesLabel.setTextSize(defaultTextSize * 0.85f);
@ -1401,14 +1413,26 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
final ParcelableStatus status = adapter.getStatus();
if (status.media != null) {
for (final ParcelableMedia media : status.media) {
if (media.start == start && media.end == end) {
adapter.setDetailMediaExpanded(true);
if (link.equals(media.page_url)) {
expandOrOpenMedia();
return;
}
}
}
if (type == TwidereLinkify.LINK_TYPE_STATUS && status.id == NumberUtils.toLong(link)) {
expandOrOpenMedia();
return;
}
super.onLinkClick(link, orig, accountId, extraId, type, sensitive, start, end);
}
private void expandOrOpenMedia() {
if (adapter.isDetailMediaExpanded()) {
//TODO open first media
return;
}
adapter.setDetailMediaExpanded(true);
}
}
}
@ -1904,9 +1928,9 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
}
@Override
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int position) {
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition) {
if (mStatusAdapterListener != null) {
mStatusAdapterListener.onMediaClick(holder, view, media, position);
mStatusAdapterListener.onMediaClick(holder, view, media, statusPosition);
}
}

View File

@ -158,7 +158,7 @@ public class UserMediaTimelineFragment extends AbsContentRecyclerViewFragment<St
}
@Override
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int position) {
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition) {
}

View File

@ -22,12 +22,15 @@ package org.mariotaku.twidere.util.net;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.util.LruCache;
import android.util.TimingLogger;
import com.squareup.okhttp.Dns;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.util.SharedPreferencesWrapper;
@ -49,27 +52,28 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map.Entry;
import java.util.regex.Pattern;
public class TwidereDns implements Constants, Dns {
private static final String RESOLVER_LOGTAG = "Twidere.Host";
private static final String RESOLVER_LOGTAG = "TwidereDns";
private static final String DEFAULT_DNS_SERVER_ADDRESS = "8.8.8.8";
private final SharedPreferences mHostMapping, mPreferences;
private final LruCache<String, InetAddress[]> mHostCache = new LruCache<>(512);
private final String mDnsAddress;
private final SystemHosts mResolver;
private final SystemHosts mSystemHosts;
private Resolver mDns;
private TimingLogger mLogger;
public TwidereDns(final Context context) {
mLogger = new TimingLogger(RESOLVER_LOGTAG, "resolve");
mHostMapping = SharedPreferencesWrapper.getInstance(context, HOST_MAPPING_PREFERENCES_NAME, Context.MODE_PRIVATE);
mPreferences = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
final String address = mPreferences.getString(KEY_DNS_SERVER, DEFAULT_DNS_SERVER_ADDRESS);
mDnsAddress = isValidIpAddress(address) ? address : DEFAULT_DNS_SERVER_ADDRESS;
mResolver = new SystemHosts();
mSystemHosts = new SystemHosts();
}
@SuppressWarnings("unused")
@ -80,38 +84,44 @@ public class TwidereDns implements Constants, Dns {
@NonNull
private InetAddress[] resolveInternal(String originalHost, String host) throws IOException {
if (isValidIpAddress(host)) {
final InetAddress[] inetAddresses = fromAddressString(originalHost, host);
if (inetAddresses != null) return inetAddresses;
mLogger.reset();
// Return if host is an address
final InetAddress[] fromAddressString = fromAddressString(originalHost, host);
if (fromAddressString != null) {
if (BuildConfig.DEBUG) {
mLogger.dumpToLog();
}
return fromAddressString;
}
// First, I'll try to load address cached.
final InetAddress[] cachedHostAddr = mHostCache.get(host);
if (cachedHostAddr != null) {
if (BuildConfig.DEBUG && Log.isLoggable(RESOLVER_LOGTAG, Log.VERBOSE)) {
Log.v(RESOLVER_LOGTAG, "Got cached " + Arrays.toString(cachedHostAddr));
return cachedHostAddr;
// Find from cache
final InetAddress[] fromCache = getCached(host);
if (fromCache != null) {
if (BuildConfig.DEBUG) {
mLogger.dumpToLog();
}
return fromCache;
}
final String customMappedHost = findHost(host);
if (customMappedHost != null) {
final InetAddress[] hostAddr = fromAddressString(originalHost, customMappedHost);
putCache(originalHost, hostAddr);
if (BuildConfig.DEBUG && Log.isLoggable(RESOLVER_LOGTAG, Log.VERBOSE)) {
Log.v(RESOLVER_LOGTAG, "Got mapped address " + customMappedHost + " for host " + host);
}
if (hostAddr != null) {
return hostAddr;
// Load from custom mapping
mLogger.addSplit("start custom mappong resolve");
final InetAddress[] fromMapping = getFromMapping(host);
mLogger.addSplit("end custom mappong resolve");
if (fromMapping != null) {
putCache(originalHost, fromMapping);
if (BuildConfig.DEBUG) {
mLogger.dumpToLog();
}
return fromMapping;
}
try {
final InetAddress[] hostAddr = mResolver.resolve(host);
putCache(originalHost, hostAddr);
if (BuildConfig.DEBUG && Log.isLoggable(RESOLVER_LOGTAG, Log.VERBOSE)) {
Log.v(RESOLVER_LOGTAG, "Got hosts " + Arrays.toString(hostAddr));
// Load from /etc/hosts
mLogger.addSplit("start /etc/hosts resolve");
final InetAddress[] fromSystemHosts = fromSystemHosts(host);
mLogger.addSplit("end /etc/hosts resolve");
if (fromSystemHosts != null) {
putCache(originalHost, fromSystemHosts);
if (BuildConfig.DEBUG) {
mLogger.dumpToLog();
}
return hostAddr;
} catch (UnknownHostException e) {
// Ignore
return fromSystemHosts;
}
// Use TCP DNS Query if enabled.
// final Resolver dns = getResolver();
@ -119,14 +129,28 @@ public class TwidereDns implements Constants, Dns {
// final InetAddress[] hostAddr = resolveDns(originalHost, host, dns);
// if (hostAddr != null) return hostAddr;
// }
if (BuildConfig.DEBUG && Log.isLoggable(RESOLVER_LOGTAG, Log.VERBOSE)) {
Log.v(RESOLVER_LOGTAG, "Resolve address " + host + " failed, using original host");
}
mLogger.addSplit("start system default resolve");
final InetAddress[] defaultAddresses = InetAddress.getAllByName(host);
mLogger.addSplit("end system default resolve");
putCache(host, defaultAddresses);
if (BuildConfig.DEBUG) {
mLogger.dumpToLog();
}
return defaultAddresses;
}
private InetAddress[] fromSystemHosts(String host) {
try {
return mSystemHosts.resolve(host);
} catch (IOException e) {
return null;
}
}
private InetAddress[] getCached(String host) {
return mHostCache.get(host);
}
private InetAddress[] resolveDns(String originalHost, String host, Resolver dns) throws IOException {
final Lookup lookup = new Lookup(new Name(host), Type.A, DClass.IN);
final Record[] records;
@ -151,7 +175,7 @@ public class TwidereDns implements Constants, Dns {
if (!resolvedAddresses.isEmpty()) {
final InetAddress[] hostAddr = resolvedAddresses.toArray(new InetAddress[resolvedAddresses.size()]);
putCache(originalHost, hostAddr);
if (BuildConfig.DEBUG && Log.isLoggable(RESOLVER_LOGTAG, Log.VERBOSE)) {
if (BuildConfig.DEBUG) {
Log.v(RESOLVER_LOGTAG, "Resolved " + Arrays.toString(hostAddr));
}
return hostAddr;
@ -176,9 +200,27 @@ public class TwidereDns implements Constants, Dns {
return new InetAddress[]{resolved};
}
private String findHost(final String host) {
@Nullable
private InetAddress[] getFromMapping(final String host) {
return getFromMappingInternal(host, host, false);
}
@Nullable
private InetAddress[] getFromMappingInternal(String host, String origHost, boolean checkRecursive) {
if (checkRecursive && hostMatches(host, origHost)) {
// Recursive resolution, stop this call
return null;
}
for (final Entry<String, ?> entry : mHostMapping.getAll().entrySet()) {
if (hostMatches(host, entry.getKey())) return (String) entry.getValue();
if (hostMatches(host, entry.getKey())) {
final String value = (String) entry.getValue();
final InetAddress resolved = InetAddressUtils.getResolvedIPAddress(origHost, value);
if (resolved == null) {
// Maybe another hostname
return getFromMappingInternal(value, origHost, true);
}
return new InetAddress[]{resolved};
}
}
return null;
}
@ -190,7 +232,7 @@ public class TwidereDns implements Constants, Dns {
private static boolean hostMatches(final String host, final String rule) {
if (rule == null || host == null) return false;
if (rule.startsWith(".")) return host.matches("(?i).*" + Pattern.quote(rule));
if (rule.startsWith(".")) return StringUtils.endsWithIgnoreCase(host, rule);
return host.equalsIgnoreCase(rule);
}

View File

@ -661,7 +661,7 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi
}
@Override
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int position) {
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition) {
}

View File

@ -53,7 +53,7 @@ public interface IStatusViewHolder extends CardMediaContainer.OnMediaClickListen
interface StatusClickListener extends ContentCardClickListener {
void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int position);
void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition);
void onStatusClick(IStatusViewHolder holder, int position);

View File

@ -380,13 +380,46 @@
android:orientation="horizontal"
android:splitMotionEvents="false">
<LinearLayout
android:id="@+id/replies_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:background="?selectableItemBackground"
android:clickable="true"
android:gravity="center_vertical"
android:minWidth="@dimen/element_size_normal"
android:orientation="vertical"
android:padding="@dimen/element_spacing_normal">
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/replies_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/element_spacing_small"
android:layout_marginRight="@dimen/element_spacing_small"
android:singleLine="true"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?android:textColorPrimary"
android:textStyle="bold"
tools:text="255"/>
<org.mariotaku.twidere.view.themed.ThemedTextView
android:id="@+id/replies_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="@string/replies"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="?android:textColorSecondary"/>
</LinearLayout>
<LinearLayout
android:id="@+id/retweets_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:background="?selectableItemBackground"
android:baselineAligned="true"
android:clickable="true"
android:gravity="center_vertical"
android:minWidth="@dimen/element_size_normal"
@ -421,7 +454,6 @@
android:layout_height="wrap_content"
android:layout_weight="0"
android:background="?selectableItemBackground"
android:baselineAligned="true"
android:clickable="true"
android:gravity="center_vertical"
android:minWidth="@dimen/element_size_normal"