From 79db0edc8ad7c9a0f82171e247ff1e400eb79e77 Mon Sep 17 00:00:00 2001 From: in dow Date: Fri, 24 Mar 2017 07:17:59 +0900 Subject: [PATCH] Add favorite list / recent issue list (#194) * Add favorite list to connection * Add recent issue list to connection --- .../activity/ConnectionActivity.java | 30 ++++++ .../adapter/FavoriteProjectListAdapter.java | 21 +++- .../RecentConnectionIssueListAdapter.java | 99 +++++++++++++++++++ .../fragment/ProjectFavoriteList.java | 9 ++ .../fragment/RecentIssueList.java | 26 ++++- .../main/res/layout/listheader_connection.xml | 3 + .../main/res/layout/listheader_project.xml | 32 ++++++ OpenRedmine/src/main/res/raw/version.md | 2 + 8 files changed, 215 insertions(+), 7 deletions(-) create mode 100644 OpenRedmine/src/main/java/jp/redmine/redmineclient/adapter/RecentConnectionIssueListAdapter.java create mode 100644 OpenRedmine/src/main/res/layout/listheader_project.xml diff --git a/OpenRedmine/src/main/java/jp/redmine/redmineclient/activity/ConnectionActivity.java b/OpenRedmine/src/main/java/jp/redmine/redmineclient/activity/ConnectionActivity.java index 4132202d..88f9382c 100644 --- a/OpenRedmine/src/main/java/jp/redmine/redmineclient/activity/ConnectionActivity.java +++ b/OpenRedmine/src/main/java/jp/redmine/redmineclient/activity/ConnectionActivity.java @@ -17,7 +17,9 @@ import jp.redmine.redmineclient.entity.RedmineFilterSortItem; import jp.redmine.redmineclient.entity.RedmineUser; import jp.redmine.redmineclient.fragment.IssueList; +import jp.redmine.redmineclient.fragment.ProjectFavoriteList; import jp.redmine.redmineclient.fragment.ProjectList; +import jp.redmine.redmineclient.fragment.RecentIssueList; import jp.redmine.redmineclient.model.ConnectionModel; import jp.redmine.redmineclient.param.ConnectionArgument; import jp.redmine.redmineclient.param.FilterArgument; @@ -90,6 +92,34 @@ public Fragment getRawFragment(FilterArgument param) { Log.e(TAG,"fetchCurrentUser", e); } + ConnectionArgument argFavorite = new ConnectionArgument(); + argFavorite.setArgument(); + argFavorite.importArgument(intent); + list.add((new CorePage() { + @Override + public Fragment getRawFragment(ConnectionArgument param) { + return ProjectFavoriteList.newInstance(param); + } + }) + .setParam(argFavorite) + .setName(getString(R.string.favorite)) + .setIcon(android.R.drawable.btn_star) + ); + + ConnectionArgument argRecent = new ConnectionArgument(); + argRecent.setArgument(); + argRecent.importArgument(intent); + list.add((new CorePage() { + @Override + public Fragment getRawFragment(ConnectionArgument param) { + return RecentIssueList.newInstance(param); + } + }) + .setParam(argRecent) + .setName(getString(R.string.recent_issues)) + .setIcon(android.R.drawable.ic_menu_recent_history) + ); + return list; } diff --git a/OpenRedmine/src/main/java/jp/redmine/redmineclient/adapter/FavoriteProjectListAdapter.java b/OpenRedmine/src/main/java/jp/redmine/redmineclient/adapter/FavoriteProjectListAdapter.java index bbe8a7e8..d6be3a51 100644 --- a/OpenRedmine/src/main/java/jp/redmine/redmineclient/adapter/FavoriteProjectListAdapter.java +++ b/OpenRedmine/src/main/java/jp/redmine/redmineclient/adapter/FavoriteProjectListAdapter.java @@ -7,6 +7,7 @@ import android.widget.TextView; import com.j256.ormlite.stmt.QueryBuilder; +import com.j256.ormlite.stmt.Where; import java.sql.SQLException; @@ -20,11 +21,21 @@ public class FavoriteProjectListAdapter extends RedmineDaoAdapter implements StickyListHeadersAdapter { private ConnectionModel mConnection; + protected Integer connection_id; public FavoriteProjectListAdapter(DatabaseCacheHelper helper, Context context){ super(helper, context, RedmineProject.class); mConnection = new ConnectionModel(context); } + + /** + * Setup parameter + * this method is optional. + * @param connection connection id + */ + public void setupParameter(int connection){ + connection_id = connection; + } @Override public View getHeaderView(int i, View convertView, ViewGroup parent) { if (convertView == null) { @@ -64,9 +75,15 @@ protected void setupView(View view, RedmineProject proj) { } @Override - protected QueryBuilder getQueryBuilder() throws SQLException { + protected QueryBuilder getQueryBuilder() throws SQLException { QueryBuilder builder = dao.queryBuilder(); - builder.setWhere(builder.where().gt(RedmineProject.FAVORITE, 0)); + + Where where = builder.where() + .gt(RedmineProject.FAVORITE, 0); + if(connection_id != null) + where.and().eq(RedmineProject.CONNECTION, connection_id); + + builder.setWhere(where); builder.orderBy(RedmineProject.CONNECTION, true); return builder; } diff --git a/OpenRedmine/src/main/java/jp/redmine/redmineclient/adapter/RecentConnectionIssueListAdapter.java b/OpenRedmine/src/main/java/jp/redmine/redmineclient/adapter/RecentConnectionIssueListAdapter.java new file mode 100644 index 00000000..77e8de56 --- /dev/null +++ b/OpenRedmine/src/main/java/jp/redmine/redmineclient/adapter/RecentConnectionIssueListAdapter.java @@ -0,0 +1,99 @@ +package jp.redmine.redmineclient.adapter; + +import android.content.Context; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.j256.ormlite.stmt.QueryBuilder; + +import java.sql.SQLException; +import java.util.Calendar; +import java.util.Date; + +import jp.redmine.redmineclient.R; +import jp.redmine.redmineclient.adapter.form.IssueForm; +import jp.redmine.redmineclient.db.cache.DatabaseCacheHelper; +import jp.redmine.redmineclient.db.cache.RedmineProjectModel; +import jp.redmine.redmineclient.entity.RedmineConnection; +import jp.redmine.redmineclient.entity.RedmineProject; +import jp.redmine.redmineclient.entity.RedmineRecentIssue; +import jp.redmine.redmineclient.form.helper.HtmlHelper; +import jp.redmine.redmineclient.model.ConnectionModel; +import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter; + +public class RecentConnectionIssueListAdapter extends RedmineDaoAdapter implements StickyListHeadersAdapter { + private static final String TAG = RecentConnectionIssueListAdapter.class.getSimpleName(); + private RedmineProjectModel mProject; + private int mConnectionId; + + public RecentConnectionIssueListAdapter(DatabaseCacheHelper helper, Context context){ + super(helper, context, RedmineRecentIssue.class); + mProject = new RedmineProjectModel(helper); + } + public void setParameter(int connection_id){ + mConnectionId = connection_id; + } + + @Override + public View getHeaderView(int i, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = infrator.inflate(R.layout.listheader_project, parent, false); + if(convertView == null) + return null; + } + RedmineProject project = null; + TextView text = (TextView)convertView.findViewById(R.id.name); + try { + project = mProject.fetchById(getHeaderId(i)); + } catch (SQLException e) { + Log.e(TAG, "getHeaderView", e); + } + if(text != null) + text.setText((project == null || TextUtils.isEmpty(project.getName())) ? "" : project.getName()); + //fix background to hide transparent headers + convertView.setBackgroundColor(HtmlHelper.getBackgroundColor(convertView.getContext())); + return convertView; + } + + @Override + public long getHeaderId(int i) { + RedmineRecentIssue proj = (RedmineRecentIssue)getItem(i); + return proj == null ? 0 : proj.getProject().getId(); + } + + @Override + protected long getDbItemId(RedmineRecentIssue item) { + return item.getId(); + } + + @Override + protected int getItemViewId() { + return R.layout.listitem_issue; + } + + @Override + protected void setupView(View view, RedmineRecentIssue history) { + IssueForm form = new IssueForm(view); + form.setValue(history); + } + + @Override + protected QueryBuilder getQueryBuilder() throws SQLException { + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date()); + cal.add(Calendar.DAY_OF_YEAR, -14); + QueryBuilder builder = dao.queryBuilder(); + builder.setWhere(builder.where() + .ge(RedmineRecentIssue.MODIFIED, cal.getTime()) + .and() + .eq(RedmineRecentIssue.CONNECTION, mConnectionId) + ); + builder.orderBy(RedmineRecentIssue.PROJECT, true); + builder.orderBy(RedmineRecentIssue.MODIFIED, false); + return builder; + } + +} diff --git a/OpenRedmine/src/main/java/jp/redmine/redmineclient/fragment/ProjectFavoriteList.java b/OpenRedmine/src/main/java/jp/redmine/redmineclient/fragment/ProjectFavoriteList.java index 904f20c2..be83f42b 100644 --- a/OpenRedmine/src/main/java/jp/redmine/redmineclient/fragment/ProjectFavoriteList.java +++ b/OpenRedmine/src/main/java/jp/redmine/redmineclient/fragment/ProjectFavoriteList.java @@ -15,6 +15,7 @@ import jp.redmine.redmineclient.db.cache.DatabaseCacheHelper; import jp.redmine.redmineclient.entity.RedmineProject; import jp.redmine.redmineclient.fragment.helper.ActivityHandler; +import jp.redmine.redmineclient.param.ConnectionArgument; import se.emilsjolander.stickylistheaders.StickyListHeadersListView; public class ProjectFavoriteList extends OrmLiteFragment { @@ -27,7 +28,11 @@ public ProjectFavoriteList(){ } static public ProjectFavoriteList newInstance(){ + return new ProjectFavoriteList(); + } + static public ProjectFavoriteList newInstance(ConnectionArgument arg){ ProjectFavoriteList instance = new ProjectFavoriteList(); + instance.setArguments(arg.getArgument()); return instance; } @@ -45,6 +50,10 @@ public void onActivityCreated(Bundle savedInstanceState) { list.setFastScrollEnabled(true); FavoriteProjectListAdapter adapter = new FavoriteProjectListAdapter(getHelper(), getActivity()); + ConnectionArgument arg = new ConnectionArgument(); + arg.setArgument(getArguments()); + if(arg.getConnectionId() != -1) + adapter.setupParameter(arg.getConnectionId()); list.setAdapter(adapter); adapter.notifyDataSetChanged(); diff --git a/OpenRedmine/src/main/java/jp/redmine/redmineclient/fragment/RecentIssueList.java b/OpenRedmine/src/main/java/jp/redmine/redmineclient/fragment/RecentIssueList.java index e51389c3..a507b050 100644 --- a/OpenRedmine/src/main/java/jp/redmine/redmineclient/fragment/RecentIssueList.java +++ b/OpenRedmine/src/main/java/jp/redmine/redmineclient/fragment/RecentIssueList.java @@ -5,20 +5,22 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; +import android.widget.BaseAdapter; import com.j256.ormlite.android.apptools.OrmLiteFragment; import jp.redmine.redmineclient.R; import jp.redmine.redmineclient.activity.handler.IssueActionInterface; +import jp.redmine.redmineclient.adapter.RecentConnectionIssueListAdapter; import jp.redmine.redmineclient.adapter.RecentIssueListAdapter; import jp.redmine.redmineclient.db.cache.DatabaseCacheHelper; import jp.redmine.redmineclient.entity.RedmineRecentIssue; import jp.redmine.redmineclient.fragment.helper.ActivityHandler; -import jp.redmine.redmineclient.param.FilterArgument; +import jp.redmine.redmineclient.param.ConnectionArgument; import se.emilsjolander.stickylistheaders.StickyListHeadersListView; public class RecentIssueList extends OrmLiteFragment { - private RecentIssueListAdapter adapter; + private BaseAdapter adapter; private IssueActionInterface mListener; private StickyListHeadersListView list; @@ -31,6 +33,12 @@ static public RecentIssueList newInstance(){ return fragment; } + static public RecentIssueList newInstance(ConnectionArgument intent){ + RecentIssueList fragment = new RecentIssueList(); + fragment.setArguments(intent.getArgument()); + return fragment; + } + @Override public void onDestroyView() { list.setAdapter(null); @@ -43,11 +51,19 @@ public void onActivityCreated(Bundle savedInstanceState) { mListener = ActivityHandler.getHandler(getActivity(), IssueActionInterface.class); list.setFastScrollEnabled(true); - adapter = new RecentIssueListAdapter(getHelper(), getActivity()); - FilterArgument intent = new FilterArgument(); + ConnectionArgument intent = new ConnectionArgument(); intent.setArgument( getArguments() ); + if (intent.getConnectionId() == -1){ + RecentIssueListAdapter _adapter = new RecentIssueListAdapter(getHelper(), getActivity()); + adapter = _adapter; + list.setAdapter(_adapter); + } else { + RecentConnectionIssueListAdapter _adapter = new RecentConnectionIssueListAdapter(getHelper(), getActivity()); + _adapter.setParameter(intent.getConnectionId()); + adapter = _adapter; + list.setAdapter(_adapter); + } onRefreshList(); - list.setAdapter(adapter); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override diff --git a/OpenRedmine/src/main/res/layout/listheader_connection.xml b/OpenRedmine/src/main/res/layout/listheader_connection.xml index 7bc0224d..72afdf59 100644 --- a/OpenRedmine/src/main/res/layout/listheader_connection.xml +++ b/OpenRedmine/src/main/res/layout/listheader_connection.xml @@ -12,6 +12,7 @@ android:src="@android:drawable/btn_star_big_on" android:contentDescription="@string/ticket_relations" android:layout_alignParentLeft="true" + android:layout_alignParentStart="true" android:layout_centerVertical="true"/> \ No newline at end of file diff --git a/OpenRedmine/src/main/res/layout/listheader_project.xml b/OpenRedmine/src/main/res/layout/listheader_project.xml new file mode 100644 index 00000000..0fbc8a0d --- /dev/null +++ b/OpenRedmine/src/main/res/layout/listheader_project.xml @@ -0,0 +1,32 @@ + + + + + + \ No newline at end of file diff --git a/OpenRedmine/src/main/res/raw/version.md b/OpenRedmine/src/main/res/raw/version.md index f6d321b4..7a93b631 100644 --- a/OpenRedmine/src/main/res/raw/version.md +++ b/OpenRedmine/src/main/res/raw/version.md @@ -9,6 +9,8 @@ TODO Next Release =========== +- Add favorite project list to connection +- Add recent issue list to connection v3.19 - 52 - 2016/06/30 ===========