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 = " + ")";
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