diff --git a/README.md b/README.md index c93c5569..7e437c55 100644 --- a/README.md +++ b/README.md @@ -31,9 +31,11 @@ Yet another **open-source** GitHub client app but unlike any other app, FastHub - FastHub & GitHub Pinned Repos - Trending - Wiki + - Projects - **Repositories** - Browse & Read Wiki - Edit, Create & Delete files (commit) + - Edit, Create & Delete files (Project Columns Cards) - Search Repos - Browse and search Repos - See your public, private and forked Repos diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1867eb84..fad56395 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -213,12 +213,6 @@ android:configChanges="keyboard|orientation|screenSize" android:theme="@style/ThemeTranslucent"/> - - + + + + + + + + - constructToObservable(@Nullable List files) { + public static Observable constructToObservable(@Nullable ArrayList files) { if (files == null || files.isEmpty()) return Observable.empty(); - return Observable.fromIterable(files).map(CommitFileChanges::getCommitFileChanges); + return Observable.fromIterable(construct(files)); } @NonNull public static List construct(@Nullable List files) { @@ -66,4 +66,11 @@ import lombok.Setter; @Override public CommitFileChanges[] newArray(int size) {return new CommitFileChanges[size];} }; + + public static boolean canAttachToBundle(CommitFileChanges model) { + Parcel parcel = Parcel.obtain(); + model.writeToParcel(parcel, 0); + int size = parcel.dataSize(); + return size < 600000; + } } diff --git a/app/src/main/java/com/fastaccess/data/dao/CommitFileModel.java b/app/src/main/java/com/fastaccess/data/dao/CommitFileModel.java index 78db70cf..b2a86f6a 100644 --- a/app/src/main/java/com/fastaccess/data/dao/CommitFileModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/CommitFileModel.java @@ -3,14 +3,9 @@ package com.fastaccess.data.dao; import android.os.Parcel; import android.os.Parcelable; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - /** * Created by Kosh on 01 Jan 2017, 9:00 PM */ -@Getter @Setter @NoArgsConstructor public class CommitFileModel implements Parcelable { private String sha; @@ -72,4 +67,84 @@ public class CommitFileModel implements Parcelable { ", patch='" + patch + '\'' + '}'; } + + public String getSha() { + return sha; + } + + public void setSha(String sha) { + this.sha = sha; + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public int getAdditions() { + return additions; + } + + public void setAdditions(int additions) { + this.additions = additions; + } + + public int getDeletions() { + return deletions; + } + + public void setDeletions(int deletions) { + this.deletions = deletions; + } + + public int getChanges() { + return changes; + } + + public void setChanges(int changes) { + this.changes = changes; + } + + public String getBlobUrl() { + return blobUrl; + } + + public void setBlobUrl(String blobUrl) { + this.blobUrl = blobUrl; + } + + public String getRawUrl() { + return rawUrl; + } + + public void setRawUrl(String rawUrl) { + this.rawUrl = rawUrl; + } + + public String getContentsUrl() { + return contentsUrl; + } + + public void setContentsUrl(String contentsUrl) { + this.contentsUrl = contentsUrl; + } + + public String getPatch() { + return patch; + } + + public void setPatch(String patch) { + this.patch = patch; + } } diff --git a/app/src/main/java/com/fastaccess/data/dao/CommitLinesModel.java b/app/src/main/java/com/fastaccess/data/dao/CommitLinesModel.java index f1c59295..89e9df3a 100644 --- a/app/src/main/java/com/fastaccess/data/dao/CommitLinesModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/CommitLinesModel.java @@ -12,8 +12,6 @@ import java.util.List; import java.util.regex.Matcher; import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; import static com.fastaccess.ui.widgets.DiffLineSpan.HUNK_TITLE; @@ -21,7 +19,7 @@ import static com.fastaccess.ui.widgets.DiffLineSpan.HUNK_TITLE; * Created by Kosh on 20 Jun 2017, 7:32 PM */ -@Getter @Setter @AllArgsConstructor public class CommitLinesModel implements Parcelable { +@AllArgsConstructor public class CommitLinesModel implements Parcelable { public static final int TRANSPARENT = 0; public static final int ADDITION = 1; @@ -115,4 +113,60 @@ import static com.fastaccess.ui.widgets.DiffLineSpan.HUNK_TITLE; @Override public CommitLinesModel[] newArray(int size) {return new CommitLinesModel[size];} }; + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public int getColor() { + return color; + } + + public void setColor(int color) { + this.color = color; + } + + public int getLeftLineNo() { + return leftLineNo; + } + + public void setLeftLineNo(int leftLineNo) { + this.leftLineNo = leftLineNo; + } + + public int getRightLineNo() { + return rightLineNo; + } + + public void setRightLineNo(int rightLineNo) { + this.rightLineNo = rightLineNo; + } + + public boolean isNoNewLine() { + return noNewLine; + } + + public void setNoNewLine(boolean noNewLine) { + this.noNewLine = noNewLine; + } + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + + public boolean isHasCommentedOn() { + return hasCommentedOn; + } + + public void setHasCommentedOn(boolean hasCommentedOn) { + this.hasCommentedOn = hasCommentedOn; + } } diff --git a/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java b/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java index 98099390..4d6b4037 100644 --- a/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java @@ -2,6 +2,7 @@ package com.fastaccess.data.dao; import android.content.Context; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import com.annimon.stream.Collectors; @@ -239,7 +240,7 @@ import lombok.Setter; .toList(); } - @NonNull public static List buildForRepoProjects(@NonNull Context context, @NonNull String repoId, + @NonNull public static List buildForRepoProjects(@NonNull Context context, @Nullable String repoId, @NonNull String login) { return Stream.of(new FragmentPagerAdapterModel(context.getString(R.string.open), RepoProjectFragment.Companion.newInstance(login, repoId, IssueState.open)), diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractUser.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractUser.java index ee5f84b6..06c44fd7 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractUser.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractUser.java @@ -19,6 +19,7 @@ import io.requery.Entity; import io.requery.Key; import io.requery.Persistable; import io.requery.Table; +import io.requery.Transient; import lombok.NoArgsConstructor; import static com.fastaccess.data.dao.model.User.FOLLOWER_NAME; @@ -68,6 +69,7 @@ public abstract class AbstractUser implements Parcelable { @Column(name = "date_column") Date date; String repoId; String description; + @Transient boolean hasOrganizationProjects; public void save(User entity) { if (getUser(entity.getId()) != null) { diff --git a/app/src/main/java/com/fastaccess/helper/Bundler.java b/app/src/main/java/com/fastaccess/helper/Bundler.java index 409819f0..f0cb1f84 100644 --- a/app/src/main/java/com/fastaccess/helper/Bundler.java +++ b/app/src/main/java/com/fastaccess/helper/Bundler.java @@ -200,5 +200,4 @@ public class Bundler { return get(); } - } diff --git a/app/src/main/java/com/fastaccess/helper/FileHelper.java b/app/src/main/java/com/fastaccess/helper/FileHelper.java index e9a35c37..2b281396 100644 --- a/app/src/main/java/com/fastaccess/helper/FileHelper.java +++ b/app/src/main/java/com/fastaccess/helper/FileHelper.java @@ -62,7 +62,7 @@ public class FileHelper { title = cur.getString(cur.getColumnIndex(MediaStore.Audio.Media.TITLE)); } } - } + } catch (Exception ignored) {} } } return title; diff --git a/app/src/main/java/com/fastaccess/provider/markdown/MarkDownProvider.java b/app/src/main/java/com/fastaccess/provider/markdown/MarkDownProvider.java index 83aa7c0a..4a7efc61 100644 --- a/app/src/main/java/com/fastaccess/provider/markdown/MarkDownProvider.java +++ b/app/src/main/java/com/fastaccess/provider/markdown/MarkDownProvider.java @@ -10,6 +10,7 @@ import android.widget.TextView; import com.annimon.stream.IntStream; import com.fastaccess.helper.InputHelper; +import com.fastaccess.helper.Logger; import com.fastaccess.provider.markdown.extension.emoji.EmojiExtension; import com.fastaccess.provider.markdown.extension.mention.MentionExtension; import com.fastaccess.provider.timeline.HtmlHelper; @@ -256,19 +257,11 @@ public class MarkDownProvider { } - public static void addPhoto(@NonNull EditText editText) { - addLink(editText, "", ""); - } - public static void addPhoto(@NonNull EditText editText, @NonNull String title, @NonNull String link) { String result = "![" + InputHelper.toString(title) + "](" + InputHelper.toString(link) + ")"; insertAtCursor(editText, result); } - public static void addLink(@NonNull EditText editText) { - addLink(editText, "", ""); - } - public static void addLink(@NonNull EditText editText, @NonNull String title, @NonNull String link) { String result = "[" + InputHelper.toString(title) + "](" + InputHelper.toString(link) + ")"; insertAtCursor(editText, result); @@ -319,10 +312,17 @@ public class MarkDownProvider { public static void insertAtCursor(@NonNull EditText editText, @NonNull String text) { String oriContent = editText.getText().toString(); - int index = editText.getSelectionStart() >= 0 ? editText.getSelectionStart() : 0; - StringBuilder builder = new StringBuilder(oriContent); - builder.insert(index, text); - editText.setText(builder.toString()); - editText.setSelection(index + text.length()); + int start = editText.getSelectionStart(); + int end = editText.getSelectionEnd(); + int index = start >= 0 ? start : 0; + Logger.e(start, end); + if (start >= 0 && end > 0) { + editText.setText(editText.getText().replace(start, end, text)); + } else { + StringBuilder builder = new StringBuilder(oriContent); + builder.insert(index, text); + editText.setText(builder.toString()); + editText.setSelection(index + text.length()); + } } } diff --git a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/PullRequestFilesViewHolder.java b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/PullRequestFilesViewHolder.java index 2b0077f8..105c95bf 100644 --- a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/PullRequestFilesViewHolder.java +++ b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/PullRequestFilesViewHolder.java @@ -108,8 +108,13 @@ public class PullRequestFilesViewHolder extends BaseViewHolder AnimHelper.revealDialog(dialog, getResources().getInteger(android.R.integer.config_longAnimTime))); } diff --git a/app/src/main/java/com/fastaccess/ui/modules/editor/popup/EditorLinkImageDialogFragment.java b/app/src/main/java/com/fastaccess/ui/modules/editor/popup/EditorLinkImageDialogFragment.java index 0d0549ad..8dba5f1d 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/editor/popup/EditorLinkImageDialogFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/editor/popup/EditorLinkImageDialogFragment.java @@ -38,11 +38,12 @@ public class EditorLinkImageDialogFragment extends BaseDialogFragment>() { + + @State var org: String? = null + + @BindView(R.id.appbar) lateinit var appBar: AppBarLayout + + override fun layout(): Int = R.layout.activity_fragment_layout + + override fun isTransparent(): Boolean = true + + override fun canBack(): Boolean = true + + override fun isSecured(): Boolean = false + + override fun providePresenter(): BasePresenter = BasePresenter() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + appBar.elevation = 0f + appBar.stateListAnimator = null + if (savedInstanceState == null) { + org = intent.extras.getString(BundleConstant.ITEM) + val org = org + if (org != null) { + supportFragmentManager.beginTransaction() + .replace(R.id.container, RepoProjectsFragmentPager.newInstance(org), + RepoProjectsFragmentPager.TAG) + .commit() + } + } + toolbar?.apply { subtitle = org } + } + + companion object { + fun startActivity(context: Context, org: String, isEnterprise: Boolean) { + val intent = Intent(context, OrgProjectActivity::class.java) + intent.putExtras(Bundler.start().put(BundleConstant.ITEM, org) + .put(BundleConstant.IS_ENTERPRISE, isEnterprise) + .end()) + context.startActivity(intent) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerPresenter.java index 51827e4f..964f7c27 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerPresenter.java @@ -236,7 +236,7 @@ class RepoPagerPresenter extends BasePresenter implements Rep break; case RepoPagerMvp.PROJECTS: if (projectsFragmentPager == null) { - onAddAndHide(fragmentManager, RepoProjectsFragmentPager.Companion.newInstance(repoId(), login()), currentVisible); + onAddAndHide(fragmentManager, RepoProjectsFragmentPager.Companion.newInstance(login(), repoId()), currentVisible); } else { onShowHideFragment(fragmentManager, projectsFragmentPager, currentVisible); } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/comments/CommitCommentsFragment.java b/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/comments/CommitCommentsFragment.java index 8d0a2bbe..c699ac4d 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/comments/CommitCommentsFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/comments/CommitCommentsFragment.java @@ -188,9 +188,20 @@ public class CommitCommentsFragment extends BaseFragment? = null private val adapter by lazy { ColumnCardAdapter(presenter.getCards(), isOwner()) } @@ -119,6 +122,9 @@ class ProjectColumnFragment : BaseFragment { - if (!presenter.login.isBlank() && !presenter.repoId.isBlank()) { - val nameParse = NameParser("") - nameParse.name = presenter.repoId - nameParse.username = presenter.login - nameParse.isEnterprise = isEnterprise - RepoPagerActivity.startRepoPager(this, nameParse) + val repoId = presenter.repoId + if (repoId != null && !repoId.isNullOrBlank()) { + if (!presenter.login.isBlank()) { + val nameParse = NameParser("") + nameParse.name = presenter.repoId + nameParse.username = presenter.login + nameParse.isEnterprise = isEnterprise + RepoPagerActivity.startRepoPager(this, nameParse) + } + } else if (!presenter.login.isBlank()) { + UserPagerActivity.startActivity(this, presenter.login, true, isEnterprise, 0) } finish() true @@ -112,7 +118,11 @@ class ProjectPagerActivity : BaseActivity(), ProjectPage private val columns = arrayListOf() @com.evernote.android.state.State var projectId: Long = -1 - @com.evernote.android.state.State var repoId: String = "" + @com.evernote.android.state.State var repoId: String? = null @com.evernote.android.state.State var login: String = "" @com.evernote.android.state.State var viewerCanUpdate: Boolean = false @@ -27,23 +27,39 @@ class ProjectPagerPresenter : BasePresenter(), ProjectPage override fun onRetrieveColumns() { - makeRestCall(Observable.zip(RestProvider.getProjectsService(isEnterprise).getProjectColumns(projectId), - RestProvider.getRepoService(isEnterprise).isCollaborator(login, repoId, Login.getUser().login), - BiFunction { items: Pageable, response: Response -> - viewerCanUpdate = response.code() == 204 - return@BiFunction items - }) - .flatMap { - if (it.items != null) { - return@flatMap Observable.just(it.items) - } - return@flatMap Observable.just(listOf()) - }, - { t -> - columns.clear() - columns.addAll(t) - sendToView { it.onInitPager(columns) } - }) + val repoId = repoId + if (repoId != null && !repoId.isNullOrBlank()) { + makeRestCall(Observable.zip(RestProvider.getProjectsService(isEnterprise).getProjectColumns(projectId), + RestProvider.getRepoService(isEnterprise).isCollaborator(login, repoId, Login.getUser().login), + BiFunction { items: Pageable, response: Response -> + viewerCanUpdate = response.code() == 204 + return@BiFunction items + }) + .flatMap { + if (it.items != null) { + return@flatMap Observable.just(it.items) + } + return@flatMap Observable.just(listOf()) + }, + { t -> + columns.clear() + columns.addAll(t) + sendToView { it.onInitPager(columns) } + }) + } else { + makeRestCall(RestProvider.getProjectsService(isEnterprise).getProjectColumns(projectId) + .flatMap { + if (it.items != null) { + return@flatMap Observable.just(it.items) + } + return@flatMap Observable.just(listOf()) + }, + { t -> + columns.clear() + columns.addAll(t) + sendToView { it.onInitPager(columns) } + }) + } } override fun onActivityCreated(intent: Intent?) { diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/projects/list/RepoProjectFragment.kt b/app/src/main/java/com/fastaccess/ui/modules/repos/projects/list/RepoProjectFragment.kt index 057e5a38..0deb0581 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/projects/list/RepoProjectFragment.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/projects/list/RepoProjectFragment.kt @@ -134,7 +134,7 @@ class RepoProjectFragment : BaseFragment(), RepoProjectMv private var previousTotal: Int = 0 private var lastPage = Integer.MAX_VALUE @com.evernote.android.state.State var login: String = "" - @com.evernote.android.state.State var repoId: String = "" + @com.evernote.android.state.State var repoId: String? = null var count: Int = 0 val pages = arrayListOf() @@ -65,74 +68,152 @@ class RepoProjectPresenter : BasePresenter(), RepoProjectMv return false } currentPage = page + Logger.e(login) + val repoId = repoId val apollo = ApolloProdivder.getApollo(isEnterprise) - if (parameter == IssueState.open) { - val query = RepoProjectsOpenQuery.builder() - .name(repoId) - .owner(login) - .page(getPage()) - .build() - makeRestCall(Rx2Apollo.from(apollo.query(query)) - .flatMap { - val list = arrayListOf() - it.data()?.repository()?.let { - it.projects().let { - lastPage = if (it.pageInfo().hasNextPage()) Int.MAX_VALUE else 0 - pages.clear() - count = it.totalCount() - it.edges()?.let { - pages.addAll(it.map { it.cursor() }) - } - it.nodes()?.let { - list.addAll(it) - } - } - } - return@flatMap Observable.just(list) - }, - { - sendToView({ v -> - v.onNotifyAdapter(it, page) - if (page == 1) v.onChangeTotalCount(count) - }) - }) - } else { - val query = RepoProjectsClosedQuery.builder() - .name(repoId) - .owner(login) - .page(getPage()) - .build() - makeRestCall(Rx2Apollo.from(apollo.query(query)) - .flatMap { - val list = arrayListOf() - it.data()?.repository()?.let { - it.projects().let { - lastPage = if (it.pageInfo().hasNextPage()) Int.MAX_VALUE else 0 - pages.clear() - count = it.totalCount() - it.edges()?.let { - pages.addAll(it.map { it.cursor() }) - } - it.nodes()?.let { - val toConvert = arrayListOf() - it.onEach { - val columns = RepoProjectsOpenQuery.Columns(it.columns().__typename(), it.columns().totalCount()) - val node = RepoProjectsOpenQuery.Node(it.__typename(), it.name(), it.number(), it.body(), - it.createdAt(), it.id(), it.viewerCanUpdate(), columns, it.databaseId()) - toConvert.add(node) + if (repoId != null && !repoId.isNullOrBlank()) { + if (parameter == IssueState.open) { + val query = RepoProjectsOpenQuery.builder() + .name(repoId) + .owner(login) + .page(getPage()) + .build() + makeRestCall(Rx2Apollo.from(apollo.query(query)) + .flatMap { + val list = arrayListOf() + it.data()?.repository()?.let { + it.projects().let { + lastPage = if (it.pageInfo().hasNextPage()) Int.MAX_VALUE else 0 + pages.clear() + count = it.totalCount() + it.edges()?.let { + pages.addAll(it.map { it.cursor() }) + } + it.nodes()?.let { + list.addAll(it) } - list.addAll(toConvert) } } - } - return@flatMap Observable.just(list) - }, - { - sendToView({ v -> - v.onNotifyAdapter(it, page) - if (page == 1) v.onChangeTotalCount(count) + return@flatMap Observable.just(list) + }, + { + sendToView({ v -> + v.onNotifyAdapter(it, page) + if (page == 1) v.onChangeTotalCount(count) + }) }) - }) + } else { + val query = RepoProjectsClosedQuery.builder() + .name(repoId) + .owner(login) + .page(getPage()) + .build() + makeRestCall(Rx2Apollo.from(apollo.query(query)) + .flatMap { + val list = arrayListOf() + it.data()?.repository()?.let { + it.projects().let { + lastPage = if (it.pageInfo().hasNextPage()) Int.MAX_VALUE else 0 + pages.clear() + count = it.totalCount() + it.edges()?.let { + pages.addAll(it.map { it.cursor() }) + } + it.nodes()?.let { + val toConvert = arrayListOf() + it.onEach { + val columns = RepoProjectsOpenQuery.Columns(it.columns().__typename(), it.columns().totalCount()) + val node = RepoProjectsOpenQuery.Node(it.__typename(), it.name(), it.number(), it.body(), + it.createdAt(), it.id(), it.viewerCanUpdate(), columns, it.databaseId()) + toConvert.add(node) + } + list.addAll(toConvert) + } + } + } + return@flatMap Observable.just(list) + }, + { + sendToView({ v -> + v.onNotifyAdapter(it, page) + if (page == 1) v.onChangeTotalCount(count) + }) + }) + } + } else { + if (parameter == IssueState.open) { + val query = OrgProjectsOpenQuery.builder() + .owner(login) + .page(getPage()) + .build() + makeRestCall(Rx2Apollo.from(apollo.query(query)) + .flatMap { + val list = arrayListOf() + it.data()?.organization()?.let { + it.projects().let { + lastPage = if (it.pageInfo().hasNextPage()) Int.MAX_VALUE else 0 + pages.clear() + count = it.totalCount() + it.edges()?.let { + pages.addAll(it.map { it.cursor() }) + } + it.nodes()?.let { + val toConvert = arrayListOf() + it.onEach { + val columns = RepoProjectsOpenQuery.Columns(it.columns().__typename(), it.columns().totalCount()) + val node = RepoProjectsOpenQuery.Node(it.__typename(), it.name(), it.number(), it.body(), + it.createdAt(), it.id(), it.viewerCanUpdate(), columns, it.databaseId()) + toConvert.add(node) + } + list.addAll(toConvert) + } + } + } + return@flatMap Observable.just(list) + }, + { + sendToView({ v -> + v.onNotifyAdapter(it, page) + if (page == 1) v.onChangeTotalCount(count) + }) + }) + } else { + val query = OrgProjectsClosedQuery.builder() + .owner(login) + .page(getPage()) + .build() + makeRestCall(Rx2Apollo.from(apollo.query(query)) + .flatMap { + val list = arrayListOf() + it.data()?.organization()?.let { + it.projects().let { + lastPage = if (it.pageInfo().hasNextPage()) Int.MAX_VALUE else 0 + pages.clear() + count = it.totalCount() + it.edges()?.let { + pages.addAll(it.map { it.cursor() }) + } + it.nodes()?.let { + val toConvert = arrayListOf() + it.onEach { + val columns = RepoProjectsOpenQuery.Columns(it.columns().__typename(), it.columns().totalCount()) + val node = RepoProjectsOpenQuery.Node(it.__typename(), it.name(), it.number(), it.body(), + it.createdAt(), it.id(), it.viewerCanUpdate(), columns, it.databaseId()) + toConvert.add(node) + } + list.addAll(toConvert) + } + } + } + return@flatMap Observable.just(list) + }, + { + sendToView({ v -> + v.onNotifyAdapter(it, page) + if (page == 1) v.onChangeTotalCount(count) + }) + }) + } } return true } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesFragment.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesFragment.java index cb907c98..7ef7952d 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesFragment.java @@ -1,6 +1,8 @@ package com.fastaccess.ui.modules.repos.pull_requests.pull_request.details.files; +import android.app.Activity; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -24,6 +26,7 @@ import com.fastaccess.ui.adapter.CommitFilesAdapter; import com.fastaccess.ui.base.BaseFragment; import com.fastaccess.ui.modules.main.premium.PremiumActivity; import com.fastaccess.ui.modules.repos.issues.issue.details.IssuePagerMvp; +import com.fastaccess.ui.modules.repos.pull_requests.pull_request.details.files.fullscreen.FullScreenFileChangeActivity; import com.fastaccess.ui.modules.reviews.AddReviewDialogFragment; import com.fastaccess.ui.widgets.FontTextView; import com.fastaccess.ui.widgets.StateLayout; @@ -169,6 +172,10 @@ public class PullRequestFilesFragment extends BaseFragment comments = data.getParcelableArrayListExtra(BundleConstant.ITEM); + if (comments != null && !comments.isEmpty()) { + if (viewCallback != null) { + for (CommentRequestModel comment : comments) { + viewCallback.onAddComment(comment); + } + showMessage(R.string.success, R.string.comments_added_successfully); + } + } + } + } + super.onActivityResult(requestCode, resultCode, data); + } + private void showReload() { hideProgress(); stateLayout.showReload(adapter.getItemCount()); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesMvp.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesMvp.java index 24123bbd..a75bc1d1 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesMvp.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesMvp.java @@ -29,6 +29,8 @@ public interface PullRequestFilesMvp { void onNotifyAdapter(@Nullable List items, int page); @NonNull OnLoadMore getLoadMore(); + + void onOpenForResult(int position, @NonNull CommitFileChanges linesModel); } interface Presenter extends BaseMvp.FAPresenter, diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesPresenter.java index ab1f40bf..4f3d126e 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesPresenter.java @@ -104,7 +104,9 @@ class PullRequestFilesPresenter extends BasePresenter } @Override public void onItemClick(int position, View v, CommitFileChanges model) { - if (v.getId() == R.id.open) { + if (v.getId() == R.id.patchList) { + sendToView(view -> view.onOpenForResult(position, model)); + } else if (v.getId() == R.id.open) { CommitFileModel item = model.getCommitFileModel(); PopupMenu popup = new PopupMenu(v.getContext(), v); MenuInflater inflater = popup.getMenuInflater(); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/fullscreen/FullScreenFileChangeActivity.kt b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/fullscreen/FullScreenFileChangeActivity.kt new file mode 100644 index 00000000..0e46dd7c --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/fullscreen/FullScreenFileChangeActivity.kt @@ -0,0 +1,168 @@ +package com.fastaccess.ui.modules.repos.pull_requests.pull_request.details.files.fullscreen + +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.support.v4.app.Fragment +import android.support.v4.widget.SwipeRefreshLayout +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.widget.TextView +import butterknife.BindView +import com.fastaccess.R +import com.fastaccess.data.dao.CommentRequestModel +import com.fastaccess.data.dao.CommitFileChanges +import com.fastaccess.data.dao.CommitLinesModel +import com.fastaccess.helper.BundleConstant +import com.fastaccess.helper.Bundler +import com.fastaccess.helper.PrefGetter +import com.fastaccess.ui.adapter.CommitLinesAdapter +import com.fastaccess.ui.base.BaseActivity +import com.fastaccess.ui.modules.main.premium.PremiumActivity +import com.fastaccess.ui.modules.reviews.AddReviewDialogFragment +import com.fastaccess.ui.widgets.StateLayout +import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView +import com.fastaccess.ui.widgets.recyclerview.scroll.RecyclerViewFastScroller + +/** + * Created by Hashemsergani on 24.09.17. + */ + +class FullScreenFileChangeActivity : BaseActivity(), FullScreenFileChangeMvp.View { + + @BindView(R.id.recycler) lateinit var recycler: DynamicRecyclerView + @BindView(R.id.refresh) lateinit var refresh: SwipeRefreshLayout + @BindView(R.id.stateLayout) lateinit var stateLayout: StateLayout + @BindView(R.id.fastScroller) lateinit var fastScroller: RecyclerViewFastScroller + @BindView(R.id.changes) lateinit var changes: TextView + @BindView(R.id.deletion) lateinit var deletion: TextView + @BindView(R.id.addition) lateinit var addition: TextView + + val commentList = arrayListOf() + + private val adapter by lazy { CommitLinesAdapter(arrayListOf(), this) } + + override fun layout(): Int = R.layout.full_screen_file_changes_layout + + override fun isTransparent(): Boolean = false + + override fun canBack(): Boolean = true + + override fun isSecured(): Boolean = false + + override fun providePresenter(): FullScreenFileChangePresenter = FullScreenFileChangePresenter() + + override fun onNotifyAdapter(model: CommitLinesModel) { + adapter.addItem(model) + } + + override fun showMessage(titleRes: Int, msgRes: Int) { + hideProgress() + super.showMessage(titleRes, msgRes) + } + + override fun showMessage(titleRes: String, msgRes: String) { + hideProgress() + super.showMessage(titleRes, msgRes) + } + + override fun showErrorMessage(msgRes: String) { + hideProgress() + super.showErrorMessage(msgRes) + } + + override fun showProgress(resId: Int) { + stateLayout.showProgress() + refresh.isRefreshing = true + } + + override fun hideProgress() { + stateLayout.hideProgress() + refresh.isRefreshing = false + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + refresh.isEnabled = false + recycler.adapter = adapter + val padding = resources.getDimensionPixelSize(R.dimen.spacing_normal) + recycler.setPadding(padding, 0, padding, 0) + fastScroller.attachRecyclerView(recycler) + presenter.onLoad(intent) + presenter.model?.let { model -> + title = Uri.parse(model.commitFileModel.filename).lastPathSegment + addition.text = model.commitFileModel?.additions.toString() + deletion.text = model.commitFileModel?.deletions.toString() + changes.text = model.commitFileModel?.changes.toString() + } + } + + override fun onCreateOptionsMenu(menu: Menu?): Boolean { + menuInflater.inflate(R.menu.done_menu, menu) + menu?.findItem(R.id.submit)?.setIcon(R.drawable.ic_done) + return super.onCreateOptionsMenu(menu) + } + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + return when (item?.itemId) { + R.id.submit -> { + val intent = Intent() + intent.putExtras(Bundler.start().putParcelableArrayList(BundleConstant.ITEM, commentList).end()) + setResult(Activity.RESULT_OK, intent) + finish() + true + } + else -> super.onOptionsItemSelected(item) + } + } + + override fun onItemClick(position: Int, v: View, item: CommitLinesModel) { + if (item.text.startsWith("@@")) return + val commit = presenter.model?.commitFileModel ?: return + if (PrefGetter.isProEnabled()) { + AddReviewDialogFragment.newInstance(item, Bundler.start() + .put(BundleConstant.ITEM, commit.filename) + .put(BundleConstant.EXTRA_TWO, presenter.position) + .put(BundleConstant.EXTRA_THREE, position) + .end()) + .show(supportFragmentManager, "AddReviewDialogFragment") + } else { + PremiumActivity.startActivity(this) + } + } + + override fun onItemLongClick(position: Int, v: View?, item: CommitLinesModel?) { + + } + + override fun onCommentAdded(comment: String, item: CommitLinesModel, bundle: Bundle?) { + if (bundle != null) { + val path = bundle.getString(BundleConstant.ITEM) ?: return + val commentRequestModel = CommentRequestModel() + commentRequestModel.body = comment + commentRequestModel.path = path + commentRequestModel.position = item.position + commentList.add(commentRequestModel) + val childPosition = bundle.getInt(BundleConstant.EXTRA_THREE) + val current = adapter.getItem(childPosition) + if (current != null) { + current.isHasCommentedOn = true + adapter.swapItem(current, childPosition) + } + } + } + + companion object { + val FOR_RESULT_CODE = 1002 + fun startActivityForResult(fragment: Fragment, model: CommitFileChanges, position: Int) { + val intent = Intent(fragment.context, FullScreenFileChangeActivity::class.java) + intent.putExtras(Bundler.start() + .put(BundleConstant.EXTRA, model) + .put(BundleConstant.ITEM, position) + .end()) + fragment.startActivityForResult(intent, FOR_RESULT_CODE) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/fullscreen/FullScreenFileChangeMvp.kt b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/fullscreen/FullScreenFileChangeMvp.kt new file mode 100644 index 00000000..398eedff --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/fullscreen/FullScreenFileChangeMvp.kt @@ -0,0 +1,21 @@ +package com.fastaccess.ui.modules.repos.pull_requests.pull_request.details.files.fullscreen + +import android.content.Intent +import com.fastaccess.data.dao.CommitLinesModel +import com.fastaccess.ui.base.mvp.BaseMvp +import com.fastaccess.ui.modules.reviews.callback.ReviewCommentListener +import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder + +/** + * Created by Hashemsergani on 24.09.17. + */ + +interface FullScreenFileChangeMvp { + interface View : BaseMvp.FAView, BaseViewHolder.OnItemClickListener, ReviewCommentListener { + fun onNotifyAdapter(model: CommitLinesModel) + } + + interface Presenter { + fun onLoad(intent: Intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/fullscreen/FullScreenFileChangePresenter.kt b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/fullscreen/FullScreenFileChangePresenter.kt new file mode 100644 index 00000000..6c60e576 --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/fullscreen/FullScreenFileChangePresenter.kt @@ -0,0 +1,37 @@ +package com.fastaccess.ui.modules.repos.pull_requests.pull_request.details.files.fullscreen + +import android.content.Intent +import com.fastaccess.data.dao.CommitFileChanges +import com.fastaccess.helper.BundleConstant +import com.fastaccess.helper.RxHelper +import com.fastaccess.ui.base.mvp.presenter.BasePresenter +import io.reactivex.Observable + +/** + * Created by Hashemsergani on 24.09.17. + */ +class FullScreenFileChangePresenter : BasePresenter(), FullScreenFileChangeMvp.Presenter { + + var model: CommitFileChanges? = null + var position: Int = -1 + + override fun onLoad(intent: Intent) { + intent.extras?.let { + position = it.getInt(BundleConstant.ITEM) + model = it.getParcelable(BundleConstant.EXTRA) + } + model?.let { + manageDisposable(RxHelper.getObservable(Observable.fromIterable(it.linesModel)) + .doOnSubscribe({ sendToView { it.showProgress(0) } }) + .flatMap { Observable.just(it) } + .subscribe + ({ + sendToView { v -> v.onNotifyAdapter(it) } + }, { + onError(it) + }, { + sendToView { it.hideProgress() } + })) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/ui/modules/reviews/AddReviewDialogFragment.kt b/app/src/main/java/com/fastaccess/ui/modules/reviews/AddReviewDialogFragment.kt index ea599c0d..8996204d 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/reviews/AddReviewDialogFragment.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/reviews/AddReviewDialogFragment.kt @@ -39,10 +39,10 @@ class AddReviewDialogFragment : BaseDialogFragment TransitionManager.beginDelayedTransition(this) if (editText.isEnabled && !InputHelper.isEmpty(editText)) { editText.isEnabled = false + selectionIndex = editText.selectionEnd MarkDownProvider.setMdText(editText, InputHelper.toString(editText)) editorIconsHolder.visibility = View.INVISIBLE addEmojiView.visibility = View.INVISIBLE ViewHelper.hideKeyboard(editText) } else { editText.setText(it.getSavedText()) - editText.setSelection(editText.text.length) + editText.setSelection(selectionIndex) editText.isEnabled = true editorIconsHolder.visibility = View.VISIBLE addEmojiView.visibility = View.VISIBLE @@ -87,9 +88,9 @@ class MarkDownLayout : LinearLayout { Snackbar.make(this, R.string.error_highlighting_editor, Snackbar.LENGTH_SHORT).show() } else { when { - v.id == R.id.link -> EditorLinkImageDialogFragment.newInstance(true) + v.id == R.id.link -> EditorLinkImageDialogFragment.newInstance(true, getSelectedText()) .show(it.fragmentManager(), "EditorLinkImageDialogFragment") - v.id == R.id.image -> EditorLinkImageDialogFragment.newInstance(false) + v.id == R.id.image -> EditorLinkImageDialogFragment.newInstance(false, getSelectedText()) .show(it.fragmentManager(), "EditorLinkImageDialogFragment") v.id == R.id.addEmoji -> { ViewHelper.hideKeyboard(it.getEditText()) @@ -119,8 +120,6 @@ class MarkDownLayout : LinearLayout { R.id.header -> MarkDownProvider.addDivider(editText) R.id.code -> MarkDownProvider.addCode(editText) R.id.quote -> MarkDownProvider.addQuote(editText) - R.id.link -> MarkDownProvider.addLink(editText) - R.id.image -> MarkDownProvider.addPhoto(editText) R.id.checkbox -> MarkDownProvider.addList(editText, "- [x]") R.id.unCheckbox -> MarkDownProvider.addList(editText, "- [ ]") R.id.inlineCode -> MarkDownProvider.addInlinleCode(editText) @@ -162,4 +161,15 @@ class MarkDownLayout : LinearLayout { } } } + + fun getSelectedText(): String? { + markdownListener?.getEditText()?.let { + if (!it.text.toString().isBlank()) { + val selectionStart = it.selectionStart + val selectionEnd = it.selectionEnd + return it.text.toString().substring(selectionStart, selectionEnd) + } + } + return null + } } \ No newline at end of file diff --git a/app/src/main/res/layouts/main_layouts/layout/full_screen_file_changes_layout.xml b/app/src/main/res/layouts/main_layouts/layout/full_screen_file_changes_layout.xml new file mode 100644 index 00000000..db01da07 --- /dev/null +++ b/app/src/main/res/layouts/main_layouts/layout/full_screen_file_changes_layout.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layouts/row_layouts/layout/org_profile_overview_layout.xml b/app/src/main/res/layouts/row_layouts/layout/org_profile_overview_layout.xml index c7a9bbf7..ffc615d4 100644 --- a/app/src/main/res/layouts/row_layouts/layout/org_profile_overview_layout.xml +++ b/app/src/main/res/layouts/row_layouts/layout/org_profile_overview_layout.xml @@ -77,6 +77,7 @@ android:gravity="center|start" android:paddingBottom="@dimen/spacing_xs_large" android:paddingTop="@dimen/spacing_xs_large" + android:visibility="gone" tools:text="Cum classis nocere"/> @@ -92,6 +93,7 @@ android:gravity="center|start" android:paddingBottom="@dimen/spacing_xs_large" android:paddingTop="@dimen/spacing_xs_large" + android:visibility="gone" tools:text="Cum classis nocere"/> @@ -120,8 +123,25 @@ android:gravity="center|start" android:paddingBottom="@dimen/spacing_xs_large" android:paddingTop="@dimen/spacing_xs_large" + android:visibility="gone" tools:text="Cum classis nocere"/> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e21b0e28..0c4a1639 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -154,7 +154,7 @@ User Details Archive file detected, please download the file to view its content. - Minimum characters (3) + Minimum characters (2) No file found No readme found Downloading… @@ -611,4 +611,5 @@

]]>
FAQ + Comments added successfully