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 09eb11ff..36e3ca3e 100644 --- a/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java @@ -44,6 +44,7 @@ import com.fastaccess.ui.modules.repos.extras.branches.BranchesFragment; import com.fastaccess.ui.modules.repos.issues.issue.RepoClosedIssuesFragment; import com.fastaccess.ui.modules.repos.issues.issue.RepoOpenedIssuesFragment; import com.fastaccess.ui.modules.repos.issues.issue.details.timeline.IssueTimelineFragment; +import com.fastaccess.ui.modules.repos.projects.list.RepoProjectFragment; import com.fastaccess.ui.modules.repos.pull_requests.pull_request.RepoPullRequestFragment; import com.fastaccess.ui.modules.repos.pull_requests.pull_request.details.commits.PullRequestCommitsFragment; import com.fastaccess.ui.modules.repos.pull_requests.pull_request.details.files.PullRequestFilesFragment; @@ -230,4 +231,15 @@ import lombok.Setter; BranchesFragment.Companion.newInstance(login, repoId, false))) .toList(); } + + + @NonNull public static List buildForRepoProjects(@NonNull Context context, @NonNull String repoId, + @NonNull String login) { + return Stream.of(new FragmentPagerAdapterModel(context.getString(R.string.open), + RepoProjectFragment.Companion.newInstance(login, repoId, IssueState.open)), + new FragmentPagerAdapterModel(context.getString(R.string.closed), + RepoProjectFragment.Companion.newInstance(login, repoId, IssueState.closed))) + .toList(); + } + } diff --git a/app/src/main/java/com/fastaccess/data/dao/ProjectsModel.java b/app/src/main/java/com/fastaccess/data/dao/ProjectsModel.java new file mode 100644 index 00000000..4072614f --- /dev/null +++ b/app/src/main/java/com/fastaccess/data/dao/ProjectsModel.java @@ -0,0 +1,165 @@ +package com.fastaccess.data.dao; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.fastaccess.data.dao.model.User; + +import java.util.Date; + +/** + * Created by kosh on 09/09/2017. + */ + +public class ProjectsModel implements Parcelable { + private String ownerUrl; + private String url; + private String htmlUrl; + private String columnsUrl; + private int id; + private String name; + private String body; + private int number; + private String state; + private User creator; + private Date createdAt; + private Date updatedAt; + + public String getOwnerUrl() { + return ownerUrl; + } + + public void setOwnerUrl(String ownerUrl) { + this.ownerUrl = ownerUrl; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getHtmlUrl() { + return htmlUrl; + } + + public void setHtmlUrl(String htmlUrl) { + this.htmlUrl = htmlUrl; + } + + public String getColumnsUrl() { + return columnsUrl; + } + + public void setColumnsUrl(String columnsUrl) { + this.columnsUrl = columnsUrl; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public int getNumber() { + return number; + } + + public void setNumber(int number) { + this.number = number; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public User getCreator() { + return creator; + } + + public void setCreator(User creator) { + this.creator = creator; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + @Override public int describeContents() { return 0; } + + @Override public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.ownerUrl); + dest.writeString(this.url); + dest.writeString(this.htmlUrl); + dest.writeString(this.columnsUrl); + dest.writeInt(this.id); + dest.writeString(this.name); + dest.writeString(this.body); + dest.writeInt(this.number); + dest.writeString(this.state); + dest.writeParcelable(this.creator, flags); + dest.writeLong(this.createdAt != null ? this.createdAt.getTime() : -1); + dest.writeLong(this.updatedAt != null ? this.updatedAt.getTime() : -1); + } + + public ProjectsModel() {} + + protected ProjectsModel(Parcel in) { + this.ownerUrl = in.readString(); + this.url = in.readString(); + this.htmlUrl = in.readString(); + this.columnsUrl = in.readString(); + this.id = in.readInt(); + this.name = in.readString(); + this.body = in.readString(); + this.number = in.readInt(); + this.state = in.readString(); + this.creator = in.readParcelable(User.class.getClassLoader()); + long tmpCreatedAt = in.readLong(); + this.createdAt = tmpCreatedAt == -1 ? null : new Date(tmpCreatedAt); + long tmpUpdatedAt = in.readLong(); + this.updatedAt = tmpUpdatedAt == -1 ? null : new Date(tmpUpdatedAt); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override public ProjectsModel createFromParcel(Parcel source) {return new ProjectsModel(source);} + + @Override public ProjectsModel[] newArray(int size) {return new ProjectsModel[size];} + }; +} diff --git a/app/src/main/java/com/fastaccess/data/service/ProjectsService.kt b/app/src/main/java/com/fastaccess/data/service/ProjectsService.kt new file mode 100644 index 00000000..1f465d51 --- /dev/null +++ b/app/src/main/java/com/fastaccess/data/service/ProjectsService.kt @@ -0,0 +1,27 @@ +package com.fastaccess.data.service + +import com.fastaccess.data.dao.Pageable +import com.fastaccess.data.dao.ProjectsModel +import io.reactivex.Observable +import retrofit2.http.GET +import retrofit2.http.Headers +import retrofit2.http.Path +import retrofit2.http.Query + +/** + * Created by kosh on 09/09/2017. + */ + +interface ProjectsService { + + @GET("repos/{owner}/{repo}/projects") + @Headers("Accept: application/vnd.github.inertia-preview+json") + fun getRepoProjects(@Path("owner") owner: String, @Path("repo") repo: String, + @Query("state") state: String?, @Query("page") page: Int): Observable> + + @GET("orgs/{org}/projects") + @Headers("Accept: application/vnd.github.inertia-preview+json") + fun getOrgsProjects(@Path("org") org: String, + @Query("page") page: Int): Observable> + +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java b/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java index 7ce11705..a21f77ad 100644 --- a/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java +++ b/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java @@ -18,6 +18,7 @@ import com.fastaccess.data.service.GistService; import com.fastaccess.data.service.IssueService; import com.fastaccess.data.service.NotificationService; import com.fastaccess.data.service.OrganizationService; +import com.fastaccess.data.service.ProjectsService; import com.fastaccess.data.service.PullRequestService; import com.fastaccess.data.service.ReactionsService; import com.fastaccess.data.service.RepoService; @@ -192,6 +193,10 @@ public class RestProvider { return provideRetrofit(enterprise).create(ContentService.class); } + @NonNull public static ProjectsService getProjectsService(boolean enterprise) { + return provideRetrofit(enterprise).create(ProjectsService.class); + } + @Nullable public static GitHubErrorResponse getErrorResponse(@NonNull Throwable throwable) { ResponseBody body = null; if (throwable instanceof HttpException) { diff --git a/app/src/main/java/com/fastaccess/provider/timeline/handler/TableHandler.java b/app/src/main/java/com/fastaccess/provider/timeline/handler/TableHandler.java index ff1bab2d..a3d1a537 100644 --- a/app/src/main/java/com/fastaccess/provider/timeline/handler/TableHandler.java +++ b/app/src/main/java/com/fastaccess/provider/timeline/handler/TableHandler.java @@ -144,12 +144,13 @@ public class TableHandler extends TagNodeHandler { int rowHeight = 0; - for (Spanned cell : row) { - StaticLayout layout = new StaticLayout(cell, textPaint, columnWidth - - 2 * PADDING, Alignment.ALIGN_NORMAL, 1f, 0f, true); - - if (layout.getHeight() > rowHeight) { - rowHeight = layout.getHeight(); + if (columnWidth > 0) { + for (Spanned cell : row) { + StaticLayout layout = new StaticLayout(cell, textPaint, columnWidth + - 2 * PADDING, Alignment.ALIGN_NORMAL, 1f, 0f, true); + if (layout.getHeight() > rowHeight) { + rowHeight = layout.getHeight(); + } } } diff --git a/app/src/main/java/com/fastaccess/ui/adapter/ProjectsAdapter.kt b/app/src/main/java/com/fastaccess/ui/adapter/ProjectsAdapter.kt new file mode 100644 index 00000000..2adc506c --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/adapter/ProjectsAdapter.kt @@ -0,0 +1,20 @@ +package com.fastaccess.ui.adapter + +import android.view.ViewGroup +import com.fastaccess.data.dao.ProjectsModel +import com.fastaccess.ui.adapter.viewholder.ProjectViewHolder +import com.fastaccess.ui.widgets.recyclerview.BaseRecyclerAdapter +import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder + +/** + * Created by kosh on 09/09/2017. + */ +class ProjectsAdapter(data: ArrayList) : + BaseRecyclerAdapter>(data) { + + override fun viewHolder(parent: ViewGroup, viewType: Int): ProjectViewHolder = ProjectViewHolder.newInstance(parent, this) + + override fun onBindView(holder: ProjectViewHolder?, position: Int) { + holder?.bind(data[position]) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/ProjectViewHolder.kt b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/ProjectViewHolder.kt new file mode 100644 index 00000000..a954bb20 --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/ProjectViewHolder.kt @@ -0,0 +1,42 @@ +package com.fastaccess.ui.adapter.viewholder + +import android.view.View +import android.view.ViewGroup +import butterknife.BindView +import com.fastaccess.R +import com.fastaccess.data.dao.ProjectsModel +import com.fastaccess.helper.ParseDateFormat +import com.fastaccess.ui.widgets.FontTextView +import com.fastaccess.ui.widgets.recyclerview.BaseRecyclerAdapter +import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder + +/** + * Created by kosh on 09/09/2017. + */ +class ProjectViewHolder(view: View, adapter: BaseRecyclerAdapter<*, *, *>) : BaseViewHolder(view, adapter) { + + @BindView(R.id.description) lateinit var description: FontTextView + @BindView(R.id.title) lateinit var title: FontTextView + @BindView(R.id.date) lateinit var date: FontTextView + + override fun bind(t: ProjectsModel) { + title.text = t.name + if (t.body.isNullOrBlank()) { + description.visibility = View.GONE + } else { + description.visibility = View.VISIBLE + description.text = t.body + } + if (t.updatedAt == null) { + date.text = ParseDateFormat.getTimeAgo(t.createdAt) + } else { + date.text = ParseDateFormat.getTimeAgo(t.updatedAt) + } + } + + companion object { + fun newInstance(parent: ViewGroup, adapter: BaseRecyclerAdapter<*, *, *>): ProjectViewHolder { + return ProjectViewHolder(getView(parent, R.layout.feeds_row_no_image_item), adapter) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerMvp.java b/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerMvp.java index 25ed188e..3477aa69 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerMvp.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerMvp.java @@ -24,12 +24,14 @@ public interface RepoPagerMvp { int CODE = 0; int ISSUES = 1; int PULL_REQUEST = 2; - int PROFILE = 3; + int PROJECTS = 3; + int PROFILE = 4; @IntDef({ CODE, ISSUES, PULL_REQUEST, + PROJECTS, PROFILE }) @Retention(RetentionPolicy.SOURCE) @interface RepoNavigationType {} 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 f1961227..756689fc 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 @@ -18,6 +18,7 @@ import com.fastaccess.provider.rest.RestProvider; import com.fastaccess.ui.base.mvp.presenter.BasePresenter; import com.fastaccess.ui.modules.repos.code.RepoCodePagerFragment; import com.fastaccess.ui.modules.repos.issues.RepoIssuesPagerFragment; +import com.fastaccess.ui.modules.repos.projects.RepoProjectsFragmentPager; import com.fastaccess.ui.modules.repos.pull_requests.RepoPullRequestPagerFragment; import static com.fastaccess.helper.ActivityHelper.getVisibleFragment; @@ -185,6 +186,8 @@ class RepoPagerPresenter extends BasePresenter implements Rep AppHelper.getFragmentByTag(fragmentManager, RepoIssuesPagerFragment.TAG); RepoPullRequestPagerFragment pullRequestPagerView = (RepoPullRequestPagerFragment) AppHelper.getFragmentByTag(fragmentManager, RepoPullRequestPagerFragment.TAG); + RepoProjectsFragmentPager projectsFragmentPager = (RepoProjectsFragmentPager) AppHelper.getFragmentByTag(fragmentManager, + RepoProjectsFragmentPager.Companion.getTAG()); if (getRepo() == null) { sendToView(RepoPagerMvp.View::onFinishActivity); return; @@ -219,6 +222,13 @@ class RepoPagerPresenter extends BasePresenter implements Rep onShowHideFragment(fragmentManager, pullRequestPagerView, currentVisible); } break; + case RepoPagerMvp.PROJECTS: + if (projectsFragmentPager == null) { + onAddAndHide(fragmentManager, RepoProjectsFragmentPager.Companion.newInstance(repoId(), login()), currentVisible); + } else { + onShowHideFragment(fragmentManager, projectsFragmentPager, currentVisible); + } + break; } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/projects/RepoProjectsFragmentPager.kt b/app/src/main/java/com/fastaccess/ui/modules/repos/projects/RepoProjectsFragmentPager.kt new file mode 100644 index 00000000..d55c5ee5 --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/projects/RepoProjectsFragmentPager.kt @@ -0,0 +1,46 @@ +package com.fastaccess.ui.modules.repos.projects + +import android.os.Bundle +import android.support.design.widget.TabLayout +import android.view.View +import butterknife.BindView +import com.fastaccess.R +import com.fastaccess.data.dao.FragmentPagerAdapterModel +import com.fastaccess.helper.BundleConstant +import com.fastaccess.helper.Bundler +import com.fastaccess.ui.adapter.FragmentsPagerAdapter +import com.fastaccess.ui.base.BaseFragment +import com.fastaccess.ui.base.mvp.BaseMvp +import com.fastaccess.ui.base.mvp.presenter.BasePresenter +import com.fastaccess.ui.widgets.ViewPagerView + +/** + * Created by kosh on 09/09/2017. + */ +class RepoProjectsFragmentPager : BaseFragment>() { + + @BindView(R.id.tabs) lateinit var tabs: TabLayout + @BindView(R.id.pager) lateinit var pager: ViewPagerView + + override fun fragmentLayout(): Int = R.layout.centered_tabbed_viewpager + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + pager.adapter = FragmentsPagerAdapter(childFragmentManager, FragmentPagerAdapterModel.buildForRepoProjects(context, + arguments.getString(BundleConstant.EXTRA), arguments.getString(BundleConstant.ID))) + tabs.setupWithViewPager(pager) + } + + override fun providePresenter(): BasePresenter = BasePresenter() + + companion object { + val TAG = RepoProjectsFragmentPager::class.java.simpleName + fun newInstance(login: String, repoId: String): RepoProjectsFragmentPager { + val fragment = RepoProjectsFragmentPager() + fragment.arguments = Bundler.start() + .put(BundleConstant.ID, repoId) + .put(BundleConstant.EXTRA, login) + .end() + return fragment + } + } +} \ No newline at end of file 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 new file mode 100644 index 00000000..812d9792 --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/projects/list/RepoProjectFragment.kt @@ -0,0 +1,127 @@ +package com.fastaccess.ui.modules.repos.projects.list + +import android.os.Bundle +import android.support.annotation.StringRes +import android.support.v4.widget.SwipeRefreshLayout +import android.view.View +import butterknife.BindView +import com.fastaccess.R +import com.fastaccess.data.dao.ProjectsModel +import com.fastaccess.data.dao.types.IssueState +import com.fastaccess.helper.BundleConstant +import com.fastaccess.helper.Bundler +import com.fastaccess.provider.rest.loadmore.OnLoadMore +import com.fastaccess.ui.adapter.ProjectsAdapter +import com.fastaccess.ui.base.BaseFragment +import com.fastaccess.ui.widgets.StateLayout +import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView +import com.fastaccess.ui.widgets.recyclerview.scroll.RecyclerViewFastScroller + +/** + * Created by kosh on 09/09/2017. + */ + +class RepoProjectFragment : BaseFragment(), RepoProjectMvp.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 + private var onLoadMore: OnLoadMore? = null + private val adapter by lazy { ProjectsAdapter(presenter.getProjects()) } + + + override fun providePresenter(): RepoProjectPresenter = RepoProjectPresenter() + + override fun onNotifyAdapter(items: List?, page: Int) { + hideProgress() + if (items == null || items.isEmpty()) { + adapter.clear() + return + } + if (page <= 1) { + adapter.insertItems(items) + } else { + adapter.addItems(items) + } + } + + override fun getLoadMore(): OnLoadMore { + if (onLoadMore == null) { + onLoadMore = OnLoadMore(presenter) + } + onLoadMore!!.parameter = getState() + return onLoadMore!! + } + + override fun fragmentLayout(): Int = R.layout.micro_grid_refresh_list + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + stateLayout.setEmptyText(R.string.no_projects) + stateLayout.setOnReloadListener({ presenter.onCallApi(1, getState()) }) + refresh.setOnRefreshListener({ presenter.onCallApi(1, getState()) }) + recycler.setEmptyView(stateLayout, refresh) + getLoadMore().initialize(presenter.currentPage, presenter + .previousTotal) + adapter.listener = presenter + recycler.adapter = adapter + recycler.addDivider() + recycler.addOnScrollListener(getLoadMore()) + fastScroller.attachRecyclerView(recycler) + if (presenter.getProjects().isEmpty() && !presenter.isApiCalled) { + presenter.onFragmentCreate(arguments) + presenter.onCallApi(1, getState()) + } + } + + override fun showProgress(@StringRes resId: Int) { + refresh.isRefreshing = true + stateLayout.showProgress() + } + + override fun hideProgress() { + refresh.isRefreshing = false + stateLayout.hideProgress() + } + + override fun showErrorMessage(message: String) { + showReload() + super.showErrorMessage(message) + } + + override fun showMessage(titleRes: Int, msgRes: Int) { + showReload() + super.showMessage(titleRes, msgRes) + } + + override fun onScrollTop(index: Int) { + super.onScrollTop(index) + if (recycler != null) { + recycler.scrollToPosition(0) + } + } + + override fun onDestroyView() { + recycler.removeOnScrollListener(getLoadMore()) + super.onDestroyView() + } + + private fun showReload() { + hideProgress() + stateLayout.showReload(adapter.itemCount) + } + + private fun getState(): IssueState = arguments.getSerializable(BundleConstant.EXTRA_TYPE) as IssueState + + companion object { + fun newInstance(login: String, repoId: String, state: IssueState): RepoProjectFragment { + val fragment = RepoProjectFragment() + fragment.arguments = Bundler.start() + .put(BundleConstant.ID, repoId) + .put(BundleConstant.EXTRA, login) + .put(BundleConstant.EXTRA_TYPE, state) + .end() + return fragment + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/projects/list/RepoProjectMvp.kt b/app/src/main/java/com/fastaccess/ui/modules/repos/projects/list/RepoProjectMvp.kt new file mode 100644 index 00000000..91a5062a --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/projects/list/RepoProjectMvp.kt @@ -0,0 +1,28 @@ +package com.fastaccess.ui.modules.repos.projects.list + +import android.os.Bundle +import com.fastaccess.data.dao.ProjectsModel +import com.fastaccess.data.dao.types.IssueState +import com.fastaccess.provider.rest.loadmore.OnLoadMore +import com.fastaccess.ui.base.mvp.BaseMvp +import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder +import java.util.* + +/** + * Created by kosh on 09/09/2017. + */ +interface RepoProjectMvp { + + interface View : BaseMvp.FAView { + fun onNotifyAdapter(items: List?, page: Int) + fun getLoadMore(): OnLoadMore + } + + interface Presenter : BaseViewHolder.OnItemClickListener, + BaseMvp.PaginationListener { + + fun onFragmentCreate(bundle: Bundle?) + + fun getProjects(): ArrayList + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/projects/list/RepoProjectPresenter.kt b/app/src/main/java/com/fastaccess/ui/modules/repos/projects/list/RepoProjectPresenter.kt new file mode 100644 index 00000000..fec58940 --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/projects/list/RepoProjectPresenter.kt @@ -0,0 +1,72 @@ +package com.fastaccess.ui.modules.repos.projects.list + +import android.os.Bundle +import android.view.View +import com.fastaccess.data.dao.ProjectsModel +import com.fastaccess.data.dao.types.IssueState +import com.fastaccess.helper.BundleConstant +import com.fastaccess.helper.Logger +import com.fastaccess.provider.rest.RestProvider +import com.fastaccess.ui.base.mvp.presenter.BasePresenter +import java.util.* + +/** + * Created by kosh on 09/09/2017. + */ +class RepoProjectPresenter : BasePresenter(), RepoProjectMvp.Presenter { + + private val projects = ArrayList() + private var page: Int = 0 + 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 = "" + + override fun onItemClick(position: Int, v: View?, item: ProjectsModel?) { + + } + + override fun onItemLongClick(position: Int, v: View?, item: ProjectsModel?) { + + } + + override fun onFragmentCreate(bundle: Bundle?) { + bundle?.let { + repoId = it.getString(BundleConstant.ID) + login = it.getString(BundleConstant.EXTRA) + } + } + + override fun getProjects(): ArrayList = projects + + override fun getCurrentPage(): Int = page + + override fun getPreviousTotal(): Int = previousTotal + + override fun setCurrentPage(page: Int) { + this.page = page + } + + override fun setPreviousTotal(previousTotal: Int) { + this.previousTotal = previousTotal + } + + override fun onCallApi(page: Int, parameter: IssueState?): Boolean { + if (page == 1) { + lastPage = Integer.MAX_VALUE + sendToView { view -> view.getLoadMore().reset() } + } + if (page > lastPage || lastPage == 0) { + sendToView({ it.hideProgress() }) + return false + } + currentPage = page + makeRestCall(RestProvider.getProjectsService(isEnterprise) + .getRepoProjects(login, repoId, parameter?.name, page), { response -> + lastPage = response.last + Logger.e(response.items as List?) + sendToView({ it.onNotifyAdapter(response.items, page) }) + }) + return true + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_project.xml b/app/src/main/res/drawable/ic_project.xml new file mode 100644 index 00000000..75d0dde7 --- /dev/null +++ b/app/src/main/res/drawable/ic_project.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/menu-land/repo_bottom_nav_menu.xml b/app/src/main/res/menu-land/repo_bottom_nav_menu.xml index 2136f9ed..424d09d5 100644 --- a/app/src/main/res/menu-land/repo_bottom_nav_menu.xml +++ b/app/src/main/res/menu-land/repo_bottom_nav_menu.xml @@ -24,6 +24,14 @@ android:icon="@drawable/ic_pull_requests" android:title="@string/pull_requests"/> + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2750fc1a..a7da4708 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -561,4 +561,6 @@ In App Animations Disable in App animations everywhere. This PR can\'t be merged now. + Projects + No Projects diff --git a/jobdispatcher/src/main/java/com/firebase/jobdispatcher/GooglePlayDriver.java b/jobdispatcher/src/main/java/com/firebase/jobdispatcher/GooglePlayDriver.java index ae76808c..58314821 100644 --- a/jobdispatcher/src/main/java/com/firebase/jobdispatcher/GooglePlayDriver.java +++ b/jobdispatcher/src/main/java/com/firebase/jobdispatcher/GooglePlayDriver.java @@ -20,7 +20,10 @@ import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import android.support.annotation.NonNull; + import com.firebase.jobdispatcher.FirebaseJobDispatcher.ScheduleResult; /** @@ -28,7 +31,8 @@ import com.firebase.jobdispatcher.FirebaseJobDispatcher.ScheduleResult; * services installed. This backend does not do any availability checks and any uses should be * guarded with a call to {@code GoogleApiAvailability#isGooglePlayServicesAvailable(android.content.Context)} * - * @see GoogleApiAvailability + * @see + * GoogleApiAvailability */ public final class GooglePlayDriver implements Driver { static final String BACKEND_PACKAGE = "com.google.android.gms"; @@ -62,12 +66,6 @@ public final class GooglePlayDriver implements Driver { * Turns Jobs into Bundles. */ private final GooglePlayJobWriter mWriter; - /** - * This is hardcoded to true to avoid putting an unnecessary dependency on the Google Play - * services library. - */ - //TODO: this is an unsatisfying solution - private final boolean mAvailable = true; /** * Instantiates a new GooglePlayDriver. @@ -81,9 +79,16 @@ public final class GooglePlayDriver implements Driver { @Override public boolean isAvailable() { - return mAvailable; + ApplicationInfo applicationInfo = null; + try { + applicationInfo = mContext.getPackageManager().getApplicationInfo(BACKEND_PACKAGE, 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + return applicationInfo != null && applicationInfo.enabled; } + /** * Schedules the provided Job. */