From f2c636d59983e4cd851e30729b9bbcb6d96308a2 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sun, 27 Jan 2019 14:22:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E5=B8=82=E5=9C=BA?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=20=E5=88=A0=E9=99=A4=20=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/autojs/autojs/network/NodeBB.java | 2 + .../org/autojs/autojs/network/TopicService.kt | 23 ++ .../org/autojs/autojs/network/api/TopicApi.kt | 17 + .../autojs/network/entity/topic/AppInfo.java | 171 ++++++++ .../autojs/network/entity/topic/Category.java | 176 ++++++++ .../autojs/network/entity/topic/Page.java | 30 ++ .../network/entity/topic/Pagination.java | 71 ++++ .../autojs/network/entity/topic/Post.java | 182 +++++++++ .../network/entity/topic/Privileges.java | 100 +++++ .../autojs/network/entity/topic/Replies.java | 53 +++ .../autojs/network/entity/topic/Topic.java | 379 ++++++++++++++++++ .../autojs/autojs/ui/main/MainActivity.java | 4 +- .../autojs/ui/main/market/MarketFragment.kt | 98 +++++ .../autojs/ui/main/sample/MarketFragment.java | 88 ---- app/src/main/res/drawable-xhdpi/upvote.png | Bin 0 -> 2987 bytes .../res/drawable/bg_label_root_permission.xml | 7 + app/src/main/res/drawable/download.png | Bin 0 -> 6009 bytes app/src/main/res/drawable/downvote.png | Bin 0 -> 3032 bytes app/src/main/res/drawable/ic_money_black.png | Bin 1289 -> 0 bytes app/src/main/res/drawable/skip_circle_bg.xml | 35 -- app/src/main/res/drawable/star.png | Bin 0 -> 6439 bytes .../res/layout/divider_project_toolbar.xml | 5 - app/src/main/res/layout/fragment_market.xml | 15 +- app/src/main/res/layout/item_topic.xml | 131 ++++++ app/src/main/res/menu/menu_sample_options.xml | 19 - app/src/main/res/values-en/strings.xml | 7 - app/src/main/res/values-night/colors.xml | 1 - app/src/main/res/values/colors.xml | 3 - app/src/main/res/values/strings.xml | 34 -- 29 files changed, 1452 insertions(+), 199 deletions(-) create mode 100644 app/src/main/java/org/autojs/autojs/network/TopicService.kt create mode 100644 app/src/main/java/org/autojs/autojs/network/api/TopicApi.kt create mode 100644 app/src/main/java/org/autojs/autojs/network/entity/topic/AppInfo.java create mode 100644 app/src/main/java/org/autojs/autojs/network/entity/topic/Category.java create mode 100644 app/src/main/java/org/autojs/autojs/network/entity/topic/Page.java create mode 100644 app/src/main/java/org/autojs/autojs/network/entity/topic/Pagination.java create mode 100644 app/src/main/java/org/autojs/autojs/network/entity/topic/Post.java create mode 100644 app/src/main/java/org/autojs/autojs/network/entity/topic/Privileges.java create mode 100644 app/src/main/java/org/autojs/autojs/network/entity/topic/Replies.java create mode 100644 app/src/main/java/org/autojs/autojs/network/entity/topic/Topic.java create mode 100644 app/src/main/java/org/autojs/autojs/ui/main/market/MarketFragment.kt delete mode 100644 app/src/main/java/org/autojs/autojs/ui/main/sample/MarketFragment.java create mode 100644 app/src/main/res/drawable-xhdpi/upvote.png create mode 100644 app/src/main/res/drawable/bg_label_root_permission.xml create mode 100644 app/src/main/res/drawable/download.png create mode 100644 app/src/main/res/drawable/downvote.png delete mode 100644 app/src/main/res/drawable/ic_money_black.png delete mode 100644 app/src/main/res/drawable/skip_circle_bg.xml create mode 100644 app/src/main/res/drawable/star.png delete mode 100644 app/src/main/res/layout/divider_project_toolbar.xml create mode 100644 app/src/main/res/layout/item_topic.xml delete mode 100644 app/src/main/res/menu/menu_sample_options.xml diff --git a/app/src/main/java/org/autojs/autojs/network/NodeBB.java b/app/src/main/java/org/autojs/autojs/network/NodeBB.java index 577afa0d..24a4806c 100644 --- a/app/src/main/java/org/autojs/autojs/network/NodeBB.java +++ b/app/src/main/java/org/autojs/autojs/network/NodeBB.java @@ -4,6 +4,7 @@ import android.content.Context; import android.util.Log; import com.google.gson.GsonBuilder; +import com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory; import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import org.autojs.autojs.R; @@ -40,6 +41,7 @@ public class NodeBB { .setLenient() .create())) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .addCallAdapterFactory(CoroutineCallAdapterFactory.create()) .client(new OkHttpClient.Builder() .cookieJar(new WebkitCookieManagerProxy()) .build()) diff --git a/app/src/main/java/org/autojs/autojs/network/TopicService.kt b/app/src/main/java/org/autojs/autojs/network/TopicService.kt new file mode 100644 index 00000000..ea01b1f4 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/network/TopicService.kt @@ -0,0 +1,23 @@ +package org.autojs.autojs.network + +import org.autojs.autojs.network.api.TopicApi +import org.autojs.autojs.network.entity.topic.Topic + +object TopicService { + + private const val CID_SCRIPTS = 9L + private val mRetrofit = NodeBB.getInstance().retrofit + private val mTopicApi = mRetrofit.create(TopicApi::class.java) + + suspend fun getTopics(cid: Long): List { + val category = mTopicApi.getCategory(cid).await() + return category.topics.filter { + it.appInfo != null + } + } + + suspend fun getScriptsTopics(): List { + return getTopics(CID_SCRIPTS) + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/network/api/TopicApi.kt b/app/src/main/java/org/autojs/autojs/network/api/TopicApi.kt new file mode 100644 index 00000000..a98a1b75 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/network/api/TopicApi.kt @@ -0,0 +1,17 @@ +package org.autojs.autojs.network.api + +import kotlinx.coroutines.Deferred +import org.autojs.autojs.network.entity.topic.Category +import org.autojs.autojs.network.entity.topic.Topic +import retrofit2.http.GET +import retrofit2.http.Path + +interface TopicApi { + + @GET("/api/category/{cid}") + fun getCategory(@Path("cid") cid: Long): Deferred + + @GET("/api/topic/{tid}") + fun getTopic(@Path("tid") cid: Long): Deferred + +} \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/network/entity/topic/AppInfo.java b/app/src/main/java/org/autojs/autojs/network/entity/topic/AppInfo.java new file mode 100644 index 00000000..30ad856c --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/network/entity/topic/AppInfo.java @@ -0,0 +1,171 @@ + +package org.autojs.autojs.network.entity.topic; + +import java.util.List; + +import com.google.gson.annotations.SerializedName; + +@SuppressWarnings("unused") +public class AppInfo { + + @SerializedName("details") + private String mDetails; + @SerializedName("email") + private String mEmail; + @SerializedName("file") + private String mFile; + @SerializedName("minSdkVersion") + private long mMinSdkVersion; + @SerializedName("name") + private String mName; + @SerializedName("package") + private String mPackage; + @SerializedName("permissions") + private List mPermissions; + @SerializedName("qq") + private String mQq; + @SerializedName("releaseNotes") + private String mReleaseNotes; + @SerializedName("screenshots") + private List mScreenshots; + @SerializedName("summary") + private String mSummary; + @SerializedName("userGuide") + private String mUserGuide; + @SerializedName("version") + private String mVersion; + @SerializedName("versionCode") + private long mVersionCode; + + public String getDetails() { + return mDetails; + } + + public void setDetails(String details) { + mDetails = details; + } + + public String getEmail() { + return mEmail; + } + + public void setEmail(String email) { + mEmail = email; + } + + public String getFile() { + return mFile; + } + + public void setFile(String file) { + mFile = file; + } + + public long getMinSdkVersion() { + return mMinSdkVersion; + } + + public void setMinSdkVersion(long minSdkVersion) { + mMinSdkVersion = minSdkVersion; + } + + public String getName() { + return mName; + } + + public void setName(String name) { + mName = name; + } + + public String getPackage() { + return mPackage; + } + + public void setPackage(String packageName) { + mPackage = packageName; + } + + public List getPermissions() { + return mPermissions; + } + + public void setPermissions(List permissions) { + mPermissions = permissions; + } + + public String getQq() { + return mQq; + } + + public void setQq(String qq) { + mQq = qq; + } + + public String getReleaseNotes() { + return mReleaseNotes; + } + + public void setReleaseNotes(String releaseNotes) { + mReleaseNotes = releaseNotes; + } + + public List getScreenshots() { + return mScreenshots; + } + + public void setScreenshots(List screenshots) { + mScreenshots = screenshots; + } + + public String getSummary() { + return mSummary; + } + + public void setSummary(String summary) { + mSummary = summary; + } + + public String getUserGuide() { + return mUserGuide; + } + + public void setUserGuide(String userGuide) { + mUserGuide = userGuide; + } + + public String getVersion() { + return mVersion; + } + + public void setVersion(String version) { + mVersion = version; + } + + public long getVersionCode() { + return mVersionCode; + } + + public void setVersionCode(long versionCode) { + mVersionCode = versionCode; + } + + @Override + public String toString() { + return "ScriptApp{" + + "mDetails='" + mDetails + '\'' + + ", mEmail='" + mEmail + '\'' + + ", mFile='" + mFile + '\'' + + ", mMinSdkVersion=" + mMinSdkVersion + + ", mName='" + mName + '\'' + + ", mPackage='" + mPackage + '\'' + + ", mPermissions=" + mPermissions + + ", mQq='" + mQq + '\'' + + ", mReleaseNotes='" + mReleaseNotes + '\'' + + ", mScreenshots=" + mScreenshots + + ", mSummary='" + mSummary + '\'' + + ", mUserGuide='" + mUserGuide + '\'' + + ", mVersion='" + mVersion + '\'' + + ", mVersionCode=" + mVersionCode + + '}'; + } +} diff --git a/app/src/main/java/org/autojs/autojs/network/entity/topic/Category.java b/app/src/main/java/org/autojs/autojs/network/entity/topic/Category.java new file mode 100644 index 00000000..fe597305 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/network/entity/topic/Category.java @@ -0,0 +1,176 @@ + +package org.autojs.autojs.network.entity.topic; + +import java.util.List; +import com.google.gson.annotations.SerializedName; + +@SuppressWarnings("unused") +public class Category { + + @SerializedName("cid") + private String mCid; + @SerializedName("description") + private String mDescription; + @SerializedName("descriptionParsed") + private String mDescriptionParsed; + @SerializedName("link") + private String mLink; + @SerializedName("loggedIn") + private Boolean mLoggedIn; + @SerializedName("name") + private String mName; + @SerializedName("nextStart") + private Long mNextStart; + @SerializedName("numRecentReplies") + private String mNumRecentReplies; + @SerializedName("pagination") + private Pagination mPagination; + @SerializedName("parentCid") + private String mParentCid; + @SerializedName("post_count") + private String mPostCount; + @SerializedName("privileges") + private Privileges mPrivileges; + @SerializedName("slug") + private String mSlug; + @SerializedName("title") + private String mTitle; + @SerializedName("topic_count") + private String mTopicCount; + @SerializedName("topics") + private List mTopics; + @SerializedName("totalPostCount") + private Long mTotalPostCount; + @SerializedName("totalTopicCount") + private Long mTotalTopicCount; + @SerializedName("url") + private String mUrl; + + public String getDescription() { + return mDescription; + } + + public void setDescription(String description) { + mDescription = description; + } + + public String getDescriptionParsed() { + return mDescriptionParsed; + } + + public void setDescriptionParsed(String descriptionParsed) { + mDescriptionParsed = descriptionParsed; + } + public String getLink() { + return mLink; + } + + public void setLink(String link) { + mLink = link; + } + + public Boolean getLoggedIn() { + return mLoggedIn; + } + + public void setLoggedIn(Boolean loggedIn) { + mLoggedIn = loggedIn; + } + + public String getName() { + return mName; + } + + public void setName(String name) { + mName = name; + } + + public Long getNextStart() { + return mNextStart; + } + + public void setNextStart(Long nextStart) { + mNextStart = nextStart; + } + + public String getNumRecentReplies() { + return mNumRecentReplies; + } + + public void setNumRecentReplies(String numRecentReplies) { + mNumRecentReplies = numRecentReplies; + } + + public String getParentCid() { + return mParentCid; + } + + public void setParentCid(String parentCid) { + mParentCid = parentCid; + } + + public String getPostCount() { + return mPostCount; + } + + public void setPostCount(String postCount) { + mPostCount = postCount; + } + + public Privileges getPrivileges() { + return mPrivileges; + } + + public void setPrivileges(Privileges privileges) { + mPrivileges = privileges; + } + + public String getSlug() { + return mSlug; + } + + public void setSlug(String slug) { + mSlug = slug; + } + + public String getTitle() { + return mTitle; + } + + public void setTitle(String title) { + mTitle = title; + } + + public String getTopicCount() { + return mTopicCount; + } + + public void setTopicCount(String topicCount) { + mTopicCount = topicCount; + } + + public List getTopics() { + return mTopics; + } + + public void setTopics(List topics) { + mTopics = topics; + } + + public Long getTotalPostCount() { + return mTotalPostCount; + } + + public void setTotalPostCount(Long totalPostCount) { + mTotalPostCount = totalPostCount; + } + + public Long getTotalTopicCount() { + return mTotalTopicCount; + } + + public void setTotalTopicCount(Long totalTopicCount) { + mTotalTopicCount = totalTopicCount; + } + +} diff --git a/app/src/main/java/org/autojs/autojs/network/entity/topic/Page.java b/app/src/main/java/org/autojs/autojs/network/entity/topic/Page.java new file mode 100644 index 00000000..96cfa49e --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/network/entity/topic/Page.java @@ -0,0 +1,30 @@ + +package org.autojs.autojs.network.entity.topic; + +import com.google.gson.annotations.SerializedName; + +@SuppressWarnings("unused") +public class Page { + + @SerializedName("active") + private boolean mActive; + @SerializedName("page") + private long mPage; + + public boolean getActive() { + return mActive; + } + + public void setActive(boolean active) { + mActive = active; + } + + public long getPage() { + return mPage; + } + + public void setPage(long page) { + mPage = page; + } + +} diff --git a/app/src/main/java/org/autojs/autojs/network/entity/topic/Pagination.java b/app/src/main/java/org/autojs/autojs/network/entity/topic/Pagination.java new file mode 100644 index 00000000..827cf3bc --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/network/entity/topic/Pagination.java @@ -0,0 +1,71 @@ + +package org.autojs.autojs.network.entity.topic; + +import java.util.List; +import com.google.gson.annotations.SerializedName; + +@SuppressWarnings("unused") +public class Pagination { + + @SerializedName("currentPage") + private Long mCurrentPage; + @SerializedName("next") + private Page mNext; + @SerializedName("pageCount") + private Long mPageCount; + @SerializedName("pages") + private List mPages; + @SerializedName("prev") + private Page mPrev; + @SerializedName("rel") + private List mRel; + + public Long getCurrentPage() { + return mCurrentPage; + } + + public void setCurrentPage(Long currentPage) { + mCurrentPage = currentPage; + } + + public Page getNext() { + return mNext; + } + + public void setNext(Page next) { + mNext = next; + } + + public Long getPageCount() { + return mPageCount; + } + + public void setPageCount(Long pageCount) { + mPageCount = pageCount; + } + + public List getPages() { + return mPages; + } + + public void setPages(List pages) { + mPages = pages; + } + + public Page getPrev() { + return mPrev; + } + + public void setPrev(Page prev) { + mPrev = prev; + } + + public List getRel() { + return mRel; + } + + public void setRel(List rel) { + mRel = rel; + } + +} diff --git a/app/src/main/java/org/autojs/autojs/network/entity/topic/Post.java b/app/src/main/java/org/autojs/autojs/network/entity/topic/Post.java new file mode 100644 index 00000000..e7bf1911 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/network/entity/topic/Post.java @@ -0,0 +1,182 @@ + +package org.autojs.autojs.network.entity.topic; + +import com.google.gson.annotations.SerializedName; + +import org.autojs.autojs.network.entity.user.User; + +@SuppressWarnings("unused") +public class Post { + + @SerializedName("content") + private String mContent; + @SerializedName("downvoted") + private boolean mDownvoted; + @SerializedName("downvotes") + private long mDownvotes; + @SerializedName("edited") + private String mEdited; + @SerializedName("editedISO") + private String mEditedISO; + @SerializedName("index") + private long mIndex; + @SerializedName("pid") + private String mPid; + @SerializedName("replies") + private Replies mReplies; + @SerializedName("selfPost") + private boolean mSelfPost; + @SerializedName("tid") + private String mTid; + @SerializedName("timestamp") + private String mTimestamp; + @SerializedName("timestampISO") + private String mTimestampISO; + @SerializedName("uid") + private String mUid; + @SerializedName("upvoted") + private boolean mUpvoted; + @SerializedName("upvotes") + private long mUpvotes; + @SerializedName("user") + private User mUser; + @SerializedName("votes") + private long mVotes; + + public String getContent() { + return mContent; + } + + public void setContent(String content) { + mContent = content; + } + + public boolean getDownvoted() { + return mDownvoted; + } + + public void setDownvoted(boolean downvoted) { + mDownvoted = downvoted; + } + + public long getDownvotes() { + return mDownvotes; + } + + public void setDownvotes(long downvotes) { + mDownvotes = downvotes; + } + + public String getEdited() { + return mEdited; + } + + public void setEdited(String edited) { + mEdited = edited; + } + + public String getEditedISO() { + return mEditedISO; + } + + public void setEditedISO(String editedISO) { + mEditedISO = editedISO; + } + + public long getIndex() { + return mIndex; + } + + public void setIndex(long index) { + mIndex = index; + } + + public String getPid() { + return mPid; + } + + public void setPid(String pid) { + mPid = pid; + } + + public Replies getReplies() { + return mReplies; + } + + public void setReplies(Replies replies) { + mReplies = replies; + } + + public boolean getSelfPost() { + return mSelfPost; + } + + public void setSelfPost(boolean selfPost) { + mSelfPost = selfPost; + } + + public String getTid() { + return mTid; + } + + public void setTid(String tid) { + mTid = tid; + } + + public String getTimestamp() { + return mTimestamp; + } + + public void setTimestamp(String timestamp) { + mTimestamp = timestamp; + } + + public String getTimestampISO() { + return mTimestampISO; + } + + public void setTimestampISO(String timestampISO) { + mTimestampISO = timestampISO; + } + + public String getUid() { + return mUid; + } + + public void setUid(String uid) { + mUid = uid; + } + + public boolean getUpvoted() { + return mUpvoted; + } + + public void setUpvoted(boolean upvoted) { + mUpvoted = upvoted; + } + + public long getUpvotes() { + return mUpvotes; + } + + public void setUpvotes(long upvotes) { + mUpvotes = upvotes; + } + + public User getUser() { + return mUser; + } + + public void setUser(User user) { + mUser = user; + } + + public long getVotes() { + return mVotes; + } + + public void setVotes(long votes) { + mVotes = votes; + } + +} diff --git a/app/src/main/java/org/autojs/autojs/network/entity/topic/Privileges.java b/app/src/main/java/org/autojs/autojs/network/entity/topic/Privileges.java new file mode 100644 index 00000000..8b63dd7c --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/network/entity/topic/Privileges.java @@ -0,0 +1,100 @@ + +package org.autojs.autojs.network.entity.topic; + +import com.google.gson.annotations.SerializedName; + +@SuppressWarnings("unused") +public class Privileges { + + @SerializedName("cid") + private String mCid; + @SerializedName("editable") + private Boolean mEditable; + @SerializedName("isAdminOrMod") + private Boolean mIsAdminOrMod; + @SerializedName("read") + private Boolean mRead; + @SerializedName("topics:create") + private Boolean mTopicsCreate; + @SerializedName("topics:read") + private Boolean mTopicsRead; + @SerializedName("topics:tag") + private Boolean mTopicsTag; + @SerializedName("uid") + private Long mUid; + @SerializedName("view_deleted") + private Boolean mViewDeleted; + + public String getCid() { + return mCid; + } + + public void setCid(String cid) { + mCid = cid; + } + + public Boolean getEditable() { + return mEditable; + } + + public void setEditable(Boolean editable) { + mEditable = editable; + } + + public Boolean getIsAdminOrMod() { + return mIsAdminOrMod; + } + + public void setIsAdminOrMod(Boolean isAdminOrMod) { + mIsAdminOrMod = isAdminOrMod; + } + + public Boolean getRead() { + return mRead; + } + + public void setRead(Boolean read) { + mRead = read; + } + + public Boolean getTopicsCreate() { + return mTopicsCreate; + } + + public void setTopicsCreate(Boolean topicsCreate) { + mTopicsCreate = topicsCreate; + } + + public Boolean getTopicsRead() { + return mTopicsRead; + } + + public void setTopicsRead(Boolean topicsRead) { + mTopicsRead = topicsRead; + } + + public Boolean getTopicsTag() { + return mTopicsTag; + } + + public void setTopicsTag(Boolean topicsTag) { + mTopicsTag = topicsTag; + } + + public Long getUid() { + return mUid; + } + + public void setUid(Long uid) { + mUid = uid; + } + + public Boolean getViewDeleted() { + return mViewDeleted; + } + + public void setViewDeleted(Boolean viewDeleted) { + mViewDeleted = viewDeleted; + } + +} diff --git a/app/src/main/java/org/autojs/autojs/network/entity/topic/Replies.java b/app/src/main/java/org/autojs/autojs/network/entity/topic/Replies.java new file mode 100644 index 00000000..7e9dcd17 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/network/entity/topic/Replies.java @@ -0,0 +1,53 @@ + +package org.autojs.autojs.network.entity.topic; + +import java.util.List; +import com.google.gson.annotations.SerializedName; + +import org.autojs.autojs.network.entity.user.User; + +@SuppressWarnings("unused") +public class Replies { + + @SerializedName("count") + private long mCount; + @SerializedName("hasMore") + private boolean mHasMore; + @SerializedName("text") + private String mText; + @SerializedName("users") + private List mUsers; + + public long getCount() { + return mCount; + } + + public void setCount(long count) { + mCount = count; + } + + public boolean getHasMore() { + return mHasMore; + } + + public void setHasMore(boolean hasMore) { + mHasMore = hasMore; + } + + public String getText() { + return mText; + } + + public void setText(String text) { + mText = text; + } + + public List getUsers() { + return mUsers; + } + + public void setUsers(List users) { + mUsers = users; + } + +} diff --git a/app/src/main/java/org/autojs/autojs/network/entity/topic/Topic.java b/app/src/main/java/org/autojs/autojs/network/entity/topic/Topic.java new file mode 100644 index 00000000..49b78df6 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/network/entity/topic/Topic.java @@ -0,0 +1,379 @@ + +package org.autojs.autojs.network.entity.topic; + +import android.text.Html; + +import java.util.ArrayList; +import java.util.List; + +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; + +import org.autojs.autojs.network.entity.user.User; + +@SuppressWarnings("unused") +public class Topic { + + private static final Gson GSON = new Gson(); + + @SerializedName("category") + private Category mCategory; + @SerializedName("cid") + private String mCid; + @SerializedName("deleted") + private boolean mDeleted; + @SerializedName("downvotes") + private long mDownvotes; + @SerializedName("icons") + private List mIcons; + @SerializedName("ignored") + private boolean mIgnored; + @SerializedName("index") + private long mIndex; + @SerializedName("isOwner") + private boolean mIsOwner; + @SerializedName("lastposttime") + private String mLastposttime; + @SerializedName("lastposttimeISO") + private String mLastposttimeISO; + @SerializedName("locked") + private boolean mLocked; + @SerializedName("mainPid") + private String mMainPid; + @SerializedName("pinned") + private boolean mPinned; + @SerializedName("postcount") + private String mPostcount; + @SerializedName("slug") + private String mSlug; + @SerializedName("tags") + private List mTags; + @SerializedName("thumb") + private String mThumb; + @SerializedName("tid") + private String mTid; + @SerializedName("timestamp") + private String mTimestamp; + @SerializedName("timestampISO") + private String mTimestampISO; + @SerializedName("title") + private String mTitle; + @SerializedName("titleRaw") + private String mTitleRaw; + @SerializedName("uid") + private String mUid; + @SerializedName("unread") + private boolean mUnread; + @SerializedName("unreplied") + private boolean mUnreplied; + @SerializedName("upvotes") + private long mUpvotes; + @SerializedName("user") + private User mUser; + @SerializedName("viewcount") + private String mViewcount; + @SerializedName("votes") + private long mVotes; + @SerializedName("posts") + private List mPosts = new ArrayList<>(); + @SerializedName("teaser") + private Post mTeaser; + + private AppInfo mAppInfo; + + public Category getCategory() { + return mCategory; + } + + public void setCategory(Category category) { + mCategory = category; + } + + public String getCid() { + return mCid; + } + + public void setCid(String cid) { + mCid = cid; + } + + public boolean getDeleted() { + return mDeleted; + } + + public void setDeleted(boolean deleted) { + mDeleted = deleted; + } + + public long getDownvotes() { + return mDownvotes; + } + + public void setDownvotes(long downvotes) { + mDownvotes = downvotes; + } + + public List getIcons() { + return mIcons; + } + + public void setIcons(List icons) { + mIcons = icons; + } + + public boolean getIgnored() { + return mIgnored; + } + + public void setIgnored(boolean ignored) { + mIgnored = ignored; + } + + public long getIndex() { + return mIndex; + } + + public void setIndex(long index) { + mIndex = index; + } + + public boolean getIsOwner() { + return mIsOwner; + } + + public void setIsOwner(boolean isOwner) { + mIsOwner = isOwner; + } + + public String getLastposttime() { + return mLastposttime; + } + + public void setLastposttime(String lastposttime) { + mLastposttime = lastposttime; + } + + public String getLastposttimeISO() { + return mLastposttimeISO; + } + + public void setLastposttimeISO(String lastposttimeISO) { + mLastposttimeISO = lastposttimeISO; + } + + public boolean getLocked() { + return mLocked; + } + + public void setLocked(boolean locked) { + mLocked = locked; + } + + public String getMainPid() { + return mMainPid; + } + + public void setMainPid(String mainPid) { + mMainPid = mainPid; + } + + public boolean getPinned() { + return mPinned; + } + + public void setPinned(boolean pinned) { + mPinned = pinned; + } + + public String getPostcount() { + return mPostcount; + } + + public void setPostcount(String postcount) { + mPostcount = postcount; + } + + public String getSlug() { + return mSlug; + } + + public void setSlug(String slug) { + mSlug = slug; + } + + public List getTags() { + return mTags; + } + + public void setTags(List tags) { + mTags = tags; + } + + public String getThumb() { + return mThumb; + } + + public void setThumb(String thumb) { + mThumb = thumb; + } + + public String getTid() { + return mTid; + } + + public void setTid(String tid) { + mTid = tid; + } + + public String getTimestamp() { + return mTimestamp; + } + + public void setTimestamp(String timestamp) { + mTimestamp = timestamp; + } + + public String getTimestampISO() { + return mTimestampISO; + } + + public void setTimestampISO(String timestampISO) { + mTimestampISO = timestampISO; + } + + public String getTitle() { + return mTitle; + } + + public void setTitle(String title) { + mTitle = title; + } + + public String getTitleRaw() { + return mTitleRaw; + } + + public void setTitleRaw(String titleRaw) { + mTitleRaw = titleRaw; + } + + public String getUid() { + return mUid; + } + + public void setUid(String uid) { + mUid = uid; + } + + public boolean getUnread() { + return mUnread; + } + + public void setUnread(boolean unread) { + mUnread = unread; + } + + public boolean getUnreplied() { + return mUnreplied; + } + + public void setUnreplied(boolean unreplied) { + mUnreplied = unreplied; + } + + public long getUpvotes() { + return mUpvotes; + } + + public void setUpvotes(long upvotes) { + mUpvotes = upvotes; + } + + public User getUser() { + return mUser; + } + + public void setUser(User user) { + mUser = user; + } + + public String getViewcount() { + return mViewcount; + } + + public void setViewcount(String viewcount) { + mViewcount = viewcount; + } + + public long getVotes() { + return mVotes; + } + + public void setVotes(long votes) { + mVotes = votes; + } + + public List getPosts() { + return mPosts; + } + + public void setPosts(List posts) { + mPosts = posts; + } + + public AppInfo getAppInfo() { + if (mAppInfo != null) { + return mAppInfo; + } + if (mTeaser == null || mTeaser.getContent() == null) { + return null; + } + try { + String decoded = Html.fromHtml(mTeaser.getContent()).toString(); + AppInfo appInfo = GSON.fromJson(decoded, AppInfo.class); + mAppInfo = appInfo; + return appInfo; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + @Override + public String toString() { + return "Topic{" + + "mCategory=" + mCategory + + ", mCid='" + mCid + '\'' + + ", mDeleted=" + mDeleted + + ", mDownvotes=" + mDownvotes + + ", mIcons=" + mIcons + + ", mIgnored=" + mIgnored + + ", mIndex=" + mIndex + + ", mIsOwner=" + mIsOwner + + ", mLastposttime='" + mLastposttime + '\'' + + ", mLastposttimeISO='" + mLastposttimeISO + '\'' + + ", mLocked=" + mLocked + + ", mMainPid='" + mMainPid + '\'' + + ", mPinned=" + mPinned + + ", mPostcount='" + mPostcount + '\'' + + ", mSlug='" + mSlug + '\'' + + ", mTags=" + mTags + + ", mThumb='" + mThumb + '\'' + + ", mTid='" + mTid + '\'' + + ", mTimestamp='" + mTimestamp + '\'' + + ", mTimestampISO='" + mTimestampISO + '\'' + + ", mTitle='" + mTitle + '\'' + + ", mTitleRaw='" + mTitleRaw + '\'' + + ", mUid='" + mUid + '\'' + + ", mUnread=" + mUnread + + ", mUnreplied=" + mUnreplied + + ", mUpvotes=" + mUpvotes + + ", mUser=" + mUser + + ", mViewcount='" + mViewcount + '\'' + + ", mVotes=" + mVotes + + ", mPosts=" + mPosts + + ", mTeaser=" + mTeaser + + ", mAppInfo=" + mAppInfo + + '}'; + } +} diff --git a/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.java b/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.java index 624ea6e0..f2e38e2c 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.java @@ -52,7 +52,7 @@ import org.autojs.autojs.ui.floating.FloatyWindowManger; import org.autojs.autojs.ui.log.LogActivity_; import org.autojs.autojs.ui.main.community.CommunityFragment; import org.autojs.autojs.ui.main.community.CommunityFragment_; -import org.autojs.autojs.ui.main.sample.MarketFragment_; +import org.autojs.autojs.ui.main.market.MarketFragment; import org.autojs.autojs.ui.main.scripts.MyScriptListFragment_; import org.autojs.autojs.ui.main.task.TaskManagerFragment_; import org.autojs.autojs.ui.settings.SettingsActivity_; @@ -172,7 +172,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega .add(new MyScriptListFragment_(), R.string.text_file) .add(new DocsFragment_(), R.string.text_tutorial) .add(new CommunityFragment_(), R.string.text_community) - .add(new MarketFragment_(), R.string.text_market) + .add(new MarketFragment(), R.string.text_market) .add(new TaskManagerFragment_(), R.string.text_manage) .build(); mViewPager.setAdapter(mPagerAdapter); diff --git a/app/src/main/java/org/autojs/autojs/ui/main/market/MarketFragment.kt b/app/src/main/java/org/autojs/autojs/ui/main/market/MarketFragment.kt new file mode 100644 index 00000000..fdde2062 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/ui/main/market/MarketFragment.kt @@ -0,0 +1,98 @@ +package org.autojs.autojs.ui.main.market + +import android.app.Activity +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.stardust.autojs.workground.WrapContentLinearLayoutManager +import kotlinx.android.synthetic.main.fragment_market.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import org.autojs.autojs.R +import org.autojs.autojs.network.TopicService +import org.autojs.autojs.network.entity.topic.Topic +import org.autojs.autojs.ui.main.ViewPagerFragment +import org.autojs.autojs.ui.widget.AvatarView +import org.joda.time.format.DateTimeFormat + +class MarketFragment : ViewPagerFragment(0) { + + private val mTopics = ArrayList() + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_market, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + topicsView.layoutManager = WrapContentLinearLayoutManager(context) + topicsView.adapter = Adapter() + swipeRefreshLayout.setOnRefreshListener { + refresh() + } + refresh() + } + + private fun refresh() { + GlobalScope.launch(Dispatchers.Main) { + swipeRefreshLayout.isRefreshing = true + val topics = TopicService.getScriptsTopics() + mTopics.clear() + mTopics.addAll(topics) + topicsView.adapter!!.notifyDataSetChanged() + swipeRefreshLayout.isRefreshing = false + } + } + + override fun onBackPressed(activity: Activity): Boolean { + return false + } + + override fun onFabClick(fab: FloatingActionButton) { + + } + + inner class TopicViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + + val rootView: TextView = itemView.findViewById(R.id.root) + val titleView: TextView = itemView.findViewById(R.id.title) + val avatarView: AvatarView = itemView.findViewById(R.id.avatar) + val usernameView: TextView = itemView.findViewById(R.id.username) + val dateView: TextView = itemView.findViewById(R.id.date) + + } + + inner class Adapter : RecyclerView.Adapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TopicViewHolder { + return TopicViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_topic, parent, false)) + } + + override fun getItemCount(): Int { + return mTopics.size + } + + override fun onBindViewHolder(holder: TopicViewHolder, position: Int) { + + val topic = mTopics[position] + holder.run { + val root = topic.appInfo.permissions.contains("root") + rootView.text = if (root) { + "Root" + } else { + "免Root" + } + titleView.text = topic.title + avatarView.setUser(topic.user) + usernameView.text = topic.user.username + + dateView.text = DateTimeFormat.mediumDateTime().print(topic.timestamp.toLong()) + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/ui/main/sample/MarketFragment.java b/app/src/main/java/org/autojs/autojs/ui/main/sample/MarketFragment.java deleted file mode 100644 index 5de77050..00000000 --- a/app/src/main/java/org/autojs/autojs/ui/main/sample/MarketFragment.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.autojs.autojs.ui.main.sample; - -import android.app.Activity; -import android.os.Bundle; -import androidx.annotation.Nullable; -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import org.autojs.autojs.R; -import org.autojs.autojs.ui.main.QueryEvent; -import org.autojs.autojs.ui.main.ViewPagerFragment; - -import com.stardust.util.BackPressedHandler; - -import org.androidannotations.annotations.AfterViews; -import org.androidannotations.annotations.EFragment; -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; - -/** - * Created by Stardust on 2017/10/28. - */ -@EFragment(R.layout.fragment_market) -public class MarketFragment extends ViewPagerFragment implements BackPressedHandler { - - - public MarketFragment() { - super(ROTATION_GONE); - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - EventBus.getDefault().register(this); - } - - @AfterViews - void setUpViews() { - - } - - @Override - public void onResume() { - super.onResume(); - ((BackPressedHandler.HostActivity) getActivity()) - .getBackPressedObserver() - .registerHandlerAtFront(this); - } - - @Override - public void onPause() { - super.onPause(); - ((BackPressedHandler.HostActivity) getActivity()) - .getBackPressedObserver() - .unregisterHandler(this); - } - - @Override - protected void onFabClick(FloatingActionButton fab) { - - } - - - @Override - public boolean onBackPressed(Activity activity) { - return false; - } - - - @Subscribe - public void onQuerySummit(QueryEvent event) { - if (!isShown()) { - return; - } - if (event == QueryEvent.CLEAR) { - return; - } - - } - - - @Override - public void onDestroy() { - super.onDestroy(); - EventBus.getDefault().unregister(this); - } - - -} diff --git a/app/src/main/res/drawable-xhdpi/upvote.png b/app/src/main/res/drawable-xhdpi/upvote.png new file mode 100644 index 0000000000000000000000000000000000000000..b505ef0d422623823336aadf528ae5b8b302d0d6 GIT binary patch literal 2987 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 n + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download.png b/app/src/main/res/drawable/download.png new file mode 100644 index 0000000000000000000000000000000000000000..1977b4aeb12d6c9dba0679b8f11eadd635029766 GIT binary patch literal 6009 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 N3Z-YJTdnPa{cjxq8$JL4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/downvote.png b/app/src/main/res/drawable/downvote.png new file mode 100644 index 0000000000000000000000000000000000000000..dca391c5cd66d42e7edaaa9bb77c0972e3e9914b GIT binary patch literal 3032 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 - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/star.png b/app/src/main/res/drawable/star.png new file mode 100644 index 0000000000000000000000000000000000000000..ffba2ec1fc5dbb623d67c88ab0bdead819555466 GIT binary patch literal 6439 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 PK!}i<28e2P2h9HfIK%iN literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/divider_project_toolbar.xml b/app/src/main/res/layout/divider_project_toolbar.xml deleted file mode 100644 index e64d9253..00000000 --- a/app/src/main/res/layout/divider_project_toolbar.xml +++ /dev/null @@ -1,5 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_market.xml b/app/src/main/res/layout/fragment_market.xml index 68b14d65..a6a7bedb 100644 --- a/app/src/main/res/layout/fragment_market.xml +++ b/app/src/main/res/layout/fragment_market.xml @@ -1,9 +1,14 @@ - + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/item_topic.xml b/app/src/main/res/layout/item_topic.xml new file mode 100644 index 00000000..c5723433 --- /dev/null +++ b/app/src/main/res/layout/item_topic.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/menu_sample_options.xml b/app/src/main/res/menu/menu_sample_options.xml deleted file mode 100644 index e37a6548..00000000 --- a/app/src/main/res/menu/menu_sample_options.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 2741b21e..42284aa2 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -32,13 +32,11 @@ Stardust Source Code Copied - Donate https://github.com/hyb1996/NoRootScriptDroid [UiAutomator]Download:http://www.coolapk.com/apk/org.autojs.autojs Floating Window Bug Report Press again to exit - No running scipts %d script(s) is(are) stopped Running Open by other apps @@ -50,13 +48,11 @@ Error Copy debugging log This is a software developer(。・・)ノ - lol Please choose Crash~ o(≧口≦)o (ಥ _ ಥ)Exit or submit a bug report or copy debugging log to the developer(≧∇≦)ノ Clear Console - Submit Bug report Submission Failed Submitted successfully Cannot process file @@ -66,7 +62,6 @@ Recording stopped Copy File writing failed - Join in QQ Group Use the volume keys to control Stop or start recording when volume changes key_use_volume_control_record @@ -139,7 +134,6 @@ Issue Unknown error Send by email - Invalid name Import failed No brower installed. Choose a script @@ -150,7 +144,6 @@ Check for updates failed Download Download now - Dowloading Download failed Do not ask again for this version Beautify code diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 6181d8b3..e586a865 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -3,7 +3,6 @@ #202020 #333333 #252525 - #7F7F80 #9a9a9a #808080 #111214 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index a9c7e701..47b14279 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,14 +10,11 @@ #9DA0A2 #282C2F #f0f0f0 - #ef5350 - #777777 #111214 #FFFFFF #FFFFFF #FFFFFF - @android:color/primary_text_light #484C4F #9DA0A2 #f2f3f5 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0d5ffaf7..99eb1d8c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -33,14 +33,11 @@ hybbbb1996@gmail.com 软件源代码 已复制到剪贴板 - 打赏作者 https://github.com/hyb1996/NoRootScriptDroid [Auto.js]下载地址:http://www.coolapk.com/apk/org.autojs.autojs 悬浮窗 错误报告 再按一次退出程序 - 很抱歉(ಥ _ ಥ)程序遇到未知错误,即将停止运行\n错误代码: - 没有正在运行的脚本 已停止%d个正在运行的脚本 开始运行 用其他应用打开 @@ -52,14 +49,12 @@ 错误 复制调试信息 这是软件开发者(。・・)ノ - 略略略 请选择 崩溃了o(≧口≦)o 将会自动提交错误信息。您也可以手动复制调试信息提交给开发者(*^▽^*)或者点击\"退出\"退出程序o(╥﹏╥)o 清空 控制台 日志 - 提交错误报告 提交失败 提交成功 无法处理文件 @@ -69,7 +64,6 @@ 录制结束 复制到剪贴板 文件写入失败 - 加入QQ互赞&交流群 使用音量下键控制 开启悬浮窗后每次音量下键会开始或停止脚本录制 key_use_volume_control_record @@ -104,7 +98,6 @@ key_use_volume_control_running 音量上键停止所有脚本 需要启用无障碍服务 - 名称不能为空 导入失败 没有浏览器耶o(╯□╰)o快去安装一个吧 刷新 @@ -126,7 +119,6 @@ 更新日志 下载地址 直接下载 - 下载中 下载失败 此版本不再提示 格式化代码 @@ -151,12 +143,6 @@ 在布局层次中查看 在布局范围中查看 更多 - 跳过 %d - key_ad_showing_mode - 广告 - 欣赏广告 - 广告显示设置 - Default 保存成功,请刷新目录 循环运行 循环间隔(秒) @@ -166,7 +152,6 @@ 延迟多少秒后开始循环 格式错误 打开无障碍服务 - 布局抓取失败,请关闭悬浮窗后动一下页面重试 使用root权限开启失败 处理中 删除失败 @@ -184,7 +169,6 @@ 文件夹 文件 教程 - 脚本 社区 管理 未登录 @@ -201,12 +185,10 @@ 时间 大小 类型 - 捐赠 编辑器主题 跳转到行 信息 查找/替换 - 粘贴 复制全部 复制行 删除行 @@ -219,14 +201,10 @@ 向上 正则语法与JavaScript中相同, 可使用$1~9代替被捕获的匹配 跳转 - 转到定义 转到文件末尾 转到文件开始 转到行首 转到行尾 - 重构 - 选择变量 - 显示变量类型 退出悬浮窗 保存到 取消下载 @@ -267,9 +245,7 @@ 注册失败 注册成功 示例代码 - 导入到我的脚本 重置为初始内容 - 重置失败 重置成功 无法读取文件 服务 @@ -338,9 +314,6 @@ 退出登录 操作失败,请稍后重试 稳定模式通过省略布局细节使脚本抓取布局时更稳定,但同时获取到的屏幕上的控件可能会减少。\n\n重新启动无障碍服务才能生效。 - 获取权限失败 :-( - 重新授予 - 软件需要显示启动页广告来维持服务器和软件的开发和维护,因此需要\"读取手机状态\"的权限。\n如果您不喜欢广告,可以在设置中设定广告每天只显示一次。 2184044085\n3566596539\npJTCkHuhypD9i3UBQ55XQw==RtXsgCTVFA7VYhLeF1TSkg== 8 56 @@ -354,7 +327,6 @@ 布局层次分析 布局分析 指针位置[Root] - 跳过 更改脚本文件夹路径 key_script_dir_path /脚本/ @@ -369,7 +341,6 @@ 停止 增加监视的变量或表达式 变量或表达式 - 变量 删除所有断点 长按\"运行\"图标也可以启动调试 调试 [%s] @@ -379,7 +350,6 @@ 结果 关闭 执行 - 使用系统闹钟唤醒Auto.js 连接失败: %s 确定要删除%s吗 特定事件(广播)触发运行 @@ -387,8 +357,6 @@ 类/包名 查看文档 import - key_ad_type - 广告类型设置 市场 运行配置 主脚本名称 @@ -431,8 +399,6 @@ Auto.js启动时 查看使用统计权限 通过\"查看使用统计\"权限可以获取本设备过去使用应用的情况,从而使获取当前应用(currentPackage)时更准确。 - 手势监听 - 开启后将支持events手势事件,但Auto.js崩溃时可能会导致屏幕失灵 打开方式 描述至少要 %d 个字.