新增 市场界面
删除 无用资源
This commit is contained in:
@@ -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())
|
||||
|
||||
23
app/src/main/java/org/autojs/autojs/network/TopicService.kt
Normal file
23
app/src/main/java/org/autojs/autojs/network/TopicService.kt
Normal file
@@ -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<Topic> {
|
||||
val category = mTopicApi.getCategory(cid).await()
|
||||
return category.topics.filter {
|
||||
it.appInfo != null
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun getScriptsTopics(): List<Topic> {
|
||||
return getTopics(CID_SCRIPTS)
|
||||
}
|
||||
|
||||
}
|
||||
17
app/src/main/java/org/autojs/autojs/network/api/TopicApi.kt
Normal file
17
app/src/main/java/org/autojs/autojs/network/api/TopicApi.kt
Normal file
@@ -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<Category>
|
||||
|
||||
@GET("/api/topic/{tid}")
|
||||
fun getTopic(@Path("tid") cid: Long): Deferred<Topic>
|
||||
|
||||
}
|
||||
@@ -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<String> mPermissions;
|
||||
@SerializedName("qq")
|
||||
private String mQq;
|
||||
@SerializedName("releaseNotes")
|
||||
private String mReleaseNotes;
|
||||
@SerializedName("screenshots")
|
||||
private List<String> 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<String> getPermissions() {
|
||||
return mPermissions;
|
||||
}
|
||||
|
||||
public void setPermissions(List<String> 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<String> getScreenshots() {
|
||||
return mScreenshots;
|
||||
}
|
||||
|
||||
public void setScreenshots(List<String> 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 +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -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<Topic> 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<Topic> getTopics() {
|
||||
return mTopics;
|
||||
}
|
||||
|
||||
public void setTopics(List<Topic> 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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<Object> mPages;
|
||||
@SerializedName("prev")
|
||||
private Page mPrev;
|
||||
@SerializedName("rel")
|
||||
private List<Object> 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<Object> getPages() {
|
||||
return mPages;
|
||||
}
|
||||
|
||||
public void setPages(List<Object> pages) {
|
||||
mPages = pages;
|
||||
}
|
||||
|
||||
public Page getPrev() {
|
||||
return mPrev;
|
||||
}
|
||||
|
||||
public void setPrev(Page prev) {
|
||||
mPrev = prev;
|
||||
}
|
||||
|
||||
public List<Object> getRel() {
|
||||
return mRel;
|
||||
}
|
||||
|
||||
public void setRel(List<Object> rel) {
|
||||
mRel = rel;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<User> 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<User> getUsers() {
|
||||
return mUsers;
|
||||
}
|
||||
|
||||
public void setUsers(List<User> users) {
|
||||
mUsers = users;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<Object> 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<Object> 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<Post> 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<Object> getIcons() {
|
||||
return mIcons;
|
||||
}
|
||||
|
||||
public void setIcons(List<Object> 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<Object> getTags() {
|
||||
return mTags;
|
||||
}
|
||||
|
||||
public void setTags(List<Object> 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<Post> getPosts() {
|
||||
return mPosts;
|
||||
}
|
||||
|
||||
public void setPosts(List<Post> 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 +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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<Topic>()
|
||||
|
||||
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<TopicViewHolder>() {
|
||||
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())
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
BIN
app/src/main/res/drawable-xhdpi/upvote.png
Normal file
BIN
app/src/main/res/drawable-xhdpi/upvote.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.9 KiB |
7
app/src/main/res/drawable/bg_label_root_permission.xml
Normal file
7
app/src/main/res/drawable/bg_label_root_permission.xml
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<corners android:radius="5dp"/>
|
||||
|
||||
<solid android:color="@color/colorAccent"/>
|
||||
</shape>
|
||||
BIN
app/src/main/res/drawable/download.png
Normal file
BIN
app/src/main/res/drawable/download.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.9 KiB |
BIN
app/src/main/res/drawable/downvote.png
Normal file
BIN
app/src/main/res/drawable/downvote.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.0 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,35 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_pressed="true">
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
|
||||
<solid android:color="#80000000"/>
|
||||
|
||||
<padding
|
||||
android:bottom="3dp"
|
||||
android:left="12dp"
|
||||
android:right="12dp"
|
||||
android:top="3dp"/>
|
||||
|
||||
<corners android:radius="16dp"/>
|
||||
|
||||
</shape>
|
||||
</item>
|
||||
<item>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
|
||||
<solid android:color="#40000000"/>
|
||||
|
||||
<padding
|
||||
android:bottom="3dp"
|
||||
android:left="12dp"
|
||||
android:right="12dp"
|
||||
android:top="3dp"/>
|
||||
|
||||
<corners android:radius="16dp"/>
|
||||
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
BIN
app/src/main/res/drawable/star.png
Normal file
BIN
app/src/main/res/drawable/star.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.3 KiB |
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<View xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0.5dp"
|
||||
android:background="#d8d8d8"/>
|
||||
@@ -1,9 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<org.autojs.autojs.theme.widget.ThemeColorSwipeRefreshLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/swipeRefreshLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
||||
<androidx.recyclerview.widget.ThemeColorRecyclerView
|
||||
android:id="@+id/topicsView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
</FrameLayout>
|
||||
</org.autojs.autojs.theme.widget.ThemeColorSwipeRefreshLayout>
|
||||
131
app/src/main/res/layout/item_topic.xml
Normal file
131
app/src/main/res/layout/item_topic.xml
Normal file
@@ -0,0 +1,131 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.cardview.widget.CardView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_marginRight="4dp"
|
||||
android:layout_marginBottom="2dp"
|
||||
app:cardCornerRadius="2dp">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="8dp">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/root"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/bg_label_root_permission"
|
||||
android:paddingLeft="4dp"
|
||||
android:paddingTop="2dp"
|
||||
android:paddingRight="4dp"
|
||||
android:paddingBottom="2dp"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="12sp"
|
||||
tools:text="免Root"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="8dp"
|
||||
android:textColor="@android:color/black"
|
||||
android:textSize="17sp"
|
||||
tools:text="Hello, Auto.js"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp">
|
||||
|
||||
<org.autojs.autojs.ui.widget.AvatarView
|
||||
android:id="@+id/avatar"
|
||||
android:layout_width="32dp"
|
||||
android:layout_height="32dp"
|
||||
android:layout_marginLeft="12dp"
|
||||
android:layout_marginRight="12dp"
|
||||
android:scaleType="fitXY"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/username"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#202020"
|
||||
android:textSize="14sp"
|
||||
tools:text="admin"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/date"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#909090"
|
||||
android:textSize="13sp"
|
||||
tools:text="admin"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="24dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="3dp"
|
||||
android:paddingBottom="3dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/download"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:src="@drawable/download"
|
||||
android:tint="#939393"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/upvote"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:src="@drawable/upvote"
|
||||
android:tint="#939393"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/downvote"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:src="@drawable/downvote"
|
||||
android:tint="#939393"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/star"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:src="@drawable/star"
|
||||
android:tint="#939393"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
</androidx.cardview.widget.CardView>
|
||||
@@ -1,19 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<item
|
||||
android:id="@+id/run_repeatedly"
|
||||
android:title="@string/text_run_repeatedly"/>
|
||||
|
||||
<item
|
||||
android:id="@+id/create_shortcut"
|
||||
android:title="@string/text_send_shortcut"/>
|
||||
<item
|
||||
android:id="@+id/copy_to_my_script"
|
||||
android:title="@string/text_copy_to_my_script"/>
|
||||
|
||||
<item
|
||||
android:id="@+id/reset"
|
||||
android:title="@string/text_reset_to_initial_content"/>
|
||||
|
||||
</menu>
|
||||
@@ -32,13 +32,11 @@
|
||||
<string name="developer">Stardust</string>
|
||||
<string name="github">Source Code</string>
|
||||
<string name="text_already_copy_to_clip">Copied</string>
|
||||
<string name="donate_developer">Donate</string>
|
||||
<string name="my_github">https://github.com/hyb1996/NoRootScriptDroid</string>
|
||||
<string name="share_app">[UiAutomator]Download:http://www.coolapk.com/apk/org.autojs.autojs </string>
|
||||
<string name="text_floating_window">Floating Window</string>
|
||||
<string name="text_error_report">Bug Report</string>
|
||||
<string name="text_press_again_to_exit">Press again to exit</string>
|
||||
<string name="text_no_running_script">No running scipts</string>
|
||||
<string name="text_already_stop_n_scripts">%d script(s) is(are) stopped</string>
|
||||
<string name="text_start_running">Running</string>
|
||||
<string name="text_open_by_other_apps">Open by other apps</string>
|
||||
@@ -50,13 +48,11 @@
|
||||
<string name="text_error">Error</string>
|
||||
<string name="text_copy_debug_info">Copy debugging log</string>
|
||||
<string name="text_it_is_the_developer_of_app">This is a software developer(。・・)ノ</string>
|
||||
<string name="text_lll">lol</string>
|
||||
<string name="text_please_choose">Please choose </string>
|
||||
<string name="text_crash">Crash~ o(≧口≦)o</string>
|
||||
<string name="crash_feedback">(ಥ _ ಥ)Exit or submit a bug report or copy debugging log to the developer(≧∇≦)ノ</string>
|
||||
<string name="text_clear">Clear</string>
|
||||
<string name="text_console">Console</string>
|
||||
<string name="text_report_bug">Submit Bug report</string>
|
||||
<string name="text_report_fail">Submission Failed</string>
|
||||
<string name="text_report_succeed">Submitted successfully</string>
|
||||
<string name="edit_and_run_handle_intent_error">Cannot process file</string>
|
||||
@@ -66,7 +62,6 @@
|
||||
<string name="text_recorded">Recording stopped</string>
|
||||
<string name="text_copy_to_clip">Copy</string>
|
||||
<string name="text_file_write_fail">File writing failed</string>
|
||||
<string name="text_join_qq_group">Join in QQ Group</string>
|
||||
<string name="text_use_volume_control_record">Use the volume keys to control</string>
|
||||
<string name="summary_use_volume_control_record">Stop or start recording when volume changes</string>
|
||||
<string name="key_use_volume_control_record">key_use_volume_control_record</string>
|
||||
@@ -139,7 +134,6 @@
|
||||
<string name="air_title_issue">Issue</string>
|
||||
<string name="air_dialog_description_failed_unknown">Unknown error</string>
|
||||
<string name="air_label_use_email">Send by email</string>
|
||||
<string name="text_name_should_not_be_empty">Invalid name</string>
|
||||
<string name="text_import_fail">Import failed</string>
|
||||
<string name="text_no_brower">No brower installed.</string>
|
||||
<string name="text_please_choose_a_script">Choose a script</string>
|
||||
@@ -150,7 +144,6 @@
|
||||
<string name="text_check_update_error">Check for updates failed</string>
|
||||
<string name="text_download_url">Download</string>
|
||||
<string name="text_directly_download">Download now</string>
|
||||
<string name="text_downloading">Dowloading</string>
|
||||
<string name="text_download_failed">Download failed</string>
|
||||
<string name="text_do_not_ask_again_for_this_version">Do not ask again for this version</string>
|
||||
<string name="text_code_beautify">Beautify code</string>
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
<color name="window_background">#202020</color>
|
||||
<color name="item_background">#333333</color>
|
||||
<color name="item_background_dark">#252525</color>
|
||||
<color name="text_color_primary">#7F7F80</color>
|
||||
<color name="drawer_menu_item_text_color">#9a9a9a</color>
|
||||
<color name="drawer_menu_group_text_color">#808080</color>
|
||||
<color name="divider">#111214</color>
|
||||
|
||||
@@ -10,14 +10,11 @@
|
||||
<color name="prefTextColorSecondary">#9DA0A2</color>
|
||||
<color name="prefTextColorPrimary">#282C2F</color>
|
||||
<color name="divider_functions_keyboard">#f0f0f0</color>
|
||||
<color name="color_red">#ef5350</color>
|
||||
<color name="project_toolbar_color">#777777</color>
|
||||
<color name="theme_color_black">#111214</color>
|
||||
|
||||
<color name="window_background">#FFFFFF</color>
|
||||
<color name="item_background">#FFFFFF</color>
|
||||
<color name="item_background_dark">#FFFFFF</color>
|
||||
<color name="text_color_primary">@android:color/primary_text_light</color>
|
||||
<color name="text_color_secondary">#484C4F</color>
|
||||
<color name="text_color_thirdly">#9DA0A2</color>
|
||||
<color name="divider">#f2f3f5</color>
|
||||
|
||||
@@ -33,14 +33,11 @@
|
||||
<string name="email" translatable="false">hybbbb1996@gmail.com</string>
|
||||
<string name="github">软件源代码</string>
|
||||
<string name="text_already_copy_to_clip">已复制到剪贴板</string>
|
||||
<string name="donate_developer">打赏作者</string>
|
||||
<string name="my_github">https://github.com/hyb1996/NoRootScriptDroid</string>
|
||||
<string name="share_app">[Auto.js]下载地址:http://www.coolapk.com/apk/org.autojs.autojs </string>
|
||||
<string name="text_floating_window">悬浮窗</string>
|
||||
<string name="text_error_report">错误报告</string>
|
||||
<string name="text_press_again_to_exit">再按一次退出程序</string>
|
||||
<string name="sorry_for_crash">很抱歉(ಥ _ ಥ)程序遇到未知错误,即将停止运行\n错误代码:</string>
|
||||
<string name="text_no_running_script">没有正在运行的脚本</string>
|
||||
<string name="text_already_stop_n_scripts">已停止%d个正在运行的脚本</string>
|
||||
<string name="text_start_running">开始运行</string>
|
||||
<string name="text_open_by_other_apps">用其他应用打开</string>
|
||||
@@ -52,14 +49,12 @@
|
||||
<string name="text_error">错误</string>
|
||||
<string name="text_copy_debug_info">复制调试信息</string>
|
||||
<string name="text_it_is_the_developer_of_app">这是软件开发者(。・・)ノ</string>
|
||||
<string name="text_lll">略略略</string>
|
||||
<string name="text_please_choose">请选择</string>
|
||||
<string name="text_crash">崩溃了o(≧口≦)o</string>
|
||||
<string name="crash_feedback">将会自动提交错误信息。您也可以手动复制调试信息提交给开发者(*^▽^*)或者点击\"退出\"退出程序o(╥﹏╥)o</string>
|
||||
<string name="text_clear">清空</string>
|
||||
<string name="text_console">控制台</string>
|
||||
<string name="text_log">日志</string>
|
||||
<string name="text_report_bug">提交错误报告</string>
|
||||
<string name="text_report_fail">提交失败</string>
|
||||
<string name="text_report_succeed">提交成功</string>
|
||||
<string name="edit_and_run_handle_intent_error">无法处理文件</string>
|
||||
@@ -69,7 +64,6 @@
|
||||
<string name="text_recorded">录制结束</string>
|
||||
<string name="text_copy_to_clip">复制到剪贴板</string>
|
||||
<string name="text_file_write_fail">文件写入失败</string>
|
||||
<string name="text_join_qq_group">加入QQ互赞&交流群</string>
|
||||
<string name="text_use_volume_control_record">使用音量下键控制</string>
|
||||
<string name="summary_use_volume_control_record">开启悬浮窗后每次音量下键会开始或停止脚本录制</string>
|
||||
<string name="key_use_volume_control_record">key_use_volume_control_record</string>
|
||||
@@ -104,7 +98,6 @@
|
||||
<string name="key_use_volume_control_running">key_use_volume_control_running</string>
|
||||
<string name="text_use_volume_to_stop_running">音量上键停止所有脚本</string>
|
||||
<string name="text_need_to_enable_accessibility_service">需要启用无障碍服务</string>
|
||||
<string name="text_name_should_not_be_empty">名称不能为空</string>
|
||||
<string name="text_import_fail">导入失败</string>
|
||||
<string name="text_no_brower">没有浏览器耶o(╯□╰)o快去安装一个吧</string>
|
||||
<string name="text_refresh">刷新</string>
|
||||
@@ -126,7 +119,6 @@
|
||||
<string name="text_release_notes">更新日志</string>
|
||||
<string name="text_download_url">下载地址</string>
|
||||
<string name="text_directly_download">直接下载</string>
|
||||
<string name="text_downloading">下载中</string>
|
||||
<string name="text_download_failed">下载失败</string>
|
||||
<string name="text_do_not_ask_again_for_this_version">此版本不再提示</string>
|
||||
<string name="text_code_beautify">格式化代码</string>
|
||||
@@ -151,12 +143,6 @@
|
||||
<string name="text_show_layout_hierarchy">在布局层次中查看</string>
|
||||
<string name="text_show_layout_bounds">在布局范围中查看</string>
|
||||
<string name="text_more">更多</string>
|
||||
<string name="format_skip">跳过 %d</string>
|
||||
<string name="key_ad_showing_mode">key_ad_showing_mode</string>
|
||||
<string name="text_ad">广告</string>
|
||||
<string name="show_ad">欣赏广告</string>
|
||||
<string name="text_ad_showing_settings">广告显示设置</string>
|
||||
<string name="text_default">Default</string>
|
||||
<string name="text_script_save_successfully">保存成功,请刷新目录</string>
|
||||
<string name="text_run_repeatedly">循环运行</string>
|
||||
<string name="text_loop_interval">循环间隔(秒)</string>
|
||||
@@ -166,7 +152,6 @@
|
||||
<string name="hint_loop_delay">延迟多少秒后开始循环</string>
|
||||
<string name="text_number_format_error">格式错误</string>
|
||||
<string name="text_accessibility_settings">打开无障碍服务</string>
|
||||
<string name="text_inspect_failed">布局抓取失败,请关闭悬浮窗后动一下页面重试</string>
|
||||
<string name="text_enable_accessibitliy_service_by_root_failed">使用root权限开启失败</string>
|
||||
<string name="text_on_progress">处理中</string>
|
||||
<string name="text_delete_failed">删除失败</string>
|
||||
@@ -184,7 +169,6 @@
|
||||
<string name="text_directory">文件夹</string>
|
||||
<string name="text_file">文件</string>
|
||||
<string name="text_tutorial">教程</string>
|
||||
<string name="text_script">脚本</string>
|
||||
<string name="text_community">社区</string>
|
||||
<string name="text_manage">管理</string>
|
||||
<string name="not_login">未登录</string>
|
||||
@@ -201,12 +185,10 @@
|
||||
<string name="text_time">时间</string>
|
||||
<string name="text_size">大小</string>
|
||||
<string name="text_type">类型</string>
|
||||
<string name="text_donate">捐赠</string>
|
||||
<string name="text_editor_theme">编辑器主题</string>
|
||||
<string name="text_jump_to_line">跳转到行</string>
|
||||
<string name="text_info">信息</string>
|
||||
<string name="text_find_or_replace">查找/替换</string>
|
||||
<string name="text_paste">粘贴</string>
|
||||
<string name="text_copy_all">复制全部</string>
|
||||
<string name="text_copy_line">复制行</string>
|
||||
<string name="text_delete_line">删除行</string>
|
||||
@@ -219,14 +201,10 @@
|
||||
<string name="text_find_prev">向上</string>
|
||||
<string name="hint_regex">正则语法与JavaScript中相同, 可使用$1~9代替被捕获的匹配</string>
|
||||
<string name="text_jump">跳转</string>
|
||||
<string name="text_jump_to_def">转到定义</string>
|
||||
<string name="text_jump_to_end">转到文件末尾</string>
|
||||
<string name="text_jump_to_start">转到文件开始</string>
|
||||
<string name="text_jump_to_line_start">转到行首</string>
|
||||
<string name="text_jump_to_line_end">转到行尾</string>
|
||||
<string name="text_refactor">重构</string>
|
||||
<string name="text_select_variable">选择变量</string>
|
||||
<string name="text_show_type">显示变量类型</string>
|
||||
<string name="text_exit_floating_window">退出悬浮窗</string>
|
||||
<string name="text_select_save_path">保存到</string>
|
||||
<string name="text_cancel_download">取消下载</string>
|
||||
@@ -267,9 +245,7 @@
|
||||
<string name="text_register_fail">注册失败</string>
|
||||
<string name="text_register_succeed">注册成功</string>
|
||||
<string name="text_sample">示例代码</string>
|
||||
<string name="text_copy_to_my_script">导入到我的脚本</string>
|
||||
<string name="text_reset_to_initial_content">重置为初始内容</string>
|
||||
<string name="text_reset_fail">重置失败</string>
|
||||
<string name="text_reset_succeed">重置成功</string>
|
||||
<string name="text_cannot_read_file">无法读取文件</string>
|
||||
<string name="text_service">服务</string>
|
||||
@@ -338,9 +314,6 @@
|
||||
<string name="text_logout">退出登录</string>
|
||||
<string name="nodebb_error_forbidden">操作失败,请稍后重试</string>
|
||||
<string name="description_stable_mode">稳定模式通过省略布局细节使脚本抓取布局时更稳定,但同时获取到的屏幕上的控件可能会减少。\n\n重新启动无障碍服务才能生效。</string>
|
||||
<string name="text_no_phone_state_permission">获取权限失败 :-(</string>
|
||||
<string name="text_request_permission">重新授予</string>
|
||||
<string name="info_no_phone_state_permission">软件需要显示启动页广告来维持服务器和软件的开发和维护,因此需要\"读取手机状态\"的权限。\n如果您不喜欢广告,可以在设置中设定广告每天只显示一次。</string>
|
||||
<string name="dex_crcs">2184044085\n3566596539\npJTCkHuhypD9i3UBQ55XQw==RtXsgCTVFA7VYhLeF1TSkg==</string>
|
||||
<string name="text_size_min_value">8</string>
|
||||
<string name="text_size_max_value">56</string>
|
||||
@@ -354,7 +327,6 @@
|
||||
<string name="text_inspect_layout_hierarchy">布局层次分析</string>
|
||||
<string name="text_inspect_layout">布局分析</string>
|
||||
<string name="text_pointer_location">指针位置[Root]</string>
|
||||
<string name="text_skip">跳过</string>
|
||||
<string name="text_change_script_dir">更改脚本文件夹路径</string>
|
||||
<string name="key_script_dir_path">key_script_dir_path</string>
|
||||
<string name="default_value_script_dir_path">/脚本/</string>
|
||||
@@ -369,7 +341,6 @@
|
||||
<string name="text_stop">停止</string>
|
||||
<string name="text_new_watching_variable">增加监视的变量或表达式</string>
|
||||
<string name="text_variable_or_expr">变量或表达式</string>
|
||||
<string name="text_variable">变量</string>
|
||||
<string name="text_remove_all_breakpoints">删除所有断点</string>
|
||||
<string name="hint_long_click_run_to_debug">长按\"运行\"图标也可以启动调试</string>
|
||||
<string name="format_debug_bar_title">调试 [%s]</string>
|
||||
@@ -379,7 +350,6 @@
|
||||
<string name="text_result">结果</string>
|
||||
<string name="text_close">关闭</string>
|
||||
<string name="text_execute">执行</string>
|
||||
<string name="text_use_alarm_clock">使用系统闹钟唤醒Auto.js</string>
|
||||
<string name="error_connect_to_remote">连接失败: %s</string>
|
||||
<string name="text_are_you_sure_to_delete">确定要删除%s吗</string>
|
||||
<string name="text_run_on_broadcast">特定事件(广播)触发运行</string>
|
||||
@@ -387,8 +357,6 @@
|
||||
<string name="text_class_or_package_name">类/包名</string>
|
||||
<string name="text_view_docs">查看文档</string>
|
||||
<string name="text_en_import">import</string>
|
||||
<string name="key_ad_type">key_ad_type</string>
|
||||
<string name="text_ad_type_settings">广告类型设置</string>
|
||||
<string name="text_market">市场</string>
|
||||
<string name="text_launch_config">运行配置</string>
|
||||
<string name="text_main_file_name">主脚本名称</string>
|
||||
@@ -431,8 +399,6 @@
|
||||
<string name="text_run_on_startup">Auto.js启动时</string>
|
||||
<string name="text_usage_stats_permission">查看使用统计权限</string>
|
||||
<string name="description_usage_stats_permission">通过\"查看使用统计\"权限可以获取本设备过去使用应用的情况,从而使获取当前应用(currentPackage)时更准确。</string>
|
||||
<string name="text_gesture_observing">手势监听</string>
|
||||
<string name="summary_gesture_observing">开启后将支持events手势事件,但Auto.js崩溃时可能会导致屏幕失灵</string>
|
||||
<string name="text_open_with">打开方式</string>
|
||||
<plurals name="air_error_short_description" key="air_error_short_description">
|
||||
<item quantity="one">描述至少要 %d 个字.</item>
|
||||
|
||||
Reference in New Issue
Block a user