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

View File

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

View File

@ -147,20 +147,20 @@ public class ParcelableActivity extends ParcelableStatus implements Parcelable {
", max_position='" + max_position + '\'' + ", max_position='" + max_position + '\'' +
", min_position='" + min_position + '\'' + ", min_position='" + min_position + '\'' +
", source_keys=" + Arrays.toString(source_keys) + ", source_keys=" + Arrays.toString(source_keys) +
", _id=" + _id +
", sources=" + Arrays.toString(sources) + ", sources=" + Arrays.toString(sources) +
", id='" + id + '\'' + ", _id=" + _id +
", targets=" + targets + ", targets=" + targets +
", account_key=" + account_key + ", id='" + id + '\'' +
", target_objects=" + target_objects + ", target_objects=" + target_objects +
", account_key=" + account_key +
", sources_lite=" + Arrays.toString(sources_lite) +
", sort_id=" + sort_id + ", sort_id=" + sort_id +
", position_key=" + position_key + ", position_key=" + position_key +
", sources_lite=" + Arrays.toString(sources_lite) +
", timestamp=" + timestamp +
", summary_line=" + Arrays.toString(summary_line) + ", summary_line=" + Arrays.toString(summary_line) +
", timestamp=" + timestamp +
", has_following_source=" + has_following_source + ", has_following_source=" + has_following_source +
", user_key=" + user_key +
", after_filtered_sources=" + Arrays.toString(after_filtered_sources) + ", after_filtered_sources=" + Arrays.toString(after_filtered_sources) +
", user_key=" + user_key +
", retweet_id='" + retweet_id + '\'' + ", retweet_id='" + retweet_id + '\'' +
", retweeted_by_user_key=" + retweeted_by_user_key + ", retweeted_by_user_key=" + retweeted_by_user_key +
", retweet_timestamp=" + retweet_timestamp + ", 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_status_id='" + in_reply_to_status_id + '\'' +
", in_reply_to_user_key=" + in_reply_to_user_key + ", in_reply_to_user_key=" + in_reply_to_user_key +
", my_retweet_id='" + my_retweet_id + '\'' + ", 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_gap=" + is_gap +
", is_retweet=" + is_retweet + ", is_retweet=" + is_retweet +
", retweeted=" + retweeted + ", retweeted=" + retweeted +
@ -182,8 +179,6 @@ public class ParcelableActivity extends ParcelableStatus implements Parcelable {
", user_is_protected=" + user_is_protected + ", user_is_protected=" + user_is_protected +
", user_is_verified=" + user_is_verified + ", user_is_verified=" + user_is_verified +
", is_quote=" + is_quote + ", 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_name='" + retweeted_by_user_name + '\'' +
", retweeted_by_user_screen_name='" + retweeted_by_user_screen_name + '\'' + ", retweeted_by_user_screen_name='" + retweeted_by_user_screen_name + '\'' +
", retweeted_by_user_profile_image='" + retweeted_by_user_profile_image + '\'' + ", 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 + '\'' + ", user_profile_image_url='" + user_profile_image_url + '\'' +
", text_unescaped='" + text_unescaped + '\'' + ", text_unescaped='" + text_unescaped + '\'' +
", card_name='" + card_name + '\'' + ", 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 + ", location=" + location +
", place_full_name='" + place_full_name + '\'' + ", place_full_name='" + place_full_name + '\'' +
", mentions=" + Arrays.toString(mentions) + ", mentions=" + Arrays.toString(mentions) +
", media=" + Arrays.toString(media) + ", attachment=" + attachment +
", quoted_media=" + Arrays.toString(quoted_media) +
", card=" + card +
", extras=" + extras + ", extras=" + extras +
", spans=" + Arrays.toString(spans) + ", spans=" + Arrays.toString(spans) +
", quoted_spans=" + Arrays.toString(quoted_spans) +
", account_color=" + account_color + ", account_color=" + account_color +
", filter_flags=" + filter_flags + ", filter_flags=" + filter_flags +
", filter_users=" + Arrays.toString(filter_users) + ", filter_users=" + Arrays.toString(filter_users) +

View File

@ -145,19 +145,6 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@CursorField(Statuses.MY_RETWEET_ID) @CursorField(Statuses.MY_RETWEET_ID)
public String 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") @JsonField(name = "is_gap")
@CursorField(Statuses.IS_GAP) @CursorField(Statuses.IS_GAP)
public boolean is_gap; public boolean is_gap;
@ -194,14 +181,6 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@CursorField(Statuses.IS_QUOTE) @CursorField(Statuses.IS_QUOTE)
public boolean 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") @JsonField(name = "retweeted_by_user_name")
@CursorField(Statuses.RETWEETED_BY_USER_NAME) @CursorField(Statuses.RETWEETED_BY_USER_NAME)
public String 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") @JsonField(name = "text_unescaped")
@CursorField(Statuses.TEXT_UNESCAPED) @CursorField(Statuses.TEXT_UNESCAPED)
public String text_unescaped; public String text_unescaped;
@Nullable
@Nullable
@JsonField(name = "card_name") @JsonField(name = "card_name")
@CursorField(Statuses.CARD_NAME) @CursorField(Statuses.CARD_NAME)
public String 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") @JsonField(name = "location")
@CursorField(value = Statuses.LOCATION, converter = ParcelableLocation.Converter.class) @CursorField(value = Statuses.LOCATION, converter = ParcelableLocation.Converter.class)
@Nullable @Nullable
@ -295,22 +250,9 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@CursorField(value = Statuses.MENTIONS_JSON, converter = LoganSquareCursorFieldConverter.class) @CursorField(value = Statuses.MENTIONS_JSON, converter = LoganSquareCursorFieldConverter.class)
public ParcelableUserMention[] mentions; public ParcelableUserMention[] mentions;
// TODO: Simplify for list loader
@JsonField(name = "media")
@CursorField(value = Statuses.MEDIA_JSON, converter = LoganSquareCursorFieldConverter.class)
@Nullable @Nullable
public ParcelableMedia[] media; @CursorField(value = Statuses.ATTACHMENT, converter = LoganSquareCursorFieldConverter.class)
public ParcelableStatusAttachment attachment;
// 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;
@JsonField(name = "extras") @JsonField(name = "extras")
@CursorField(value = Statuses.EXTRAS, converter = LoganSquareCursorFieldConverter.class) @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) @CursorField(value = Statuses.SPANS, converter = LoganSquareCursorFieldConverter.class)
public SpanItem[] spans; public SpanItem[] spans;
@JsonField(name = "quoted_spans")
@CursorField(value = Statuses.QUOTED_SPANS, converter = LoganSquareCursorFieldConverter.class)
public SpanItem[] quoted_spans;
@JsonField(name = "account_color") @JsonField(name = "account_color")
@CursorField(Statuses.ACCOUNT_COLOR) @CursorField(Statuses.ACCOUNT_COLOR)
public int 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_status_id='" + in_reply_to_status_id + '\'' +
", in_reply_to_user_key=" + in_reply_to_user_key + ", in_reply_to_user_key=" + in_reply_to_user_key +
", my_retweet_id='" + my_retweet_id + '\'' + ", 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_gap=" + is_gap +
", is_retweet=" + is_retweet + ", is_retweet=" + is_retweet +
", retweeted=" + retweeted + ", retweeted=" + retweeted +
@ -432,8 +367,6 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
", user_is_protected=" + user_is_protected + ", user_is_protected=" + user_is_protected +
", user_is_verified=" + user_is_verified + ", user_is_verified=" + user_is_verified +
", is_quote=" + is_quote + ", 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_name='" + retweeted_by_user_name + '\'' +
", retweeted_by_user_screen_name='" + retweeted_by_user_screen_name + '\'' + ", retweeted_by_user_screen_name='" + retweeted_by_user_screen_name + '\'' +
", retweeted_by_user_profile_image='" + retweeted_by_user_profile_image + '\'' + ", 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 + '\'' + ", user_profile_image_url='" + user_profile_image_url + '\'' +
", text_unescaped='" + text_unescaped + '\'' + ", text_unescaped='" + text_unescaped + '\'' +
", card_name='" + card_name + '\'' + ", 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 + ", location=" + location +
", place_full_name='" + place_full_name + '\'' + ", place_full_name='" + place_full_name + '\'' +
", mentions=" + Arrays.toString(mentions) + ", mentions=" + Arrays.toString(mentions) +
", media=" + Arrays.toString(media) + ", attachment=" + attachment +
", quoted_media=" + Arrays.toString(quoted_media) +
", card=" + card +
", extras=" + extras + ", extras=" + extras +
", spans=" + Arrays.toString(spans) + ", spans=" + Arrays.toString(spans) +
", quoted_spans=" + Arrays.toString(quoted_spans) +
", account_color=" + account_color + ", account_color=" + account_color +
", filter_flags=" + filter_flags + ", filter_flags=" + filter_flags +
", filter_users=" + Arrays.toString(filter_users) + ", filter_users=" + Arrays.toString(filter_users) +
@ -478,7 +402,7 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@AfterCursorObjectCreated @AfterCursorObjectCreated
void finishCursorObjectCreation() { void finishCursorObjectCreation() {
card_name = card != null ? card.name : null; card_name = (attachment != null && attachment.card != null) ? attachment.card.name : null;
fixSortId(); fixSortId();
} }
@ -532,9 +456,6 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@JsonField(name = "external_url") @JsonField(name = "external_url")
public String external_url; public String external_url;
@JsonField(name = "quoted_external_url")
public String quoted_external_url;
@JsonField(name = "retweeted_external_url") @JsonField(name = "retweeted_external_url")
public String 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") @JsonField(name = "url_display")
@ParcelableThisPlease @ParcelableThisPlease
public String url_display; public String url_display;
@JsonField(name = "moved")
@Nullable
public ParcelableLiteUser moved;
@Override @Override

View File

@ -19,6 +19,8 @@
package org.mariotaku.twidere.model.tab.argument; package org.mariotaku.twidere.model.tab.argument;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.CallSuper; import android.support.annotation.CallSuper;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
@ -26,6 +28,7 @@ import android.support.annotation.Nullable;
import com.bluelinelabs.logansquare.LoganSquare; import com.bluelinelabs.logansquare.LoganSquare;
import com.bluelinelabs.logansquare.annotation.JsonField; import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject; import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import org.mariotaku.twidere.TwidereConstants; import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.annotation.CustomTabType; import org.mariotaku.twidere.annotation.CustomTabType;
@ -34,8 +37,9 @@ import org.mariotaku.twidere.model.UserKey;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
@ParcelablePlease
@JsonObject @JsonObject
public class TabArguments implements TwidereConstants { public class TabArguments implements Parcelable {
@JsonField(name = "account_id") @JsonField(name = "account_id")
String accountId; String accountId;
@ -63,7 +67,7 @@ public class TabArguments implements TwidereConstants {
for (UserKey key : accountKeys) { for (UserKey key : accountKeys) {
if (key == null) return; if (key == null) return;
} }
bundle.putParcelableArray(EXTRA_ACCOUNT_KEYS, accountKeys); bundle.putParcelableArray(TwidereConstants.EXTRA_ACCOUNT_KEYS, accountKeys);
} else if (accountId != null) { } else if (accountId != null) {
long id = Long.MIN_VALUE; long id = Long.MIN_VALUE;
try { try {
@ -73,10 +77,10 @@ public class TabArguments implements TwidereConstants {
} }
if (id != Long.MIN_VALUE && id <= 0) { if (id != Long.MIN_VALUE && id <= 0) {
// account_id = -1, means no account selected // account_id = -1, means no account selected
bundle.putParcelableArray(EXTRA_ACCOUNT_KEYS, null); bundle.putParcelableArray(TwidereConstants.EXTRA_ACCOUNT_KEYS, null);
return; 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; 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.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease; import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import org.mariotaku.twidere.TwidereConstants;
/** /**
* Created by mariotaku on 16/3/6. * Created by mariotaku on 16/3/6.
*/ */
@ -47,7 +49,7 @@ public class TextQueryArguments extends TabArguments implements Parcelable {
@Override @Override
public void copyToBundle(@NonNull Bundle bundle) { public void copyToBundle(@NonNull Bundle bundle) {
super.copyToBundle(bundle); super.copyToBundle(bundle);
bundle.putString(EXTRA_QUERY, query); bundle.putString(TwidereConstants.EXTRA_QUERY, query);
} }
@Override @Override

View File

@ -27,6 +27,7 @@ import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject; import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease; import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.model.UserKey; import org.mariotaku.twidere.model.UserKey;
@ParcelablePlease @ParcelablePlease
@ -37,6 +38,14 @@ public class UserArguments extends TabArguments implements Parcelable {
@JsonField(name = "user_key") @JsonField(name = "user_key")
UserKey userKey; UserKey userKey;
public String getUserId() {
return userId;
}
public UserKey getUserKey() {
return userKey;
}
public void setUserKey(UserKey userKey) { public void setUserKey(UserKey userKey) {
this.userKey = userKey; this.userKey = userKey;
} }
@ -45,9 +54,9 @@ public class UserArguments extends TabArguments implements Parcelable {
public void copyToBundle(@NonNull Bundle bundle) { public void copyToBundle(@NonNull Bundle bundle) {
super.copyToBundle(bundle); super.copyToBundle(bundle);
if (userKey == null) { if (userKey == null) {
bundle.putParcelable(EXTRA_USER_KEY, UserKey.valueOf(userId)); bundle.putParcelable(TwidereConstants.EXTRA_USER_KEY, UserKey.valueOf(userId));
} else { } 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.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease; import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import org.mariotaku.twidere.TwidereConstants;
/** /**
* Created by mariotaku on 16/3/6. * Created by mariotaku on 16/3/6.
*/ */
@ -47,7 +49,7 @@ public class UserListArguments extends TabArguments implements Parcelable {
@Override @Override
public void copyToBundle(@NonNull Bundle bundle) { public void copyToBundle(@NonNull Bundle bundle) {
super.copyToBundle(bundle); super.copyToBundle(bundle);
bundle.putString(EXTRA_LIST_ID, listId); bundle.putString(TwidereConstants.EXTRA_LIST_ID, listId);
} }
@Override @Override

View File

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

View File

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

View File

@ -148,6 +148,10 @@ android {
} }
androidExtensions {
experimental = true
}
repositories { repositories {
mavenLocal() mavenLocal()
maven { url 'https://s3.amazonaws.com/repo.commonsware.com' } maven { url 'https://s3.amazonaws.com/repo.commonsware.com' }
@ -160,6 +164,7 @@ dependencies {
kapt "com.hannesdorfmann.parcelableplease:processor:${libVersions['ParcelablePlease']}" kapt "com.hannesdorfmann.parcelableplease:processor:${libVersions['ParcelablePlease']}"
kapt "com.google.dagger:dagger-compiler:${libVersions['Dagger']}" kapt "com.google.dagger:dagger-compiler:${libVersions['Dagger']}"
kapt "com.github.mariotaku.ObjectCursor:processor:${libVersions['ObjectCursor']}" 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.common')
implementation project(':twidere.component.nyan') implementation project(':twidere.component.nyan')
@ -250,7 +255,6 @@ dependencies {
implementation "com.google.android.exoplayer:extension-okhttp:${libVersions['Exoplayer']}" implementation "com.google.android.exoplayer:extension-okhttp:${libVersions['Exoplayer']}"
implementation "com.github.bumptech.glide:glide:${libVersions['Glide']}" implementation "com.github.bumptech.glide:glide:${libVersions['Glide']}"
implementation "com.github.bumptech.glide:okhttp3-integration:${libVersions['GlideOkHttp3']}@aar" 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.theartofdev.edmodo:android-image-cropper:${libVersions['AndroidImageCropper']}"
implementation "com.github.mariotaku.MediaViewerLibrary:base:${libVersions['MediaViewerLibrary']}" 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
private fun InputStream.contentEquals(that: InputStream): Boolean { var len2 = 0
var len1 = 0 val buf1 = ByteArray(8192)
var len2 = 0 val buf2 = ByteArray(8192)
val buf1 = ByteArray(8192) while (len1 != -1 && len2 != -1) {
val buf2 = ByteArray(8192) len1 = this.read(buf1)
while (len1 != -1 && len2 != -1) { len2 = that.read(buf2)
len1 = this.read(buf1) if (!buf1.contentEquals(buf2)) {
len2 = that.read(buf2) return false
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:name="override_tinted_status_bar_defaults"
android:value="true"/> 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 <activity
android:name=".activity.MainActivity" android:name=".activity.MainActivity"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"

View File

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

View File

@ -24,7 +24,6 @@ import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat; 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) { public static void setForeground(View view, Drawable foreground) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
ViewAccessorICS.setForeground(view, foreground); ViewAccessorICS.setForeground(view, foreground);

View File

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

View File

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

View File

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

View File

@ -212,7 +212,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
bottomMenuAnimator = ViewAnimator() bottomMenuAnimator = ViewAnimator()
bottomMenuAnimator.setupViews() bottomMenuAnimator.setupViews()
mediaPreviewAdapter = MediaPreviewAdapter(this, requestManager) mediaPreviewAdapter = MediaPreviewAdapter(this, Glide.with(this))
mediaPreviewAdapter.listener = object : MediaPreviewAdapter.Listener { mediaPreviewAdapter.listener = object : MediaPreviewAdapter.Listener {
override fun onEditClick(position: Int, holder: MediaPreviewViewHolder) { override fun onEditClick(position: Int, holder: MediaPreviewViewHolder) {
attachedMediaPreview.showContextMenuForChild(holder.itemView) attachedMediaPreview.showContextMenuForChild(holder.itemView)
@ -832,11 +832,12 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
val displayDoneIcon = isAccountSelectorVisible val displayDoneIcon = isAccountSelectorVisible
val requestManager = Glide.with(this)
if (single != null) { if (single != null) {
accountsCount.text = null accountsCount.text = null
if (displayDoneIcon) { if (displayDoneIcon) {
Glide.clear(accountProfileImage) requestManager.clear(accountProfileImage)
accountProfileImage.setColorFilter(ThemeUtils.getColorFromAttribute(this, accountProfileImage.setColorFilter(ThemeUtils.getColorFromAttribute(this,
android.R.attr.colorForeground)) android.R.attr.colorForeground))
accountProfileImage.scaleType = ImageView.ScaleType.CENTER_INSIDE accountProfileImage.scaleType = ImageView.ScaleType.CENTER_INSIDE
@ -852,7 +853,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
} else { } else {
accountsCount.text = accounts.size.toString() accountsCount.text = accounts.size.toString()
Glide.clear(accountProfileImage) requestManager.clear(accountProfileImage)
if (displayDoneIcon) { if (displayDoneIcon) {
accountProfileImage.setColorFilter(ThemeUtils.getColorFromAttribute(this, accountProfileImage.setColorFilter(ThemeUtils.getColorFromAttribute(this,
android.R.attr.colorForeground)) 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)) { if (status.is_retweet && !TextUtils.isEmpty(status.retweeted_by_user_screen_name)) {
status.retweeted_by_user_acct?.addTo(mentions) status.retweeted_by_user_acct?.addTo(mentions)
} }
if (status.is_quote && !TextUtils.isEmpty(status.quoted_user_screen_name)) { if (status.is_quote && !TextUtils.isEmpty(status.quoted?.user_screen_name)) {
status.quoted_user_acct?.addTo(mentions) status.quoted?.user_acct?.addTo(mentions)
} }
when (statusAccount.type) { when (statusAccount.type) {
AccountType.FANFOU -> { AccountType.FANFOU -> {
addFanfouHtmlToMentions(status.text_unescaped, status.spans, mentions) addFanfouHtmlToMentions(status.text_unescaped, status.spans, mentions)
if (status.is_quote) { val quoted = status.quoted
addFanfouHtmlToMentions(status.quoted_text_unescaped, status.quoted_spans, mentions) if (status.is_quote && quoted!= null) {
addFanfouHtmlToMentions(quoted.text_unescaped, quoted.spans, mentions)
} }
} }
AccountType.MASTODON -> { AccountType.MASTODON -> {
@ -982,11 +984,11 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
status.mentions.filterNot { status.mentions.filterNot {
it.key == status.account_key || it.screen_name.isNullOrEmpty() it.key == status.account_key || it.screen_name.isNullOrEmpty()
}.mapTo(mentions) { it.getAcct(statusAccount.key) } }.mapTo(mentions) { it.getAcct(statusAccount.key) }
mentions.addAll(extractor.extractMentionedScreennames(status.quoted_text_plain)) mentions.addAll(extractor.extractMentionedScreennames(status.quoted?.text_plain))
} else { } else {
mentions.addAll(extractor.extractMentionedScreennames(status.text_plain)) mentions.addAll(extractor.extractMentionedScreennames(status.text_plain))
if (status.is_quote) { 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() showDefaultLabelAndHint()
return false 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.spannable = getString(R.string.label_quote_name_text, replyToName, status.text_unescaped)
replyLabel.visibility = View.VISIBLE replyLabel.visibility = View.VISIBLE
editText.hint = getString(R.string.label_quote_name, replyToName) editText.hint = getString(R.string.label_quote_name, replyToName)
@ -1158,7 +1160,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
showDefaultLabelAndHint() showDefaultLabelAndHint()
return false 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.spannable = getString(R.string.label_reply_name_text, replyToName, status.text_unescaped)
replyLabel.visibility = View.VISIBLE replyLabel.visibility = View.VISIBLE
editText.hint = getString(R.string.label_reply_name, replyToName) editText.hint = getString(R.string.label_reply_name, replyToName)
@ -2024,7 +2026,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
private class AccountIconsAdapter( private class AccountIconsAdapter(
private val activity: ComposeActivity private val activity: ComposeActivity
) : BaseRecyclerViewAdapter<AccountIconViewHolder>(activity, activity.requestManager) { ) : BaseRecyclerViewAdapter<AccountIconViewHolder>(activity, Glide.with(activity)) {
private val inflater: LayoutInflater = activity.layoutInflater private val inflater: LayoutInflater = activity.layoutInflater
private val selection: MutableMap<UserKey, Boolean> = HashMap() 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.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.receiver.NotificationReceiver import org.mariotaku.twidere.receiver.NotificationReceiver
import org.mariotaku.twidere.service.StreamingService import org.mariotaku.twidere.service.StreamingService
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback
import org.mariotaku.twidere.util.premium.ExtraFeaturesService import org.mariotaku.twidere.util.premium.ExtraFeaturesService
@ -334,7 +335,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
super.onStart() super.onStart()
multiSelectHandler.dispatchOnStart() multiSelectHandler.dispatchOnStart()
AccountManager.get(this).addOnAccountsUpdatedListenerSafe(accountUpdatedListener, updateImmediately = false) AccountManager.get(this).addOnAccountsUpdatedListenerSafe(accountUpdatedListener, updateImmediately = false)
bus.register(this) BusSingleton.register(this)
readStateManager.registerOnSharedPreferenceChangeListener(readStateChangeListener) readStateManager.registerOnSharedPreferenceChangeListener(readStateChangeListener)
updateUnreadCount() updateUnreadCount()
@ -349,7 +350,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
override fun onStop() { override fun onStop() {
multiSelectHandler.dispatchOnStop() multiSelectHandler.dispatchOnStop()
readStateManager.unregisterOnSharedPreferenceChangeListener(readStateChangeListener) readStateManager.unregisterOnSharedPreferenceChangeListener(readStateChangeListener)
bus.unregister(this) BusSingleton.unregister(this)
AccountManager.get(this).removeOnAccountsUpdatedListenerSafe(accountUpdatedListener) AccountManager.get(this).removeOnAccountsUpdatedListenerSafe(accountUpdatedListener)
preferences.edit().putInt(KEY_SAVED_TAB_POSITION, mainPager.currentItem).apply() preferences.edit().putInt(KEY_SAVED_TAB_POSITION, mainPager.currentItem).apply()
dataSyncProvider.newTimelineSyncManager()?.commit() dataSyncProvider.newTimelineSyncManager()?.commit()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -27,6 +27,7 @@ import android.view.View
import android.widget.AdapterView import android.widget.AdapterView
import android.widget.AdapterView.OnItemClickListener import android.widget.AdapterView.OnItemClickListener
import android.widget.ListView import android.widget.ListView
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.activity_user_selector.* import kotlinx.android.synthetic.main.activity_user_selector.*
import kotlinx.android.synthetic.main.layout_list_with_empty_view.* import kotlinx.android.synthetic.main.layout_list_with_empty_view.*
import kotlinx.android.synthetic.main.layout_toolbar_search.* import kotlinx.android.synthetic.main.layout_toolbar_search.*
@ -86,7 +87,7 @@ class UserSelectorActivity : BaseActivity(), OnItemClickListener {
if (savedInstanceState == null) { if (savedInstanceState == null) {
editScreenName.setText(intent.getStringExtra(EXTRA_SCREEN_NAME)) editScreenName.setText(intent.getStringExtra(EXTRA_SCREEN_NAME))
} }
adapter = SimpleParcelableUsersAdapter(this, requestManager = requestManager) adapter = SimpleParcelableUsersAdapter(this, requestManager = Glide.with(this))
listView.adapter = adapter listView.adapter = adapter
listView.onItemClickListener = this 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.annotation.LoadMorePosition
import org.mariotaku.twidere.constant.* import org.mariotaku.twidere.constant.*
import org.mariotaku.twidere.dagger.component.GeneralComponent import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.model.ItemCounts 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 import javax.inject.Inject
open class BaseArrayAdapter<T>( open class BaseArrayAdapter<T>(
@ -46,8 +48,6 @@ open class BaseArrayAdapter<T>(
IItemCountsAdapter { IItemCountsAdapter {
val linkify: TwidereLinkify val linkify: TwidereLinkify
@Inject
override lateinit var userColorNameManager: UserColorNameManager
@Inject @Inject
override lateinit var bidiFormatter: BidiFormatter override lateinit var bidiFormatter: BidiFormatter
@Inject @Inject

View File

@ -32,25 +32,18 @@ import org.mariotaku.twidere.constant.profileImageStyleKey
import org.mariotaku.twidere.constant.showAbsoluteTimeKey import org.mariotaku.twidere.constant.showAbsoluteTimeKey
import org.mariotaku.twidere.constant.textSizeKey import org.mariotaku.twidere.constant.textSizeKey
import org.mariotaku.twidere.dagger.component.GeneralComponent import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.model.DefaultFeatures import org.mariotaku.twidere.model.DefaultFeatures
import org.mariotaku.twidere.util.MultiSelectManager import org.mariotaku.twidere.util.MultiSelectManager
import org.mariotaku.twidere.util.ReadStateManager import org.mariotaku.twidere.util.ReadStateManager
import org.mariotaku.twidere.util.UserColorNameManager
import javax.inject.Inject import javax.inject.Inject
/**
* Created by mariotaku on 15/10/5.
*/
abstract class BaseRecyclerViewAdapter<VH : RecyclerView.ViewHolder>( abstract class BaseRecyclerViewAdapter<VH : RecyclerView.ViewHolder>(
val context: Context, val context: Context,
override val requestManager: RequestManager override val requestManager: RequestManager
) : RecyclerView.Adapter<VH>(), IContentAdapter { ) : RecyclerView.Adapter<VH>(), IContentAdapter {
@Inject @Inject
override final lateinit var userColorNameManager: UserColorNameManager override lateinit var bidiFormatter: BidiFormatter
@Inject
override final lateinit var bidiFormatter: BidiFormatter
@Inject @Inject
lateinit var preferences: SharedPreferences lateinit var preferences: SharedPreferences
@Inject @Inject
@ -60,11 +53,11 @@ abstract class BaseRecyclerViewAdapter<VH : RecyclerView.ViewHolder>(
@Inject @Inject
lateinit var defaultFeatures: DefaultFeatures lateinit var defaultFeatures: DefaultFeatures
override final val profileImageSize: String = context.getString(R.string.profile_image_size) final override val profileImageSize: String = context.getString(R.string.profile_image_size)
override final val profileImageStyle: Int final override val profileImageStyle: Int
override final val textSize: Float final override val textSize: Float
override final val profileImageEnabled: Boolean final override val profileImageEnabled: Boolean
override final val showAbsoluteTime: Boolean final override val showAbsoluteTime: Boolean
init { init {
@Suppress("UNCHECKED_CAST") @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.constant.profileImageStyleKey
import org.mariotaku.twidere.dagger.component.GeneralComponent import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.appendQueryParameterIgnoreNull import org.mariotaku.twidere.extension.appendQueryParameterIgnoreNull
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.extension.loadProfileImage import org.mariotaku.twidere.extension.loadProfileImage
import org.mariotaku.twidere.model.AccountDetails import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.SuggestionItem import org.mariotaku.twidere.model.SuggestionItem
@ -52,6 +51,7 @@ class ComposeAutoCompleteAdapter(context: Context, val requestManager: RequestMa
@Inject @Inject
lateinit var preferences: SharedPreferences lateinit var preferences: SharedPreferences
@Inject @Inject
@Deprecated(message = "Deprecated", replaceWith = ReplaceWith("UserColorNameManager.get(context!!)", imports = ["org.mariotaku.twidere.util.UserColorNameManager"]))
lateinit var userColorNameManager: UserColorNameManager lateinit var userColorNameManager: UserColorNameManager
var account: AccountDetails? = null var account: AccountDetails? = null
@ -78,7 +78,7 @@ class ComposeAutoCompleteAdapter(context: Context, val requestManager: RequestMa
if (Suggestions.AutoComplete.TYPE_USERS == cursor.getString(indices.type)) { if (Suggestions.AutoComplete.TYPE_USERS == cursor.getString(indices.type)) {
val userKey = UserKey.valueOf(cursor.getString(indices.extra_id)) 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)) cursor.getString(indices.title))
val screenName = cursor.getString(indices.summary) val screenName = cursor.getString(indices.summary)
text2.spannable = "@${getScreenNameOrAcct(screenName, userKey)}" 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.adapter.iface.IUsersAdapter
import org.mariotaku.twidere.constant.* import org.mariotaku.twidere.constant.*
import org.mariotaku.twidere.dagger.component.GeneralComponent import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.extension.model.activityStatus import org.mariotaku.twidere.extension.model.activityStatus
import org.mariotaku.twidere.model.* import org.mariotaku.twidere.model.*
import org.mariotaku.twidere.util.TwidereLinkify import org.mariotaku.twidere.util.TwidereLinkify
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder
import javax.inject.Inject import javax.inject.Inject
@ -35,8 +33,6 @@ class DummyItemAdapter(
@Inject @Inject
lateinit var preferences: SharedPreferences lateinit var preferences: SharedPreferences
@Inject @Inject
override lateinit var userColorNameManager: UserColorNameManager
@Inject
override lateinit var bidiFormatter: BidiFormatter override lateinit var bidiFormatter: BidiFormatter
override var profileImageSize: String = context.getString(R.string.profile_image_size) 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, class SourceAutoCompleteAdapter(context: Context) : SimpleCursorAdapter(context,
android.R.layout.simple_list_item_1, null, emptyArray<String>(), IntArray(0), 0) { 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 private var sourceIdx: Int = 0

View File

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

View File

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

View File

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

View File

@ -26,7 +26,6 @@ import okhttp3.ConnectionPool
import okhttp3.Dns import okhttp3.Dns
import org.mariotaku.restfu.http.RestHttpClient import org.mariotaku.restfu.http.RestHttpClient
import org.mariotaku.twidere.dagger.component.GeneralComponent import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.model.DefaultFeatures import org.mariotaku.twidere.model.DefaultFeatures
import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.media.MediaPreloader import org.mariotaku.twidere.util.media.MediaPreloader
@ -69,6 +68,7 @@ class DependencyHolder internal constructor(context: Context) {
lateinit var mediaPreloader: MediaPreloader lateinit var mediaPreloader: MediaPreloader
internal set internal set
@Inject @Inject
@Deprecated(message = "Deprecated", replaceWith = ReplaceWith("UserColorNameManager.get(context", imports = ["org.mariotaku.twidere.util.UserColorNameManager"]))
lateinit var userColorNameManager: UserColorNameManager lateinit var userColorNameManager: UserColorNameManager
internal set internal set
@Inject @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.ApplicationModule
import org.mariotaku.twidere.dagger.module.ChannelModule import org.mariotaku.twidere.dagger.module.ChannelModule
import org.mariotaku.twidere.data.user.UserLiveData import org.mariotaku.twidere.data.user.UserLiveData
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.fragment.BaseDialogFragment import org.mariotaku.twidere.fragment.BaseDialogFragment
import org.mariotaku.twidere.fragment.BaseFragment import org.mariotaku.twidere.fragment.BaseFragment
import org.mariotaku.twidere.fragment.BasePreferenceFragment import org.mariotaku.twidere.fragment.BasePreferenceFragment
@ -132,10 +131,6 @@ interface GeneralComponent {
fun inject(activity: MainActivity) fun inject(activity: MainActivity)
fun inject(promises: MessagePromises)
fun inject(promises: StatusPromises)
fun inject(promises: FriendshipPromises) fun inject(promises: FriendshipPromises)
fun inject(promises: BlockPromises) fun inject(promises: BlockPromises)
@ -172,15 +167,13 @@ interface GeneralComponent {
fun inject(promises: UserListPromises) fun inject(promises: UserListPromises)
fun inject(promises: SavedSearchPromises)
fun inject(promises: RefreshPromises) fun inject(promises: RefreshPromises)
fun inject(liveData: UserLiveData) fun inject(liveData: UserLiveData)
fun inject(adapter: AccountSelectorAdapter) fun inject(adapter: AccountSelectorAdapter)
companion object : ApplicationContextSingletonHolder<GeneralComponent>(creation@ { application -> companion object : ApplicationContextSingletonHolder<GeneralComponent>(creation@{ application ->
return@creation DaggerGeneralComponent.builder() return@creation DaggerGeneralComponent.builder()
.applicationModule(ApplicationModule.get(application)) .applicationModule(ApplicationModule.get(application))
.channelModule(ChannelModule.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.DefaultExtractorsFactory
import com.google.android.exoplayer2.extractor.ExtractorsFactory import com.google.android.exoplayer2.extractor.ExtractorsFactory
import com.google.android.exoplayer2.upstream.DataSource import com.google.android.exoplayer2.upstream.DataSource
import com.squareup.otto.Bus
import com.squareup.otto.ThreadEnforcer
import com.twitter.Extractor import com.twitter.Extractor
import dagger.Module import dagger.Module
import dagger.Provides 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.SharedPreferenceConstants.KEY_CACHE_SIZE_LIMIT
import org.mariotaku.twidere.constant.autoRefreshCompatibilityModeKey import org.mariotaku.twidere.constant.autoRefreshCompatibilityModeKey
import org.mariotaku.twidere.constant.nameFirstKey import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.extension.model.load import org.mariotaku.twidere.extension.model.load
import org.mariotaku.twidere.model.DefaultFeatures 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.JobSchedulerRefreshTaskController
import org.mariotaku.twidere.taskcontroller.refresh.LegacyRefreshTaskController import org.mariotaku.twidere.taskcontroller.refresh.LegacyRefreshTaskController
import org.mariotaku.twidere.taskcontroller.refresh.RefreshTaskController 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 @Provides
@Singleton @Singleton
fun keyboardShortcutsHandler(): KeyboardShortcutsHandler { fun keyboardShortcutsHandler(): KeyboardShortcutsHandler {
@ -297,8 +293,8 @@ class ApplicationModule(private val application: Application) {
@Provides @Provides
@Singleton @Singleton
fun taskCreator(preferences: SharedPreferences, activityTracker: ActivityTracker, fun taskCreator(preferences: SharedPreferences, activityTracker: ActivityTracker,
dataSyncProvider: DataSyncProvider, bus: Bus): TaskServiceRunner { dataSyncProvider: DataSyncProvider): TaskServiceRunner {
return TaskServiceRunner(application, preferences, activityTracker, dataSyncProvider, bus) return TaskServiceRunner(application, preferences, activityTracker, dataSyncProvider, BusSingleton)
} }
@Provides @Provides

View File

@ -20,11 +20,12 @@
package org.mariotaku.twidere.extension package org.mariotaku.twidere.extension
import android.content.Context import android.content.Context
import com.bumptech.glide.DrawableRequestBuilder import android.graphics.drawable.Drawable
import com.bumptech.glide.DrawableTypeRequest import com.bumptech.glide.RequestBuilder
import com.bumptech.glide.RequestManager import com.bumptech.glide.RequestManager
import com.bumptech.glide.load.engine.DiskCacheStrategy 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.R
import org.mariotaku.twidere.annotation.ImageShapeStyle import org.mariotaku.twidere.annotation.ImageShapeStyle
import org.mariotaku.twidere.extension.model.getBestProfileBanner import org.mariotaku.twidere.extension.model.getBestProfileBanner
@ -35,8 +36,8 @@ import org.mariotaku.twidere.util.Utils
import org.mariotaku.twidere.util.glide.RoundedRectTransformation import org.mariotaku.twidere.util.glide.RoundedRectTransformation
fun RequestManager.loadProfileImage(context: Context, url: String?, @ImageShapeStyle style: Int, fun RequestManager.loadProfileImage(context: Context, url: String?, @ImageShapeStyle style: Int,
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, size: String? = null): DrawableRequestBuilder<String?> { cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, size: String? = null): RequestBuilder<Drawable> {
return configureLoadProfileImage(context, style, cornerRadius, cornerRadiusRatio) { return configureLoadProfileImage(style, cornerRadius, cornerRadiusRatio) {
if (url == null || size == null) { if (url == null || size == null) {
return@configureLoadProfileImage load(url) return@configureLoadProfileImage load(url)
} else { } else {
@ -46,23 +47,25 @@ fun RequestManager.loadProfileImage(context: Context, url: String?, @ImageShapeS
} }
fun RequestManager.loadProfileImage(context: Context, resourceId: Int, @ImageShapeStyle shapeStyle: Int, fun RequestManager.loadProfileImage(context: Context, resourceId: Int, @ImageShapeStyle shapeStyle: Int,
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f): DrawableRequestBuilder<Int> { cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f): RequestBuilder<Drawable> {
return configureLoadProfileImage(context, shapeStyle, cornerRadius, cornerRadiusRatio) { load(resourceId) } return configureLoadProfileImage(shapeStyle, cornerRadius, cornerRadiusRatio) {
return@configureLoadProfileImage load(resourceId)
}
} }
fun RequestManager.loadProfileImage(context: Context, account: AccountDetails, @ImageShapeStyle shapeStyle: Int, 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) return loadProfileImage(context, account.user, shapeStyle, cornerRadius, cornerRadiusRatio, size)
} }
fun RequestManager.loadProfileImage(context: Context, user: ParcelableUser, @ImageShapeStyle shapeStyle: Int, 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) { if (user.extras != null && user.extras?.profile_image_url_fallback == null) {
// No fallback image, use compatible logic // No fallback image, use compatible logic
return loadProfileImage(context, user.profile_image_url, shapeStyle, cornerRadius, return loadProfileImage(context, user.profile_image_url, shapeStyle, cornerRadius,
cornerRadiusRatio, size) cornerRadiusRatio, size)
} }
return configureLoadProfileImage(context, shapeStyle, cornerRadius, cornerRadiusRatio) { return configureLoadProfileImage(shapeStyle, cornerRadius, cornerRadiusRatio) {
if (size != null) { if (size != null) {
return@configureLoadProfileImage load(Utils.getTwitterProfileImageOfSize(user.profile_image_url, size)) return@configureLoadProfileImage load(Utils.getTwitterProfileImageOfSize(user.profile_image_url, size))
} else { } else {
@ -72,8 +75,8 @@ fun RequestManager.loadProfileImage(context: Context, user: ParcelableUser, @Ima
} }
fun RequestManager.loadProfileImage(context: Context, user: ParcelableLiteUser, @ImageShapeStyle shapeStyle: Int, fun RequestManager.loadProfileImage(context: Context, user: ParcelableLiteUser, @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 configureLoadProfileImage(context, shapeStyle, cornerRadius, cornerRadiusRatio) { return configureLoadProfileImage(shapeStyle, cornerRadius, cornerRadiusRatio) {
if (size != null) { if (size != null) {
return@configureLoadProfileImage load(Utils.getTwitterProfileImageOfSize(user.profile_image_url, size)) return@configureLoadProfileImage load(Utils.getTwitterProfileImageOfSize(user.profile_image_url, size))
} else { } else {
@ -84,35 +87,35 @@ fun RequestManager.loadProfileImage(context: Context, user: ParcelableLiteUser,
fun RequestManager.loadProfileImage(context: Context, userList: ParcelableUserList, fun RequestManager.loadProfileImage(context: Context, userList: ParcelableUserList,
@ImageShapeStyle shapeStyle: Int, @ImageShapeStyle shapeStyle: Int,
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f): DrawableRequestBuilder<String?> { cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f): RequestBuilder<Drawable> {
return configureLoadProfileImage(context, shapeStyle, cornerRadius, cornerRadiusRatio) { return configureLoadProfileImage(shapeStyle, cornerRadius, cornerRadiusRatio) {
load(userList.user_profile_image_url) return@configureLoadProfileImage load(userList.user_profile_image_url)
} }
} }
fun RequestManager.loadProfileImage(context: Context, group: ParcelableGroup, fun RequestManager.loadProfileImage(context: Context, group: ParcelableGroup,
@ImageShapeStyle shapeStyle: Int, @ImageShapeStyle shapeStyle: Int,
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f): DrawableRequestBuilder<String?> { cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f): RequestBuilder<Drawable> {
return configureLoadProfileImage(context, shapeStyle, cornerRadius, cornerRadiusRatio) { return configureLoadProfileImage(shapeStyle, cornerRadius, cornerRadiusRatio) {
load(group.homepage_logo) return@configureLoadProfileImage load(group.homepage_logo)
} }
} }
fun RequestManager.loadProfileImage(context: Context, status: ParcelableStatus, @ImageShapeStyle shapeStyle: Int, 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) { if (status.extras?.user_profile_image_url_fallback == null) {
// No fallback image, use compatible logic // No fallback image, use compatible logic
return loadProfileImage(context, status.user_profile_image_url, shapeStyle, cornerRadius, return loadProfileImage(context, status.user_profile_image_url, shapeStyle, cornerRadius,
cornerRadiusRatio, size) cornerRadiusRatio, size)
} }
return configureLoadProfileImage(context, shapeStyle, cornerRadius, cornerRadiusRatio) { return configureLoadProfileImage(shapeStyle, cornerRadius, cornerRadiusRatio) {
load(status.user_profile_image_url) return@configureLoadProfileImage load(status.user_profile_image_url)
} }
} }
fun RequestManager.loadProfileImage(context: Context, conversation: ParcelableMessageConversation, fun RequestManager.loadProfileImage(context: Context, conversation: ParcelableMessageConversation,
@ImageShapeStyle shapeStyle: Int, cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, @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) { if (conversation.conversation_type == ParcelableMessageConversation.ConversationType.ONE_TO_ONE) {
val user = conversation.user val user = conversation.user
if (user != null) { if (user != null) {
@ -135,35 +138,32 @@ fun RequestManager.loadProfileImage(context: Context, conversation: ParcelableMe
fun RequestManager.loadOriginalProfileImage(context: Context, user: ParcelableUser, fun RequestManager.loadOriginalProfileImage(context: Context, user: ParcelableUser,
@ImageShapeStyle shapeStyle: Int, cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f @ImageShapeStyle shapeStyle: Int, cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f
): DrawableRequestBuilder<String> { ): RequestBuilder<Drawable> {
return configureLoadProfileImage(context, shapeStyle, cornerRadius, cornerRadiusRatio) { return configureLoadProfileImage(shapeStyle, cornerRadius, cornerRadiusRatio) {
load(user.originalProfileImage) 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) val ratio = context.resources.getFraction(R.fraction.aspect_ratio_profile_banner, 1, 1)
return load(user.getBestProfileBanner(width, (width / ratio).toInt())) return load(user.getBestProfileBanner(width, (width / ratio).toInt()))
} }
internal inline fun <T> configureLoadProfileImage(context: Context, @ImageShapeStyle shapeStyle: Int, internal inline fun <T> configureLoadProfileImage(@ImageShapeStyle shapeStyle: Int, cornerRadius: Float = 0f,
cornerRadius: Float = 0f, cornerRadiusRatio: Float = 0f, create: () -> DrawableTypeRequest<T> cornerRadiusRatio: Float = 0f, create: () -> RequestBuilder<T>
): DrawableRequestBuilder<T> { ): RequestBuilder<T> {
val builder = create() val builder = create()
builder.diskCacheStrategy(DiskCacheStrategy.RESULT) val requestOptions = RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.DATA).dontAnimate().centerCrop()
builder.centerCrop()
builder.dontAnimate()
when (shapeStyle) { when (shapeStyle) {
ImageShapeStyle.SHAPE_CIRCLE -> { ImageShapeStyle.SHAPE_CIRCLE -> {
builder.bitmapTransform(CropCircleTransformation(context)) requestOptions.transform(CircleCrop())
} }
ImageShapeStyle.SHAPE_RECTANGLE -> { ImageShapeStyle.SHAPE_RECTANGLE -> {
builder.bitmapTransform(RoundedRectTransformation(context, cornerRadius, requestOptions.transform(RoundedRectTransformation(cornerRadius, cornerRadiusRatio))
cornerRadiusRatio))
} }
ImageShapeStyle.SHAPE_NONE -> { ImageShapeStyle.SHAPE_NONE -> {
// No-op // 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 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 @UiThread
fun View.getFrameRelatedTo(rect: Rect, other: View? = null) { fun View.getFrameRelatedTo(rect: Rect, other: View? = null) {
this.getFrame(rect) this.getFrame(rect)
if (other == null) { when {
offsetToRoot(this, rect) other == null -> offsetToRoot(this, rect)
} else if (other === this) { other === this -> rect.offsetTo(0, 0)
rect.offsetTo(0, 0) other !== parent -> {
} else if (other !== parent) { offsetToRoot(this, rect)
offsetToRoot(this, rect) other.getFrame(tempRect)
other.getFrame(tempRect) offsetToRoot(other, tempRect)
offsetToRoot(other, tempRect) rect.offset(-tempRect.left, -tempRect.top)
rect.offset(-tempRect.left, -tempRect.top) }
} }
} }
@ -158,6 +158,18 @@ fun View.findViewByText(text: CharSequence?): TextView? {
return null 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) { private fun offsetToRoot(view: View, rect: Rect) {
var parent = view.parent as? View var parent = view.parent as? View
while (parent != null) { 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.model.util.ParcelableMediaUtils
import org.mariotaku.twidere.util.promotion.PromotionService import org.mariotaku.twidere.util.promotion.PromotionService
/**
* Created by mariotaku on 2017/1/7.
*/
fun parcelableMediaTypeString(@ParcelableMedia.Type type: Int): String? = when (type) { fun parcelableMediaTypeString(@ParcelableMedia.Type type: Int): String? = when (type) {
ParcelableMedia.Type.IMAGE -> "image" ParcelableMedia.Type.IMAGE -> "image"
@ -29,7 +26,8 @@ fun ParcelableMedia.getBestVideoUrlAndType(supportedTypes: Array<String>): Pair<
val videoInfo = video_info ?: return Pair(mediaUrl, null) val videoInfo = video_info ?: return Pair(mediaUrl, null)
val firstMatch = videoInfo.variants.filter { variant -> val firstMatch = videoInfo.variants.filter { variant ->
supportedTypes.any { it.equals(variant.content_type, ignoreCase = true) } 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) return Pair(firstMatch.url, firstMatch.content_type)
} }
ParcelableMedia.Type.CARD_ANIMATED_GIF -> { ParcelableMedia.Type.CARD_ANIMATED_GIF -> {
@ -47,12 +45,19 @@ val ParcelableMedia.aspect_ratio: Double
return this.width / this.height.toDouble() return this.width / this.height.toDouble()
} }
val ParcelableMedia.bannerExtras: PromotionService.BannerExtras? val ParcelableMedia.bannerExtras: PromotionService.BannerExtras?
get() { get() {
val contentUrl = this.page_url ?: this.url ?: return null val contentUrl = this.page_url ?: this.url ?: return null
return PromotionService.BannerExtras(contentUrl) return PromotionService.BannerExtras(contentUrl)
} }
val Array<ParcelableMedia?>.type: Int
get() {
forEach { if (it != null) return it.type }
return 0
}
@ParcelableMedia.Type @ParcelableMedia.Type
val InputContentInfoCompat.inferredMediaType: Int val InputContentInfoCompat.inferredMediaType: Int
get() = if (description.mimeTypeCount > 0) { get() = if (description.mimeTypeCount > 0) {

View File

@ -83,8 +83,7 @@ var ParcelableMessageConversation.notificationDisabled: Boolean
} }
} }
fun ParcelableMessageConversation.getTitle(context: Context, manager: UserColorNameManager, fun ParcelableMessageConversation.getTitle(context: Context, manager: UserColorNameManager): Pair<String, String?> {
nameFirst: Boolean): Pair<String, String?> {
if (conversation_type == ConversationType.ONE_TO_ONE) { if (conversation_type == ConversationType.ONE_TO_ONE) {
val user = this.user ?: return Pair(context.getString(R.string.title_direct_messages), null) val user = this.user ?: return Pair(context.getString(R.string.title_direct_messages), null)
return Pair(user.name, "@${user.screen_name}") 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 get() = if (is_retweet) (retweet_id ?: id) else id
val ParcelableStatus.media_type: Int val ParcelableStatus.media_type: Int
get() = media?.firstOrNull()?.type ?: 0 get() = attachment?.media?.firstOrNull()?.type ?: 0
val ParcelableStatus.user: ParcelableUser val ParcelableStatus.user: ParcelableUser
get() = ParcelableUser(account_key, user_key, user_name, user_screen_name, user_profile_image_url) 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> val ParcelableStatus.referencedUsers: Array<ParcelableUser>
get() { get() {
val resultList = mutableSetOf(user) val resultList = mutableSetOf(user)
if (quoted_user_key != null) { val quoted = attachment?.quoted
resultList.add(ParcelableUser(account_key, quoted_user_key, quoted_user_name, if (quoted != null) {
quoted_user_screen_name, quoted_user_profile_image)) 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) { if (retweeted_by_user_key != null) {
resultList.add(ParcelableUser(account_key, retweeted_by_user_key, retweeted_by_user_name, 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}" "$retweeted_by_user_screen_name@${retweeted_by_user_key?.host}"
} }
inline val ParcelableStatus.quoted_user_acct: String? inline val ParcelableStatusAttachment.QuotedStatus.user_acct: String?
get() = if (account_key.host == quoted_user_key?.host) { get() = if (account_key?.host == user_key?.host) {
quoted_user_screen_name user_screen_name
} else { } else {
"$quoted_user_screen_name@${quoted_user_key?.host}" "$user_screen_name@${user_key?.host}"
} }
inline val ParcelableStatus.isAccountRetweet: Boolean inline val ParcelableStatus.isAccountRetweet: Boolean
@ -90,25 +91,8 @@ inline val ParcelableStatus.canRetweet: Boolean
} }
} }
val ParcelableStatus.quoted: ParcelableStatus? inline val ParcelableStatus.quoted: ParcelableStatusAttachment.QuotedStatus?
get() { get() = attachment?.quoted
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
}
val ParcelableStatus.retweet_sort_id: Long val ParcelableStatus.retweet_sort_id: Long
get() { get() {
@ -162,8 +146,8 @@ fun ParcelableStatus.addFilterFlag(@ParcelableStatus.FilterFlags flags: Long) {
fun ParcelableStatus.updateFilterInfo(descriptions: Collection<String?>?) { fun ParcelableStatus.updateFilterInfo(descriptions: Collection<String?>?) {
updateContentFilterInfo() updateContentFilterInfo()
filter_users = setOf(user_key, quoted_user_key, retweeted_by_user_key).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_names = setOf(user_name, quoted?.user_name, retweeted_by_user_name).filterNotNull().toTypedArray()
filter_descriptions = descriptions?.filterNotNull()?.joinToString("\n") filter_descriptions = descriptions?.filterNotNull()?.joinToString("\n")
} }
@ -171,17 +155,17 @@ fun ParcelableStatus.updateContentFilterInfo() {
filter_links = generateFilterLinks() filter_links = generateFilterLinks()
filter_texts = generateFilterTexts() 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 { fun ParcelableStatus.generateFilterTexts(): String {
val texts = StringBuilder() val texts = StringBuilder()
texts.appendNonEmptyLine(text_unescaped) texts.appendNonEmptyLine(text_unescaped)
texts.appendNonEmptyLine(quoted_text_unescaped) texts.appendNonEmptyLine(quoted?.text_unescaped)
media?.forEach { item -> attachment?.media?.forEach { item ->
texts.appendNonEmptyLine(item.alt_text) texts.appendNonEmptyLine(item.alt_text)
} }
quoted_media?.forEach { item -> quoted?.media?.forEach { item ->
texts.appendNonEmptyLine(item.alt_text) texts.appendNonEmptyLine(item.alt_text)
} }
return texts.toString() return texts.toString()
@ -193,7 +177,7 @@ fun ParcelableStatus.generateFilterLinks(): Array<String> {
if (span.type != SpanItem.SpanType.LINK) return@mapNotNullTo null if (span.type != SpanItem.SpanType.LINK) return@mapNotNullTo null
return@mapNotNullTo span.link return@mapNotNullTo span.link
} }
quoted_spans?.mapNotNullTo(links) { span -> quoted?.spans?.mapNotNullTo(links) { span ->
if (span.type != SpanItem.SpanType.LINK) return@mapNotNullTo null if (span.type != SpanItem.SpanType.LINK) return@mapNotNullTo null
return@mapNotNullTo span.link 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.MediaEntity
import org.mariotaku.microblog.library.model.microblog.Status import org.mariotaku.microblog.library.model.microblog.Status
import org.mariotaku.twidere.exception.MalformedResponseException import org.mariotaku.twidere.exception.MalformedResponseException
import org.mariotaku.twidere.extension.model.addFilterFlag import org.mariotaku.twidere.extension.model.*
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.toSpanItem import org.mariotaku.twidere.extension.toSpanItem
import org.mariotaku.twidere.model.* import org.mariotaku.twidere.model.*
import org.mariotaku.twidere.model.util.ParcelableMediaUtils import org.mariotaku.twidere.model.util.ParcelableMediaUtils
@ -60,6 +57,7 @@ fun Status.applyTo(accountKey: UserKey, accountType: String, profileImageSize: S
result: ParcelableStatus, result: ParcelableStatus,
updateFilterInfoAction: (Status, ParcelableStatus) -> Unit = ::updateFilterInfoDefault) { updateFilterInfoAction: (Status, ParcelableStatus) -> Unit = ::updateFilterInfoDefault) {
val extras = ParcelableStatus.Extras() val extras = ParcelableStatus.Extras()
val attachment = ParcelableStatusAttachment()
result.account_key = accountKey result.account_key = accountKey
result.id = id result.id = id
result.sort_id = sortId result.sort_id = sortId
@ -101,44 +99,47 @@ fun Status.applyTo(accountKey: UserKey, accountType: String, profileImageSize: S
result.addFilterFlag(ParcelableStatus.FilterFlags.POSSIBLY_SENSITIVE) result.addFilterFlag(ParcelableStatus.FilterFlags.POSSIBLY_SENSITIVE)
} }
val quoted = status.quotedStatus val quotedStatus = status.quotedStatus
result.is_quote = status.isQuoteStatus result.is_quote = status.isQuoteStatus
result.quoted_id = status.quotedStatusId if (quotedStatus != null) {
if (quoted != null) { val quoted = ParcelableStatusAttachment.QuotedStatus()
val quotedUser = quoted.user ?: throw MalformedResponseException() val quotedUser = quotedStatus.user ?: throw MalformedResponseException()
result.quoted_id = quoted.id quoted.id = quotedStatus.id
extras.quoted_external_url = quoted.inferredExternalUrl 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 // Twitter will escape <> to &lt;&gt;, so if a status contains those symbols unescaped
// We should treat this as an html // We should treat this as an html
if (quotedText.isHtml) { if (quotedText.isHtml) {
val html = HtmlSpanBuilder.fromHtml(quotedText, quoted.extendedText) val html = HtmlSpanBuilder.fromHtml(quotedText, quotedStatus.extendedText)
result.quoted_text_unescaped = html?.toString() quoted.text_unescaped = html?.toString()
result.quoted_text_plain = result.quoted_text_unescaped quoted.text_plain = quoted.text_unescaped
result.quoted_spans = html?.spanItems quoted.spans = html?.spanItems
} else { } else {
val textWithIndices = quoted.formattedTextWithIndices() val textWithIndices = quotedStatus.formattedTextWithIndices()
result.quoted_text_plain = quotedText.twitterUnescaped() quoted.text_plain = quotedText.twitterUnescaped()
result.quoted_text_unescaped = textWithIndices.text quoted.text_unescaped = textWithIndices.text
result.quoted_spans = textWithIndices.spans quoted.spans = textWithIndices.spans
extras.quoted_display_text_range = textWithIndices.range extras.quoted_display_text_range = textWithIndices.range
} }
result.quoted_timestamp = quoted.createdAt.time quoted.timestamp = quotedStatus.createdAt.time
result.quoted_source = quoted.source quoted.source = quotedStatus.source
result.quoted_media = ParcelableMediaUtils.fromStatus(quoted, accountKey, accountType) quoted.media = ParcelableMediaUtils.fromStatus(quotedStatus, accountKey, accountType)
result.quoted_user_key = quotedUser.key quoted.user_key = quotedUser.key
result.quoted_user_name = quotedUser.name quoted.user_name = quotedUser.name
result.quoted_user_screen_name = quotedUser.screenName quoted.user_screen_name = quotedUser.screenName
result.quoted_user_profile_image = quotedUser.getProfileImageOfSize(profileImageSize) quoted.user_profile_image = quotedUser.getProfileImageOfSize(profileImageSize)
result.quoted_user_is_protected = quotedUser.isProtected quoted.user_is_protected = quotedUser.isProtected
result.quoted_user_is_verified = quotedUser.isVerified quoted.user_is_verified = quotedUser.isVerified
if (quoted.isPossiblySensitive) { if (quotedStatus.isPossiblySensitive) {
result.addFilterFlag(ParcelableStatus.FilterFlags.POSSIBLY_SENSITIVE) result.addFilterFlag(ParcelableStatus.FilterFlags.POSSIBLY_SENSITIVE)
} }
attachment.quoted = quoted
} else if (status.isQuoteStatus) { } else if (status.isQuoteStatus) {
result.addFilterFlag(ParcelableStatus.FilterFlags.QUOTE_NOT_AVAILABLE) 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 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.source = status.source
result.location = status.parcelableLocation result.location = status.parcelableLocation
result.is_favorite = status.isFavorited 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.is_possibly_sensitive = status.isPossiblySensitive
result.mentions = status.userMentionEntities?.mapToArray { it.toParcelable(user.host) } 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.place_full_name = status.placeFullName
result.lang = status.lang result.lang = status.lang
result.extras = extras 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) result.addFilterFlag(ParcelableStatus.FilterFlags.HAS_MEDIA)
} }
if (user.isFollowing == false) { if (user.isFollowing == false) {
@ -291,8 +296,8 @@ fun updateFilterInfoForUserTimeline(status: Status, result: ParcelableStatus) {
result.updateContentFilterInfo() result.updateContentFilterInfo()
if (result.is_retweet) { if (result.is_retweet) {
result.filter_users = setOf(result.user_key, result.quoted_user_key).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_names = setOf(result.user_name, result.quoted?.user_name).filterNotNull().toTypedArray()
result.filter_descriptions = setOf( result.filter_descriptions = setOf(
status.retweetedStatus?.userDescriptionUnescaped, status.retweetedStatus?.userDescriptionUnescaped,
status.retweetedStatus?.userUrlExpanded, status.retweetedStatus?.userUrlExpanded,
@ -302,8 +307,8 @@ fun updateFilterInfoForUserTimeline(status: Status, result: ParcelableStatus) {
status.quotedStatus?.userUrlExpanded status.quotedStatus?.userUrlExpanded
).filterNotNull().joinToString("\n") ).filterNotNull().joinToString("\n")
} else { } else {
result.filter_users = setOf(result.quoted_user_key).filterNotNull().toTypedArray() result.filter_users = setOf(result.quoted?.user_key).filterNotNull().toTypedArray()
result.filter_names = setOf(result.quoted_user_name).filterNotNull().toTypedArray() result.filter_names = setOf(result.quoted?.user_name).filterNotNull().toTypedArray()
result.filter_descriptions = setOf( result.filter_descriptions = setOf(
status.quotedStatus?.userDescriptionUnescaped, status.quotedStatus?.userDescriptionUnescaped,
status.quotedStatus?.userLocation, 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.isHtml
import org.mariotaku.twidere.extension.model.api.spanItems import org.mariotaku.twidere.extension.model.api.spanItems
import org.mariotaku.twidere.model.AccountDetails import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableLiteUser
import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.util.HtmlEscapeHelper 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, fun Account.toParcelable(accountKey: UserKey, position: Long = 0,
relationship: Relationship? = null): ParcelableUser { relationship: Relationship? = null): ParcelableUser {
val obj = ParcelableUser() val obj = ParcelableUser()
@ -81,13 +100,15 @@ fun Account.toParcelable(accountKey: UserKey, position: Long = 0,
extras.muting = relationship.isMuting extras.muting = relationship.isMuting
extras.blocking = relationship.isBlocking extras.blocking = relationship.isBlocking
} }
extras.moved = moved?.toLiteParcelable(accountKey)
return obj return obj
} }
inline val Account.host: String? get() = acct?.let(UserKey::valueOf)?.host inline val Account.host: String? get() = acct?.let(UserKey::valueOf)?.host
inline val Account.name: String? get() = displayName?.takeIf(String::isNotEmpty) inline val Account.name: String?
?.let(EmojioneTranslator::translate) ?: username get() = displayName?.takeIf(String::isNotEmpty)
?.let(EmojioneTranslator::translate) ?: username
fun Account.getKey(host: String?) = UserKey(id, acct?.let(UserKey::valueOf)?.host ?: host) 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) { fun Status.applyTo(accountKey: UserKey, result: ParcelableStatus) {
val extras = ParcelableStatus.Extras() val extras = ParcelableStatus.Extras()
val attachment = ParcelableStatusAttachment()
result.account_key = accountKey result.account_key = accountKey
result.id = id result.id = id
result.sort_id = sortId result.sort_id = sortId
@ -104,14 +105,14 @@ fun Status.applyTo(accountKey: UserKey, result: ParcelableStatus) {
result.text_unescaped = html?.toString() result.text_unescaped = html?.toString()
result.text_plain = result.text_unescaped result.text_plain = result.text_unescaped
result.spans = html?.spanItems result.spans = html?.spanItems
result.media = status.mediaAttachments?.mapToArray { it.toParcelable() } attachment.media = status.mediaAttachments?.mapToArray { it.toParcelable() }
result.source = status.application?.sourceHtml result.source = status.application?.sourceHtml
result.is_favorite = status.isFavourited result.is_favorite = status.isFavourited
result.is_possibly_sensitive = status.isSensitive result.is_possibly_sensitive = status.isSensitive
result.mentions = status.mentions?.mapToArray { it.toParcelable(accountKey) } result.mentions = status.mentions?.mapToArray { it.toParcelable(accountKey) }
extras.display_text_range = calculateDisplayTextRange(result.text_unescaped, result.spans, extras.display_text_range = calculateDisplayTextRange(result.text_unescaped, result.spans,
result.media) result.attachment?.media)
extras.summary_text = status.spoilerText?.let(EmojioneTranslator::translate) extras.summary_text = status.spoilerText?.let(EmojioneTranslator::translate)
extras.visibility = status.visibility extras.visibility = status.visibility
extras.external_url = status.url 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_name = inReplyToMention.name
result.in_reply_to_screen_name = inReplyToMention.screen_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.addFilterFlag(ParcelableStatus.FilterFlags.HAS_MEDIA)
} }
result.extras = extras result.extras = extras
result.attachment = attachment
result.updateFilterInfo(setOf(accountDescriptionUnescaped, reblog?.accountDescriptionUnescaped, result.updateFilterInfo(setOf(accountDescriptionUnescaped, reblog?.accountDescriptionUnescaped,
accountUrl, reblog?.accountUrl)) accountUrl, reblog?.accountUrl))

View File

@ -27,6 +27,7 @@ import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener
import android.view.* import android.view.*
import android.widget.AbsListView import android.widget.AbsListView
import android.widget.ListAdapter import android.widget.ListAdapter
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager import com.bumptech.glide.RequestManager
import kotlinx.android.synthetic.main.fragment_content_listview.* import kotlinx.android.synthetic.main.fragment_content_listview.*
import kotlinx.android.synthetic.main.layout_content_fragment_common.* 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) R.color.bg_refresh_progress_color_light, R.color.bg_refresh_progress_color_dark)
swipeLayout.setOnRefreshListener(this) swipeLayout.setOnRefreshListener(this)
swipeLayout.setProgressBackgroundColorSchemeResource(colorRes) swipeLayout.setProgressBackgroundColorSchemeResource(colorRes)
adapter = onCreateAdapter(context!!, requestManager) adapter = onCreateAdapter(context!!, Glide.with(this))
listView.setOnTouchListener { _, event -> listView.setOnTouchListener { _, event ->
if (event.actionMasked == MotionEvent.ACTION_DOWN) { if (event.actionMasked == MotionEvent.ACTION_DOWN) {
updateRefreshProgressOffset() 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
import android.support.v7.widget.RecyclerView.ItemDecoration import android.support.v7.widget.RecyclerView.ItemDecoration
import android.view.* import android.view.*
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager import com.bumptech.glide.RequestManager
import kotlinx.android.synthetic.main.fragment_content_recyclerview.* import kotlinx.android.synthetic.main.fragment_content_recyclerview.*
import kotlinx.android.synthetic.main.layout_content_fragment_common.* 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) R.color.bg_refresh_progress_color_light, R.color.bg_refresh_progress_color_dark)
swipeLayout.setOnRefreshListener(this) swipeLayout.setOnRefreshListener(this)
swipeLayout.setProgressBackgroundColorSchemeResource(colorRes) swipeLayout.setProgressBackgroundColorSchemeResource(colorRes)
adapter = onCreateAdapter(context!!, requestManager) adapter = onCreateAdapter(context!!, Glide.with(this))
layoutManager = onCreateLayoutManager(context!!) layoutManager = onCreateLayoutManager(context!!)
scrollListener = RecyclerViewScrollHandler(this, RecyclerViewScrollHandler.RecyclerViewCallback(recyclerView)) 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.LinearLayoutManager
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
import android.view.KeyEvent import android.view.KeyEvent
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager import com.bumptech.glide.RequestManager
import com.squareup.otto.Subscribe import com.squareup.otto.Subscribe
import kotlinx.android.synthetic.main.fragment_content_recyclerview.* 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.BlockPromises
import org.mariotaku.twidere.promise.FriendshipPromises import org.mariotaku.twidere.promise.FriendshipPromises
import org.mariotaku.twidere.promise.MutePromises import org.mariotaku.twidere.promise.MutePromises
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.IntentUtils import org.mariotaku.twidere.util.IntentUtils
import org.mariotaku.twidere.util.KeyboardShortcutsHandler import org.mariotaku.twidere.util.KeyboardShortcutsHandler
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback
@ -93,11 +95,11 @@ abstract class AbsUsersFragment : AbsContentListRecyclerViewFragment<ParcelableU
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
bus.register(usersBusCallback) BusSingleton.register(usersBusCallback)
} }
override fun onStop() { override fun onStop() {
bus.unregister(usersBusCallback) BusSingleton.unregister(usersBusCallback)
super.onStop() super.onStop()
} }
@ -106,7 +108,7 @@ abstract class AbsUsersFragment : AbsContentListRecyclerViewFragment<ParcelableU
} }
override fun onCreateAdapter(context: Context, requestManager: RequestManager): ParcelableUsersAdapter { 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.simpleLayout = simpleLayout
adapter.showFollow = showFollow adapter.showFollow = showFollow
val accountType = arguments?.accountKey?.let { key -> val accountType = arguments?.accountKey?.let { key ->
@ -152,7 +154,7 @@ abstract class AbsUsersFragment : AbsContentListRecyclerViewFragment<ParcelableU
if (user.is_following) { if (user.is_following) {
DestroyFriendshipDialogFragment.show(fragmentManager!!, user) DestroyFriendshipDialogFragment.show(fragmentManager!!, user)
} else { } 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 user = adapter.getUser(position) ?: return
val accountKey = user.account_key ?: return val accountKey = user.account_key ?: return
if (FriendshipPromises.isRunning(accountKey, user.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) { override fun onUnmuteClicked(holder: UserViewHolder, position: Int) {

View File

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

View File

@ -18,6 +18,7 @@ import android.view.ContextMenu.ContextMenuInfo
import android.widget.AdapterView import android.widget.AdapterView
import android.widget.AdapterView.AdapterContextMenuInfo import android.widget.AdapterView.AdapterContextMenuInfo
import android.widget.Toast import android.widget.Toast
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.layout_draggable_list_with_empty_view.* import kotlinx.android.synthetic.main.layout_draggable_list_with_empty_view.*
import nl.komponents.kovenant.combine.and import nl.komponents.kovenant.combine.and
import nl.komponents.kovenant.task import nl.komponents.kovenant.task
@ -68,7 +69,7 @@ class AccountsManagerFragment : BaseFragment(), LoaderManager.LoaderCallbacks<Li
linkHandlerTitle = getString(R.string.title_accounts) linkHandlerTitle = getString(R.string.title_accounts)
val context = context!! val context = context!!
val am = AccountManager.get(context) val am = AccountManager.get(context)
adapter = AccountDetailsAdapter(context, requestManager).apply { adapter = AccountDetailsAdapter(context, Glide.with(this)).apply {
sortEnabled = true sortEnabled = true
switchEnabled = true switchEnabled = true
accountToggleListener = { pos, checked -> 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.applyTheme
import org.mariotaku.twidere.extension.blockBulkInsert import org.mariotaku.twidere.extension.blockBulkInsert
import org.mariotaku.twidere.extension.bulkDelete import org.mariotaku.twidere.extension.bulkDelete
import org.mariotaku.twidere.extension.model.quoted
import org.mariotaku.twidere.extension.onShow import org.mariotaku.twidere.extension.onShow
import org.mariotaku.twidere.model.ParcelableStatus import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.ParcelableUserMention 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.ContentValuesCreator
import org.mariotaku.twidere.util.HtmlEscapeHelper import org.mariotaku.twidere.util.HtmlEscapeHelper
import org.mariotaku.twidere.util.UserColorNameManager import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.UserColorNameManager.Companion
import java.util.* import java.util.*
class AddStatusFilterDialogFragment : BaseDialogFragment() { class AddStatusFilterDialogFragment : BaseDialogFragment() {
@ -55,10 +57,10 @@ class AddStatusFilterDialogFragment : BaseDialogFragment() {
UserItem(status.retweeted_by_user_key!!, status.retweeted_by_user_name, UserItem(status.retweeted_by_user_key!!, status.retweeted_by_user_name,
status.retweeted_by_user_screen_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, list.add(FilterItemInfo(FilterItemInfo.FILTER_TYPE_USER,
UserItem(status.quoted_user_key!!, status.quoted_user_name, UserItem(status.quoted?.user_key!!, status.quoted?.user_name!!,
status.quoted_user_screen_name))) status.quoted?.user_screen_name!!)))
} }
list.add(FilterItemInfo(FilterItemInfo.FILTER_TYPE_USER, UserItem(status.user_key, list.add(FilterItemInfo(FilterItemInfo.FILTER_TYPE_USER, UserItem(status.user_key,
status.user_name, status.user_screen_name))) status.user_name, status.user_screen_name)))
@ -81,6 +83,7 @@ class AddStatusFilterDialogFragment : BaseDialogFragment() {
private var filterItems: Array<FilterItemInfo>? = null private var filterItems: Array<FilterItemInfo>? = null
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val manager = UserColorNameManager.get(context!!)
val builder = AlertDialog.Builder(context!!) val builder = AlertDialog.Builder(context!!)
filterItems = filterItemsInfo filterItems = filterItemsInfo
val entries = arrayOfNulls<String>(filterItems!!.size) val entries = arrayOfNulls<String>(filterItems!!.size)
@ -89,15 +92,15 @@ class AddStatusFilterDialogFragment : BaseDialogFragment() {
val info = filterItems!![i] val info = filterItems!![i]
when (info.type) { when (info.type) {
FilterItemInfo.FILTER_TYPE_USER -> { 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)) info.value, nameFirst))
} }
FilterItemInfo.FILTER_TYPE_KEYWORD -> { 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)) info.value, nameFirst))
} }
FilterItemInfo.FILTER_TYPE_SOURCE -> { 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)) 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.constant.IntentConstants.EXTRA_USER
import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.event.FriendshipTaskEvent import org.mariotaku.twidere.model.event.FriendshipTaskEvent
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.DataStoreUtils import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.UserColorNameManager
class AddUserFilterDialogFragment : AbsUserMuteBlockDialogFragment() { class AddUserFilterDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun getMessage(user: ParcelableUser): String { 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 { override fun getTitle(user: ParcelableUser): String {
@ -40,7 +42,7 @@ class AddUserFilterDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) { override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) {
DataStoreUtils.addToFilter(context!!, listOf(user), filterEverywhere) DataStoreUtils.addToFilter(context!!, listOf(user), filterEverywhere)
val accountKey = user.account_key ?: return 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 isFinished = true
isSucceeded = true isSucceeded = true
}) })

View File

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

View File

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

View File

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

View File

@ -30,10 +30,8 @@ import android.os.Bundle
import android.provider.Settings import android.provider.Settings
import android.support.v7.preference.Preference import android.support.v7.preference.Preference
import android.support.v7.preference.PreferenceFragmentCompat import android.support.v7.preference.PreferenceFragmentCompat
import com.squareup.otto.Bus
import nl.komponents.kovenant.Promise import nl.komponents.kovenant.Promise
import org.mariotaku.twidere.dagger.component.GeneralComponent import org.mariotaku.twidere.dagger.component.GeneralComponent
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.fragment.iface.IBaseFragment import org.mariotaku.twidere.fragment.iface.IBaseFragment
import org.mariotaku.twidere.preference.RingtonePreference import org.mariotaku.twidere.preference.RingtonePreference
import org.mariotaku.twidere.taskcontroller.sync.SyncTaskController import org.mariotaku.twidere.taskcontroller.sync.SyncTaskController
@ -49,14 +47,13 @@ abstract class BasePreferenceFragment : PreferenceFragmentCompat(), IBaseFragmen
@Inject @Inject
lateinit var keyboardShortcutHandler: KeyboardShortcutsHandler lateinit var keyboardShortcutHandler: KeyboardShortcutsHandler
@Inject @Inject
@Deprecated(message = "Deprecated", replaceWith = ReplaceWith("UserColorNameManager.get(context!!)", imports = ["org.mariotaku.twidere.util.UserColorNameManager"]))
lateinit var userColorNameManager: UserColorNameManager lateinit var userColorNameManager: UserColorNameManager
@Inject @Inject
lateinit var preferences: SharedPreferences lateinit var preferences: SharedPreferences
@Inject @Inject
lateinit var syncController: SyncTaskController lateinit var syncController: SyncTaskController
@Inject @Inject
lateinit var bus: Bus
@Inject
lateinit var dataSyncProvider: DataSyncProvider lateinit var dataSyncProvider: DataSyncProvider
@Inject @Inject
lateinit var preferenceChangeNotifier: PreferenceChangeNotifier 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.constant.IntentConstants.EXTRA_USER
import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.promise.BlockPromises import org.mariotaku.twidere.promise.BlockPromises
import org.mariotaku.twidere.util.UserColorNameManager
class CreateUserBlockDialogFragment : AbsUserMuteBlockDialogFragment() { class CreateUserBlockDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun getMessage(user: ParcelableUser): String { 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) return getString(R.string.block_user_confirm_message, displayName)
} }
override fun getTitle(user: ParcelableUser): String { 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) return getString(R.string.title_block_user, displayName)
} }
@ -43,7 +44,7 @@ class CreateUserBlockDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) { override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) {
val accountKey = user.account_key ?: return val accountKey = user.account_key ?: return
BlockPromises.getInstance(context!!).block(accountKey, user.key, filterEverywhere) BlockPromises.get(context!!).block(accountKey, user.key, filterEverywhere)
} }
companion object { companion object {

View File

@ -23,19 +23,19 @@ import android.os.Bundle
import android.support.v4.app.FragmentManager import android.support.v4.app.FragmentManager
import org.mariotaku.twidere.R import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_USER import org.mariotaku.twidere.constant.IntentConstants.EXTRA_USER
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.promise.MutePromises import org.mariotaku.twidere.promise.MutePromises
import org.mariotaku.twidere.util.UserColorNameManager
class CreateUserMuteDialogFragment : AbsUserMuteBlockDialogFragment() { class CreateUserMuteDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun getMessage(user: ParcelableUser): String { 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) return getString(R.string.mute_user_confirm_message, displayName)
} }
override fun getTitle(user: ParcelableUser): String { 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) return getString(R.string.mute_user, displayName)
} }

View File

@ -40,6 +40,7 @@ import android.view.*
import android.widget.* import android.widget.*
import android.widget.AbsListView.MultiChoiceModeListener import android.widget.AbsListView.MultiChoiceModeListener
import android.widget.AdapterView.OnItemClickListener import android.widget.AdapterView.OnItemClickListener
import com.bumptech.glide.Glide
import com.mobeta.android.dslv.SimpleDragSortCursorAdapter import com.mobeta.android.dslv.SimpleDragSortCursorAdapter
import kotlinx.android.synthetic.main.dialog_custom_tab_editor.* import kotlinx.android.synthetic.main.dialog_custom_tab_editor.*
import kotlinx.android.synthetic.main.layout_draggable_list_with_empty_view.* 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 positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE)
val iconsAdapter = TabIconsAdapter(context!!) val iconsAdapter = TabIconsAdapter(context!!)
val accountsAdapter = AccountsSpinnerAdapter(context!!, requestManager = requestManager) val accountsAdapter = AccountsSpinnerAdapter(context!!, requestManager = Glide.with(this))
iconSpinner.adapter = iconsAdapter iconSpinner.adapter = iconsAdapter
accountSpinner.adapter = accountsAdapter 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.ParcelableUser
import org.mariotaku.twidere.model.ParcelableUserList import org.mariotaku.twidere.model.ParcelableUserList
import org.mariotaku.twidere.promise.UserListPromises import org.mariotaku.twidere.promise.UserListPromises
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.UserColorNameManager.Companion
class DeleteUserListMembersDialogFragment : BaseDialogFragment(), DialogInterface.OnClickListener { class DeleteUserListMembersDialogFragment : BaseDialogFragment(), DialogInterface.OnClickListener {
@ -61,8 +63,7 @@ class DeleteUserListMembersDialogFragment : BaseDialogFragment(), DialogInterfac
val userList = userList!! val userList = userList!!
if (users.size == 1) { if (users.size == 1) {
val user = users[0] val user = users[0]
val nameFirst = preferences[nameFirstKey] val displayName = UserColorNameManager.get(context!!).getDisplayName(user)
val displayName = userColorNameManager.getDisplayName(user)
builder.setTitle(getString(R.string.delete_user, displayName)) builder.setTitle(getString(R.string.delete_user, displayName))
builder.setMessage(getString(R.string.delete_user_from_list_confirm, displayName, userList.name)) builder.setMessage(getString(R.string.delete_user_from_list_confirm, displayName, userList.name))
} else { } else {

View File

@ -33,6 +33,8 @@ import org.mariotaku.twidere.extension.applyTheme
import org.mariotaku.twidere.extension.user import org.mariotaku.twidere.extension.user
import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.promise.FriendshipPromises import org.mariotaku.twidere.promise.FriendshipPromises
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.UserColorNameManager.Companion
class DestroyFriendshipDialogFragment : BaseDialogFragment(), DialogInterface.OnClickListener { class DestroyFriendshipDialogFragment : BaseDialogFragment(), DialogInterface.OnClickListener {
@ -41,7 +43,7 @@ class DestroyFriendshipDialogFragment : BaseDialogFragment(), DialogInterface.On
DialogInterface.BUTTON_POSITIVE -> { DialogInterface.BUTTON_POSITIVE -> {
val user = arguments!!.user!! val user = arguments!!.user!!
val accountKey = user.account_key ?: return val accountKey = user.account_key ?: return
FriendshipPromises.getInstance(context!!).destroy(accountKey, user.key) FriendshipPromises.get(context!!).destroy(accountKey, user.key)
} }
else -> { else -> {
} }
@ -50,9 +52,8 @@ class DestroyFriendshipDialogFragment : BaseDialogFragment(), DialogInterface.On
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(context!!) val builder = AlertDialog.Builder(context!!)
val nameFirst = preferences[nameFirstKey]
val user = arguments!!.user!! 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.setTitle(getString(R.string.unfollow_user, displayName))
builder.setMessage(getString(R.string.unfollow_user_confirm_message, displayName)) builder.setMessage(getString(R.string.unfollow_user_confirm_message, displayName))
builder.setPositiveButton(android.R.string.ok, this) 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.constant.newDocumentApiKey
import org.mariotaku.twidere.extension.accountKey import org.mariotaku.twidere.extension.accountKey
import org.mariotaku.twidere.extension.model.prefixedHashtag 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.fragment.timeline.AbsTimelineFragment
import org.mariotaku.twidere.model.ParcelableHashtag import org.mariotaku.twidere.model.ParcelableHashtag
import org.mariotaku.twidere.model.ParcelableMedia import org.mariotaku.twidere.model.ParcelableMedia
import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.util.IntentUtils import org.mariotaku.twidere.util.IntentUtils
import org.mariotaku.twidere.util.MenuUtils import org.mariotaku.twidere.util.MenuUtils
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.Utils import org.mariotaku.twidere.util.Utils
import org.mariotaku.twidere.view.ExtendedRecyclerView import org.mariotaku.twidere.view.ExtendedRecyclerView
import org.mariotaku.twidere.view.holder.UserViewHolder import org.mariotaku.twidere.view.holder.UserViewHolder
@ -71,7 +73,7 @@ open class ItemsListFragment : AbsContentListRecyclerViewFragment<VariousItemsAd
override fun onQuotedStatusClick(holder: IStatusViewHolder, position: Int) { override fun onQuotedStatusClick(holder: IStatusViewHolder, position: Int) {
val status = dummyItemAdapter.getStatus(position) 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) { override fun onItemActionClick(holder: RecyclerView.ViewHolder, id: Int, position: Int) {
@ -147,7 +149,7 @@ open class ItemsListFragment : AbsContentListRecyclerViewFragment<VariousItemsAd
val dummyAdapter = adapter.dummyAdapter val dummyAdapter = adapter.dummyAdapter
val status = dummyAdapter.getStatus(contextMenuInfo.position) val status = dummyAdapter.getStatus(contextMenuInfo.position)
inflater.inflate(R.menu.action_status, menu) inflater.inflate(R.menu.action_status, menu)
MenuUtils.setupForStatus(context, menu, preferences, userColorNameManager, MenuUtils.setupForStatus(context, menu, preferences, UserColorNameManager.get(context),
status) status)
} }
} }
@ -169,7 +171,7 @@ open class ItemsListFragment : AbsContentListRecyclerViewFragment<VariousItemsAd
return true return true
} }
return MenuUtils.handleStatusClick(context, this, fragmentManager!!, return MenuUtils.handleStatusClick(context, this, fragmentManager!!,
preferences, userColorNameManager, status, item) preferences, UserColorNameManager.get(context), status, item)
} }
} }
return false return false

View File

@ -26,6 +26,7 @@ import android.support.v4.app.hasRunningLoadersSafe
import android.support.v4.content.Loader import android.support.v4.content.Loader
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
import android.view.KeyEvent import android.view.KeyEvent
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager import com.bumptech.glide.RequestManager
import kotlinx.android.synthetic.main.fragment_content_recyclerview.* import kotlinx.android.synthetic.main.fragment_content_recyclerview.*
import org.mariotaku.twidere.adapter.ParcelableGroupsAdapter import org.mariotaku.twidere.adapter.ParcelableGroupsAdapter
@ -66,7 +67,7 @@ abstract class ParcelableGroupsFragment : AbsContentListRecyclerViewFragment<Par
} }
override fun onCreateAdapter(context: Context, requestManager: RequestManager): ParcelableGroupsAdapter { 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) { 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.v4.content.Loader
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
import android.view.KeyEvent import android.view.KeyEvent
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager import com.bumptech.glide.RequestManager
import kotlinx.android.synthetic.main.fragment_content_recyclerview.* import kotlinx.android.synthetic.main.fragment_content_recyclerview.*
import org.mariotaku.ktextension.set import org.mariotaku.ktextension.set
@ -71,7 +72,7 @@ abstract class ParcelableUserListsFragment : AbsContentListRecyclerViewFragment<
} }
override fun onCreateAdapter(context: Context, requestManager: RequestManager): ParcelableUserListsAdapter { 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) { 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.constant.IntentConstants.EXTRA_USER
import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.promise.BlockPromises import org.mariotaku.twidere.promise.BlockPromises
import org.mariotaku.twidere.util.UserColorNameManager
class ReportUserSpamDialogFragment : AbsUserMuteBlockDialogFragment() { class ReportUserSpamDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun getMessage(user: ParcelableUser): String { 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) return getString(R.string.report_user_confirm_message, displayName)
} }
override fun getTitle(user: ParcelableUser): String { 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) return getString(R.string.report_user, displayName)
} }
@ -44,7 +45,7 @@ class ReportUserSpamDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) { override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) {
val accountKey = user.account_key ?: return val accountKey = user.account_key ?: return
BlockPromises.getInstance(context!!).report(accountKey, user.key, filterEverywhere) BlockPromises.get(context!!).report(accountKey, user.key, filterEverywhere)
} }
companion object { 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.R
import org.mariotaku.twidere.adapter.SavedSearchesAdapter import org.mariotaku.twidere.adapter.SavedSearchesAdapter
import org.mariotaku.twidere.extension.accountKey import org.mariotaku.twidere.extension.accountKey
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.extension.linkHandlerTitle import org.mariotaku.twidere.extension.linkHandlerTitle
import org.mariotaku.twidere.loader.SavedSearchesLoader import org.mariotaku.twidere.loader.SavedSearchesLoader
import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.event.SavedSearchDestroyedEvent import org.mariotaku.twidere.model.event.SavedSearchDestroyedEvent
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.IntentUtils.openTweetSearch import org.mariotaku.twidere.util.IntentUtils.openTweetSearch
import java.util.* import java.util.*
@ -67,13 +69,13 @@ class SavedSearchesListFragment : AbsContentListViewFragment<SavedSearchesAdapte
} }
override fun onStop() { override fun onStop() {
bus.unregister(this) BusSingleton.unregister(this)
super.onStop() super.onStop()
} }
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
bus.register(this) BusSingleton.register(this)
} }
override fun onCreateAdapter(context: Context, requestManager: RequestManager): SavedSearchesAdapter { 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.onShow
import org.mariotaku.twidere.extension.userKey import org.mariotaku.twidere.extension.userKey
import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.util.UserColorNameManager
class SetUserNicknameDialogFragment : BaseDialogFragment(), OnClickListener { class SetUserNicknameDialogFragment : BaseDialogFragment(), OnClickListener {
override fun onClick(dialog: DialogInterface, which: Int) { override fun onClick(dialog: DialogInterface, which: Int) {
val editName = (dialog as AlertDialog).editName val editName = (dialog as AlertDialog).editName
val userKey = arguments!!.userKey!! val userKey = arguments!!.userKey!!
val manager = UserColorNameManager.get(context!!)
when (which) { when (which) {
DialogInterface.BUTTON_POSITIVE -> { DialogInterface.BUTTON_POSITIVE -> {
if (editName.empty) { if (editName.empty) {
userColorNameManager.clearUserNickname(userKey) manager.clearUserNickname(userKey)
} else { } else {
userColorNameManager.setUserNickname(userKey, editName.text.toString()) manager.setUserNickname(userKey, editName.text.toString())
} }
} }
DialogInterface.BUTTON_NEUTRAL -> { 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.adapter.TrendsAdapter
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_EXTRAS import org.mariotaku.twidere.constant.IntentConstants.EXTRA_EXTRAS
import org.mariotaku.twidere.constant.localTrendsWoeIdKey import org.mariotaku.twidere.constant.localTrendsWoeIdKey
import org.mariotaku.twidere.extension.get
import org.mariotaku.twidere.fragment.iface.IFloatingActionButtonFragment import org.mariotaku.twidere.fragment.iface.IFloatingActionButtonFragment
import org.mariotaku.twidere.model.FloatingActionButtonInfo import org.mariotaku.twidere.model.FloatingActionButtonInfo
import org.mariotaku.twidere.model.UserKey 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.model.tab.extra.TrendsTabExtras
import org.mariotaku.twidere.promise.GetTrendsPromise import org.mariotaku.twidere.promise.GetTrendsPromise
import org.mariotaku.twidere.provider.TwidereDataStore.CachedTrends 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.IntentUtils.openTweetSearch
import org.mariotaku.twidere.util.Utils import org.mariotaku.twidere.util.Utils
@ -129,11 +129,11 @@ class TrendsSuggestionsFragment : AbsContentListViewFragment<TrendsAdapter>(), L
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
loaderManager.restartLoader(0, null, this) loaderManager.restartLoader(0, null, this)
bus.register(this) BusSingleton.register(this)
} }
override fun onStop() { override fun onStop() {
bus.unregister(this) BusSingleton.unregister(this)
super.onStop() super.onStop()
} }

View File

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

View File

@ -24,6 +24,7 @@ import android.graphics.Bitmap
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.media.MediaScannerConnection import android.media.MediaScannerConnection
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
@ -34,7 +35,6 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.drawable.GlideDrawable
import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.target.Target
import io.nayuki.qrcodegen.QrCode import io.nayuki.qrcodegen.QrCode
import io.nayuki.qrcodegen.QrSegment import io.nayuki.qrcodegen.QrSegment
@ -203,7 +203,7 @@ class UserQrDialogFragment : BaseDialogFragment() {
return@task SaveFileResult(saveFile, "image/png") 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()) val activity = this.activity ?: return Promise.ofFail(InterruptedException())
if (isDetached || dialog == null || activity.isFinishing) { if (isDetached || dialog == null || activity.isFinishing) {
return Promise.ofFail(InterruptedException()) return Promise.ofFail(InterruptedException())
@ -217,13 +217,13 @@ class UserQrDialogFragment : BaseDialogFragment() {
val profileImageSize = context.getString(R.string.profile_image_size) val profileImageSize = context.getString(R.string.profile_image_size)
try { try {
return@task requestManager.loadOriginalProfileImage(context, user, 0) 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) { } catch (e: ExecutionException) {
// Ignore // Ignore
} }
// Return fallback profile image // Return fallback profile image
return@task requestManager.loadProfileImage(context, user, ImageShapeStyle.SHAPE_NONE, 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.constant.readFromBottomKey
import org.mariotaku.twidere.data.CursorObjectDataSourceFactory import org.mariotaku.twidere.data.CursorObjectDataSourceFactory
import org.mariotaku.twidere.data.processor.DataSourceItemProcessor 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.activityStatus
import org.mariotaku.twidere.extension.model.quoted
import org.mariotaku.twidere.extension.queryOne import org.mariotaku.twidere.extension.queryOne
import org.mariotaku.twidere.extension.showContextMenuForChild import org.mariotaku.twidere.extension.showContextMenuForChild
import org.mariotaku.twidere.extension.view.PositionWithOffset 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.BaseContentRefreshParam
import org.mariotaku.twidere.model.refresh.ContentRefreshParam import org.mariotaku.twidere.model.refresh.ContentRefreshParam
import org.mariotaku.twidere.provider.TwidereDataStore.Activities import org.mariotaku.twidere.provider.TwidereDataStore.Activities
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.task.statuses.GetStatusesTask import org.mariotaku.twidere.task.statuses.GetStatusesTask
import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.UserColorNameManager.Companion
import org.mariotaku.twidere.view.ExtendedRecyclerView import org.mariotaku.twidere.view.ExtendedRecyclerView
import org.mariotaku.twidere.view.holder.ActivityTitleSummaryViewHolder import org.mariotaku.twidere.view.holder.ActivityTitleSummaryViewHolder
import org.mariotaku.twidere.view.holder.GapViewHolder import org.mariotaku.twidere.view.holder.GapViewHolder
@ -148,11 +152,11 @@ abstract class AbsActivitiesFragment : AbsContentRecyclerViewFragment<Parcelable
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
recyclerView.addOnScrollListener(scrollHandler) recyclerView.addOnScrollListener(scrollHandler)
bus.register(busEventHandler) BusSingleton.register(busEventHandler)
} }
override fun onStop() { override fun onStop() {
bus.unregister(busEventHandler) BusSingleton.unregister(busEventHandler)
recyclerView.removeOnScrollListener(scrollHandler) recyclerView.removeOnScrollListener(scrollHandler)
if (userVisibleHint) { if (userVisibleHint) {
saveReadPosition(layoutManager.firstVisibleItemPosition) saveReadPosition(layoutManager.firstVisibleItemPosition)
@ -189,7 +193,7 @@ abstract class AbsActivitiesFragment : AbsContentRecyclerViewFragment<Parcelable
val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo
val status = adapter.getActivity(contextMenuInfo.position).activityStatus ?: return val status = adapter.getActivity(contextMenuInfo.position).activityStatus ?: return
inflater.inflate(R.menu.action_status, menu) 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 { override fun onContextItemSelected(item: MenuItem): Boolean {
@ -214,7 +218,7 @@ abstract class AbsActivitiesFragment : AbsContentRecyclerViewFragment<Parcelable
return true return true
} }
else -> return MenuUtils.handleStatusClick(context, this, fragmentManager!!, 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) { override fun onQuotedStatusClick(holder: IStatusViewHolder, position: Int) {
val status = getActivityStatus(position)?.takeIf { it.quoted_id != null } ?: return val status = getActivityStatus(position)?.takeIf { it.quoted?.id != null } ?: return
IntentUtils.openStatus(context!!, status.account_key, status.quoted_id) IntentUtils.openStatus(context!!, status.account_key, status.quoted?.id!!)
} }
override fun onMediaClick(holder: IStatusViewHolder, view: View, media: ParcelableMedia, position: Int) { 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.CheckBox
import android.widget.Checkable import android.widget.Checkable
import android.widget.Toast import android.widget.Toast
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.dialog_filter_rule_editor.* import kotlinx.android.synthetic.main.dialog_filter_rule_editor.*
import org.mariotaku.ktextension.ContentValues import org.mariotaku.ktextension.ContentValues
import org.mariotaku.ktextension.set import org.mariotaku.ktextension.set
@ -115,7 +116,7 @@ class AddEditItemFragment : BaseDialogFragment() {
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
editText.setAdapter(when (contentUri) { editText.setAdapter(when (contentUri) {
Filters.Sources.CONTENT_URI -> SourceAutoCompleteAdapter(activity!!) 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 val accountKey = arguments!!.accountKey
if (accountKey != null) { if (accountKey != null) {
val am = AccountManager.get(activity) 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.IntentUtils
import org.mariotaku.twidere.util.ThemeUtils import org.mariotaku.twidere.util.ThemeUtils
import org.mariotaku.twidere.util.UserColorNameManager import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.UserColorNameManager.Companion
import javax.inject.Inject import javax.inject.Inject
class FilteredUsersFragment : BaseFiltersFragment() { class FilteredUsersFragment : BaseFiltersFragment() {
@ -163,7 +164,7 @@ class FilteredUsersFragment : BaseFiltersFragment() {
val adapter = this.adapter as FilterUsersListAdapter val adapter = this.adapter as FilterUsersListAdapter
val item = adapter.getFilterItem(position) ?: return val item = adapter.getFilterItem(position) ?: return
if (item.source >= 0) 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) { 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.MotionEvent
import android.view.View import android.view.View
import android.view.ViewGroup 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.extractor.ExtractorsFactory
import com.google.android.exoplayer2.source.ExtractorMediaSource 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.AdaptiveTrackSelection
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector 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.DataSource
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter
import com.google.android.exoplayer2.upstream.HttpDataSource import com.google.android.exoplayer2.upstream.HttpDataSource
@ -111,10 +111,7 @@ class ExoPlayerPageFragment : MediaViewerFragment(), IBaseFragment<ExoPlayerPage
AccountManager.get(context).getDetailsOrThrow(accountKey, true) AccountManager.get(context).getDetailsOrThrow(accountKey, true)
} }
private val playerListener = object : Player.EventListener { private val playerListener = object : Player.DefaultEventListener() {
override fun onLoadingChanged(isLoading: Boolean) {
}
override fun onPlayerError(error: ExoPlaybackException) { override fun onPlayerError(error: ExoPlaybackException) {
playerHasError = true 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?) { override fun onActivityCreated(savedInstanceState: Bundle?) {

View File

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

View File

@ -33,6 +33,7 @@ import android.text.SpannableStringBuilder
import android.text.TextUtils import android.text.TextUtils
import android.text.style.ReplacementSpan import android.text.style.ReplacementSpan
import android.view.* import android.view.*
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.fragment_messages_conversation_new.* import kotlinx.android.synthetic.main.fragment_messages_conversation_new.*
import org.mariotaku.kpreferences.get import org.mariotaku.kpreferences.get
import org.mariotaku.ktextension.* 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.task.twitter.message.SendMessageTask
import org.mariotaku.twidere.text.MarkForDeleteSpan import org.mariotaku.twidere.text.MarkForDeleteSpan
import org.mariotaku.twidere.util.IntentUtils import org.mariotaku.twidere.util.IntentUtils
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.view.SimpleTextWatcher import org.mariotaku.twidere.util.view.SimpleTextWatcher
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
@ -69,10 +71,10 @@ class MessageNewConversationFragment : BaseFragment() {
set(value) { set(value) {
val roundRadius = resources.getDimension(R.dimen.element_spacing_xsmall) val roundRadius = resources.getDimension(R.dimen.element_spacing_xsmall)
val spanPadding = resources.getDimension(R.dimen.element_spacing_xsmall) val spanPadding = resources.getDimension(R.dimen.element_spacing_xsmall)
val nameFirst = preferences[nameFirstKey]
editParticipants.text = SpannableStringBuilder().apply { editParticipants.text = SpannableStringBuilder().apply {
val manager = UserColorNameManager.get(context!!)
value.forEach { user -> value.forEach { user ->
val displayName = userColorNameManager.getDisplayName(user) val displayName = manager.getDisplayName(user)
val span = ParticipantSpan(user, displayName, roundRadius, spanPadding) val span = ParticipantSpan(user, displayName, roundRadius, spanPadding)
appendCompat(user.screen_name, span, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) appendCompat(user.screen_name, span, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
append(" ") append(" ")
@ -89,7 +91,7 @@ class MessageNewConversationFragment : BaseFragment() {
super.onActivityCreated(savedInstanceState) super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true) setHasOptionsMenu(true)
linkHandlerTitle = getString(R.string.title_direct_messages_conversation_new) linkHandlerTitle = getString(R.string.title_direct_messages_conversation_new)
usersAdapter = SelectableUsersAdapter(context!!, requestManager) usersAdapter = SelectableUsersAdapter(context!!, Glide.with(this))
recyclerView.adapter = usersAdapter recyclerView.adapter = usersAdapter
recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) 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 roundRadius = resources.getDimension(R.dimen.element_spacing_xsmall)
val spanPadding = 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 text: Editable = editParticipants.editableText ?: return@itemChecked false
val user = usersAdapter.getUser(pos) val user = usersAdapter.getUser(pos)
if (checked) { if (checked) {
@ -154,7 +155,7 @@ class MessageNewConversationFragment : BaseFragment() {
if (start < 0 || end < 0 || end < start) return@forEach if (start < 0 || end < 0 || end < start) return@forEach
text.delete(start, end) text.delete(start, end)
} }
val displayName = userColorNameManager.getDisplayName(user) val displayName = UserColorNameManager.get(context!!).getDisplayName(user)
val span = ParticipantSpan(user, displayName, roundRadius, spanPadding) val span = ParticipantSpan(user, displayName, roundRadius, spanPadding)
text.appendCompat(user.screen_name, span, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) text.appendCompat(user.screen_name, span, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
text.append(" ") 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.RecyclerView
import android.support.v7.widget.Toolbar import android.support.v7.widget.Toolbar
import android.view.* import android.view.*
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager import com.bumptech.glide.RequestManager
import com.squareup.otto.Subscribe import com.squareup.otto.Subscribe
import kotlinx.android.synthetic.main.activity_premium_dashboard.* 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.promise.MessagePromises
import org.mariotaku.twidere.provider.TwidereDataStore.Messages import org.mariotaku.twidere.provider.TwidereDataStore.Messages
import org.mariotaku.twidere.service.LengthyOperationsService import org.mariotaku.twidere.service.LengthyOperationsService
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.task.twitter.message.GetMessagesTask import org.mariotaku.twidere.task.twitter.message.GetMessagesTask
import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.view.ExtendedRecyclerView import org.mariotaku.twidere.view.ExtendedRecyclerView
@ -144,7 +146,7 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
return recyclerView.showContextMenuForChild(holder.itemView) return recyclerView.showContextMenuForChild(holder.itemView)
} }
} }
mediaPreviewAdapter = MediaPreviewAdapter(activity, requestManager) mediaPreviewAdapter = MediaPreviewAdapter(activity, Glide.with(this))
mediaPreviewAdapter.listener = object : MediaPreviewAdapter.Listener { mediaPreviewAdapter.listener = object : MediaPreviewAdapter.Listener {
override fun onRemoveClick(position: Int, holder: MediaPreviewViewHolder) { override fun onRemoveClick(position: Int, holder: MediaPreviewViewHolder) {
@ -210,11 +212,11 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
bus.register(this) BusSingleton.register(this)
} }
override fun onStop() { override fun onStop() {
bus.unregister(this) BusSingleton.unregister(this)
super.onStop() super.onStop()
} }
@ -274,7 +276,7 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
} }
override fun onCreateAdapter(context: Context, requestManager: RequestManager): MessagesConversationAdapter { 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 { override fun onCreateLayoutManager(context: Context): LinearLayoutManager {
@ -304,7 +306,7 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
R.id.recyclerView -> { R.id.recyclerView -> {
val message = adapter.getMessage(menuInfo.position) val message = adapter.getMessage(menuInfo.position)
val conversation = adapter.conversation val conversation = adapter.conversation
menu.setHeaderTitle(message.getSummaryText(context!!, userColorNameManager, conversation, menu.setHeaderTitle(message.getSummaryText(context!!, UserColorNameManager.get(context!!), conversation,
preferences[nameFirstKey])) preferences[nameFirstKey]))
activity!!.menuInflater.inflate(R.menu.menu_conversation_message_item, menu) activity!!.menuInflater.inflate(R.menu.menu_conversation_message_item, menu)
} }
@ -328,7 +330,7 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
} }
R.id.delete -> { R.id.delete -> {
// TODO show progress // 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) message.id)
} }
} }
@ -514,15 +516,14 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
private fun markRead() { private fun markRead() {
// TODO: Promise progress // TODO: Promise progress
MessagePromises.getInstance(context!!).markRead(accountKey, conversationId) MessagePromises.get(context!!).markRead(accountKey, conversationId)
} }
private fun updateConversationStatus() { private fun updateConversationStatus() {
val activity = this.activity ?: return val activity = this.activity ?: return
if (isDetached || activity.isFinishing) return if (isDetached || activity.isFinishing) return
val conversation = adapter.conversation ?: return val conversation = adapter.conversation ?: return
val title = conversation.getTitle(activity, userColorNameManager, val title = conversation.getTitle(activity, UserColorNameManager.get(context!!)).first
preferences[nameFirstKey]).first
val subtitle = conversation.getSubtitle(activity) val subtitle = conversation.getSubtitle(activity)
activity.title = title activity.title = title
val readOnly = conversation.readOnly val readOnly = conversation.readOnly
@ -550,7 +551,7 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(conversationTitle, null, TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(conversationTitle, null,
null, stateIcon, null) null, stateIcon, null)
requestManager.loadProfileImage(activity, conversation, preferences[profileImageStyleKey]) Glide.with(this).loadProfileImage(activity, conversation, preferences[profileImageStyleKey])
.into(conversationAvatar) .into(conversationAvatar)
} }

View File

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

View File

@ -29,6 +29,7 @@ import android.support.v7.app.AlertDialog
import android.support.v7.app.AlertDialog.Builder import android.support.v7.app.AlertDialog.Builder
import android.view.View import android.view.View
import android.widget.Toast import android.widget.Toast
import com.bumptech.glide.Glide
import nl.komponents.kovenant.Promise import nl.komponents.kovenant.Promise
import nl.komponents.kovenant.combine.and import nl.komponents.kovenant.combine.and
import nl.komponents.kovenant.task import nl.komponents.kovenant.task
@ -70,7 +71,7 @@ abstract class AbsStatusDialogFragment : BaseDialogFragment() {
builder.setupAlertDialog() builder.setupAlertDialog()
adapter = DummyItemAdapter(context!!, requestManager = requestManager) adapter = DummyItemAdapter(context!!, requestManager = Glide.with(this))
adapter.showCardActions = false adapter.showCardActions = false
adapter.showAccountsColor = true 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.BaseDialogFragment
import org.mariotaku.twidere.fragment.CreateUserBlockDialogFragment import org.mariotaku.twidere.fragment.CreateUserBlockDialogFragment
import org.mariotaku.twidere.model.ParcelableStatus import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.UserColorNameManager.Companion
class BlockStatusUsersDialogFragment : BaseDialogFragment() { class BlockStatusUsersDialogFragment : BaseDialogFragment() {
@ -41,9 +43,8 @@ class BlockStatusUsersDialogFragment : BaseDialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(context!!) val builder = AlertDialog.Builder(context!!)
val referencedUsers = status.referencedUsers val referencedUsers = status.referencedUsers
val nameFirst = preferences[nameFirstKey]
val displayNames = referencedUsers.map { val displayNames = referencedUsers.map {
userColorNameManager.getDisplayName(it) UserColorNameManager.get(context!!).getDisplayName(it)
}.toTypedArray() }.toTypedArray()
builder.setTitle(R.string.action_status_block_users) builder.setTitle(R.string.action_status_block_users)
builder.setItems(displayNames) { _, which -> builder.setItems(displayNames) { _, which ->

View File

@ -34,7 +34,7 @@ class DestroyStatusDialogFragment : AbsSimpleStatusOperationDialogFragment() {
get() = getString(R.string.destroy_status_confirm_message) get() = getString(R.string.destroy_status_confirm_message)
override fun onPerformAction(status: ParcelableStatus) { 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 { 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.BaseDialogFragment
import org.mariotaku.twidere.fragment.CreateUserMuteDialogFragment import org.mariotaku.twidere.fragment.CreateUserMuteDialogFragment
import org.mariotaku.twidere.model.ParcelableStatus import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.UserColorNameManager.Companion
class MuteStatusUsersDialogFragment : BaseDialogFragment() { class MuteStatusUsersDialogFragment : BaseDialogFragment() {
@ -43,7 +45,7 @@ class MuteStatusUsersDialogFragment : BaseDialogFragment() {
val referencedUsers = status.referencedUsers val referencedUsers = status.referencedUsers
val nameFirst = preferences[nameFirstKey] val nameFirst = preferences[nameFirstKey]
val displayNames = referencedUsers.map { val displayNames = referencedUsers.map {
userColorNameManager.getDisplayName(it) UserColorNameManager.get(context!!).getDisplayName(it)
}.toTypedArray() }.toTypedArray()
builder.setTitle(R.string.action_status_mute_users) builder.setTitle(R.string.action_status_mute_users)
builder.setItems(displayNames) { _, which -> 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.*
import org.mariotaku.twidere.extension.model.canRetweet import org.mariotaku.twidere.extension.model.canRetweet
import org.mariotaku.twidere.extension.model.isAccountRetweet import org.mariotaku.twidere.extension.model.isAccountRetweet
import org.mariotaku.twidere.extension.model.quoted
import org.mariotaku.twidere.fragment.BaseDialogFragment import org.mariotaku.twidere.fragment.BaseDialogFragment
import org.mariotaku.twidere.model.* import org.mariotaku.twidere.model.*
import org.mariotaku.twidere.model.draft.QuoteStatusActionExtras 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 View.VISIBLE
} else { } else {
View.GONE View.GONE
@ -116,7 +117,7 @@ class RetweetQuoteDialogFragment : AbsStatusDialogFragment() {
getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener { getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener {
if (!shouldQuoteRetweet(account) && status.isAccountRetweet) { 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() dismiss()
} else if (retweetOrQuote(account, status, showProtectedConfirm)) { } else if (retweetOrQuote(account, status, showProtectedConfirm)) {
dismiss() dismiss()
@ -213,12 +214,12 @@ class RetweetQuoteDialogFragment : AbsStatusDialogFragment() {
commentText = getString(R.string.fanfou_repost_format, editingComment, commentText = getString(R.string.fanfou_repost_format, editingComment,
status.user_screen_name, status.text_plain) status.user_screen_name, status.text_plain)
} else { } else {
if (status.quoted_user_is_protected && showProtectedConfirmation) { if (status.quoted?.user_is_protected == true && showProtectedConfirmation) {
return false return false
} }
commentText = getString(R.string.fanfou_repost_format, editingComment, commentText = getString(R.string.fanfou_repost_format, editingComment,
status.quoted_user_screen_name, status.quoted_text_plain) status.quoted?.user_screen_name, status.quoted?.text_plain)
update.repost_status_id = status.quoted_id update.repost_status_id = status.quoted?.id
} }
if (FanfouValidator.calculateLength(commentText) > FanfouValidator.textLimit) { if (FanfouValidator.calculateLength(commentText) > FanfouValidator.textLimit) {
commentText = commentText.substring(0, Math.max(FanfouValidator.textLimit, commentText = commentText.substring(0, Math.max(FanfouValidator.textLimit,
@ -229,7 +230,7 @@ class RetweetQuoteDialogFragment : AbsStatusDialogFragment() {
val statusLink = if (!status.is_quote || !quoteOriginalStatus) { val statusLink = if (!status.is_quote || !quoteOriginalStatus) {
LinkCreator.getStatusWebLink(status) LinkCreator.getStatusWebLink(status)
} else { } else {
LinkCreator.getQuotedStatusWebLink(status) LinkCreator.getQuotedStatusWebLink(status.quoted!!)
} }
update.attachment_url = statusLink?.toString() update.attachment_url = statusLink?.toString()
commentText = editingComment 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.data.observe
import org.mariotaku.twidere.extension.model.newMicroBlogInstance import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.extension.model.originalId 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.extension.view.calculateSpaceItemHeight
import org.mariotaku.twidere.fragment.BaseDialogFragment import org.mariotaku.twidere.fragment.BaseDialogFragment
import org.mariotaku.twidere.fragment.BaseFragment 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.event.StatusListChangedEvent
import org.mariotaku.twidere.model.pagination.Pagination import org.mariotaku.twidere.model.pagination.Pagination
import org.mariotaku.twidere.model.pagination.SinceMaxPagination import org.mariotaku.twidere.model.pagination.SinceMaxPagination
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.task.AbsAccountRequestTask import org.mariotaku.twidere.task.AbsAccountRequestTask
import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.ContentScrollHandler.ContentListSupport import org.mariotaku.twidere.util.ContentScrollHandler.ContentListSupport
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback
import org.mariotaku.twidere.util.RecyclerViewScrollHandler.RecyclerViewCallback 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.CardMediaContainer.OnMediaClickListener
import org.mariotaku.twidere.view.ExtendedRecyclerView import org.mariotaku.twidere.view.ExtendedRecyclerView
import org.mariotaku.twidere.view.holder.GapViewHolder import org.mariotaku.twidere.view.holder.GapViewHolder
@ -160,16 +163,15 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
private lateinit var statusActivitySummaryLiveData: StatusActivitySummaryLiveData private lateinit var statusActivitySummaryLiveData: StatusActivitySummaryLiveData
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
val activity = activity ?: return
when (requestCode) { when (requestCode) {
REQUEST_SET_COLOR -> { REQUEST_SET_COLOR -> {
val status = adapter.status ?: return val status = adapter.status ?: return
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
if (data == null) return if (data == null) return
val color = data.getIntExtra(EXTRA_COLOR, Color.TRANSPARENT) 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) { } 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) 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) { override fun onQuotedMediaClick(holder: IStatusViewHolder, view: View, current: ParcelableMedia, statusPosition: Int) {
val status = adapter.getStatus(statusPosition) 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, IntentUtils.openMedia(activity!!, status.account_key, status.is_possibly_sensitive, status,
current, quotedMedia, preferences[newDocumentApiKey], current, quotedMedia, preferences[newDocumentApiKey],
preferences[displaySensitiveContentsKey]) preferences[displaySensitiveContentsKey])
@ -258,7 +260,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
override fun onQuotedStatusClick(holder: IStatusViewHolder, position: Int) { override fun onQuotedStatusClick(holder: IStatusViewHolder, position: Int) {
val status = adapter.getStatus(position) val status = adapter.getStatus(position)
val quotedId = status.quoted_id ?: return val quotedId = status.quoted?.id ?: return
IntentUtils.openStatus(activity!!, status.account_key, quotedId) 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) { override fun onMediaClick(view: View, current: ParcelableMedia, accountKey: UserKey?, id: Long) {
val status = adapter.status ?: return val status = adapter.status ?: return
if ((view.parent as View).id == R.id.quotedMediaPreview && status.quoted_media != null) { if ((view.parent as View).id == R.id.quotedMediaPreview && status.attachment?.quoted?.media != null) {
IntentUtils.openMediaDirectly(activity!!, accountKey, status.quoted_media!!, current, IntentUtils.openMediaDirectly(activity!!, accountKey, status.attachment?.quoted?.media!!, current,
newDocument = preferences[newDocumentApiKey], status = status) newDocument = preferences[newDocumentApiKey], status = status)
} else if (status.media != null) { } else if (status.attachment?.media != null) {
IntentUtils.openMediaDirectly(activity!!, accountKey, status.media!!, current, IntentUtils.openMediaDirectly(activity!!, accountKey, status.attachment?.media!!, current,
newDocument = preferences[newDocumentApiKey], status = status) newDocument = preferences[newDocumentApiKey], status = status)
} }
} }
@ -503,7 +505,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
bus.register(this) BusSingleton.register(this)
recyclerView.addOnScrollListener(scrollListener) recyclerView.addOnScrollListener(scrollListener)
recyclerView.setOnTouchListener(scrollListener.touchListener) recyclerView.setOnTouchListener(scrollListener.touchListener)
} }
@ -511,7 +513,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
override fun onStop() { override fun onStop() {
recyclerView.setOnTouchListener(null) recyclerView.setOnTouchListener(null)
recyclerView.removeOnScrollListener(scrollListener) recyclerView.removeOnScrollListener(scrollListener)
bus.unregister(this) BusSingleton.unregister(this)
super.onStop() super.onStop()
} }
@ -521,7 +523,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
val status = adapter.getStatus(contextMenuInfo.position) val status = adapter.getStatus(contextMenuInfo.position)
val inflater = MenuInflater(context) val inflater = MenuInflater(context)
inflater.inflate(R.menu.action_status, menu) 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 { override fun onContextItemSelected(item: MenuItem): Boolean {
@ -536,7 +538,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
return true return true
} }
return MenuUtils.handleStatusClick(activity!!, this, fragmentManager!!, return MenuUtils.handleStatusClick(activity!!, this, fragmentManager!!,
preferences, userColorNameManager, status, item) preferences, UserColorNameManager.get(context!!), status, item)
} }
@Subscribe @Subscribe

View File

@ -12,12 +12,10 @@ import nl.komponents.kovenant.ui.alwaysUi
import org.mariotaku.ktextension.toWeak import org.mariotaku.ktextension.toWeak
import org.mariotaku.twidere.R import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.SYNC_PREFERENCES_NAME import org.mariotaku.twidere.TwidereConstants.SYNC_PREFERENCES_NAME
import org.mariotaku.twidere.extension.applyTheme import org.mariotaku.twidere.extension.*
import org.mariotaku.twidere.extension.dismissProgressDialog
import org.mariotaku.twidere.extension.onShow
import org.mariotaku.twidere.extension.showProgressDialog
import org.mariotaku.twidere.fragment.BaseDialogFragment import org.mariotaku.twidere.fragment.BaseDialogFragment
import org.mariotaku.twidere.fragment.BasePreferenceFragment import org.mariotaku.twidere.fragment.BasePreferenceFragment
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.TaskServiceRunner import org.mariotaku.twidere.util.TaskServiceRunner
class SyncSettingsFragment : BasePreferenceFragment() { class SyncSettingsFragment : BasePreferenceFragment() {
@ -29,11 +27,11 @@ class SyncSettingsFragment : BasePreferenceFragment() {
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
bus.register(this) BusSingleton.register(this)
} }
override fun onStop() { override fun onStop() {
bus.unregister(this) BusSingleton.unregister(this)
super.onStop() 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.*
import org.mariotaku.twidere.extension.adapter.removeStatuses import org.mariotaku.twidere.extension.adapter.removeStatuses
import org.mariotaku.twidere.extension.data.observe 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.PositionWithOffset
import org.mariotaku.twidere.extension.view.firstVisibleItemPosition import org.mariotaku.twidere.extension.view.firstVisibleItemPosition
import org.mariotaku.twidere.extension.view.firstVisibleItemPositionWithOffset 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.model.timeline.TimelineFilter
import org.mariotaku.twidere.promise.StatusPromises import org.mariotaku.twidere.promise.StatusPromises
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.task.CreateFavoriteTask import org.mariotaku.twidere.task.CreateFavoriteTask
import org.mariotaku.twidere.task.statuses.GetStatusesTask import org.mariotaku.twidere.task.statuses.GetStatusesTask
import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.UserColorNameManager.Companion
import org.mariotaku.twidere.view.ExtendedRecyclerView import org.mariotaku.twidere.view.ExtendedRecyclerView
import org.mariotaku.twidere.view.holder.GapViewHolder import org.mariotaku.twidere.view.holder.GapViewHolder
import org.mariotaku.twidere.view.holder.TimelineFilterHeaderViewHolder import org.mariotaku.twidere.view.holder.TimelineFilterHeaderViewHolder
@ -174,11 +177,11 @@ abstract class AbsTimelineFragment : AbsContentRecyclerViewFragment<ParcelableSt
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
recyclerView.addOnScrollListener(scrollHandler) recyclerView.addOnScrollListener(scrollHandler)
bus.register(busEventHandler) BusSingleton.register(busEventHandler)
} }
override fun onStop() { override fun onStop() {
bus.unregister(busEventHandler) BusSingleton.unregister(busEventHandler)
recyclerView.removeOnScrollListener(scrollHandler) recyclerView.removeOnScrollListener(scrollHandler)
if (userVisibleHint) { if (userVisibleHint) {
saveReadPosition(layoutManager.firstVisibleItemPosition) saveReadPosition(layoutManager.firstVisibleItemPosition)
@ -215,7 +218,7 @@ abstract class AbsTimelineFragment : AbsContentRecyclerViewFragment<ParcelableSt
val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo
val status = adapter.getStatus(contextMenuInfo.position) val status = adapter.getStatus(contextMenuInfo.position)
inflater.inflate(R.menu.action_status, menu) 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 { override fun onContextItemSelected(item: MenuItem): Boolean {
@ -240,7 +243,7 @@ abstract class AbsTimelineFragment : AbsContentRecyclerViewFragment<ParcelableSt
return true return true
} }
else -> return MenuUtils.handleStatusClick(context, this, fragmentManager!!, 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) { override fun onQuotedMediaClick(holder: IStatusViewHolder, view: View, current: ParcelableMedia, statusPosition: Int) {
val context = context ?: return val context = context ?: return
val status = getFullStatus(statusPosition) 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, IntentUtils.openMedia(context, status.account_key, status.is_possibly_sensitive, status,
current, quotedMedia, preferences[newDocumentApiKey], preferences[displaySensitiveContentsKey]) current, quotedMedia, preferences[newDocumentApiKey], preferences[displaySensitiveContentsKey])
} }
@ -578,7 +581,7 @@ abstract class AbsTimelineFragment : AbsContentRecyclerViewFragment<ParcelableSt
override fun onQuotedStatusClick(holder: IStatusViewHolder, position: Int) { override fun onQuotedStatusClick(holder: IStatusViewHolder, position: Int) {
val context = context ?: return val context = context ?: return
val status = getFullStatus(position) val status = getFullStatus(position)
val quotedId = status.quoted_id ?: return val quotedId = status.quoted?.id ?: return
IntentUtils.openStatus(context, status.account_key, quotedId) 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.UserListSubscriptionEvent
import org.mariotaku.twidere.model.event.UserListUpdatedEvent import org.mariotaku.twidere.model.event.UserListUpdatedEvent
import org.mariotaku.twidere.promise.UserListPromises import org.mariotaku.twidere.promise.UserListPromises
import org.mariotaku.twidere.util.IntentUtils import org.mariotaku.twidere.singleton.BusSingleton
import org.mariotaku.twidere.util.LinkCreator import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.MenuUtils import org.mariotaku.twidere.util.UserColorNameManager.Companion
import org.mariotaku.twidere.util.Utils
import org.mariotaku.twidere.util.shortcut.ShortcutCreator import org.mariotaku.twidere.util.shortcut.ShortcutCreator
class UserListFragment : AbsToolbarTabPagesFragment(), OnClickListener, class UserListFragment : AbsToolbarTabPagesFragment(), OnClickListener,
@ -100,11 +99,11 @@ class UserListFragment : AbsToolbarTabPagesFragment(), OnClickListener,
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
bus.register(this) BusSingleton.register(this)
} }
override fun onStop() { override fun onStop() {
bus.unregister(this) BusSingleton.unregister(this)
super.onStop() super.onStop()
} }
@ -401,7 +400,7 @@ class UserListFragment : AbsToolbarTabPagesFragment(), OnClickListener,
messageBuilder.append('\n') messageBuilder.append('\n')
} }
messageBuilder.append(getString(R.string.label_created_by_name, messageBuilder.append(getString(R.string.label_created_by_name,
userColorNameManager.getDisplayName(userList))) UserColorNameManager.get(context!!).getDisplayName(userList)))
val builder = AlertDialog.Builder(context!!) val builder = AlertDialog.Builder(context!!)
builder.setTitle(userList.name) builder.setTitle(userList.name)
builder.setMessage(messageBuilder) builder.setMessage(messageBuilder)

View File

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

View File

@ -63,13 +63,13 @@ class IncomingFriendshipsFragment : AbsUsersFragment(), IUsersAdapter.RequestCli
override fun onAcceptClicked(holder: UserViewHolder, position: Int) { override fun onAcceptClicked(holder: UserViewHolder, position: Int) {
val user = adapter.getUser(position) ?: return val user = adapter.getUser(position) ?: return
val accountKey = user.account_key ?: 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) { override fun onDenyClicked(holder: UserViewHolder, position: Int) {
val user = adapter.getUser(position) ?: return val user = adapter.getUser(position) ?: return
val accountKey = user.account_key ?: return val accountKey = user.account_key ?: return
FriendshipPromises.getInstance(context!!).deny(accountKey, user.key) FriendshipPromises.get(context!!).deny(accountKey, user.key)
} }
@SuppressLint("SwitchIntDef") @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.R
import org.mariotaku.twidere.constant.IntentConstants.* import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.data.fetcher.UsersFetcher import org.mariotaku.twidere.data.fetcher.UsersFetcher
import org.mariotaku.twidere.data.fetcher.users.UserListMembersFetcher
import org.mariotaku.twidere.extension.* import org.mariotaku.twidere.extension.*
import org.mariotaku.twidere.fragment.AbsUsersFragment import org.mariotaku.twidere.fragment.AbsUsersFragment
import org.mariotaku.twidere.fragment.DeleteUserListMembersDialogFragment import org.mariotaku.twidere.fragment.DeleteUserListMembersDialogFragment
import org.mariotaku.twidere.fragment.userlist.UserListFragment 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.ParcelableUserList
import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.event.UserListMembersChangedEvent import org.mariotaku.twidere.model.event.UserListMembersChangedEvent
import org.mariotaku.twidere.model.util.ParcelableUserListUtils 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.ExtendedRecyclerView
import org.mariotaku.twidere.view.holder.UserViewHolder import org.mariotaku.twidere.view.holder.UserViewHolder
import java.util.* import java.util.*
@ -71,11 +73,11 @@ class UserListMembersFragment : AbsUsersFragment() {
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
bus.register(this) BusSingleton.register(this)
} }
override fun onStop() { override fun onStop() {
bus.unregister(this) BusSingleton.unregister(this)
super.onStop() super.onStop()
} }
@ -98,16 +100,16 @@ class UserListMembersFragment : AbsUsersFragment() {
if (accountKey != userKey) return if (accountKey != userKey) return
val inflater = MenuInflater(context) val inflater = MenuInflater(context)
val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo? 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) 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 { override fun onContextItemSelected(item: MenuItem): Boolean {
if (!userVisibleHint) return false if (!userVisibleHint) return false
val userList = userList ?: return false val userList = userList ?: return false
val contextMenuInfo = item.menuInfo as ExtendedRecyclerView.ContextMenuInfo val contextMenuInfo = item.menuInfo as ExtendedRecyclerView.ContextMenuInfo
val user = adapter.getUser(contextMenuInfo.position) ?: return false val user = adapter.getUser(contextMenuInfo.position)
when (item.itemId) { when (item.itemId) {
R.id.delete_from_list -> { R.id.delete_from_list -> {
DeleteUserListMembersDialogFragment.show(fragmentManager!!, userList, user) DeleteUserListMembersDialogFragment.show(fragmentManager!!, userList, user)

View File

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

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