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:
parent
509e37bd86
commit
d1fa794ac0
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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")'
|
||||
|
@ -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"));
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user