Repository: incubator-taverna-mobile Updated Branches: refs/heads/master d601ba0ab -> c914a0402
Fetch workflows belonging to logged in user Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/commit/d0752573 Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/tree/d0752573 Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/diff/d0752573 Branch: refs/heads/master Commit: d07525736ceadd441629b9ab044c8512185e3df6 Parents: d601ba0 Author: Ian Dunlop <[email protected]> Authored: Mon Aug 15 10:57:16 2016 +0100 Committer: Ian Dunlop <[email protected]> Committed: Mon Aug 15 10:57:16 2016 +0100 ---------------------------------------------------------------------- .../activities/DashboardMainActivity.java | 14 ++ .../apache/taverna/mobile/data/DataManager.java | 10 + .../apache/taverna/mobile/data/model/User.java | 30 ++- .../taverna/mobile/data/remote/APIEndPoint.java | 2 +- .../mobile/data/remote/TavernaService.java | 2 + .../ui/myworkflows/MyWorkflowFragment.java | 224 +++++++++++++++++++ .../ui/myworkflows/MyWorkflowMvpView.java | 33 +++ .../ui/myworkflows/MyWorkflowPresenter.java | 86 +++++++ .../workflowdetail/WorkflowDetailPresenter.java | 7 + app/src/main/res/menu/drawer_view.xml | 7 +- app/src/main/res/values/strings.xml | 1 + 11 files changed, 404 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/d0752573/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java b/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java index b31f587..511ab2c 100644 --- a/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java +++ b/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java @@ -55,6 +55,7 @@ import org.apache.taverna.mobile.data.DataManager; import org.apache.taverna.mobile.data.local.PreferencesHelper; import org.apache.taverna.mobile.ui.anouncements.AnnouncementFragment; import org.apache.taverna.mobile.ui.favouriteworkflow.FavouriteWorkflowsFragment; +import org.apache.taverna.mobile.ui.myworkflows.MyWorkflowFragment; import org.apache.taverna.mobile.ui.workflow.WorkflowFragment; import org.apache.taverna.mobile.utils.ActivityUtils; import org.apache.taverna.mobile.utils.WorkflowOpen; @@ -144,6 +145,19 @@ public class DashboardMainActivity extends AppCompatActivity { mDrawerLayout.closeDrawers(); return true; + case R.id.nav_my_workflows: + + fragment = new MyWorkflowFragment(); + ActivityUtils + .addFragmentToActivity( + getSupportFragmentManager(), + fragment, + R.id.frame_container); + + menuItem.setChecked(true); + mDrawerLayout.closeDrawers(); + return true; + case R.id.nav_favourite_workflow: fragment = new FavouriteWorkflowsFragment(); http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/d0752573/app/src/main/java/org/apache/taverna/mobile/data/DataManager.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/data/DataManager.java b/app/src/main/java/org/apache/taverna/mobile/data/DataManager.java index b86d89c..7489fb9 100644 --- a/app/src/main/java/org/apache/taverna/mobile/data/DataManager.java +++ b/app/src/main/java/org/apache/taverna/mobile/data/DataManager.java @@ -154,6 +154,7 @@ public class DataManager { */ public Observable<User> getLoginUserDetail(String credentials, final boolean flagLogin) { + return mBaseApiManager.getTavernaApi().getLoginUserDetail(credentials) .concatMap(new Func1<User, Observable<? extends User>>() { @Override @@ -166,4 +167,13 @@ public class DataManager { } + public Observable<Workflows> getMyWorkflows(String userID, Map<String, String> options) { + return mBaseApiManager.getTavernaApi().getMyWorkflows(userID, options) + .concatMap(new Func1<Workflows, Observable<? extends Workflows>>() { + @Override + public Observable<? extends Workflows> call(Workflows workflows) { + return mDBHelper.syncWorkflows(workflows); + } + }); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/d0752573/app/src/main/java/org/apache/taverna/mobile/data/model/User.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/data/model/User.java b/app/src/main/java/org/apache/taverna/mobile/data/model/User.java index f45e280..90fbb18 100644 --- a/app/src/main/java/org/apache/taverna/mobile/data/model/User.java +++ b/app/src/main/java/org/apache/taverna/mobile/data/model/User.java @@ -18,13 +18,13 @@ */ package org.apache.taverna.mobile.data.model; +import android.os.Parcel; +import android.os.Parcelable; + import org.simpleframework.xml.Attribute; import org.simpleframework.xml.Element; import org.simpleframework.xml.Root; -import android.os.Parcel; -import android.os.Parcelable; - @Root(name = "user") public class User implements Parcelable { @@ -64,6 +64,9 @@ public class User implements Parcelable { @Element(name = "avatar", required = false) private Avatar avatar; + @Element(name="workflows",required = false) + private Workflows workflows; + public String getResource() { return resource; } @@ -160,6 +163,17 @@ public class User implements Parcelable { this.avatar = avatar; } + public User() { + } + + public Workflows getWorkflows() { + return workflows; + } + + public void setWorkflows(Workflows workflows) { + this.workflows = workflows; + } + @Override public int describeContents() { return 0; @@ -179,9 +193,7 @@ public class User implements Parcelable { dest.writeString(this.country); dest.writeString(this.website); dest.writeParcelable(this.avatar, flags); - } - - public User() { + dest.writeParcelable(this.workflows, flags); } protected User(Parcel in) { @@ -197,9 +209,10 @@ public class User implements Parcelable { this.country = in.readString(); this.website = in.readString(); this.avatar = in.readParcelable(Avatar.class.getClassLoader()); + this.workflows = in.readParcelable(Workflows.class.getClassLoader()); } - public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { + public static final Creator<User> CREATOR = new Creator<User>() { @Override public User createFromParcel(Parcel source) { return new User(source); @@ -210,5 +223,4 @@ public class User implements Parcelable { return new User[size]; } }; - -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/d0752573/app/src/main/java/org/apache/taverna/mobile/data/remote/APIEndPoint.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/data/remote/APIEndPoint.java b/app/src/main/java/org/apache/taverna/mobile/data/remote/APIEndPoint.java index 63f9518..86a859b 100644 --- a/app/src/main/java/org/apache/taverna/mobile/data/remote/APIEndPoint.java +++ b/app/src/main/java/org/apache/taverna/mobile/data/remote/APIEndPoint.java @@ -28,6 +28,6 @@ public class APIEndPoint { public static final String WORKFLOW = "workflow.xml"; public static final String USER = "user.xml"; public static final String LICENSE = "license.xml"; - public static final String WHOAMI = "whoami.xml"; + public static final String MY_WORKFLOWS = "user.xml"; } http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/d0752573/app/src/main/java/org/apache/taverna/mobile/data/remote/TavernaService.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/data/remote/TavernaService.java b/app/src/main/java/org/apache/taverna/mobile/data/remote/TavernaService.java index 825f423..5406cf5 100644 --- a/app/src/main/java/org/apache/taverna/mobile/data/remote/TavernaService.java +++ b/app/src/main/java/org/apache/taverna/mobile/data/remote/TavernaService.java @@ -60,4 +60,6 @@ public interface TavernaService { @GET(APIEndPoint.WHOAMI) Observable<User> getLoginUserDetail(@Header("Authorization") String credentials); + @GET(APIEndPoint.MY_WORKFLOWS) + Observable<Workflows> getMyWorkflows(@Query("id") String id, @QueryMap Map<String, String> options); } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/d0752573/app/src/main/java/org/apache/taverna/mobile/ui/myworkflows/MyWorkflowFragment.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/ui/myworkflows/MyWorkflowFragment.java b/app/src/main/java/org/apache/taverna/mobile/ui/myworkflows/MyWorkflowFragment.java new file mode 100644 index 0000000..a829966 --- /dev/null +++ b/app/src/main/java/org/apache/taverna/mobile/ui/myworkflows/MyWorkflowFragment.java @@ -0,0 +1,224 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.taverna.mobile.ui.myworkflows; + +import android.content.Intent; +import android.os.Bundle; +import android.support.design.widget.Snackbar; +import android.support.v4.app.Fragment; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.widget.DefaultItemAnimator; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ProgressBar; + +import org.apache.taverna.mobile.R; +import org.apache.taverna.mobile.data.DataManager; +import org.apache.taverna.mobile.data.local.PreferencesHelper; +import org.apache.taverna.mobile.data.model.Workflow; +import org.apache.taverna.mobile.data.model.Workflows; +import org.apache.taverna.mobile.ui.adapter.EndlessRecyclerOnScrollListener; +import org.apache.taverna.mobile.ui.adapter.RecyclerItemClickListner; +import org.apache.taverna.mobile.ui.adapter.WorkflowAdapter; +import org.apache.taverna.mobile.ui.workflow.WorkflowMvpView; +import org.apache.taverna.mobile.ui.workflow.WorkflowPresenter; +import org.apache.taverna.mobile.ui.workflowdetail.WorkflowDetailActivity; +import org.apache.taverna.mobile.utils.ConnectionInfo; +import org.apache.taverna.mobile.utils.ScrollChildSwipeRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class MyWorkflowFragment extends Fragment implements WorkflowMvpView, + RecyclerItemClickListner.OnItemClickListener { + + public final String LOG_TAG = getClass().getSimpleName(); + + @BindView(R.id.rv_workflows) + RecyclerView mRecyclerView; + + @BindView(R.id.progress_circular) + ProgressBar mProgressBar; + + @BindView(R.id.swipe_refresh) + ScrollChildSwipeRefreshLayout mSwipeRefresh; + + private DataManager dataManager; + + private MyWorkflowPresenter mWorkflowPresenter; + + private WorkflowAdapter mWorkflowAdapter; + + + private int mPageNumber = 1; + private List<Workflow> mWorkflowList; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mWorkflowList = new ArrayList<>(); + dataManager = new DataManager(new PreferencesHelper(getContext())); + mWorkflowPresenter = new MyWorkflowPresenter(dataManager); + + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle + savedInstanceState) { + + View rootView = inflater.inflate(R.layout.fragment_dashboard, container, false); + ButterKnife.bind(this, rootView); + mWorkflowPresenter.attachView(this); + + final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); + + mRecyclerView.setLayoutManager(layoutManager); + mRecyclerView.setItemAnimator(new DefaultItemAnimator()); + mRecyclerView.hasFixedSize(); + + mWorkflowAdapter = new WorkflowAdapter(mWorkflowList, getContext()); + + mRecyclerView.setAdapter(mWorkflowAdapter); + mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListner(getActivity(), this)); + + showProgressbar(true); + mWorkflowPresenter.loadMyWorkflows(mPageNumber); + + mRecyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(layoutManager) { + @Override + public void onLoadMore(int current_page) { + + if (ConnectionInfo.isConnectingToInternet(getContext()) + && mWorkflowList.size() % 10 == 0) { + mWorkflowList.add(null); + mWorkflowAdapter.notifyItemInserted(mWorkflowList.size()); + ++mPageNumber; + mWorkflowPresenter.loadMyWorkflows(mPageNumber); + Log.d(LOG_TAG, "Loading more"); + } else if (!ConnectionInfo.isConnectingToInternet(getContext())) { + Log.d(LOG_TAG, "Internet not available. Not loading more posts."); + showErrorSnackBar(); + } + } + }); + + mSwipeRefresh.setColorSchemeResources(R.color.colorAccent, R.color.colorAccent, R.color + .colorPrimary); + mSwipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + if (ConnectionInfo.isConnectingToInternet(getContext())) { + + mPageNumber = 1; + mWorkflowPresenter.loadMyWorkflows(mPageNumber); + + mSwipeRefresh.setRefreshing(true); + + Log.d(LOG_TAG, "Swipe Refresh"); + + } else { + Log.d(LOG_TAG, "NO Internet Connection"); + showErrorSnackBar(); + if (mSwipeRefresh.isRefreshing()) { + mSwipeRefresh.setRefreshing(false); + } + } + + } + }); + + + return rootView; + } + + @Override + public void showProgressbar(boolean b) { + + if (b) { + mProgressBar.setVisibility(View.VISIBLE); + } else { + mProgressBar.setVisibility(View.GONE); + mRecyclerView.setVisibility(View.VISIBLE); + } + + } + + @Override + public void showErrorSnackBar() { + + final Snackbar snackbar = Snackbar.make(mRecyclerView, "NO Internet Connection", Snackbar + .LENGTH_INDEFINITE); + snackbar.setAction("OK", new View.OnClickListener() { + @Override + public void onClick(View view) { + snackbar.dismiss(); + } + }); + + snackbar.show(); + } + + @Override + public void showWorkflows(Workflows workflows) { + + if (mSwipeRefresh.isRefreshing()) { + mSwipeRefresh.setRefreshing(false); + mWorkflowList.clear(); + } + + mWorkflowList.addAll(workflows.getWorkflowList()); + mWorkflowAdapter.notifyDataSetChanged(); + } + + @Override + public void removeLoadMoreProgressbar() { + if (mPageNumber != 1) { + mWorkflowList.remove(mWorkflowList.size() - 1); + mWorkflowAdapter.notifyDataSetChanged(); + + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + mWorkflowPresenter.detachView(); + } + + @Override + public void onItemClick(View childView, int position) { + Intent intent = new Intent(getActivity(), WorkflowDetailActivity.class); + intent.putExtra("id", mWorkflowList.get(position).getId()); + intent.putExtra("title", mWorkflowList.get(position).getTitle()); + startActivity(intent); + } + + @Override + public void onItemLongPress(View childView, int position) { + + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/d0752573/app/src/main/java/org/apache/taverna/mobile/ui/myworkflows/MyWorkflowMvpView.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/ui/myworkflows/MyWorkflowMvpView.java b/app/src/main/java/org/apache/taverna/mobile/ui/myworkflows/MyWorkflowMvpView.java new file mode 100644 index 0000000..48142d6 --- /dev/null +++ b/app/src/main/java/org/apache/taverna/mobile/ui/myworkflows/MyWorkflowMvpView.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.taverna.mobile.ui.myworkflows; + +import org.apache.taverna.mobile.data.model.Workflows; +import org.apache.taverna.mobile.ui.base.MvpView; + +public interface MyWorkflowMvpView extends MvpView { + + void showProgressbar(boolean b); + + void showErrorSnackBar(); + + void showWorkflows(Workflows workflows); + + void removeLoadMoreProgressbar(); +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/d0752573/app/src/main/java/org/apache/taverna/mobile/ui/myworkflows/MyWorkflowPresenter.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/ui/myworkflows/MyWorkflowPresenter.java b/app/src/main/java/org/apache/taverna/mobile/ui/myworkflows/MyWorkflowPresenter.java new file mode 100644 index 0000000..eddc788 --- /dev/null +++ b/app/src/main/java/org/apache/taverna/mobile/ui/myworkflows/MyWorkflowPresenter.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.taverna.mobile.ui.myworkflows; + +import org.apache.taverna.mobile.data.DataManager; +import org.apache.taverna.mobile.data.model.Workflows; +import org.apache.taverna.mobile.ui.base.BasePresenter; +import org.apache.taverna.mobile.ui.workflow.WorkflowMvpView; + +import java.util.HashMap; +import java.util.Map; + +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +public class MyWorkflowPresenter extends BasePresenter<WorkflowMvpView> { + + public final String LOG_TAG = getClass().getSimpleName(); + private DataManager mDataManager; + private Subscription mSubscriptions; + + public MyWorkflowPresenter(DataManager dataManager) { + mDataManager = dataManager; + } + + @Override + public void attachView(WorkflowMvpView mvpView) { + super.attachView(mvpView); + } + + @Override + public void detachView() { + super.detachView(); + if (mSubscriptions != null) mSubscriptions.unsubscribe(); + } + + public void loadMyWorkflows(int pageNumber) { + if (mSubscriptions != null) mSubscriptions.unsubscribe(); + mSubscriptions = mDataManager.getMyWorkflows(mDataManager.getPreferencesHelper().getUserID(), getQueryOptions(pageNumber)) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(new Observer<Workflows>() { + @Override + public void onCompleted() { + getMvpView().showProgressbar(false); + } + + @Override + public void onError(Throwable e) { + getMvpView().showProgressbar(false); + } + + @Override + public void onNext(Workflows workflows) { + getMvpView().removeLoadMoreProgressbar(); + getMvpView().showWorkflows(workflows); + } + }); + + } + + private Map<String, String> getQueryOptions(int pageNumber) { + + Map<String, String> option = new HashMap<>(); + option.put("elements", "workflows"); + return option; + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/d0752573/app/src/main/java/org/apache/taverna/mobile/ui/workflowdetail/WorkflowDetailPresenter.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/ui/workflowdetail/WorkflowDetailPresenter.java b/app/src/main/java/org/apache/taverna/mobile/ui/workflowdetail/WorkflowDetailPresenter.java index 0850e96..c1a8ee8 100644 --- a/app/src/main/java/org/apache/taverna/mobile/ui/workflowdetail/WorkflowDetailPresenter.java +++ b/app/src/main/java/org/apache/taverna/mobile/ui/workflowdetail/WorkflowDetailPresenter.java @@ -214,5 +214,12 @@ public class WorkflowDetailPresenter extends BasePresenter<WorkflowDetailMvpView return option; } + private Map<String, String> getUserWorkflowsQueryOptions() { + + Map<String, String> option = new HashMap<>(); + option.put("elements", "workflow"); + return option; + } + } http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/d0752573/app/src/main/res/menu/drawer_view.xml ---------------------------------------------------------------------- diff --git a/app/src/main/res/menu/drawer_view.xml b/app/src/main/res/menu/drawer_view.xml index 4e799ee..9e0c71f 100644 --- a/app/src/main/res/menu/drawer_view.xml +++ b/app/src/main/res/menu/drawer_view.xml @@ -21,8 +21,11 @@ <item android:id="@+id/nav_workflows" android:icon="@drawable/ic_dashboard_home_web" - android:title="Workflows"/> - + android:title="All Workflows"/> + <item + android:id="@+id/nav_my_workflows" + android:icon="@drawable/ic_userprofile" + android:title="@string/my_workflows"/> <item android:id="@+id/nav_favourite_workflow" android:icon="@drawable/ic_star_black_24dp" http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/d0752573/app/src/main/res/values/strings.xml ---------------------------------------------------------------------- diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6297496..a19a276 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -119,4 +119,5 @@ limitations under the License. <string name="login_button_description">Login Button</string> <string name="err_login_email">Enter valid email</string> <string name="err_login_password">Enter valid password</string> + <string name="my_workflows">My Workflows</string> </resources>
