updated lib version

refactoring to ditch Dagger
This commit is contained in:
Mariotaku Lee 2018-03-26 22:46:23 +08:00
parent d04d8576a8
commit 05f215b8b2
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
175 changed files with 2026 additions and 1758 deletions

View File

@ -35,7 +35,7 @@ allprojects {
subprojects {
buildscript {
ext {
kotlinVersion = '1.2.30'
kotlinVersion = '1.2.31'
pluginVersions = [
AndroidSvgDrawable: '3.0.0',
PlayServices : '3.1.1',
@ -53,7 +53,7 @@ subprojects {
MapsUtils : '0.5',
DropboxCoreSdk : '3.0.3',
GoogleDriveApi : 'v3-rev81-1.22.0',
Exoplayer : 'r2.5.4',
Exoplayer : '2.6.0',
Toro : '2.1.0',
LoganSquare : '1.3.7',
Mime4J : '0.7.2',
@ -66,24 +66,23 @@ subprojects {
MultiValueSwitch : '0.9.8',
PickNCrop : '0.9.27',
AndroidGIFDrawable : '1.2.6',
KPreferences : '0.9.7',
KPreferences : '0.9.8',
Kovenant : '3.3.0',
ParcelablePlease : '1.0.2',
Chameleon : '0.9.26',
UniqR : '0.9.6',
UniqR : '0.9.10',
SQLiteQB : '0.9.18',
Glide : '3.7.0',
GlideOkHttp3 : '1.4.0',
GlideTransformations : '2.0.2',
Glide : '4.6.1',
GlideOkHttp3 : '4.6.1',
AndroidImageCropper : '2.4.6',
ExportablePreferences : '0.9.7',
ACRA : '4.9.2',
AbstractTask : '0.9.8',
Dagger : '2.11',
StethoBeanShellREPL : '0.3',
ArchLifecycleExtensions: '1.1.0',
ArchLifecycleExtensions: '1.1.1',
ArchPaging : '1.0.0-alpha6',
ConstraintLayout : '1.1.0-beta5',
ConstraintLayout : '1.1.0-beta6',
MessageBubbleView : '2.1',
]

View File

@ -18,6 +18,8 @@
package org.mariotaku.microblog.library.model.mastodon;
import android.support.annotation.Nullable;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.bluelinelabs.logansquare.annotation.OnJsonParseComplete;
@ -27,7 +29,7 @@ import java.util.Date;
/**
* {@see https://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md#account}
*
* <p>
* Created by mariotaku on 2017/4/17.
*/
@JsonObject
@ -107,6 +109,12 @@ public class Account {
*/
@JsonField(name = "header_static")
String headerStatic;
/**
* If the owner decided to switch accounts, new account is in this attribute
*/
@JsonField(name = "moved")
@Nullable
Account moved;
public String getId() {
return id;
@ -168,6 +176,11 @@ public class Account {
return headerStatic;
}
@Nullable
public Account getMoved() {
return moved;
}
@OnJsonParseComplete
void onJsonParseComplete() throws IOException {
if (id == null) {
@ -196,6 +209,7 @@ public class Account {
", avatarStatic='" + avatarStatic + '\'' +
", header='" + header + '\'' +
", headerStatic='" + headerStatic + '\'' +
", moved=" + moved +
'}';
}
}

View File

@ -147,20 +147,20 @@ public class ParcelableActivity extends ParcelableStatus implements Parcelable {
", max_position='" + max_position + '\'' +
", min_position='" + min_position + '\'' +
", source_keys=" + Arrays.toString(source_keys) +
", _id=" + _id +
", sources=" + Arrays.toString(sources) +
", id='" + id + '\'' +
", _id=" + _id +
", targets=" + targets +
", account_key=" + account_key +
", id='" + id + '\'' +
", target_objects=" + target_objects +
", account_key=" + account_key +
", sources_lite=" + Arrays.toString(sources_lite) +
", sort_id=" + sort_id +
", position_key=" + position_key +
", sources_lite=" + Arrays.toString(sources_lite) +
", timestamp=" + timestamp +
", summary_line=" + Arrays.toString(summary_line) +
", timestamp=" + timestamp +
", has_following_source=" + has_following_source +
", user_key=" + user_key +
", after_filtered_sources=" + Arrays.toString(after_filtered_sources) +
", user_key=" + user_key +
", retweet_id='" + retweet_id + '\'' +
", retweeted_by_user_key=" + retweeted_by_user_key +
", retweet_timestamp=" + retweet_timestamp +
@ -170,9 +170,6 @@ public class ParcelableActivity extends ParcelableStatus implements Parcelable {
", in_reply_to_status_id='" + in_reply_to_status_id + '\'' +
", in_reply_to_user_key=" + in_reply_to_user_key +
", my_retweet_id='" + my_retweet_id + '\'' +
", quoted_id='" + quoted_id + '\'' +
", quoted_timestamp=" + quoted_timestamp +
", quoted_user_key=" + quoted_user_key +
", is_gap=" + is_gap +
", is_retweet=" + is_retweet +
", retweeted=" + retweeted +
@ -182,8 +179,6 @@ public class ParcelableActivity extends ParcelableStatus implements Parcelable {
", user_is_protected=" + user_is_protected +
", user_is_verified=" + user_is_verified +
", is_quote=" + is_quote +
", quoted_user_is_protected=" + quoted_user_is_protected +
", quoted_user_is_verified=" + quoted_user_is_verified +
", retweeted_by_user_name='" + retweeted_by_user_name + '\'' +
", retweeted_by_user_screen_name='" + retweeted_by_user_screen_name + '\'' +
", retweeted_by_user_profile_image='" + retweeted_by_user_profile_image + '\'' +
@ -197,21 +192,12 @@ public class ParcelableActivity extends ParcelableStatus implements Parcelable {
", user_profile_image_url='" + user_profile_image_url + '\'' +
", text_unescaped='" + text_unescaped + '\'' +
", card_name='" + card_name + '\'' +
", quoted_text_plain='" + quoted_text_plain + '\'' +
", quoted_text_unescaped='" + quoted_text_unescaped + '\'' +
", quoted_source='" + quoted_source + '\'' +
", quoted_user_name='" + quoted_user_name + '\'' +
", quoted_user_screen_name='" + quoted_user_screen_name + '\'' +
", quoted_user_profile_image='" + quoted_user_profile_image + '\'' +
", location=" + location +
", place_full_name='" + place_full_name + '\'' +
", mentions=" + Arrays.toString(mentions) +
", media=" + Arrays.toString(media) +
", quoted_media=" + Arrays.toString(quoted_media) +
", card=" + card +
", attachment=" + attachment +
", extras=" + extras +
", spans=" + Arrays.toString(spans) +
", quoted_spans=" + Arrays.toString(quoted_spans) +
", account_color=" + account_color +
", filter_flags=" + filter_flags +
", filter_users=" + Arrays.toString(filter_users) +

View File

@ -145,19 +145,6 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@CursorField(Statuses.MY_RETWEET_ID)
public String my_retweet_id;
@JsonField(name = "quoted_id")
@CursorField(Statuses.QUOTED_ID)
public String quoted_id;
@JsonField(name = "quoted_timestamp")
@CursorField(Statuses.QUOTED_TIMESTAMP)
public long quoted_timestamp;
@JsonField(name = "quoted_user_id", typeConverter = UserKeyConverter.class)
@CursorField(value = Statuses.QUOTED_USER_KEY, converter = UserKeyCursorFieldConverter.class)
@Nullable
public UserKey quoted_user_key;
@JsonField(name = "is_gap")
@CursorField(Statuses.IS_GAP)
public boolean is_gap;
@ -194,14 +181,6 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@CursorField(Statuses.IS_QUOTE)
public boolean is_quote;
@JsonField(name = "quoted_user_is_protected")
@CursorField(Statuses.QUOTED_USER_IS_PROTECTED)
public boolean quoted_user_is_protected;
@JsonField(name = "quoted_user_is_verified")
@CursorField(Statuses.QUOTED_USER_IS_VERIFIED)
public boolean quoted_user_is_verified;
@JsonField(name = "retweeted_by_user_name")
@CursorField(Statuses.RETWEETED_BY_USER_NAME)
public String retweeted_by_user_name;
@ -251,36 +230,12 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@JsonField(name = "text_unescaped")
@CursorField(Statuses.TEXT_UNESCAPED)
public String text_unescaped;
@Nullable
@Nullable
@JsonField(name = "card_name")
@CursorField(Statuses.CARD_NAME)
public String card_name;
@JsonField(name = "quoted_text_plain")
@CursorField(Statuses.QUOTED_TEXT_PLAIN)
public String quoted_text_plain;
@JsonField(name = "quoted_text_unescaped")
@CursorField(Statuses.QUOTED_TEXT_UNESCAPED)
public String quoted_text_unescaped;
@JsonField(name = "quoted_source")
@CursorField(Statuses.QUOTED_SOURCE)
public String quoted_source;
@JsonField(name = "quoted_user_name")
@CursorField(Statuses.QUOTED_USER_NAME)
public String quoted_user_name;
@JsonField(name = "quoted_user_screen_name")
@CursorField(Statuses.QUOTED_USER_SCREEN_NAME)
public String quoted_user_screen_name;
@JsonField(name = "quoted_user_profile_image")
@CursorField(Statuses.QUOTED_USER_PROFILE_IMAGE)
public String quoted_user_profile_image;
@JsonField(name = "location")
@CursorField(value = Statuses.LOCATION, converter = ParcelableLocation.Converter.class)
@Nullable
@ -295,22 +250,9 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@CursorField(value = Statuses.MENTIONS_JSON, converter = LoganSquareCursorFieldConverter.class)
public ParcelableUserMention[] mentions;
// TODO: Simplify for list loader
@JsonField(name = "media")
@CursorField(value = Statuses.MEDIA_JSON, converter = LoganSquareCursorFieldConverter.class)
@Nullable
public ParcelableMedia[] media;
// TODO: Simplify for list loader
@JsonField(name = "quoted_media")
@CursorField(value = Statuses.QUOTED_MEDIA_JSON, converter = LoganSquareCursorFieldConverter.class)
@Nullable
public ParcelableMedia[] quoted_media;
@JsonField(name = "card")
@CursorField(value = Statuses.CARD, converter = LoganSquareCursorFieldConverter.class)
@Nullable
public ParcelableCardEntity card;
@CursorField(value = Statuses.ATTACHMENT, converter = LoganSquareCursorFieldConverter.class)
public ParcelableStatusAttachment attachment;
@JsonField(name = "extras")
@CursorField(value = Statuses.EXTRAS, converter = LoganSquareCursorFieldConverter.class)
@ -321,10 +263,6 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@CursorField(value = Statuses.SPANS, converter = LoganSquareCursorFieldConverter.class)
public SpanItem[] spans;
@JsonField(name = "quoted_spans")
@CursorField(value = Statuses.QUOTED_SPANS, converter = LoganSquareCursorFieldConverter.class)
public SpanItem[] quoted_spans;
@JsonField(name = "account_color")
@CursorField(Statuses.ACCOUNT_COLOR)
public int account_color;
@ -420,9 +358,6 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
", in_reply_to_status_id='" + in_reply_to_status_id + '\'' +
", in_reply_to_user_key=" + in_reply_to_user_key +
", my_retweet_id='" + my_retweet_id + '\'' +
", quoted_id='" + quoted_id + '\'' +
", quoted_timestamp=" + quoted_timestamp +
", quoted_user_key=" + quoted_user_key +
", is_gap=" + is_gap +
", is_retweet=" + is_retweet +
", retweeted=" + retweeted +
@ -432,8 +367,6 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
", user_is_protected=" + user_is_protected +
", user_is_verified=" + user_is_verified +
", is_quote=" + is_quote +
", quoted_user_is_protected=" + quoted_user_is_protected +
", quoted_user_is_verified=" + quoted_user_is_verified +
", retweeted_by_user_name='" + retweeted_by_user_name + '\'' +
", retweeted_by_user_screen_name='" + retweeted_by_user_screen_name + '\'' +
", retweeted_by_user_profile_image='" + retweeted_by_user_profile_image + '\'' +
@ -447,21 +380,12 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
", user_profile_image_url='" + user_profile_image_url + '\'' +
", text_unescaped='" + text_unescaped + '\'' +
", card_name='" + card_name + '\'' +
", quoted_text_plain='" + quoted_text_plain + '\'' +
", quoted_text_unescaped='" + quoted_text_unescaped + '\'' +
", quoted_source='" + quoted_source + '\'' +
", quoted_user_name='" + quoted_user_name + '\'' +
", quoted_user_screen_name='" + quoted_user_screen_name + '\'' +
", quoted_user_profile_image='" + quoted_user_profile_image + '\'' +
", location=" + location +
", place_full_name='" + place_full_name + '\'' +
", mentions=" + Arrays.toString(mentions) +
", media=" + Arrays.toString(media) +
", quoted_media=" + Arrays.toString(quoted_media) +
", card=" + card +
", attachment=" + attachment +
", extras=" + extras +
", spans=" + Arrays.toString(spans) +
", quoted_spans=" + Arrays.toString(quoted_spans) +
", account_color=" + account_color +
", filter_flags=" + filter_flags +
", filter_users=" + Arrays.toString(filter_users) +
@ -478,7 +402,7 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@AfterCursorObjectCreated
void finishCursorObjectCreation() {
card_name = card != null ? card.name : null;
card_name = (attachment != null && attachment.card != null) ? attachment.card.name : null;
fixSortId();
}
@ -532,9 +456,6 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@JsonField(name = "external_url")
public String external_url;
@JsonField(name = "quoted_external_url")
public String quoted_external_url;
@JsonField(name = "retweeted_external_url")
public String retweeted_external_url;

View File

@ -0,0 +1,142 @@
/*
* Twidere - Twitter client for Android
*
* Copyright 2012-2018 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mariotaku.twidere.model;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.Nullable;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import org.mariotaku.twidere.model.util.UserKeyConverter;
@ParcelablePlease
@JsonObject
public class ParcelableStatusAttachment implements Parcelable {
@JsonField(name = "media")
@Nullable
public ParcelableMedia[] media;
@JsonField(name = "card")
@Nullable
public ParcelableCardEntity card;
@JsonField(name = "quoted")
@Nullable
public QuotedStatus quoted;
@ParcelablePlease
@JsonObject
public static class QuotedStatus implements Parcelable {
@JsonField(name = "id")
public String id;
@JsonField(name = "timestamp")
public long timestamp;
@JsonField(name = "account_id", typeConverter = UserKeyConverter.class)
public UserKey account_key;
@JsonField(name = "user_id", typeConverter = UserKeyConverter.class)
@Nullable
public UserKey user_key;
@JsonField(name = "user_is_protected")
public boolean user_is_protected;
@JsonField(name = "user_is_verified")
public boolean user_is_verified;
@JsonField(name = "text_plain")
public String text_plain;
@JsonField(name = "text_unescaped")
public String text_unescaped;
@JsonField(name = "source")
public String source;
@JsonField(name = "user_name")
public String user_name;
@JsonField(name = "user_screen_name")
public String user_screen_name;
@JsonField(name = "user_profile_image")
public String user_profile_image;
@JsonField(name = "media")
@Nullable
public ParcelableMedia[] media;
@JsonField(name = "spans")
public SpanItem[] spans;
@JsonField(name = "external_url")
public String external_url;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
ParcelableStatusAttachment$QuotedStatusParcelablePlease.writeToParcel(this, dest, flags);
}
public static final Creator<QuotedStatus> CREATOR = new Creator<QuotedStatus>() {
public QuotedStatus createFromParcel(Parcel source) {
QuotedStatus target = new QuotedStatus();
ParcelableStatusAttachment$QuotedStatusParcelablePlease.readFromParcel(target, source);
return target;
}
public QuotedStatus[] newArray(int size) {
return new QuotedStatus[size];
}
};
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
ParcelableStatusAttachmentParcelablePlease.writeToParcel(this, dest, flags);
}
public static final Creator<ParcelableStatusAttachment> CREATOR = new Creator<ParcelableStatusAttachment>() {
public ParcelableStatusAttachment createFromParcel(Parcel source) {
ParcelableStatusAttachment target = new ParcelableStatusAttachment();
ParcelableStatusAttachmentParcelablePlease.readFromParcel(target, source);
return target;
}
public ParcelableStatusAttachment[] newArray(int size) {
return new ParcelableStatusAttachment[size];
}
};
}

View File

@ -368,6 +368,9 @@ public class ParcelableUser implements Parcelable, Comparable<ParcelableUser> {
@JsonField(name = "url_display")
@ParcelableThisPlease
public String url_display;
@JsonField(name = "moved")
@Nullable
public ParcelableLiteUser moved;
@Override

View File

@ -19,6 +19,8 @@
package org.mariotaku.twidere.model.tab.argument;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.CallSuper;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
@ -26,6 +28,7 @@ import android.support.annotation.Nullable;
import com.bluelinelabs.logansquare.LoganSquare;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.annotation.CustomTabType;
@ -34,8 +37,9 @@ import org.mariotaku.twidere.model.UserKey;
import java.io.IOException;
import java.util.Arrays;
@ParcelablePlease
@JsonObject
public class TabArguments implements TwidereConstants {
public class TabArguments implements Parcelable {
@JsonField(name = "account_id")
String accountId;
@ -63,7 +67,7 @@ public class TabArguments implements TwidereConstants {
for (UserKey key : accountKeys) {
if (key == null) return;
}
bundle.putParcelableArray(EXTRA_ACCOUNT_KEYS, accountKeys);
bundle.putParcelableArray(TwidereConstants.EXTRA_ACCOUNT_KEYS, accountKeys);
} else if (accountId != null) {
long id = Long.MIN_VALUE;
try {
@ -73,10 +77,10 @@ public class TabArguments implements TwidereConstants {
}
if (id != Long.MIN_VALUE && id <= 0) {
// account_id = -1, means no account selected
bundle.putParcelableArray(EXTRA_ACCOUNT_KEYS, null);
bundle.putParcelableArray(TwidereConstants.EXTRA_ACCOUNT_KEYS, null);
return;
}
bundle.putParcelableArray(EXTRA_ACCOUNT_KEYS, new UserKey[]{UserKey.valueOf(accountId)});
bundle.putParcelableArray(TwidereConstants.EXTRA_ACCOUNT_KEYS, new UserKey[]{UserKey.valueOf(accountId)});
}
}
@ -117,4 +121,26 @@ public class TabArguments implements TwidereConstants {
}
return null;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
TabArgumentsParcelablePlease.writeToParcel(this, dest, flags);
}
public static final Creator<TabArguments> CREATOR = new Creator<TabArguments>() {
public TabArguments createFromParcel(Parcel source) {
TabArguments target = new TabArguments();
TabArgumentsParcelablePlease.readFromParcel(target, source);
return target;
}
public TabArguments[] newArray(int size) {
return new TabArguments[size];
}
};
}

View File

@ -27,6 +27,8 @@ import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import org.mariotaku.twidere.TwidereConstants;
/**
* Created by mariotaku on 16/3/6.
*/
@ -47,7 +49,7 @@ public class TextQueryArguments extends TabArguments implements Parcelable {
@Override
public void copyToBundle(@NonNull Bundle bundle) {
super.copyToBundle(bundle);
bundle.putString(EXTRA_QUERY, query);
bundle.putString(TwidereConstants.EXTRA_QUERY, query);
}
@Override

View File

@ -27,6 +27,7 @@ import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.model.UserKey;
@ParcelablePlease
@ -37,6 +38,14 @@ public class UserArguments extends TabArguments implements Parcelable {
@JsonField(name = "user_key")
UserKey userKey;
public String getUserId() {
return userId;
}
public UserKey getUserKey() {
return userKey;
}
public void setUserKey(UserKey userKey) {
this.userKey = userKey;
}
@ -45,9 +54,9 @@ public class UserArguments extends TabArguments implements Parcelable {
public void copyToBundle(@NonNull Bundle bundle) {
super.copyToBundle(bundle);
if (userKey == null) {
bundle.putParcelable(EXTRA_USER_KEY, UserKey.valueOf(userId));
bundle.putParcelable(TwidereConstants.EXTRA_USER_KEY, UserKey.valueOf(userId));
} else {
bundle.putParcelable(EXTRA_USER_KEY, userKey);
bundle.putParcelable(TwidereConstants.EXTRA_USER_KEY, userKey);
}
}

View File

@ -27,6 +27,8 @@ import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import org.mariotaku.twidere.TwidereConstants;
/**
* Created by mariotaku on 16/3/6.
*/
@ -47,7 +49,7 @@ public class UserListArguments extends TabArguments implements Parcelable {
@Override
public void copyToBundle(@NonNull Bundle bundle) {
super.copyToBundle(bundle);
bundle.putString(EXTRA_LIST_ID, listId);
bundle.putString(TwidereConstants.EXTRA_LIST_ID, listId);
}
@Override

View File

@ -26,12 +26,15 @@ import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import org.mariotaku.twidere.annotation.TimelineStyle;
import static org.mariotaku.twidere.constant.IntentConstants.EXTRA_TIMELINE_STYLE;
@JsonObject
@ParcelablePlease
public class TimelineTabExtras extends TabExtras implements Parcelable {
@JsonField(name = "timeline_style")
@TimelineStyle
int timelineStyle;
@Override
@ -40,11 +43,12 @@ public class TimelineTabExtras extends TabExtras implements Parcelable {
bundle.putInt(EXTRA_TIMELINE_STYLE, timelineStyle);
}
@TimelineStyle
public int getTimelineStyle() {
return timelineStyle;
}
public void setTimelineStyle(int timelineStyle) {
public void setTimelineStyle(@TimelineStyle int timelineStyle) {
this.timelineStyle = timelineStyle;
}

View File

@ -687,10 +687,10 @@ public interface TwidereDataStore {
String MY_RETWEET_ID = "my_retweet_id";
String MEDIA_JSON = "media_json";
String MENTIONS_JSON = "mentions_json";
String ATTACHMENT = "attachments";
String CARD = "card";
String CARD_NAME = "card_type";

View File

@ -148,6 +148,10 @@ android {
}
androidExtensions {
experimental = true
}
repositories {
mavenLocal()
maven { url 'https://s3.amazonaws.com/repo.commonsware.com' }
@ -160,6 +164,7 @@ dependencies {
kapt "com.hannesdorfmann.parcelableplease:processor:${libVersions['ParcelablePlease']}"
kapt "com.google.dagger:dagger-compiler:${libVersions['Dagger']}"
kapt "com.github.mariotaku.ObjectCursor:processor:${libVersions['ObjectCursor']}"
kapt "com.github.bumptech.glide:compiler:${libVersions['Glide']}"
implementation project(':twidere.component.common')
implementation project(':twidere.component.nyan')
@ -250,7 +255,6 @@ dependencies {
implementation "com.google.android.exoplayer:extension-okhttp:${libVersions['Exoplayer']}"
implementation "com.github.bumptech.glide:glide:${libVersions['Glide']}"
implementation "com.github.bumptech.glide:okhttp3-integration:${libVersions['GlideOkHttp3']}@aar"
implementation "jp.wasabeef:glide-transformations:${libVersions['GlideTransformations']}"
implementation "com.theartofdev.edmodo:android-image-cropper:${libVersions['AndroidImageCropper']}"
implementation "com.github.mariotaku.MediaViewerLibrary:base:${libVersions['MediaViewerLibrary']}"

View File

@ -65,19 +65,19 @@ class DraftExtensionsTest {
}
}
}
private fun InputStream.contentEquals(that: InputStream): Boolean {
var len1 = 0
var len2 = 0
val buf1 = ByteArray(8192)
val buf2 = ByteArray(8192)
while (len1 != -1 && len2 != -1) {
len1 = this.read(buf1)
len2 = that.read(buf2)
if (!buf1.contentEquals(buf2)) {
return false
private fun InputStream.contentEquals(that: InputStream): Boolean {
var len1 = 0
var len2 = 0
val buf1 = ByteArray(8192)
val buf2 = ByteArray(8192)
while (len1 != -1 && len2 != -1) {
len1 = this.read(buf1)
len2 = that.read(buf2)
if (!buf1.contentEquals(buf2)) {
return false
}
}
return len1 == len2
}
return len1 == len2
}

View File

@ -0,0 +1,54 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2018 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.extension.model
import android.support.test.InstrumentationRegistry
import android.support.test.runner.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.mariotaku.twidere.extension.queryAll
import org.mariotaku.twidere.model.Tab
import org.mariotaku.twidere.provider.TwidereDataStore.Tabs
import org.xmlpull.v1.XmlPullParserFactory
import java.io.File
import java.util.*
@RunWith(AndroidJUnit4::class)
class HomeTabExtensionsTest {
@Test
fun testSerialize() {
val context = InstrumentationRegistry.getTargetContext()
val legacyTabs = context.contentResolver.queryAll(Tabs.CONTENT_URI, Tabs.COLUMNS,
null, null, Tabs.POSITION, cls = Tab::class.java)!!
val tabs = legacyTabs.map { it.toHomeTab() }
File(context.cacheDir, "${UUID.randomUUID()}.xml").writer(Charsets.UTF_8).use {
val serializer = XmlPullParserFactory.newInstance().newSerializer()
serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true)
serializer.setOutput(it)
serializer.startDocument("UTF-8", true)
serializer.startTag(null, "tabs")
tabs.forEach { it.serialize(serializer) }
serializer.endTag(null, "tabs")
serializer.endDocument()
it.flush()
}
}
}

View File

@ -146,14 +146,6 @@
android:name="override_tinted_status_bar_defaults"
android:value="true"/>
<meta-data
android:name="com.bumptech.glide.integration.okhttp3.OkHttpGlideModule"
tools:node="remove"/>
<meta-data
android:name="org.mariotaku.twidere.util.glide.TwidereGlideModule"
android:value="GlideModule"/>
<activity
android:name=".activity.MainActivity"
android:icon="@mipmap/ic_launcher"

View File

@ -30,7 +30,7 @@ import org.mariotaku.twidere.model.UserKey;
public interface Constants extends TwidereConstants {
String DATABASES_NAME = "twidere.sqlite";
int DATABASES_VERSION = 192;
int DATABASES_VERSION = 194;
int EXTRA_FEATURES_NOTICE_VERSION = 2;

View File

@ -24,7 +24,6 @@ import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.annotation.Nullable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat;
@ -46,18 +45,6 @@ public final class ViewSupport {
}
@SuppressWarnings("unchecked")
public static <T extends View> T findViewByType(View view, Class<T> cls) {
if (cls.isAssignableFrom(view.getClass())) return (T) 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 (T) found;
}
}
return null;
}
public static void setForeground(View view, Drawable foreground) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
ViewAccessorICS.setForeground(view, foreground);

View File

@ -1,14 +1,17 @@
package org.mariotaku.ktextension
import android.app.Application
import android.content.BroadcastReceiver
import android.content.Context
import android.content.pm.PackageManager
import android.support.v4.content.ContextCompat
import java.io.File
/**
* Created by mariotaku on 2016/12/13.
*/
val Context.hasApplication: Boolean
get() = applicationContext is Application
val Context.preferExternalCacheDir: File
get() = externalCacheDir ?: cacheDir
fun Context.checkAllSelfPermissionsGranted(vararg permissions: String): Boolean {
return permissions.none { ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED }
@ -27,6 +30,3 @@ fun Context.unregisterReceiverSafe(receiver: BroadcastReceiver?): Boolean {
return false
}
}
val Context.preferExternalCacheDir: File
get() = externalCacheDir ?: cacheDir

View File

@ -24,7 +24,7 @@ import android.text.Spanned
import org.mariotaku.twidere.text.ZeroWidthSpan
import java.text.Normalizer
fun CharSequence.appendTo(sb: StringBuilder) {
fun CharSequence.appendTo(sb: Appendable) {
sb.append(this)
}

View File

@ -28,6 +28,7 @@ import android.widget.AdapterView
import android.widget.AdapterView.OnItemClickListener
import android.widget.ListView
import android.widget.Toast
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.activity_account_selector.*
import org.mariotaku.ktextension.getNullableTypedArrayExtra
import org.mariotaku.twidere.R
@ -96,7 +97,7 @@ class AccountSelectorActivity : BaseActivity(), OnItemClickListener {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_account_selector)
DataStoreUtils.prepareDatabase(this)
adapter = AccountDetailsAdapter(this, requestManager).apply {
adapter = AccountDetailsAdapter(this, Glide.with(this)).apply {
switchEnabled = !isSingleSelection
sortEnabled = false
val am = AccountManager.get(context)

View File

@ -45,7 +45,6 @@ import android.view.View
import android.view.WindowManager
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager
import com.squareup.otto.Bus
import nl.komponents.kovenant.Promise
import org.mariotaku.chameleon.Chameleon
import org.mariotaku.chameleon.ChameleonActivity
@ -66,7 +65,6 @@ import org.mariotaku.twidere.constant.*
import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.defaultSharedPreferences
import org.mariotaku.twidere.extension.firstLanguage
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.extension.overriding
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowInsetsCallback
import org.mariotaku.twidere.model.DefaultFeatures
@ -98,14 +96,10 @@ open class BaseActivity : ChameleonActivity(), IBaseActivity<BaseActivity>, IThe
@Inject
lateinit var readStateManager: ReadStateManager
@Inject
lateinit var bus: Bus
@Inject
lateinit var preferences: SharedPreferences
@Inject
lateinit var notificationManager: NotificationManagerWrapper
@Inject
lateinit var userColorNameManager: UserColorNameManager
@Inject
lateinit var permissionsManager: PermissionsManager
@Inject
lateinit var extraFeaturesService: ExtraFeaturesService
@ -128,9 +122,6 @@ open class BaseActivity : ChameleonActivity(), IBaseActivity<BaseActivity>, IThe
@Inject
lateinit var dataSyncProvider: DataSyncProvider
lateinit var requestManager: RequestManager
private set
protected val isDialogTheme: Boolean
get() = ThemeUtils.getBooleanFromAttribute(this, R.attr.isDialogTheme)
@ -241,8 +232,8 @@ open class BaseActivity : ChameleonActivity(), IBaseActivity<BaseActivity>, IThe
override fun onCreate(savedInstanceState: Bundle?) {
if (BuildConfig.DEBUG) {
StrictModeUtils.detectAllVmPolicy()
StrictModeUtils.detectAllThreadPolicy()
StrictModeUtils.detectVmPolicies()
StrictModeUtils.detectThreadPolicies()
}
val themeColor = themePreferences[themeColorKey]
val themeResource = getThemeResource(themePreferences, themePreferences[themeKey], themeColor)
@ -252,27 +243,11 @@ open class BaseActivity : ChameleonActivity(), IBaseActivity<BaseActivity>, IThe
onApplyNavigationStyle(themeNavigationStyle, themeColor)
super.onCreate(savedInstanceState)
title = activityLabel
requestManager = Glide.with(this)
ActivitySupport.setTaskDescription(this, TaskDescriptionCompat(title.toString(), null,
ColorUtils.setAlphaComponent(overrideTheme.colorToolbar, 0xFF)))
GeneralComponent.get(this).inject(this)
}
override fun onStart() {
super.onStart()
requestManager.onStart()
}
override fun onStop() {
requestManager.onStop()
super.onStop()
}
override fun onDestroy() {
requestManager.onDestroy()
super.onDestroy()
}
override fun onResume() {
super.onResume()
val adapter = NfcAdapter.getDefaultAdapter(this)

View File

@ -212,7 +212,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
bottomMenuAnimator = ViewAnimator()
bottomMenuAnimator.setupViews()
mediaPreviewAdapter = MediaPreviewAdapter(this, requestManager)
mediaPreviewAdapter = MediaPreviewAdapter(this, Glide.with(this))
mediaPreviewAdapter.listener = object : MediaPreviewAdapter.Listener {
override fun onEditClick(position: Int, holder: MediaPreviewViewHolder) {
attachedMediaPreview.showContextMenuForChild(holder.itemView)
@ -832,11 +832,12 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
val displayDoneIcon = isAccountSelectorVisible
val requestManager = Glide.with(this)
if (single != null) {
accountsCount.text = null
if (displayDoneIcon) {
Glide.clear(accountProfileImage)
requestManager.clear(accountProfileImage)
accountProfileImage.setColorFilter(ThemeUtils.getColorFromAttribute(this,
android.R.attr.colorForeground))
accountProfileImage.scaleType = ImageView.ScaleType.CENTER_INSIDE
@ -852,7 +853,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
} else {
accountsCount.text = accounts.size.toString()
Glide.clear(accountProfileImage)
requestManager.clear(accountProfileImage)
if (displayDoneIcon) {
accountProfileImage.setColorFilter(ThemeUtils.getColorFromAttribute(this,
android.R.attr.colorForeground))
@ -965,14 +966,15 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
if (status.is_retweet && !TextUtils.isEmpty(status.retweeted_by_user_screen_name)) {
status.retweeted_by_user_acct?.addTo(mentions)
}
if (status.is_quote && !TextUtils.isEmpty(status.quoted_user_screen_name)) {
status.quoted_user_acct?.addTo(mentions)
if (status.is_quote && !TextUtils.isEmpty(status.quoted?.user_screen_name)) {
status.quoted?.user_acct?.addTo(mentions)
}
when (statusAccount.type) {
AccountType.FANFOU -> {
addFanfouHtmlToMentions(status.text_unescaped, status.spans, mentions)
if (status.is_quote) {
addFanfouHtmlToMentions(status.quoted_text_unescaped, status.quoted_spans, mentions)
val quoted = status.quoted
if (status.is_quote && quoted!= null) {
addFanfouHtmlToMentions(quoted.text_unescaped, quoted.spans, mentions)
}
}
AccountType.MASTODON -> {
@ -982,11 +984,11 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
status.mentions.filterNot {
it.key == status.account_key || it.screen_name.isNullOrEmpty()
}.mapTo(mentions) { it.getAcct(statusAccount.key) }
mentions.addAll(extractor.extractMentionedScreennames(status.quoted_text_plain))
mentions.addAll(extractor.extractMentionedScreennames(status.quoted?.text_plain))
} else {
mentions.addAll(extractor.extractMentionedScreennames(status.text_plain))
if (status.is_quote) {
mentions.addAll(extractor.extractMentionedScreennames(status.quoted_text_plain))
mentions.addAll(extractor.extractMentionedScreennames(status.quoted?.text_plain))
}
}
}
@ -1146,7 +1148,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
showDefaultLabelAndHint()
return false
}
val replyToName = userColorNameManager.getDisplayName(status)
val replyToName = UserColorNameManager.get(this).getDisplayName(status)
replyLabel.spannable = getString(R.string.label_quote_name_text, replyToName, status.text_unescaped)
replyLabel.visibility = View.VISIBLE
editText.hint = getString(R.string.label_quote_name, replyToName)
@ -1158,7 +1160,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
showDefaultLabelAndHint()
return false
}
val replyToName = userColorNameManager.getDisplayName(status)
val replyToName = UserColorNameManager.get(this).getDisplayName(status)
replyLabel.spannable = getString(R.string.label_reply_name_text, replyToName, status.text_unescaped)
replyLabel.visibility = View.VISIBLE
editText.hint = getString(R.string.label_reply_name, replyToName)
@ -2024,7 +2026,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
private class AccountIconsAdapter(
private val activity: ComposeActivity
) : BaseRecyclerViewAdapter<AccountIconViewHolder>(activity, activity.requestManager) {
) : BaseRecyclerViewAdapter<AccountIconViewHolder>(activity, Glide.with(activity)) {
private val inflater: LayoutInflater = activity.layoutInflater
private val selection: MutableMap<UserKey, Boolean> = HashMap()

View File

@ -99,6 +99,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Messages.Conversations
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.receiver.NotificationReceiver
import org.mariotaku.twidere.service.StreamingService
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback
import org.mariotaku.twidere.util.premium.ExtraFeaturesService
@ -334,7 +335,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
super.onStart()
multiSelectHandler.dispatchOnStart()
AccountManager.get(this).addOnAccountsUpdatedListenerSafe(accountUpdatedListener, updateImmediately = false)
bus.register(this)
BusSingleton.register(this)
readStateManager.registerOnSharedPreferenceChangeListener(readStateChangeListener)
updateUnreadCount()
@ -349,7 +350,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
override fun onStop() {
multiSelectHandler.dispatchOnStop()
readStateManager.unregisterOnSharedPreferenceChangeListener(readStateChangeListener)
bus.unregister(this)
BusSingleton.unregister(this)
AccountManager.get(this).removeOnAccountsUpdatedListenerSafe(accountUpdatedListener)
preferences.edit().putInt(KEY_SAVED_TAB_POSITION, mainPager.currentItem).apply()
dataSyncProvider.newTimelineSyncManager()?.commit()

View File

@ -37,6 +37,7 @@ import android.widget.Toast
import com.bumptech.glide.Glide
import com.bumptech.glide.Priority
import com.bumptech.glide.RequestManager
import com.bumptech.glide.request.RequestOptions
import kotlinx.android.synthetic.main.activity_main.*
import nl.komponents.kovenant.Promise
import org.mariotaku.chameleon.Chameleon
@ -100,12 +101,10 @@ open class MainActivity : ChameleonActivity(), IBaseActivity<MainActivity> {
return@lazy UserTheme.get(this, themePreferences)
}
private lateinit var requestManager: RequestManager
override fun onCreate(savedInstanceState: Bundle?) {
if (BuildConfig.DEBUG) {
StrictModeUtils.detectAllVmPolicy()
StrictModeUtils.detectAllThreadPolicy()
StrictModeUtils.detectVmPolicies()
StrictModeUtils.detectThreadPolicies()
}
val themeColor = themePreferences[themeColorKey]
val themeResource = getThemeResource(themePreferences, themePreferences[themeKey], themeColor)
@ -114,7 +113,6 @@ open class MainActivity : ChameleonActivity(), IBaseActivity<MainActivity> {
}
super.onCreate(savedInstanceState)
GeneralComponent.get(this).inject(this)
requestManager = Glide.with(this)
setContentView(R.layout.activity_main)
if (!preferences[promotionsEnabledKey]) {
@ -175,21 +173,6 @@ open class MainActivity : ChameleonActivity(), IBaseActivity<MainActivity> {
}
}
override fun onStart() {
super.onStart()
requestManager.onStart()
}
override fun onStop() {
requestManager.onStop()
super.onStop()
}
override fun onDestroy() {
requestManager.onDestroy()
super.onDestroy()
}
override fun onPause() {
actionHelper.dispatchOnPause(this)
super.onPause()
@ -246,7 +229,7 @@ open class MainActivity : ChameleonActivity(), IBaseActivity<MainActivity> {
val image = images.firstOrNull() ?: return false
Glide.with(this).load(image.url)
.priority(Priority.HIGH)
.apply(RequestOptions.priorityOf(Priority.HIGH))
.into(presentationView)
return true
}

View File

@ -516,7 +516,7 @@ class MediaViewerActivity : BaseActivity(), IMediaViewerActivity, MediaSwipeClos
intent.addCategory(Intent.CATEGORY_OPENABLE)
val extension = fileInfo.extension
val saveFileName = if (extension != null) {
"${fileInfo.name?.removeSuffix("_$extension")}.$extension"
"${fileInfo.name.removeSuffix("_$extension")}.$extension"
} else {
fileInfo.name
}

View File

@ -12,6 +12,7 @@ import android.view.*
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager
import kotlinx.android.synthetic.main.activity_premium_dashboard.*
import kotlinx.android.synthetic.main.adapter_item_extra_feature_normal.view.*
@ -48,7 +49,7 @@ class PremiumDashboardActivity : BaseActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_premium_dashboard)
adapter = ControllersAdapter(this, requestManager)
adapter = ControllersAdapter(this, Glide.with(this))
recyclerView.adapter = adapter
recyclerView.layoutManager = LinearLayoutManager(this)
if (extraFeaturesService.isSupported()) {

View File

@ -25,7 +25,6 @@ import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.database.Cursor
import android.graphics.PorterDuff.Mode
import android.net.Uri
import android.os.Bundle
import android.support.v4.app.LoaderManager.LoaderCallbacks
@ -43,6 +42,7 @@ import android.view.inputmethod.InputMethodManager
import android.widget.*
import android.widget.AdapterView.OnItemClickListener
import android.widget.AdapterView.OnItemSelectedListener
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.activity_quick_search_bar.*
import org.mariotaku.kpreferences.get
import org.mariotaku.ktextension.empty
@ -66,11 +66,8 @@ import org.mariotaku.twidere.model.SuggestionItem
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.provider.TwidereDataStore.SearchHistory
import org.mariotaku.twidere.provider.TwidereDataStore.Suggestions
import org.mariotaku.twidere.util.EditTextEnterHandler
import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.EditTextEnterHandler.EnterListener
import org.mariotaku.twidere.util.IntentUtils
import org.mariotaku.twidere.util.KeyboardShortcutsHandler
import org.mariotaku.twidere.util.SwipeDismissListViewTouchListener
import org.mariotaku.twidere.util.promotion.PromotionService
import org.mariotaku.twidere.view.ProfileImageView
@ -100,7 +97,7 @@ class QuickSearchBarActivity : BaseActivity(), OnClickListener, LoaderCallbacks<
val am = AccountManager.get(this)
val accounts = am.getAllDetails(am.ownedAccounts, true)
val accountsSpinnerAdapter = AccountsSpinnerAdapter(this, R.layout.spinner_item_account_icon,
R.layout.list_item_simple_user, requestManager = requestManager)
R.layout.list_item_simple_user, requestManager = Glide.with(this))
accountsSpinnerAdapter.accounts = accounts.toList()
accountSpinner.adapter = accountsSpinnerAdapter
accountSpinner.onItemSelectedListener = this
@ -361,9 +358,9 @@ class QuickSearchBarActivity : BaseActivity(), OnClickListener, LoaderCallbacks<
private val profileImageStyle = activity.preferences[profileImageStyleKey]
private val profileImageSize = activity.getString(R.string.profile_image_size)
private val requestManager = activity.requestManager
private val requestManager = Glide.with(activity)
private val inflater = LayoutInflater.from(activity)
private val userColorNameManager = activity.userColorNameManager
private val userColorNameManager = UserColorNameManager.get(activity)
private val removedPositions = ArrayList<Int>()
private var indices: SuggestionItem.Indices? = null

View File

@ -426,24 +426,13 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher,
internal fun onSignInError(exception: Exception) {
DebugLog.w(LOGTAG, "Sign in error", exception)
var errorReason: String? = null
if (exception is AuthenticityTokenException) {
Toast.makeText(this, R.string.message_toast_wrong_api_key, Toast.LENGTH_SHORT).show()
errorReason = "wrong_api_key"
} else if (exception is WrongUserPassException) {
Toast.makeText(this, R.string.message_toast_wrong_username_password, Toast.LENGTH_SHORT).show()
errorReason = "wrong_username_password"
} else if (exception is SignInTask.WrongBasicCredentialException) {
Toast.makeText(this, R.string.message_toast_wrong_username_password, Toast.LENGTH_SHORT).show()
errorReason = "wrong_username_password"
} else if (exception is SignInTask.WrongAPIURLFormatException) {
Toast.makeText(this, R.string.message_toast_wrong_api_key, Toast.LENGTH_SHORT).show()
errorReason = "wrong_api_key"
} else if (exception is LoginVerificationException) {
Toast.makeText(this, R.string.message_toast_login_verification_failed, Toast.LENGTH_SHORT).show()
errorReason = "login_verification_failed"
} else {
Toast.makeText(this, exception.getErrorMessage(this), Toast.LENGTH_SHORT).show()
when (exception) {
is AuthenticityTokenException -> Toast.makeText(this, R.string.message_toast_wrong_api_key, Toast.LENGTH_SHORT).show()
is WrongUserPassException -> Toast.makeText(this, R.string.message_toast_wrong_username_password, Toast.LENGTH_SHORT).show()
is SignInTask.WrongBasicCredentialException -> Toast.makeText(this, R.string.message_toast_wrong_username_password, Toast.LENGTH_SHORT).show()
is SignInTask.WrongAPIURLFormatException -> Toast.makeText(this, R.string.message_toast_wrong_api_key, Toast.LENGTH_SHORT).show()
is LoginVerificationException -> Toast.makeText(this, R.string.message_toast_login_verification_failed, Toast.LENGTH_SHORT).show()
else -> Toast.makeText(this, exception.getErrorMessage(this), Toast.LENGTH_SHORT).show()
}
}

View File

@ -28,6 +28,7 @@ import android.support.v4.content.Loader
import android.view.View
import android.widget.AdapterView.OnItemClickListener
import android.widget.TextView
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.layout_list_with_empty_view.*
import org.mariotaku.ktextension.Bundle
import org.mariotaku.ktextension.contains
@ -39,6 +40,7 @@ import org.mariotaku.twidere.annotation.LoadMorePosition
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.extension.accountKey
import org.mariotaku.twidere.extension.adapter.all
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.extension.userKey
import org.mariotaku.twidere.loader.iface.IPaginationLoader
import org.mariotaku.twidere.loader.userlists.UserListOwnershipsLoader
@ -46,6 +48,7 @@ import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.ParcelableUserList
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.pagination.Pagination
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.ContentScrollHandler
import org.mariotaku.twidere.util.ListViewScrollHandler
@ -86,7 +89,7 @@ class UserListSelectorActivity : BaseActivity(),
}
setContentView(R.layout.activity_user_list_selector)
adapter = SimpleParcelableUserListsAdapter(this, requestManager)
adapter = SimpleParcelableUserListsAdapter(this, Glide.with(this))
adapter.loadMoreSupportedPosition = LoadMorePosition.END
listView.addFooterView(layoutInflater.inflate(R.layout.simple_list_item_activated_1,
listView, false).apply {
@ -127,11 +130,11 @@ class UserListSelectorActivity : BaseActivity(),
override fun onStart() {
super.onStart()
bus.register(this)
BusSingleton.register(this)
}
override fun onStop() {
bus.unregister(this)
BusSingleton.unregister(this)
super.onStop()
}

View File

@ -27,6 +27,7 @@ import android.view.View
import android.widget.AdapterView
import android.widget.AdapterView.OnItemClickListener
import android.widget.ListView
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.activity_user_selector.*
import kotlinx.android.synthetic.main.layout_list_with_empty_view.*
import kotlinx.android.synthetic.main.layout_toolbar_search.*
@ -86,7 +87,7 @@ class UserSelectorActivity : BaseActivity(), OnItemClickListener {
if (savedInstanceState == null) {
editScreenName.setText(intent.getStringExtra(EXTRA_SCREEN_NAME))
}
adapter = SimpleParcelableUsersAdapter(this, requestManager = requestManager)
adapter = SimpleParcelableUsersAdapter(this, requestManager = Glide.with(this))
listView.adapter = adapter
listView.onItemClickListener = this

View File

@ -32,9 +32,11 @@ import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter
import org.mariotaku.twidere.annotation.LoadMorePosition
import org.mariotaku.twidere.constant.*
import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.model.ItemCounts
import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.MultiSelectManager
import org.mariotaku.twidere.util.OnLinkClickHandler
import org.mariotaku.twidere.util.PermissionsManager
import org.mariotaku.twidere.util.TwidereLinkify
import javax.inject.Inject
open class BaseArrayAdapter<T>(
@ -46,8 +48,6 @@ open class BaseArrayAdapter<T>(
IItemCountsAdapter {
val linkify: TwidereLinkify
@Inject
override lateinit var userColorNameManager: UserColorNameManager
@Inject
override lateinit var bidiFormatter: BidiFormatter
@Inject

View File

@ -32,25 +32,18 @@ import org.mariotaku.twidere.constant.profileImageStyleKey
import org.mariotaku.twidere.constant.showAbsoluteTimeKey
import org.mariotaku.twidere.constant.textSizeKey
import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.model.DefaultFeatures
import org.mariotaku.twidere.util.MultiSelectManager
import org.mariotaku.twidere.util.ReadStateManager
import org.mariotaku.twidere.util.UserColorNameManager
import javax.inject.Inject
/**
* Created by mariotaku on 15/10/5.
*/
abstract class BaseRecyclerViewAdapter<VH : RecyclerView.ViewHolder>(
val context: Context,
override val requestManager: RequestManager
) : RecyclerView.Adapter<VH>(), IContentAdapter {
@Inject
override final lateinit var userColorNameManager: UserColorNameManager
@Inject
override final lateinit var bidiFormatter: BidiFormatter
override lateinit var bidiFormatter: BidiFormatter
@Inject
lateinit var preferences: SharedPreferences
@Inject
@ -60,11 +53,11 @@ abstract class BaseRecyclerViewAdapter<VH : RecyclerView.ViewHolder>(
@Inject
lateinit var defaultFeatures: DefaultFeatures
override final val profileImageSize: String = context.getString(R.string.profile_image_size)
override final val profileImageStyle: Int
override final val textSize: Float
override final val profileImageEnabled: Boolean
override final val showAbsoluteTime: Boolean
final override val profileImageSize: String = context.getString(R.string.profile_image_size)
final override val profileImageStyle: Int
final override val textSize: Float
final override val profileImageEnabled: Boolean
final override val showAbsoluteTime: Boolean
init {
@Suppress("UNCHECKED_CAST")

View File

@ -36,7 +36,6 @@ import org.mariotaku.twidere.constant.displayProfileImageKey
import org.mariotaku.twidere.constant.profileImageStyleKey
import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.appendQueryParameterIgnoreNull
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.extension.loadProfileImage
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.SuggestionItem
@ -52,6 +51,7 @@ class ComposeAutoCompleteAdapter(context: Context, val requestManager: RequestMa
@Inject
lateinit var preferences: SharedPreferences
@Inject
@Deprecated(message = "Deprecated", replaceWith = ReplaceWith("UserColorNameManager.get(context!!)", imports = ["org.mariotaku.twidere.util.UserColorNameManager"]))
lateinit var userColorNameManager: UserColorNameManager
var account: AccountDetails? = null
@ -78,7 +78,7 @@ class ComposeAutoCompleteAdapter(context: Context, val requestManager: RequestMa
if (Suggestions.AutoComplete.TYPE_USERS == cursor.getString(indices.type)) {
val userKey = UserKey.valueOf(cursor.getString(indices.extra_id))
text1.spannable = userColorNameManager.getUserNickname(userKey,
text1.spannable = UserColorNameManager.get(context).getUserNickname(userKey,
cursor.getString(indices.title))
val screenName = cursor.getString(indices.summary)
text2.spannable = "@${getScreenNameOrAcct(screenName, userKey)}"

View File

@ -14,11 +14,9 @@ import org.mariotaku.twidere.adapter.iface.IUserListsAdapter
import org.mariotaku.twidere.adapter.iface.IUsersAdapter
import org.mariotaku.twidere.constant.*
import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.extension.model.activityStatus
import org.mariotaku.twidere.model.*
import org.mariotaku.twidere.util.TwidereLinkify
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder
import javax.inject.Inject
@ -35,8 +33,6 @@ class DummyItemAdapter(
@Inject
lateinit var preferences: SharedPreferences
@Inject
override lateinit var userColorNameManager: UserColorNameManager
@Inject
override lateinit var bidiFormatter: BidiFormatter
override var profileImageSize: String = context.getString(R.string.profile_image_size)

View File

@ -31,7 +31,7 @@ import org.mariotaku.twidere.util.content.TwidereSQLiteOpenHelper
class SourceAutoCompleteAdapter(context: Context) : SimpleCursorAdapter(context,
android.R.layout.simple_list_item_1, null, emptyArray<String>(), IntArray(0), 0) {
private val database = TwidereSQLiteOpenHelper.getInstance(context).singletonWritableDatabase
private val database = TwidereSQLiteOpenHelper.get(context).singletonWritableDatabase
private var sourceIdx: Int = 0

View File

@ -28,6 +28,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.Space
import android.widget.TextView
import com.bumptech.glide.Glide
import org.mariotaku.kpreferences.get
import org.mariotaku.ktextension.contains
import org.mariotaku.microblog.library.model.twitter.TranslationResult
@ -53,7 +54,7 @@ import org.mariotaku.twidere.view.holder.status.DetailStatusViewHolder
class StatusDetailsAdapter(
val fragment: StatusFragment
) : LoadMoreSupportAdapter<RecyclerView.ViewHolder>(fragment.context!!, fragment.requestManager),
) : LoadMoreSupportAdapter<RecyclerView.ViewHolder>(fragment.context!!, Glide.with(fragment)),
IStatusesAdapter, IItemCountsAdapter {
override val twidereLinkify: TwidereLinkify

View File

@ -26,8 +26,6 @@ import org.mariotaku.twidere.util.UserColorNameManager
interface IContentAdapter {
val userColorNameManager: UserColorNameManager
fun getItemCount(): Int
@ImageShapeStyle

View File

@ -28,7 +28,6 @@ import android.content.res.Resources
import android.net.ConnectivityManager
import android.os.AsyncTask
import android.support.multidex.MultiDex
import com.bumptech.glide.Glide
import nl.komponents.kovenant.android.startKovenant
import nl.komponents.kovenant.android.stopKovenant
import org.mariotaku.kpreferences.get
@ -41,7 +40,6 @@ import org.mariotaku.twidere.activity.MainHondaJOJOActivity
import org.mariotaku.twidere.constant.*
import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.firstLanguage
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.extension.setLocale
import org.mariotaku.twidere.promise.DefaultFeaturesPromises
import org.mariotaku.twidere.receiver.ConnectivityStateReceiver
@ -82,7 +80,7 @@ class TwidereApplication : Application(), OnSharedPreferenceChangeListener {
override fun onCreate() {
instance = this
if (BuildConfig.DEBUG) {
StrictModeUtils.detectAllVmPolicy()
StrictModeUtils.detectVmPolicies()
}
super.onCreate()
applyLanguageSettings()
@ -115,16 +113,6 @@ class TwidereApplication : Application(), OnSharedPreferenceChangeListener {
super.onConfigurationChanged(newConfig)
}
override fun onTrimMemory(level: Int) {
Glide.with(this).onTrimMemory(level)
super.onTrimMemory(level)
}
override fun onLowMemory() {
Glide.with(this).onLowMemory()
super.onLowMemory()
}
override fun onSharedPreferenceChanged(preferences: SharedPreferences, key: String) {
when (key) {
KEY_CREDENTIALS_TYPE, KEY_API_URL_FORMAT, KEY_CONSUMER_KEY, KEY_CONSUMER_SECRET,
@ -153,8 +141,8 @@ class TwidereApplication : Application(), OnSharedPreferenceChangeListener {
}
private fun applyLanguageSettings() {
val locale = sharedPreferences[overrideLanguageKey] ?: Resources.getSystem().
firstLanguage ?: return
val locale = sharedPreferences[overrideLanguageKey] ?: Resources.getSystem().firstLanguage
?: return
resources.setLocale(locale)
}

View File

@ -26,7 +26,6 @@ import okhttp3.ConnectionPool
import okhttp3.Dns
import org.mariotaku.restfu.http.RestHttpClient
import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.model.DefaultFeatures
import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.media.MediaPreloader
@ -69,6 +68,7 @@ class DependencyHolder internal constructor(context: Context) {
lateinit var mediaPreloader: MediaPreloader
internal set
@Inject
@Deprecated(message = "Deprecated", replaceWith = ReplaceWith("UserColorNameManager.get(context", imports = ["org.mariotaku.twidere.util.UserColorNameManager"]))
lateinit var userColorNameManager: UserColorNameManager
internal set
@Inject

View File

@ -28,7 +28,6 @@ import org.mariotaku.twidere.dagger.DependencyHolder
import org.mariotaku.twidere.dagger.module.ApplicationModule
import org.mariotaku.twidere.dagger.module.ChannelModule
import org.mariotaku.twidere.data.user.UserLiveData
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.fragment.BaseDialogFragment
import org.mariotaku.twidere.fragment.BaseFragment
import org.mariotaku.twidere.fragment.BasePreferenceFragment
@ -132,10 +131,6 @@ interface GeneralComponent {
fun inject(activity: MainActivity)
fun inject(promises: MessagePromises)
fun inject(promises: StatusPromises)
fun inject(promises: FriendshipPromises)
fun inject(promises: BlockPromises)
@ -172,15 +167,13 @@ interface GeneralComponent {
fun inject(promises: UserListPromises)
fun inject(promises: SavedSearchPromises)
fun inject(promises: RefreshPromises)
fun inject(liveData: UserLiveData)
fun inject(adapter: AccountSelectorAdapter)
companion object : ApplicationContextSingletonHolder<GeneralComponent>(creation@ { application ->
companion object : ApplicationContextSingletonHolder<GeneralComponent>(creation@{ application ->
return@creation DaggerGeneralComponent.builder()
.applicationModule(ApplicationModule.get(application))
.channelModule(ChannelModule.get(application))

View File

@ -31,8 +31,6 @@ import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSourceFactory
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory
import com.google.android.exoplayer2.extractor.ExtractorsFactory
import com.google.android.exoplayer2.upstream.DataSource
import com.squareup.otto.Bus
import com.squareup.otto.ThreadEnforcer
import com.twitter.Extractor
import dagger.Module
import dagger.Provides
@ -49,8 +47,10 @@ import org.mariotaku.twidere.Constants.*
import org.mariotaku.twidere.constant.SharedPreferenceConstants.KEY_CACHE_SIZE_LIMIT
import org.mariotaku.twidere.constant.autoRefreshCompatibilityModeKey
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.extension.model.load
import org.mariotaku.twidere.model.DefaultFeatures
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.taskcontroller.refresh.JobSchedulerRefreshTaskController
import org.mariotaku.twidere.taskcontroller.refresh.LegacyRefreshTaskController
import org.mariotaku.twidere.taskcontroller.refresh.RefreshTaskController
@ -81,10 +81,6 @@ class ApplicationModule(private val application: Application) {
}
}
@Provides
@Singleton
fun bus(): Bus = Bus(ThreadEnforcer.MAIN)
@Provides
@Singleton
fun keyboardShortcutsHandler(): KeyboardShortcutsHandler {
@ -297,8 +293,8 @@ class ApplicationModule(private val application: Application) {
@Provides
@Singleton
fun taskCreator(preferences: SharedPreferences, activityTracker: ActivityTracker,
dataSyncProvider: DataSyncProvider, bus: Bus): TaskServiceRunner {
return TaskServiceRunner(application, preferences, activityTracker, dataSyncProvider, bus)
dataSyncProvider: DataSyncProvider): TaskServiceRunner {
return TaskServiceRunner(application, preferences, activityTracker, dataSyncProvider, BusSingleton)
}
@Provides

View File

@ -20,11 +20,12 @@
package org.mariotaku.twidere.extension
import android.content.Context
import com.bumptech.glide.DrawableRequestBuilder
import com.bumptech.glide.DrawableTypeRequest
import android.graphics.drawable.Drawable
import com.bumptech.glide.RequestBuilder
import com.bumptech.glide.RequestManager
import com.bumptech.glide.load.engine.DiskCacheStrategy
import jp.wasabeef.glide.transformations.CropCircleTransformation
import com.bumptech.glide.load.resource.bitmap.CircleCrop
import com.bumptech.glide.request.RequestOptions
import org.mariotaku.twidere.R
import org.mariotaku.twidere.annotation.ImageShapeStyle
import org.mariotaku.twidere.extension.model.getBestProfileBanner
@ -35,8 +36,8 @@ import org.mariotaku.twidere.util.Utils
import org.mariotaku.twidere.util.glide.RoundedRectTransformation
fun RequestManager.loadProfileImage(context: Context, url: String?, @ImageShapeStyle style: Int,
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, size: String? = null): DrawableRequestBuilder<String?> {
return configureLoadProfileImage(context, style, cornerRadius, cornerRadiusRatio) {
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, size: String? = null): RequestBuilder<Drawable> {
return configureLoadProfileImage(style, cornerRadius, cornerRadiusRatio) {
if (url == null || size == null) {
return@configureLoadProfileImage load(url)
} else {
@ -46,23 +47,25 @@ fun RequestManager.loadProfileImage(context: Context, url: String?, @ImageShapeS
}
fun RequestManager.loadProfileImage(context: Context, resourceId: Int, @ImageShapeStyle shapeStyle: Int,
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f): DrawableRequestBuilder<Int> {
return configureLoadProfileImage(context, shapeStyle, cornerRadius, cornerRadiusRatio) { load(resourceId) }
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f): RequestBuilder<Drawable> {
return configureLoadProfileImage(shapeStyle, cornerRadius, cornerRadiusRatio) {
return@configureLoadProfileImage load(resourceId)
}
}
fun RequestManager.loadProfileImage(context: Context, account: AccountDetails, @ImageShapeStyle shapeStyle: Int,
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, size: String? = null): DrawableRequestBuilder<String?> {
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, size: String? = null): RequestBuilder<Drawable> {
return loadProfileImage(context, account.user, shapeStyle, cornerRadius, cornerRadiusRatio, size)
}
fun RequestManager.loadProfileImage(context: Context, user: ParcelableUser, @ImageShapeStyle shapeStyle: Int,
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, size: String? = null): DrawableRequestBuilder<String?> {
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, size: String? = null): RequestBuilder<Drawable> {
if (user.extras != null && user.extras?.profile_image_url_fallback == null) {
// No fallback image, use compatible logic
return loadProfileImage(context, user.profile_image_url, shapeStyle, cornerRadius,
cornerRadiusRatio, size)
}
return configureLoadProfileImage(context, shapeStyle, cornerRadius, cornerRadiusRatio) {
return configureLoadProfileImage(shapeStyle, cornerRadius, cornerRadiusRatio) {
if (size != null) {
return@configureLoadProfileImage load(Utils.getTwitterProfileImageOfSize(user.profile_image_url, size))
} else {
@ -72,8 +75,8 @@ fun RequestManager.loadProfileImage(context: Context, user: ParcelableUser, @Ima
}
fun RequestManager.loadProfileImage(context: Context, user: ParcelableLiteUser, @ImageShapeStyle shapeStyle: Int,
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, size: String? = null): DrawableRequestBuilder<String?> {
return configureLoadProfileImage(context, shapeStyle, cornerRadius, cornerRadiusRatio) {
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, size: String? = null): RequestBuilder<Drawable> {
return configureLoadProfileImage(shapeStyle, cornerRadius, cornerRadiusRatio) {
if (size != null) {
return@configureLoadProfileImage load(Utils.getTwitterProfileImageOfSize(user.profile_image_url, size))
} else {
@ -84,35 +87,35 @@ fun RequestManager.loadProfileImage(context: Context, user: ParcelableLiteUser,
fun RequestManager.loadProfileImage(context: Context, userList: ParcelableUserList,
@ImageShapeStyle shapeStyle: Int,
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f): DrawableRequestBuilder<String?> {
return configureLoadProfileImage(context, shapeStyle, cornerRadius, cornerRadiusRatio) {
load(userList.user_profile_image_url)
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f): RequestBuilder<Drawable> {
return configureLoadProfileImage(shapeStyle, cornerRadius, cornerRadiusRatio) {
return@configureLoadProfileImage load(userList.user_profile_image_url)
}
}
fun RequestManager.loadProfileImage(context: Context, group: ParcelableGroup,
@ImageShapeStyle shapeStyle: Int,
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f): DrawableRequestBuilder<String?> {
return configureLoadProfileImage(context, shapeStyle, cornerRadius, cornerRadiusRatio) {
load(group.homepage_logo)
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f): RequestBuilder<Drawable> {
return configureLoadProfileImage(shapeStyle, cornerRadius, cornerRadiusRatio) {
return@configureLoadProfileImage load(group.homepage_logo)
}
}
fun RequestManager.loadProfileImage(context: Context, status: ParcelableStatus, @ImageShapeStyle shapeStyle: Int,
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, size: String? = null): DrawableRequestBuilder<String?> {
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, size: String? = null): RequestBuilder<Drawable> {
if (status.extras?.user_profile_image_url_fallback == null) {
// No fallback image, use compatible logic
return loadProfileImage(context, status.user_profile_image_url, shapeStyle, cornerRadius,
cornerRadiusRatio, size)
}
return configureLoadProfileImage(context, shapeStyle, cornerRadius, cornerRadiusRatio) {
load(status.user_profile_image_url)
return configureLoadProfileImage(shapeStyle, cornerRadius, cornerRadiusRatio) {
return@configureLoadProfileImage load(status.user_profile_image_url)
}
}
fun RequestManager.loadProfileImage(context: Context, conversation: ParcelableMessageConversation,
@ImageShapeStyle shapeStyle: Int, cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f,
size: String? = null): DrawableRequestBuilder<*> {
size: String? = null): RequestBuilder<*> {
if (conversation.conversation_type == ParcelableMessageConversation.ConversationType.ONE_TO_ONE) {
val user = conversation.user
if (user != null) {
@ -135,35 +138,32 @@ fun RequestManager.loadProfileImage(context: Context, conversation: ParcelableMe
fun RequestManager.loadOriginalProfileImage(context: Context, user: ParcelableUser,
@ImageShapeStyle shapeStyle: Int, cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f
): DrawableRequestBuilder<String> {
return configureLoadProfileImage(context, shapeStyle, cornerRadius, cornerRadiusRatio) {
load(user.originalProfileImage)
): RequestBuilder<Drawable> {
return configureLoadProfileImage(shapeStyle, cornerRadius, cornerRadiusRatio) {
return@configureLoadProfileImage load(user.originalProfileImage)
}
}
fun RequestManager.loadProfileBanner(context: Context, user: ParcelableUser, width: Int): DrawableTypeRequest<String?> {
fun RequestManager.loadProfileBanner(context: Context, user: ParcelableUser, width: Int): RequestBuilder<Drawable> {
val ratio = context.resources.getFraction(R.fraction.aspect_ratio_profile_banner, 1, 1)
return load(user.getBestProfileBanner(width, (width / ratio).toInt()))
}
internal inline fun <T> configureLoadProfileImage(context: Context, @ImageShapeStyle shapeStyle: Int,
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, create: () -> DrawableTypeRequest<T>
): DrawableRequestBuilder<T> {
internal inline fun <T> configureLoadProfileImage(@ImageShapeStyle shapeStyle: Int, cornerRadius: Float = 0f,
cornerRadiusRatio: Float = 0f, create: () -> RequestBuilder<T>
): RequestBuilder<T> {
val builder = create()
builder.diskCacheStrategy(DiskCacheStrategy.RESULT)
builder.centerCrop()
builder.dontAnimate()
val requestOptions = RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.DATA).dontAnimate().centerCrop()
when (shapeStyle) {
ImageShapeStyle.SHAPE_CIRCLE -> {
builder.bitmapTransform(CropCircleTransformation(context))
requestOptions.transform(CircleCrop())
}
ImageShapeStyle.SHAPE_RECTANGLE -> {
builder.bitmapTransform(RoundedRectTransformation(context, cornerRadius,
cornerRadiusRatio))
requestOptions.transform(RoundedRectTransformation(cornerRadius, cornerRadiusRatio))
}
ImageShapeStyle.SHAPE_NONE -> {
// No-op
}
}
return builder
return builder.apply(requestOptions)
}

View File

@ -21,4 +21,4 @@ package org.mariotaku.twidere.extension
import org.mariotaku.twidere.util.lang.SingletonHolder
fun <T, A> SingletonHolder<T, A>.get(arg: A): T = getInstance(arg)
fun <T> SingletonHolder<T, Unit>.get(): T = get(Unit)

View File

@ -50,15 +50,15 @@ fun View.getFrame(rect: Rect) {
@UiThread
fun View.getFrameRelatedTo(rect: Rect, other: View? = null) {
this.getFrame(rect)
if (other == null) {
offsetToRoot(this, rect)
} else if (other === this) {
rect.offsetTo(0, 0)
} else if (other !== parent) {
offsetToRoot(this, rect)
other.getFrame(tempRect)
offsetToRoot(other, tempRect)
rect.offset(-tempRect.left, -tempRect.top)
when {
other == null -> offsetToRoot(this, rect)
other === this -> rect.offsetTo(0, 0)
other !== parent -> {
offsetToRoot(this, rect)
other.getFrame(tempRect)
offsetToRoot(other, tempRect)
rect.offset(-tempRect.left, -tempRect.top)
}
}
}
@ -158,6 +158,18 @@ fun View.findViewByText(text: CharSequence?): TextView? {
return null
}
fun <T : View> View.findViewByType(cls: Class<T>): T? {
@Suppress("UNCHECKED_CAST")
if (cls.isAssignableFrom(javaClass)) return this as T?
if (this is ViewGroup) {
for (i in 0 until childCount) {
val found = getChildAt(i).findViewByType(cls)
if (found != null) return found
}
}
return null
}
private fun offsetToRoot(view: View, rect: Rect) {
var parent = view.parent as? View
while (parent != null) {

View File

@ -0,0 +1,141 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2018 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.extension.model
import org.mariotaku.twidere.model.HomeTab
import org.mariotaku.twidere.model.tab.argument.TabArguments
import org.mariotaku.twidere.model.tab.argument.TextQueryArguments
import org.mariotaku.twidere.model.tab.argument.UserArguments
import org.mariotaku.twidere.model.tab.argument.UserListArguments
import org.mariotaku.twidere.model.tab.extra.InteractionsTabExtras
import org.mariotaku.twidere.model.tab.extra.TimelineTabExtras
import org.mariotaku.twidere.model.tab.extra.TrendsTabExtras
import org.xmlpull.v1.XmlPullParser
import org.xmlpull.v1.XmlSerializer
fun HomeTab.serialize(serializer: XmlSerializer) {
serializer.startTag(null, "tab")
serializer.attribute(null, "type", type)
serializer.writeNonEmptyStringTag("name", name)
serializer.writeNonEmptyStringTag("icon", icon)
val arguments = this.arguments
val extras = this.extras
when (arguments) {
is UserArguments -> serializer.serializeUserArguments(arguments)
is UserListArguments -> serializer.serializeUserListArguments(arguments)
is TextQueryArguments -> serializer.serializeTextQueryArguments(arguments)
is TabArguments -> serializer.serializeBaseArguments(arguments)
}
when (extras) {
is TimelineTabExtras -> serializer.serializeTimelineTabExtras(extras)
is InteractionsTabExtras -> serializer.serializeInteractionsTabExtras(extras)
is TrendsTabExtras -> serializer.serializeTrendsTabExtras(extras)
}
serializer.endTag(null, "tab")
}
fun HomeTab.parse(parser: XmlPullParser) {
for (i in 0 until parser.attributeCount) {
when (parser.getAttributeName(i)) {
"type" -> type = parser.getAttributeValue(i)
}
}
}
private fun XmlSerializer.writeNonEmptyStringTag(name: String, value: String?) {
if (value.isNullOrEmpty()) return
startTag(null, name)
text(value)
endTag(null, name)
}
private fun XmlSerializer.writeBaseArgumentsFields(arguments: TabArguments) {
val keys = arguments.accountKeys
val id = arguments.accountId
if (keys != null) {
startTag(null, "accountKeys")
keys.forEach {
writeNonEmptyStringTag("item", it.toString())
}
endTag(null, "accountKeys")
} else if (id != null) {
startTag(null, "accountKeys")
writeNonEmptyStringTag("item", id)
endTag(null, "accountKeys")
}
}
private fun XmlSerializer.serializeUserArguments(arguments: UserArguments) {
startTag(null, "arguments")
attribute(null, "type", "user")
writeBaseArgumentsFields(arguments)
writeNonEmptyStringTag("userKey", arguments.userKey?.toString() ?: arguments.userId)
endTag(null, "arguments")
}
private fun XmlSerializer.serializeBaseArguments(arguments: TabArguments) {
startTag(null, "arguments")
writeBaseArgumentsFields(arguments)
endTag(null, "arguments")
}
private fun XmlSerializer.serializeUserListArguments(arguments: UserListArguments) {
startTag(null, "arguments")
attribute(null, "type", "userList")
writeBaseArgumentsFields(arguments)
writeNonEmptyStringTag("listId", arguments.listId)
endTag(null, "arguments")
}
private fun XmlSerializer.serializeTextQueryArguments(arguments: TextQueryArguments) {
startTag(null, "arguments")
attribute(null, "type", "textQuery")
writeBaseArgumentsFields(arguments)
writeNonEmptyStringTag("query", arguments.query)
endTag(null, "arguments")
}
private fun XmlSerializer.serializeTimelineTabExtras(extras: TimelineTabExtras) {
startTag(null, "extras")
attribute(null, "type", "timeline")
writeNonEmptyStringTag("style", extras.timelineStyle.toString())
endTag(null, "extras")
}
private fun XmlSerializer.serializeInteractionsTabExtras(extras: InteractionsTabExtras) {
startTag(null, "extras")
attribute(null, "type", "interactions")
writeNonEmptyStringTag("mentionsOnly", extras.isMentionsOnly.toString())
writeNonEmptyStringTag("myFollowingOnly", extras.isMyFollowingOnly.toString())
endTag(null, "extras")
}
private fun XmlSerializer.serializeTrendsTabExtras(extras: TrendsTabExtras) {
startTag(null, "extras")
attribute(null, "type", "trends")
writeNonEmptyStringTag("placeName", extras.placeName)
writeNonEmptyStringTag("woeId", extras.woeId.toString())
endTag(null, "extras")
}

View File

@ -6,9 +6,6 @@ import org.mariotaku.twidere.model.ParcelableMedia
import org.mariotaku.twidere.model.util.ParcelableMediaUtils
import org.mariotaku.twidere.util.promotion.PromotionService
/**
* Created by mariotaku on 2017/1/7.
*/
fun parcelableMediaTypeString(@ParcelableMedia.Type type: Int): String? = when (type) {
ParcelableMedia.Type.IMAGE -> "image"
@ -29,7 +26,8 @@ fun ParcelableMedia.getBestVideoUrlAndType(supportedTypes: Array<String>): Pair<
val videoInfo = video_info ?: return Pair(mediaUrl, null)
val firstMatch = videoInfo.variants.filter { variant ->
supportedTypes.any { it.equals(variant.content_type, ignoreCase = true) }
}.sortedByDescending(ParcelableMedia.VideoInfo.Variant::bitrate).firstOrNull() ?: return null
}.sortedByDescending(ParcelableMedia.VideoInfo.Variant::bitrate).firstOrNull()
?: return null
return Pair(firstMatch.url, firstMatch.content_type)
}
ParcelableMedia.Type.CARD_ANIMATED_GIF -> {
@ -47,12 +45,19 @@ val ParcelableMedia.aspect_ratio: Double
return this.width / this.height.toDouble()
}
val ParcelableMedia.bannerExtras: PromotionService.BannerExtras?
get() {
val contentUrl = this.page_url ?: this.url ?: return null
return PromotionService.BannerExtras(contentUrl)
}
val Array<ParcelableMedia?>.type: Int
get() {
forEach { if (it != null) return it.type }
return 0
}
@ParcelableMedia.Type
val InputContentInfoCompat.inferredMediaType: Int
get() = if (description.mimeTypeCount > 0) {

View File

@ -83,8 +83,7 @@ var ParcelableMessageConversation.notificationDisabled: Boolean
}
}
fun ParcelableMessageConversation.getTitle(context: Context, manager: UserColorNameManager,
nameFirst: Boolean): Pair<String, String?> {
fun ParcelableMessageConversation.getTitle(context: Context, manager: UserColorNameManager): Pair<String, String?> {
if (conversation_type == ConversationType.ONE_TO_ONE) {
val user = this.user ?: return Pair(context.getString(R.string.title_direct_messages), null)
return Pair(user.name, "@${user.screen_name}")

View File

@ -17,7 +17,7 @@ inline val ParcelableStatus.originalId: String
get() = if (is_retweet) (retweet_id ?: id) else id
val ParcelableStatus.media_type: Int
get() = media?.firstOrNull()?.type ?: 0
get() = attachment?.media?.firstOrNull()?.type ?: 0
val ParcelableStatus.user: ParcelableUser
get() = ParcelableUser(account_key, user_key, user_name, user_screen_name, user_profile_image_url)
@ -25,9 +25,10 @@ val ParcelableStatus.user: ParcelableUser
val ParcelableStatus.referencedUsers: Array<ParcelableUser>
get() {
val resultList = mutableSetOf(user)
if (quoted_user_key != null) {
resultList.add(ParcelableUser(account_key, quoted_user_key, quoted_user_name,
quoted_user_screen_name, quoted_user_profile_image))
val quoted = attachment?.quoted
if (quoted != null) {
resultList.add(ParcelableUser(account_key, quoted.user_key, quoted.user_name,
quoted.user_screen_name, quoted.user_profile_image))
}
if (retweeted_by_user_key != null) {
resultList.add(ParcelableUser(account_key, retweeted_by_user_key, retweeted_by_user_name,
@ -66,11 +67,11 @@ inline val ParcelableStatus.retweeted_by_user_acct: String?
"$retweeted_by_user_screen_name@${retweeted_by_user_key?.host}"
}
inline val ParcelableStatus.quoted_user_acct: String?
get() = if (account_key.host == quoted_user_key?.host) {
quoted_user_screen_name
inline val ParcelableStatusAttachment.QuotedStatus.user_acct: String?
get() = if (account_key?.host == user_key?.host) {
user_screen_name
} else {
"$quoted_user_screen_name@${quoted_user_key?.host}"
"$user_screen_name@${user_key?.host}"
}
inline val ParcelableStatus.isAccountRetweet: Boolean
@ -90,25 +91,8 @@ inline val ParcelableStatus.canRetweet: Boolean
}
}
val ParcelableStatus.quoted: ParcelableStatus?
get() {
val obj = ParcelableStatus()
obj.account_key = account_key
obj.id = quoted_id ?: return null
obj.timestamp = quoted_timestamp
obj.user_key = quoted_user_key ?: return null
obj.user_name = quoted_user_name ?: return null
obj.user_screen_name = quoted_user_screen_name ?: return null
obj.user_profile_image_url = quoted_user_profile_image ?: return null
obj.user_is_protected = quoted_user_is_protected
obj.user_is_verified = quoted_user_is_verified
obj.text_plain = quoted_text_plain
obj.text_unescaped = quoted_text_unescaped
obj.source = quoted_source
obj.spans = quoted_spans
obj.media = quoted_media
return obj
}
inline val ParcelableStatus.quoted: ParcelableStatusAttachment.QuotedStatus?
get() = attachment?.quoted
val ParcelableStatus.retweet_sort_id: Long
get() {
@ -162,8 +146,8 @@ fun ParcelableStatus.addFilterFlag(@ParcelableStatus.FilterFlags flags: Long) {
fun ParcelableStatus.updateFilterInfo(descriptions: Collection<String?>?) {
updateContentFilterInfo()
filter_users = setOf(user_key, quoted_user_key, retweeted_by_user_key).filterNotNull().toTypedArray()
filter_names = setOf(user_name, quoted_user_name, retweeted_by_user_name).filterNotNull().toTypedArray()
filter_users = setOf(user_key, quoted?.user_key, retweeted_by_user_key).filterNotNull().toTypedArray()
filter_names = setOf(user_name, quoted?.user_name, retweeted_by_user_name).filterNotNull().toTypedArray()
filter_descriptions = descriptions?.filterNotNull()?.joinToString("\n")
}
@ -171,17 +155,17 @@ fun ParcelableStatus.updateContentFilterInfo() {
filter_links = generateFilterLinks()
filter_texts = generateFilterTexts()
filter_sources = setOf(source?.plainText, quoted_source?.plainText).filterNotNull().toTypedArray()
filter_sources = setOf(source?.plainText, quoted?.source?.plainText).filterNotNull().toTypedArray()
}
fun ParcelableStatus.generateFilterTexts(): String {
val texts = StringBuilder()
texts.appendNonEmptyLine(text_unescaped)
texts.appendNonEmptyLine(quoted_text_unescaped)
media?.forEach { item ->
texts.appendNonEmptyLine(quoted?.text_unescaped)
attachment?.media?.forEach { item ->
texts.appendNonEmptyLine(item.alt_text)
}
quoted_media?.forEach { item ->
quoted?.media?.forEach { item ->
texts.appendNonEmptyLine(item.alt_text)
}
return texts.toString()
@ -193,7 +177,7 @@ fun ParcelableStatus.generateFilterLinks(): Array<String> {
if (span.type != SpanItem.SpanType.LINK) return@mapNotNullTo null
return@mapNotNullTo span.link
}
quoted_spans?.mapNotNullTo(links) { span ->
quoted?.spans?.mapNotNullTo(links) { span ->
if (span.type != SpanItem.SpanType.LINK) return@mapNotNullTo null
return@mapNotNullTo span.link
}

View File

@ -0,0 +1,27 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2018 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.extension.model
import org.mariotaku.twidere.model.HomeTab
import org.mariotaku.twidere.model.Tab
fun Tab.toHomeTab(): HomeTab {
return HomeTab(name, icon, type, position, arguments, extras)
}

View File

@ -30,10 +30,7 @@ import org.mariotaku.microblog.library.model.microblog.ExtendedEntitySupport
import org.mariotaku.microblog.library.model.microblog.MediaEntity
import org.mariotaku.microblog.library.model.microblog.Status
import org.mariotaku.twidere.exception.MalformedResponseException
import org.mariotaku.twidere.extension.model.addFilterFlag
import org.mariotaku.twidere.extension.model.toParcelable
import org.mariotaku.twidere.extension.model.updateContentFilterInfo
import org.mariotaku.twidere.extension.model.updateFilterInfo
import org.mariotaku.twidere.extension.model.*
import org.mariotaku.twidere.extension.toSpanItem
import org.mariotaku.twidere.model.*
import org.mariotaku.twidere.model.util.ParcelableMediaUtils
@ -60,6 +57,7 @@ fun Status.applyTo(accountKey: UserKey, accountType: String, profileImageSize: S
result: ParcelableStatus,
updateFilterInfoAction: (Status, ParcelableStatus) -> Unit = ::updateFilterInfoDefault) {
val extras = ParcelableStatus.Extras()
val attachment = ParcelableStatusAttachment()
result.account_key = accountKey
result.id = id
result.sort_id = sortId
@ -101,44 +99,47 @@ fun Status.applyTo(accountKey: UserKey, accountType: String, profileImageSize: S
result.addFilterFlag(ParcelableStatus.FilterFlags.POSSIBLY_SENSITIVE)
}
val quoted = status.quotedStatus
val quotedStatus = status.quotedStatus
result.is_quote = status.isQuoteStatus
result.quoted_id = status.quotedStatusId
if (quoted != null) {
val quotedUser = quoted.user ?: throw MalformedResponseException()
result.quoted_id = quoted.id
extras.quoted_external_url = quoted.inferredExternalUrl
if (quotedStatus != null) {
val quoted = ParcelableStatusAttachment.QuotedStatus()
val quotedUser = quotedStatus.user ?: throw MalformedResponseException()
quoted.id = quotedStatus.id
quoted.account_key = accountKey
quoted.external_url = quotedStatus.inferredExternalUrl
val quotedText = quoted.htmlText
val quotedText = quotedStatus.htmlText
// Twitter will escape <> to &lt;&gt;, so if a status contains those symbols unescaped
// We should treat this as an html
if (quotedText.isHtml) {
val html = HtmlSpanBuilder.fromHtml(quotedText, quoted.extendedText)
result.quoted_text_unescaped = html?.toString()
result.quoted_text_plain = result.quoted_text_unescaped
result.quoted_spans = html?.spanItems
val html = HtmlSpanBuilder.fromHtml(quotedText, quotedStatus.extendedText)
quoted.text_unescaped = html?.toString()
quoted.text_plain = quoted.text_unescaped
quoted.spans = html?.spanItems
} else {
val textWithIndices = quoted.formattedTextWithIndices()
result.quoted_text_plain = quotedText.twitterUnescaped()
result.quoted_text_unescaped = textWithIndices.text
result.quoted_spans = textWithIndices.spans
val textWithIndices = quotedStatus.formattedTextWithIndices()
quoted.text_plain = quotedText.twitterUnescaped()
quoted.text_unescaped = textWithIndices.text
quoted.spans = textWithIndices.spans
extras.quoted_display_text_range = textWithIndices.range
}
result.quoted_timestamp = quoted.createdAt.time
result.quoted_source = quoted.source
result.quoted_media = ParcelableMediaUtils.fromStatus(quoted, accountKey, accountType)
quoted.timestamp = quotedStatus.createdAt.time
quoted.source = quotedStatus.source
quoted.media = ParcelableMediaUtils.fromStatus(quotedStatus, accountKey, accountType)
result.quoted_user_key = quotedUser.key
result.quoted_user_name = quotedUser.name
result.quoted_user_screen_name = quotedUser.screenName
result.quoted_user_profile_image = quotedUser.getProfileImageOfSize(profileImageSize)
result.quoted_user_is_protected = quotedUser.isProtected
result.quoted_user_is_verified = quotedUser.isVerified
quoted.user_key = quotedUser.key
quoted.user_name = quotedUser.name
quoted.user_screen_name = quotedUser.screenName
quoted.user_profile_image = quotedUser.getProfileImageOfSize(profileImageSize)
quoted.user_is_protected = quotedUser.isProtected
quoted.user_is_verified = quotedUser.isVerified
if (quoted.isPossiblySensitive) {
if (quotedStatus.isPossiblySensitive) {
result.addFilterFlag(ParcelableStatus.FilterFlags.POSSIBLY_SENSITIVE)
}
attachment.quoted = quoted
} else if (status.isQuoteStatus) {
result.addFilterFlag(ParcelableStatus.FilterFlags.QUOTE_NOT_AVAILABLE)
}
@ -177,7 +178,9 @@ fun Status.applyTo(accountKey: UserKey, accountType: String, profileImageSize: S
extras.display_text_range = textWithIndices.range
}
result.media = ParcelableMediaUtils.fromStatus(status, accountKey, accountType)
attachment.media = ParcelableMediaUtils.fromStatus(status, accountKey, accountType)
attachment.card = status.card?.toParcelable(accountKey, accountType)
result.source = status.source
result.location = status.parcelableLocation
result.is_favorite = status.isFavorited
@ -188,13 +191,15 @@ fun Status.applyTo(accountKey: UserKey, accountType: String, profileImageSize: S
}
result.is_possibly_sensitive = status.isPossiblySensitive
result.mentions = status.userMentionEntities?.mapToArray { it.toParcelable(user.host) }
result.card = status.card?.toParcelable(accountKey, accountType)
result.card_name = result.card?.name
result.card_name = result.attachment?.card?.name
result.place_full_name = status.placeFullName
result.lang = status.lang
result.extras = extras
if (result.media.isNotNullOrEmpty() || result.quoted_media.isNotNullOrEmpty()) {
result.attachment = attachment
if (result.attachment?.media.isNotNullOrEmpty() || result.quoted?.media.isNotNullOrEmpty()) {
result.addFilterFlag(ParcelableStatus.FilterFlags.HAS_MEDIA)
}
if (user.isFollowing == false) {
@ -291,8 +296,8 @@ fun updateFilterInfoForUserTimeline(status: Status, result: ParcelableStatus) {
result.updateContentFilterInfo()
if (result.is_retweet) {
result.filter_users = setOf(result.user_key, result.quoted_user_key).filterNotNull().toTypedArray()
result.filter_names = setOf(result.user_name, result.quoted_user_name).filterNotNull().toTypedArray()
result.filter_users = setOf(result.user_key, result.quoted?.user_key).filterNotNull().toTypedArray()
result.filter_names = setOf(result.user_name, result.quoted?.user_name).filterNotNull().toTypedArray()
result.filter_descriptions = setOf(
status.retweetedStatus?.userDescriptionUnescaped,
status.retweetedStatus?.userUrlExpanded,
@ -302,8 +307,8 @@ fun updateFilterInfoForUserTimeline(status: Status, result: ParcelableStatus) {
status.quotedStatus?.userUrlExpanded
).filterNotNull().joinToString("\n")
} else {
result.filter_users = setOf(result.quoted_user_key).filterNotNull().toTypedArray()
result.filter_names = setOf(result.quoted_user_name).filterNotNull().toTypedArray()
result.filter_users = setOf(result.quoted?.user_key).filterNotNull().toTypedArray()
result.filter_names = setOf(result.quoted?.user_name).filterNotNull().toTypedArray()
result.filter_descriptions = setOf(
status.quotedStatus?.userDescriptionUnescaped,
status.quotedStatus?.userLocation,

View File

@ -25,6 +25,7 @@ import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.extension.model.api.isHtml
import org.mariotaku.twidere.extension.model.api.spanItems
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableLiteUser
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.util.HtmlEscapeHelper
@ -42,6 +43,24 @@ fun Account.toParcelable(details: AccountDetails, position: Long = 0,
}
}
fun Account.toLiteParcelable(accountKey: UserKey): ParcelableLiteUser {
val obj = ParcelableLiteUser()
obj.account_key = accountKey
obj.key = getKey(accountKey.host)
obj.name = name
obj.screen_name = username
obj.profile_image_url = avatar
if (note?.isHtml == true) {
val descriptionHtml = HtmlSpanBuilder.fromHtml(note, note, MastodonSpanProcessor())
obj.description_unescaped = descriptionHtml?.toString()
} else {
obj.description_unescaped = note?.let(HtmlEscapeHelper::unescape)
}
obj.url_expanded = url
return obj
}
fun Account.toParcelable(accountKey: UserKey, position: Long = 0,
relationship: Relationship? = null): ParcelableUser {
val obj = ParcelableUser()
@ -81,13 +100,15 @@ fun Account.toParcelable(accountKey: UserKey, position: Long = 0,
extras.muting = relationship.isMuting
extras.blocking = relationship.isBlocking
}
extras.moved = moved?.toLiteParcelable(accountKey)
return obj
}
inline val Account.host: String? get() = acct?.let(UserKey::valueOf)?.host
inline val Account.name: String? get() = displayName?.takeIf(String::isNotEmpty)
?.let(EmojioneTranslator::translate) ?: username
inline val Account.name: String?
get() = displayName?.takeIf(String::isNotEmpty)
?.let(EmojioneTranslator::translate) ?: username
fun Account.getKey(host: String?) = UserKey(id, acct?.let(UserKey::valueOf)?.host ?: host)

View File

@ -54,6 +54,7 @@ fun Status.toParcelable(accountKey: UserKey): ParcelableStatus {
fun Status.applyTo(accountKey: UserKey, result: ParcelableStatus) {
val extras = ParcelableStatus.Extras()
val attachment = ParcelableStatusAttachment()
result.account_key = accountKey
result.id = id
result.sort_id = sortId
@ -104,14 +105,14 @@ fun Status.applyTo(accountKey: UserKey, result: ParcelableStatus) {
result.text_unescaped = html?.toString()
result.text_plain = result.text_unescaped
result.spans = html?.spanItems
result.media = status.mediaAttachments?.mapToArray { it.toParcelable() }
attachment.media = status.mediaAttachments?.mapToArray { it.toParcelable() }
result.source = status.application?.sourceHtml
result.is_favorite = status.isFavourited
result.is_possibly_sensitive = status.isSensitive
result.mentions = status.mentions?.mapToArray { it.toParcelable(accountKey) }
extras.display_text_range = calculateDisplayTextRange(result.text_unescaped, result.spans,
result.media)
result.attachment?.media)
extras.summary_text = status.spoilerText?.let(EmojioneTranslator::translate)
extras.visibility = status.visibility
extras.external_url = status.url
@ -129,11 +130,12 @@ fun Status.applyTo(accountKey: UserKey, result: ParcelableStatus) {
result.in_reply_to_name = inReplyToMention.name
result.in_reply_to_screen_name = inReplyToMention.screen_name
}
if (result.media.isNotNullOrEmpty()) {
if (result.attachment?.media.isNotNullOrEmpty()) {
result.addFilterFlag(ParcelableStatus.FilterFlags.HAS_MEDIA)
}
result.extras = extras
result.attachment = attachment
result.updateFilterInfo(setOf(accountDescriptionUnescaped, reblog?.accountDescriptionUnescaped,
accountUrl, reblog?.accountUrl))

View File

@ -27,6 +27,7 @@ import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener
import android.view.*
import android.widget.AbsListView
import android.widget.ListAdapter
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager
import kotlinx.android.synthetic.main.fragment_content_listview.*
import kotlinx.android.synthetic.main.layout_content_fragment_common.*
@ -132,7 +133,7 @@ abstract class AbsContentListViewFragment<A : ListAdapter> : BaseFragment(),
R.color.bg_refresh_progress_color_light, R.color.bg_refresh_progress_color_dark)
swipeLayout.setOnRefreshListener(this)
swipeLayout.setProgressBackgroundColorSchemeResource(colorRes)
adapter = onCreateAdapter(context!!, requestManager)
adapter = onCreateAdapter(context!!, Glide.with(this))
listView.setOnTouchListener { _, event ->
if (event.actionMasked == MotionEvent.ACTION_DOWN) {
updateRefreshProgressOffset()

View File

@ -26,6 +26,7 @@ import android.support.v4.widget.SwipeRefreshLayout
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.RecyclerView.ItemDecoration
import android.view.*
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager
import kotlinx.android.synthetic.main.fragment_content_recyclerview.*
import kotlinx.android.synthetic.main.layout_content_fragment_common.*
@ -155,7 +156,7 @@ abstract class AbsContentRecyclerViewFragment<A : LoadMoreSupportAdapter<Recycle
R.color.bg_refresh_progress_color_light, R.color.bg_refresh_progress_color_dark)
swipeLayout.setOnRefreshListener(this)
swipeLayout.setProgressBackgroundColorSchemeResource(colorRes)
adapter = onCreateAdapter(context!!, requestManager)
adapter = onCreateAdapter(context!!, Glide.with(this))
layoutManager = onCreateLayoutManager(context!!)
scrollListener = RecyclerViewScrollHandler(this, RecyclerViewScrollHandler.RecyclerViewCallback(recyclerView))

View File

@ -30,6 +30,7 @@ import android.os.Bundle
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.KeyEvent
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager
import com.squareup.otto.Subscribe
import kotlinx.android.synthetic.main.fragment_content_recyclerview.*
@ -57,6 +58,7 @@ import org.mariotaku.twidere.model.event.FriendshipTaskEvent
import org.mariotaku.twidere.promise.BlockPromises
import org.mariotaku.twidere.promise.FriendshipPromises
import org.mariotaku.twidere.promise.MutePromises
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.IntentUtils
import org.mariotaku.twidere.util.KeyboardShortcutsHandler
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback
@ -93,11 +95,11 @@ abstract class AbsUsersFragment : AbsContentListRecyclerViewFragment<ParcelableU
override fun onStart() {
super.onStart()
bus.register(usersBusCallback)
BusSingleton.register(usersBusCallback)
}
override fun onStop() {
bus.unregister(usersBusCallback)
BusSingleton.unregister(usersBusCallback)
super.onStop()
}
@ -106,7 +108,7 @@ abstract class AbsUsersFragment : AbsContentListRecyclerViewFragment<ParcelableU
}
override fun onCreateAdapter(context: Context, requestManager: RequestManager): ParcelableUsersAdapter {
val adapter = ParcelableUsersAdapter(context, this.requestManager)
val adapter = ParcelableUsersAdapter(context, Glide.with(this))
adapter.simpleLayout = simpleLayout
adapter.showFollow = showFollow
val accountType = arguments?.accountKey?.let { key ->
@ -152,7 +154,7 @@ abstract class AbsUsersFragment : AbsContentListRecyclerViewFragment<ParcelableU
if (user.is_following) {
DestroyFriendshipDialogFragment.show(fragmentManager!!, user)
} else {
FriendshipPromises.getInstance(context!!).create(accountKey, user.key, user.screen_name)
FriendshipPromises.get(context!!).create(accountKey, user.key, user.screen_name)
}
}
@ -160,7 +162,7 @@ abstract class AbsUsersFragment : AbsContentListRecyclerViewFragment<ParcelableU
val user = adapter.getUser(position) ?: return
val accountKey = user.account_key ?: return
if (FriendshipPromises.isRunning(accountKey, user.key)) return
BlockPromises.getInstance(context!!).unblock(accountKey, user.key)
BlockPromises.get(context!!).unblock(accountKey, user.key)
}
override fun onUnmuteClicked(holder: UserViewHolder, position: Int) {

View File

@ -51,6 +51,8 @@ import android.view.*
import android.view.View.OnClickListener
import android.view.animation.DecelerateInterpolator
import android.widget.ImageView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import kotlinx.android.synthetic.main.header_drawer_account_selector.view.*
import org.mariotaku.chameleon.Chameleon
import org.mariotaku.kpreferences.get
@ -83,6 +85,7 @@ import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.provider.TwidereDataStore.Drafts
import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback
import org.mariotaku.twidere.util.UserColorNameManager.Companion
import org.mariotaku.twidere.view.holder.AccountProfileImageViewHolder
import org.mariotaku.twidere.view.transformer.AccountsSelectorTransformer
import java.lang.ref.WeakReference
@ -117,7 +120,7 @@ class AccountsDashboardFragment : BaseFragment(), LoaderCallbacks<AccountsInfo>,
@SuppressLint("RestrictedApi")
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
accountsAdapter = AccountSelectorAdapter(context!!, preferences, requestManager).also {
accountsAdapter = AccountSelectorAdapter(context!!, preferences, Glide.with(this)).also {
it.listener = this
}
accountsSelector.adapter = accountsAdapter
@ -161,7 +164,8 @@ class AccountsDashboardFragment : BaseFragment(), LoaderCallbacks<AccountsInfo>,
} else {
when (item.itemId) {
R.id.compose -> {
val account = accountsAdapter.selectedAccount ?: return@OnMenuItemClickListener true
val account = accountsAdapter.selectedAccount
?: return@OnMenuItemClickListener true
val composeIntent = Intent(INTENT_ACTION_COMPOSE)
composeIntent.setClass(activity, ComposeActivity::class.java)
composeIntent.putExtra(EXTRA_ACCOUNT_KEY, account.key)
@ -273,8 +277,7 @@ class AccountsDashboardFragment : BaseFragment(), LoaderCallbacks<AccountsInfo>,
}
override fun onApplySystemWindowInsets(insets: Rect) {
view?.findViewById<View?>(android.support.design.R.id.design_navigation_view)?.
setPadding(0, 0, 0, insets.bottom)
view?.findViewById<View?>(android.support.design.R.id.design_navigation_view)?.setPadding(0, 0, 0, insets.bottom)
systemWindowsInsets.set(insets)
updateSystemWindowsInsets()
}
@ -473,7 +476,7 @@ class AccountsDashboardFragment : BaseFragment(), LoaderCallbacks<AccountsInfo>,
clickedColors = clickedImageView.borderColors
val oldSelectedAccount = accountsAdapter.selectedAccount ?: return
val profileImageStyle = preferences[profileImageStyleKey]
requestManager.loadProfileImage(activity, oldSelectedAccount,
Glide.with(this@AccountsDashboardFragment).loadProfileImage(activity, oldSelectedAccount,
profileImageStyle, clickedImageView.cornerRadius, clickedImageView.cornerRadiusRatio)
.into(clickedImageView).onLoadStarted(profileDrawable)
//TODO complete border color
@ -536,7 +539,7 @@ class AccountsDashboardFragment : BaseFragment(), LoaderCallbacks<AccountsInfo>,
ColorDrawable(Chameleon.getOverrideTheme(activity, activity).colorPrimary)
}
requestManager.loadProfileBanner(activity, account.user, width).fallback(fallbackBanner)
Glide.with(this).loadProfileBanner(activity, account.user, width).apply(RequestOptions().fallback(fallbackBanner))
.into(bannerView)
}
@ -551,11 +554,11 @@ class AccountsDashboardFragment : BaseFragment(), LoaderCallbacks<AccountsInfo>,
accountProfileNameView.updateText(bidiFormatter)
profileContainer.contentDescription = getString(R.string.content_description_accounts_selector_current,
userColorNameManager.getDisplayName(user))
UserColorNameManager.get(context!!).getDisplayName(user))
requestManager.loadProfileImage(activity, account, preferences[profileImageStyleKey],
Glide.with(this).loadProfileImage(activity, account, preferences[profileImageStyleKey],
accountProfileImageView.cornerRadius, accountProfileImageView.cornerRadiusRatio,
ProfileImageSize.REASONABLY_SMALL).placeholder(profileImageSnapshot).into(accountProfileImageView)
ProfileImageSize.REASONABLY_SMALL).apply(RequestOptions.placeholderOf(profileImageSnapshot)).into(accountProfileImageView)
//TODO complete border color
accountProfileImageView.setBorderColors(account.color)
accountProfileBanner.showNext()

View File

@ -18,6 +18,7 @@ import android.view.ContextMenu.ContextMenuInfo
import android.widget.AdapterView
import android.widget.AdapterView.AdapterContextMenuInfo
import android.widget.Toast
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.layout_draggable_list_with_empty_view.*
import nl.komponents.kovenant.combine.and
import nl.komponents.kovenant.task
@ -68,7 +69,7 @@ class AccountsManagerFragment : BaseFragment(), LoaderManager.LoaderCallbacks<Li
linkHandlerTitle = getString(R.string.title_accounts)
val context = context!!
val am = AccountManager.get(context)
adapter = AccountDetailsAdapter(context, requestManager).apply {
adapter = AccountDetailsAdapter(context, Glide.with(this)).apply {
sortEnabled = true
switchEnabled = true
accountToggleListener = { pos, checked ->

View File

@ -33,6 +33,7 @@ import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.extension.applyTheme
import org.mariotaku.twidere.extension.blockBulkInsert
import org.mariotaku.twidere.extension.bulkDelete
import org.mariotaku.twidere.extension.model.quoted
import org.mariotaku.twidere.extension.onShow
import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.ParcelableUserMention
@ -41,6 +42,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Filters
import org.mariotaku.twidere.util.ContentValuesCreator
import org.mariotaku.twidere.util.HtmlEscapeHelper
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.UserColorNameManager.Companion
import java.util.*
class AddStatusFilterDialogFragment : BaseDialogFragment() {
@ -55,10 +57,10 @@ class AddStatusFilterDialogFragment : BaseDialogFragment() {
UserItem(status.retweeted_by_user_key!!, status.retweeted_by_user_name,
status.retweeted_by_user_screen_name)))
}
if (status.is_quote && status.quoted_user_key != null) {
if (status.is_quote && status.quoted?.user_key != null) {
list.add(FilterItemInfo(FilterItemInfo.FILTER_TYPE_USER,
UserItem(status.quoted_user_key!!, status.quoted_user_name,
status.quoted_user_screen_name)))
UserItem(status.quoted?.user_key!!, status.quoted?.user_name!!,
status.quoted?.user_screen_name!!)))
}
list.add(FilterItemInfo(FilterItemInfo.FILTER_TYPE_USER, UserItem(status.user_key,
status.user_name, status.user_screen_name)))
@ -81,6 +83,7 @@ class AddStatusFilterDialogFragment : BaseDialogFragment() {
private var filterItems: Array<FilterItemInfo>? = null
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val manager = UserColorNameManager.get(context!!)
val builder = AlertDialog.Builder(context!!)
filterItems = filterItemsInfo
val entries = arrayOfNulls<String>(filterItems!!.size)
@ -89,15 +92,15 @@ class AddStatusFilterDialogFragment : BaseDialogFragment() {
val info = filterItems!![i]
when (info.type) {
FilterItemInfo.FILTER_TYPE_USER -> {
entries[i] = getString(R.string.user_filter_name, getName(userColorNameManager,
entries[i] = getString(R.string.user_filter_name, getName(manager,
info.value, nameFirst))
}
FilterItemInfo.FILTER_TYPE_KEYWORD -> {
entries[i] = getString(R.string.keyword_filter_name, getName(userColorNameManager,
entries[i] = getString(R.string.keyword_filter_name, getName(manager,
info.value, nameFirst))
}
FilterItemInfo.FILTER_TYPE_SOURCE -> {
entries[i] = getString(R.string.source_filter_name, getName(userColorNameManager,
entries[i] = getString(R.string.source_filter_name, getName(manager,
info.value, nameFirst))
}
}

View File

@ -26,11 +26,13 @@ import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_USER
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.event.FriendshipTaskEvent
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.UserColorNameManager
class AddUserFilterDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun getMessage(user: ParcelableUser): String {
return getString(R.string.filter_user_confirm_message, userColorNameManager.getDisplayName(user))
return getString(R.string.filter_user_confirm_message, UserColorNameManager.get(context!!).getDisplayName(user))
}
override fun getTitle(user: ParcelableUser): String {
@ -40,7 +42,7 @@ class AddUserFilterDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) {
DataStoreUtils.addToFilter(context!!, listOf(user), filterEverywhere)
val accountKey = user.account_key ?: return
bus.post(FriendshipTaskEvent(FriendshipTaskEvent.Action.FILTER, accountKey, user.key).apply {
BusSingleton.post(FriendshipTaskEvent(FriendshipTaskEvent.Action.FILTER, accountKey, user.key).apply {
isFinished = true
isSucceeded = true
})

View File

@ -29,8 +29,8 @@ import android.widget.CompoundButton
import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.ACCOUNT_PREFERENCES_NAME_PREFIX
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT
import org.mariotaku.twidere.constant.SharedPreferenceConstants.KEY_NAME_FIRST
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.util.UserColorNameManager
abstract class BaseAccountPreferenceFragment : BasePreferenceFragment() {
@ -67,8 +67,7 @@ abstract class BaseAccountPreferenceFragment : BasePreferenceFragment() {
val activity = activity!!
val intent = activity.intent
if (intent.hasExtra(EXTRA_SHOW_FRAGMENT)) {
val nameFirst = prefs.getBoolean(KEY_NAME_FIRST, true)
val name = userColorNameManager.getDisplayName(account.key,
val name = UserColorNameManager.get(activity).getDisplayName(account.key,
account.user.name, account.user.screen_name)
activity.title = name
}

View File

@ -21,35 +21,25 @@ package org.mariotaku.twidere.fragment
import android.content.Context
import android.content.SharedPreferences
import android.os.Bundle
import android.support.v4.app.DialogFragment
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager
import com.squareup.otto.Bus
import nl.komponents.kovenant.Promise
import okhttp3.Dns
import org.mariotaku.restfu.http.RestHttpClient
import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.fragment.iface.IBaseFragment
import org.mariotaku.twidere.util.DebugModeUtils
import org.mariotaku.twidere.util.KeyboardShortcutsHandler
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.premium.ExtraFeaturesService
import org.mariotaku.twidere.util.sync.DataSyncProvider
import javax.inject.Inject
open class BaseDialogFragment : DialogFragment(), IBaseFragment<BaseDialogFragment> {
@Inject
lateinit var userColorNameManager: UserColorNameManager
@Inject
lateinit var preferences: SharedPreferences
@Inject
lateinit var keyboardShortcutsHandler: KeyboardShortcutsHandler
@Inject
lateinit var bus: Bus
@Inject
lateinit var dns: Dns
@Inject
lateinit var extraFeaturesService: ExtraFeaturesService
@ -58,26 +48,8 @@ open class BaseDialogFragment : DialogFragment(), IBaseFragment<BaseDialogFragme
@Inject
lateinit var dataSyncProvider: DataSyncProvider
lateinit var requestManager: RequestManager
private set
private val actionHelper = IBaseFragment.ActionHelper<BaseDialogFragment>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestManager = Glide.with(this)
}
override fun onStart() {
super.onStart()
requestManager.onStart()
}
override fun onStop() {
requestManager.onStop()
super.onStop()
}
override fun onResume() {
super.onResume()
actionHelper.dispatchOnResumeFragments(this)
@ -89,7 +61,6 @@ open class BaseDialogFragment : DialogFragment(), IBaseFragment<BaseDialogFragme
}
override fun onDestroy() {
requestManager.onDestroy()
super.onDestroy()
DebugModeUtils.watchReferenceLeak(this)
}

View File

@ -25,14 +25,10 @@ import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.text.BidiFormatter
import android.view.View
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager
import com.squareup.otto.Bus
import nl.komponents.kovenant.Promise
import okhttp3.Dns
import org.mariotaku.restfu.http.RestHttpClient
import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.fragment.iface.IBaseFragment
import org.mariotaku.twidere.model.DefaultFeatures
import org.mariotaku.twidere.util.*
@ -49,10 +45,9 @@ open class BaseFragment : Fragment(), IBaseFragment<BaseFragment> {
@Inject
lateinit var readStateManager: ReadStateManager
@Inject
lateinit var bus: Bus
@Inject
lateinit var multiSelectManager: MultiSelectManager
@Inject
@Deprecated(message = "Deprecated", replaceWith = ReplaceWith("UserColorNameManager.get(context!!)", imports = ["org.mariotaku.twidere.util.UserColorNameManager"]))
lateinit var userColorNameManager: UserColorNameManager
@Inject
lateinit var preferences: SharedPreferences
@ -83,26 +78,8 @@ open class BaseFragment : Fragment(), IBaseFragment<BaseFragment> {
@Inject
lateinit var promotionService: PromotionService
lateinit var requestManager: RequestManager
private set
private val actionHelper = IBaseFragment.ActionHelper<BaseFragment>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestManager = Glide.with(this)
}
override fun onStart() {
super.onStart()
requestManager.onStart()
}
override fun onStop() {
requestManager.onStop()
super.onStop()
}
override fun onResume() {
super.onResume()
actionHelper.dispatchOnResumeFragments(this)
@ -114,7 +91,6 @@ open class BaseFragment : Fragment(), IBaseFragment<BaseFragment> {
}
override fun onDestroy() {
requestManager.onDestroy()
super.onDestroy()
DebugModeUtils.watchReferenceLeak(this)
}

View File

@ -30,10 +30,8 @@ import android.os.Bundle
import android.provider.Settings
import android.support.v7.preference.Preference
import android.support.v7.preference.PreferenceFragmentCompat
import com.squareup.otto.Bus
import nl.komponents.kovenant.Promise
import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.fragment.iface.IBaseFragment
import org.mariotaku.twidere.preference.RingtonePreference
import org.mariotaku.twidere.taskcontroller.sync.SyncTaskController
@ -49,14 +47,13 @@ abstract class BasePreferenceFragment : PreferenceFragmentCompat(), IBaseFragmen
@Inject
lateinit var keyboardShortcutHandler: KeyboardShortcutsHandler
@Inject
@Deprecated(message = "Deprecated", replaceWith = ReplaceWith("UserColorNameManager.get(context!!)", imports = ["org.mariotaku.twidere.util.UserColorNameManager"]))
lateinit var userColorNameManager: UserColorNameManager
@Inject
lateinit var preferences: SharedPreferences
@Inject
lateinit var syncController: SyncTaskController
@Inject
lateinit var bus: Bus
@Inject
lateinit var dataSyncProvider: DataSyncProvider
@Inject
lateinit var preferenceChangeNotifier: PreferenceChangeNotifier

View File

@ -25,15 +25,16 @@ import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_USER
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.promise.BlockPromises
import org.mariotaku.twidere.util.UserColorNameManager
class CreateUserBlockDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun getMessage(user: ParcelableUser): String {
val displayName = userColorNameManager.getDisplayName(user)
val displayName = UserColorNameManager.get(context!!).getDisplayName(user)
return getString(R.string.block_user_confirm_message, displayName)
}
override fun getTitle(user: ParcelableUser): String {
val displayName = userColorNameManager.getDisplayName(user)
val displayName = UserColorNameManager.get(context!!).getDisplayName(user)
return getString(R.string.title_block_user, displayName)
}
@ -43,7 +44,7 @@ class CreateUserBlockDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) {
val accountKey = user.account_key ?: return
BlockPromises.getInstance(context!!).block(accountKey, user.key, filterEverywhere)
BlockPromises.get(context!!).block(accountKey, user.key, filterEverywhere)
}
companion object {

View File

@ -23,19 +23,19 @@ import android.os.Bundle
import android.support.v4.app.FragmentManager
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_USER
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.promise.MutePromises
import org.mariotaku.twidere.util.UserColorNameManager
class CreateUserMuteDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun getMessage(user: ParcelableUser): String {
val displayName = userColorNameManager.getDisplayName(user)
val displayName = UserColorNameManager.get(context!!).getDisplayName(user)
return getString(R.string.mute_user_confirm_message, displayName)
}
override fun getTitle(user: ParcelableUser): String {
val displayName = userColorNameManager.getDisplayName(user)
val displayName = UserColorNameManager.get(context!!).getDisplayName(user)
return getString(R.string.mute_user, displayName)
}

View File

@ -40,6 +40,7 @@ import android.view.*
import android.widget.*
import android.widget.AbsListView.MultiChoiceModeListener
import android.widget.AdapterView.OnItemClickListener
import com.bumptech.glide.Glide
import com.mobeta.android.dslv.SimpleDragSortCursorAdapter
import kotlinx.android.synthetic.main.dialog_custom_tab_editor.*
import kotlinx.android.synthetic.main.layout_draggable_list_with_empty_view.*
@ -275,7 +276,7 @@ class CustomTabsFragment : BaseFragment(), LoaderCallbacks<Cursor?>, MultiChoice
val positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE)
val iconsAdapter = TabIconsAdapter(context!!)
val accountsAdapter = AccountsSpinnerAdapter(context!!, requestManager = requestManager)
val accountsAdapter = AccountsSpinnerAdapter(context!!, requestManager = Glide.with(this))
iconSpinner.adapter = iconsAdapter
accountSpinner.adapter = accountsAdapter

View File

@ -36,6 +36,8 @@ import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.ParcelableUserList
import org.mariotaku.twidere.promise.UserListPromises
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.UserColorNameManager.Companion
class DeleteUserListMembersDialogFragment : BaseDialogFragment(), DialogInterface.OnClickListener {
@ -61,8 +63,7 @@ class DeleteUserListMembersDialogFragment : BaseDialogFragment(), DialogInterfac
val userList = userList!!
if (users.size == 1) {
val user = users[0]
val nameFirst = preferences[nameFirstKey]
val displayName = userColorNameManager.getDisplayName(user)
val displayName = UserColorNameManager.get(context!!).getDisplayName(user)
builder.setTitle(getString(R.string.delete_user, displayName))
builder.setMessage(getString(R.string.delete_user_from_list_confirm, displayName, userList.name))
} else {

View File

@ -33,6 +33,8 @@ import org.mariotaku.twidere.extension.applyTheme
import org.mariotaku.twidere.extension.user
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.promise.FriendshipPromises
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.UserColorNameManager.Companion
class DestroyFriendshipDialogFragment : BaseDialogFragment(), DialogInterface.OnClickListener {
@ -41,7 +43,7 @@ class DestroyFriendshipDialogFragment : BaseDialogFragment(), DialogInterface.On
DialogInterface.BUTTON_POSITIVE -> {
val user = arguments!!.user!!
val accountKey = user.account_key ?: return
FriendshipPromises.getInstance(context!!).destroy(accountKey, user.key)
FriendshipPromises.get(context!!).destroy(accountKey, user.key)
}
else -> {
}
@ -50,9 +52,8 @@ class DestroyFriendshipDialogFragment : BaseDialogFragment(), DialogInterface.On
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(context!!)
val nameFirst = preferences[nameFirstKey]
val user = arguments!!.user!!
val displayName = userColorNameManager.getDisplayName(user)
val displayName = UserColorNameManager.get(context!!).getDisplayName(user)
builder.setTitle(getString(R.string.unfollow_user, displayName))
builder.setMessage(getString(R.string.unfollow_user_confirm_message, displayName))
builder.setPositiveButton(android.R.string.ok, this)

View File

@ -22,12 +22,14 @@ import org.mariotaku.twidere.constant.displaySensitiveContentsKey
import org.mariotaku.twidere.constant.newDocumentApiKey
import org.mariotaku.twidere.extension.accountKey
import org.mariotaku.twidere.extension.model.prefixedHashtag
import org.mariotaku.twidere.extension.model.quoted
import org.mariotaku.twidere.fragment.timeline.AbsTimelineFragment
import org.mariotaku.twidere.model.ParcelableHashtag
import org.mariotaku.twidere.model.ParcelableMedia
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.util.IntentUtils
import org.mariotaku.twidere.util.MenuUtils
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.Utils
import org.mariotaku.twidere.view.ExtendedRecyclerView
import org.mariotaku.twidere.view.holder.UserViewHolder
@ -71,7 +73,7 @@ open class ItemsListFragment : AbsContentListRecyclerViewFragment<VariousItemsAd
override fun onQuotedStatusClick(holder: IStatusViewHolder, position: Int) {
val status = dummyItemAdapter.getStatus(position)
IntentUtils.openStatus(context, status.account_key, status.quoted_id)
IntentUtils.openStatus(context, status.account_key, status.quoted?.id!!)
}
override fun onItemActionClick(holder: RecyclerView.ViewHolder, id: Int, position: Int) {
@ -147,7 +149,7 @@ open class ItemsListFragment : AbsContentListRecyclerViewFragment<VariousItemsAd
val dummyAdapter = adapter.dummyAdapter
val status = dummyAdapter.getStatus(contextMenuInfo.position)
inflater.inflate(R.menu.action_status, menu)
MenuUtils.setupForStatus(context, menu, preferences, userColorNameManager,
MenuUtils.setupForStatus(context, menu, preferences, UserColorNameManager.get(context),
status)
}
}
@ -169,7 +171,7 @@ open class ItemsListFragment : AbsContentListRecyclerViewFragment<VariousItemsAd
return true
}
return MenuUtils.handleStatusClick(context, this, fragmentManager!!,
preferences, userColorNameManager, status, item)
preferences, UserColorNameManager.get(context), status, item)
}
}
return false

View File

@ -26,6 +26,7 @@ import android.support.v4.app.hasRunningLoadersSafe
import android.support.v4.content.Loader
import android.support.v7.widget.RecyclerView
import android.view.KeyEvent
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager
import kotlinx.android.synthetic.main.fragment_content_recyclerview.*
import org.mariotaku.twidere.adapter.ParcelableGroupsAdapter
@ -66,7 +67,7 @@ abstract class ParcelableGroupsFragment : AbsContentListRecyclerViewFragment<Par
}
override fun onCreateAdapter(context: Context, requestManager: RequestManager): ParcelableGroupsAdapter {
return ParcelableGroupsAdapter(context, this.requestManager)
return ParcelableGroupsAdapter(context, Glide.with(this))
}
override fun setupRecyclerView(context: Context, recyclerView: RecyclerView) {

View File

@ -26,6 +26,7 @@ import android.support.v4.app.hasRunningLoadersSafe
import android.support.v4.content.Loader
import android.support.v7.widget.RecyclerView
import android.view.KeyEvent
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager
import kotlinx.android.synthetic.main.fragment_content_recyclerview.*
import org.mariotaku.ktextension.set
@ -71,7 +72,7 @@ abstract class ParcelableUserListsFragment : AbsContentListRecyclerViewFragment<
}
override fun onCreateAdapter(context: Context, requestManager: RequestManager): ParcelableUserListsAdapter {
return ParcelableUserListsAdapter(context, this.requestManager)
return ParcelableUserListsAdapter(context, Glide.with(this))
}
override fun setupRecyclerView(context: Context, recyclerView: RecyclerView) {

View File

@ -26,15 +26,16 @@ import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_USER
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.promise.BlockPromises
import org.mariotaku.twidere.util.UserColorNameManager
class ReportUserSpamDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun getMessage(user: ParcelableUser): String {
val displayName = userColorNameManager.getDisplayName(user)
val displayName = UserColorNameManager.get(context!!).getDisplayName(user)
return getString(R.string.report_user_confirm_message, displayName)
}
override fun getTitle(user: ParcelableUser): String {
val displayName = userColorNameManager.getDisplayName(user)
val displayName = UserColorNameManager.get(context!!).getDisplayName(user)
return getString(R.string.report_user, displayName)
}
@ -44,7 +45,7 @@ class ReportUserSpamDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) {
val accountKey = user.account_key ?: return
BlockPromises.getInstance(context!!).report(accountKey, user.key, filterEverywhere)
BlockPromises.get(context!!).report(accountKey, user.key, filterEverywhere)
}
companion object {

View File

@ -34,10 +34,12 @@ import org.mariotaku.microblog.library.model.microblog.SavedSearch
import org.mariotaku.twidere.R
import org.mariotaku.twidere.adapter.SavedSearchesAdapter
import org.mariotaku.twidere.extension.accountKey
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.loader.SavedSearchesLoader
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.event.SavedSearchDestroyedEvent
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.IntentUtils.openTweetSearch
import java.util.*
@ -67,13 +69,13 @@ class SavedSearchesListFragment : AbsContentListViewFragment<SavedSearchesAdapte
}
override fun onStop() {
bus.unregister(this)
BusSingleton.unregister(this)
super.onStop()
}
override fun onStart() {
super.onStart()
bus.register(this)
BusSingleton.register(this)
}
override fun onCreateAdapter(context: Context, requestManager: RequestManager): SavedSearchesAdapter {

View File

@ -34,22 +34,24 @@ import org.mariotaku.twidere.extension.name
import org.mariotaku.twidere.extension.onShow
import org.mariotaku.twidere.extension.userKey
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.util.UserColorNameManager
class SetUserNicknameDialogFragment : BaseDialogFragment(), OnClickListener {
override fun onClick(dialog: DialogInterface, which: Int) {
val editName = (dialog as AlertDialog).editName
val userKey = arguments!!.userKey!!
val manager = UserColorNameManager.get(context!!)
when (which) {
DialogInterface.BUTTON_POSITIVE -> {
if (editName.empty) {
userColorNameManager.clearUserNickname(userKey)
manager.clearUserNickname(userKey)
} else {
userColorNameManager.setUserNickname(userKey, editName.text.toString())
manager.setUserNickname(userKey, editName.text.toString())
}
}
DialogInterface.BUTTON_NEUTRAL -> {
userColorNameManager.clearUserNickname(userKey)
manager.clearUserNickname(userKey)
}
}

View File

@ -40,7 +40,6 @@ import org.mariotaku.twidere.activity.QuickSearchBarActivity
import org.mariotaku.twidere.adapter.TrendsAdapter
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_EXTRAS
import org.mariotaku.twidere.constant.localTrendsWoeIdKey
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.fragment.iface.IFloatingActionButtonFragment
import org.mariotaku.twidere.model.FloatingActionButtonInfo
import org.mariotaku.twidere.model.UserKey
@ -48,6 +47,7 @@ import org.mariotaku.twidere.model.event.TrendsRefreshedEvent
import org.mariotaku.twidere.model.tab.extra.TrendsTabExtras
import org.mariotaku.twidere.promise.GetTrendsPromise
import org.mariotaku.twidere.provider.TwidereDataStore.CachedTrends
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.IntentUtils.openTweetSearch
import org.mariotaku.twidere.util.Utils
@ -129,11 +129,11 @@ class TrendsSuggestionsFragment : AbsContentListViewFragment<TrendsAdapter>(), L
override fun onStart() {
super.onStart()
loaderManager.restartLoader(0, null, this)
bus.register(this)
BusSingleton.register(this)
}
override fun onStop() {
bus.unregister(this)
BusSingleton.unregister(this)
super.onStop()
}

View File

@ -59,6 +59,7 @@ import android.view.View.OnTouchListener
import android.view.animation.AnimationUtils
import android.widget.TextView
import android.widget.Toast
import com.bumptech.glide.Glide
import com.squareup.otto.Subscribe
import kotlinx.android.synthetic.main.fragment_user.*
import kotlinx.android.synthetic.main.header_user.*
@ -119,13 +120,13 @@ import org.mariotaku.twidere.promise.MutePromises
import org.mariotaku.twidere.promise.UserListPromises
import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships
import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.task.UpdateAccountInfoPromise
import org.mariotaku.twidere.text.TwidereURLSpan
import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback
import org.mariotaku.twidere.util.TwidereLinkify.OnLinkClickListener
import org.mariotaku.twidere.util.UserColorNameManager.UserColorChangedListener
import org.mariotaku.twidere.util.UserColorNameManager.UserNicknameChangedListener
import org.mariotaku.twidere.util.UserColorNameManager.*
import org.mariotaku.twidere.util.shortcut.ShortcutCreator
import org.mariotaku.twidere.util.support.ActivitySupport
import org.mariotaku.twidere.util.support.ActivitySupport.TaskDescriptionCompat
@ -235,9 +236,9 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
if (resultCode == Activity.RESULT_OK) {
if (data == null) return
val color = data.getIntExtra(EXTRA_COLOR, Color.TRANSPARENT)
userColorNameManager.setUserColor(user.key, color)
UserColorNameManager.get(context!!).setUserColor(user.key, color)
} else if (resultCode == ColorPickerDialogActivity.RESULT_CLEARED) {
userColorNameManager.clearUserColor(user.key)
UserColorNameManager.get(context!!).clearUserColor(user.key)
}
}
REQUEST_ADD_TO_LIST -> {
@ -249,7 +250,8 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
REQUEST_SELECT_ACCOUNT -> {
if (resultCode == Activity.RESULT_OK) {
if (data == null || !data.hasExtra(EXTRA_ID)) return
val selectedAccountKey: UserKey = data.getParcelableExtra(EXTRA_ACCOUNT_KEY) ?: return
val selectedAccountKey: UserKey = data.getParcelableExtra(EXTRA_ACCOUNT_KEY)
?: return
var userKey = user.key
if (liveUser.account?.type == AccountType.MASTODON && liveUser.account?.key?.host != selectedAccountKey.host) {
userKey = AcctPlaceholderUserKey(user.key.host)
@ -283,7 +285,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
return
}
Utils.setNdefPushMessageCallback(activity, CreateNdefMessageCallback cb@ {
Utils.setNdefPushMessageCallback(activity, CreateNdefMessageCallback cb@{
val user = liveUser.user ?: return@cb null
val link = LinkCreator.getUserWebLink(user) ?: return@cb null
return@cb NdefMessage(arrayOf(NdefRecord.createUri(link)))
@ -352,16 +354,18 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
override fun onStart() {
super.onStart()
bus.register(this)
userColorNameManager.registerColorChangedListener(this)
userColorNameManager.registerNicknameChangedListener(this)
BusSingleton.register(this)
val manager = UserColorNameManager.get(context!!)
manager.registerColorChangedListener(this)
manager.registerNicknameChangedListener(this)
}
override fun onStop() {
userColorNameManager.unregisterColorChangedListener(this)
userColorNameManager.unregisterNicknameChangedListener(this)
bus.unregister(this)
val manager = UserColorNameManager.get(context!!)
manager.unregisterColorChangedListener(this)
manager.unregisterNicknameChangedListener(this)
BusSingleton.unregister(this)
super.onStop()
}
@ -390,7 +394,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
val mentionItem = menu.findItem(R.id.mention)
if (mentionItem != null) {
mentionItem.title = getString(R.string.mention_user_name,
userColorNameManager.getDisplayName(user))
UserColorNameManager.get(this.context!!).getDisplayName(user))
}
menu.setItemAvailability(R.id.qr_code, linkAvailable)
@ -474,6 +478,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val context = context ?: return false
val manager = UserColorNameManager.get(context)
val fragmentManager = fragmentManager ?: return false
val user = liveUser.user ?: return false
val accountKey = user.account_key ?: return false
@ -482,7 +487,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
R.id.block -> {
if (userRelationship == null) return true
if (userRelationship.blocking) {
BlockPromises.getInstance(context).unblock(accountKey, user.key)
BlockPromises.get(context).unblock(accountKey, user.key)
} else {
CreateUserBlockDialogFragment.show(fragmentManager, user)
}
@ -532,16 +537,16 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
}
R.id.set_color -> {
val intent = Intent(activity, ColorPickerDialogActivity::class.java)
intent.putExtra(EXTRA_COLOR, userColorNameManager.getUserColor(user.key))
intent.putExtra(EXTRA_COLOR, manager.getUserColor(user.key))
intent.putExtra(EXTRA_ALPHA_SLIDER, false)
intent.putExtra(EXTRA_CLEAR_BUTTON, true)
startActivityForResult(intent, REQUEST_SET_COLOR)
}
R.id.clear_nickname -> {
userColorNameManager.clearUserNickname(user.key)
manager.clearUserNickname(user.key)
}
R.id.set_nickname -> {
val nick = userColorNameManager.getUserNickname(user.key)
val nick = manager.getUserNickname(user.key)
SetUserNicknameDialogFragment.show(fragmentManager, user.key, nick)
}
R.id.add_to_list -> {
@ -565,7 +570,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
if (userRelationship.following) {
DestroyFriendshipDialogFragment.show(fragmentManager, user)
} else {
FriendshipPromises.getInstance(context).create(accountKey, user.key, user.screen_name)
FriendshipPromises.get(context).create(accountKey, user.key, user.screen_name)
}
}
return true
@ -810,7 +815,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
val userRelationship = liveRelationship.relationship ?: return
when {
userRelationship.blocking -> {
BlockPromises.getInstance(context).unblock(accountKey, user.key)
BlockPromises.get(context).unblock(accountKey, user.key)
}
userRelationship.blocked_by -> {
CreateUserBlockDialogFragment.show(childFragmentManager, user)
@ -819,7 +824,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
DestroyFriendshipDialogFragment.show(fragmentManager, user)
}
else -> {
FriendshipPromises.getInstance(context).create(accountKey, user.key, user.screen_name)
FriendshipPromises.get(context).create(accountKey, user.key, user.screen_name)
}
}
}
@ -990,7 +995,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
}
val user = this.liveUser.user
if (user != null) {
val name = userColorNameManager.getDisplayName(user)
val name = UserColorNameManager.get(activity).getDisplayName(user)
ActivitySupport.setTaskDescription(activity, TaskDescriptionCompat(name, null, taskColor))
} else {
ActivitySupport.setTaskDescription(activity, TaskDescriptionCompat(null, null, taskColor))
@ -1121,8 +1126,8 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
followContainer.drawEnd(user.account_color)
linkHandlerTitle = run {
val nameNoNick = UserColorNameManager.decideDisplayName(null, user.name,
user.screen_name, userColorNameManager.nameFirst)
val nameNoNick = UserColorNameManager.get(activity).decideDisplayName(null, user.name,
user.screen_name)
return@run bidiFormatter.unicodeWrap(when {
user.nickname.isNullOrEmpty() -> nameNoNick
else -> getString(R.string.name_with_nickname, nameNoNick, user.nickname)
@ -1147,7 +1152,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
if (user.description_unescaped != null) {
val text = SpannableStringBuilder.valueOf(user.description_unescaped).apply {
user.description_spans?.applyTo(this, null, requestManager, description)
user.description_spans?.applyTo(this, null, Glide.with(this@UserFragment), description)
linkify.applyAllLinks(this, user.account_key, false, false)
}
description.spannable = text
@ -1200,10 +1205,10 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
else -> Chameleon.getOverrideTheme(activity, activity).colorPrimary
})
val defWidth = resources.displayMetrics.widthPixels
requestManager.loadProfileBanner(activity, user, defWidth).into(profileBanner)
requestManager.loadOriginalProfileImage(activity, user, profileImage.style,
Glide.with(this).loadProfileBanner(activity, user, defWidth).into(profileBanner)
Glide.with(this).loadOriginalProfileImage(activity, user, profileImage.style,
profileImage.cornerRadius, profileImage.cornerRadiusRatio)
.thumbnail(requestManager.loadProfileImage(activity, user, profileImage.style,
.thumbnail(Glide.with(this).loadProfileImage(activity, user, profileImage.style,
profileImage.cornerRadius, profileImage.cornerRadiusRatio,
getString(R.string.profile_image_size))).into(profileImage)

View File

@ -28,6 +28,7 @@ import android.support.v4.app.FragmentActivity
import android.view.*
import android.view.View.OnClickListener
import android.widget.ImageView
import com.bumptech.glide.Glide
import com.twitter.Validator
import kotlinx.android.synthetic.main.fragment_user_profile_editor.*
import nl.komponents.kovenant.Promise
@ -253,11 +254,11 @@ class UserProfileEditorFragment : BaseFragment(), OnSizeChangedListener,
editLocation.setText(user.location)
editUrl.setText(user.urlFull)
requestManager.loadProfileImage(activity, user,
Glide.with(this).loadProfileImage(activity, user,
ImageShapeStyle.SHAPE_RECTANGLE).into(profileImage)
requestManager.loadProfileBanner(activity, user, resources.displayMetrics.widthPixels)
Glide.with(this).loadProfileBanner(activity, user, resources.displayMetrics.widthPixels)
.into(profileBanner)
requestManager.load(user.profile_background_url).into(profileBackground)
Glide.with(this).load(user.profile_background_url).into(profileBackground)
linkColor.color = user.link_color
backgroundColor.color = user.background_color

View File

@ -24,6 +24,7 @@ import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.media.MediaScannerConnection
import android.os.Build
import android.os.Bundle
@ -34,7 +35,6 @@ import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.drawable.GlideDrawable
import com.bumptech.glide.request.target.Target
import io.nayuki.qrcodegen.QrCode
import io.nayuki.qrcodegen.QrSegment
@ -203,7 +203,7 @@ class UserQrDialogFragment : BaseDialogFragment() {
return@task SaveFileResult(saveFile, "image/png")
}
private fun loadProfileImage(): Promise<GlideDrawable, Exception> {
private fun loadProfileImage(): Promise<Drawable, Exception> {
val activity = this.activity ?: return Promise.ofFail(InterruptedException())
if (isDetached || dialog == null || activity.isFinishing) {
return Promise.ofFail(InterruptedException())
@ -217,13 +217,13 @@ class UserQrDialogFragment : BaseDialogFragment() {
val profileImageSize = context.getString(R.string.profile_image_size)
try {
return@task requestManager.loadOriginalProfileImage(context, user, 0)
.into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get()
.submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get()
} catch (e: ExecutionException) {
// Ignore
}
// Return fallback profile image
return@task requestManager.loadProfileImage(context, user, ImageShapeStyle.SHAPE_NONE,
size = profileImageSize).into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get()
size = profileImageSize).submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get()
}
}

View File

@ -56,7 +56,9 @@ import org.mariotaku.twidere.constant.newDocumentApiKey
import org.mariotaku.twidere.constant.readFromBottomKey
import org.mariotaku.twidere.data.CursorObjectDataSourceFactory
import org.mariotaku.twidere.data.processor.DataSourceItemProcessor
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.extension.model.activityStatus
import org.mariotaku.twidere.extension.model.quoted
import org.mariotaku.twidere.extension.queryOne
import org.mariotaku.twidere.extension.showContextMenuForChild
import org.mariotaku.twidere.extension.view.PositionWithOffset
@ -78,8 +80,10 @@ import org.mariotaku.twidere.model.pagination.SinceMaxPagination
import org.mariotaku.twidere.model.refresh.BaseContentRefreshParam
import org.mariotaku.twidere.model.refresh.ContentRefreshParam
import org.mariotaku.twidere.provider.TwidereDataStore.Activities
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.task.statuses.GetStatusesTask
import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.UserColorNameManager.Companion
import org.mariotaku.twidere.view.ExtendedRecyclerView
import org.mariotaku.twidere.view.holder.ActivityTitleSummaryViewHolder
import org.mariotaku.twidere.view.holder.GapViewHolder
@ -148,11 +152,11 @@ abstract class AbsActivitiesFragment : AbsContentRecyclerViewFragment<Parcelable
override fun onStart() {
super.onStart()
recyclerView.addOnScrollListener(scrollHandler)
bus.register(busEventHandler)
BusSingleton.register(busEventHandler)
}
override fun onStop() {
bus.unregister(busEventHandler)
BusSingleton.unregister(busEventHandler)
recyclerView.removeOnScrollListener(scrollHandler)
if (userVisibleHint) {
saveReadPosition(layoutManager.firstVisibleItemPosition)
@ -189,7 +193,7 @@ abstract class AbsActivitiesFragment : AbsContentRecyclerViewFragment<Parcelable
val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo
val status = adapter.getActivity(contextMenuInfo.position).activityStatus ?: return
inflater.inflate(R.menu.action_status, menu)
MenuUtils.setupForStatus(context, menu, preferences, userColorNameManager, status)
MenuUtils.setupForStatus(context, menu, preferences, UserColorNameManager.get(this.context!!), status)
}
override fun onContextItemSelected(item: MenuItem): Boolean {
@ -214,7 +218,7 @@ abstract class AbsActivitiesFragment : AbsContentRecyclerViewFragment<Parcelable
return true
}
else -> return MenuUtils.handleStatusClick(context, this, fragmentManager!!,
preferences, userColorNameManager, status, item)
preferences, UserColorNameManager.get(this.context!!), status, item)
}
}
@ -492,8 +496,8 @@ abstract class AbsActivitiesFragment : AbsContentRecyclerViewFragment<Parcelable
}
override fun onQuotedStatusClick(holder: IStatusViewHolder, position: Int) {
val status = getActivityStatus(position)?.takeIf { it.quoted_id != null } ?: return
IntentUtils.openStatus(context!!, status.account_key, status.quoted_id)
val status = getActivityStatus(position)?.takeIf { it.quoted?.id != null } ?: return
IntentUtils.openStatus(context!!, status.account_key, status.quoted?.id!!)
}
override fun onMediaClick(holder: IStatusViewHolder, view: View, media: ParcelableMedia, position: Int) {

View File

@ -31,6 +31,7 @@ import android.view.inputmethod.InputMethodManager
import android.widget.CheckBox
import android.widget.Checkable
import android.widget.Toast
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.dialog_filter_rule_editor.*
import org.mariotaku.ktextension.ContentValues
import org.mariotaku.ktextension.set
@ -115,7 +116,7 @@ class AddEditItemFragment : BaseDialogFragment() {
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
editText.setAdapter(when (contentUri) {
Filters.Sources.CONTENT_URI -> SourceAutoCompleteAdapter(activity!!)
Filters.Users.CONTENT_URI -> ComposeAutoCompleteAdapter(activity!!, requestManager).apply {
Filters.Users.CONTENT_URI -> ComposeAutoCompleteAdapter(activity!!, Glide.with(this@AddEditItemFragment)).apply {
val accountKey = arguments!!.accountKey
if (accountKey != null) {
val am = AccountManager.get(activity)

View File

@ -44,6 +44,7 @@ import org.mariotaku.twidere.text.style.EmojiSpan
import org.mariotaku.twidere.util.IntentUtils
import org.mariotaku.twidere.util.ThemeUtils
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.UserColorNameManager.Companion
import javax.inject.Inject
class FilteredUsersFragment : BaseFiltersFragment() {
@ -163,7 +164,7 @@ class FilteredUsersFragment : BaseFiltersFragment() {
val adapter = this.adapter as FilterUsersListAdapter
val item = adapter.getFilterItem(position) ?: return
if (item.source >= 0) return
addOrEditItem(item.id, userColorNameManager.getDisplayName(item), item.scope)
addOrEditItem(item.id, UserColorNameManager.get(context!!).getDisplayName(item), item.scope)
}
override fun addOrEditItem(id: Long, value: String?, scope: Int) {

View File

@ -32,13 +32,13 @@ import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import com.google.android.exoplayer2.*
import com.google.android.exoplayer2.ExoPlaybackException
import com.google.android.exoplayer2.ExoPlayerFactory
import com.google.android.exoplayer2.Player
import com.google.android.exoplayer2.extractor.ExtractorsFactory
import com.google.android.exoplayer2.source.ExtractorMediaSource
import com.google.android.exoplayer2.source.TrackGroupArray
import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
import com.google.android.exoplayer2.trackselection.TrackSelectionArray
import com.google.android.exoplayer2.upstream.DataSource
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter
import com.google.android.exoplayer2.upstream.HttpDataSource
@ -111,10 +111,7 @@ class ExoPlayerPageFragment : MediaViewerFragment(), IBaseFragment<ExoPlayerPage
AccountManager.get(context).getDetailsOrThrow(accountKey, true)
}
private val playerListener = object : Player.EventListener {
override fun onLoadingChanged(isLoading: Boolean) {
}
private val playerListener = object : Player.DefaultEventListener() {
override fun onPlayerError(error: ExoPlaybackException) {
playerHasError = true
@ -161,21 +158,6 @@ class ExoPlayerPageFragment : MediaViewerFragment(), IBaseFragment<ExoPlayerPage
}
}
override fun onPositionDiscontinuity() {
}
override fun onTimelineChanged(timeline: Timeline, manifest: Any?) {
}
override fun onTracksChanged(trackGroups: TrackGroupArray, trackSelections: TrackSelectionArray) {
}
override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters?) {
}
override fun onRepeatModeChanged(repeatMode: Int) {
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {

View File

@ -42,6 +42,7 @@ import android.support.v7.widget.Toolbar
import android.view.*
import android.widget.CompoundButton
import android.widget.EditText
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager
import kotlinx.android.synthetic.main.activity_home_content.view.*
import kotlinx.android.synthetic.main.fragment_messages_conversation_info.*
@ -73,7 +74,6 @@ import org.mariotaku.twidere.annotation.ProfileImageSize
import org.mariotaku.twidere.constant.IntentConstants
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_USER
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.constant.profileImageStyleKey
import org.mariotaku.twidere.exception.UnsupportedCountIndexException
import org.mariotaku.twidere.extension.*
@ -93,6 +93,7 @@ import org.mariotaku.twidere.promise.MessagePromises
import org.mariotaku.twidere.promise.UpdateStatusPromise
import org.mariotaku.twidere.provider.TwidereDataStore.Messages.Conversations
import org.mariotaku.twidere.util.IntentUtils
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.view.holder.SimpleUserViewHolder
/**
@ -124,7 +125,7 @@ class MessageConversationInfoFragment : BaseFragment(), IToolBarSupportFragment,
(activity as? AppCompatActivity)?.supportActionBar?.setDisplayShowTitleEnabled(false)
val theme = Chameleon.getOverrideTheme(context, activity)
adapter = ConversationInfoAdapter(context, requestManager)
adapter = ConversationInfoAdapter(context, Glide.with(this))
adapter.listener = object : ConversationInfoAdapter.Listener {
override fun onUserClick(position: Int) {
val user = adapter.getUser(position) ?: return
@ -257,12 +258,12 @@ class MessageConversationInfoFragment : BaseFragment(), IToolBarSupportFragment,
return
}
val name = data.getTitle(context, userColorNameManager, preferences[nameFirstKey]).first
val name = data.getTitle(context, UserColorNameManager.get(context)).first
val summary = data.getSubtitle(context)
@ImageShapeStyle val profileImageStyle: Int = preferences[profileImageStyleKey]
requestManager.loadProfileImage(context, data, profileImageStyle).into(conversationAvatar)
requestManager.loadProfileImage(context, data, profileImageStyle, 0f,
Glide.with(this).loadProfileImage(context, data, profileImageStyle).into(conversationAvatar)
Glide.with(this).loadProfileImage(context, data, profileImageStyle, 0f,
0f, ProfileImageSize.REASONABLY_SMALL).into(appBarIcon)
appBarTitle.spannable = name
conversationTitle.spannable = name
@ -292,7 +293,7 @@ class MessageConversationInfoFragment : BaseFragment(), IToolBarSupportFragment,
private fun performDestroyConversation() {
val weakThis by weak(this)
showProgressDialog("leave_conversation_progress") and MessagePromises.getInstance(context!!).destroyConversation(accountKey, conversationId).successUi {
showProgressDialog("leave_conversation_progress") and MessagePromises.get(context!!).destroyConversation(accountKey, conversationId).successUi {
val f = weakThis ?: return@successUi
f.dismissProgressDialog("leave_conversation_progress")
f.activity?.setResult(RESULT_CLOSE)
@ -302,7 +303,7 @@ class MessageConversationInfoFragment : BaseFragment(), IToolBarSupportFragment,
private fun performClearMessages() {
val weakThis by weak(this)
showProgressDialog("clear_messages_progress") and MessagePromises.getInstance(context!!).clearMessages(accountKey, conversationId).successUi { succeed ->
showProgressDialog("clear_messages_progress") and MessagePromises.get(context!!).clearMessages(accountKey, conversationId).successUi { succeed ->
val f = weakThis ?: return@successUi
f.dismissDialogThen("clear_messages_progress") {
if (succeed) {
@ -315,7 +316,7 @@ class MessageConversationInfoFragment : BaseFragment(), IToolBarSupportFragment,
private fun performAddParticipant(user: ParcelableUser) {
ProgressDialogFragment.show(childFragmentManager, "add_participant_progress")
val weakThis by weak(this)
ConversationPromises.getInstance(context!!).addParticipants(accountKey,
ConversationPromises.get(context!!).addParticipants(accountKey,
conversationId, listOf(user)).alwaysUi {
weakThis?.dismissDialogThen("add_participant_progress") {
loaderManager.restartLoader(0, null, this)
@ -325,7 +326,7 @@ class MessageConversationInfoFragment : BaseFragment(), IToolBarSupportFragment,
private fun performSetNotificationDisabled(disabled: Boolean) {
val weakThis by weak(this)
showProgressDialog("set_notifications_disabled_progress") and ConversationPromises.getInstance(context!!).setNotificationDisabled(accountKey, conversationId, disabled).alwaysUi {
showProgressDialog("set_notifications_disabled_progress") and ConversationPromises.get(context!!).setNotificationDisabled(accountKey, conversationId, disabled).alwaysUi {
weakThis?.dismissProgressDialog("set_notifications_disabled_progress")
}
}

View File

@ -33,6 +33,7 @@ import android.text.SpannableStringBuilder
import android.text.TextUtils
import android.text.style.ReplacementSpan
import android.view.*
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.fragment_messages_conversation_new.*
import org.mariotaku.kpreferences.get
import org.mariotaku.ktextension.*
@ -53,6 +54,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Messages.Conversations
import org.mariotaku.twidere.task.twitter.message.SendMessageTask
import org.mariotaku.twidere.text.MarkForDeleteSpan
import org.mariotaku.twidere.util.IntentUtils
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.view.SimpleTextWatcher
import java.lang.ref.WeakReference
@ -69,10 +71,10 @@ class MessageNewConversationFragment : BaseFragment() {
set(value) {
val roundRadius = resources.getDimension(R.dimen.element_spacing_xsmall)
val spanPadding = resources.getDimension(R.dimen.element_spacing_xsmall)
val nameFirst = preferences[nameFirstKey]
editParticipants.text = SpannableStringBuilder().apply {
val manager = UserColorNameManager.get(context!!)
value.forEach { user ->
val displayName = userColorNameManager.getDisplayName(user)
val displayName = manager.getDisplayName(user)
val span = ParticipantSpan(user, displayName, roundRadius, spanPadding)
appendCompat(user.screen_name, span, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
append(" ")
@ -89,7 +91,7 @@ class MessageNewConversationFragment : BaseFragment() {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
linkHandlerTitle = getString(R.string.title_direct_messages_conversation_new)
usersAdapter = SelectableUsersAdapter(context!!, requestManager)
usersAdapter = SelectableUsersAdapter(context!!, Glide.with(this))
recyclerView.adapter = usersAdapter
recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
@ -140,10 +142,9 @@ class MessageNewConversationFragment : BaseFragment() {
}
}
})
val nameFirst = preferences[nameFirstKey]
val roundRadius = resources.getDimension(R.dimen.element_spacing_xsmall)
val spanPadding = resources.getDimension(R.dimen.element_spacing_xsmall)
usersAdapter.itemCheckedListener = itemChecked@ { pos, checked ->
usersAdapter.itemCheckedListener = itemChecked@{ pos, checked ->
val text: Editable = editParticipants.editableText ?: return@itemChecked false
val user = usersAdapter.getUser(pos)
if (checked) {
@ -154,7 +155,7 @@ class MessageNewConversationFragment : BaseFragment() {
if (start < 0 || end < 0 || end < start) return@forEach
text.delete(start, end)
}
val displayName = userColorNameManager.getDisplayName(user)
val displayName = UserColorNameManager.get(context!!).getDisplayName(user)
val span = ParticipantSpan(user, displayName, roundRadius, spanPadding)
text.appendCompat(user.screen_name, span, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
text.append(" ")

View File

@ -40,6 +40,7 @@ import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.Toolbar
import android.view.*
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager
import com.squareup.otto.Subscribe
import kotlinx.android.synthetic.main.activity_premium_dashboard.*
@ -84,6 +85,7 @@ import org.mariotaku.twidere.model.event.SendMessageTaskEvent
import org.mariotaku.twidere.promise.MessagePromises
import org.mariotaku.twidere.provider.TwidereDataStore.Messages
import org.mariotaku.twidere.service.LengthyOperationsService
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.task.twitter.message.GetMessagesTask
import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.view.ExtendedRecyclerView
@ -144,7 +146,7 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
return recyclerView.showContextMenuForChild(holder.itemView)
}
}
mediaPreviewAdapter = MediaPreviewAdapter(activity, requestManager)
mediaPreviewAdapter = MediaPreviewAdapter(activity, Glide.with(this))
mediaPreviewAdapter.listener = object : MediaPreviewAdapter.Listener {
override fun onRemoveClick(position: Int, holder: MediaPreviewViewHolder) {
@ -210,11 +212,11 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
override fun onStart() {
super.onStart()
bus.register(this)
BusSingleton.register(this)
}
override fun onStop() {
bus.unregister(this)
BusSingleton.unregister(this)
super.onStop()
}
@ -274,7 +276,7 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
}
override fun onCreateAdapter(context: Context, requestManager: RequestManager): MessagesConversationAdapter {
return MessagesConversationAdapter(context, this.requestManager)
return MessagesConversationAdapter(context, Glide.with(this))
}
override fun onCreateLayoutManager(context: Context): LinearLayoutManager {
@ -304,7 +306,7 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
R.id.recyclerView -> {
val message = adapter.getMessage(menuInfo.position)
val conversation = adapter.conversation
menu.setHeaderTitle(message.getSummaryText(context!!, userColorNameManager, conversation,
menu.setHeaderTitle(message.getSummaryText(context!!, UserColorNameManager.get(context!!), conversation,
preferences[nameFirstKey]))
activity!!.menuInflater.inflate(R.menu.menu_conversation_message_item, menu)
}
@ -328,7 +330,7 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
}
R.id.delete -> {
// TODO show progress
MessagePromises.getInstance(context!!).destroyMessage(message.account_key, message.conversation_id,
MessagePromises.get(context!!).destroyMessage(message.account_key, message.conversation_id,
message.id)
}
}
@ -514,15 +516,14 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
private fun markRead() {
// TODO: Promise progress
MessagePromises.getInstance(context!!).markRead(accountKey, conversationId)
MessagePromises.get(context!!).markRead(accountKey, conversationId)
}
private fun updateConversationStatus() {
val activity = this.activity ?: return
if (isDetached || activity.isFinishing) return
val conversation = adapter.conversation ?: return
val title = conversation.getTitle(activity, userColorNameManager,
preferences[nameFirstKey]).first
val title = conversation.getTitle(activity, UserColorNameManager.get(context!!)).first
val subtitle = conversation.getSubtitle(activity)
activity.title = title
val readOnly = conversation.readOnly
@ -550,7 +551,7 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(conversationTitle, null,
null, stateIcon, null)
requestManager.loadProfileImage(activity, conversation, preferences[profileImageStyleKey])
Glide.with(this).loadProfileImage(activity, conversation, preferences[profileImageStyleKey])
.into(conversationAvatar)
}

View File

@ -31,6 +31,7 @@ import android.view.ContextMenu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager
import com.squareup.otto.Subscribe
import kotlinx.android.synthetic.main.activity_premium_dashboard.*
@ -49,7 +50,6 @@ import org.mariotaku.twidere.adapter.MessagesEntriesAdapter.MessageConversationC
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.annotation.LoadMorePosition
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_TYPES
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.constant.newDocumentApiKey
import org.mariotaku.twidere.data.CursorObjectDataSourceFactory
import org.mariotaku.twidere.extension.accountKey
@ -65,11 +65,9 @@ import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.event.GetMessagesTaskEvent
import org.mariotaku.twidere.promise.MessagePromises
import org.mariotaku.twidere.provider.TwidereDataStore.Messages.Conversations
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.task.twitter.message.GetMessagesTask
import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.ErrorInfoStore
import org.mariotaku.twidere.util.IntentUtils
import org.mariotaku.twidere.util.Utils
import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.view.ExtendedRecyclerView
/**
@ -102,11 +100,11 @@ class MessagesEntriesFragment : AbsContentListRecyclerViewFragment<MessagesEntri
override fun onStart() {
super.onStart()
bus.register(this)
BusSingleton.register(this)
}
override fun onStop() {
bus.unregister(this)
BusSingleton.unregister(this)
super.onStop()
}
@ -124,7 +122,7 @@ class MessagesEntriesFragment : AbsContentListRecyclerViewFragment<MessagesEntri
}
override fun onCreateAdapter(context: Context, requestManager: RequestManager): MessagesEntriesAdapter {
return MessagesEntriesAdapter(context, this.requestManager)
return MessagesEntriesAdapter(context, Glide.with(this))
}
override fun triggerRefresh(): Boolean {
@ -189,8 +187,7 @@ class MessagesEntriesFragment : AbsContentListRecyclerViewFragment<MessagesEntri
val conversation = adapter.getConversation(info.position)
val inflater = MenuInflater(context)
inflater.inflate(R.menu.context_message_entry, menu)
menu.setHeaderTitle(conversation.getTitle(context!!, userColorNameManager,
preferences[nameFirstKey]).first)
menu.setHeaderTitle(conversation.getTitle(context!!, UserColorNameManager.get(context!!)).first)
}
override fun onContextItemSelected(item: MenuItem): Boolean {
@ -200,7 +197,7 @@ class MessagesEntriesFragment : AbsContentListRecyclerViewFragment<MessagesEntri
R.id.mark_read -> {
val conversation = adapter.getConversation(menuInfo.position)
// TODO: Promise progress
MessagePromises.getInstance(context!!).markRead(conversation.account_key, conversation.id)
MessagePromises.get(context!!).markRead(conversation.account_key, conversation.id)
return true
}
}

View File

@ -29,6 +29,7 @@ import android.support.v7.app.AlertDialog
import android.support.v7.app.AlertDialog.Builder
import android.view.View
import android.widget.Toast
import com.bumptech.glide.Glide
import nl.komponents.kovenant.Promise
import nl.komponents.kovenant.combine.and
import nl.komponents.kovenant.task
@ -70,7 +71,7 @@ abstract class AbsStatusDialogFragment : BaseDialogFragment() {
builder.setupAlertDialog()
adapter = DummyItemAdapter(context!!, requestManager = requestManager)
adapter = DummyItemAdapter(context!!, requestManager = Glide.with(this))
adapter.showCardActions = false
adapter.showAccountsColor = true

View File

@ -32,6 +32,8 @@ import org.mariotaku.twidere.extension.status
import org.mariotaku.twidere.fragment.BaseDialogFragment
import org.mariotaku.twidere.fragment.CreateUserBlockDialogFragment
import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.UserColorNameManager.Companion
class BlockStatusUsersDialogFragment : BaseDialogFragment() {
@ -41,9 +43,8 @@ class BlockStatusUsersDialogFragment : BaseDialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(context!!)
val referencedUsers = status.referencedUsers
val nameFirst = preferences[nameFirstKey]
val displayNames = referencedUsers.map {
userColorNameManager.getDisplayName(it)
UserColorNameManager.get(context!!).getDisplayName(it)
}.toTypedArray()
builder.setTitle(R.string.action_status_block_users)
builder.setItems(displayNames) { _, which ->

View File

@ -34,7 +34,7 @@ class DestroyStatusDialogFragment : AbsSimpleStatusOperationDialogFragment() {
get() = getString(R.string.destroy_status_confirm_message)
override fun onPerformAction(status: ParcelableStatus) {
StatusPromises.getInstance(context!!).destroy(status.account_key, status.id)
StatusPromises.get(context!!).destroy(status.account_key, status.id)
}
companion object {

View File

@ -32,6 +32,8 @@ import org.mariotaku.twidere.extension.status
import org.mariotaku.twidere.fragment.BaseDialogFragment
import org.mariotaku.twidere.fragment.CreateUserMuteDialogFragment
import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.UserColorNameManager.Companion
class MuteStatusUsersDialogFragment : BaseDialogFragment() {
@ -43,7 +45,7 @@ class MuteStatusUsersDialogFragment : BaseDialogFragment() {
val referencedUsers = status.referencedUsers
val nameFirst = preferences[nameFirstKey]
val displayNames = referencedUsers.map {
userColorNameManager.getDisplayName(it)
UserColorNameManager.get(context!!).getDisplayName(it)
}.toTypedArray()
builder.setTitle(R.string.action_status_mute_users)
builder.setItems(displayNames) { _, which ->

View File

@ -41,6 +41,7 @@ import org.mariotaku.twidere.constant.quickSendKey
import org.mariotaku.twidere.extension.*
import org.mariotaku.twidere.extension.model.canRetweet
import org.mariotaku.twidere.extension.model.isAccountRetweet
import org.mariotaku.twidere.extension.model.quoted
import org.mariotaku.twidere.fragment.BaseDialogFragment
import org.mariotaku.twidere.model.*
import org.mariotaku.twidere.model.draft.QuoteStatusActionExtras
@ -108,7 +109,7 @@ class RetweetQuoteDialogFragment : AbsStatusDialogFragment() {
}
})
quoteOriginal.visibility = if (status.retweet_id != null || status.quoted_id != null) {
quoteOriginal.visibility = if (status.retweet_id != null || status.attachment?.quoted?.id != null) {
View.VISIBLE
} else {
View.GONE
@ -116,7 +117,7 @@ class RetweetQuoteDialogFragment : AbsStatusDialogFragment() {
getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener {
if (!shouldQuoteRetweet(account) && status.isAccountRetweet) {
StatusPromises.getInstance(context).cancelRetweet(account.key, status.id, status.my_retweet_id)
StatusPromises.get(context).cancelRetweet(account.key, status.id, status.my_retweet_id)
dismiss()
} else if (retweetOrQuote(account, status, showProtectedConfirm)) {
dismiss()
@ -213,12 +214,12 @@ class RetweetQuoteDialogFragment : AbsStatusDialogFragment() {
commentText = getString(R.string.fanfou_repost_format, editingComment,
status.user_screen_name, status.text_plain)
} else {
if (status.quoted_user_is_protected && showProtectedConfirmation) {
if (status.quoted?.user_is_protected == true && showProtectedConfirmation) {
return false
}
commentText = getString(R.string.fanfou_repost_format, editingComment,
status.quoted_user_screen_name, status.quoted_text_plain)
update.repost_status_id = status.quoted_id
status.quoted?.user_screen_name, status.quoted?.text_plain)
update.repost_status_id = status.quoted?.id
}
if (FanfouValidator.calculateLength(commentText) > FanfouValidator.textLimit) {
commentText = commentText.substring(0, Math.max(FanfouValidator.textLimit,
@ -229,7 +230,7 @@ class RetweetQuoteDialogFragment : AbsStatusDialogFragment() {
val statusLink = if (!status.is_quote || !quoteOriginalStatus) {
LinkCreator.getStatusWebLink(status)
} else {
LinkCreator.getQuotedStatusWebLink(status)
LinkCreator.getQuotedStatusWebLink(status.quoted!!)
}
update.attachment_url = statusLink?.toString()
commentText = editingComment

View File

@ -67,6 +67,7 @@ import org.mariotaku.twidere.extension.*
import org.mariotaku.twidere.extension.data.observe
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.extension.model.originalId
import org.mariotaku.twidere.extension.model.quoted
import org.mariotaku.twidere.extension.view.calculateSpaceItemHeight
import org.mariotaku.twidere.fragment.BaseDialogFragment
import org.mariotaku.twidere.fragment.BaseFragment
@ -78,11 +79,13 @@ import org.mariotaku.twidere.model.event.FavoriteTaskEvent
import org.mariotaku.twidere.model.event.StatusListChangedEvent
import org.mariotaku.twidere.model.pagination.Pagination
import org.mariotaku.twidere.model.pagination.SinceMaxPagination
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.task.AbsAccountRequestTask
import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.ContentScrollHandler.ContentListSupport
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback
import org.mariotaku.twidere.util.RecyclerViewScrollHandler.RecyclerViewCallback
import org.mariotaku.twidere.util.UserColorNameManager.Companion
import org.mariotaku.twidere.view.CardMediaContainer.OnMediaClickListener
import org.mariotaku.twidere.view.ExtendedRecyclerView
import org.mariotaku.twidere.view.holder.GapViewHolder
@ -160,16 +163,15 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
private lateinit var statusActivitySummaryLiveData: StatusActivitySummaryLiveData
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
val activity = activity ?: return
when (requestCode) {
REQUEST_SET_COLOR -> {
val status = adapter.status ?: return
if (resultCode == Activity.RESULT_OK) {
if (data == null) return
val color = data.getIntExtra(EXTRA_COLOR, Color.TRANSPARENT)
userColorNameManager.setUserColor(status.user_key, color)
UserColorNameManager.get(context!!).setUserColor(status.user_key, color)
} else if (resultCode == ColorPickerDialogActivity.RESULT_CLEARED) {
userColorNameManager.clearUserColor(status.user_key)
UserColorNameManager.get(context!!).clearUserColor(status.user_key)
}
loaderManager.restartLoader(LOADER_ID_DETAIL_STATUS, arguments, this)
}
@ -231,7 +233,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
override fun onQuotedMediaClick(holder: IStatusViewHolder, view: View, current: ParcelableMedia, statusPosition: Int) {
val status = adapter.getStatus(statusPosition)
val quotedMedia = status.quoted_media ?: return
val quotedMedia = status.quoted?.media ?: return
IntentUtils.openMedia(activity!!, status.account_key, status.is_possibly_sensitive, status,
current, quotedMedia, preferences[newDocumentApiKey],
preferences[displaySensitiveContentsKey])
@ -258,7 +260,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
override fun onQuotedStatusClick(holder: IStatusViewHolder, position: Int) {
val status = adapter.getStatus(position)
val quotedId = status.quoted_id ?: return
val quotedId = status.quoted?.id ?: return
IntentUtils.openStatus(activity!!, status.account_key, quotedId)
}
@ -281,11 +283,11 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
override fun onMediaClick(view: View, current: ParcelableMedia, accountKey: UserKey?, id: Long) {
val status = adapter.status ?: return
if ((view.parent as View).id == R.id.quotedMediaPreview && status.quoted_media != null) {
IntentUtils.openMediaDirectly(activity!!, accountKey, status.quoted_media!!, current,
if ((view.parent as View).id == R.id.quotedMediaPreview && status.attachment?.quoted?.media != null) {
IntentUtils.openMediaDirectly(activity!!, accountKey, status.attachment?.quoted?.media!!, current,
newDocument = preferences[newDocumentApiKey], status = status)
} else if (status.media != null) {
IntentUtils.openMediaDirectly(activity!!, accountKey, status.media!!, current,
} else if (status.attachment?.media != null) {
IntentUtils.openMediaDirectly(activity!!, accountKey, status.attachment?.media!!, current,
newDocument = preferences[newDocumentApiKey], status = status)
}
}
@ -503,7 +505,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
override fun onStart() {
super.onStart()
bus.register(this)
BusSingleton.register(this)
recyclerView.addOnScrollListener(scrollListener)
recyclerView.setOnTouchListener(scrollListener.touchListener)
}
@ -511,7 +513,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
override fun onStop() {
recyclerView.setOnTouchListener(null)
recyclerView.removeOnScrollListener(scrollListener)
bus.unregister(this)
BusSingleton.unregister(this)
super.onStop()
}
@ -521,7 +523,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
val status = adapter.getStatus(contextMenuInfo.position)
val inflater = MenuInflater(context)
inflater.inflate(R.menu.action_status, menu)
MenuUtils.setupForStatus(context!!, menu, preferences, userColorNameManager, status)
MenuUtils.setupForStatus(context!!, menu, preferences, UserColorNameManager.get(context!!), status)
}
override fun onContextItemSelected(item: MenuItem): Boolean {
@ -536,7 +538,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
return true
}
return MenuUtils.handleStatusClick(activity!!, this, fragmentManager!!,
preferences, userColorNameManager, status, item)
preferences, UserColorNameManager.get(context!!), status, item)
}
@Subscribe

View File

@ -12,12 +12,10 @@ import nl.komponents.kovenant.ui.alwaysUi
import org.mariotaku.ktextension.toWeak
import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.SYNC_PREFERENCES_NAME
import org.mariotaku.twidere.extension.applyTheme
import org.mariotaku.twidere.extension.dismissProgressDialog
import org.mariotaku.twidere.extension.onShow
import org.mariotaku.twidere.extension.showProgressDialog
import org.mariotaku.twidere.extension.*
import org.mariotaku.twidere.fragment.BaseDialogFragment
import org.mariotaku.twidere.fragment.BasePreferenceFragment
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.TaskServiceRunner
class SyncSettingsFragment : BasePreferenceFragment() {
@ -29,11 +27,11 @@ class SyncSettingsFragment : BasePreferenceFragment() {
override fun onStart() {
super.onStart()
bus.register(this)
BusSingleton.register(this)
}
override fun onStop() {
bus.unregister(this)
BusSingleton.unregister(this)
super.onStop()
}

View File

@ -69,6 +69,7 @@ import org.mariotaku.twidere.data.fetcher.StatusesFetcher
import org.mariotaku.twidere.extension.*
import org.mariotaku.twidere.extension.adapter.removeStatuses
import org.mariotaku.twidere.extension.data.observe
import org.mariotaku.twidere.extension.model.quoted
import org.mariotaku.twidere.extension.view.PositionWithOffset
import org.mariotaku.twidere.extension.view.firstVisibleItemPosition
import org.mariotaku.twidere.extension.view.firstVisibleItemPositionWithOffset
@ -91,9 +92,11 @@ import org.mariotaku.twidere.model.tab.extra.TimelineTabExtras
import org.mariotaku.twidere.model.timeline.TimelineFilter
import org.mariotaku.twidere.promise.StatusPromises
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.task.CreateFavoriteTask
import org.mariotaku.twidere.task.statuses.GetStatusesTask
import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.UserColorNameManager.Companion
import org.mariotaku.twidere.view.ExtendedRecyclerView
import org.mariotaku.twidere.view.holder.GapViewHolder
import org.mariotaku.twidere.view.holder.TimelineFilterHeaderViewHolder
@ -174,11 +177,11 @@ abstract class AbsTimelineFragment : AbsContentRecyclerViewFragment<ParcelableSt
override fun onStart() {
super.onStart()
recyclerView.addOnScrollListener(scrollHandler)
bus.register(busEventHandler)
BusSingleton.register(busEventHandler)
}
override fun onStop() {
bus.unregister(busEventHandler)
BusSingleton.unregister(busEventHandler)
recyclerView.removeOnScrollListener(scrollHandler)
if (userVisibleHint) {
saveReadPosition(layoutManager.firstVisibleItemPosition)
@ -215,7 +218,7 @@ abstract class AbsTimelineFragment : AbsContentRecyclerViewFragment<ParcelableSt
val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo
val status = adapter.getStatus(contextMenuInfo.position)
inflater.inflate(R.menu.action_status, menu)
MenuUtils.setupForStatus(context, menu, preferences, userColorNameManager, status)
MenuUtils.setupForStatus(context, menu, preferences, UserColorNameManager.get(this.context!!), status)
}
override fun onContextItemSelected(item: MenuItem): Boolean {
@ -240,7 +243,7 @@ abstract class AbsTimelineFragment : AbsContentRecyclerViewFragment<ParcelableSt
return true
}
else -> return MenuUtils.handleStatusClick(context, this, fragmentManager!!,
preferences, userColorNameManager, status, item)
preferences, UserColorNameManager.get(this.context!!), status, item)
}
}
@ -570,7 +573,7 @@ abstract class AbsTimelineFragment : AbsContentRecyclerViewFragment<ParcelableSt
override fun onQuotedMediaClick(holder: IStatusViewHolder, view: View, current: ParcelableMedia, statusPosition: Int) {
val context = context ?: return
val status = getFullStatus(statusPosition)
val quotedMedia = status.quoted_media ?: return
val quotedMedia = status.quoted?.media ?: return
IntentUtils.openMedia(context, status.account_key, status.is_possibly_sensitive, status,
current, quotedMedia, preferences[newDocumentApiKey], preferences[displaySensitiveContentsKey])
}
@ -578,7 +581,7 @@ abstract class AbsTimelineFragment : AbsContentRecyclerViewFragment<ParcelableSt
override fun onQuotedStatusClick(holder: IStatusViewHolder, position: Int) {
val context = context ?: return
val status = getFullStatus(position)
val quotedId = status.quoted_id ?: return
val quotedId = status.quoted?.id ?: return
IntentUtils.openStatus(context, status.account_key, quotedId)
}

View File

@ -69,10 +69,9 @@ import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.event.UserListSubscriptionEvent
import org.mariotaku.twidere.model.event.UserListUpdatedEvent
import org.mariotaku.twidere.promise.UserListPromises
import org.mariotaku.twidere.util.IntentUtils
import org.mariotaku.twidere.util.LinkCreator
import org.mariotaku.twidere.util.MenuUtils
import org.mariotaku.twidere.util.Utils
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.UserColorNameManager.Companion
import org.mariotaku.twidere.util.shortcut.ShortcutCreator
class UserListFragment : AbsToolbarTabPagesFragment(), OnClickListener,
@ -100,11 +99,11 @@ class UserListFragment : AbsToolbarTabPagesFragment(), OnClickListener,
override fun onStart() {
super.onStart()
bus.register(this)
BusSingleton.register(this)
}
override fun onStop() {
bus.unregister(this)
BusSingleton.unregister(this)
super.onStop()
}
@ -401,7 +400,7 @@ class UserListFragment : AbsToolbarTabPagesFragment(), OnClickListener,
messageBuilder.append('\n')
}
messageBuilder.append(getString(R.string.label_created_by_name,
userColorNameManager.getDisplayName(userList)))
UserColorNameManager.get(context!!).getDisplayName(userList)))
val builder = AlertDialog.Builder(context!!)
builder.setTitle(userList.name)
builder.setMessage(messageBuilder)

View File

@ -29,12 +29,14 @@ import com.squareup.otto.Subscribe
import org.mariotaku.ktextension.setItemAvailability
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.fragment.CreateUserListDialogFragment
import org.mariotaku.twidere.fragment.ParcelableUserListsFragment
import org.mariotaku.twidere.loader.userlists.UserListOwnershipsLoader
import org.mariotaku.twidere.model.ParcelableUserList
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.event.UserListDestroyedEvent
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.Utils
class UserListsOwnershipsFragment : ParcelableUserListsFragment() {
@ -91,11 +93,11 @@ class UserListsOwnershipsFragment : ParcelableUserListsFragment() {
override fun onStart() {
super.onStart()
bus.register(this)
BusSingleton.register(this)
}
override fun onStop() {
bus.unregister(this)
BusSingleton.unregister(this)
super.onStop()
}

View File

@ -63,13 +63,13 @@ class IncomingFriendshipsFragment : AbsUsersFragment(), IUsersAdapter.RequestCli
override fun onAcceptClicked(holder: UserViewHolder, position: Int) {
val user = adapter.getUser(position) ?: return
val accountKey = user.account_key ?: return
FriendshipPromises.getInstance(context!!).accept(accountKey, user.key)
FriendshipPromises.get(context!!).accept(accountKey, user.key)
}
override fun onDenyClicked(holder: UserViewHolder, position: Int) {
val user = adapter.getUser(position) ?: return
val accountKey = user.account_key ?: return
FriendshipPromises.getInstance(context!!).deny(accountKey, user.key)
FriendshipPromises.get(context!!).deny(accountKey, user.key)
}
@SuppressLint("SwitchIntDef")

View File

@ -29,15 +29,17 @@ import kotlinx.android.synthetic.main.fragment_content_recyclerview.*
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.data.fetcher.UsersFetcher
import org.mariotaku.twidere.data.fetcher.users.UserListMembersFetcher
import org.mariotaku.twidere.extension.*
import org.mariotaku.twidere.fragment.AbsUsersFragment
import org.mariotaku.twidere.fragment.DeleteUserListMembersDialogFragment
import org.mariotaku.twidere.fragment.userlist.UserListFragment
import org.mariotaku.twidere.data.fetcher.users.UserListMembersFetcher
import org.mariotaku.twidere.model.ParcelableUserList
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.event.UserListMembersChangedEvent
import org.mariotaku.twidere.model.util.ParcelableUserListUtils
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.view.ExtendedRecyclerView
import org.mariotaku.twidere.view.holder.UserViewHolder
import java.util.*
@ -71,11 +73,11 @@ class UserListMembersFragment : AbsUsersFragment() {
override fun onStart() {
super.onStart()
bus.register(this)
BusSingleton.register(this)
}
override fun onStop() {
bus.unregister(this)
BusSingleton.unregister(this)
super.onStop()
}
@ -98,16 +100,16 @@ class UserListMembersFragment : AbsUsersFragment() {
if (accountKey != userKey) return
val inflater = MenuInflater(context)
val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo?
val user = adapter.getUser(contextMenuInfo!!.position) ?: return
val user = adapter.getUser(contextMenuInfo!!.position)
inflater.inflate(R.menu.action_user_list_member, menu)
menu.setHeaderTitle(userColorNameManager.getDisplayName(user))
menu.setHeaderTitle(UserColorNameManager.get(context!!).getDisplayName(user))
}
override fun onContextItemSelected(item: MenuItem): Boolean {
if (!userVisibleHint) return false
val userList = userList ?: return false
val contextMenuInfo = item.menuInfo as ExtendedRecyclerView.ContextMenuInfo
val user = adapter.getUser(contextMenuInfo.position) ?: return false
val user = adapter.getUser(contextMenuInfo.position)
when (item.itemId) {
R.id.delete_from_list -> {
DeleteUserListMembersDialogFragment.show(fragmentManager!!, userList, user)

View File

@ -3,7 +3,6 @@ package org.mariotaku.twidere.loader
import android.content.Context
import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.data.fetcher.users.UserSearchFetcher
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.util.UserColorNameManager
import javax.inject.Inject
@ -17,6 +16,7 @@ class CacheUserSearchLoader(
fromUser: Boolean
) : UserSearchFetcher(query) {
@Inject
@Deprecated(message = "Deprecated", replaceWith = ReplaceWith("UserColorNameManager.get(context!!)", imports = ["org.mariotaku.twidere.util.UserColorNameManager"]))
internal lateinit var userColorNameManager: UserColorNameManager
init {

Some files were not shown because too many files have changed in this diff Show More