From 6a9a166670a14f377f8f5bee912530671bc8f0db Mon Sep 17 00:00:00 2001 From: jendib Date: Sun, 23 Nov 2014 19:55:08 +0100 Subject: [PATCH] Android: tags in drawer --- .../com/sismics/docs/MainApplication.java | 6 +- .../docs/activity/DocumentActivity.java | 15 ++++ .../sismics/docs/activity/MainActivity.java | 34 +++++++- .../sismics/docs/adapter/TagListAdapter.java | 77 ++++++++++++++++++ .../docs/event/DocumentFullscreenEvent.java | 17 ++++ .../sismics/docs/resource/TagResource.java | 24 ++++++ .../drawable-xhdpi/ic_label_white_24dp.png | Bin 0 -> 374 bytes .../drawable-xxhdpi/ic_label_white_24dp.png | Bin 0 -> 479 bytes .../app/src/main/res/layout/doc_list_item.xml | 1 - .../src/main/res/layout/document_activity.xml | 5 +- .../main/res/layout/file_viewpager_item.xml | 4 +- .../app/src/main/res/layout/tag_list_item.xml | 44 ++++++++++ 12 files changed, 219 insertions(+), 8 deletions(-) create mode 100644 docs-android/app/src/main/java/com/sismics/docs/adapter/TagListAdapter.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/event/DocumentFullscreenEvent.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/resource/TagResource.java create mode 100644 docs-android/app/src/main/res/drawable-xhdpi/ic_label_white_24dp.png create mode 100644 docs-android/app/src/main/res/drawable-xxhdpi/ic_label_white_24dp.png create mode 100644 docs-android/app/src/main/res/layout/tag_list_item.xml diff --git a/docs-android/app/src/main/java/com/sismics/docs/MainApplication.java b/docs-android/app/src/main/java/com/sismics/docs/MainApplication.java index 88924c12..c381cec1 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/MainApplication.java +++ b/docs-android/app/src/main/java/com/sismics/docs/MainApplication.java @@ -16,14 +16,16 @@ import org.json.JSONObject; public class MainApplication extends Application { @Override public void onCreate() { - // Fetching /user/info from cache + // Fetching GET /user from cache JSONObject json = PreferenceUtil.getCachedJson(getApplicationContext(), PreferenceUtil.PREF_CACHED_USER_INFO_JSON); ApplicationContext.getInstance().setUserInfo(getApplicationContext(), json); - // TODO Fullscreen preview + // TODO Tags in drawer & search on select // TODO Sharing // TODO Error feedback // TODO Printing + // TODO Fullscreen preview + // TODO Caching preferences super.onCreate(); } diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentActivity.java index 57996b65..78d01f25 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentActivity.java +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentActivity.java @@ -19,6 +19,7 @@ import android.widget.TextView; import com.loopj.android.http.JsonHttpResponseHandler; import com.sismics.docs.R; import com.sismics.docs.adapter.FilePagerAdapter; +import com.sismics.docs.event.DocumentFullscreenEvent; import com.sismics.docs.model.application.ApplicationContext; import com.sismics.docs.resource.FileResource; import com.sismics.docs.util.PreferenceUtil; @@ -31,6 +32,8 @@ import org.json.JSONObject; import java.util.Date; +import de.greenrobot.event.EventBus; + /** * Document activity. * @@ -92,6 +95,8 @@ public class DocumentActivity extends ActionBarActivity { // Grab the document refreshDocument(document); + + EventBus.getDefault().register(this); } /** @@ -223,4 +228,14 @@ public class DocumentActivity extends ActionBarActivity { request.setDescription(description); downloadManager.enqueue(request); } + + public void onEvent(DocumentFullscreenEvent event) { + findViewById(R.id.detailLayout).setVisibility(event.isFullscreen() ? View.GONE : View.VISIBLE); + } + + @Override + protected void onDestroy() { + EventBus.getDefault().unregister(this); + super.onDestroy(); + } } \ No newline at end of file diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/MainActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/MainActivity.java index ade0539f..d16bf54e 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/activity/MainActivity.java +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/MainActivity.java @@ -13,13 +13,20 @@ import android.support.v7.widget.SearchView; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ListView; import android.widget.TextView; +import com.loopj.android.http.JsonHttpResponseHandler; import com.sismics.docs.R; +import com.sismics.docs.adapter.TagListAdapter; import com.sismics.docs.event.SearchEvent; import com.sismics.docs.model.application.ApplicationContext; import com.sismics.docs.provider.RecentSuggestionsProvider; +import com.sismics.docs.resource.TagResource; +import org.apache.http.Header; import org.json.JSONObject; import de.greenrobot.event.EventBus; @@ -49,7 +56,7 @@ public class MainActivity extends ActionBarActivity { setContentView(R.layout.main_activity); // Enable ActionBar app icon to behave as action to toggle nav drawer - DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + final DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); @@ -68,6 +75,31 @@ public class MainActivity extends ActionBarActivity { TextView emailTextView = (TextView) findViewById(R.id.emailTextView); emailTextView.setText(userInfo.optString("email")); + // Get tag list to fill the drawer + final ListView tagListView = (ListView) findViewById(R.id.tagListView); + TagResource.stats(this, new JsonHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, JSONObject response) { + tagListView.setAdapter(new TagListAdapter(response.optJSONArray("stats"))); + } + }); + + // Click on a tag + tagListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + TagListAdapter adapter = (TagListAdapter) tagListView.getAdapter(); + if (adapter == null) return; + JSONObject tag = adapter.getItem(position); + if (tag == null) return; + SearchView searchView = (SearchView) searchItem.getActionView(); + searchView.setQuery("tag:" + tag.optString("name"), true); + searchView.setIconified(false); + searchView.clearFocus(); + drawerLayout.closeDrawers(); + } + }); + handleIntent(getIntent()); } diff --git a/docs-android/app/src/main/java/com/sismics/docs/adapter/TagListAdapter.java b/docs-android/app/src/main/java/com/sismics/docs/adapter/TagListAdapter.java new file mode 100644 index 00000000..4924234e --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/adapter/TagListAdapter.java @@ -0,0 +1,77 @@ +package com.sismics.docs.adapter; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.sismics.docs.R; + +import org.json.JSONArray; +import org.json.JSONObject; + +/** + * Tag list adapter. + * + * @author bgamard. + */ +public class TagListAdapter extends BaseAdapter { + /** + * Tags. + */ + private JSONArray tags; + + /** + * Tag list adapter. + * + * @param tags Tags + */ + public TagListAdapter(JSONArray tags) { + this.tags = tags; + } + + @Override + public int getCount() { + return tags.length(); + } + + @Override + public JSONObject getItem(int position) { + return tags.optJSONObject(position); + } + + @Override + public long getItemId(int position) { + return getItem(position).optString("id").hashCode(); + } + + @Override + public View getView(int position, View view, ViewGroup parent) { + if (view == null) { + LayoutInflater vi = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + view = vi.inflate(R.layout.tag_list_item, parent, false); + } + + // Fill the view + JSONObject tag = getItem(position); + TextView tagTextView = (TextView) view.findViewById(R.id.tagTextView); + tagTextView.setText(tag.optString("name")); + TextView tagCountTextView = (TextView) view.findViewById(R.id.tagCountTextView); + tagCountTextView.setText(tag.optString("count")); + + // Label color filtering + ImageView labelImageView = (ImageView) view.findViewById(R.id.labelImageView); + Drawable labelDrawable = labelImageView.getDrawable().mutate(); + labelDrawable.setColorFilter(Color.parseColor(tag.optString("color")), PorterDuff.Mode.MULTIPLY); + labelImageView.setImageDrawable(labelDrawable); + labelImageView.invalidate(); + + return view; + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/event/DocumentFullscreenEvent.java b/docs-android/app/src/main/java/com/sismics/docs/event/DocumentFullscreenEvent.java new file mode 100644 index 00000000..fda86776 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/event/DocumentFullscreenEvent.java @@ -0,0 +1,17 @@ +package com.sismics.docs.event; + +/** + * @author bgamard. + */ +public class DocumentFullscreenEvent { + + private boolean fullscreen; + + public DocumentFullscreenEvent(boolean fullscreen) { + this.fullscreen = fullscreen; + } + + public boolean isFullscreen() { + return fullscreen; + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/resource/TagResource.java b/docs-android/app/src/main/java/com/sismics/docs/resource/TagResource.java new file mode 100644 index 00000000..9e70ef24 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/resource/TagResource.java @@ -0,0 +1,24 @@ +package com.sismics.docs.resource; + +import android.content.Context; + +import com.loopj.android.http.JsonHttpResponseHandler; + +/** + * Access to /tag API. + * + * @author bgamard + */ +public class TagResource extends BaseResource { + /** + * GET /tag/stats. + * + * @param context Context + * @param responseHandler Callback + */ + public static void stats(Context context, JsonHttpResponseHandler responseHandler) { + init(context); + + client.get(getApiUrl(context) + "/tag/stats", responseHandler); + } +} diff --git a/docs-android/app/src/main/res/drawable-xhdpi/ic_label_white_24dp.png b/docs-android/app/src/main/res/drawable-xhdpi/ic_label_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..3baa51546f73eb47e0aa4c3720b2b55e535a21c9 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}tg=CK)Uj~LMH3o);76yi2K%s^g z3=E|}g|8AA7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+;1OBOz`!jG!i)^F=12eq z-+8(?hD02Gd(AeB$x-6iN8KZ4FGR1bxp&abrt^tLl;^sMYJpR1U3FUSC^Rh*GF!w} zc0KZc+3MB@2A?=4R^F?t+aUkmhOx1XiNE3i^LO@nl7h)6x-I9NUHV7x;ucn?y26vQ zrpX!{HI1K=+ray-aw}ur$;NeJ4f3m^7>;Ez#9cYiw@a)+QdO6M*>u9?YfKv+cyb@O zZO^`MYyXKA@kQ~!XVzuaZ_zbpY_MhL7v<-VpO3;V{Rc&sehN|D?vwH3*E>dj8?yqIX~i8j?-gQA Qfj(#OboFyt=akR{0R3W*BLDyZ literal 0 HcmV?d00001 diff --git a/docs-android/app/src/main/res/drawable-xxhdpi/ic_label_white_24dp.png b/docs-android/app/src/main/res/drawable-xxhdpi/ic_label_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..3a5cf2807f77dbedeae84090b56bf0fd8bfdc6a8 GIT binary patch literal 479 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhaw6p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>XMsm#F#`j)FbFd;%$g&? zz`z*p>EalYaqsQTvwF;l5=TEqemT5OF~=i(YJs4b5O<;ERzamp$5bOadv~x)n+a`K zXnN7Ui$TcuM(Cx0t7ZSp4li0%VVytcNbxz|Ka*yb-Ln)H$S^gS(8!abz$|&f;lId~ zq`ARzFKe@ITz`LQnajj41q(D+9hsfI>D>a8@FVl3l-Dg_s@wFOYuAzRX?GlS^B1tI z)$w~hFg~885E063YrLAZ$w*UI;LVCgC$TLK0qH*6EbTz4FlN)4*O(4ka_S1?tZdwM zCbRLuv>q{zZ@eZ3=26pq-YpaReRF>1UqiE#nYLD+qWG^fuYG)6cCpt2xzADVH*(iH z*L5xtdeJGlR{W^w+VGdk(=C@h?kzsQgL}oRPT@^2%p!8DnBMN{pJ&QH=hXRS57(zX z^m;SrbP0l+XkKL3_dB literal 0 HcmV?d00001 diff --git a/docs-android/app/src/main/res/layout/doc_list_item.xml b/docs-android/app/src/main/res/layout/doc_list_item.xml index 85cf044c..17a480e0 100644 --- a/docs-android/app/src/main/res/layout/doc_list_item.xml +++ b/docs-android/app/src/main/res/layout/doc_list_item.xml @@ -3,7 +3,6 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" android:padding="12dp" android:clickable="true" android:focusable="true" diff --git a/docs-android/app/src/main/res/layout/document_activity.xml b/docs-android/app/src/main/res/layout/document_activity.xml index 49f1595c..832165de 100644 --- a/docs-android/app/src/main/res/layout/document_activity.xml +++ b/docs-android/app/src/main/res/layout/document_activity.xml @@ -6,6 +6,7 @@ android:layout_height="match_parent"> + android:layout_height="match_parent"/> + android:indeterminate="true"/> diff --git a/docs-android/app/src/main/res/layout/file_viewpager_item.xml b/docs-android/app/src/main/res/layout/file_viewpager_item.xml index fc1e6846..79513525 100644 --- a/docs-android/app/src/main/res/layout/file_viewpager_item.xml +++ b/docs-android/app/src/main/res/layout/file_viewpager_item.xml @@ -10,13 +10,13 @@ android:layout_height="15dip" android:id="@+id/fileProgressBar" android:indeterminate="false" - android:layout_centerInParent="true" /> + android:layout_centerInParent="true"/> + android:src="@drawable/ic_launcher"/> diff --git a/docs-android/app/src/main/res/layout/tag_list_item.xml b/docs-android/app/src/main/res/layout/tag_list_item.xml new file mode 100644 index 00000000..2724a7b7 --- /dev/null +++ b/docs-android/app/src/main/res/layout/tag_list_item.xml @@ -0,0 +1,44 @@ + + + + + + + + + + \ No newline at end of file