migrating to dagger

This commit is contained in:
Mariotaku Lee 2015-10-05 18:00:07 +08:00
parent 5abcdaab5f
commit 1a5cffbe5b
80 changed files with 1299 additions and 522 deletions

View File

@ -8,8 +8,8 @@ buildscript {
dependencies { dependencies {
classpath 'com.github.ben-manes:gradle-versions-plugin:0.11.3' classpath 'com.github.ben-manes:gradle-versions-plugin:0.11.3'
classpath 'com.android.tools.build:gradle:1.3.1' classpath 'com.android.tools.build:gradle:1.3.1'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.7' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
classpath('fr.avianey.androidsvgdrawable:gradle-plugin:1.0.2') { classpath('fr.avianey.androidsvgdrawable:gradle-plugin:2.0.0') {
// should be excluded to avoid conflict // should be excluded to avoid conflict
exclude group: 'xerces' exclude group: 'xerces'
} }

View File

@ -18,7 +18,7 @@
*/ */
android { android {
compileSdkVersion 23 compileSdkVersion 23
buildToolsVersion '23.0.0' buildToolsVersion '23.0.1'
lintOptions { lintOptions {
abortOnError false abortOnError false

View File

@ -39,8 +39,8 @@ android {
dependencies { dependencies {
apt 'com.bluelinelabs:logansquare-compiler:1.1.0' apt 'com.bluelinelabs:logansquare-compiler:1.1.0'
apt 'com.hannesdorfmann.parcelableplease:processor:1.0.1' apt 'com.hannesdorfmann.parcelableplease:processor:1.0.1'
compile 'com.android.support:support-annotations:23.0.0' compile 'com.android.support:support-annotations:23.0.1'
compile 'com.android.support:support-v4:23.0.0' compile 'com.android.support:support-v4:23.0.1'
compile 'com.bluelinelabs:logansquare:1.1.0' compile 'com.bluelinelabs:logansquare:1.1.0'
compile 'org.apache.commons:commons-lang3:3.4' compile 'org.apache.commons:commons-lang3:3.4'
compile 'com.github.mariotaku:RestFu:0.9.2' compile 'com.github.mariotaku:RestFu:0.9.2'

View File

@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle')
android { android {
defaultConfig { defaultConfig {
minSdkVersion 14 minSdkVersion 14
targetSdkVersion 22 targetSdkVersion 23
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
} }

View File

@ -36,7 +36,7 @@ android {
} }
dependencies { dependencies {
compile 'com.google.android.support:wearable:1.2.0' compile 'com.google.android.support:wearable:1.3.0'
compile project(':twidere.component.nyan') compile project(':twidere.component.nyan')
compile fileTree(dir: 'libs', include: ['*.jar']) compile fileTree(dir: 'libs', include: ['*.jar'])
} }

View File

@ -24,7 +24,7 @@ android {
defaultConfig { defaultConfig {
applicationId "org.mariotaku.twidere.extension.launcher.compose" applicationId "org.mariotaku.twidere.extension.launcher.compose"
minSdkVersion 14 minSdkVersion 14
targetSdkVersion 22 targetSdkVersion 23
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
} }

View File

@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle')
android { android {
defaultConfig { defaultConfig {
minSdkVersion 14 minSdkVersion 14
targetSdkVersion 22 targetSdkVersion 23
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
} }

View File

@ -41,6 +41,6 @@ android {
dependencies { dependencies {
compile fileTree(dir: 'libs', include: ['*.jar']) compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.android.support:wearable:1.1.0' compile 'com.google.android.support:wearable:1.3.0'
compile 'com.google.android.gms:play-services-wearable:7.5.0' compile 'com.google.android.gms:play-services-wearable:8.1.0'
} }

View File

@ -58,19 +58,20 @@ dependencies {
// wearApp project(':twidere.wear') // wearApp project(':twidere.wear')
apt 'com.bluelinelabs:logansquare-compiler:1.1.0' apt 'com.bluelinelabs:logansquare-compiler:1.1.0'
apt 'com.hannesdorfmann.parcelableplease:processor:1.0.1' apt 'com.hannesdorfmann.parcelableplease:processor:1.0.1'
apt 'com.google.dagger:dagger-compiler:2.0.1'
compile 'com.android.support:multidex:1.0.1' compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:support-v13:23.0.0' compile 'com.android.support:support-v13:23.0.1'
compile 'com.android.support:appcompat-v7:23.0.0' compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:cardview-v7:23.0.0' compile 'com.android.support:cardview-v7:23.0.1'
compile 'com.android.support:recyclerview-v7:23.0.0' compile 'com.android.support:recyclerview-v7:23.0.1'
compile 'com.twitter:twitter-text:1.12.1' compile 'com.twitter:twitter-text:1.12.1'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.4' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.4'
compile 'com.squareup:otto:1.3.8' compile 'com.squareup:otto:1.3.8'
compile 'dnsjava:dnsjava:2.1.7' compile 'dnsjava:dnsjava:2.1.7'
compile 'com.commonsware.cwac:merge:1.1.1' compile 'com.commonsware.cwac:merge:1.1.1'
compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.1.4' compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.4.0'
compile 'com.rengwuxian.materialedittext:library:2.1.4' compile 'com.rengwuxian.materialedittext:library:2.1.4'
compile 'com.pnikosis:materialish-progress:1.5' compile 'com.pnikosis:materialish-progress:1.7'
compile 'com.squareup.okhttp:okhttp:2.5.0' compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.7' compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.7'
compile 'com.github.johnpersano:supertoasts:1.3.4.1@aar' compile 'com.github.johnpersano:supertoasts:1.3.4.1@aar'
@ -79,28 +80,30 @@ dependencies {
compile 'com.github.uucky:ColorPicker-Android:0.9.7@aar' compile 'com.github.uucky:ColorPicker-Android:0.9.7@aar'
compile 'com.github.boxme:asyncmanager:1.0.0' compile 'com.github.boxme:asyncmanager:1.0.0'
compile 'com.sprylab.android.texturevideoview:texturevideoview:1.0.1' compile 'com.sprylab.android.texturevideoview:texturevideoview:1.0.1'
compile 'com.squareup:pollexor:2.0.3' compile 'com.squareup:pollexor:2.0.4'
compile 'com.squareup:tape:1.2.3' compile 'com.squareup:tape:1.2.3'
compile 'org.apache.commons:commons-lang3:3.4' compile 'org.apache.commons:commons-lang3:3.4'
compile 'com.bluelinelabs:logansquare:1.1.0' compile 'com.bluelinelabs:logansquare:1.1.0'
compile 'ch.acra:acra:4.6.2' compile 'ch.acra:acra:4.6.2'
compile 'org.jraf:android-switch-backport:2.0.1' compile 'org.jraf:android-switch-backport:2.0.1'
compile 'com.fasterxml.jackson.jr:jackson-jr-objects:2.6.1' compile 'com.fasterxml.jackson.jr:jackson-jr-objects:2.6.2'
compile 'com.makeramen:roundedimageview:2.1.1' compile 'com.makeramen:roundedimageview:2.1.1'
compile 'com.soundcloud.android:android-crop:1.0.0@aar' compile 'com.soundcloud.android:android-crop:1.0.1@aar'
compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.1' compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.1'
compile 'com.github.mariotaku:PickNCrop:44b09cbc69' compile 'com.github.mariotaku:PickNCrop:44b09cbc69'
compile 'com.diogobernardino:williamchart:2.0.1' compile 'com.diogobernardino:williamchart:2.0.1'
compile 'com.lnikkila:extendedtouchview:0.1.0' compile 'com.lnikkila:extendedtouchview:0.1.0'
googleCompile 'com.google.android.gms:play-services-maps:7.8.0' compile 'com.google.dagger:dagger:2.0.1'
googleCompile 'com.google.android.gms:play-services-maps:8.1.0'
googleCompile 'com.google.maps.android:android-maps-utils:0.4' googleCompile 'com.google.maps.android:android-maps-utils:0.4'
fdroidCompile 'org.osmdroid:osmdroid-android:4.3' fdroidCompile 'org.osmdroid:osmdroid-android:4.3'
fdroidCompile 'org.slf4j:slf4j-simple:1.7.12' fdroidCompile 'org.slf4j:slf4j-simple:1.7.12'
debugCompile 'com.facebook.stetho:stetho:1.1.1' debugCompile 'com.facebook.stetho:stetho:1.2.0'
debugCompile 'com.facebook.stetho:stetho-okhttp:1.1.1' debugCompile 'com.facebook.stetho:stetho-okhttp:1.2.0'
compile project(':twidere.component.common') compile project(':twidere.component.common')
compile project(':twidere.component.nyan') compile project(':twidere.component.nyan')
compile fileTree(dir: 'libs/main', include: ['*.jar']) compile fileTree(dir: 'libs/main', include: ['*.jar'])
provided 'javax.annotation:jsr250-api:1.0'
// googleCompile fileTree(dir: 'libs/google', include: ['*.jar']) // googleCompile fileTree(dir: 'libs/google', include: ['*.jar'])
} }

View File

@ -20,9 +20,13 @@
package edu.tsinghua.hotmobi.model; package edu.tsinghua.hotmobi.model;
import android.content.Context; import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
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 com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease;
import java.util.TimeZone; import java.util.TimeZone;
@ -31,17 +35,43 @@ import edu.tsinghua.hotmobi.HotMobiLogger;
/** /**
* Created by mariotaku on 15/8/8. * Created by mariotaku on 15/8/8.
*/ */
@ParcelablePlease
@JsonObject @JsonObject
public class BaseEvent { public class BaseEvent implements Parcelable {
public static final Creator<BaseEvent> CREATOR = new Creator<BaseEvent>() {
@Override
public BaseEvent createFromParcel(Parcel in) {
return new BaseEvent(in);
}
@Override
public BaseEvent[] newArray(int size) {
return new BaseEvent[size];
}
};
@ParcelableThisPlease
@JsonField(name = "start_time") @JsonField(name = "start_time")
long startTime; long startTime;
@ParcelableThisPlease
@JsonField(name = "end_time") @JsonField(name = "end_time")
long endTime; long endTime;
@ParcelableThisPlease
@JsonField(name = "time_offset") @JsonField(name = "time_offset")
long timeOffset; long timeOffset;
@ParcelableThisPlease
@JsonField(name = "location") @JsonField(name = "location")
LatLng location; LatLng location;
public BaseEvent() {
}
protected BaseEvent(Parcel in) {
BaseEventParcelablePlease.readFromParcel(this, in);
}
public void setStartTime(long startTime) { public void setStartTime(long startTime) {
this.startTime = startTime; this.startTime = startTime;
} }
@ -67,4 +97,14 @@ public class BaseEvent {
public void markEnd() { public void markEnd() {
setEndTime(System.currentTimeMillis()); setEndTime(System.currentTimeMillis());
} }
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
BaseEventParcelablePlease.writeToParcel(this, dest, flags);
}
} }

View File

@ -19,16 +19,24 @@
package edu.tsinghua.hotmobi.model; package edu.tsinghua.hotmobi.model;
import android.os.Parcel;
import android.os.Parcelable;
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 com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease;
/** /**
* Created by mariotaku on 15/8/13. * Created by mariotaku on 15/8/13.
*/ */
@ParcelablePlease
@JsonObject @JsonObject
public class LatLng { public class LatLng implements Parcelable {
@ParcelableThisPlease
@JsonField(name = "latitude") @JsonField(name = "latitude")
double latitude; double latitude;
@ParcelableThisPlease
@JsonField(name = "longitude") @JsonField(name = "longitude")
double longitude; double longitude;
@ -36,11 +44,26 @@ public class LatLng {
} }
public LatLng(double latitude, double longitude) { public LatLng(double latitude, double longitude) {
this.latitude = latitude; this.latitude = latitude;
this.longitude = longitude; this.longitude = longitude;
} }
protected LatLng(Parcel in) {
LatLngParcelablePlease.readFromParcel(this, in);
}
public static final Creator<LatLng> CREATOR = new Creator<LatLng>() {
@Override
public LatLng createFromParcel(Parcel in) {
return new LatLng(in);
}
@Override
public LatLng[] newArray(int size) {
return new LatLng[size];
}
};
public double getLatitude() { public double getLatitude() {
return latitude; return latitude;
} }
@ -56,4 +79,14 @@ public class LatLng {
public void setLongitude(double longitude) { public void setLongitude(double longitude) {
this.longitude = longitude; this.longitude = longitude;
} }
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
LatLngParcelablePlease.writeToParcel(this, dest, flags);
}
} }

View File

@ -20,6 +20,8 @@
package edu.tsinghua.hotmobi.model; package edu.tsinghua.hotmobi.model;
import android.content.Context; import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
import com.bluelinelabs.logansquare.annotation.JsonField; import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject; import com.bluelinelabs.logansquare.annotation.JsonObject;
@ -30,13 +32,47 @@ import edu.tsinghua.hotmobi.TypeMappingUtil;
* Created by mariotaku on 15/8/20. * Created by mariotaku on 15/8/20.
*/ */
@JsonObject @JsonObject
public class LinkEvent extends BaseEvent { public class LinkEvent extends BaseEvent implements Parcelable {
@JsonField(name = "link") @JsonField(name = "link")
String link; String link;
@JsonField(name = "type") @JsonField(name = "type")
String type; String type;
public LinkEvent() {
}
protected LinkEvent(Parcel in) {
super(in);
link = in.readString();
type = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeString(link);
dest.writeString(type);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<LinkEvent> CREATOR = new Creator<LinkEvent>() {
@Override
public LinkEvent createFromParcel(Parcel in) {
return new LinkEvent(in);
}
@Override
public LinkEvent[] newArray(int size) {
return new LinkEvent[size];
}
};
public void setLink(String link) { public void setLink(String link) {
this.link = link; this.link = link;
} }

View File

@ -23,6 +23,8 @@ import android.content.Context;
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 com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease;
import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
@ -30,21 +32,29 @@ import org.mariotaku.twidere.model.ParcelableStatus;
/** /**
* Created by mariotaku on 15/8/7. * Created by mariotaku on 15/8/7.
*/ */
@ParcelablePlease
@JsonObject @JsonObject
public class MediaEvent extends BaseEvent { public class MediaEvent extends BaseEvent {
@ParcelableThisPlease
@JsonField(name = "id") @JsonField(name = "id")
long id; long id;
@ParcelableThisPlease
@JsonField(name = "user_id") @JsonField(name = "user_id")
long userId; long userId;
@ParcelableThisPlease
@JsonField(name = "tweet_type", typeConverter = TweetType.TweetTypeConverter.class) @JsonField(name = "tweet_type", typeConverter = TweetType.TweetTypeConverter.class)
TweetType tweetType; TweetType tweetType;
@ParcelableThisPlease
@JsonField(name = "timeline_type", typeConverter = TimelineType.TimelineTypeConverter.class) @JsonField(name = "timeline_type", typeConverter = TimelineType.TimelineTypeConverter.class)
TimelineType timelineType; TimelineType timelineType;
@ParcelableThisPlease
@JsonField(name = "preview_url") @JsonField(name = "preview_url")
String previewUrl; String previewUrl;
@ParcelableThisPlease
@JsonField(name = "media_url") @JsonField(name = "media_url")
String mediaUrl; String mediaUrl;
@ParcelableThisPlease
@JsonField(name = "preview_enabled") @JsonField(name = "preview_enabled")
boolean previewEnabled; boolean previewEnabled;

View File

@ -25,13 +25,17 @@ import android.net.NetworkInfo;
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 com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease;
/** /**
* Created by mariotaku on 15/8/20. * Created by mariotaku on 15/8/20.
*/ */
@ParcelablePlease
@JsonObject @JsonObject
public class NetworkEvent extends BaseEvent { public class NetworkEvent extends BaseEvent {
@ParcelableThisPlease
@JsonField(name = "network_type") @JsonField(name = "network_type")
int networkType; int networkType;

View File

@ -23,15 +23,20 @@ import android.content.Context;
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 com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease;
/** /**
* Created by mariotaku on 15/8/8. * Created by mariotaku on 15/8/8.
*/ */
@ParcelablePlease
@JsonObject @JsonObject
public class RefreshEvent extends BaseEvent { public class RefreshEvent extends BaseEvent {
@ParcelableThisPlease
@JsonField(name = "ids") @JsonField(name = "ids")
long[] ids; long[] ids;
@ParcelableThisPlease
@JsonField(name = "timeline_type", typeConverter = TimelineType.TimelineTypeConverter.class) @JsonField(name = "timeline_type", typeConverter = TimelineType.TimelineTypeConverter.class)
TimelineType timelineType; TimelineType timelineType;

View File

@ -21,19 +21,45 @@ package edu.tsinghua.hotmobi.model;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Parcel;
import android.os.Parcelable;
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 com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease;
/** /**
* Created by mariotaku on 15/8/8. * Created by mariotaku on 15/8/8.
*/ */
@ParcelablePlease
@JsonObject @JsonObject
public class SessionEvent extends BaseEvent { public class SessionEvent extends BaseEvent implements Parcelable {
public static final Creator<SessionEvent> CREATOR = new Creator<SessionEvent>() {
@Override
public SessionEvent createFromParcel(Parcel in) {
return new SessionEvent(in);
}
@Override
public SessionEvent[] newArray(int size) {
return new SessionEvent[size];
}
};
@ParcelableThisPlease
@JsonField(name = "configuration") @JsonField(name = "configuration")
String configuration; String configuration;
protected SessionEvent(Parcel in) {
super(in);
SessionEventParcelablePlease.readFromParcel(this, in);
}
public SessionEvent() {
}
public static SessionEvent create(Context context) { public static SessionEvent create(Context context) {
final SessionEvent event = new SessionEvent(); final SessionEvent event = new SessionEvent();
@ -44,6 +70,17 @@ public class SessionEvent extends BaseEvent {
return event; return event;
} }
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
SessionEventParcelablePlease.writeToParcel(this, dest, flags);
}
@Override
public int describeContents() {
return 0;
}
public void setConfiguration(String configuration) { public void setConfiguration(String configuration) {
this.configuration = configuration; this.configuration = configuration;
} }

View File

@ -24,25 +24,34 @@ import android.content.Context;
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.typeconverters.StringBasedTypeConverter; import com.bluelinelabs.logansquare.typeconverters.StringBasedTypeConverter;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
import com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
/** /**
* Created by mariotaku on 15/8/7. * Created by mariotaku on 15/8/7.
*/ */
@ParcelablePlease
@JsonObject @JsonObject
public class TweetEvent extends BaseEvent { public class TweetEvent extends BaseEvent {
@ParcelableThisPlease
@JsonField(name = "id") @JsonField(name = "id")
long id; long id;
@ParcelableThisPlease
@JsonField(name = "account_id") @JsonField(name = "account_id")
long accountId; long accountId;
@ParcelableThisPlease
@JsonField(name = "user_id") @JsonField(name = "user_id")
long userId; long userId;
@ParcelableThisPlease
@JsonField(name = "tweet_type", typeConverter = TweetType.TweetTypeConverter.class) @JsonField(name = "tweet_type", typeConverter = TweetType.TweetTypeConverter.class)
TweetType tweetType; TweetType tweetType;
@ParcelableThisPlease
@JsonField(name = "timeline_type", typeConverter = TimelineType.TimelineTypeConverter.class) @JsonField(name = "timeline_type", typeConverter = TimelineType.TimelineTypeConverter.class)
TimelineType timelineType; TimelineType timelineType;
@ParcelableThisPlease
@JsonField(name = "action", typeConverter = Action.TweetActionConverter.class) @JsonField(name = "action", typeConverter = Action.TweetActionConverter.class)
Action action; Action action;

View File

@ -32,14 +32,19 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IControlBarActivity; import org.mariotaku.twidere.activity.iface.IControlBarActivity;
import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback; import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback;
import org.mariotaku.twidere.util.ActivityStack;
import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.AsyncTwitterWrapper;
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;
import org.mariotaku.twidere.util.ReadStateManager;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.dagger.component.DaggerBaseAppCompatActivityComponent;
import org.mariotaku.twidere.view.iface.IExtendedView.OnFitSystemWindowsListener; import org.mariotaku.twidere.view.iface.IExtendedView.OnFitSystemWindowsListener;
import java.util.ArrayList; import java.util.ArrayList;
import javax.inject.Inject;
@SuppressLint("Registered") @SuppressLint("Registered")
public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Constants, public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Constants,
OnFitSystemWindowsListener, SystemWindowsInsetsCallback, IControlBarActivity, OnFitSystemWindowsListener, SystemWindowsInsetsCallback, IControlBarActivity,
@ -47,6 +52,12 @@ public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Co
// Utility classes // Utility classes
private KeyboardShortcutsHandler mKeyboardShortcutsHandler; private KeyboardShortcutsHandler mKeyboardShortcutsHandler;
@Inject
protected ActivityStack mActivityStack;
@Inject
protected AsyncTwitterWrapper mTwitterWrapper;
@Inject
protected ReadStateManager mReadStateManager;
// Registered listeners // Registered listeners
private ArrayList<ControlBarOffsetListener> mControlBarOffsetListeners = new ArrayList<>(); private ArrayList<ControlBarOffsetListener> mControlBarOffsetListeners = new ArrayList<>();
@ -77,10 +88,6 @@ public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Co
return (TwidereApplication) getApplication(); return (TwidereApplication) getApplication();
} }
public AsyncTwitterWrapper getTwitterWrapper() {
return getTwidereApplication() != null ? getTwidereApplication().getTwitterWrapper() : null;
}
public boolean isVisible() { public boolean isVisible() {
return mIsVisible; return mIsVisible;
} }
@ -142,6 +149,7 @@ public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Co
@Override @Override
protected void onCreate(final Bundle savedInstanceState) { protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
DaggerBaseAppCompatActivityComponent.builder().applicationModule(TwidereApplication.getModule(this)).build().inject(this);
mKeyboardShortcutsHandler = TwidereApplication.getInstance(this).getKeyboardShortcutsHandler(); mKeyboardShortcutsHandler = TwidereApplication.getInstance(this).getKeyboardShortcutsHandler();
} }
@ -149,6 +157,7 @@ public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Co
@Override @Override
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
mActivityStack.dispatchStart(this);
mIsVisible = true; mIsVisible = true;
} }
@ -177,6 +186,7 @@ public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Co
@Override @Override
protected void onStop() { protected void onStop() {
mIsVisible = false; mIsVisible = false;
mActivityStack.dispatchStop(this);
super.onStop(); super.onStop();
} }

View File

@ -115,7 +115,6 @@ import org.mariotaku.twidere.preference.ServicePickerPreference;
import org.mariotaku.twidere.provider.TwidereDataStore.Drafts; import org.mariotaku.twidere.provider.TwidereDataStore.Drafts;
import org.mariotaku.twidere.text.MarkForDeleteSpan; import org.mariotaku.twidere.text.MarkForDeleteSpan;
import org.mariotaku.twidere.util.AsyncTaskUtils; import org.mariotaku.twidere.util.AsyncTaskUtils;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ContentValuesCreator; import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.EditTextEnterHandler; import org.mariotaku.twidere.util.EditTextEnterHandler;
import org.mariotaku.twidere.util.EditTextEnterHandler.EnterListener; import org.mariotaku.twidere.util.EditTextEnterHandler.EnterListener;
@ -163,7 +162,6 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
// Utility classes // Utility classes
private final Extractor mExtractor = new Extractor(); private final Extractor mExtractor = new Extractor();
private TwidereValidator mValidator; private TwidereValidator mValidator;
private AsyncTwitterWrapper mTwitterWrapper;
private LocationManager mLocationManager; private LocationManager mLocationManager;
private SharedPreferencesWrapper mPreferences; private SharedPreferencesWrapper mPreferences;
private ContentResolver mResolver; private ContentResolver mResolver;
@ -589,7 +587,6 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
Context.MODE_PRIVATE, SharedPreferenceConstants.class); Context.MODE_PRIVATE, SharedPreferenceConstants.class);
final TwidereApplication app = TwidereApplication.getInstance(this); final TwidereApplication app = TwidereApplication.getInstance(this);
mTwitterWrapper = app.getTwitterWrapper();
mResolver = getContentResolver(); mResolver = getContentResolver();
mValidator = new TwidereValidator(this); mValidator = new TwidereValidator(this);
mImageLoader = app.getMediaLoaderWrapper(); mImageLoader = app.getMediaLoaderWrapper();

View File

@ -19,6 +19,7 @@
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity.support;
import android.app.ActivityManager;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.app.SearchManager; import android.app.SearchManager;
@ -85,7 +86,6 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Mentions;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses; import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
import org.mariotaku.twidere.service.StreamingService; import org.mariotaku.twidere.service.StreamingService;
import org.mariotaku.twidere.util.AsyncTaskUtils; import org.mariotaku.twidere.util.AsyncTaskUtils;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.CustomTabUtils; import org.mariotaku.twidere.util.CustomTabUtils;
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;
@ -128,6 +128,7 @@ import static org.mariotaku.twidere.util.Utils.showMenuItemToast;
public class HomeActivity extends BaseAppCompatActivity implements OnClickListener, OnPageChangeListener, public class HomeActivity extends BaseAppCompatActivity implements OnClickListener, OnPageChangeListener,
SupportFragmentCallback, OnLongClickListener { SupportFragmentCallback, OnLongClickListener {
private static final String EXTRA_SESSION_EVENT = "session_event";
private final Handler mHandler = new Handler(); private final Handler mHandler = new Handler();
private final ContentObserver mAccountChangeObserver = new AccountChangeObserver(this, mHandler); private final ContentObserver mAccountChangeObserver = new AccountChangeObserver(this, mHandler);
@ -136,12 +137,10 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
private SharedPreferences mPreferences; private SharedPreferences mPreferences;
private AsyncTwitterWrapper mTwitterWrapper;
private NotificationManager mNotificationManager; private NotificationManager mNotificationManager;
private MultiSelectEventHandler mMultiSelectHandler; private MultiSelectEventHandler mMultiSelectHandler;
private ReadStateManager mReadStateManager;
private SupportTabsAdapter mPagerAdapter; private SupportTabsAdapter mPagerAdapter;
@ -355,9 +354,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
return; return;
} }
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
mTwitterWrapper = getTwitterWrapper();
final TwidereApplication app = TwidereApplication.getInstance(this); final TwidereApplication app = TwidereApplication.getInstance(this);
mReadStateManager = app.getReadStateManager();
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mMultiSelectHandler = new MultiSelectEventHandler(this); mMultiSelectHandler = new MultiSelectEventHandler(this);
mMultiSelectHandler.dispatchOnCreate(); mMultiSelectHandler.dispatchOnCreate();
@ -431,6 +428,10 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
if (Utils.isStreamingEnabled()) { if (Utils.isStreamingEnabled()) {
startService(new Intent(this, StreamingService.class)); startService(new Intent(this, StreamingService.class));
} }
if (savedInstanceState != null) {
mSessionEvent = savedInstanceState.getParcelable(EXTRA_SESSION_EVENT);
}
} }
@Override @Override
@ -444,8 +445,9 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
assert bus != null; assert bus != null;
bus.register(this); bus.register(this);
// BEGIN HotMobi // BEGIN HotMobi
final SessionEvent event = SessionEvent.create(this); if (mSessionEvent == null) {
mSessionEvent = event; mSessionEvent = SessionEvent.create(this);
}
// END HotMobi // END HotMobi
mReadStateManager.registerOnSharedPreferenceChangeListener(mReadStateChangeListener); mReadStateManager.registerOnSharedPreferenceChangeListener(mReadStateChangeListener);
updateUnreadCount(); updateUnreadCount();
@ -481,8 +483,11 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
// BEGIN HotMobi // BEGIN HotMobi
final SessionEvent event = mSessionEvent; final SessionEvent event = mSessionEvent;
event.markEnd(); ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
HotMobiLogger.getInstance(this).log(event); if (event != null && isFinishing()) {
event.markEnd();
HotMobiLogger.getInstance(this).log(event);
}
// END HotMobi // END HotMobi
super.onStop(); super.onStop();
} }
@ -494,6 +499,12 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
public void notifyAccountsChanged() { public void notifyAccountsChanged() {
} }
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(EXTRA_SESSION_EVENT, mSessionEvent);
}
@Subscribe @Subscribe
public void notifyTaskStateChanged(TaskStateChangedEvent event) { public void notifyTaskStateChanged(TaskStateChangedEvent event) {
updateActionsButton(); updateActionsButton();

View File

@ -35,19 +35,25 @@ import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.iface.IThemedActivity; import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
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;
import org.mariotaku.twidere.util.StrictModeUtils; import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory; import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.dagger.component.DaggerThemedFragmentActivityComponent;
import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle; import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle;
import javax.inject.Inject;
public abstract class ThemedFragmentActivity extends FragmentActivity implements Constants, public abstract class ThemedFragmentActivity extends FragmentActivity implements Constants,
IThemedActivity, KeyboardShortcutCallback { IThemedActivity, KeyboardShortcutCallback {
// Utility classes // Utility classes
private KeyboardShortcutsHandler mKeyboardShortcutsHandler; private KeyboardShortcutsHandler mKeyboardShortcutsHandler;
@Inject
protected AsyncTwitterWrapper mTwitterWrapper;
// Data fields // Data fields
private int mCurrentThemeResource, mCurrentThemeColor, mCurrentThemeBackgroundAlpha; private int mCurrentThemeResource, mCurrentThemeColor, mCurrentThemeBackgroundAlpha;
@ -129,6 +135,7 @@ public abstract class ThemedFragmentActivity extends FragmentActivity implements
StrictModeUtils.detectAllThreadPolicy(); StrictModeUtils.detectAllThreadPolicy();
} }
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
DaggerThemedFragmentActivityComponent.builder().applicationModule(TwidereApplication.getModule(this)).build().inject(this);
mKeyboardShortcutsHandler = TwidereApplication.getInstance(this).getKeyboardShortcutsHandler(); mKeyboardShortcutsHandler = TwidereApplication.getInstance(this).getKeyboardShortcutsHandler();
} }

View File

@ -56,6 +56,8 @@ import org.mariotaku.twidere.view.holder.StatusViewHolder;
import org.mariotaku.twidere.view.holder.StatusViewHolder.DummyStatusHolderAdapter; import org.mariotaku.twidere.view.holder.StatusViewHolder.DummyStatusHolderAdapter;
import org.mariotaku.twidere.view.holder.StatusViewHolder.StatusClickListener; import org.mariotaku.twidere.view.holder.StatusViewHolder.StatusClickListener;
import javax.inject.Inject;
/** /**
* Created by mariotaku on 15/1/3. * Created by mariotaku on 15/1/3.
*/ */
@ -72,7 +74,6 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
private final LayoutInflater mInflater; private final LayoutInflater mInflater;
private final MediaLoaderWrapper mImageLoader; private final MediaLoaderWrapper mImageLoader;
private final MediaLoadingHandler mLoadingHandler; private final MediaLoadingHandler mLoadingHandler;
private final AsyncTwitterWrapper mTwitterWrapper;
private final int mCardBackgroundColor; private final int mCardBackgroundColor;
private final int mTextSize; private final int mTextSize;
private final int mProfileImageStyle, mMediaPreviewStyle, mLinkHighlightingStyle; private final int mProfileImageStyle, mMediaPreviewStyle, mLinkHighlightingStyle;
@ -86,13 +87,13 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
private ActivityAdapterListener mActivityAdapterListener; private ActivityAdapterListener mActivityAdapterListener;
protected AbsActivitiesAdapter(final Context context, boolean compact) { protected AbsActivitiesAdapter(final Context context, boolean compact) {
super(context);
mContext = context; mContext = context;
final TwidereApplication app = TwidereApplication.getInstance(context); final TwidereApplication app = TwidereApplication.getInstance(context);
mCardBackgroundColor = ThemeUtils.getCardBackgroundColor(context, ThemeUtils.getThemeBackgroundOption(context), ThemeUtils.getUserThemeBackgroundAlpha(context)); mCardBackgroundColor = ThemeUtils.getCardBackgroundColor(context, ThemeUtils.getThemeBackgroundOption(context), ThemeUtils.getUserThemeBackgroundAlpha(context));
mInflater = LayoutInflater.from(context); mInflater = LayoutInflater.from(context);
mImageLoader = app.getMediaLoaderWrapper(); mImageLoader = app.getMediaLoaderWrapper();
mLoadingHandler = new MediaLoadingHandler(R.id.media_preview_progress); mLoadingHandler = new MediaLoadingHandler(R.id.media_preview_progress);
mTwitterWrapper = app.getTwitterWrapper();
mUserColorNameManager = app.getUserColorNameManager(); mUserColorNameManager = app.getUserColorNameManager();
final SharedPreferencesWrapper preferences = SharedPreferencesWrapper.getInstance(context, final SharedPreferencesWrapper preferences = SharedPreferencesWrapper.getInstance(context,
SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);

View File

@ -30,6 +30,8 @@ import org.mariotaku.twidere.view.holder.GapViewHolder;
import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder; import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder;
import org.mariotaku.twidere.view.holder.StatusViewHolder; import org.mariotaku.twidere.view.holder.StatusViewHolder;
import javax.inject.Inject;
/** /**
* Created by mariotaku on 14/11/19. * Created by mariotaku on 14/11/19.
*/ */
@ -42,7 +44,6 @@ public abstract class AbsStatusesAdapter<D> extends LoadMoreSupportAdapter<ViewH
private final LayoutInflater mInflater; private final LayoutInflater mInflater;
private final MediaLoaderWrapper mMediaLoader; private final MediaLoaderWrapper mMediaLoader;
private final MediaLoadingHandler mLoadingHandler; private final MediaLoadingHandler mLoadingHandler;
private final AsyncTwitterWrapper mTwitterWrapper;
private final TwidereLinkify mLinkify; private final TwidereLinkify mLinkify;
private final UserColorNameManager mUserColorNameManager; private final UserColorNameManager mUserColorNameManager;
@ -68,6 +69,7 @@ public abstract class AbsStatusesAdapter<D> extends LoadMoreSupportAdapter<ViewH
private boolean mShowAccountsColor; private boolean mShowAccountsColor;
public AbsStatusesAdapter(Context context, boolean compact) { public AbsStatusesAdapter(Context context, boolean compact) {
super(context);
mContext = context; mContext = context;
final TwidereApplication app = TwidereApplication.getInstance(context); final TwidereApplication app = TwidereApplication.getInstance(context);
mCardBackgroundColor = ThemeUtils.getCardBackgroundColor(context, ThemeUtils.getThemeBackgroundOption(context), ThemeUtils.getUserThemeBackgroundAlpha(context)); mCardBackgroundColor = ThemeUtils.getCardBackgroundColor(context, ThemeUtils.getThemeBackgroundOption(context), ThemeUtils.getUserThemeBackgroundAlpha(context));
@ -75,7 +77,6 @@ public abstract class AbsStatusesAdapter<D> extends LoadMoreSupportAdapter<ViewH
mMediaLoader = app.getMediaLoaderWrapper(); mMediaLoader = app.getMediaLoaderWrapper();
mUserColorNameManager = app.getUserColorNameManager(); mUserColorNameManager = app.getUserColorNameManager();
mLoadingHandler = new MediaLoadingHandler(R.id.media_preview_progress); mLoadingHandler = new MediaLoadingHandler(R.id.media_preview_progress);
mTwitterWrapper = app.getTwitterWrapper();
final SharedPreferencesWrapper preferences = SharedPreferencesWrapper.getInstance(context, final SharedPreferencesWrapper preferences = SharedPreferencesWrapper.getInstance(context,
SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
mTextSize = preferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size)); mTextSize = preferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size));

View File

@ -40,6 +40,8 @@ import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder; import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder;
import org.mariotaku.twidere.view.holder.UserListViewHolder; import org.mariotaku.twidere.view.holder.UserListViewHolder;
import javax.inject.Inject;
public abstract class AbsUserListsAdapter<D> extends LoadMoreSupportAdapter<ViewHolder> implements Constants, public abstract class AbsUserListsAdapter<D> extends LoadMoreSupportAdapter<ViewHolder> implements Constants,
IUserListsAdapter<D> { IUserListsAdapter<D> {
@ -53,20 +55,19 @@ public abstract class AbsUserListsAdapter<D> extends LoadMoreSupportAdapter<View
private final boolean mCompactCards; private final boolean mCompactCards;
private final int mProfileImageStyle; private final int mProfileImageStyle;
private final int mTextSize; private final int mTextSize;
private final AsyncTwitterWrapper mTwitterWrapper;
private final boolean mDisplayProfileImage; private final boolean mDisplayProfileImage;
private final UserColorNameManager mUserColorNameManager; private final UserColorNameManager mUserColorNameManager;
private final boolean mNameFirst; private final boolean mNameFirst;
public AbsUserListsAdapter(final Context context, final boolean compact) { public AbsUserListsAdapter(final Context context, final boolean compact) {
super(context);
final TwidereApplication app = TwidereApplication.getInstance(context); final TwidereApplication app = TwidereApplication.getInstance(context);
mContext = context; mContext = context;
mCardBackgroundColor = ThemeUtils.getCardBackgroundColor(context, ThemeUtils.getThemeBackgroundOption(context), ThemeUtils.getUserThemeBackgroundAlpha(context)); mCardBackgroundColor = ThemeUtils.getCardBackgroundColor(context, ThemeUtils.getThemeBackgroundOption(context), ThemeUtils.getUserThemeBackgroundAlpha(context));
mInflater = LayoutInflater.from(context); mInflater = LayoutInflater.from(context);
mMediaLoader = app.getMediaLoaderWrapper(); mMediaLoader = app.getMediaLoaderWrapper();
mUserColorNameManager = app.getUserColorNameManager(); mUserColorNameManager = app.getUserColorNameManager();
mTwitterWrapper = app.getTwitterWrapper();
final SharedPreferencesWrapper preferences = SharedPreferencesWrapper.getInstance(context, final SharedPreferencesWrapper preferences = SharedPreferencesWrapper.getInstance(context,
SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
mTextSize = preferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size)); mTextSize = preferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size));

View File

@ -40,6 +40,8 @@ import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder; import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder;
import org.mariotaku.twidere.view.holder.UserViewHolder; import org.mariotaku.twidere.view.holder.UserViewHolder;
import javax.inject.Inject;
public abstract class AbsUsersAdapter<D> extends LoadMoreSupportAdapter<ViewHolder> implements Constants, public abstract class AbsUsersAdapter<D> extends LoadMoreSupportAdapter<ViewHolder> implements Constants,
IUsersAdapter<D> { IUsersAdapter<D> {
@ -53,19 +55,18 @@ public abstract class AbsUsersAdapter<D> extends LoadMoreSupportAdapter<ViewHold
private final boolean mCompactCards; private final boolean mCompactCards;
private final int mProfileImageStyle; private final int mProfileImageStyle;
private final int mTextSize; private final int mTextSize;
private final AsyncTwitterWrapper mTwitterWrapper;
private final boolean mDisplayProfileImage; private final boolean mDisplayProfileImage;
private final UserColorNameManager mUserColorNameManager; private final UserColorNameManager mUserColorNameManager;
public AbsUsersAdapter(final Context context, final boolean compact) { public AbsUsersAdapter(final Context context, final boolean compact) {
super(context);
final TwidereApplication app = TwidereApplication.getInstance(context); final TwidereApplication app = TwidereApplication.getInstance(context);
mContext = context; mContext = context;
mCardBackgroundColor = ThemeUtils.getCardBackgroundColor(context, ThemeUtils.getThemeBackgroundOption(context), ThemeUtils.getUserThemeBackgroundAlpha(context)); mCardBackgroundColor = ThemeUtils.getCardBackgroundColor(context, ThemeUtils.getThemeBackgroundOption(context), ThemeUtils.getUserThemeBackgroundAlpha(context));
mInflater = LayoutInflater.from(context); mInflater = LayoutInflater.from(context);
mMediaLoader = app.getMediaLoaderWrapper(); mMediaLoader = app.getMediaLoaderWrapper();
mUserColorNameManager = app.getUserColorNameManager(); mUserColorNameManager = app.getUserColorNameManager();
mTwitterWrapper = app.getTwitterWrapper();
final SharedPreferencesWrapper preferences = SharedPreferencesWrapper.getInstance(context, final SharedPreferencesWrapper preferences = SharedPreferencesWrapper.getInstance(context,
SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
mTextSize = preferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size)); mTextSize = preferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size));

View File

@ -0,0 +1,48 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 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.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ReadStateManager;
import org.mariotaku.twidere.util.dagger.component.DaggerBaseAdapterComponent;
import javax.inject.Inject;
/**
* Created by mariotaku on 15/10/5.
*/
public abstract class BaseAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
@Inject
protected AsyncTwitterWrapper mTwitterWrapper;
@Inject
protected ReadStateManager mReadStateManager;
public BaseAdapter(Context context) {
//noinspection unchecked
DaggerBaseAdapterComponent.builder()
.applicationModule(TwidereApplication.getModule(context))
.build()
.inject((BaseAdapter<RecyclerView.ViewHolder>) this);
}
}

View File

@ -19,6 +19,7 @@
package org.mariotaku.twidere.adapter; package org.mariotaku.twidere.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView.Adapter; import android.support.v7.widget.RecyclerView.Adapter;
import android.support.v7.widget.RecyclerView.ViewHolder; import android.support.v7.widget.RecyclerView.ViewHolder;
@ -27,12 +28,16 @@ import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter;
/** /**
* Created by mariotaku on 15/4/16. * Created by mariotaku on 15/4/16.
*/ */
public abstract class LoadMoreSupportAdapter<VH extends ViewHolder> extends Adapter<VH> public abstract class LoadMoreSupportAdapter<VH extends ViewHolder> extends BaseAdapter<VH>
implements ILoadMoreSupportAdapter { implements ILoadMoreSupportAdapter {
private boolean mLoadMoreSupported; private boolean mLoadMoreSupported;
private boolean mLoadMoreIndicatorVisible; private boolean mLoadMoreIndicatorVisible;
public LoadMoreSupportAdapter(Context context) {
super(context);
}
@Override @Override
public final boolean isLoadMoreIndicatorVisible() { public final boolean isLoadMoreIndicatorVisible() {
return mLoadMoreIndicatorVisible; return mLoadMoreIndicatorVisible;

View File

@ -24,7 +24,6 @@ import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.database.Cursor; import android.database.Cursor;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView.Adapter;
import android.support.v7.widget.RecyclerView.ViewHolder; import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -48,6 +47,8 @@ import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder; import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder;
import org.mariotaku.twidere.view.holder.MessageEntryViewHolder; import org.mariotaku.twidere.view.holder.MessageEntryViewHolder;
import javax.inject.Inject;
public class MessageEntriesAdapter extends LoadMoreSupportAdapter<ViewHolder> implements Constants, public class MessageEntriesAdapter extends LoadMoreSupportAdapter<ViewHolder> implements Constants,
IContentCardAdapter, OnClickListener, OnReadStateChangeListener { IContentCardAdapter, OnClickListener, OnReadStateChangeListener {
@ -61,10 +62,8 @@ public class MessageEntriesAdapter extends LoadMoreSupportAdapter<ViewHolder> im
private final int mTextSize; private final int mTextSize;
private final int mProfileImageStyle; private final int mProfileImageStyle;
private final int mMediaPreviewStyle; private final int mMediaPreviewStyle;
private final ReadStateManager mReadStateManager;
private final OnSharedPreferenceChangeListener mReadStateChangeListener; private final OnSharedPreferenceChangeListener mReadStateChangeListener;
private UserColorNameManager mUserColorNameManager; private UserColorNameManager mUserColorNameManager;
private final AsyncTwitterWrapper mTwitterWrapper;
private final boolean mDisplayProfileImage; private final boolean mDisplayProfileImage;
private boolean mShowAccountsColor; private boolean mShowAccountsColor;
@ -73,19 +72,18 @@ public class MessageEntriesAdapter extends LoadMoreSupportAdapter<ViewHolder> im
private StringLongPair[] mPositionPairs; private StringLongPair[] mPositionPairs;
public MessageEntriesAdapter(final Context context) { public MessageEntriesAdapter(final Context context) {
super(context);
mContext = context; mContext = context;
mInflater = LayoutInflater.from(context); mInflater = LayoutInflater.from(context);
final TwidereApplication app = TwidereApplication.getInstance(context); final TwidereApplication app = TwidereApplication.getInstance(context);
mMultiSelectManager = app.getMultiSelectManager(); mMultiSelectManager = app.getMultiSelectManager();
mImageLoader = app.getMediaLoaderWrapper(); mImageLoader = app.getMediaLoaderWrapper();
mTwitterWrapper = app.getTwitterWrapper();
final SharedPreferencesWrapper preferences = SharedPreferencesWrapper.getInstance(context, final SharedPreferencesWrapper preferences = SharedPreferencesWrapper.getInstance(context,
SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
mProfileImageStyle = Utils.getProfileImageStyle(preferences.getString(KEY_PROFILE_IMAGE_STYLE, null)); mProfileImageStyle = Utils.getProfileImageStyle(preferences.getString(KEY_PROFILE_IMAGE_STYLE, null));
mMediaPreviewStyle = Utils.getMediaPreviewStyle(preferences.getString(KEY_MEDIA_PREVIEW_STYLE, null)); mMediaPreviewStyle = Utils.getMediaPreviewStyle(preferences.getString(KEY_MEDIA_PREVIEW_STYLE, null));
mDisplayProfileImage = preferences.getBoolean(KEY_DISPLAY_PROFILE_IMAGE, true); mDisplayProfileImage = preferences.getBoolean(KEY_DISPLAY_PROFILE_IMAGE, true);
mTextSize = preferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size)); mTextSize = preferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size));
mReadStateManager = app.getReadStateManager();
mUserColorNameManager = app.getUserColorNameManager(); mUserColorNameManager = app.getUserColorNameManager();
mReadStateChangeListener = new OnSharedPreferenceChangeListener() { mReadStateChangeListener = new OnSharedPreferenceChangeListener() {

View File

@ -53,19 +53,18 @@ import org.mariotaku.twidere.activity.MainHondaJOJOActivity;
import org.mariotaku.twidere.service.RefreshService; import org.mariotaku.twidere.service.RefreshService;
import org.mariotaku.twidere.util.AbsLogger; import org.mariotaku.twidere.util.AbsLogger;
import org.mariotaku.twidere.util.AsyncTaskManager; import org.mariotaku.twidere.util.AsyncTaskManager;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
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.MathUtils; import org.mariotaku.twidere.util.MathUtils;
import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.util.MultiSelectManager; import org.mariotaku.twidere.util.MultiSelectManager;
import org.mariotaku.twidere.util.ReadStateManager;
import org.mariotaku.twidere.util.StrictModeUtils; import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.TwidereLogger; import org.mariotaku.twidere.util.TwidereLogger;
import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.VideoLoader; import org.mariotaku.twidere.util.VideoLoader;
import org.mariotaku.twidere.util.content.TwidereSQLiteOpenHelper; import org.mariotaku.twidere.util.content.TwidereSQLiteOpenHelper;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
import org.mariotaku.twidere.util.imageloader.ReadOnlyDiskLRUNameCache; import org.mariotaku.twidere.util.imageloader.ReadOnlyDiskLRUNameCache;
import org.mariotaku.twidere.util.imageloader.TwidereImageDownloader; import org.mariotaku.twidere.util.imageloader.TwidereImageDownloader;
import org.mariotaku.twidere.util.imageloader.URLFileNameGenerator; import org.mariotaku.twidere.util.imageloader.URLFileNameGenerator;
@ -95,7 +94,6 @@ public class TwidereApplication extends MultiDexApplication implements Constants
private ImageLoader mImageLoader; private ImageLoader mImageLoader;
private AsyncTaskManager mAsyncTaskManager; private AsyncTaskManager mAsyncTaskManager;
private SharedPreferences mPreferences; private SharedPreferences mPreferences;
private AsyncTwitterWrapper mTwitterWrapper;
private MultiSelectManager mMultiSelectManager; private MultiSelectManager mMultiSelectManager;
private TwidereImageDownloader mImageDownloader, mFullImageDownloader; private TwidereImageDownloader mImageDownloader, mFullImageDownloader;
private DiskCache mDiskCache, mFullDiskCache; private DiskCache mDiskCache, mFullDiskCache;
@ -104,11 +102,11 @@ public class TwidereApplication extends MultiDexApplication implements Constants
private SQLiteDatabase mDatabase; private SQLiteDatabase mDatabase;
private Bus mMessageBus; private Bus mMessageBus;
private VideoLoader mVideoLoader; private VideoLoader mVideoLoader;
private ReadStateManager mReadStateManager;
private KeyboardShortcutsHandler mKeyboardShortcutsHandler; private KeyboardShortcutsHandler mKeyboardShortcutsHandler;
private UserColorNameManager mUserColorNameManager; private UserColorNameManager mUserColorNameManager;
private HotMobiLogger mHotMobiLogger; private HotMobiLogger mHotMobiLogger;
private ApplicationModule mApplicationModule;
@NonNull @NonNull
public static TwidereApplication getInstance(@NonNull final Context context) { public static TwidereApplication getInstance(@NonNull final Context context) {
@ -149,11 +147,6 @@ public class TwidereApplication extends MultiDexApplication implements Constants
return mNetwork = new TwidereHostAddressResolver(this); return mNetwork = new TwidereHostAddressResolver(this);
} }
public ReadStateManager getReadStateManager() {
if (mReadStateManager != null) return mReadStateManager;
return mReadStateManager = new ReadStateManager(this);
}
public KeyboardShortcutsHandler getKeyboardShortcutsHandler() { public KeyboardShortcutsHandler getKeyboardShortcutsHandler() {
if (mKeyboardShortcutsHandler != null) return mKeyboardShortcutsHandler; if (mKeyboardShortcutsHandler != null) return mKeyboardShortcutsHandler;
mKeyboardShortcutsHandler = new KeyboardShortcutsHandler(this); mKeyboardShortcutsHandler = new KeyboardShortcutsHandler(this);
@ -217,11 +210,6 @@ public class TwidereApplication extends MultiDexApplication implements Constants
return mSQLiteOpenHelper = new TwidereSQLiteOpenHelper(this, DATABASES_NAME, DATABASES_VERSION); return mSQLiteOpenHelper = new TwidereSQLiteOpenHelper(this, DATABASES_NAME, DATABASES_VERSION);
} }
public AsyncTwitterWrapper getTwitterWrapper() {
if (mTwitterWrapper != null) return mTwitterWrapper;
return mTwitterWrapper = new AsyncTwitterWrapper(this);
}
@Override @Override
public void onCreate() { public void onCreate() {
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
@ -267,7 +255,9 @@ public class TwidereApplication extends MultiDexApplication implements Constants
private void initBugReport() { private void initBugReport() {
final SharedPreferences preferences = getSharedPreferences(); final SharedPreferences preferences = getSharedPreferences();
if (!preferences.getBoolean(KEY_BUG_REPORTS, true)) return; if (!preferences.getBoolean(KEY_BUG_REPORTS, true)) return;
AbsLogger.setImplementation(new TwidereLogger()); if (!BuildConfig.DEBUG) {
AbsLogger.setImplementation(new TwidereLogger());
}
AbsLogger.init(this); AbsLogger.init(this);
} }
@ -355,4 +345,13 @@ public class TwidereApplication extends MultiDexApplication implements Constants
if (mHotMobiLogger != null) return mHotMobiLogger; if (mHotMobiLogger != null) return mHotMobiLogger;
return mHotMobiLogger = new HotMobiLogger(this); return mHotMobiLogger = new HotMobiLogger(this);
} }
public static ApplicationModule getModule(Context context) {
return getInstance(context).getApplicationModule();
}
private ApplicationModule getApplicationModule() {
if (mApplicationModule != null) return mApplicationModule;
return mApplicationModule = new ApplicationModule(this);
}
} }

View File

@ -23,6 +23,7 @@ import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.SharedPreferences; import android.content.SharedPreferences;
@ -31,9 +32,21 @@ import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.MultiSelectManager; import org.mariotaku.twidere.util.MultiSelectManager;
import org.mariotaku.twidere.util.dagger.component.DaggerGeneralComponent;
import javax.inject.Inject;
public class BaseFragment extends Fragment implements Constants { public class BaseFragment extends Fragment implements Constants {
@Inject
protected AsyncTwitterWrapper mTwitterWrapper;
@Override
public void onAttach(Context context) {
super.onAttach(context);
DaggerGeneralComponent.builder().applicationModule(TwidereApplication.getModule(context)).build().inject(this);
}
public TwidereApplication getApplication() { public TwidereApplication getApplication() {
final Activity activity = getActivity(); final Activity activity = getActivity();
if (activity != null) return (TwidereApplication) activity.getApplication(); if (activity != null) return (TwidereApplication) activity.getApplication();
@ -63,11 +76,6 @@ public class BaseFragment extends Fragment implements Constants {
return null; return null;
} }
public AsyncTwitterWrapper getTwitterWrapper() {
final TwidereApplication app = getApplication();
return app != null ? app.getTwitterWrapper() : null;
}
public void registerReceiver(final BroadcastReceiver receiver, final IntentFilter filter) { public void registerReceiver(final BroadcastReceiver receiver, final IntentFilter filter) {
final Activity activity = getActivity(); final Activity activity = getActivity();
if (activity == null) return; if (activity == null) return;

View File

@ -23,6 +23,7 @@ import android.app.Activity;
import android.app.ListFragment; import android.app.ListFragment;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
@ -36,6 +37,9 @@ import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;
import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.MultiSelectManager; import org.mariotaku.twidere.util.MultiSelectManager;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.dagger.component.DaggerBaseListFragmentComponent;
import javax.inject.Inject;
public class BaseListFragment extends ListFragment implements Constants, OnScrollListener, RefreshScrollTopInterface { public class BaseListFragment extends ListFragment implements Constants, OnScrollListener, RefreshScrollTopInterface {
@ -44,6 +48,7 @@ public class BaseListFragment extends ListFragment implements Constants, OnScrol
private boolean mReachedBottom, mNotReachedBottomBefore = true; private boolean mReachedBottom, mNotReachedBottomBefore = true;
public final TwidereApplication getApplication() { public final TwidereApplication getApplication() {
return TwidereApplication.getInstance(getActivity()); return TwidereApplication.getInstance(getActivity());
} }
@ -75,10 +80,6 @@ public class BaseListFragment extends ListFragment implements Constants, OnScrol
return args != null ? args.getInt(EXTRA_TAB_POSITION, -1) : -1; return args != null ? args.getInt(EXTRA_TAB_POSITION, -1) : -1;
} }
public AsyncTwitterWrapper getTwitterWrapper() {
return getApplication().getTwitterWrapper();
}
public void invalidateOptionsMenu() { public void invalidateOptionsMenu() {
final Activity activity = getActivity(); final Activity activity = getActivity();
if (activity == null) return; if (activity == null) return;
@ -105,9 +106,13 @@ public class BaseListFragment extends ListFragment implements Constants, OnScrol
lv.setOnScrollListener(this); lv.setOnScrollListener(this);
} }
@Inject
protected AsyncTwitterWrapper mTwitterWrapper;
@Override @Override
public void onAttach(final Activity activity) { public void onAttach(Context context) {
super.onAttach(activity); super.onAttach(context);
DaggerBaseListFragmentComponent.builder().applicationModule(TwidereApplication.getModule(context)).build().inject(this);
} }
@Override @Override

View File

@ -147,7 +147,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentRecyclerView
public boolean scrollToStart() { public boolean scrollToStart() {
final boolean result = super.scrollToStart(); final boolean result = super.scrollToStart();
if (result) { if (result) {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
final int tabPosition = getTabPosition(); final int tabPosition = getTabPosition();
if (twitter != null && tabPosition != -1) { if (twitter != null && tabPosition != -1) {
twitter.clearUnreadCountAsync(tabPosition); twitter.clearUnreadCountAsync(tabPosition);

View File

@ -107,7 +107,6 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentRecyclerViewFr
}; };
private SharedPreferences mPreferences; private SharedPreferences mPreferences;
private PopupMenu mPopupMenu; private PopupMenu mPopupMenu;
private ReadStateManager mReadStateManager;
private final OnScrollListener mOnScrollListener = new OnScrollListener() { private final OnScrollListener mOnScrollListener = new OnScrollListener() {
@Override @Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) { public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
@ -130,7 +129,7 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentRecyclerViewFr
return true; return true;
} }
return Utils.handleMenuItemClick(getActivity(), AbsStatusesFragment.this, return Utils.handleMenuItemClick(getActivity(), AbsStatusesFragment.this,
getFragmentManager(), getTwitterWrapper(), status, item); getFragmentManager(), mTwitterWrapper, status, item);
} }
}; };
private OnScrollListener mPauseOnScrollListener; private OnScrollListener mPauseOnScrollListener;
@ -187,7 +186,7 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentRecyclerViewFr
return true; return true;
} }
case ACTION_STATUS_FAVORITE: { case ACTION_STATUS_FAVORITE: {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (status.is_favorite) { if (status.is_favorite) {
twitter.destroyFavoriteAsync(status.account_id, status.id); twitter.destroyFavoriteAsync(status.account_id, status.id);
} else { } else {
@ -348,7 +347,7 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentRecyclerViewFr
break; break;
} }
case R.id.favorite_count: { case R.id.favorite_count: {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter == null) return; if (twitter == null) return;
if (status.is_favorite) { if (status.is_favorite) {
twitter.destroyFavoriteAsync(status.account_id, status.id); twitter.destroyFavoriteAsync(status.account_id, status.id);
@ -466,7 +465,6 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentRecyclerViewFr
@Override @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) { public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
mReadStateManager = getReadStateManager();
final AbsStatusesAdapter<Data> adapter = getAdapter(); final AbsStatusesAdapter<Data> adapter = getAdapter();
final RecyclerView recyclerView = getRecyclerView(); final RecyclerView recyclerView = getRecyclerView();
final LinearLayoutManager layoutManager = getLayoutManager(); final LinearLayoutManager layoutManager = getLayoutManager();

View File

@ -52,7 +52,7 @@ public class AddUserListMemberDialogFragment extends BaseSupportDialogFragment i
switch (which) { switch (which) {
case DialogInterface.BUTTON_POSITIVE: { case DialogInterface.BUTTON_POSITIVE: {
final String mText = ParseUtils.parseString(mEditText.getText()); final String mText = ParseUtils.parseString(mEditText.getText());
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (mText == null || mText.length() <= 0 || twitter == null) return; if (mText == null || mText.length() <= 0 || twitter == null) return;
twitter.addUserListMembersAsync(args.getLong(EXTRA_ACCOUNT_ID), args.getLong(EXTRA_LIST_ID)); twitter.addUserListMembersAsync(args.getLong(EXTRA_ACCOUNT_ID), args.getLong(EXTRA_LIST_ID));
break; break;

View File

@ -22,6 +22,7 @@ package org.mariotaku.twidere.fragment.support;
import android.app.Activity; import android.app.Activity;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.support.v4.app.DialogFragment; import android.support.v4.app.DialogFragment;
@ -29,6 +30,9 @@ import android.support.v4.app.DialogFragment;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.dagger.component.DaggerBaseSupportDialogFragmentComponent;
import javax.inject.Inject;
public class BaseSupportDialogFragment extends DialogFragment implements Constants { public class BaseSupportDialogFragment extends DialogFragment implements Constants {
@ -60,9 +64,13 @@ public class BaseSupportDialogFragment extends DialogFragment implements Constan
return null; return null;
} }
public AsyncTwitterWrapper getTwitterWrapper() { @Inject
final TwidereApplication app = getApplication(); protected AsyncTwitterWrapper mTwitterWrapper;
return app != null ? app.getTwitterWrapper() : null;
@Override
public void onAttach(Context context) {
super.onAttach(context);
DaggerBaseSupportDialogFragmentComponent.builder().applicationModule(TwidereApplication.getModule(context)).build().inject(this);
} }
public void registerReceiver(final BroadcastReceiver receiver, final IntentFilter filter) { public void registerReceiver(final BroadcastReceiver receiver, final IntentFilter filter) {

View File

@ -45,9 +45,21 @@ import org.mariotaku.twidere.util.AsyncTwitterWrapper;
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.ThemedLayoutInflaterFactory; import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory;
import org.mariotaku.twidere.util.dagger.component.DaggerGeneralComponent;
import javax.inject.Inject;
public class BaseSupportFragment extends Fragment implements IBaseFragment, Constants { public class BaseSupportFragment extends Fragment implements IBaseFragment, Constants {
@Inject
protected AsyncTwitterWrapper mTwitterWrapper;
@Inject
protected ReadStateManager mReadStateManager;
public BaseSupportFragment() {
}
@Override @Override
public final void onViewCreated(View view, @Nullable Bundle savedInstanceState) { public final void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
@ -55,10 +67,13 @@ public class BaseSupportFragment extends Fragment implements IBaseFragment, Cons
requestFitSystemWindows(); requestFitSystemWindows();
} }
public BaseSupportFragment() { @Override
public void onAttach(Context context) {
super.onAttach(context);
DaggerGeneralComponent.builder().applicationModule(TwidereApplication.getModule(context)).build().inject(this);
} }
public TwidereApplication getApplication() { public TwidereApplication getApplication() {
final Activity activity = getActivity(); final Activity activity = getActivity();
if (activity != null) return (TwidereApplication) activity.getApplication(); if (activity != null) return (TwidereApplication) activity.getApplication();
@ -87,13 +102,6 @@ public class BaseSupportFragment extends Fragment implements IBaseFragment, Cons
return null; return null;
} }
public AsyncTwitterWrapper getTwitterWrapper() {
return getApplication() != null ? getApplication().getTwitterWrapper() : null;
}
public ReadStateManager getReadStateManager() {
return getApplication() != null ? getApplication().getReadStateManager() : null;
}
public void invalidateOptionsMenu() { public void invalidateOptionsMenu() {
final FragmentActivity activity = getActivity(); final FragmentActivity activity = getActivity();

View File

@ -19,7 +19,6 @@
package org.mariotaku.twidere.fragment.support; package org.mariotaku.twidere.fragment.support;
import android.support.v7.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
@ -27,6 +26,7 @@ import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.constant.SharedPreferenceConstants; import org.mariotaku.twidere.constant.SharedPreferenceConstants;
@ -45,7 +45,7 @@ public class CreateUserBlockDialogFragment extends BaseSupportDialogFragment imp
switch (which) { switch (which) {
case DialogInterface.BUTTON_POSITIVE: case DialogInterface.BUTTON_POSITIVE:
final ParcelableUser user = getUser(); final ParcelableUser user = getUser();
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (user == null || twitter == null) return; if (user == null || twitter == null) return;
twitter.createBlockAsync(user.account_id, user.id); twitter.createBlockAsync(user.account_id, user.id);
break; break;

View File

@ -19,12 +19,12 @@
package org.mariotaku.twidere.fragment.support; package org.mariotaku.twidere.fragment.support;
import android.support.v7.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.CheckBox; import android.widget.CheckBox;
@ -33,7 +33,6 @@ import com.rengwuxian.materialedittext.MaterialEditText;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.text.validator.UserListNameValidator; import org.mariotaku.twidere.text.validator.UserListNameValidator;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
@ -45,7 +44,6 @@ public class CreateUserListDialogFragment extends BaseSupportDialogFragment impl
private long mAccountId; private long mAccountId;
private long mListId; private long mListId;
private boolean mIsPublic = true; private boolean mIsPublic = true;
private AsyncTwitterWrapper mTwitterWrapper;
@Override @Override
public void onClick(final DialogInterface dialog, final int which) { public void onClick(final DialogInterface dialog, final int which) {
@ -66,7 +64,6 @@ public class CreateUserListDialogFragment extends BaseSupportDialogFragment impl
@NonNull @NonNull
@Override @Override
public Dialog onCreateDialog(final Bundle savedInstanceState) { public Dialog onCreateDialog(final Bundle savedInstanceState) {
mTwitterWrapper = getApplication().getTwitterWrapper();
final Bundle bundle = savedInstanceState == null ? getArguments() : savedInstanceState; final Bundle bundle = savedInstanceState == null ? getArguments() : savedInstanceState;
mAccountId = bundle != null ? bundle.getLong(EXTRA_ACCOUNT_ID, -1) : -1; mAccountId = bundle != null ? bundle.getLong(EXTRA_ACCOUNT_ID, -1) : -1;
final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity()); final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity());

View File

@ -19,7 +19,6 @@
package org.mariotaku.twidere.fragment.support; package org.mariotaku.twidere.fragment.support;
import android.support.v7.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
@ -27,6 +26,7 @@ import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.constant.SharedPreferenceConstants; import org.mariotaku.twidere.constant.SharedPreferenceConstants;
@ -45,7 +45,7 @@ public class CreateUserMuteDialogFragment extends BaseSupportDialogFragment impl
switch (which) { switch (which) {
case DialogInterface.BUTTON_POSITIVE: case DialogInterface.BUTTON_POSITIVE:
final ParcelableUser user = getUser(); final ParcelableUser user = getUser();
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (user == null || twitter == null) return; if (user == null || twitter == null) return;
twitter.createMuteAsync(user.account_id, user.id); twitter.createMuteAsync(user.account_id, user.id);
break; break;

View File

@ -50,7 +50,7 @@ public class DeleteUserListMembersDialogFragment extends BaseSupportDialogFragme
case DialogInterface.BUTTON_POSITIVE: case DialogInterface.BUTTON_POSITIVE:
final ParcelableUser[] users = getUsers(); final ParcelableUser[] users = getUsers();
final ParcelableUserList userList = getUserList(); final ParcelableUserList userList = getUserList();
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (users == null || userList == null || twitter == null) return; if (users == null || userList == null || twitter == null) return;
twitter.deleteUserListMembersAsync(userList.account_id, userList.id, users); twitter.deleteUserListMembersAsync(userList.account_id, userList.id, users);
break; break;

View File

@ -46,7 +46,7 @@ public class DestroyFriendshipDialogFragment extends BaseSupportDialogFragment i
switch (which) { switch (which) {
case DialogInterface.BUTTON_POSITIVE: case DialogInterface.BUTTON_POSITIVE:
final ParcelableUser user = getUser(); final ParcelableUser user = getUser();
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (user == null || twitter == null) return; if (user == null || twitter == null) return;
twitter.destroyFriendshipAsync(user.account_id, user.id); twitter.destroyFriendshipAsync(user.account_id, user.id);
break; break;

View File

@ -19,80 +19,80 @@
package org.mariotaku.twidere.fragment.support; package org.mariotaku.twidere.fragment.support;
import android.support.v7.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
public class DestroySavedSearchDialogFragment extends BaseSupportDialogFragment implements public class DestroySavedSearchDialogFragment extends BaseSupportDialogFragment implements
DialogInterface.OnClickListener { DialogInterface.OnClickListener {
public static final String FRAGMENT_TAG = "destroy_saved_search"; public static final String FRAGMENT_TAG = "destroy_saved_search";
@Override
public void onClick(final DialogInterface dialog, final int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
final long accountId = getAccountId();
final int searchId = getSearchId();
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (searchId <= 0 || twitter == null) return;
twitter.destroySavedSearchAsync(accountId, searchId);
break;
default:
break;
}
}
@NonNull
@Override @Override
public Dialog onCreateDialog(final Bundle savedInstanceState) { public void onClick(final DialogInterface dialog, final int which) {
final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity()); switch (which) {
final AlertDialog.Builder builder = new AlertDialog.Builder(wrapped); case DialogInterface.BUTTON_POSITIVE:
final String name = getSearchName(); final long accountId = getAccountId();
if (name != null) { final int searchId = getSearchId();
builder.setTitle(getString(R.string.destroy_saved_search, name)); final AsyncTwitterWrapper twitter = mTwitterWrapper;
builder.setMessage(getString(R.string.destroy_saved_search_confirm_message, name)); if (searchId <= 0 || twitter == null) return;
} twitter.destroySavedSearchAsync(accountId, searchId);
builder.setPositiveButton(android.R.string.ok, this); break;
builder.setNegativeButton(android.R.string.cancel, null); default:
return builder.create(); break;
} }
}
private long getAccountId() { @NonNull
final Bundle args = getArguments(); @Override
if (!args.containsKey(EXTRA_ACCOUNT_ID)) return -1; public Dialog onCreateDialog(final Bundle savedInstanceState) {
return args.getLong(EXTRA_ACCOUNT_ID); final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity());
} final AlertDialog.Builder builder = new AlertDialog.Builder(wrapped);
final String name = getSearchName();
if (name != null) {
builder.setTitle(getString(R.string.destroy_saved_search, name));
builder.setMessage(getString(R.string.destroy_saved_search_confirm_message, name));
}
builder.setPositiveButton(android.R.string.ok, this);
builder.setNegativeButton(android.R.string.cancel, null);
return builder.create();
}
private int getSearchId() { private long getAccountId() {
final Bundle args = getArguments(); final Bundle args = getArguments();
if (!args.containsKey(EXTRA_SEARCH_ID)) return -1; if (!args.containsKey(EXTRA_ACCOUNT_ID)) return -1;
return args.getInt(EXTRA_SEARCH_ID); return args.getLong(EXTRA_ACCOUNT_ID);
} }
private String getSearchName() { private int getSearchId() {
final Bundle args = getArguments(); final Bundle args = getArguments();
if (!args.containsKey(EXTRA_NAME)) return null; if (!args.containsKey(EXTRA_SEARCH_ID)) return -1;
return args.getString(EXTRA_NAME); return args.getInt(EXTRA_SEARCH_ID);
} }
public static DestroySavedSearchDialogFragment show(final FragmentManager fm, final long accountId, private String getSearchName() {
final int searchId, final String name) { final Bundle args = getArguments();
final Bundle args = new Bundle(); if (!args.containsKey(EXTRA_NAME)) return null;
args.putLong(EXTRA_ACCOUNT_ID, accountId); return args.getString(EXTRA_NAME);
args.putInt(EXTRA_SEARCH_ID, searchId); }
args.putString(EXTRA_NAME, name);
final DestroySavedSearchDialogFragment f = new DestroySavedSearchDialogFragment(); public static DestroySavedSearchDialogFragment show(final FragmentManager fm, final long accountId,
f.setArguments(args); final int searchId, final String name) {
f.show(fm, FRAGMENT_TAG); final Bundle args = new Bundle();
return f; args.putLong(EXTRA_ACCOUNT_ID, accountId);
} args.putInt(EXTRA_SEARCH_ID, searchId);
args.putString(EXTRA_NAME, name);
final DestroySavedSearchDialogFragment f = new DestroySavedSearchDialogFragment();
f.setArguments(args);
f.show(fm, FRAGMENT_TAG);
return f;
}
} }

View File

@ -19,13 +19,13 @@
package org.mariotaku.twidere.fragment.support; package org.mariotaku.twidere.fragment.support;
import android.support.v7.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
@ -34,46 +34,46 @@ import org.mariotaku.twidere.util.ThemeUtils;
public class DestroyStatusDialogFragment extends BaseSupportDialogFragment implements DialogInterface.OnClickListener { public class DestroyStatusDialogFragment extends BaseSupportDialogFragment implements DialogInterface.OnClickListener {
public static final String FRAGMENT_TAG = "destroy_status"; public static final String FRAGMENT_TAG = "destroy_status";
@Override
public void onClick(final DialogInterface dialog, final int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
final ParcelableStatus status = getStatus();
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (status == null || twitter == null) return;
twitter.destroyStatusAsync(status.account_id, status.id);
break;
default:
break;
}
}
@NonNull
@Override @Override
public Dialog onCreateDialog(final Bundle savedInstanceState) { public void onClick(final DialogInterface dialog, final int which) {
final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity()); switch (which) {
final AlertDialog.Builder builder = new AlertDialog.Builder(wrapped); case DialogInterface.BUTTON_POSITIVE:
builder.setTitle(R.string.destroy_status); final ParcelableStatus status = getStatus();
builder.setMessage(R.string.destroy_status_confirm_message); final AsyncTwitterWrapper twitter = mTwitterWrapper;
builder.setPositiveButton(android.R.string.ok, this); if (status == null || twitter == null) return;
builder.setNegativeButton(android.R.string.cancel, null); twitter.destroyStatusAsync(status.account_id, status.id);
return builder.create(); break;
} default:
break;
}
}
private ParcelableStatus getStatus() { @NonNull
final Bundle args = getArguments(); @Override
if (!args.containsKey(EXTRA_STATUS)) return null; public Dialog onCreateDialog(final Bundle savedInstanceState) {
return args.getParcelable(EXTRA_STATUS); final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity());
} final AlertDialog.Builder builder = new AlertDialog.Builder(wrapped);
builder.setTitle(R.string.destroy_status);
builder.setMessage(R.string.destroy_status_confirm_message);
builder.setPositiveButton(android.R.string.ok, this);
builder.setNegativeButton(android.R.string.cancel, null);
return builder.create();
}
public static DestroyStatusDialogFragment show(final FragmentManager fm, final ParcelableStatus status) { private ParcelableStatus getStatus() {
final Bundle args = new Bundle(); final Bundle args = getArguments();
args.putParcelable(EXTRA_STATUS, status); if (!args.containsKey(EXTRA_STATUS)) return null;
final DestroyStatusDialogFragment f = new DestroyStatusDialogFragment(); return args.getParcelable(EXTRA_STATUS);
f.setArguments(args); }
f.show(fm, FRAGMENT_TAG);
return f; public static DestroyStatusDialogFragment show(final FragmentManager fm, final ParcelableStatus status) {
} final Bundle args = new Bundle();
args.putParcelable(EXTRA_STATUS, status);
final DestroyStatusDialogFragment f = new DestroyStatusDialogFragment();
f.setArguments(args);
f.show(fm, FRAGMENT_TAG);
return f;
}
} }

View File

@ -19,13 +19,13 @@
package org.mariotaku.twidere.fragment.support; package org.mariotaku.twidere.fragment.support;
import android.support.v7.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.model.ParcelableUserList; import org.mariotaku.twidere.model.ParcelableUserList;
@ -34,49 +34,49 @@ import org.mariotaku.twidere.util.ThemeUtils;
public class DestroyUserListDialogFragment extends BaseSupportDialogFragment implements DialogInterface.OnClickListener { public class DestroyUserListDialogFragment extends BaseSupportDialogFragment implements DialogInterface.OnClickListener {
public static final String FRAGMENT_TAG = "destroy_user_list"; public static final String FRAGMENT_TAG = "destroy_user_list";
@Override
public void onClick(final DialogInterface dialog, final int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
final ParcelableUserList user_list = getUserList();
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (user_list == null || twitter == null) return;
twitter.destroyUserListAsync(user_list.account_id, user_list.id);
break;
default:
break;
}
}
@NonNull
@Override @Override
public Dialog onCreateDialog(final Bundle savedInstanceState) { public void onClick(final DialogInterface dialog, final int which) {
final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity()); switch (which) {
final AlertDialog.Builder builder = new AlertDialog.Builder(wrapped); case DialogInterface.BUTTON_POSITIVE:
final ParcelableUserList userList = getUserList(); final ParcelableUserList user_list = getUserList();
if (userList != null) { final AsyncTwitterWrapper twitter = mTwitterWrapper;
builder.setTitle(getString(R.string.delete_user_list, userList.name)); if (user_list == null || twitter == null) return;
builder.setMessage(getString(R.string.delete_user_list_confirm_message, userList.name)); twitter.destroyUserListAsync(user_list.account_id, user_list.id);
} break;
builder.setPositiveButton(android.R.string.ok, this); default:
builder.setNegativeButton(android.R.string.cancel, null); break;
return builder.create(); }
} }
private ParcelableUserList getUserList() { @NonNull
final Bundle args = getArguments(); @Override
if (!args.containsKey(EXTRA_USER_LIST)) return null; public Dialog onCreateDialog(final Bundle savedInstanceState) {
return args.getParcelable(EXTRA_USER_LIST); final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity());
} final AlertDialog.Builder builder = new AlertDialog.Builder(wrapped);
final ParcelableUserList userList = getUserList();
if (userList != null) {
builder.setTitle(getString(R.string.delete_user_list, userList.name));
builder.setMessage(getString(R.string.delete_user_list_confirm_message, userList.name));
}
builder.setPositiveButton(android.R.string.ok, this);
builder.setNegativeButton(android.R.string.cancel, null);
return builder.create();
}
public static DestroyUserListDialogFragment show(final FragmentManager fm, final ParcelableUserList user_list) { private ParcelableUserList getUserList() {
final Bundle args = new Bundle(); final Bundle args = getArguments();
args.putParcelable(EXTRA_USER_LIST, user_list); if (!args.containsKey(EXTRA_USER_LIST)) return null;
final DestroyUserListDialogFragment f = new DestroyUserListDialogFragment(); return args.getParcelable(EXTRA_USER_LIST);
f.setArguments(args); }
f.show(fm, FRAGMENT_TAG);
return f; public static DestroyUserListDialogFragment show(final FragmentManager fm, final ParcelableUserList user_list) {
} final Bundle args = new Bundle();
args.putParcelable(EXTRA_USER_LIST, user_list);
final DestroyUserListDialogFragment f = new DestroyUserListDialogFragment();
f.setArguments(args);
f.show(fm, FRAGMENT_TAG);
return f;
}
} }

View File

@ -19,13 +19,13 @@
package org.mariotaku.twidere.fragment.support; package org.mariotaku.twidere.fragment.support;
import android.support.v7.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.model.ParcelableUserList; import org.mariotaku.twidere.model.ParcelableUserList;
@ -33,52 +33,52 @@ import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
public class DestroyUserListSubscriptionDialogFragment extends BaseSupportDialogFragment implements public class DestroyUserListSubscriptionDialogFragment extends BaseSupportDialogFragment implements
DialogInterface.OnClickListener { DialogInterface.OnClickListener {
public static final String FRAGMENT_TAG = "destroy_user_list"; public static final String FRAGMENT_TAG = "destroy_user_list";
@Override
public void onClick(final DialogInterface dialog, final int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
final ParcelableUserList user_list = getUserList();
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (user_list == null || twitter == null) return;
twitter.destroyUserListSubscriptionAsync(user_list.account_id, user_list.id);
break;
default:
break;
}
}
@NonNull
@Override @Override
public Dialog onCreateDialog(final Bundle savedInstanceState) { public void onClick(final DialogInterface dialog, final int which) {
final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity()); switch (which) {
final AlertDialog.Builder builder = new AlertDialog.Builder(wrapped); case DialogInterface.BUTTON_POSITIVE:
final ParcelableUserList userList = getUserList(); final ParcelableUserList user_list = getUserList();
if (userList != null) { final AsyncTwitterWrapper twitter = mTwitterWrapper;
builder.setTitle(getString(R.string.unsubscribe_from_user_list, userList.name)); if (user_list == null || twitter == null) return;
builder.setMessage(getString(R.string.unsubscribe_from_user_list_confirm_message, userList.name)); twitter.destroyUserListSubscriptionAsync(user_list.account_id, user_list.id);
} break;
builder.setPositiveButton(android.R.string.ok, this); default:
builder.setNegativeButton(android.R.string.cancel, null); break;
return builder.create(); }
} }
private ParcelableUserList getUserList() { @NonNull
final Bundle args = getArguments(); @Override
if (!args.containsKey(EXTRA_USER_LIST)) return null; public Dialog onCreateDialog(final Bundle savedInstanceState) {
return args.getParcelable(EXTRA_USER_LIST); final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity());
} final AlertDialog.Builder builder = new AlertDialog.Builder(wrapped);
final ParcelableUserList userList = getUserList();
if (userList != null) {
builder.setTitle(getString(R.string.unsubscribe_from_user_list, userList.name));
builder.setMessage(getString(R.string.unsubscribe_from_user_list_confirm_message, userList.name));
}
builder.setPositiveButton(android.R.string.ok, this);
builder.setNegativeButton(android.R.string.cancel, null);
return builder.create();
}
public static DestroyUserListSubscriptionDialogFragment show(final FragmentManager fm, private ParcelableUserList getUserList() {
final ParcelableUserList userList) { final Bundle args = getArguments();
final Bundle args = new Bundle(); if (!args.containsKey(EXTRA_USER_LIST)) return null;
args.putParcelable(EXTRA_USER_LIST, userList); return args.getParcelable(EXTRA_USER_LIST);
final DestroyUserListSubscriptionDialogFragment f = new DestroyUserListSubscriptionDialogFragment(); }
f.setArguments(args);
f.show(fm, FRAGMENT_TAG); public static DestroyUserListSubscriptionDialogFragment show(final FragmentManager fm,
return f; final ParcelableUserList userList) {
} final Bundle args = new Bundle();
args.putParcelable(EXTRA_USER_LIST, userList);
final DestroyUserListSubscriptionDialogFragment f = new DestroyUserListSubscriptionDialogFragment();
f.setArguments(args);
f.show(fm, FRAGMENT_TAG);
return f;
}
} }

View File

@ -111,7 +111,7 @@ public class DirectMessagesFragment extends AbsContentRecyclerViewFragment<Messa
@Override @Override
public boolean isRefreshing() { public boolean isRefreshing() {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
return twitter != null && (twitter.isReceivedDirectMessagesRefreshing() || twitter.isSentDirectMessagesRefreshing()); return twitter != null && (twitter.isReceivedDirectMessagesRefreshing() || twitter.isSentDirectMessagesRefreshing());
} }
@ -209,7 +209,7 @@ public class DirectMessagesFragment extends AbsContentRecyclerViewFragment<Messa
public boolean scrollToStart() { public boolean scrollToStart() {
final boolean result = super.scrollToStart(); final boolean result = super.scrollToStart();
if (result) { if (result) {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
final int tabPosition = getTabPosition(); final int tabPosition = getTabPosition();
if (twitter != null && tabPosition >= 0) { if (twitter != null && tabPosition >= 0) {
twitter.clearUnreadCountAsync(tabPosition); twitter.clearUnreadCountAsync(tabPosition);
@ -232,7 +232,7 @@ public class DirectMessagesFragment extends AbsContentRecyclerViewFragment<Messa
@Override @Override
protected void onPostExecute(final long[][] result) { protected void onPostExecute(final long[][] result) {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter == null) return; if (twitter == null) return;
twitter.getReceivedDirectMessagesAsync(result[0], null, result[1]); twitter.getReceivedDirectMessagesAsync(result[0], null, result[1]);
twitter.getSentDirectMessagesAsync(result[0], null, null); twitter.getSentDirectMessagesAsync(result[0], null, null);
@ -333,7 +333,7 @@ public class DirectMessagesFragment extends AbsContentRecyclerViewFragment<Messa
} }
protected void updateRefreshState() { protected void updateRefreshState() {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
setRefreshing(twitter != null && (twitter.isReceivedDirectMessagesRefreshing() || twitter.isSentDirectMessagesRefreshing())); setRefreshing(twitter != null && (twitter.isReceivedDirectMessagesRefreshing() || twitter.isSentDirectMessagesRefreshing()));
} }
@ -372,7 +372,7 @@ public class DirectMessagesFragment extends AbsContentRecyclerViewFragment<Messa
@Override @Override
protected void onPostExecute(final long[][] result) { protected void onPostExecute(final long[][] result) {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter == null) return; if (twitter == null) return;
twitter.getReceivedDirectMessagesAsync(result[0], result[1], null); twitter.getReceivedDirectMessagesAsync(result[0], result[1], null);
twitter.getSentDirectMessagesAsync(result[0], result[2], null); twitter.getSentDirectMessagesAsync(result[0], result[2], null);
@ -411,7 +411,7 @@ public class DirectMessagesFragment extends AbsContentRecyclerViewFragment<Messa
@Override @Override
protected void onPostExecute(final Object result) { protected void onPostExecute(final Object result) {
final AsyncTwitterWrapper twitter = fragment.getTwitterWrapper(); final AsyncTwitterWrapper twitter = fragment.mTwitterWrapper;
if (twitter != null) { if (twitter != null) {
twitter.removeUnreadCountsAsync(fragment.getTabPosition(), fragment.getUnreadCountsToRemove()); twitter.removeUnreadCountsAsync(fragment.getTabPosition(), fragment.getUnreadCountsToRemove());
} }

View File

@ -207,7 +207,7 @@ public class DraftsFragment extends BaseSupportFragment implements Constants, Lo
@Override @Override
public void onStart() { public void onStart() {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter != null) { if (twitter != null) {
twitter.clearNotificationAsync(NOTIFICATION_ID_DRAFTS); twitter.clearNotificationAsync(NOTIFICATION_ID_DRAFTS);
} }
@ -257,7 +257,7 @@ public class DraftsFragment extends BaseSupportFragment implements Constants, Lo
} }
private boolean sendDrafts(final List<DraftItem> list) { private boolean sendDrafts(final List<DraftItem> list) {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter == null) return false; if (twitter == null) return false;
for (final DraftItem item : list) { for (final DraftItem item : list) {
if (item.action_type == Drafts.ACTION_UPDATE_STATUS || item.action_type <= 0) { if (item.action_type == Drafts.ACTION_UPDATE_STATUS || item.action_type <= 0) {

View File

@ -49,20 +49,20 @@ public class HomeTimelineFragment extends CursorStatusesFragment {
@Override @Override
protected void updateRefreshState() { protected void updateRefreshState() {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter == null) return; if (twitter == null) return;
setRefreshing(twitter.isHomeTimelineRefreshing()); setRefreshing(twitter.isHomeTimelineRefreshing());
} }
@Override @Override
public boolean isRefreshing() { public boolean isRefreshing() {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
return twitter != null && twitter.isHomeTimelineRefreshing(); return twitter != null && twitter.isHomeTimelineRefreshing();
} }
@Override @Override
public boolean getStatuses(long[] accountIds, long[] maxIds, long[] sinceIds) { public boolean getStatuses(long[] accountIds, long[] maxIds, long[] sinceIds) {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter == null) return false; if (twitter == null) return false;
if (maxIds == null) return twitter.refreshAll(accountIds); if (maxIds == null) return twitter.refreshAll(accountIds);
return twitter.getHomeTimelineAsync(accountIds, maxIds, sinceIds); return twitter.getHomeTimelineAsync(accountIds, maxIds, sinceIds);

View File

@ -49,7 +49,7 @@ public class MentionsTimelineFragment extends CursorStatusesFragment {
@Override @Override
public boolean isRefreshing() { public boolean isRefreshing() {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
return twitter != null && twitter.isMentionsTimelineRefreshing(); return twitter != null && twitter.isMentionsTimelineRefreshing();
} }
@ -65,14 +65,14 @@ public class MentionsTimelineFragment extends CursorStatusesFragment {
@Override @Override
protected void updateRefreshState() { protected void updateRefreshState() {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter == null) return; if (twitter == null) return;
setRefreshing(twitter.isMentionsTimelineRefreshing()); setRefreshing(twitter.isMentionsTimelineRefreshing());
} }
@Override @Override
public boolean getStatuses(long[] accountIds, long[] maxIds, long[] sinceIds) { public boolean getStatuses(long[] accountIds, long[] maxIds, long[] sinceIds) {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter == null) return false; if (twitter == null) return false;
return twitter.getMentionsTimelineAsync(accountIds, maxIds, sinceIds); return twitter.getMentionsTimelineAsync(accountIds, maxIds, sinceIds);
} }

View File

@ -165,10 +165,8 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
// Utility classes // Utility classes
private TwidereValidator mValidator; private TwidereValidator mValidator;
private AsyncTwitterWrapper mTwitterWrapper;
private SharedPreferencesWrapper mPreferences; private SharedPreferencesWrapper mPreferences;
private SharedPreferences mMessageDrafts; private SharedPreferences mMessageDrafts;
private ReadStateManager mReadStateManager;
private MediaLoaderWrapper mImageLoader; private MediaLoaderWrapper mImageLoader;
private UserColorNameManager mUserColorNameManager; private UserColorNameManager mUserColorNameManager;
private EffectViewHelper mEffectHelper; private EffectViewHelper mEffectHelper;
@ -239,8 +237,6 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
mUserColorNameManager = UserColorNameManager.getInstance(activity); mUserColorNameManager = UserColorNameManager.getInstance(activity);
mMessageDrafts = getSharedPreferences(MESSAGE_DRAFTS_PREFERENCES_NAME, Context.MODE_PRIVATE); mMessageDrafts = getSharedPreferences(MESSAGE_DRAFTS_PREFERENCES_NAME, Context.MODE_PRIVATE);
mImageLoader = TwidereApplication.getInstance(activity).getMediaLoaderWrapper(); mImageLoader = TwidereApplication.getInstance(activity).getMediaLoaderWrapper();
mReadStateManager = getReadStateManager();
mTwitterWrapper = getTwitterWrapper();
mValidator = new TwidereValidator(activity); mValidator = new TwidereValidator(activity);
final View view = getView(); final View view = getView();
@ -891,13 +887,16 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
return builder.create(); return builder.create();
} }
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
switch (which) { switch (which) {
case DialogInterface.BUTTON_POSITIVE: { case DialogInterface.BUTTON_POSITIVE: {
final ParcelableCredentials account = getArguments().getParcelable(EXTRA_ACCOUNT); final Bundle args = getArguments();
final ParcelableUser user = getArguments().getParcelable(EXTRA_USER); final ParcelableCredentials account = args.getParcelable(EXTRA_ACCOUNT);
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final ParcelableUser user = args.getParcelable(EXTRA_USER);
if (account == null || user == null) return;
final AsyncTwitterWrapper twitter = mTwitterWrapper;
twitter.destroyMessageConversationAsync(account.account_id, user.id); twitter.destroyMessageConversationAsync(account.account_id, user.id);
break; break;
} }
@ -905,15 +904,15 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
} }
} }
private static class SetReadStateTask extends AsyncTask<Object, Object, Cursor> { static class SetReadStateTask extends AsyncTask<Object, Object, Cursor> {
private final Context mContext; private final Context mContext;
private final ReadStateManager mReadStateManager; private final ReadStateManager mReadStateManager;
private final ParcelableCredentials mAccount; private final ParcelableCredentials mAccount;
private final ParcelableUser mRecipient; private final ParcelableUser mRecipient;
public SetReadStateTask(Context context, ParcelableCredentials account, ParcelableUser recipient) { public SetReadStateTask(Context context, ParcelableCredentials account, ParcelableUser recipient) {
mReadStateManager = TwidereApplication.getModule(context).getReadStateManager();
mContext = context; mContext = context;
mReadStateManager = TwidereApplication.getInstance(context).getReadStateManager();
mAccount = account; mAccount = account;
mRecipient = recipient; mRecipient = recipient;
} }

View File

@ -45,7 +45,7 @@ public class ReportSpamDialogFragment extends BaseSupportDialogFragment implemen
switch (which) { switch (which) {
case DialogInterface.BUTTON_POSITIVE: case DialogInterface.BUTTON_POSITIVE:
final ParcelableUser user = getUser(); final ParcelableUser user = getUser();
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (user == null || twitter == null) return; if (user == null || twitter == null) return;
twitter.reportSpamAsync(user.account_id, user.id); twitter.reportSpamAsync(user.account_id, user.id);
break; break;

View File

@ -38,6 +38,7 @@ import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
@ -51,6 +52,7 @@ import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TwidereValidator; import org.mariotaku.twidere.util.TwidereValidator;
import org.mariotaku.twidere.view.ComposeMaterialEditText; import org.mariotaku.twidere.view.ComposeMaterialEditText;
import org.mariotaku.twidere.view.StatusTextCountView;
import org.mariotaku.twidere.view.holder.StatusViewHolder; import org.mariotaku.twidere.view.holder.StatusViewHolder;
import org.mariotaku.twidere.view.holder.StatusViewHolder.DummyStatusHolderAdapter; import org.mariotaku.twidere.view.holder.StatusViewHolder.DummyStatusHolderAdapter;
@ -60,9 +62,7 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
Constants, DialogInterface.OnClickListener { Constants, DialogInterface.OnClickListener {
public static final String FRAGMENT_TAG = "retweet_quote"; public static final String FRAGMENT_TAG = "retweet_quote";
private ComposeMaterialEditText mEditComment;
private PopupMenu mPopupMenu; private PopupMenu mPopupMenu;
private View mCommentMenu;
private TwidereValidator mValidator; private TwidereValidator mValidator;
private SharedPreferencesWrapper mPreferences; private SharedPreferencesWrapper mPreferences;
@ -72,7 +72,7 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
if (status == null) return; if (status == null) return;
switch (which) { switch (which) {
case DialogInterface.BUTTON_POSITIVE: { case DialogInterface.BUTTON_POSITIVE: {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter == null) return; if (twitter == null) return;
retweetOrQuote(twitter, status); retweetOrQuote(twitter, status);
break; break;
@ -124,24 +124,14 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
view.findViewById(R.id.action_buttons).setVisibility(View.GONE); view.findViewById(R.id.action_buttons).setVisibility(View.GONE);
view.findViewById(R.id.item_content).setFocusable(false); view.findViewById(R.id.item_content).setFocusable(false);
view.findViewById(R.id.comment_container).setVisibility(status.user_is_protected ? View.GONE : View.VISIBLE); view.findViewById(R.id.comment_container).setVisibility(status.user_is_protected ? View.GONE : View.VISIBLE);
mEditComment = (ComposeMaterialEditText) view.findViewById(R.id.edit_comment); final ComposeMaterialEditText mEditComment = (ComposeMaterialEditText) view.findViewById(R.id.edit_comment);
mEditComment.setAccountId(status.account_id); mEditComment.setAccountId(status.account_id);
// mEditComment.setLengthChecker(new METLengthChecker() {
//
// final String statusLink = LinkCreator.getTwitterStatusLink(status.user_screen_name, status.quote_id).toString();
//
// @Override
// public int getLength(CharSequence text) {
// return mValidator.getTweetLength(text + " " + statusLink);
// }
// });
// mEditComment.setMaxCharacters(mValidator.getMaxTweetLength());
final boolean sendByEnter = mPreferences.getBoolean(KEY_QUICK_SEND); final boolean sendByEnter = mPreferences.getBoolean(KEY_QUICK_SEND);
final EditTextEnterHandler enterHandler = EditTextEnterHandler.attach(mEditComment, new EditTextEnterHandler.EnterListener() { final EditTextEnterHandler enterHandler = EditTextEnterHandler.attach(mEditComment, new EditTextEnterHandler.EnterListener() {
@Override @Override
public void onHitEnter() { public void onHitEnter() {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
final ParcelableStatus status = getStatus(); final ParcelableStatus status = getStatus();
if (twitter == null || status == null) return; if (twitter == null || status == null) return;
retweetOrQuote(twitter, status); retweetOrQuote(twitter, status);
@ -156,11 +146,7 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
@Override @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { public void onTextChanged(CharSequence s, int start, int before, int count) {
final Dialog dialog = getDialog(); updateTextCount(getDialog(), s, status);
if (!(dialog instanceof AlertDialog)) return;
final Button positiveButton = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
if (positiveButton == null) return;
positiveButton.setText(s.length() > 0 ? R.string.comment : R.string.retweet);
} }
@Override @Override
@ -168,17 +154,17 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
} }
}); });
mCommentMenu = view.findViewById(R.id.comment_menu); final View commentMenu = view.findViewById(R.id.comment_menu);
mPopupMenu = new PopupMenu(context, mCommentMenu, Gravity.NO_GRAVITY, mPopupMenu = new PopupMenu(context, commentMenu, Gravity.NO_GRAVITY,
R.attr.actionOverflowMenuStyle, 0); R.attr.actionOverflowMenuStyle, 0);
mCommentMenu.setOnClickListener(new View.OnClickListener() { commentMenu.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
mPopupMenu.show(); mPopupMenu.show();
} }
}); });
mCommentMenu.setOnTouchListener(mPopupMenu.getDragToOpenListener()); commentMenu.setOnTouchListener(mPopupMenu.getDragToOpenListener());
mPopupMenu.inflate(R.menu.menu_dialog_comment); mPopupMenu.inflate(R.menu.menu_dialog_comment);
final Menu menu = mPopupMenu.getMenu(); final Menu menu = mPopupMenu.getMenu();
MenuUtils.setMenuItemAvailability(menu, R.id.quote_original_status, MenuUtils.setMenuItemAvailability(menu, R.id.quote_original_status,
@ -194,7 +180,25 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
} }
}); });
return builder.create(); final Dialog dialog = builder.create();
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
updateTextCount(dialog, mEditComment.getText(), status);
}
});
return dialog;
}
private void updateTextCount(DialogInterface dialog, CharSequence s, ParcelableStatus status) {
if (!(dialog instanceof AlertDialog)) return;
final AlertDialog alertDialog = (AlertDialog) dialog;
final Button positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
if (positiveButton == null) return;
positiveButton.setText(s.length() > 0 ? R.string.comment : R.string.retweet);
final String statusLink = LinkCreator.getTwitterStatusLink(status.user_screen_name, status.id).toString();
final StatusTextCountView textCountView = (StatusTextCountView) alertDialog.findViewById(R.id.comment_text_count);
textCountView.setTextCount(mValidator.getTweetLength(s + " " + statusLink));
} }
private ParcelableStatus getStatus() { private ParcelableStatus getStatus() {
@ -204,7 +208,10 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
} }
private void retweetOrQuote(AsyncTwitterWrapper twitter, ParcelableStatus status) { private void retweetOrQuote(AsyncTwitterWrapper twitter, ParcelableStatus status) {
if (mEditComment.length() > 0) { final Dialog dialog = getDialog();
if (dialog == null) return;
final EditText editComment = ((EditText) dialog.findViewById(R.id.edit_comment));
if (editComment.length() > 0) {
final Menu menu = mPopupMenu.getMenu(); final Menu menu = mPopupMenu.getMenu();
final MenuItem quoteOriginalStatus = menu.findItem(R.id.quote_original_status); final MenuItem quoteOriginalStatus = menu.findItem(R.id.quote_original_status);
final MenuItem linkToQuotedStatus = menu.findItem(R.id.link_to_quoted_status); final MenuItem linkToQuotedStatus = menu.findItem(R.id.link_to_quoted_status);
@ -217,7 +224,7 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
inReplyToStatusId = status.quoted_id; inReplyToStatusId = status.quoted_id;
statusLink = LinkCreator.getTwitterStatusLink(status.quoted_user_screen_name, status.quoted_id); statusLink = LinkCreator.getTwitterStatusLink(status.quoted_user_screen_name, status.quoted_id);
} }
final String commentText = mEditComment.getText() + " " + statusLink; final String commentText = editComment.getText() + " " + statusLink;
twitter.updateStatusAsync(new long[]{status.account_id}, commentText, null, null, twitter.updateStatusAsync(new long[]{status.account_id}, commentText, null, null,
linkToQuotedStatus.isChecked() ? inReplyToStatusId : -1, status.is_possibly_sensitive); linkToQuotedStatus.isChecked() ? inReplyToStatusId : -1, status.is_possibly_sensitive);
} else if (isMyRetweet(status)) { } else if (isMyRetweet(status)) {

View File

@ -94,6 +94,7 @@ public class ScheduledStatusesFragment extends AbsContentRecyclerViewFragment<Sc
private List<ScheduledStatus> mData; private List<ScheduledStatus> mData;
public ScheduledStatusesAdapter(Context context) { public ScheduledStatusesAdapter(Context context) {
super(context);
mContext = context; mContext = context;
mInflater = LayoutInflater.from(context); mInflater = LayoutInflater.from(context);
setLoadMoreSupported(false); setLoadMoreSupported(false);

View File

@ -227,7 +227,7 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
public boolean onOptionsItemSelected(final MenuItem item) { public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.save: { case R.id.save: {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
final Bundle args = getArguments(); final Bundle args = getArguments();
if (twitter != null && args != null) { if (twitter != null && args != null) {
twitter.createSavedSearchAsync(getAccountId(), getQuery()); twitter.createSavedSearchAsync(getAccountId(), getQuery());

View File

@ -200,7 +200,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
final ParcelableStatus status = mSelectedStatus; final ParcelableStatus status = mSelectedStatus;
if (status == null) return false; if (status == null) return false;
return Utils.handleMenuItemClick(getActivity(), StatusFragment.this, return Utils.handleMenuItemClick(getActivity(), StatusFragment.this,
getFragmentManager(), getTwitterWrapper(), status, item); getFragmentManager(), mTwitterWrapper, status, item);
} }
}; };
@ -322,7 +322,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
break; break;
} }
case R.id.favorite_count: { case R.id.favorite_count: {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter == null) return; if (twitter == null) return;
if (status.is_favorite) { if (status.is_favorite) {
twitter.destroyFavoriteAsync(status.account_id, status.id); twitter.destroyFavoriteAsync(status.account_id, status.id);
@ -412,7 +412,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
return true; return true;
} }
case ACTION_STATUS_FAVORITE: { case ACTION_STATUS_FAVORITE: {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (status.is_favorite) { if (status.is_favorite) {
twitter.destroyFavoriteAsync(status.account_id, status.id); twitter.destroyFavoriteAsync(status.account_id, status.id);
} else { } else {
@ -875,7 +875,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
final StatusFragment fragment = adapter.getFragment(); final StatusFragment fragment = adapter.getFragment();
final ParcelableStatus status = adapter.getStatus(layoutPosition); final ParcelableStatus status = adapter.getStatus(layoutPosition);
if (status == null || fragment == null) return false; if (status == null || fragment == null) return false;
final AsyncTwitterWrapper twitter = fragment.getTwitterWrapper(); final AsyncTwitterWrapper twitter = fragment.mTwitterWrapper;
final FragmentActivity activity = fragment.getActivity(); final FragmentActivity activity = fragment.getActivity();
final FragmentManager fm = fragment.getFragmentManager(); final FragmentManager fm = fragment.getFragmentManager();
if (item.getItemId() == R.id.retweet) { if (item.getItemId() == R.id.retweet) {
@ -1158,7 +1158,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
@NonNull @NonNull
@Override @Override
public AsyncTwitterWrapper getTwitterWrapper() { public AsyncTwitterWrapper getTwitterWrapper() {
return mFragment.getTwitterWrapper(); return mFragment.mTwitterWrapper;
} }
@Override @Override
@ -1458,7 +1458,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
public long getItemId(int position) { public long getItemId(int position) {
final ParcelableStatus status = getStatus(position); final ParcelableStatus status = getStatus(position);
if (status != null) return status.id; if (status != null) return status.id;
return getItemType(position) * 100 + position; return getItemType(position);
} }
@Override @Override

View File

@ -109,7 +109,7 @@ public class TrendsSuggestionsFragment extends AbsContentListViewFragment<Trends
@Override @Override
public void onRefresh() { public void onRefresh() {
if (isRefreshing()) return; if (isRefreshing()) return;
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter == null) return; if (twitter == null) return;
twitter.getLocalTrendsAsync(mAccountId, mPreferences.getInt(KEY_LOCAL_TRENDS_WOEID, 1)); twitter.getLocalTrendsAsync(mAccountId, mPreferences.getInt(KEY_LOCAL_TRENDS_WOEID, 1));
} }
@ -142,7 +142,7 @@ public class TrendsSuggestionsFragment extends AbsContentListViewFragment<Trends
} }
protected void updateRefreshState() { protected void updateRefreshState() {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter == null || !getUserVisibleHint()) return; if (twitter == null || !getUserVisibleHint()) return;
setRefreshing(twitter.isLocalTrendsRefreshing()); setRefreshing(twitter.isLocalTrendsRefreshing());
} }

View File

@ -644,7 +644,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
case REQUEST_ADD_TO_LIST: { case REQUEST_ADD_TO_LIST: {
if (user == null) return; if (user == null) return;
if (resultCode == Activity.RESULT_OK && data != null) { if (resultCode == Activity.RESULT_OK && data != null) {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
final ParcelableUserList list = data.getParcelableExtra(EXTRA_USER_LIST); final ParcelableUserList list = data.getParcelableExtra(EXTRA_USER_LIST);
if (list == null || twitter == null) return; if (list == null || twitter == null) return;
twitter.addUserListMembersAsync(user.account_id, list.id, user); twitter.addUserListMembersAsync(user.account_id, list.id, user);
@ -837,7 +837,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
@Override @Override
public void onPrepareOptionsMenu(final Menu menu) { public void onPrepareOptionsMenu(final Menu menu) {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
final ParcelableUser user = getUser(); final ParcelableUser user = getUser();
final Relationship relationship = mRelationship; final Relationship relationship = mRelationship;
if (twitter == null || user == null) return; if (twitter == null || user == null) return;
@ -919,7 +919,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
@Override @Override
public boolean onOptionsItemSelected(final MenuItem item) { public boolean onOptionsItemSelected(final MenuItem item) {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
final ParcelableUser user = getUser(); final ParcelableUser user = getUser();
final Relationship relationship = mRelationship; final Relationship relationship = mRelationship;
if (user == null || twitter == null) return false; if (user == null || twitter == null) return false;
@ -1222,7 +1222,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
break; break;
} }
final Relationship relationship = mRelationship; final Relationship relationship = mRelationship;
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (relationship == null || twitter == null) return; if (relationship == null || twitter == null) return;
if (relationship.isSourceBlockingTarget()) { if (relationship.isSourceBlockingTarget()) {
twitter.destroyBlockAsync(user.account_id, user.id); twitter.destroyBlockAsync(user.account_id, user.id);
@ -1469,7 +1469,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
} }
private void updateFollowProgressState() { private void updateFollowProgressState() {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
final ParcelableUser user = getUser(); final ParcelableUser user = getUser();
if (twitter == null || user == null) { if (twitter == null || user == null) {
mFollowButton.setVisibility(View.GONE); mFollowButton.setVisibility(View.GONE);
@ -1497,7 +1497,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
private void updateRefreshState() { private void updateRefreshState() {
final ParcelableUser user = getUser(); final ParcelableUser user = getUser();
if (user == null) return; if (user == null) return;
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
final boolean is_creating_friendship = twitter != null final boolean is_creating_friendship = twitter != null
&& twitter.isCreatingFriendship(user.account_id, user.id); && twitter.isCreatingFriendship(user.account_id, user.id);
final boolean is_destroying_friendship = twitter != null final boolean is_destroying_friendship = twitter != null

View File

@ -213,7 +213,6 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
final FragmentActivity activity = getActivity(); final FragmentActivity activity = getActivity();
final TwidereApplication application = TwidereApplication.getInstance(activity); final TwidereApplication application = TwidereApplication.getInstance(activity);
mTwitterWrapper = application.getTwitterWrapper();
mProfileImageLoader = application.getMediaLoaderWrapper(); mProfileImageLoader = application.getMediaLoaderWrapper();
mUserColorNameManager = application.getUserColorNameManager(); mUserColorNameManager = application.getUserColorNameManager();
mPreferences = SharedPreferencesWrapper.getInstance(activity, SHARED_PREFERENCES_NAME, mPreferences = SharedPreferencesWrapper.getInstance(activity, SHARED_PREFERENCES_NAME,
@ -308,7 +307,7 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
@Override @Override
public boolean onOptionsItemSelected(final MenuItem item) { public boolean onOptionsItemSelected(final MenuItem item) {
final AsyncTwitterWrapper twitter = getTwitterWrapper(); final AsyncTwitterWrapper twitter = mTwitterWrapper;
final ParcelableUserList userList = mUserList; final ParcelableUserList userList = mUserList;
if (twitter == null || userList == null) return false; if (twitter == null || userList == null) return false;
switch (item.getItemId()) { switch (item.getItemId()) {
@ -466,7 +465,6 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
private long mAccountId; private long mAccountId;
private long mListId; private long mListId;
private boolean mIsPublic; private boolean mIsPublic;
private AsyncTwitterWrapper mTwitterWrapper;
@Override @Override
public void onClick(final DialogInterface dialog, final int which) { public void onClick(final DialogInterface dialog, final int which) {
@ -491,7 +489,6 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
@NonNull @NonNull
@Override @Override
public Dialog onCreateDialog(final Bundle savedInstanceState) { public Dialog onCreateDialog(final Bundle savedInstanceState) {
mTwitterWrapper = getApplication().getTwitterWrapper();
final Bundle bundle = savedInstanceState == null ? getArguments() : savedInstanceState; final Bundle bundle = savedInstanceState == null ? getArguments() : savedInstanceState;
mAccountId = bundle != null ? bundle.getLong(EXTRA_ACCOUNT_ID, -1) : -1; mAccountId = bundle != null ? bundle.getLong(EXTRA_ACCOUNT_ID, -1) : -1;
mListId = bundle != null ? bundle.getLong(EXTRA_LIST_ID, -1) : -1; mListId = bundle != null ? bundle.getLong(EXTRA_LIST_ID, -1) : -1;

View File

@ -26,141 +26,146 @@ import android.content.UriMatcher;
import android.database.Cursor; import android.database.Cursor;
import android.database.MatrixCursor; import android.database.MatrixCursor;
import android.net.Uri; import android.net.Uri;
import android.support.annotation.NonNull;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.provider.TwidereCommands.Refresh; import org.mariotaku.twidere.provider.TwidereCommands.Refresh;
import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.PermissionsManager; import org.mariotaku.twidere.util.PermissionsManager;
import org.mariotaku.twidere.util.dagger.component.DaggerTwidereCommandProviderComponent;
import javax.inject.Inject;
public class TwidereCommandProvider extends ContentProvider implements Constants { public class TwidereCommandProvider extends ContentProvider implements Constants {
private static final UriMatcher COMMAND_URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); private static final UriMatcher COMMAND_URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
private static final int CODE_REFRESH_ALL = 10; private static final int CODE_REFRESH_ALL = 10;
private static final int CODE_REFRESH_HOME_TIMELINE = 11; private static final int CODE_REFRESH_HOME_TIMELINE = 11;
private static final int CODE_REFRESH_MENTIONS = 12; private static final int CODE_REFRESH_MENTIONS = 12;
private static final int CODE_REFRESH_INBOX = 13; private static final int CODE_REFRESH_INBOX = 13;
private static final int CODE_REFRESH_OUTBOX = 14; private static final int CODE_REFRESH_OUTBOX = 14;
static { static {
COMMAND_URI_MATCHER.addURI(TwidereCommands.AUTHORITY, Refresh.ACTION_REFRESH_ALL, CODE_REFRESH_ALL); COMMAND_URI_MATCHER.addURI(TwidereCommands.AUTHORITY, Refresh.ACTION_REFRESH_ALL, CODE_REFRESH_ALL);
} }
private Context mContext; private Context mContext;
private PermissionsManager mPermissionsManager; private PermissionsManager mPermissionsManager;
private AsyncTwitterWrapper mTwitterWrapper; @Inject
AsyncTwitterWrapper mTwitterWrapper;
@Override @Override
public int delete(final Uri uri, final String where, final String[] whereArgs) { public int delete(@NonNull final Uri uri, final String where, final String[] whereArgs) {
return 0; return 0;
} }
@Override @Override
public String getType(final Uri uri) { public String getType(@NonNull final Uri uri) {
return null; return null;
} }
@Override @Override
public Uri insert(final Uri uri, final ContentValues values) { public Uri insert(@NonNull final Uri uri, final ContentValues values) {
if (handleInsertCommand(uri, values)) return uri; if (handleInsertCommand(uri, values)) return uri;
return null; return null;
} }
@Override @Override
public boolean onCreate() { public boolean onCreate() {
mContext = getContext(); mContext = getContext();
final TwidereApplication app = TwidereApplication.getInstance(mContext); DaggerTwidereCommandProviderComponent.builder().applicationModule(TwidereApplication.getModule(mContext)).build().inject(this);
mPermissionsManager = new PermissionsManager(mContext); mPermissionsManager = new PermissionsManager(mContext);
mTwitterWrapper = app.getTwitterWrapper(); return true;
return true; }
}
@Override @Override
public Cursor query(final Uri uri, final String[] projection, final String where, final String[] whereArgs, public Cursor query(@NonNull final Uri uri, final String[] projection, final String where, final String[] whereArgs,
final String sortOrder) { final String sortOrder) {
return handleQueryCommand(uri); return handleQueryCommand(uri);
} }
@Override @Override
public int update(final Uri uri, final ContentValues values, final String where, final String[] whereArgs) { public int update(@NonNull final Uri uri, final ContentValues values, final String where, final String[] whereArgs) {
return 0; return 0;
} }
private void checkInsertPermission(final int uri_code) { private void checkInsertPermission(final int uri_code) {
switch (uri_code) { switch (uri_code) {
case CODE_REFRESH_ALL: case CODE_REFRESH_ALL:
case CODE_REFRESH_HOME_TIMELINE: case CODE_REFRESH_HOME_TIMELINE:
case CODE_REFRESH_MENTIONS: case CODE_REFRESH_MENTIONS:
case CODE_REFRESH_INBOX: case CODE_REFRESH_INBOX:
case CODE_REFRESH_OUTBOX: { case CODE_REFRESH_OUTBOX: {
if (!mPermissionsManager.checkCallingPermission(PERMISSION_REFRESH)) if (!mPermissionsManager.checkCallingPermission(PERMISSION_REFRESH))
throw new SecurityException("Executing this command requires level PERMISSION_REFRESH"); throw new SecurityException("Executing this command requires level PERMISSION_REFRESH");
} }
} }
} }
private void checkQueryPermission(final int uri_code) { private void checkQueryPermission(final int uri_code) {
switch (uri_code) { switch (uri_code) {
case CODE_REFRESH_ALL: case CODE_REFRESH_ALL:
case CODE_REFRESH_HOME_TIMELINE: case CODE_REFRESH_HOME_TIMELINE:
case CODE_REFRESH_MENTIONS: case CODE_REFRESH_MENTIONS:
case CODE_REFRESH_INBOX: case CODE_REFRESH_INBOX:
case CODE_REFRESH_OUTBOX: { case CODE_REFRESH_OUTBOX: {
if (!mPermissionsManager.checkCallingPermission(PERMISSION_REFRESH)) if (!mPermissionsManager.checkCallingPermission(PERMISSION_REFRESH))
throw new SecurityException("Executing this command requires level PERMISSION_REFRESH"); throw new SecurityException("Executing this command requires level PERMISSION_REFRESH");
} }
} }
} }
private Cursor getEmptyCursor() { private Cursor getEmptyCursor() {
return new MatrixCursor(new String[0]); return new MatrixCursor(new String[0]);
} }
private boolean handleInsertCommand(final Uri uri, final ContentValues values) { private boolean handleInsertCommand(final Uri uri, final ContentValues values) {
final int uri_code = COMMAND_URI_MATCHER.match(uri); final int uri_code = COMMAND_URI_MATCHER.match(uri);
checkInsertPermission(uri_code); checkInsertPermission(uri_code);
try { try {
switch (uri_code) { switch (uri_code) {
case CODE_REFRESH_ALL: { case CODE_REFRESH_ALL: {
mTwitterWrapper.refreshAll(); mTwitterWrapper.refreshAll();
break; break;
} }
default: default:
return false; return false;
} }
// something blah blah blah // something blah blah blah
} catch (final RuntimeException e) { } catch (final RuntimeException e) {
e.printStackTrace(); e.printStackTrace();
if (Thread.currentThread().getId() != 1) if (Thread.currentThread().getId() != 1)
throw new IllegalStateException("This method cannot be called from non-UI thread"); throw new IllegalStateException("This method cannot be called from non-UI thread");
} }
return true; return true;
} }
private Cursor handleQueryCommand(final Uri uri) { private Cursor handleQueryCommand(final Uri uri) {
final int uri_code = COMMAND_URI_MATCHER.match(uri); final int uri_code = COMMAND_URI_MATCHER.match(uri);
checkQueryPermission(uri_code); checkQueryPermission(uri_code);
try { try {
switch (uri_code) { switch (uri_code) {
case CODE_REFRESH_HOME_TIMELINE: case CODE_REFRESH_HOME_TIMELINE:
if (mTwitterWrapper.isHomeTimelineRefreshing()) return getEmptyCursor(); if (mTwitterWrapper.isHomeTimelineRefreshing()) return getEmptyCursor();
case CODE_REFRESH_MENTIONS: case CODE_REFRESH_MENTIONS:
if (mTwitterWrapper.isMentionsTimelineRefreshing()) return getEmptyCursor(); if (mTwitterWrapper.isMentionsTimelineRefreshing()) return getEmptyCursor();
case CODE_REFRESH_INBOX: case CODE_REFRESH_INBOX:
if (mTwitterWrapper.isReceivedDirectMessagesRefreshing()) return getEmptyCursor(); if (mTwitterWrapper.isReceivedDirectMessagesRefreshing())
case CODE_REFRESH_OUTBOX: return getEmptyCursor();
if (mTwitterWrapper.isSentDirectMessagesRefreshing()) return getEmptyCursor(); case CODE_REFRESH_OUTBOX:
default: if (mTwitterWrapper.isSentDirectMessagesRefreshing()) return getEmptyCursor();
return null; default:
} return null;
// something blah blah blah }
} catch (final RuntimeException e) { // something blah blah blah
e.printStackTrace(); } catch (final RuntimeException e) {
if (Thread.currentThread().getId() != 1) e.printStackTrace();
throw new IllegalStateException("This method cannot be called from non-UI thread"); if (Thread.currentThread().getId() != 1)
} throw new IllegalStateException("This method cannot be called from non-UI thread");
return null; }
} return null;
}
} }

View File

@ -109,6 +109,7 @@ import org.mariotaku.twidere.util.TwidereQueryBuilder.ConversationQueryBuilder;
import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.collection.CompactHashSet; import org.mariotaku.twidere.util.collection.CompactHashSet;
import org.mariotaku.twidere.util.dagger.component.DaggerTwidereDataProviderComponent;
import org.mariotaku.twidere.util.message.UnreadCountUpdatedEvent; import org.mariotaku.twidere.util.message.UnreadCountUpdatedEvent;
import java.io.File; import java.io.File;
@ -122,6 +123,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.inject.Inject;
import static org.mariotaku.twidere.util.Utils.clearAccountColor; import static org.mariotaku.twidere.util.Utils.clearAccountColor;
import static org.mariotaku.twidere.util.Utils.clearAccountName; import static org.mariotaku.twidere.util.Utils.clearAccountName;
import static org.mariotaku.twidere.util.Utils.getAccountIds; import static org.mariotaku.twidere.util.Utils.getAccountIds;
@ -141,7 +144,10 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
@Nullable @Nullable
private NotificationManager mNotificationManager; private NotificationManager mNotificationManager;
private ReadStateManager mReadStateManager; @Inject
ReadStateManager mReadStateManager;
@Inject
AsyncTwitterWrapper mTwitterWrapper;
private SharedPreferencesWrapper mPreferences; private SharedPreferencesWrapper mPreferences;
private ImagePreloader mImagePreloader; private ImagePreloader mImagePreloader;
private Network mNetwork; private Network mNetwork;
@ -165,7 +171,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
}; };
@Override @Override
public int bulkInsert(final Uri uri, @NonNull final ContentValues[] valuesArray) { public int bulkInsert(@NonNull final Uri uri, @NonNull final ContentValues[] valuesArray) {
try { try {
final int tableId = getTableId(uri); final int tableId = getTableId(uri);
final String table = getTableNameById(tableId); final String table = getTableNameById(tableId);
@ -223,7 +229,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
@Override @Override
public int delete(final Uri uri, final String selection, final String[] selectionArgs) { public int delete(@NonNull final Uri uri, final String selection, final String[] selectionArgs) {
try { try {
final int tableId = getTableId(uri); final int tableId = getTableId(uri);
final String table = getTableNameById(tableId); final String table = getTableNameById(tableId);
@ -263,12 +269,12 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
} }
@Override @Override
public String getType(final Uri uri) { public String getType(@NonNull final Uri uri) {
return null; return null;
} }
@Override @Override
public Uri insert(final Uri uri, final ContentValues values) { public Uri insert(@NonNull final Uri uri, final ContentValues values) {
try { try {
final int tableId = getTableId(uri); final int tableId = getTableId(uri);
final String table = getTableNameById(tableId); final String table = getTableNameById(tableId);
@ -412,6 +418,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
@Override @Override
public boolean onCreate() { public boolean onCreate() {
final Context context = getContext(); final Context context = getContext();
DaggerTwidereDataProviderComponent.builder().applicationModule(TwidereApplication.getModule(context)).build().inject(this);
final TwidereApplication app = TwidereApplication.getInstance(context); final TwidereApplication app = TwidereApplication.getInstance(context);
mHandler = new Handler(Looper.getMainLooper()); mHandler = new Handler(Looper.getMainLooper());
mDatabaseWrapper = new SQLiteDatabaseWrapper(this); mDatabaseWrapper = new SQLiteDatabaseWrapper(this);
@ -420,7 +427,6 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
mPreferences.registerOnSharedPreferenceChangeListener(this); mPreferences.registerOnSharedPreferenceChangeListener(this);
updatePreferences(); updatePreferences();
mPermissionsManager = new PermissionsManager(context); mPermissionsManager = new PermissionsManager(context);
mReadStateManager = app.getReadStateManager();
mImagePreloader = new ImagePreloader(context, app.getImageLoader()); mImagePreloader = new ImagePreloader(context, app.getImageLoader());
final IntentFilter filter = new IntentFilter(); final IntentFilter filter = new IntentFilter();
filter.addAction(BROADCAST_HOME_ACTIVITY_ONSTART); filter.addAction(BROADCAST_HOME_ACTIVITY_ONSTART);
@ -445,8 +451,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
} }
@Override @Override
public ParcelFileDescriptor openFile(final Uri uri, final String mode) throws FileNotFoundException { public ParcelFileDescriptor openFile(@NonNull final Uri uri, @NonNull final String mode) throws FileNotFoundException {
if (uri == null || mode == null) throw new IllegalArgumentException();
final int table_id = getTableId(uri); final int table_id = getTableId(uri);
final String table = getTableNameById(table_id); final String table = getTableNameById(table_id);
final int mode_code; final int mode_code;
@ -476,7 +481,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
} }
@Override @Override
public Cursor query(final Uri uri, final String[] projection, final String selection, final String[] selectionArgs, public Cursor query(@NonNull final Uri uri, final String[] projection, final String selection, final String[] selectionArgs,
final String sortOrder) { final String sortOrder) {
try { try {
final int tableId = getTableId(uri); final int tableId = getTableId(uri);
@ -566,8 +571,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
return c; return c;
} }
case VIRTUAL_TABLE_ID_DRAFTS_UNSENT: { case VIRTUAL_TABLE_ID_DRAFTS_UNSENT: {
final TwidereApplication app = TwidereApplication.getInstance(getContext()); final AsyncTwitterWrapper twitter = mTwitterWrapper;
final AsyncTwitterWrapper twitter = app.getTwitterWrapper();
final RawItemArray sendingIds = new RawItemArray(twitter.getSendingDraftIds()); final RawItemArray sendingIds = new RawItemArray(twitter.getSendingDraftIds());
final Expression where; final Expression where;
if (selection != null) { if (selection != null) {
@ -592,7 +596,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
} }
@Override @Override
public int update(final Uri uri, final ContentValues values, final String selection, final String[] selectionArgs) { public int update(@NonNull final Uri uri, final ContentValues values, final String selection, final String[] selectionArgs) {
try { try {
final int tableId = getTableId(uri); final int tableId = getTableId(uri);
final String table = getTableNameById(tableId); final String table = getTableNameById(tableId);

View File

@ -48,8 +48,7 @@ public class NotificationReceiver extends BroadcastReceiver implements Constants
final String tag = getPositionTag(uri.getLastPathSegment()); final String tag = getPositionTag(uri.getLastPathSegment());
if (tag == null) return; if (tag == null) return;
final long accountId = ParseUtils.parseLong(uri.getQueryParameter(QUERY_PARAM_ACCOUNT_ID), -1); final long accountId = ParseUtils.parseLong(uri.getQueryParameter(QUERY_PARAM_ACCOUNT_ID), -1);
final TwidereApplication app = TwidereApplication.getInstance(context); final ReadStateManager manager = TwidereApplication.getModule(context).getReadStateManager();
final ReadStateManager manager = app.getReadStateManager();
final String paramReadPosition, paramReadPositions; final String paramReadPosition, paramReadPositions;
if (!TextUtils.isEmpty(paramReadPosition = uri.getQueryParameter(QUERY_PARAM_READ_POSITION))) { if (!TextUtils.isEmpty(paramReadPosition = uri.getQueryParameter(QUERY_PARAM_READ_POSITION))) {
manager.setPosition(Utils.getReadPositionTagWithAccounts(tag, accountId), manager.setPosition(Utils.getReadPositionTagWithAccounts(tag, accountId),

View File

@ -85,6 +85,7 @@ import org.mariotaku.twidere.util.StatusShortenerInterface;
import org.mariotaku.twidere.util.TwidereValidator; import org.mariotaku.twidere.util.TwidereValidator;
import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.TwitterAPIFactory;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.dagger.component.DaggerBackgroundOperationServiceComponent;
import org.mariotaku.twidere.util.io.ContentLengthInputStream; import org.mariotaku.twidere.util.io.ContentLengthInputStream;
import org.mariotaku.twidere.util.io.ContentLengthInputStream.ReadListener; import org.mariotaku.twidere.util.io.ContentLengthInputStream.ReadListener;
@ -96,6 +97,8 @@ import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import javax.inject.Inject;
import edu.tsinghua.hotmobi.HotMobiLogger; import edu.tsinghua.hotmobi.HotMobiLogger;
import edu.tsinghua.hotmobi.model.TimelineType; import edu.tsinghua.hotmobi.model.TimelineType;
import edu.tsinghua.hotmobi.model.TweetEvent; import edu.tsinghua.hotmobi.model.TweetEvent;
@ -114,7 +117,8 @@ public class BackgroundOperationService extends IntentService implements Constan
private SharedPreferences mPreferences; private SharedPreferences mPreferences;
private ContentResolver mResolver; private ContentResolver mResolver;
private NotificationManager mNotificationManager; private NotificationManager mNotificationManager;
private AsyncTwitterWrapper mTwitter; @Inject
AsyncTwitterWrapper mTwitter;
private MediaUploaderInterface mUploader; private MediaUploaderInterface mUploader;
private StatusShortenerInterface mShortener; private StatusShortenerInterface mShortener;
@ -128,13 +132,13 @@ public class BackgroundOperationService extends IntentService implements Constan
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
DaggerBackgroundOperationServiceComponent.builder().applicationModule(TwidereApplication.getModule(this)).build().inject(this);
final TwidereApplication app = TwidereApplication.getInstance(this); final TwidereApplication app = TwidereApplication.getInstance(this);
mHandler = new Handler(); mHandler = new Handler();
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, MODE_PRIVATE); mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, MODE_PRIVATE);
mValidator = new TwidereValidator(this); mValidator = new TwidereValidator(this);
mResolver = getContentResolver(); mResolver = getContentResolver();
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mTwitter = app.getTwitterWrapper();
final String uploaderComponent = mPreferences.getString(KEY_MEDIA_UPLOADER, null); final String uploaderComponent = mPreferences.getString(KEY_MEDIA_UPLOADER, null);
final String shortenerComponent = mPreferences.getString(KEY_STATUS_SHORTENER, null); final String shortenerComponent = mPreferences.getString(KEY_STATUS_SHORTENER, null);
mUseUploader = !ServicePickerPreference.isNoneValue(uploaderComponent); mUseUploader = !ServicePickerPreference.isNoneValue(uploaderComponent);
@ -222,6 +226,7 @@ public class BackgroundOperationService extends IntentService implements Constan
final Expression where = Expression.equals(Drafts._ID, draftId); final Expression where = Expression.equals(Drafts._ID, draftId);
final ContentResolver cr = getContentResolver(); final ContentResolver cr = getContentResolver();
final Cursor c = cr.query(Drafts.CONTENT_URI, Drafts.COLUMNS, where.getSQL(), null, null); final Cursor c = cr.query(Drafts.CONTENT_URI, Drafts.COLUMNS, where.getSQL(), null, null);
if (c == null) return;
final DraftItem.CursorIndices i = new DraftItem.CursorIndices(c); final DraftItem.CursorIndices i = new DraftItem.CursorIndices(c);
final DraftItem item; final DraftItem item;
try { try {
@ -319,7 +324,7 @@ public class BackgroundOperationService extends IntentService implements Constan
final ContentValues draftValues = ContentValuesCreator.createStatusDraft(item, final ContentValues draftValues = ContentValuesCreator.createStatusDraft(item,
ParcelableAccount.getAccountIds(item.accounts)); ParcelableAccount.getAccountIds(item.accounts));
final Uri draftUri = mResolver.insert(Drafts.CONTENT_URI, draftValues); final Uri draftUri = mResolver.insert(Drafts.CONTENT_URI, draftValues);
final long draftId = ParseUtils.parseLong(draftUri.getLastPathSegment(), -1); final long draftId = draftUri != null ? ParseUtils.parseLong(draftUri.getLastPathSegment(), -1) : -1;
mTwitter.addSendingDraftId(draftId); mTwitter.addSendingDraftId(draftId);
final List<SingleResponse<ParcelableStatus>> result = updateStatus(builder, item); final List<SingleResponse<ParcelableStatus>> result = updateStatus(builder, item);
boolean failed = false; boolean failed = false;

View File

@ -39,9 +39,12 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
import org.mariotaku.twidere.receiver.PowerStateReceiver; import org.mariotaku.twidere.receiver.PowerStateReceiver;
import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.dagger.component.DaggerRefreshServiceComponent;
import java.util.Arrays; import java.util.Arrays;
import javax.inject.Inject;
import edu.tsinghua.hotmobi.HotMobiLogger; import edu.tsinghua.hotmobi.HotMobiLogger;
import static org.mariotaku.twidere.util.ParseUtils.parseInt; import static org.mariotaku.twidere.util.ParseUtils.parseInt;
@ -59,7 +62,8 @@ public class RefreshService extends Service implements Constants {
private SharedPreferencesWrapper mPreferences; private SharedPreferencesWrapper mPreferences;
private AlarmManager mAlarmManager; private AlarmManager mAlarmManager;
private AsyncTwitterWrapper mTwitterWrapper; @Inject
AsyncTwitterWrapper mTwitterWrapper;
private PendingIntent mPendingRefreshHomeTimelineIntent, mPendingRefreshMentionsIntent, private PendingIntent mPendingRefreshHomeTimelineIntent, mPendingRefreshMentionsIntent,
mPendingRefreshDirectMessagesIntent, mPendingRefreshTrendsIntent; mPendingRefreshDirectMessagesIntent, mPendingRefreshTrendsIntent;
@ -148,9 +152,9 @@ public class RefreshService extends Service implements Constants {
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
DaggerRefreshServiceComponent.builder().applicationModule(TwidereApplication.getModule(this)).build().inject(this);
mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
final TwidereApplication app = TwidereApplication.getInstance(this); final TwidereApplication app = TwidereApplication.getInstance(this);
mTwitterWrapper = app.getTwitterWrapper();
mPreferences = SharedPreferencesWrapper.getInstance(app, SHARED_PREFERENCES_NAME, MODE_PRIVATE); mPreferences = SharedPreferencesWrapper.getInstance(app, SHARED_PREFERENCES_NAME, MODE_PRIVATE);
mPendingRefreshHomeTimelineIntent = PendingIntent.getBroadcast(this, 0, new Intent( mPendingRefreshHomeTimelineIntent = PendingIntent.getBroadcast(this, 0, new Intent(
BROADCAST_REFRESH_HOME_TIMELINE), 0); BROADCAST_REFRESH_HOME_TIMELINE), 0);

View File

@ -0,0 +1,51 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 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.util;
import android.app.Activity;
import java.util.HashSet;
/**
* Created by mariotaku on 15/10/5.
*/
public class ActivityStack {
private final HashSet<Integer> mInternalStack = new HashSet<>();
public void dispatchStart(Activity activity) {
mInternalStack.add(System.identityHashCode(activity));
}
public void dispatchStop(Activity activity) {
mInternalStack.remove(System.identityHashCode(activity));
}
public int size() {
return mInternalStack.size();
}
public boolean isEmpty() {
return mInternalStack.isEmpty();
}
}

View File

@ -286,11 +286,6 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
return true; return true;
} }
public static AsyncTwitterWrapper getInstance(final Context context) {
final TwidereApplication application = TwidereApplication.getInstance(context);
return application.getTwitterWrapper();
}
public int getLocalTrendsAsync(final long accountId, final int woeid) { public int getLocalTrendsAsync(final long accountId, final int woeid) {
mAsyncTaskManager.cancel(mGetLocalTrendsTaskId); mAsyncTaskManager.cancel(mGetLocalTrendsTaskId);
final GetLocalTrendsTask task = new GetLocalTrendsTask(accountId, woeid); final GetLocalTrendsTask task = new GetLocalTrendsTask(accountId, woeid);

View File

@ -40,6 +40,7 @@ import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.provider.TwidereDataStore.Filters; import org.mariotaku.twidere.provider.TwidereDataStore.Filters;
import org.mariotaku.twidere.util.dagger.component.DaggerGeneralComponent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -49,6 +50,8 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
import javax.inject.Inject;
import static org.mariotaku.twidere.util.Utils.getAccountScreenNames; import static org.mariotaku.twidere.util.Utils.getAccountScreenNames;
import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkDelete; import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkDelete;
import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkInsert; import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkInsert;
@ -58,7 +61,8 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback,
private TwidereApplication mApplication; private TwidereApplication mApplication;
private AsyncTwitterWrapper mTwitterWrapper; @Inject
AsyncTwitterWrapper mTwitterWrapper;
private MultiSelectManager mMultiSelectManager; private MultiSelectManager mMultiSelectManager;
@ -71,6 +75,7 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback,
public static final int MENU_GROUP = 201; public static final int MENU_GROUP = 201;
public MultiSelectEventHandler(final BaseAppCompatActivity activity) { public MultiSelectEventHandler(final BaseAppCompatActivity activity) {
DaggerGeneralComponent.builder().applicationModule(TwidereApplication.getModule(activity)).build().inject(this);
mActivity = activity; mActivity = activity;
} }
@ -79,7 +84,6 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback,
*/ */
public void dispatchOnCreate() { public void dispatchOnCreate() {
mApplication = mActivity.getTwidereApplication(); mApplication = mActivity.getTwidereApplication();
mTwitterWrapper = mApplication.getTwitterWrapper();
mMultiSelectManager = mApplication.getMultiSelectManager(); mMultiSelectManager = mApplication.getMultiSelectManager();
} }

View File

@ -3362,9 +3362,6 @@ public final class Utils implements Constants {
private static boolean isMyStatus(ParcelableStatus status) { private static boolean isMyStatus(ParcelableStatus status) {
if (isMyRetweet(status)) return true; if (isMyRetweet(status)) return true;
if (status.is_quote) {
return status.account_id == status.quoted_user_id;
}
return status.account_id == status.user_id; return status.account_id == status.user_id;
} }

View File

@ -0,0 +1,72 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 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.util.dagger;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.util.ActivityStack;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ReadStateManager;
import dagger.Module;
import dagger.Provides;
/**
* Created by mariotaku on 15/10/5.
*/
@Module
public class ApplicationModule {
private final ActivityStack activityStack;
private final AsyncTwitterWrapper asyncTwitterWrapper;
private final ReadStateManager readStateManager;
public ApplicationModule(TwidereApplication application) {
activityStack = new ActivityStack();
asyncTwitterWrapper = new AsyncTwitterWrapper(application);
readStateManager = new ReadStateManager(application);
}
@Provides
ActivityStack provideActivityStack() {
return activityStack;
}
@Provides
AsyncTwitterWrapper provideAsyncTwitterWrapper() {
return asyncTwitterWrapper;
}
@Provides
ReadStateManager provideReadStateManager() {
return readStateManager;
}
public ActivityStack getActivityStack() {
return activityStack;
}
public AsyncTwitterWrapper getAsyncTwitterWrapper() {
return asyncTwitterWrapper;
}
public ReadStateManager getReadStateManager() {
return readStateManager;
}
}

View File

@ -0,0 +1,33 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 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.util.dagger.component;
import org.mariotaku.twidere.service.BackgroundOperationService;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
import dagger.Component;
/**
* Created by mariotaku on 15/10/5.
*/
@Component(modules = ApplicationModule.class)
public interface BackgroundOperationServiceComponent {
void inject(BackgroundOperationService object);
}

View File

@ -0,0 +1,35 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 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.util.dagger.component;
import android.support.v7.widget.RecyclerView;
import org.mariotaku.twidere.adapter.BaseAdapter;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
import dagger.Component;
/**
* Created by mariotaku on 15/10/5.
*/
@Component(modules = ApplicationModule.class)
public interface BaseAdapterComponent {
void inject(BaseAdapter<RecyclerView.ViewHolder> object);
}

View File

@ -0,0 +1,33 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 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.util.dagger.component;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
import dagger.Component;
/**
* Created by mariotaku on 15/10/5.
*/
@Component(modules = ApplicationModule.class)
public interface BaseAppCompatActivityComponent {
void inject(BaseAppCompatActivity object);
}

View File

@ -0,0 +1,33 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 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.util.dagger.component;
import org.mariotaku.twidere.fragment.BaseListFragment;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
import dagger.Component;
/**
* Created by mariotaku on 15/10/5.
*/
@Component(modules = ApplicationModule.class)
public interface BaseListFragmentComponent {
void inject(BaseListFragment object);
}

View File

@ -0,0 +1,33 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 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.util.dagger.component;
import org.mariotaku.twidere.fragment.support.BaseSupportDialogFragment;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
import dagger.Component;
/**
* Created by mariotaku on 15/10/5.
*/
@Component(modules = ApplicationModule.class)
public interface BaseSupportDialogFragmentComponent {
void inject(BaseSupportDialogFragment object);
}

View File

@ -0,0 +1,42 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 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.util.dagger.component;
import org.mariotaku.twidere.fragment.BaseFragment;
import org.mariotaku.twidere.fragment.support.BaseSupportFragment;
import org.mariotaku.twidere.util.MultiSelectEventHandler;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
import org.mariotaku.twidere.view.holder.StatusViewHolder;
import dagger.Component;
/**
* Created by mariotaku on 15/10/5.
*/
@Component(modules = ApplicationModule.class)
public interface GeneralComponent {
void inject(StatusViewHolder.DummyStatusHolderAdapter object);
void inject(BaseFragment object);
void inject(BaseSupportFragment object);
void inject(MultiSelectEventHandler object);
}

View File

@ -0,0 +1,33 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 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.util.dagger.component;
import org.mariotaku.twidere.service.RefreshService;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
import dagger.Component;
/**
* Created by mariotaku on 15/10/5.
*/
@Component(modules = ApplicationModule.class)
public interface RefreshServiceComponent {
void inject(RefreshService object);
}

View File

@ -0,0 +1,33 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 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.util.dagger.component;
import org.mariotaku.twidere.activity.support.ThemedFragmentActivity;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
import dagger.Component;
/**
* Created by mariotaku on 15/10/5.
*/
@Component(modules = ApplicationModule.class)
public interface ThemedFragmentActivityComponent {
void inject(ThemedFragmentActivity object);
}

View File

@ -0,0 +1,34 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 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.util.dagger.component;
import org.mariotaku.twidere.provider.TwidereCommandProvider;
import org.mariotaku.twidere.provider.TwidereDataProvider;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
import dagger.Component;
/**
* Created by mariotaku on 15/10/5.
*/
@Component(modules = ApplicationModule.class)
public interface TwidereCommandProviderComponent {
void inject(TwidereCommandProvider object);
}

View File

@ -0,0 +1,33 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 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.util.dagger.component;
import org.mariotaku.twidere.provider.TwidereDataProvider;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
import dagger.Component;
/**
* Created by mariotaku on 15/10/5.
*/
@Component(modules = ApplicationModule.class)
public interface TwidereDataProviderComponent {
void inject(TwidereDataProvider object);
}

View File

@ -31,6 +31,7 @@ import org.mariotaku.twidere.util.TwidereLinkify;
import org.mariotaku.twidere.util.TwitterCardUtils; import org.mariotaku.twidere.util.TwitterCardUtils;
import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.dagger.component.DaggerGeneralComponent;
import org.mariotaku.twidere.view.CardMediaContainer; import org.mariotaku.twidere.view.CardMediaContainer;
import org.mariotaku.twidere.view.CardMediaContainer.OnMediaClickListener; import org.mariotaku.twidere.view.CardMediaContainer.OnMediaClickListener;
import org.mariotaku.twidere.view.ForegroundColorView; import org.mariotaku.twidere.view.ForegroundColorView;
@ -40,6 +41,8 @@ import org.mariotaku.twidere.view.iface.IColorLabelView;
import java.util.Locale; import java.util.Locale;
import javax.inject.Inject;
import static org.mariotaku.twidere.util.HtmlEscapeHelper.toPlainText; import static org.mariotaku.twidere.util.HtmlEscapeHelper.toPlainText;
import static org.mariotaku.twidere.util.Utils.getUserTypeIconRes; import static org.mariotaku.twidere.util.Utils.getUserTypeIconRes;
@ -451,7 +454,8 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi
private final SharedPreferencesWrapper preferences; private final SharedPreferencesWrapper preferences;
private final MediaLoaderWrapper loader; private final MediaLoaderWrapper loader;
private final MediaLoadingHandler handler; private final MediaLoadingHandler handler;
private final AsyncTwitterWrapper twitter; @Inject
AsyncTwitterWrapper twitter;
private final TwidereLinkify linkify; private final TwidereLinkify linkify;
private final UserColorNameManager manager; private final UserColorNameManager manager;
@ -467,12 +471,12 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi
private boolean shouldShowAccountsColor; private boolean shouldShowAccountsColor;
public DummyStatusHolderAdapter(Context context) { public DummyStatusHolderAdapter(Context context) {
DaggerGeneralComponent.builder().applicationModule(TwidereApplication.getModule(context)).build().inject(this);
this.context = context; this.context = context;
preferences = SharedPreferencesWrapper.getInstance(context, SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); preferences = SharedPreferencesWrapper.getInstance(context, SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
final TwidereApplication app = TwidereApplication.getInstance(context); final TwidereApplication app = TwidereApplication.getInstance(context);
loader = app.getMediaLoaderWrapper(); loader = app.getMediaLoaderWrapper();
handler = new MediaLoadingHandler(R.id.media_preview_progress); handler = new MediaLoadingHandler(R.id.media_preview_progress);
twitter = app.getTwitterWrapper();
manager = app.getUserColorNameManager(); manager = app.getUserColorNameManager();
linkify = new TwidereLinkify(null); linkify = new TwidereLinkify(null);
updateOptions(); updateOptions();

View File

@ -18,7 +18,7 @@
--> -->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/status_container" android:id="@+id/status_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -32,42 +32,53 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout <RelativeLayout
android:id="@+id/comment_container" android:id="@+id/comment_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:orientation="horizontal">
<org.mariotaku.twidere.view.ComposeMaterialEditText <org.mariotaku.twidere.view.ComposeMaterialEditText
android:id="@+id/edit_comment" android:id="@+id/edit_comment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1"
android:completionThreshold="1" android:completionThreshold="1"
android:focusable="true" android:focusable="true"
android:hint="@string/comment_hint" android:hint="@string/comment_hint"
android:inputType="textShortMessage|textMultiLine" android:inputType="textShortMessage|textMultiLine"
android:singleLine="false" android:singleLine="false"
android:visibility="visible" android:visibility="visible">
app:met_baseColor="?android:textColorSecondary"
app:met_helperTextColor="?android:textColorSecondary"
app:met_maxCharacters="140"
app:met_textColor="?android:textColorPrimary"
app:met_textColorHint="?android:textColorTertiary">
<requestFocus /> <requestFocus />
</org.mariotaku.twidere.view.ComposeMaterialEditText> </org.mariotaku.twidere.view.ComposeMaterialEditText>
<org.mariotaku.twidere.view.StatusTextCountView
android:id="@+id/comment_text_count"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/comment_menu"
android:layout_alignLeft="@+id/edit_comment"
android:layout_alignStart="@+id/edit_comment"
android:layout_alignTop="@+id/comment_menu"
android:layout_below="@+id/edit_comment"
android:layout_toLeftOf="@+id/comment_menu"
android:layout_toStartOf="@+id/comment_menu"
android:gravity="center_vertical|start"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
tools:text="140" />
<org.mariotaku.twidere.view.ActionIconButton <org.mariotaku.twidere.view.ActionIconButton
android:id="@+id/comment_menu" android:id="@+id/comment_menu"
style="?cardActionButtonStyle" style="?cardActionButtonStyle"
android:layout_width="@dimen/element_size_normal" android:layout_width="@dimen/element_size_normal"
android:layout_height="@dimen/element_size_normal" android:layout_height="@dimen/element_size_normal"
android:layout_weight="0" android:layout_alignEnd="@+id/edit_comment"
android:layout_alignRight="@+id/edit_comment"
android:layout_below="@+id/edit_comment"
android:color="?android:textColorTertiary" android:color="?android:textColorTertiary"
android:focusable="false" android:focusable="false"
android:src="@drawable/ic_action_more_vertical" /> android:src="@drawable/ic_action_more_vertical" />
</LinearLayout> </RelativeLayout>
<include layout="@layout/card_item_status_common" /> <include layout="@layout/card_item_status_common" />
</LinearLayout> </LinearLayout>