From e17abfe41187fa95fefd5cec8646486d130f6b31 Mon Sep 17 00:00:00 2001 From: jendib Date: Sat, 29 Nov 2014 23:50:56 +0100 Subject: [PATCH] Android: share editing --- .../com/sismics/docs/MainApplication.java | 2 - .../docs/activity/DocumentActivity.java | 7 + .../docs/adapter/ShareListAdapter.java | 88 +++++++++ .../sismics/docs/event/ShareDeleteEvent.java | 26 +++ .../sismics/docs/event/ShareSendEvent.java | 28 +++ .../docs/fragment/DocShareFragment.java | 186 ++++++++++++++++++ .../docs/resource/DocumentResource.java | 13 ++ .../sismics/docs/resource/ShareResource.java | 44 +++++ .../drawable-xhdpi/ic_delete_grey600_24dp.png | Bin 0 -> 271 bytes .../drawable-xhdpi/ic_link_grey600_24dp.png | Bin 0 -> 503 bytes .../drawable-xhdpi/ic_share_grey600_24dp.png | Bin 0 -> 629 bytes .../ic_delete_grey600_24dp.png | Bin 0 -> 341 bytes .../drawable-xxhdpi/ic_link_grey600_24dp.png | Bin 0 -> 681 bytes .../drawable-xxhdpi/ic_share_grey600_24dp.png | Bin 0 -> 866 bytes .../main/res/layout/document_share_dialog.xml | 69 +++++++ .../src/main/res/layout/share_list_item.xml | 52 +++++ .../src/main/res/menu/document_activity.xml | 6 + .../app/src/main/res/values/strings.xml | 12 ++ 18 files changed, 531 insertions(+), 2 deletions(-) create mode 100644 docs-android/app/src/main/java/com/sismics/docs/adapter/ShareListAdapter.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/event/ShareDeleteEvent.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/event/ShareSendEvent.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/fragment/DocShareFragment.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/resource/ShareResource.java create mode 100644 docs-android/app/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png create mode 100644 docs-android/app/src/main/res/drawable-xhdpi/ic_link_grey600_24dp.png create mode 100644 docs-android/app/src/main/res/drawable-xhdpi/ic_share_grey600_24dp.png create mode 100644 docs-android/app/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png create mode 100644 docs-android/app/src/main/res/drawable-xxhdpi/ic_link_grey600_24dp.png create mode 100644 docs-android/app/src/main/res/drawable-xxhdpi/ic_share_grey600_24dp.png create mode 100644 docs-android/app/src/main/res/layout/document_share_dialog.xml create mode 100644 docs-android/app/src/main/res/layout/share_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 bb2b0936..17f3fe9d 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 @@ -20,10 +20,8 @@ public class MainApplication extends Application { JSONObject json = PreferenceUtil.getCachedJson(getApplicationContext(), PreferenceUtil.PREF_CACHED_USER_INFO_JSON); ApplicationContext.getInstance().setUserInfo(getApplicationContext(), json); - // TODO Tags caching // TODO Fullscreen preview // TODO Caching preferences - // TODO Edit sharing // TODO Documents adding/editing // TODO Files adding/deleting 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 3f11336b..9650bdd9 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 @@ -6,6 +6,7 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; +import android.support.v4.app.DialogFragment; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBarActivity; import android.text.format.DateFormat; @@ -19,6 +20,7 @@ import android.widget.TextView; import com.sismics.docs.R; import com.sismics.docs.adapter.FilePagerAdapter; import com.sismics.docs.event.DocumentFullscreenEvent; +import com.sismics.docs.fragment.DocShareFragment; import com.sismics.docs.listener.JsonHttpResponseHandler; import com.sismics.docs.model.application.ApplicationContext; import com.sismics.docs.resource.FileResource; @@ -182,6 +184,11 @@ public class DocumentActivity extends ActionBarActivity { downloadZip(); return true; + case R.id.share: + DialogFragment dialog = DocShareFragment.newInstance(document.optString("id")); + dialog.show(getSupportFragmentManager(), "DocShareFragment"); + return true; + case android.R.id.home: finish(); return true; diff --git a/docs-android/app/src/main/java/com/sismics/docs/adapter/ShareListAdapter.java b/docs-android/app/src/main/java/com/sismics/docs/adapter/ShareListAdapter.java new file mode 100644 index 00000000..d0fffc76 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/adapter/ShareListAdapter.java @@ -0,0 +1,88 @@ +package com.sismics.docs.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageButton; +import android.widget.TextView; + +import com.sismics.docs.R; +import com.sismics.docs.event.ShareDeleteEvent; +import com.sismics.docs.event.ShareSendEvent; + +import org.json.JSONArray; +import org.json.JSONObject; + +import de.greenrobot.event.EventBus; + +/** + * Share list adapter. + * + * @author bgamard. + */ +public class ShareListAdapter extends BaseAdapter { + /** + * Shares. + */ + private JSONArray shares; + + /** + * Share list adapter. + * + * @param shares Shares + */ + public ShareListAdapter(JSONArray shares) { + this.shares = shares; + } + + @Override + public int getCount() { + return shares.length(); + } + + @Override + public JSONObject getItem(int position) { + return shares.optJSONObject(position); + } + + @Override + public long getItemId(int position) { + return getItem(position).optString("id").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.share_list_item, parent, false); + } + + // Fill the view + final JSONObject share = getItem(position); + String name = share.optString("name"); + TextView shareTextView = (TextView) view.findViewById(R.id.shareTextView); + shareTextView.setText(name.isEmpty() ? parent.getContext().getString(R.string.share_default_name) : name); + + // Delete a share + ImageButton shareDeleteButton = (ImageButton) view.findViewById(R.id.shareDeleteButton); + shareDeleteButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + EventBus.getDefault().post(new ShareDeleteEvent(share.optString("id"))); + } + }); + + // Send the link + ImageButton shareSendButton = (ImageButton) view.findViewById(R.id.shareSendButton); + shareSendButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + EventBus.getDefault().post(new ShareSendEvent(share)); + } + }); + + return view; + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/event/ShareDeleteEvent.java b/docs-android/app/src/main/java/com/sismics/docs/event/ShareDeleteEvent.java new file mode 100644 index 00000000..1097e4fc --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/event/ShareDeleteEvent.java @@ -0,0 +1,26 @@ +package com.sismics.docs.event; + +/** + * Share delete event. + * + * @author bgamard. + */ +public class ShareDeleteEvent { + /** + * Share ID + */ + private String id; + + /** + * Create a share delete event. + * + * @param id Share ID + */ + public ShareDeleteEvent(String id) { + this.id = id; + } + + public String getId() { + return id; + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/event/ShareSendEvent.java b/docs-android/app/src/main/java/com/sismics/docs/event/ShareSendEvent.java new file mode 100644 index 00000000..8e48e1ca --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/event/ShareSendEvent.java @@ -0,0 +1,28 @@ +package com.sismics.docs.event; + +import org.json.JSONObject; + +/** + * Share send event. + * + * @author bgamard. + */ +public class ShareSendEvent { + /** + * Share data. + */ + private JSONObject share; + + /** + * Create a share send event. + * + * @param share Share data + */ + public ShareSendEvent(JSONObject share) { + this.share = share; + } + + public JSONObject getShare() { + return share; + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/fragment/DocShareFragment.java b/docs-android/app/src/main/java/com/sismics/docs/fragment/DocShareFragment.java new file mode 100644 index 00000000..d910a1b6 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/fragment/DocShareFragment.java @@ -0,0 +1,186 @@ +package com.sismics.docs.fragment; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import com.sismics.docs.R; +import com.sismics.docs.adapter.ShareListAdapter; +import com.sismics.docs.event.ShareDeleteEvent; +import com.sismics.docs.event.ShareSendEvent; +import com.sismics.docs.listener.JsonHttpResponseHandler; +import com.sismics.docs.resource.DocumentResource; +import com.sismics.docs.resource.ShareResource; +import com.sismics.docs.util.PreferenceUtil; + +import org.apache.http.Header; +import org.json.JSONArray; +import org.json.JSONObject; + +import de.greenrobot.event.EventBus; + +/** + * Document sharing dialog fragment. + * + * @author bgamard. + */ +public class DocShareFragment extends DialogFragment { + /** + * Document data. + */ + private JSONObject document; + + /** + * Document sharing dialog fragment + * @param id Document ID + */ + public static DocShareFragment newInstance(String id) { + DocShareFragment fragment = new DocShareFragment(); + Bundle args = new Bundle(); + args.putString("id", id); + fragment.setArguments(args); + return fragment; + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + + // Setup the view + LayoutInflater inflater = getActivity().getLayoutInflater(); + View view = inflater.inflate(R.layout.document_share_dialog, null); + final Button shareAddButton = (Button) view.findViewById(R.id.shareAddButton); + final EditText shareNameEditText = (EditText) view.findViewById(R.id.shareNameEditText); + + // Add a share + shareAddButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + shareNameEditText.setEnabled(false); + shareAddButton.setEnabled(false); + + ShareResource.add(getActivity(), getArguments().getString("id"), shareNameEditText.getText().toString(), + new JsonHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, JSONObject response) { + shareNameEditText.setText(""); + loadShares(getDialog().getWindow().getDecorView()); + } + + @Override + public void onAllFailure(int statusCode, Header[] headers, byte[] responseBytes, Throwable throwable) { + Toast.makeText(getActivity(), R.string.error_adding_share, Toast.LENGTH_SHORT).show(); + } + + @Override + public void onFinish() { + shareNameEditText.setEnabled(true); + shareAddButton.setEnabled(true); + } + }); + } + }); + + // Get the shares + loadShares(view); + + // Build the dialog + builder.setView(view) + .setNegativeButton(R.string.close, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + getDialog().cancel(); + } + }); + return builder.create(); + } + + /** + * Load the shares. + * + * @param view View + */ + private void loadShares(View view) { + if (isDetached()) return; + + final ListView shareListView = (ListView) view.findViewById(R.id.shareListView); + final TextView shareEmptyView = (TextView) view.findViewById(R.id.shareEmptyView); + final ProgressBar shareProgressBar = (ProgressBar) view.findViewById(R.id.shareProgressBar); + + shareListView.setEmptyView(shareProgressBar); + DocumentResource.get(getActivity(), getArguments().getString("id"), new JsonHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, JSONObject response) { + document = response; + JSONArray shares = response.optJSONArray("shares"); + shareProgressBar.setVisibility(View.GONE); + shareListView.setEmptyView(shareEmptyView); + shareListView.setAdapter(new ShareListAdapter(shares)); + } + + @Override + public void onAllFailure(int statusCode, Header[] headers, byte[] responseBytes, Throwable throwable) { + getDialog().cancel(); + Toast.makeText(getActivity(), R.string.error_loading_shares, Toast.LENGTH_SHORT).show(); + } + }); + } + + public void onEvent(ShareDeleteEvent event) { + ShareResource.delete(getActivity(), event.getId(), new JsonHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, JSONObject response) { + loadShares(getDialog().getWindow().getDecorView()); + } + + @Override + public void onAllFailure(int statusCode, Header[] headers, byte[] responseBytes, Throwable throwable) { + Toast.makeText(getActivity(), R.string.error_deleting_share, Toast.LENGTH_SHORT).show(); + } + }); + } + + public void onEvent(ShareSendEvent event) { + if (document == null) return; + + // Build the share link + String serverUrl = PreferenceUtil.getServerUrl(getActivity()); + String link = serverUrl + "/share.html#/share/" + document.optString("id") + "/" + event.getShare().optString("id"); + + // Build the intent + Context context = getActivity(); + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_SEND); + intent.putExtra(Intent.EXTRA_SUBJECT, document.optString("title")); + intent.putExtra(Intent.EXTRA_TEXT, link); + intent.setType("text/plain"); + + // Open the target chooser + context.startActivity(Intent.createChooser(intent, context.getText(R.string.send_share_to))); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EventBus.getDefault().register(this); + } + + @Override + public void onDestroy() { + EventBus.getDefault().unregister(this); + super.onDestroy(); + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/resource/DocumentResource.java b/docs-android/app/src/main/java/com/sismics/docs/resource/DocumentResource.java index 526010f8..502976ab 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/resource/DocumentResource.java +++ b/docs-android/app/src/main/java/com/sismics/docs/resource/DocumentResource.java @@ -30,4 +30,17 @@ public class DocumentResource extends BaseResource { params.put("search", query); client.get(getApiUrl(context) + "/document/list", params, responseHandler); } + + /** + * GET /document/id. + * + * @param context Context + * @param id ID + * @param responseHandler Callback + */ + public static void get(Context context, String id, JsonHttpResponseHandler responseHandler) { + init(context); + + client.get(getApiUrl(context) + "/document/" + id, responseHandler); + } } diff --git a/docs-android/app/src/main/java/com/sismics/docs/resource/ShareResource.java b/docs-android/app/src/main/java/com/sismics/docs/resource/ShareResource.java new file mode 100644 index 00000000..833d993e --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/resource/ShareResource.java @@ -0,0 +1,44 @@ +package com.sismics.docs.resource; + +import android.content.Context; + +import com.loopj.android.http.RequestParams; +import com.sismics.docs.listener.JsonHttpResponseHandler; + + +/** + * Access to /tag API. + * + * @author bgamard + */ +public class ShareResource extends BaseResource { + /** + * PUT /share. + * + * @param context Context + * @param documentId Document ID + * @param name Name + * @param responseHandler Callback + */ + public static void add(Context context, String documentId, String name, JsonHttpResponseHandler responseHandler) { + init(context); + + RequestParams params = new RequestParams(); + params.put("id", documentId); + params.put("name", name); + client.put(getApiUrl(context) + "/share", params, responseHandler); + } + + /** + * DELETE /share. + * + * @param context Context + * @param id ID + * @param responseHandler Callback + */ + public static void delete(Context context, String id, JsonHttpResponseHandler responseHandler) { + init(context); + + client.delete(getApiUrl(context) + "/share/" + id, responseHandler); + } +} diff --git a/docs-android/app/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png b/docs-android/app/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c6bb43e8bd3e3e8155083c05eeef03d9bd054c6c GIT binary patch literal 271 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+dW+zLn00*>!dEwO_14|aD|B@BVomHrCS^#%ez=_^r~OtdL#Bn-Q31acfl;y!^-l1 zmfKXg=}G`qHU)CS8Evhs@e(^c4gPU6>#r2cN&29Au!)zaaY@vIg9S~E^F1ElH;yp4 zqqH}7)xirV9~?R0Y*6scV9H~ox-HVyS&XI(3{77h75Cjv0eP3f)78&qol`;+0Fbp; AQ2+n{ literal 0 HcmV?d00001 diff --git a/docs-android/app/src/main/res/drawable-xhdpi/ic_link_grey600_24dp.png b/docs-android/app/src/main/res/drawable-xhdpi/ic_link_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..b0afb76ae3b58685c0dad12901641018f62cded6 GIT binary patch literal 503 zcmV004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00D1FL_t(o!|j$!Y63wJh6fXT4C3K}4#-F#hxqQ1fQ#e` zih*og2)RKP0bMAfGH8+;2qT2fA~mCS+df7ESv3EytNQ#R_`7#U+0TL|;_5-eXvTi;Gpinf)*#VCmiA(yt zX-e|+^#RK*gauGfQ-)N@pVZ7e0poOkZ5N=(r-ZxsnXY7+o;b|c<*mcFY4v{QTVG}( zE};o{mQeMqhZTxT+XO_?TK(+R0c~fOh*2nJCSZj^(Kl*34d5|Ep@?mO!P$V34RDzw z@}O~0G|g=xvW@HeedF50qsBZlAlf_}`zJF`NSm2F t`eOhwQ(Dw_jd=H8004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00HeuL_t(o!|j(nNE}fVg~y=#BS!;AKKRY3HBB%_q5P@zbcgfyUyJ(PBKcp?c%vTMjI6x+n*0NFe8 z3dM*VV8aS1$N{dbfXk=>7gB(ioLT{^5`Y$_t>Owr#uX4}jI&Vr4eHzgy&U>tH+*C> zAm8Njqdj9m6Is)RoM-C{2Tv192Fck8UZ~4Mw2|%1us7=d2%)J*iQw*fzXYEHjpvS#<#mKNs znO`jbO~(`~8gibe^3AS>HyrthYbI!ruZ|6jbL~TZ&~N0eP&e&h&KT~0?3*S}i6VK@ z66Lp>eZ#(A4O7en>+gNMT}L*guqYJMGUfLXInBQ2>5?j5DZW_&Il1asv;x+n2CT^e z@>am493X84ypr6}X70#O$u5D3K+B#oH#C_&xr-d@tTAa`PIc4&UjV-W;-1$BdZ?r! P00000NkvXXu0mjfkQ59c literal 0 HcmV?d00001 diff --git a/docs-android/app/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png b/docs-android/app/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..4886ab1e9d6d1c6e2dc4f1d988164ea3c3c2d06d GIT binary patch literal 341 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 z6g=zc;uw-~@9hn1KE_0mwuj}bIHLnDaQC)^<#UTI5b7<}2+67rc_cPCoawag&9pN2)`m#Zu461z%)M z1ywvIEPwpnF;n&}h^YWlFNDOnaKGu@5k?F1SqmN5*%%!-4+kt@UCpq-@^!$187*p^(8X7Mv$rM@lsZ)2h&23G#Rhl3Zzr3_zTw9)M7{`CL Q6X-DpPgg&ebxsLQ07*}D?f?J) literal 0 HcmV?d00001 diff --git a/docs-android/app/src/main/res/drawable-xxhdpi/ic_link_grey600_24dp.png b/docs-android/app/src/main/res/drawable-xxhdpi/ic_link_grey600_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..65832a65f098812cdf2eea0f557ca9d3e754a901 GIT binary patch literal 681 zcmV;a0#^NrP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00JRNL_t(&-tE}WOB+EH!12)h@Ki(cXDRmJAqOiMq=^5( z_a;G<9K0EfVEqfkL+PQpal1o*P_9!M6?@{9R7T@gdY-Zz5Xyx&)Z{B>u&di%h zj@-W$IRz<5K?+ikf)u161u5w5f(n+HD`VLoPUCh2rd>Doq}& zQ=|jE#67!|X92DA$Dw?BP(Z*PwRE5Yr;ep(0|f-M$-9E`d`VGwR#3os94QX;IWqK# zJ{`VVLXNfNbm;RGse9}KS_=*ONuBqZZ0SWdxeisYO#@XJiu5s!jL(@OdpsM^7YS%zju2&e9f)Mqxl za6TDpY$v(fm$@@YO-dPmtOJ8{8}10vA+^vhxnYY+CYUPQ{0dcHb-BW}BU^XOC0)K* zLXNfNbh(Oo*|l6R`R8-F004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00P=cL_t(&-tC${OcP-k##>^`pinwEF!~3iVRJD~h9H6s z>TV1WEwc{(#Dt^?iD6KKJ1jlRu7feugdj!;{)wB!Na>_O7R8nUO5_|!fpFh(AIkS$ zhs(QNF1cUs-uL^S=eaLLsJbc?00lq+(7`KAl5q-@S!azJ%KD)pn@k*UKXhA3A82)v{7w9 zUp;{qo>^ zmkZ7XvzzOAJ~$rwog0KX%^StXYBni98hOg5V}%*!*!CSASmY_Q#sV2tD<2+EE%zxo z-oSHC`6FSkl6Sz&bIBh~-NJ+eW`#Q(F(>kO#Q6pVvb)qvj1k9p|6!ElCS8Y0oX^li z4Jnotb92_L4RRCbD|~WX`^I(CzN}SaW2}t#1CE+DieBP;r=D>_!nr23U_NtE%1V!G zY>c=6cf1b*8BnzU1TB6h`6{DWW`x-G9Sx+g zm|_x(e&P~IzRF53lcI(Q={|JG>>WhFc0Z@{t*rj5;oneOT zJ+eS?k2(8Iz4SlVp?!e{<$nT46*9O|)9Sdw^l$RG%jP;wgI@;;BBUwq>77CMFh}M@ sM~q&^$dO}|9#ty`r(*)307$O>0&Wc?drh3olmGw#07*qoM6N<$f{62Z_W%F@ literal 0 HcmV?d00001 diff --git a/docs-android/app/src/main/res/layout/document_share_dialog.xml b/docs-android/app/src/main/res/layout/document_share_dialog.xml new file mode 100644 index 00000000..6405694b --- /dev/null +++ b/docs-android/app/src/main/res/layout/document_share_dialog.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + +