From 5ed6e2bea846532d6ac291508f27ce3beba102c1 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sun, 31 Dec 2017 17:56:35 +0800 Subject: [PATCH] add: logout button on drawer menu --- app/release/output.json | 2 +- app/src/main/AndroidManifest.xml | 5 - .../stardust/scriptdroid/network/NodeBB.java | 11 +- .../scriptdroid/network/UserService.java | 92 +- .../scriptdroid/network/api/UserApi.java | 2 + .../scriptdroid/network/entity/user/User.java | 1170 +++++++++-------- .../ui/main/drawer/CommunityDrawerMenu.java | 86 +- .../ui/main/drawer/DrawerFragment.java | 12 +- .../ui/main/drawer/DrawerMenuGroup.java | 2 +- .../ui/main/drawer/DrawerMenuItem.java | 15 + .../ic_exit_to_app_black_24dp.png | Bin 0 -> 251 bytes .../ic_exit_to_app_black_24dp.png | Bin 0 -> 171 bytes .../ic_exit_to_app_black_24dp.png | Bin 0 -> 246 bytes .../ic_exit_to_app_black_24dp.png | Bin 0 -> 354 bytes .../ic_exit_to_app_black_24dp.png | Bin 0 -> 432 bytes app/src/main/res/values/strings.xml | 2 + autojs/src/main/AndroidManifest.xml | 6 + .../autojs/core/image/ImageWrapper.java | 3 + .../stardust/autojs/runtime/api/Images.java | 1 + autojs/src/main/res/values/styles.xml | 10 + .../main/java/com/stardust/util/Objects.java | 27 + 21 files changed, 839 insertions(+), 607 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_exit_to_app_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_exit_to_app_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_exit_to_app_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_exit_to_app_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_exit_to_app_black_24dp.png create mode 100644 common/src/main/java/com/stardust/util/Objects.java diff --git a/app/release/output.json b/app/release/output.json index aaa06e73..07c41bed 100644 --- a/app/release/output.json +++ b/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":34},"path":"inrt-release.apk","properties":{"packageId":"com.stardust.auojs.inrt","split":"","minSdkVersion":"17"}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":239},"path":"release-3.0.0 Alpha39.apk","properties":{"packageId":"com.stardust.scriptdroid","split":"","minSdkVersion":"17"}}] \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5d7514d1..aff48fd8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -95,11 +95,6 @@ - login(String userName, final String password) { return NodeBB.getInstance() .getConfig() - .flatMap(config -> { - return mRetrofit.create(UserApi.class) - .login(Collections.singletonMap("x-csrf-token", config.getCsrfToken()), - userName, password); - }); + .flatMap(config -> + mRetrofit.create(UserApi.class) + .login(Collections.singletonMap("x-csrf-token", config.getCsrfToken()), + userName, password) + .doOnError(error -> { + if (error instanceof HttpException && ((HttpException) error).code() == 403) { + NodeBB.getInstance().invalidateConfig(); + } + })) + .doOnComplete(this::refreshOnlineStatus); } + public Observable register(String email, String userName, String password) { return NodeBB.getInstance() .getConfig() @@ -46,4 +71,55 @@ public class UserService { .register(Collections.singletonMap("x-csrf-token", config.getCsrfToken()), email, userName, password, password)); } + + public boolean isOnline() { + return mUser != null; + } + + private void setUser(User user) { + User old = mUser; + mUser = user; + if (!Objects.equals(old, mUser)) { + if (user == null) { + NodeBB.getInstance().invalidateConfig(); + } + EventBus.getDefault().post(new LoginStateChange(user != null)); + } + } + + public Observable refreshOnlineStatus() { + PublishSubject online = PublishSubject.create(); + mRetrofit.create(UserApi.class) + .me() + .subscribeOn(Schedulers.io()) + .subscribe(user -> { + setUser(user); + online.onNext(true); + online.onComplete(); + }, error -> { + setUser(null); + online.onNext(false); + online.onComplete(); + }); + return online; + } + + public Observable logout() { + return NodeBB.getInstance() + .getConfig() + .flatMap(config -> + mRetrofit.create(UserApi.class) + .logout(Collections.singletonMap("x-csrf-token", config.getCsrfToken())) + ) + .doOnError(Throwable::printStackTrace) + .doOnComplete(this::refreshOnlineStatus); + } + + public Observable me() { + return NodeBB.getInstance().getRetrofit() + .create(UserApi.class) + .me() + .doOnNext(this::setUser) + .doOnError(error -> setUser(null)); + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/network/api/UserApi.java b/app/src/main/java/com/stardust/scriptdroid/network/api/UserApi.java index 042e8e23..4c55c16e 100644 --- a/app/src/main/java/com/stardust/scriptdroid/network/api/UserApi.java +++ b/app/src/main/java/com/stardust/scriptdroid/network/api/UserApi.java @@ -31,4 +31,6 @@ public interface UserApi { @Field("username") String userName, @Field("password") String password, @Field("password-confirm") String repeatPassword); + @POST("/logout") + Observable logout(@HeaderMap Map csrfToken); } diff --git a/app/src/main/java/com/stardust/scriptdroid/network/entity/user/User.java b/app/src/main/java/com/stardust/scriptdroid/network/entity/user/User.java index 30d433b4..c6bb1063 100644 --- a/app/src/main/java/com/stardust/scriptdroid/network/entity/user/User.java +++ b/app/src/main/java/com/stardust/scriptdroid/network/entity/user/User.java @@ -1,746 +1,756 @@ package com.stardust.scriptdroid.network.entity.user; import java.util.List; + import com.google.gson.annotations.SerializedName; +import com.stardust.util.Objects; -public class User{ +public class User { - @SerializedName("websiteLink") - private String websiteLink; + @SerializedName("websiteLink") + private String websiteLink; - @SerializedName("reputation") - private String reputation; + @SerializedName("reputation") + private String reputation; - @SerializedName("sso") - private List sso; + @SerializedName("sso") + private List sso; - @SerializedName("icon:text") - private String iconText; + @SerializedName("icon:text") + private String iconText; - @SerializedName("isGlobalModerator") - private boolean isGlobalModerator; + @SerializedName("isGlobalModerator") + private boolean isGlobalModerator; - @SerializedName("joindate") - private String joindate; + @SerializedName("joindate") + private String joindate; - @SerializedName("profile_links") - private List profileLinks; + @SerializedName("profile_links") + private List profileLinks; - @SerializedName("reputation:disabled") - private boolean reputationDisabled; + @SerializedName("reputation:disabled") + private boolean reputationDisabled; - @SerializedName("isAdmin") - private boolean isAdmin; + @SerializedName("isAdmin") + private boolean isAdmin; - @SerializedName("moderationNote") - private String moderationNote; + @SerializedName("moderationNote") + private String moderationNote; - @SerializedName("ips") - private List ips; + @SerializedName("ips") + private List ips; - @SerializedName("aboutme") - private String aboutme; + @SerializedName("aboutme") + private String aboutme; - @SerializedName("isTargetAdmin") - private boolean isTargetAdmin; + @SerializedName("isTargetAdmin") + private boolean isTargetAdmin; - @SerializedName("email:confirmed") - private boolean emailConfirmed; + @SerializedName("email:confirmed") + private boolean emailConfirmed; - @SerializedName("isAdminOrGlobalModerator") - private boolean isAdminOrGlobalModerator; + @SerializedName("isAdminOrGlobalModerator") + private boolean isAdminOrGlobalModerator; - @SerializedName("emailClass") - private String emailClass; + @SerializedName("emailClass") + private String emailClass; - @SerializedName("downvote:disabled") - private boolean downvoteDisabled; + @SerializedName("downvote:disabled") + private boolean downvoteDisabled; - @SerializedName("topiccount") - private String topiccount; + @SerializedName("topiccount") + private String topiccount; - @SerializedName("isSelf") - private boolean isSelf; + @SerializedName("isSelf") + private boolean isSelf; - @SerializedName("status") - private String status; + @SerializedName("status") + private String status; - @SerializedName("birthday") - private String birthday; + @SerializedName("birthday") + private String birthday; - @SerializedName("showHidden") - private boolean showHidden; + @SerializedName("showHidden") + private boolean showHidden; - @SerializedName("yourid") - private int yourid; + @SerializedName("yourid") + private int yourid; - @SerializedName("lastposttime") - private String lastposttime; + @SerializedName("lastposttime") + private String lastposttime; - @SerializedName("isModerator") - private boolean isModerator; + @SerializedName("isModerator") + private boolean isModerator; - @SerializedName("signature") - private String signature; + @SerializedName("signature") + private String signature; - @SerializedName("icon:bgColor") - private String iconBgColor; + @SerializedName("icon:bgColor") + private String iconBgColor; - @SerializedName("canEdit") - private boolean canEdit; + @SerializedName("canEdit") + private boolean canEdit; - @SerializedName("groupTitle") - private String groupTitle; + @SerializedName("groupTitle") + private String groupTitle; - @SerializedName("followingCount") - private int followingCount; + @SerializedName("followingCount") + private int followingCount; - @SerializedName("lastonlineISO") - private String lastonlineISO; + @SerializedName("lastonlineISO") + private String lastonlineISO; - @SerializedName("email:disableEdit") - private boolean emailDisableEdit; + @SerializedName("email:disableEdit") + private boolean emailDisableEdit; - @SerializedName("uid") - private String uid; + @SerializedName("uid") + private String uid; - @SerializedName("canChangePassword") - private boolean canChangePassword; + @SerializedName("canChangePassword") + private boolean canChangePassword; - @SerializedName("profileviews") - private String profileviews; + @SerializedName("profileviews") + private String profileviews; - @SerializedName("cover:url") - private String coverUrl; + @SerializedName("cover:url") + private String coverUrl; - @SerializedName("banned") - private boolean banned; + @SerializedName("banned") + private boolean banned; - @SerializedName("userslug") - private String userslug; + @SerializedName("userslug") + private String userslug; - @SerializedName("followerCount") - private int followerCount; + @SerializedName("followerCount") + private int followerCount; - @SerializedName("email") - private String email; + @SerializedName("email") + private String email; - @SerializedName("website") - private String website; + @SerializedName("website") + private String website; - @SerializedName("isFollowing") - private boolean isFollowing; + @SerializedName("isFollowing") + private boolean isFollowing; - @SerializedName("uploadedpicture") - private String uploadedpicture; + @SerializedName("uploadedpicture") + private String uploadedpicture; - @SerializedName("passwordExpiry") - private String passwordExpiry; + @SerializedName("passwordExpiry") + private String passwordExpiry; - @SerializedName("canBan") - private boolean canBan; + @SerializedName("canBan") + private boolean canBan; - @SerializedName("lastonline") - private String lastonline; + @SerializedName("lastonline") + private String lastonline; - @SerializedName("disableSignatures") - private boolean disableSignatures; + @SerializedName("disableSignatures") + private boolean disableSignatures; - @SerializedName("groups") - private List groups; + @SerializedName("groups") + private List groups; - @SerializedName("username:disableEdit") - private boolean usernameDisableEdit; + @SerializedName("username:disableEdit") + private boolean usernameDisableEdit; - @SerializedName("picture") - private String picture; + @SerializedName("picture") + private String picture; - @SerializedName("joindateISO") - private String joindateISO; + @SerializedName("joindateISO") + private String joindateISO; - @SerializedName("isSelfOrAdminOrGlobalModerator") - private boolean isSelfOrAdminOrGlobalModerator; + @SerializedName("isSelfOrAdminOrGlobalModerator") + private boolean isSelfOrAdminOrGlobalModerator; - @SerializedName("websiteName") - private String websiteName; + @SerializedName("websiteName") + private String websiteName; - @SerializedName("isAdminOrGlobalModeratorOrModerator") - private boolean isAdminOrGlobalModeratorOrModerator; + @SerializedName("isAdminOrGlobalModeratorOrModerator") + private boolean isAdminOrGlobalModeratorOrModerator; - @SerializedName("cover:position") - private String coverPosition; + @SerializedName("cover:position") + private String coverPosition; - @SerializedName("postcount") - private String postcount; + @SerializedName("postcount") + private String postcount; - @SerializedName("location") - private String location; + @SerializedName("location") + private String location; - @SerializedName("fullname") - private String fullname; + @SerializedName("fullname") + private String fullname; - @SerializedName("age") - private int age; + @SerializedName("age") + private int age; - @SerializedName("theirid") - private String theirid; + @SerializedName("theirid") + private String theirid; - @SerializedName("username") - private String username; + @SerializedName("username") + private String username; - public void setWebsiteLink(String websiteLink){ - this.websiteLink = websiteLink; - } + public void setWebsiteLink(String websiteLink) { + this.websiteLink = websiteLink; + } - public String getWebsiteLink(){ - return websiteLink; - } + public String getWebsiteLink() { + return websiteLink; + } - public void setReputation(String reputation){ - this.reputation = reputation; - } + public void setReputation(String reputation) { + this.reputation = reputation; + } - public String getReputation(){ - return reputation; - } + public String getReputation() { + return reputation; + } - public void setSso(List sso){ - this.sso = sso; - } + public void setSso(List sso) { + this.sso = sso; + } - public List getSso(){ - return sso; - } + public List getSso() { + return sso; + } - public void setIconText(String iconText){ - this.iconText = iconText; - } + public void setIconText(String iconText) { + this.iconText = iconText; + } - public String getIconText(){ - return iconText; - } + public String getIconText() { + return iconText; + } - public void setIsGlobalModerator(boolean isGlobalModerator){ - this.isGlobalModerator = isGlobalModerator; - } + public void setIsGlobalModerator(boolean isGlobalModerator) { + this.isGlobalModerator = isGlobalModerator; + } - public boolean isIsGlobalModerator(){ - return isGlobalModerator; - } + public boolean isIsGlobalModerator() { + return isGlobalModerator; + } - public void setJoindate(String joindate){ - this.joindate = joindate; - } + public void setJoindate(String joindate) { + this.joindate = joindate; + } - public String getJoindate(){ - return joindate; - } + public String getJoindate() { + return joindate; + } - public void setProfileLinks(List profileLinks){ - this.profileLinks = profileLinks; - } + public void setProfileLinks(List profileLinks) { + this.profileLinks = profileLinks; + } - public List getProfileLinks(){ - return profileLinks; - } + public List getProfileLinks() { + return profileLinks; + } - public void setReputationDisabled(boolean reputationDisabled){ - this.reputationDisabled = reputationDisabled; - } + public void setReputationDisabled(boolean reputationDisabled) { + this.reputationDisabled = reputationDisabled; + } - public boolean isReputationDisabled(){ - return reputationDisabled; - } + public boolean isReputationDisabled() { + return reputationDisabled; + } - public void setIsAdmin(boolean isAdmin){ - this.isAdmin = isAdmin; - } + public void setIsAdmin(boolean isAdmin) { + this.isAdmin = isAdmin; + } - public boolean isIsAdmin(){ - return isAdmin; - } + public boolean isIsAdmin() { + return isAdmin; + } - public void setModerationNote(String moderationNote){ - this.moderationNote = moderationNote; - } + public void setModerationNote(String moderationNote) { + this.moderationNote = moderationNote; + } - public String getModerationNote(){ - return moderationNote; - } + public String getModerationNote() { + return moderationNote; + } - public void setIps(List ips){ - this.ips = ips; - } + public void setIps(List ips) { + this.ips = ips; + } - public List getIps(){ - return ips; - } + public List getIps() { + return ips; + } - public void setAboutme(String aboutme){ - this.aboutme = aboutme; - } + public void setAboutme(String aboutme) { + this.aboutme = aboutme; + } - public String getAboutme(){ - return aboutme; - } + public String getAboutme() { + return aboutme; + } - public void setIsTargetAdmin(boolean isTargetAdmin){ - this.isTargetAdmin = isTargetAdmin; - } + public void setIsTargetAdmin(boolean isTargetAdmin) { + this.isTargetAdmin = isTargetAdmin; + } - public boolean isIsTargetAdmin(){ - return isTargetAdmin; - } + public boolean isIsTargetAdmin() { + return isTargetAdmin; + } - public void setEmailConfirmed(boolean emailConfirmed){ - this.emailConfirmed = emailConfirmed; - } + public void setEmailConfirmed(boolean emailConfirmed) { + this.emailConfirmed = emailConfirmed; + } - public boolean isEmailConfirmed(){ - return emailConfirmed; - } + public boolean isEmailConfirmed() { + return emailConfirmed; + } - public void setIsAdminOrGlobalModerator(boolean isAdminOrGlobalModerator){ - this.isAdminOrGlobalModerator = isAdminOrGlobalModerator; - } + public void setIsAdminOrGlobalModerator(boolean isAdminOrGlobalModerator) { + this.isAdminOrGlobalModerator = isAdminOrGlobalModerator; + } - public boolean isIsAdminOrGlobalModerator(){ - return isAdminOrGlobalModerator; - } + public boolean isIsAdminOrGlobalModerator() { + return isAdminOrGlobalModerator; + } - public void setEmailClass(String emailClass){ - this.emailClass = emailClass; - } + public void setEmailClass(String emailClass) { + this.emailClass = emailClass; + } - public String getEmailClass(){ - return emailClass; - } + public String getEmailClass() { + return emailClass; + } - public void setDownvoteDisabled(boolean downvoteDisabled){ - this.downvoteDisabled = downvoteDisabled; - } + public void setDownvoteDisabled(boolean downvoteDisabled) { + this.downvoteDisabled = downvoteDisabled; + } - public boolean isDownvoteDisabled(){ - return downvoteDisabled; - } + public boolean isDownvoteDisabled() { + return downvoteDisabled; + } - public void setTopiccount(String topiccount){ - this.topiccount = topiccount; - } + public void setTopiccount(String topiccount) { + this.topiccount = topiccount; + } - public String getTopiccount(){ - return topiccount; - } + public String getTopiccount() { + return topiccount; + } - public void setIsSelf(boolean isSelf){ - this.isSelf = isSelf; - } + public void setIsSelf(boolean isSelf) { + this.isSelf = isSelf; + } - public boolean isIsSelf(){ - return isSelf; - } + public boolean isIsSelf() { + return isSelf; + } - public void setStatus(String status){ - this.status = status; - } + public void setStatus(String status) { + this.status = status; + } - public String getStatus(){ - return status; - } + public String getStatus() { + return status; + } - public void setBirthday(String birthday){ - this.birthday = birthday; - } + public void setBirthday(String birthday) { + this.birthday = birthday; + } - public String getBirthday(){ - return birthday; - } + public String getBirthday() { + return birthday; + } - public void setShowHidden(boolean showHidden){ - this.showHidden = showHidden; - } + public void setShowHidden(boolean showHidden) { + this.showHidden = showHidden; + } - public boolean isShowHidden(){ - return showHidden; - } + public boolean isShowHidden() { + return showHidden; + } - public void setYourid(int yourid){ - this.yourid = yourid; - } + public void setYourid(int yourid) { + this.yourid = yourid; + } - public int getYourid(){ - return yourid; - } + public int getYourid() { + return yourid; + } - public void setLastposttime(String lastposttime){ - this.lastposttime = lastposttime; - } + public void setLastposttime(String lastposttime) { + this.lastposttime = lastposttime; + } - public String getLastposttime(){ - return lastposttime; - } + public String getLastposttime() { + return lastposttime; + } - public void setIsModerator(boolean isModerator){ - this.isModerator = isModerator; - } + public void setIsModerator(boolean isModerator) { + this.isModerator = isModerator; + } - public boolean isIsModerator(){ - return isModerator; - } + public boolean isIsModerator() { + return isModerator; + } - public void setSignature(String signature){ - this.signature = signature; - } + public void setSignature(String signature) { + this.signature = signature; + } - public String getSignature(){ - return signature; - } + public String getSignature() { + return signature; + } - public void setIconBgColor(String iconBgColor){ - this.iconBgColor = iconBgColor; - } + public void setIconBgColor(String iconBgColor) { + this.iconBgColor = iconBgColor; + } - public String getIconBgColor(){ - return iconBgColor; - } + public String getIconBgColor() { + return iconBgColor; + } - public void setCanEdit(boolean canEdit){ - this.canEdit = canEdit; - } + public void setCanEdit(boolean canEdit) { + this.canEdit = canEdit; + } - public boolean isCanEdit(){ - return canEdit; - } + public boolean isCanEdit() { + return canEdit; + } - public void setGroupTitle(String groupTitle){ - this.groupTitle = groupTitle; - } + public void setGroupTitle(String groupTitle) { + this.groupTitle = groupTitle; + } - public String getGroupTitle(){ - return groupTitle; - } + public String getGroupTitle() { + return groupTitle; + } - public void setFollowingCount(int followingCount){ - this.followingCount = followingCount; - } + public void setFollowingCount(int followingCount) { + this.followingCount = followingCount; + } - public int getFollowingCount(){ - return followingCount; - } + public int getFollowingCount() { + return followingCount; + } - public void setLastonlineISO(String lastonlineISO){ - this.lastonlineISO = lastonlineISO; - } + public void setLastonlineISO(String lastonlineISO) { + this.lastonlineISO = lastonlineISO; + } - public String getLastonlineISO(){ - return lastonlineISO; - } + public String getLastonlineISO() { + return lastonlineISO; + } - public void setEmailDisableEdit(boolean emailDisableEdit){ - this.emailDisableEdit = emailDisableEdit; - } + public void setEmailDisableEdit(boolean emailDisableEdit) { + this.emailDisableEdit = emailDisableEdit; + } - public boolean isEmailDisableEdit(){ - return emailDisableEdit; - } + public boolean isEmailDisableEdit() { + return emailDisableEdit; + } - public void setUid(String uid){ - this.uid = uid; - } + public void setUid(String uid) { + this.uid = uid; + } - public String getUid(){ - return uid; - } + public String getUid() { + return uid; + } - public void setCanChangePassword(boolean canChangePassword){ - this.canChangePassword = canChangePassword; - } + public void setCanChangePassword(boolean canChangePassword) { + this.canChangePassword = canChangePassword; + } - public boolean isCanChangePassword(){ - return canChangePassword; - } + public boolean isCanChangePassword() { + return canChangePassword; + } - public void setProfileviews(String profileviews){ - this.profileviews = profileviews; - } + public void setProfileviews(String profileviews) { + this.profileviews = profileviews; + } - public String getProfileviews(){ - return profileviews; - } + public String getProfileviews() { + return profileviews; + } - public void setCoverUrl(String coverUrl){ - this.coverUrl = coverUrl; - } + public void setCoverUrl(String coverUrl) { + this.coverUrl = coverUrl; + } - public String getCoverUrl(){ - return coverUrl; - } + public String getCoverUrl() { + return coverUrl; + } - public void setBanned(boolean banned){ - this.banned = banned; - } + public void setBanned(boolean banned) { + this.banned = banned; + } - public boolean isBanned(){ - return banned; - } + public boolean isBanned() { + return banned; + } - public void setUserslug(String userslug){ - this.userslug = userslug; - } + public void setUserslug(String userslug) { + this.userslug = userslug; + } - public String getUserslug(){ - return userslug; - } + public String getUserslug() { + return userslug; + } - public void setFollowerCount(int followerCount){ - this.followerCount = followerCount; - } + public void setFollowerCount(int followerCount) { + this.followerCount = followerCount; + } - public int getFollowerCount(){ - return followerCount; - } + public int getFollowerCount() { + return followerCount; + } - public void setEmail(String email){ - this.email = email; - } + public void setEmail(String email) { + this.email = email; + } - public String getEmail(){ - return email; - } + public String getEmail() { + return email; + } - public void setWebsite(String website){ - this.website = website; - } + public void setWebsite(String website) { + this.website = website; + } - public String getWebsite(){ - return website; - } + public String getWebsite() { + return website; + } - public void setIsFollowing(boolean isFollowing){ - this.isFollowing = isFollowing; - } + public void setIsFollowing(boolean isFollowing) { + this.isFollowing = isFollowing; + } - public boolean isIsFollowing(){ - return isFollowing; - } + public boolean isIsFollowing() { + return isFollowing; + } - public void setUploadedpicture(String uploadedpicture){ - this.uploadedpicture = uploadedpicture; - } + public void setUploadedpicture(String uploadedpicture) { + this.uploadedpicture = uploadedpicture; + } - public String getUploadedpicture(){ - return uploadedpicture; - } + public String getUploadedpicture() { + return uploadedpicture; + } - public void setPasswordExpiry(String passwordExpiry){ - this.passwordExpiry = passwordExpiry; - } + public void setPasswordExpiry(String passwordExpiry) { + this.passwordExpiry = passwordExpiry; + } - public String getPasswordExpiry(){ - return passwordExpiry; - } + public String getPasswordExpiry() { + return passwordExpiry; + } - public void setCanBan(boolean canBan){ - this.canBan = canBan; - } + public void setCanBan(boolean canBan) { + this.canBan = canBan; + } - public boolean isCanBan(){ - return canBan; - } + public boolean isCanBan() { + return canBan; + } - public void setLastonline(String lastonline){ - this.lastonline = lastonline; - } + public void setLastonline(String lastonline) { + this.lastonline = lastonline; + } - public String getLastonline(){ - return lastonline; - } + public String getLastonline() { + return lastonline; + } - public void setDisableSignatures(boolean disableSignatures){ - this.disableSignatures = disableSignatures; - } + public void setDisableSignatures(boolean disableSignatures) { + this.disableSignatures = disableSignatures; + } - public boolean isDisableSignatures(){ - return disableSignatures; - } + public boolean isDisableSignatures() { + return disableSignatures; + } - public void setGroups(List groups){ - this.groups = groups; - } + public void setGroups(List groups) { + this.groups = groups; + } - public List getGroups(){ - return groups; - } + public List getGroups() { + return groups; + } - public void setUsernameDisableEdit(boolean usernameDisableEdit){ - this.usernameDisableEdit = usernameDisableEdit; - } + public void setUsernameDisableEdit(boolean usernameDisableEdit) { + this.usernameDisableEdit = usernameDisableEdit; + } - public boolean isUsernameDisableEdit(){ - return usernameDisableEdit; - } + public boolean isUsernameDisableEdit() { + return usernameDisableEdit; + } - public void setPicture(String picture){ - this.picture = picture; - } - - public String getPicture(){ - return picture; - } - - public void setJoindateISO(String joindateISO){ - this.joindateISO = joindateISO; - } - - public String getJoindateISO(){ - return joindateISO; - } - - public void setIsSelfOrAdminOrGlobalModerator(boolean isSelfOrAdminOrGlobalModerator){ - this.isSelfOrAdminOrGlobalModerator = isSelfOrAdminOrGlobalModerator; - } - - public boolean isIsSelfOrAdminOrGlobalModerator(){ - return isSelfOrAdminOrGlobalModerator; - } - - public void setWebsiteName(String websiteName){ - this.websiteName = websiteName; - } - - public String getWebsiteName(){ - return websiteName; - } - - public void setIsAdminOrGlobalModeratorOrModerator(boolean isAdminOrGlobalModeratorOrModerator){ - this.isAdminOrGlobalModeratorOrModerator = isAdminOrGlobalModeratorOrModerator; - } - - public boolean isIsAdminOrGlobalModeratorOrModerator(){ - return isAdminOrGlobalModeratorOrModerator; - } - - public void setCoverPosition(String coverPosition){ - this.coverPosition = coverPosition; - } - - public String getCoverPosition(){ - return coverPosition; - } - - public void setPostcount(String postcount){ - this.postcount = postcount; - } - - public String getPostcount(){ - return postcount; - } - - public void setLocation(String location){ - this.location = location; - } - - public String getLocation(){ - return location; - } - - public void setFullname(String fullname){ - this.fullname = fullname; - } - - public String getFullname(){ - return fullname; - } - - public void setAge(int age){ - this.age = age; - } - - public int getAge(){ - return age; - } - - public void setTheirid(String theirid){ - this.theirid = theirid; - } - - public String getTheirid(){ - return theirid; - } - - public void setUsername(String username){ - this.username = username; - } - - public String getUsername(){ - return username; - } - - @Override - public String toString(){ - return - "User{" + - "websiteLink = '" + websiteLink + '\'' + - ",reputation = '" + reputation + '\'' + - ",sso = '" + sso + '\'' + - ",icon:text = '" + iconText + '\'' + - ",isGlobalModerator = '" + isGlobalModerator + '\'' + - ",joindate = '" + joindate + '\'' + - ",profile_links = '" + profileLinks + '\'' + - ",reputation:disabled = '" + reputationDisabled + '\'' + - ",isAdmin = '" + isAdmin + '\'' + - ",moderationNote = '" + moderationNote + '\'' + - ",ips = '" + ips + '\'' + - ",aboutme = '" + aboutme + '\'' + - ",isTargetAdmin = '" + isTargetAdmin + '\'' + - ",email:confirmed = '" + emailConfirmed + '\'' + - ",isAdminOrGlobalModerator = '" + isAdminOrGlobalModerator + '\'' + - ",emailClass = '" + emailClass + '\'' + - ",downvote:disabled = '" + downvoteDisabled + '\'' + - ",topiccount = '" + topiccount + '\'' + - ",isSelf = '" + isSelf + '\'' + - ",status = '" + status + '\'' + - ",birthday = '" + birthday + '\'' + - ",showHidden = '" + showHidden + '\'' + - ",yourid = '" + yourid + '\'' + - ",lastposttime = '" + lastposttime + '\'' + - ",isModerator = '" + isModerator + '\'' + - ",signature = '" + signature + '\'' + - ",icon:bgColor = '" + iconBgColor + '\'' + - ",canEdit = '" + canEdit + '\'' + - ",groupTitle = '" + groupTitle + '\'' + - ",followingCount = '" + followingCount + '\'' + - ",lastonlineISO = '" + lastonlineISO + '\'' + - ",email:disableEdit = '" + emailDisableEdit + '\'' + - ",uid = '" + uid + '\'' + - ",canChangePassword = '" + canChangePassword + '\'' + - ",profileviews = '" + profileviews + '\'' + - ",cover:url = '" + coverUrl + '\'' + - ",banned = '" + banned + '\'' + - ",userslug = '" + userslug + '\'' + - ",followerCount = '" + followerCount + '\'' + - ",email = '" + email + '\'' + - ",website = '" + website + '\'' + - ",isFollowing = '" + isFollowing + '\'' + - ",uploadedpicture = '" + uploadedpicture + '\'' + - ",passwordExpiry = '" + passwordExpiry + '\'' + - ",canBan = '" + canBan + '\'' + - ",lastonline = '" + lastonline + '\'' + - ",disableSignatures = '" + disableSignatures + '\'' + - ",groups = '" + groups + '\'' + - ",username:disableEdit = '" + usernameDisableEdit + '\'' + - ",picture = '" + picture + '\'' + - ",joindateISO = '" + joindateISO + '\'' + - ",isSelfOrAdminOrGlobalModerator = '" + isSelfOrAdminOrGlobalModerator + '\'' + - ",websiteName = '" + websiteName + '\'' + - ",isAdminOrGlobalModeratorOrModerator = '" + isAdminOrGlobalModeratorOrModerator + '\'' + - ",cover:position = '" + coverPosition + '\'' + - ",postcount = '" + postcount + '\'' + - ",location = '" + location + '\'' + - ",fullname = '" + fullname + '\'' + - ",age = '" + age + '\'' + - ",theirid = '" + theirid + '\'' + - ",username = '" + username + '\'' + - "}"; - } + public void setPicture(String picture) { + this.picture = picture; + } + + public String getPicture() { + return picture; + } + + public void setJoindateISO(String joindateISO) { + this.joindateISO = joindateISO; + } + + public String getJoindateISO() { + return joindateISO; + } + + public void setIsSelfOrAdminOrGlobalModerator(boolean isSelfOrAdminOrGlobalModerator) { + this.isSelfOrAdminOrGlobalModerator = isSelfOrAdminOrGlobalModerator; + } + + public boolean isIsSelfOrAdminOrGlobalModerator() { + return isSelfOrAdminOrGlobalModerator; + } + + public void setWebsiteName(String websiteName) { + this.websiteName = websiteName; + } + + public String getWebsiteName() { + return websiteName; + } + + public void setIsAdminOrGlobalModeratorOrModerator(boolean isAdminOrGlobalModeratorOrModerator) { + this.isAdminOrGlobalModeratorOrModerator = isAdminOrGlobalModeratorOrModerator; + } + + public boolean isIsAdminOrGlobalModeratorOrModerator() { + return isAdminOrGlobalModeratorOrModerator; + } + + public void setCoverPosition(String coverPosition) { + this.coverPosition = coverPosition; + } + + public String getCoverPosition() { + return coverPosition; + } + + public void setPostcount(String postcount) { + this.postcount = postcount; + } + + public String getPostcount() { + return postcount; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getLocation() { + return location; + } + + public void setFullname(String fullname) { + this.fullname = fullname; + } + + public String getFullname() { + return fullname; + } + + public void setAge(int age) { + this.age = age; + } + + public int getAge() { + return age; + } + + public void setTheirid(String theirid) { + this.theirid = theirid; + } + + public String getTheirid() { + return theirid; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getUsername() { + return username; + } + + @Override + public String toString() { + return + "User{" + + "websiteLink = '" + websiteLink + '\'' + + ",reputation = '" + reputation + '\'' + + ",sso = '" + sso + '\'' + + ",icon:text = '" + iconText + '\'' + + ",isGlobalModerator = '" + isGlobalModerator + '\'' + + ",joindate = '" + joindate + '\'' + + ",profile_links = '" + profileLinks + '\'' + + ",reputation:disabled = '" + reputationDisabled + '\'' + + ",isAdmin = '" + isAdmin + '\'' + + ",moderationNote = '" + moderationNote + '\'' + + ",ips = '" + ips + '\'' + + ",aboutme = '" + aboutme + '\'' + + ",isTargetAdmin = '" + isTargetAdmin + '\'' + + ",email:confirmed = '" + emailConfirmed + '\'' + + ",isAdminOrGlobalModerator = '" + isAdminOrGlobalModerator + '\'' + + ",emailClass = '" + emailClass + '\'' + + ",downvote:disabled = '" + downvoteDisabled + '\'' + + ",topiccount = '" + topiccount + '\'' + + ",isSelf = '" + isSelf + '\'' + + ",status = '" + status + '\'' + + ",birthday = '" + birthday + '\'' + + ",showHidden = '" + showHidden + '\'' + + ",yourid = '" + yourid + '\'' + + ",lastposttime = '" + lastposttime + '\'' + + ",isModerator = '" + isModerator + '\'' + + ",signature = '" + signature + '\'' + + ",icon:bgColor = '" + iconBgColor + '\'' + + ",canEdit = '" + canEdit + '\'' + + ",groupTitle = '" + groupTitle + '\'' + + ",followingCount = '" + followingCount + '\'' + + ",lastonlineISO = '" + lastonlineISO + '\'' + + ",email:disableEdit = '" + emailDisableEdit + '\'' + + ",uid = '" + uid + '\'' + + ",canChangePassword = '" + canChangePassword + '\'' + + ",profileviews = '" + profileviews + '\'' + + ",cover:url = '" + coverUrl + '\'' + + ",banned = '" + banned + '\'' + + ",userslug = '" + userslug + '\'' + + ",followerCount = '" + followerCount + '\'' + + ",email = '" + email + '\'' + + ",website = '" + website + '\'' + + ",isFollowing = '" + isFollowing + '\'' + + ",uploadedpicture = '" + uploadedpicture + '\'' + + ",passwordExpiry = '" + passwordExpiry + '\'' + + ",canBan = '" + canBan + '\'' + + ",lastonline = '" + lastonline + '\'' + + ",disableSignatures = '" + disableSignatures + '\'' + + ",groups = '" + groups + '\'' + + ",username:disableEdit = '" + usernameDisableEdit + '\'' + + ",picture = '" + picture + '\'' + + ",joindateISO = '" + joindateISO + '\'' + + ",isSelfOrAdminOrGlobalModerator = '" + isSelfOrAdminOrGlobalModerator + '\'' + + ",websiteName = '" + websiteName + '\'' + + ",isAdminOrGlobalModeratorOrModerator = '" + isAdminOrGlobalModeratorOrModerator + '\'' + + ",cover:position = '" + coverPosition + '\'' + + ",postcount = '" + postcount + '\'' + + ",location = '" + location + '\'' + + ",fullname = '" + fullname + '\'' + + ",age = '" + age + '\'' + + ",theirid = '" + theirid + '\'' + + ",username = '" + username + '\'' + + "}"; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof User)) + return false; + User user = (User) obj; + return Objects.equals(user.uid, this.uid); + } } \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/CommunityDrawerMenu.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/CommunityDrawerMenu.java index 58c7df3e..c6cc4648 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/CommunityDrawerMenu.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/CommunityDrawerMenu.java @@ -1,6 +1,7 @@ package com.stardust.scriptdroid.ui.main.drawer; import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.network.UserService; import com.stardust.scriptdroid.ui.main.community.CommunityFragment; import org.greenrobot.eventbus.EventBus; @@ -9,46 +10,105 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + /** * Created by Stardust on 2017/12/10. */ public class CommunityDrawerMenu { + private DrawerMenuItem mUnreadItem = new DrawerMenuItem(R.drawable.community_inbox, R.string.text_community_unread, this::showUnread); + private DrawerMenuItem mLogoutItem = new DrawerMenuItem(R.drawable.ic_exit_to_app_black_24dp, R.string.text_logout, this::logout); + private List mDrawerMenuItems = new ArrayList<>(Arrays.asList( new DrawerMenuGroup(R.string.text_community), new DrawerMenuItem(R.drawable.community_list, R.string.text_community_category, this::showCategories), - new DrawerMenuItem(R.drawable.community_inbox, R.string.text_community_unread, this::showUnread), + mUnreadItem, new DrawerMenuItem(R.drawable.community_time, R.string.text_community_recent, this::showRecent), new DrawerMenuItem(R.drawable.community_fire, R.string.text_community_popular, this::showPopular), - new DrawerMenuItem(R.drawable.community_tags, R.string.text_community_tags, this::showTags) + new DrawerMenuItem(R.drawable.community_tags, R.string.text_community_tags, this::showTags), + mLogoutItem )); private boolean mShown = false; - public List getItems() { - return mDrawerMenuItems; - } public void showCommunityMenu(DrawerMenuAdapter adapter) { + mShown = true; List items = adapter.getDrawerMenuItems(); if (items.get(0) == mDrawerMenuItems.get(0)) { + refreshUserStatus(adapter); return; } items.addAll(0, mDrawerMenuItems); adapter.notifyItemRangeInserted(0, mDrawerMenuItems.size()); adapter.notifyItemChanged(mDrawerMenuItems.size()); + refreshUserStatus(adapter); + } + + private void refreshUserStatus(DrawerMenuAdapter adapter) { + UserService.getInstance().refreshOnlineStatus() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(online -> setUserOnlineStatus(adapter, online)); + } + + public void setUserOnlineStatus(DrawerMenuAdapter adapter, boolean online) { + if (online) { + addItem(adapter, R.string.text_community_category, mUnreadItem); + addItem(adapter, R.string.text_community_tags, mLogoutItem); + + } else { + removeItem(adapter, R.string.text_community_unread); + removeItem(adapter, R.string.text_logout); + } + + } + + private void addItem(DrawerMenuAdapter adapter, int title, DrawerMenuItem itemToAdd) { + List items = adapter.getDrawerMenuItems(); + for (int i = 0; i < items.size(); i++) { + DrawerMenuItem item = items.get(i); + if (item.getTitle() == title) { + if (i >= items.size() || items.get(i + 1) != itemToAdd) { + items.add(i + 1, itemToAdd); + adapter.notifyItemInserted(i + 1); + } + break; + } + } + } + + private void removeItem(DrawerMenuAdapter adapter, int title) { + List items = adapter.getDrawerMenuItems(); + for (int i = 0; i < items.size(); i++) { + DrawerMenuItem item = items.get(i); + if (item.getTitle() == title) { + items.remove(i); + adapter.notifyItemRemoved(i); + break; + } + } } public void hideCommunityMenu(DrawerMenuAdapter adapter) { List items = adapter.getDrawerMenuItems(); + mShown = false; if (items.isEmpty() || items.get(0) != mDrawerMenuItems.get(0)) { return; } - items.subList(0, mDrawerMenuItems.size()).clear(); - adapter.notifyItemChanged(mDrawerMenuItems.size()); - adapter.notifyItemRangeRemoved(0, mDrawerMenuItems.size()); + for (int i = 1; i < items.size(); i++) { + DrawerMenuItem item = items.get(i); + if (item instanceof DrawerMenuGroup) { + items.subList(0, i).clear(); + adapter.notifyItemRangeRemoved(0, i); + adapter.notifyItemChanged(0); + break; + } + } } private void showCategories(DrawerMenuItemViewHolder holder) { @@ -76,4 +136,14 @@ public class CommunityDrawerMenu { } + private void logout(DrawerMenuItemViewHolder holder) { + UserService.getInstance().logout() + .subscribeOn(Schedulers.io()) + .subscribe(); + EventBus.getDefault().post(new CommunityFragment.LoadUrl("/")); + } + + public boolean isShown() { + return mShown; + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/DrawerFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/DrawerFragment.java index f6f8554b..28784802 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/DrawerFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/DrawerFragment.java @@ -22,6 +22,7 @@ import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.Pref; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.network.GlideApp; +import com.stardust.scriptdroid.network.UserService; import com.stardust.scriptdroid.pluginclient.DevPluginClient; import com.stardust.scriptdroid.ui.floating.CircularMenu; import com.stardust.scriptdroid.ui.floating.FloatyWindowManger; @@ -52,6 +53,7 @@ import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.ViewById; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; import java.util.Arrays; @@ -147,8 +149,7 @@ public class DrawerFragment extends android.support.v4.app.Fragment { @Click(R.id.avatar) void loginOrShowUserInfo() { - NodeBB.getInstance().getRetrofit() - .create(UserApi.class) + UserService.getInstance() .me() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -368,6 +369,13 @@ public class DrawerFragment extends android.support.v4.app.Fragment { mDrawerMenu.scrollToPosition(0); } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLoginStateChange(UserService.LoginStateChange change) { + syncUserInfo(); + if (mCommunityDrawerMenu.isShown()) { + mCommunityDrawerMenu.setUserOnlineStatus(mDrawerMenuAdapter, change.isOnline()); + } + } @Override public void onDestroy() { diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/DrawerMenuGroup.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/DrawerMenuGroup.java index fabf27f2..a8f16292 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/DrawerMenuGroup.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/DrawerMenuGroup.java @@ -6,8 +6,8 @@ package com.stardust.scriptdroid.ui.main.drawer; public class DrawerMenuGroup extends DrawerMenuItem { - public DrawerMenuGroup(int title) { super(0, title, null); } + } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/DrawerMenuItem.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/DrawerMenuItem.java index c8510e5b..9a9b9f4d 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/DrawerMenuItem.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/drawer/DrawerMenuItem.java @@ -77,4 +77,19 @@ public class DrawerMenuItem { if (mAction != null) mAction.onClick(holder); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + DrawerMenuItem that = (DrawerMenuItem) o; + + return mTitle == that.mTitle; + } + + @Override + public int hashCode() { + return mTitle; + } } diff --git a/app/src/main/res/drawable-hdpi/ic_exit_to_app_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_exit_to_app_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ad0f63e5b8a97d5951f1b4e8576dadee1ed7b06c GIT binary patch literal 251 zcmV7p6eU`=zZX-N|=GVrD^) zClqF&$Jv?-QOwy=^+Y}F$nfc4Bot;$_dOXQ9RzHI`#%>oY-)%aZoJrjFFFv3NmVRr z2?Sa`S#md3dQVyL$W)m~R+X1#=Sa*{6V0AVQq>n#Elps}Q)srP(H~^4sXZe4&|XbV z{WbCr8*-?%{P#rkbYwX65AuY=z)4@Wr^6vI^9JtMV7dP`o`V1Y002ovPDHLkV1iCn BWIO-> literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_exit_to_app_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_exit_to_app_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..dee407b59836072bd89a0f869c53cc8e47f3f7b7 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iB2O2`kP60Ri9HGv9;zO$xA`F2 zY~NKip@`{&YFE_;0j&cQmak%SZDZ!)T9OgL`NY;CL-7rhUE5<0T@KzKTjw-n9DJ$2{8En0ePbXTEv8+xH$tl7$*|>0Q(JcpPKIn>;M1&07*qoM6N<$f)PV!8UO$Q literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_exit_to_app_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_exit_to_app_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..53b79d4c7b9cdad40cb666c5bb30ed44daa143a9 GIT binary patch literal 354 zcmV-o0iFJdP)3fpZFa4cDyL4)iGZOvQJns;a8`1-tx#POU72+yDRo07*qoM6N<$g3C0W AH~;_u literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_exit_to_app_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_exit_to_app_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e30632b6b1dc6d3b8e1c7556a9f73e231851051f GIT binary patch literal 432 zcmV;h0Z;ykP)Q*LDW#NB5A+;4Q?5K`4y@^Lb;E`dIs-k^@$0`)8kp@^!iLhwtjC@G(##BWRM%4) znibU@n*!{q?%WjMM0MrY_zL*@!2kgS5I_I{49g67rckh~fcf`zmJu-jaiwJgy!^S= zG69|_|BU4U-16=r!~^_<;O`+n!4HTh!~@)fcz~A>4{#FV0Zu|Zz)6S)I0 zK*6#D3YHyEFadOg#*gV^^a{-azQ_XBZxk@&BjU$g{QB_#=lbyg-}>=@8K0T|slW5A zAAe)ZwSGLnxqdw0G5gJ3umrc)s|c3y5tHS9!~|fD_4Sxl54r^qKmY**NdMyNp(((Q z>efvG7F5?UH1zuYJ!F0Xf61t(Y@1mBl?jX`^uY&dV95km9V_;n0zNo*EH0gWrIb=i aDfI密码太短 邮箱已被占用 两次输入的密码不一致 + 退出登录 + 操作失败,请稍后重试 diff --git a/autojs/src/main/AndroidManifest.xml b/autojs/src/main/AndroidManifest.xml index 96162dd3..81f512ec 100644 --- a/autojs/src/main/AndroidManifest.xml +++ b/autojs/src/main/AndroidManifest.xml @@ -15,6 +15,12 @@ android:name=".execution.ScriptExecuteActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar"/> + + diff --git a/autojs/src/main/java/com/stardust/autojs/core/image/ImageWrapper.java b/autojs/src/main/java/com/stardust/autojs/core/image/ImageWrapper.java index 612559ca..e0612826 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/image/ImageWrapper.java +++ b/autojs/src/main/java/com/stardust/autojs/core/image/ImageWrapper.java @@ -4,6 +4,9 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.ImageFormat; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.Xfermode; import android.media.Image; import android.os.Build; import android.support.annotation.RequiresApi; diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java index cf383e2c..fea1db5f 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java @@ -4,6 +4,7 @@ import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Canvas; import android.graphics.Matrix; import android.media.Image; import android.os.Build; diff --git a/autojs/src/main/res/values/styles.xml b/autojs/src/main/res/values/styles.xml index b8fb963f..a17bfb5b 100644 --- a/autojs/src/main/res/values/styles.xml +++ b/autojs/src/main/res/values/styles.xml @@ -13,6 +13,16 @@ + + + #009688 #009688 #03a9f4 diff --git a/common/src/main/java/com/stardust/util/Objects.java b/common/src/main/java/com/stardust/util/Objects.java new file mode 100644 index 00000000..8af62d0f --- /dev/null +++ b/common/src/main/java/com/stardust/util/Objects.java @@ -0,0 +1,27 @@ +package com.stardust.util; + +/** + * Created by Stardust on 2017/12/31. + */ + +public class Objects { + + /** + * Returns {@code true} if the arguments are equal to each other + * and {@code false} otherwise. + * Consequently, if both arguments are {@code null}, {@code true} + * is returned and if exactly one argument is {@code null}, {@code + * false} is returned. Otherwise, equality is determined by using + * the {@link Object#equals equals} method of the first + * argument. + * + * @param a an object + * @param b an object to be compared with {@code a} for equality + * @return {@code true} if the arguments are equal to each other + * and {@code false} otherwise + * @see Object#equals(Object) + */ + public static boolean equals(Object a, Object b) { + return (a == b) || (a != null && a.equals(b)); + } +}