1
0
mirror of https://github.com/TwidereProject/Twidere-Android synced 2025-02-17 04:00:48 +01:00

api endpoint fixes

This commit is contained in:
Mariotaku Lee 2016-02-10 17:38:45 +08:00
parent 509e37bd86
commit d1fa794ac0
9 changed files with 90 additions and 53 deletions

View File

@ -56,7 +56,7 @@ script: ./gradlew build --no-daemon --stacktrace
deploy:
provider: releases
prerelease: false
prerelease: true
api_key:
secure: WKtKwda3hegqO9QVujdonNoL2ESJUR80WHNq/13wDsbCABo/GNnuqHNYZmml3wAifEKKeCEYfNZRUuHQ8eHs54Lj5BlGRX5i+1LrGhhgnVFQgmrhIv4RJuVQ663kDEh+Jwo4vowJ2mxNDvLvOhfZwxjULPDiknqy6u5PyW3id5M=
file_glob: true

View File

@ -26,27 +26,29 @@ import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.CancellationSignal;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.twidere.util.TwidereArrayUtils;
import java.util.Collection;
import static android.text.TextUtils.isEmpty;
public class ContentResolverUtils {
public static final int MAX_BULK_COUNT = 128;
public static <T> int bulkDelete(final ContentResolver resolver, final Uri uri, final String inColumn,
final Collection<T> colValues, final String extraWhere, final boolean valuesIsString) {
public static <T> int bulkDelete(@NonNull final ContentResolver resolver, @NonNull final Uri uri,
@NonNull final String inColumn, final Collection<T> colValues,
final String extraWhere, final boolean valuesIsString) {
if (colValues == null) return 0;
return bulkDelete(resolver, uri, inColumn, colValues.toArray(), extraWhere, valuesIsString);
}
public static <T> int bulkDelete(final ContentResolver resolver, final Uri uri, final String inColumn,
final T[] colValues, final String extraWhere, final boolean valuesIsString) {
if (resolver == null || uri == null || isEmpty(inColumn) || colValues == null || colValues.length == 0)
public static <T> int bulkDelete(@NonNull final ContentResolver resolver, @NonNull final Uri uri,
@NonNull final String inColumn, final T[] colValues,
final String extraWhere, final boolean valuesIsString) {
if (colValues == null || colValues.length == 0)
return 0;
final int colValuesLength = colValues.length, blocks_count = colValuesLength / MAX_BULK_COUNT + 1;
int rowsDeleted = 0;
@ -56,14 +58,14 @@ public class ContentResolverUtils {
if (valuesIsString) {
final StringBuilder where = new StringBuilder(inColumn + " IN(" + TwidereArrayUtils.toStringForSQL(block)
+ ")");
if (!isEmpty(extraWhere)) {
if (!TextUtils.isEmpty(extraWhere)) {
where.append("AND ").append(extraWhere);
}
rowsDeleted += resolver.delete(uri, where.toString(), block);
} else {
final StringBuilder where = new StringBuilder(inColumn + " IN("
+ TwidereArrayUtils.toString(block, ',', true) + ")");
if (!isEmpty(extraWhere)) {
if (!TextUtils.isEmpty(extraWhere)) {
where.append("AND ").append(extraWhere);
}
rowsDeleted += resolver.delete(uri, where.toString(), null);
@ -72,13 +74,14 @@ public class ContentResolverUtils {
return rowsDeleted;
}
public static int bulkInsert(final ContentResolver resolver, final Uri uri, final Collection<ContentValues> values) {
if (values == null) return 0;
public static int bulkInsert(@NonNull final ContentResolver resolver, @NonNull final Uri uri,
@NonNull final Collection<ContentValues> values) {
return bulkInsert(resolver, uri, values.toArray(new ContentValues[values.size()]));
}
public static int bulkInsert(final ContentResolver resolver, final Uri uri, final ContentValues[] values) {
if (resolver == null || uri == null || values == null || values.length == 0) return 0;
public static int bulkInsert(@NonNull final ContentResolver resolver, @NonNull final Uri uri,
@NonNull final ContentValues[] values) {
if (values.length == 0) return 0;
final int colValuesLength = values.length, blocksCount = colValuesLength / MAX_BULK_COUNT + 1;
int rowsInserted = 0;
for (int i = 0; i < blocksCount; i++) {
@ -90,14 +93,16 @@ public class ContentResolverUtils {
return rowsInserted;
}
public static Cursor query(final ContentResolver resolver, final Uri uri, final String[] projection,
final String selection, final String[] selectionArgs, final String sortOrder) {
public static Cursor query(@NonNull final ContentResolver resolver, @NonNull final Uri uri,
final String[] projection, final String selection,
final String[] selectionArgs, final String sortOrder) {
return resolver.query(uri, projection, selection, selectionArgs, sortOrder);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static Cursor query(final ContentResolver resolver, final Uri uri, final String[] projection,
final String selection, final String[] selectionArgs, final String sortOrder,
public static Cursor query(@NonNull final ContentResolver resolver, @NonNull final Uri uri,
final String[] projection, final String selection,
final String[] selectionArgs, final String sortOrder,
final CancellationSignal cancellationSignal) {
return resolver.query(uri, projection, selection, selectionArgs, sortOrder, cancellationSignal);
}

View File

@ -24,7 +24,7 @@ android {
minSdkVersion 14
targetSdkVersion 23
versionCode 140
versionName "3.0.3"
versionName "3.0.4-SNAPSHOT"
multiDexEnabled true
buildConfigField 'boolean', 'ENABLE_MEDIA_VIEWER', 'Boolean.parseBoolean("true")'

View File

@ -0,0 +1,30 @@
package org.mariotaku.twidere.util;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* Created by mariotaku on 16/2/10.
*/
public class TwitterAPIFactoryTest {
@Test
public void testGetApiUrl() throws Exception {
assertEquals("https://api.twitter.com/", TwitterAPIFactory.getApiUrl("https://[DOMAIN.]twitter.com", "api", null));
assertEquals("https://api.twitter.com/", TwitterAPIFactory.getApiUrl("https://[DOMAIN.]twitter.com/", "api", null));
assertEquals("https://api.twitter.com/1.1/", TwitterAPIFactory.getApiUrl("https://[DOMAIN.]twitter.com", "api", "1.1"));
assertEquals("https://api.twitter.com/1.1/", TwitterAPIFactory.getApiUrl("https://[DOMAIN.]twitter.com/", "api", "1.1"));
assertEquals("https://api.twitter.com/1.1/", TwitterAPIFactory.getApiUrl("https://[DOMAIN.]twitter.com", "api", "/1.1"));
assertEquals("https://api.twitter.com/1.1/", TwitterAPIFactory.getApiUrl("https://[DOMAIN.]twitter.com/", "api", "/1.1"));
assertEquals("https://api.twitter.com/1.1/", TwitterAPIFactory.getApiUrl("https://[DOMAIN.]twitter.com", "api", "1.1/"));
assertEquals("https://api.twitter.com/1.1/", TwitterAPIFactory.getApiUrl("https://[DOMAIN.]twitter.com/", "api", "1.1/"));
assertEquals("https://api.twitter.com/1.1/", TwitterAPIFactory.getApiUrl("https://[DOMAIN.]twitter.com", "api", "/1.1/"));
assertEquals("https://api.twitter.com/1.1/", TwitterAPIFactory.getApiUrl("https://[DOMAIN.]twitter.com/", "api", "/1.1/"));
}
@Test
public void testGetApiBaseUrl() {
assertEquals("https://media.twitter.com", TwitterAPIFactory.getApiBaseUrl("https://api.twitter.com", "media"));
}
}

View File

@ -177,6 +177,8 @@ public class NetworkDiagnosticsFragment extends BaseFragment {
testDns(dns, "twitter.com");
testNativeLookup("twitter.com");
publishProgress(LogText.LINEBREAK, LogText.LINEBREAK);
publishProgress(new LogText("Done. You can send this log to me, and I'll contact you to solve related issue."));
return null;
}

View File

@ -31,6 +31,7 @@ import org.mariotaku.twidere.api.twitter.model.Status;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedHashtags;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedStatuses;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers;
import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.TwitterContentUtils;
import org.mariotaku.twidere.util.TwitterWrapper.TwitterListResponse;
import org.mariotaku.twidere.util.content.ContentResolverUtils;
@ -39,10 +40,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.mariotaku.twidere.util.ContentValuesCreator.createCachedUser;
import static org.mariotaku.twidere.util.ContentValuesCreator.createStatus;
import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkInsert;
public class CacheUsersStatusesTask extends AsyncTask<TwitterListResponse<Status>, Object, Object> implements Constants {
private final Context context;
@ -71,25 +68,25 @@ public class CacheUsersStatusesTask extends AsyncTask<TwitterListResponse<Status
final Set<ContentValues> statusesValues = new HashSet<>();
final Set<ContentValues> hashTagValues = new HashSet<>();
statusesValues.add(createStatus(status, response.accountId));
statusesValues.add(ContentValuesCreator.createStatus(status, response.accountId));
final String text = TwitterContentUtils.unescapeTwitterStatusText(status.getText());
for (final String hashtag : extractor.extractHashtags(text)) {
final ContentValues values = new ContentValues();
values.put(CachedHashtags.NAME, hashtag);
hashTagValues.add(values);
}
final ContentValues cachedUser = createCachedUser(status.getUser());
final ContentValues cachedUser = ContentValuesCreator.createCachedUser(status.getUser());
cachedUser.put(CachedUsers.LAST_SEEN, System.currentTimeMillis());
usersValues.add(cachedUser);
if (status.isRetweet()) {
final ContentValues cachedRetweetedUser = createCachedUser(status.getRetweetedStatus().getUser());
final ContentValues cachedRetweetedUser = ContentValuesCreator.createCachedUser(status.getRetweetedStatus().getUser());
cachedRetweetedUser.put(CachedUsers.LAST_SEEN, System.currentTimeMillis());
usersValues.add(cachedRetweetedUser);
}
bulkInsert(resolver, CachedStatuses.CONTENT_URI, statusesValues);
bulkInsert(resolver, CachedHashtags.CONTENT_URI, hashTagValues);
bulkInsert(resolver, CachedUsers.CONTENT_URI, usersValues);
ContentResolverUtils.bulkInsert(resolver, CachedStatuses.CONTENT_URI, statusesValues);
ContentResolverUtils.bulkInsert(resolver, CachedHashtags.CONTENT_URI, hashTagValues);
ContentResolverUtils.bulkInsert(resolver, CachedUsers.CONTENT_URI, usersValues);
}
}
}

View File

@ -39,6 +39,7 @@ import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.provider.TwidereDataStore.Filters;
import org.mariotaku.twidere.util.content.ContentResolverUtils;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
import java.util.ArrayList;
@ -51,9 +52,6 @@ import java.util.TreeSet;
import javax.inject.Inject;
import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkDelete;
import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkInsert;
@SuppressLint("Registered")
public class MultiSelectEventHandler implements Constants, ActionMode.Callback, MultiSelectManager.Callback {
@ -147,8 +145,8 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback,
valuesList.add(ContentValuesCreator.createFilteredUser(user));
}
}
bulkDelete(resolver, Filters.Users.CONTENT_URI, Filters.Users.USER_ID, userIds, null, false);
bulkInsert(resolver, Filters.Users.CONTENT_URI, valuesList);
ContentResolverUtils.bulkDelete(resolver, Filters.Users.CONTENT_URI, Filters.Users.USER_ID, userIds, null, false);
ContentResolverUtils.bulkInsert(resolver, Filters.Users.CONTENT_URI, valuesList);
Toast.makeText(mActivity, R.string.message_users_muted, Toast.LENGTH_SHORT).show();
mode.finish();
mActivity.sendBroadcast(new Intent(BROADCAST_MULTI_MUTESTATE_CHANGED));

View File

@ -271,33 +271,39 @@ public class TwitterAPIFactory implements TwidereConstants {
return format.substring(0, lastIndex) + format.substring(lastIndex + suffixLength);
}
if (TextUtils.isEmpty(domain)) return matcher.replaceAll("");
return matcher.replaceAll(String.format("$1%s$2", domain));
return matcher.replaceAll("$1" + domain + "$2");
}
private static String substituteLegacyApiBaseUrl(@NonNull String format, String domain) {
static String substituteLegacyApiBaseUrl(@NonNull String format, String domain) {
final int startOfHost = format.indexOf("://") + 3, endOfHost = format.indexOf('/', startOfHost);
final String host = endOfHost != -1 ? format.substring(startOfHost, endOfHost) : format.substring(startOfHost);
if (!host.equalsIgnoreCase("api.twitter.com")) return format;
return format.substring(0, startOfHost) + domain + ".twitter.com" + format.substring(endOfHost);
}
public static String getApiUrl(final String pattern, final String domain, final String appendPath) {
final String urlBase = getApiBaseUrl(pattern, domain);
if (appendPath == null) return urlBase.endsWith("/") ? urlBase : urlBase + "/";
final StringBuilder sb = new StringBuilder(urlBase);
if (urlBase.endsWith("/")) {
sb.append(appendPath.startsWith("/") ? appendPath.substring(1) : appendPath);
} else {
if (appendPath.startsWith("/")) {
sb.append(appendPath);
} else {
sb.append('/');
sb.append(appendPath);
}
final StringBuilder sb = new StringBuilder();
sb.append(format.substring(0, startOfHost));
sb.append(domain);
sb.append(".twitter.com");
if (endOfHost != -1) {
sb.append(format.substring(endOfHost));
}
return sb.toString();
}
@NonNull
public static String getApiUrl(final String pattern, final String domain, String appendPath) {
String urlBase = getApiBaseUrl(pattern, domain);
if (urlBase.endsWith("/")) {
urlBase = urlBase.substring(0, urlBase.length() - 1);
}
if (appendPath == null) return urlBase + "/";
if (appendPath.startsWith("/")) {
appendPath = appendPath.substring(1);
}
if (appendPath.endsWith("/")) {
appendPath = appendPath.substring(0, appendPath.length() - 1);
}
return urlBase + "/" + appendPath + "/";
}
@WorkerThread
public static String getUserAgentName(Context context, ConsumerKeyType type) {
switch (type) {

View File

@ -1688,7 +1688,6 @@ public final class Utils implements Constants {
public static boolean isUserLoggedIn(final Context context, final long accountId) {
if (context == null) return false;
final long[] ids = DataStoreUtils.getAccountIds(context);
if (ids == null) return false;
for (final long id : ids) {
if (id == accountId) return true;
}