From 24713f54e21370a8fa6a0c727cb60ffe050c76da Mon Sep 17 00:00:00 2001 From: jendib Date: Sat, 12 Mar 2016 23:25:31 +0100 Subject: [PATCH] Close #72: Android: Audit log --- docs-android/app/app.iml | 1 + docs-android/app/src/main/AndroidManifest.xml | 4 + .../docs/activity/AuditLogActivity.java | 105 ++++++++++++++++++ .../docs/activity/DocumentViewActivity.java | 17 ++- .../sismics/docs/activity/MainActivity.java | 11 +- .../docs/adapter/AuditLogListAdapter.java | 92 +++++++++++++++ .../docs/resource/AuditLogResource.java | 38 +++++++ .../ic_assignment_grey600_24dp.png | Bin 0 -> 1242 bytes .../ic_assignment_grey600_48dp.png | Bin 0 -> 1599 bytes .../drawable-xhdpi/ic_comment_black_24dp.png | Bin 296 -> 0 bytes .../ic_comment_grey600_24dp.png | Bin 0 -> 1153 bytes .../ic_assignment_grey600_24dp.png | Bin 0 -> 1379 bytes .../ic_assignment_grey600_48dp.png | Bin 0 -> 1944 bytes .../drawable-xxhdpi/ic_comment_black_24dp.png | Bin 359 -> 0 bytes .../ic_comment_grey600_24dp.png | Bin 0 -> 1262 bytes .../src/main/res/layout/auditlog_activity.xml | 28 +++++ .../main/res/layout/auditlog_list_item.xml | 62 +++++++++++ .../app/src/main/res/layout/doc_list_item.xml | 3 + .../res/layout/document_view_activity.xml | 37 +++--- .../app/src/main/res/layout/main_activity.xml | 34 ++++++ .../app/src/main/res/values/strings.xml | 4 +- .../docs/core/dao/jpa/AuditLogDao.java | 3 +- .../docs/rest/resource/AuditLogResource.java | 12 +- .../src/partial/docs/directive.auditlog.html | 2 +- 24 files changed, 424 insertions(+), 29 deletions(-) create mode 100644 docs-android/app/src/main/java/com/sismics/docs/activity/AuditLogActivity.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/adapter/AuditLogListAdapter.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/resource/AuditLogResource.java create mode 100644 docs-android/app/src/main/res/drawable-xhdpi/ic_assignment_grey600_24dp.png create mode 100644 docs-android/app/src/main/res/drawable-xhdpi/ic_assignment_grey600_48dp.png delete mode 100644 docs-android/app/src/main/res/drawable-xhdpi/ic_comment_black_24dp.png create mode 100644 docs-android/app/src/main/res/drawable-xhdpi/ic_comment_grey600_24dp.png create mode 100644 docs-android/app/src/main/res/drawable-xxhdpi/ic_assignment_grey600_24dp.png create mode 100644 docs-android/app/src/main/res/drawable-xxhdpi/ic_assignment_grey600_48dp.png delete mode 100644 docs-android/app/src/main/res/drawable-xxhdpi/ic_comment_black_24dp.png create mode 100644 docs-android/app/src/main/res/drawable-xxhdpi/ic_comment_grey600_24dp.png create mode 100644 docs-android/app/src/main/res/layout/auditlog_activity.xml create mode 100644 docs-android/app/src/main/res/layout/auditlog_list_item.xml diff --git a/docs-android/app/app.iml b/docs-android/app/app.iml index 0c8f28f8..7c02049b 100644 --- a/docs-android/app/app.iml +++ b/docs-android/app/app.iml @@ -77,6 +77,7 @@ + diff --git a/docs-android/app/src/main/AndroidManifest.xml b/docs-android/app/src/main/AndroidManifest.xml index ff234698..701027c1 100644 --- a/docs-android/app/src/main/AndroidManifest.xml +++ b/docs-android/app/src/main/AndroidManifest.xml @@ -47,6 +47,10 @@ android:name=".activity.DocumentEditActivity" android:label="@string/new_document"> + + diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/AuditLogActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/AuditLogActivity.java new file mode 100644 index 00000000..71651d4c --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/AuditLogActivity.java @@ -0,0 +1,105 @@ +package com.sismics.docs.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.app.AppCompatActivity; +import android.view.MenuItem; +import android.view.View; +import android.widget.ListView; +import android.widget.ProgressBar; + +import com.sismics.docs.R; +import com.sismics.docs.adapter.AuditLogListAdapter; +import com.sismics.docs.listener.HttpCallback; +import com.sismics.docs.model.application.ApplicationContext; +import com.sismics.docs.resource.AuditLogResource; + +import org.json.JSONObject; + +/** + * Audit log activity. + * + * @author bgamard. + */ +public class AuditLogActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Check if logged in + if (!ApplicationContext.getInstance().isLoggedIn()) { + startActivity(new Intent(this, LoginActivity.class)); + finish(); + return; + } + + // Handle activity context + if (getIntent() == null) { + finish(); + return; + } + + // Input document ID (optional) + final String documentId = getIntent().getStringExtra("documentId"); + + // Setup the activity + setContentView(R.layout.auditlog_activity); + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeButtonEnabled(true); + } + + // Configure the swipe refresh layout + SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); + swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright, + android.R.color.holo_green_light, + android.R.color.holo_orange_light, + android.R.color.holo_red_light); + swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + refreshView(documentId); + } + }); + + // Get audit log list + refreshView(documentId); + } + + /** + * Refresh the view. + */ + private void refreshView(String documentId) { + final SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); + final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar); + final ListView auditLogListView = (ListView) findViewById(R.id.auditLogListView); + progressBar.setVisibility(View.VISIBLE); + auditLogListView.setVisibility(View.GONE); + AuditLogResource.list(this, documentId, new HttpCallback() { + @Override + public void onSuccess(JSONObject response) { + auditLogListView.setAdapter(new AuditLogListAdapter(response.optJSONArray("logs"))); + } + + @Override + public void onFinish() { + progressBar.setVisibility(View.GONE); + auditLogListView.setVisibility(View.VISIBLE); + swipeRefreshLayout.setRefreshing(false); + } + }); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + return true; + } + + return super.onOptionsItemSelected(item); + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java index c5e8d12a..4107feb5 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java @@ -154,7 +154,7 @@ public class DocumentViewActivity extends AppCompatActivity { * * @param document Document in JSON format */ - private void refreshDocument(JSONObject document) { + private void refreshDocument(final JSONObject document) { this.document = document; String title = document.optString("title"); @@ -249,7 +249,7 @@ public class DocumentViewActivity extends AppCompatActivity { @Override public void onClick(View view) { DialogFragment dialog = DocExportPdfFragment.newInstance( - DocumentViewActivity.this.document.optString("id"), DocumentViewActivity.this.document.optString("title")); + document.optString("id"), document.optString("title")); dialog.show(getSupportFragmentManager(), "DocExportPdfFragment"); } }); @@ -259,11 +259,22 @@ public class DocumentViewActivity extends AppCompatActivity { button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - DialogFragment dialog = DocShareFragment.newInstance(DocumentViewActivity.this.document.optString("id")); + DialogFragment dialog = DocShareFragment.newInstance(document.optString("id")); dialog.show(getSupportFragmentManager(), "DocShareFragment"); } }); + // Action audit log + button = (Button) findViewById(R.id.actionAuditLog); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(DocumentViewActivity.this, AuditLogActivity.class); + intent.putExtra("documentId", document.optString("id")); + startActivity(intent); + } + }); + // Button add a comment ImageButton imageButton = (ImageButton) findViewById(R.id.addCommentBtn); imageButton.setOnClickListener(new View.OnClickListener() { 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 6732e7f3..04c0add0 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 @@ -72,7 +72,7 @@ public class MainActivity extends AppCompatActivity { // between the sliding drawer and the action bar app icon drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_open, R.string.drawer_close); - drawerLayout.setDrawerListener(drawerToggle); + drawerLayout.addDrawerListener(drawerToggle); // Fill the drawer user info JSONObject userInfo = ApplicationContext.getInstance().getUserInfo(); @@ -137,6 +137,15 @@ public class MainActivity extends AppCompatActivity { } }); + // Click on Latest activity + View auditLogLayout = findViewById(R.id.auditLogLayout); + auditLogLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(MainActivity.this, AuditLogActivity.class)); + } + }); + handleIntent(getIntent()); EventBus.getDefault().register(this); diff --git a/docs-android/app/src/main/java/com/sismics/docs/adapter/AuditLogListAdapter.java b/docs-android/app/src/main/java/com/sismics/docs/adapter/AuditLogListAdapter.java new file mode 100644 index 00000000..b529bccd --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/adapter/AuditLogListAdapter.java @@ -0,0 +1,92 @@ +package com.sismics.docs.adapter; + +import android.content.Context; +import android.content.Intent; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.sismics.docs.R; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Audit log list adapter. + * + * @author bgamard. + */ +public class AuditLogListAdapter extends BaseAdapter { + /** + * Shares. + */ + private List logList; + + /** + * Audit log list adapter. + * + * @param logs Logs + */ + public AuditLogListAdapter(JSONArray logs) { + this.logList = new ArrayList<>(); + + for (int i = 0; i < logs.length(); i++) { + logList.add(logs.optJSONObject(i)); + } + } + + @Override + public int getCount() { + return logList.size(); + } + + @Override + public JSONObject getItem(int position) { + return logList.get(position); + } + + @Override + public long getItemId(int position) { + return getItem(position).hashCode(); + } + + @Override + public View getView(int position, View view, final ViewGroup parent) { + if (view == null) { + LayoutInflater vi = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + view = vi.inflate(R.layout.auditlog_list_item, parent, false); + } + + // Build message + final JSONObject log = getItem(position); + StringBuilder message = new StringBuilder(log.optString("class")); + switch (log.optString("type")) { + case "CREATE": message.append(" created"); break; + case "UPDATE": message.append(" updated"); break; + case "DELETE": message.append(" deleted"); break; + } + switch (log.optString("class")) { + case "Document": + case "Acl": + case "Tag": + case "User": + message.append(" : "); + message.append(log.optString("message")); + break; + } + + // Fill the view + TextView usernameTextView = (TextView) view.findViewById(R.id.usernameTextView); + TextView messageTextView = (TextView) view.findViewById(R.id.messageTextView); + usernameTextView.setText(log.optString("username")); + messageTextView.setText(message); + + return view; + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/resource/AuditLogResource.java b/docs-android/app/src/main/java/com/sismics/docs/resource/AuditLogResource.java new file mode 100644 index 00000000..bd909200 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/resource/AuditLogResource.java @@ -0,0 +1,38 @@ +package com.sismics.docs.resource; + +import android.content.Context; + +import com.sismics.docs.listener.HttpCallback; +import com.sismics.docs.util.OkHttpUtil; + +import okhttp3.HttpUrl; +import okhttp3.Request; + +/** + * Access to /auditlog API. + * + * @author bgamard + */ +public class AuditLogResource extends BaseResource { + /** + * GET /auditlog. + * + * @param context Context + * @param documentId Document ID + * @param callback Callback + */ + public static void list(Context context, String documentId, HttpCallback callback) { + HttpUrl.Builder httpUrlBuilder = HttpUrl.parse(getApiUrl(context) + "/auditlog") + .newBuilder(); + if (documentId != null) { + httpUrlBuilder.addQueryParameter("document", documentId); + } + Request request = new Request.Builder() + .url(httpUrlBuilder.build()) + .get() + .build(); + OkHttpUtil.buildClient(context) + .newCall(request) + .enqueue(HttpCallback.buildOkHttpCallback(callback)); + } +} diff --git a/docs-android/app/src/main/res/drawable-xhdpi/ic_assignment_grey600_24dp.png b/docs-android/app/src/main/res/drawable-xhdpi/ic_assignment_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..1d59bcf237ca561b96d64585b7e83ea87d2e0a42 GIT binary patch literal 1242 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%nF$y5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8SgO-wBu4crV|O)U&u zjg4S>UGkGlb5rw5V0u&FdMyob>IEf)+ybD@E~!PCWvMA{Mftf3U=Lem;&zJ*PV=C8 zQ*gS)!WE}peV}9XLD7m7%`hQg+5s`)i5AF#C;QYqU|KH%ChGfQpFc7%Fa~(KIEGZ* zdNXrl)}a82*5b7;?M<^aVvS!u3DBr*w))NV=+&L}53;{FO23HSiIJJScgtO_AWkP6 z`UNG_o|j{8@IEA+B11q)_1 znF};T9oslPA*-I>!Tj-G!;S+ye=?L*9vv@xH0#mBjvrH>1{dze^8TU9DkOm3mWJ}Wn}gCE))~?zT4R5UN>PdP_h9IR5a~2ws$aL?>pZ2#ciJA z1P{ZDL-X=T(xIoPmReD0DhHgY-4yN4)KkPHLn!=#tdd_#dIk*pBYN-N_xbhte7-;5 zry?_bp&&FW6aXMdTcp*)(GYm~Q{eY*wPPL}Ugc79xGdVjIgAVmG-f)NMAB@=JW@{@ z&8{LZsRCdUV$IIsa&+$zCfX)41~4M0%?{ZBs1lrZqp5)8kX$m)N~zJF(@iL1HLKC( zG99k7CzJWsMe7(cYh8M_X9LTilK zLg=-rW47Q*jplQloxm`M!y$4=MKqI#iIqxaKtm#lgNQiRMR7)F9K{NQ3R;piF;+Wg zr70w!Xw0RHIW-DB9Sy-|AD5-ru{6PiVNRnR6N~UbNI{@Z_y16vZ5+*Vdh(gS|0&F7 zyX+*UCt13fF~P!FgaK1_BAFqL9L;3YbYU=ynfWwFv-z|gNzRfX%dM1|cCaI8osLMO zSk6e9$TY1Qg?y3KY9|p=B+}Sl5!~RED-8BLNfEiG7hys5iznPwY$lgj@_dg9Xa^uQCU> zVDAK`<4p?}<84n;u-6&b)HB*%sRZD;`ZTR3+u8bHx4Iy5No09m%jXqat0$Lz{O;=4 zg#1m_?)ngYOlfOt&dMR-m7&>%AphMH?bM%l(LI`*e4k^!@^@ z;ZnHc$z|80A5Kcod8d|X%I|We)8KCxlYX>L;8RsSpx+SkPB9AQ>glfyPGox%KWKM!`;24W@C&;bd$;`nX@q@vH14(o=UuX%lYJz zXh%(Gt+(d!C2^U@b!)0mP*=+kSVEMvKZRd)j|DSU-}kMm?3*vVGr2jxZu_bAFZ8XR zv;S!2lGke!ioU^GwP12 zK5@OaOHk#VC3Q#hc>wSMNCfRO@tZEW6a?1*tU0T6_wZW4P9y{XBya_8HVj_ot&cFk zTXhr$z+2UgY+`p0ucifzq2Ni3e`a$Zu#B1u5T})TC)pEkl&?vc>|RiG43jSf52khP z?LGhu*LQKVK#s6vQ6X{$$Bg+QzZW)r12K}oUC{@4Tk;C&L8-};t*zKurWNP zflcAH41+@S#lMZJ3=Uz;db@ueIKZZ5w&3RvTh;~^)hgA5%l~6javscHz%ZYM(}F{) lKp;UlLHNm%GEok7>nArq`YfE_wE*Z=22WQ%mvv4FO#lgHWsd*= diff --git a/docs-android/app/src/main/res/drawable-xhdpi/ic_comment_grey600_24dp.png b/docs-android/app/src/main/res/drawable-xhdpi/ic_comment_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..a8ba0fdc616b1adf2dcba5f54bc4111f8f6d3bc2 GIT binary patch literal 1153 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%nF$y5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8Mv>2~2MaLa!-Ky`Y4UTL84#CABECEH%ZgC_h&L>|v`++-@<#X&zK> z3U0R;qWpsZNPPJ1u#Q=_jGX#skrrK z)<)h#1_G|d8j}(k#S~U6OpIM2siezuK-feElTG8b5M8Vaa*OfY1#ja6yjBk3ytgwm_$)e-m(01g_e$A9 zZ~d#eCK5_dEd^L6{!;j?7;^7KU6|A9z$Af1I$w^2GdzsuWb%=DpnHHpJ5Vom0q0C* PP@&-I>gTe~DWM4fqVI&9 literal 0 HcmV?d00001 diff --git a/docs-android/app/src/main/res/drawable-xxhdpi/ic_assignment_grey600_24dp.png b/docs-android/app/src/main/res/drawable-xxhdpi/ic_assignment_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..96caad84b6f83b11e9f2d55997db263ae9a7bd08 GIT binary patch literal 1379 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!WZB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{LaW752`l> zw_BWW>eUB2MjsTdNYM-v0;U}h6P{>+9C)%%%>$EWp5Fs7p@`00Q$s`*GxkK$AWVdYJ{6Vs(*E4@>O_w@ zQ+4|qcC;JseDdk<2l2>ndFA`hoJ(Pr_FaCN>sM^H0>g#KbAOclao>)2 zx9yIcf3)z&$*czxz6i0FZerY``>yl*zZcIP?snV{=bX?zZC{1$hX2cdMExr#v$hy#I66(|2v)bMxGpZAAs=dXDF0Fs+jGH~Yr9 z)B1RB*i)19_hlKF1RAErbY861=ZZS7DtJVUS)hTzMKpR(mJ-UOT>RR9mp6r6I`IVX+XCR2Gxe6rHZP zqx`olPsAqIXmiSxv;Ws#Qhd*Q@4Jjid#^;t3TY(oXKu4As(Y{^_SMoe%3wo5)@-Tz bC6>UDV;nd0$IAaxLB*b@tDnm{r-UW|Ez$58 literal 0 HcmV?d00001 diff --git a/docs-android/app/src/main/res/drawable-xxhdpi/ic_assignment_grey600_48dp.png b/docs-android/app/src/main/res/drawable-xxhdpi/ic_assignment_grey600_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd4b924201c72fba96551ff4ddc02d285ef1952 GIT binary patch literal 1944 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q4M;wBd$a>cNtU=qlmzFem6RtIr7}3C)9WTXpJp<7&;SCUwvn^&w1Gr=XbIJqdZpd>RtPXT0NVp4u- ziLDaQr4TRV7Ql_oD~1LWFu?RH5)1SV^$b8>f+_U%#ji9s7p}UvBq$Z(UaSTehg24% z>IbD3=a&{G10ya?8Dv#~m2**QVo82cNPd0}EEEGW@=NlIGx7@*oP$jj!ZY(y^2>|C zs(pQ}JoAc667!N%JzZ>-fco_^GgGWAOpOf9-OOEFEi9c44P8wgEiDXPoXuRE-HgmE zoXkyNdR_99OLJ56N?>|Z5PDs4>IEf)+ybD@E~!PCWvMA{Mftf3U=Lem;&zJ@PV=C8 zQ*gV*8K+)-pkwqw(TWt!Fd<;t0Wsl;7RZ4o`_w#OS}y`7YAbW$?+gqqe4Z|jAr-gY z%(nFx36yXvXEEery`kf>IPl^Tm&5MtE{j_`9gjA-aVK9ncIuM6V|upEAI1O)=6{U# zUINnHS2L0hMscW3;$XY>e5&_m#=VWaY{|!Pf*=R4{$jx*nUqSz2sL`YCo6tu_bUQ>Ljm(ru@NpW3pi&Eco$ zi-w}(XNxyISo|sEXQ#tY;f(!7@h?yQDBh>h?>zlP_}%VJJ=+ssmoYyv=d8s%pqc*Z04FBbh}S6;LaSarS}!SoHTsO!gTa> z0mFBLNzd8xt{B}rH}lus_{DGkY}-9Gu;WkAJ&nyvdpED2wEH=udP??!@43=5PQRO{ zeQM688DEX;vKxKoXrG#?cGme)68kd$DeG_7+;`a(e#;_*S62JY9;3}uJq$TaR`h6B zE5Gbr`@Hgtc%|9PFgcbx!dEx1^4TeOb+<$0*+xALbEQegEB^9-lHktk=x#N8nidu< z8Of1idp@J(^TC}W*U!2As0qJoqnFXhw<}TGZIxuKw9w;y&-3@OO7-U4(2~mC=gvN# zDe`@>*`s5+=_R=tH|i70S~UXdRlL8x^)R-V==otOtR7gvbaY>;{hMhotP}qW8HxPd z{H;wR!19yZ*4nwdtv#+hUYFVVC-StN^jYz@mNQaraUC_|eBE!f>#l(L6z0mFJ^|KK z&WH21owS_3=h51*Ju|sDSRfFd54~ghBxh2xMqX2tQIH zX6Cr_1xN}eEWiO*8FZjJ@!_HB!~+6sC?3S*l~xe6CGf3C^A6VEymd<=_YGhH7*#HcDBhYa)m6_yBNS5xPS}D_3B_c zt7)1gZ1Z|u*g?)ME6xPZe^9wvr*&7){J^l4fg9HBkeccwdZKEf<|`4M$)~5immvv4FO#tf7(I5Z- literal 0 HcmV?d00001 diff --git a/docs-android/app/src/main/res/drawable-xxhdpi/ic_comment_black_24dp.png b/docs-android/app/src/main/res/drawable-xxhdpi/ic_comment_black_24dp.png deleted file mode 100644 index 382ee7a14b35e9c1c2c24075b028d33e356fa11b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359 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$s z6uj^0;uw-~@9j-*z9s_+*N4V|-xQ=voKo0#nY+6rU1+sXH2kq9IB-JamcO3wc1r)a zWb$&sf+<{g=kzp5J+I_dwfwB;=k;{%r+r;V-(TiDU1;&`%rD2tg1*BW->{1YI^3=c zkYz1-#lBM`n?=ZD!Nq$gI~(+vI7Q^1lr!F@62Ee^e=0hzp0qM21?avK$%CUCQGYM0GnZkqS;-y^eY4tJNVSfCe_a=~2F z>c!*~hAV0_8Mb;xC@1!|mc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L$o& z6x?oc#Hm*w=oo!av?4__ObD2EKuma|1#;lYJ~a=R){B6NdhMnpeg+1{6i*k&kcwMx z?l@*0au7N8(Pwd9EZa+6rY7+hj<=k@2;}YlCUmz@D|%+n z|7QLpYn~mS{lwQH_VzYb(RJ(`3``sf4ez$IE#yA8^YQVZnVMUJG#AfXzcaAxlv|{x z{oUycm+$0``@t%ut$#}8GTTip?o|1rj@*q##d8j=e|vNN*ZU5e&lL83UEvelkmdaS zkrnF-BbJb*481&zyfd36L>QSk7R))9#QC)s;(*_&_NpS$JD%V67|1{!Ry4zn+aR*IalMBiys(G?H3O(kO9 zPMgXicohq0`M*_Jz25qq+onHuFLYF1>!0yc;^orfdh&x^3v4Y*K>llm0}Qg8tj|3= SdMg=J0(rXnxvX + + + + + + + + + + + \ No newline at end of file diff --git a/docs-android/app/src/main/res/layout/auditlog_list_item.xml b/docs-android/app/src/main/res/layout/auditlog_list_item.xml new file mode 100644 index 00000000..c24cff2a --- /dev/null +++ b/docs-android/app/src/main/res/layout/auditlog_list_item.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + \ No newline at end of file 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 43b56de0..0aae61da 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 @@ -13,6 +13,7 @@ android:layout_alignParentStart="true" android:layout_alignParentLeft="true" android:layout_marginRight="12dp" + android:layout_marginEnd="12dp" android:id="@+id/folderImageView" android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -22,7 +23,9 @@ android:id="@+id/titleTextView" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/folderImageView" + android:layout_toEndOf="@+id/folderImageView" android:layout_toLeftOf="@+id/dateTextView" + android:layout_toStartOf="@+id/dateTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="sans-serif-light" diff --git a/docs-android/app/src/main/res/layout/document_view_activity.xml b/docs-android/app/src/main/res/layout/document_view_activity.xml index e13fd81b..0716a8df 100644 --- a/docs-android/app/src/main/res/layout/document_view_activity.xml +++ b/docs-android/app/src/main/res/layout/document_view_activity.xml @@ -52,14 +52,14 @@ @@ -173,7 +173,7 @@ android:drawableTop="@drawable/ic_create_grey600_24dp" style="?android:buttonBarButtonStyle" android:text="@string/edit_document" - android:textColor="@color/button_material_dark" + android:textColor="#ff5a595b" android:textAllCaps="false" android:layout_margin="8dp"/> @@ -184,7 +184,7 @@ android:drawableTop="@drawable/ic_file_upload_grey600_24dp" style="?android:buttonBarButtonStyle" android:text="@string/upload_file" - android:textColor="@color/button_material_dark" + android:textColor="#ff5a595b" android:textAllCaps="false" android:layout_margin="8dp"/> @@ -195,7 +195,7 @@ android:drawableTop="@drawable/ic_file_download_grey600_24dp" style="?android:buttonBarButtonStyle" android:text="@string/download_document" - android:textColor="@color/button_material_dark" + android:textColor="#ff5a595b" android:textAllCaps="false" android:layout_margin="8dp"/> @@ -214,9 +214,9 @@ android:drawableTop="@drawable/ic_description_grey600_24dp" style="?android:buttonBarButtonStyle" android:text="@string/export_pdf" - android:textColor="@color/button_material_dark" + android:textColor="#ff5a595b" android:textAllCaps="false" - android:layout_margin="8dp"/> + android:layout_margin="0dp"/>