From 4ee7d20f817d1fec0bf4797d8dc19da090db78b4 Mon Sep 17 00:00:00 2001 From: Mariano Ruiz Date: Mon, 21 Dec 2020 20:28:00 -0500 Subject: [PATCH] Location disclosure refactor: change dialog by an activity / layout --- src/main/AndroidManifest.xml | 2 + .../mobile/RequestPermissionActivity.java | 43 ++++++++++ .../mobile/RequestPermissionDialog.java | 67 --------------- .../webapp/mobile/SettingsStore.java | 4 +- src/main/res/drawable-anydpi/location_pin.xml | 11 +++ src/main/res/drawable-hdpi/location_pin.png | Bin 0 -> 1782 bytes src/main/res/drawable-mdpi/location_pin.png | Bin 0 -> 1331 bytes src/main/res/drawable-xhdpi/location_pin.png | Bin 0 -> 2689 bytes src/main/res/drawable-xxhdpi/location_pin.png | Bin 0 -> 3623 bytes src/main/res/layout/request_permission.xml | 79 ++++++++++++++++++ src/main/res/values/strings.xml | 4 +- src/main/res/values/styles.xml | 4 + .../mobile/EmbeddedBrowserActivity.java | 34 +++++++- .../mobile/EmbeddedBrowserActivity.java | 33 +++++++- 14 files changed, 207 insertions(+), 74 deletions(-) create mode 100644 src/main/java/org/medicmobile/webapp/mobile/RequestPermissionActivity.java delete mode 100644 src/main/java/org/medicmobile/webapp/mobile/RequestPermissionDialog.java create mode 100644 src/main/res/drawable-anydpi/location_pin.xml create mode 100644 src/main/res/drawable-hdpi/location_pin.png create mode 100644 src/main/res/drawable-mdpi/location_pin.png create mode 100644 src/main/res/drawable-xhdpi/location_pin.png create mode 100644 src/main/res/drawable-xxhdpi/location_pin.png create mode 100644 src/main/res/layout/request_permission.xml diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 5ad24305..002ab083 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -43,6 +43,8 @@ android:screenOrientation="portrait"/> + diff --git a/src/main/java/org/medicmobile/webapp/mobile/RequestPermissionActivity.java b/src/main/java/org/medicmobile/webapp/mobile/RequestPermissionActivity.java new file mode 100644 index 00000000..cfce8b36 --- /dev/null +++ b/src/main/java/org/medicmobile/webapp/mobile/RequestPermissionActivity.java @@ -0,0 +1,43 @@ +package org.medicmobile.webapp.mobile; + +import android.os.Bundle; +import android.view.View; +import android.view.Window; +import android.widget.TextView; + +import static org.medicmobile.webapp.mobile.MedicLog.trace; + +/** + * Shows a confirmation view that displays a "prominent" disclosure about how + * the user geolocation data is used, asking to confirm whether to allow the app to + * access the location or not. + * + * If the user accepts, a request to the API to access the location is made by the main activity, + * but Android will show another confirmation dialog. If the user decline the first + * confirmation, the request to the API is omitted and the decision recorded to avoid + * requesting the same next time. + */ +public class RequestPermissionActivity extends LockableActivity { + + @Override public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + this.requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.request_permission); + String message = getResources().getString(R.string.locRequest_message); + String appName = getResources().getString(R.string.app_name); + TextView field = (TextView) findViewById(R.id.locMessageText); + field.setText(String.format(message, appName)); + } + + public void onClickOk(View view) { + trace(this, "onClickOk() :: user accepted to share the location"); + setResult(RESULT_OK); + finish(); + } + + public void onClickNegative(View view) { + trace(this, ":: onClickNegative() :: user denied to share the location"); + setResult(RESULT_CANCELED); + finish(); + } +} diff --git a/src/main/java/org/medicmobile/webapp/mobile/RequestPermissionDialog.java b/src/main/java/org/medicmobile/webapp/mobile/RequestPermissionDialog.java deleted file mode 100644 index c276b20f..00000000 --- a/src/main/java/org/medicmobile/webapp/mobile/RequestPermissionDialog.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.medicmobile.webapp.mobile; - -import android.Manifest; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.support.v4.app.ActivityCompat; - -import static org.medicmobile.webapp.mobile.MedicLog.error; -import static org.medicmobile.webapp.mobile.MedicLog.trace; - -/** - * Shows a confirmation dialog that displays a "prominent" disclosure about how - * the user geolocation data is used, asking to confirm whether to allow the app to - * access the location or not. - * - * If the user accepts, a request to the API to access the location is made, - * but Android will show another confirmation dialog. If the user decline the first - * confirmation, the request to the API is omitted and the decision recorded to avoid - * requesting the same next time. - */ -public abstract class RequestPermissionDialog { - - private static final String[] LOCATION_PERMISSIONS = { Manifest.permission.ACCESS_FINE_LOCATION }; - - /** - * Show the confirmation dialog unless the user has previously denied - * to share the location from this same dialog. - */ - public static void show(final EmbeddedBrowserActivity activity, final int requestCode) { - final SettingsStore settings = SettingsStore.in(activity); - if (settings.hasUserDeniedGeolocation()) { - trace(activity, "RequestPermissionDialog.show() :: " + - "user has previously denied to share location"); - activity.locationRequestResolved(); - return; - } - String message = activity.getResources().getString(R.string.locRequest_message); - String appName = activity.getResources().getString(R.string.app_name); - AlertDialog.Builder builder = new AlertDialog.Builder(activity); - AlertDialog alert = builder - .setTitle(R.string.locRequest_title) - .setIcon(android.R.drawable.ic_menu_mylocation) - .setMessage(String.format(message, appName)) - .setCancelable(true) - .setPositiveButton(R.string.locRequest_okButton, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - trace(activity, "RequestPermissionDialog.show() :: " + - "user accepted to share the location"); - ActivityCompat.requestPermissions(activity, LOCATION_PERMISSIONS, requestCode); - } - }) - .setNegativeButton(R.string.locRequest_denyButton, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - trace(activity, "RequestPermissionDialog.show() :: " + - "user denied to share the location"); - activity.locationRequestResolved(); - try { - settings.setUserDeniedGeolocation(); - } catch (SettingsException e) { - error(e, "Error recording negative to access location"); - } - } - }) - .create(); - alert.show(); - } -} diff --git a/src/main/java/org/medicmobile/webapp/mobile/SettingsStore.java b/src/main/java/org/medicmobile/webapp/mobile/SettingsStore.java index a60565fa..41ac9ea3 100644 --- a/src/main/java/org/medicmobile/webapp/mobile/SettingsStore.java +++ b/src/main/java/org/medicmobile/webapp/mobile/SettingsStore.java @@ -54,10 +54,8 @@ String get(String key) { /** * Returns true if the user has denied to provide its geolocation data. - * The rejection is taken from the first dialog with the "prominent" disclosure + * The rejection is taken from the first view with the "prominent" disclosure * about the location data, not from the native dialog displayed by Android. - * - * @see RequestPermissionDialog */ boolean hasUserDeniedGeolocation() { return prefs.getBoolean("denied-geolocation", false); diff --git a/src/main/res/drawable-anydpi/location_pin.xml b/src/main/res/drawable-anydpi/location_pin.xml new file mode 100644 index 00000000..de72ef4a --- /dev/null +++ b/src/main/res/drawable-anydpi/location_pin.xml @@ -0,0 +1,11 @@ + + + diff --git a/src/main/res/drawable-hdpi/location_pin.png b/src/main/res/drawable-hdpi/location_pin.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1fd948844e6872d6fbe8ba3440bf44ff65c8b8 GIT binary patch literal 1782 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 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xhdpi/location_pin.png b/src/main/res/drawable-xhdpi/location_pin.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc7fd0911acee33ee1c8b8058cc8fabee0bdfe1 GIT binary patch literal 2689 zcmV-{3V!v8P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91U;qFB0AYY4DgXcp>q$gGRCodHU2Skw)fqnT-E1}i z6Ea{skt9m$So|2%9JjSHAvuJ-01wxyiSvKcz zp8m3C*CJ4K+rhFg`uZ2gglr{A3#5=%Ru(=llAxF*xz!TXSyNlRDSBP~kWW{R*^~-& zch|nNMuw07Iws}s_|~X)MAdSE`Yoa-f}x5vtD7$QN)?0>fuh@F$rpXy_r|1nfQ6Z% zikv?`G+>eVLrrbN%II};%Ab$%TzLz$;-&7ZW217ll=9MXw}t;iL?2lJy1Tu(VP`&U zd~)H265TEcXb>e~ZzGYd|TUsV%GgeYEM4lYS`r3hb^8|M<~J>{J(*n#=uw zn$E+e>4TtE()8T&D?amz?OC8ZJ9k~rjmK*&&NQ!Jg-p*PeaVgKqK?+^TV8m0YJPv! z`R*N(Vt<`%;y@5^26x1uMWD79-)rN3$3{jf^#V{-X_-4>KrC)~xw^%mIvnfj@VOR;P510@XbI)Er#L4 z=%{?BXnV*`(fB>jJ?=n&uE{hknNWf-@Wj~aJ0lK6<)IQ{M(pVtPY?*BaxQj7HSkO) zt>YLmBldLPr`=+h&lw&X>?!<|MLJDW$21TstDKcOpLALY!erNXR~&o^azbAXsu8o>o#Bj zOM_KmAAuF$NTA+5nsTqLl^+(s0G1AeHe3f`hlN_h_lbUvDFc?4GQ`?g@hvE7LqQMO zsS~IcDeetez*KF}hD#9Dt9FdxgK5))N%a=j*4VtH)G)R(Z8|Wa4f;XK%O(b%rcD!O z1@Ar5AW&jdZc?P=On_2M)`pvTse5>=l(R`^&<1r7ZYRZ5G zOw|T$tYAQFSM3tkz2IPiPegEzahBhsB%xD#pzVe0!}*ij&Y}{1EFvy)Sm}=XElD z%a-GC#rKKmle(6M3sWEY9IJ!CHgVyx;$v=x5zqhpF;yI(o+c1Z)P*WLb@Z&^yO<3z z*OpCNpU!cDKzOc-cQ-tkp72aRM$DO>DVrb=gs6!$pcL&p(?vS1 zrJ(y$6Q0SR5o>zglZ=WOpr#>TTit6CZciL6%cWW~He6)rWnf-|^# zW#L&M0CYscI~ep)uV95r53b*FWUrgTuH8s&FKM~W+ zz{TA39|1>jH7*bU?O&iH(aPgB9eW4-#uU#7PRuReU&-@bf|BglMdod`B;_2_B-5LE z2PbgL7cXytK%gcPeu(dNS6%mf3A@P;F5u)QZLTy*1j1}wFfg@+i}Yu?0JUFd4&dT6 zL+BM>i9i5-Zuw9CUm^mF_}lx&D+yKUfejAeqROW-fk5c_NccluNcyEJa-RJ#w#~tF zM&}Gl1p-V*OXHt}Wxf+hBp$J`on!TNCF`WUFOQswC;F*vefO*UaO@(#KD^}PTkAC* zgf8L1sPgWH@)Cr=K(tCsLH|hk4%!LAF$S=7h-1ex0Z`$I600rl@N9L-3VkJAUeYIc$ z0ljVGt{=;h(H;C)@eea`jDHxc)c4_!unXa2SXZ#jR4GMvmlmvglmG76S=kXcm zaIKKyfJZ?E0)aKluGq`}z2H_B6P77C%$CzXcZvq1(TqYS9wzA&=NE5{ona vu4>_ADiY+j&hDjn6$zd1X?(AM0tLPW_&!+Pm*oq*00000NkvXXu0mjfH;WKS literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxhdpi/location_pin.png b/src/main/res/drawable-xxhdpi/location_pin.png new file mode 100644 index 0000000000000000000000000000000000000000..b74b45856f9aea313cbe60c12ba407f0b9833645 GIT binary patch literal 3623 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 literal 0 HcmV?d00001 diff --git a/src/main/res/layout/request_permission.xml b/src/main/res/layout/request_permission.xml new file mode 100644 index 00000000..d11e5739 --- /dev/null +++ b/src/main/res/layout/request_permission.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + +