get RECEIVE_SMS permission with SEND_SMS

Apparently one of the newer Android SDK levels adds the requirement to
have RECEIVE_SMS permission in order for a broadcast receiver to get
called. Meaning receipt didn't work even if SEND_SMS had been
granted. Since they're both in the same group (for now) the OS will
grant the second silently if the first has been granted, but it still
has to be requested. So request both at the same time. This still leaves
the problem that a user who's never tried to create an SMS game won't
have been asked for either permission and so won't receive SMS
invitations, but fixing that is for a later release.
This commit is contained in:
Eric House 2018-12-07 11:12:49 -08:00
parent 3c861166de
commit 9c501b19a8
2 changed files with 18 additions and 8 deletions

View file

@ -1218,6 +1218,8 @@ public class BoardDelegate extends DelegateBase
case SMS: case SMS:
Perms23.tryGetPerms( this, Perm.SEND_SMS, R.string.sms_invite_rationale, Perms23.tryGetPerms( this, Perm.SEND_SMS, R.string.sms_invite_rationale,
Action.INVITE_SMS, m_mySIS.nMissing, info ); Action.INVITE_SMS, m_mySIS.nMissing, info );
Perms23.tryGetPerms( this, Perm.RECEIVE_SMS, R.string.sms_invite_rationale,
Action.INVITE_SMS, m_mySIS.nMissing, info );
break; break;
case RELAY: case RELAY:
RelayInviteDelegate.launchForResult( m_activity, m_mySIS.nMissing, RelayInviteDelegate.launchForResult( m_activity, m_mySIS.nMissing,

View file

@ -19,6 +19,7 @@
package org.eehouse.android.xw4; package org.eehouse.android.xw4;
import android.Manifest;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.Context; import android.content.Context;
@ -43,14 +44,15 @@ public class Perms23 {
private static final String TAG = Perms23.class.getSimpleName(); private static final String TAG = Perms23.class.getSimpleName();
public static enum Perm { public static enum Perm {
READ_PHONE_STATE("android.permission.READ_PHONE_STATE"), READ_PHONE_STATE(Manifest.permission.READ_PHONE_STATE),
STORAGE("android.permission.WRITE_EXTERNAL_STORAGE"), STORAGE(Manifest.permission.WRITE_EXTERNAL_STORAGE),
SEND_SMS("android.permission.SEND_SMS"), SEND_SMS(Manifest.permission.SEND_SMS),
READ_CONTACTS("android.permission.READ_CONTACTS") RECEIVE_SMS(Manifest.permission.RECEIVE_SMS),
; READ_CONTACTS(Manifest.permission.READ_CONTACTS);
private String m_str; private String m_str;
private Perm(String str) { m_str = str; } private Perm(String str) { m_str = str; }
public String getString() { return m_str; } public String getString() { return m_str; }
public static Perm getFor( String str ) { public static Perm getFor( String str ) {
Perm result = null; Perm result = null;
@ -261,6 +263,7 @@ public class Perms23 {
{ {
// Log.d( TAG, "gotPermissionResult(%s)", perms.toString() ); // Log.d( TAG, "gotPermissionResult(%s)", perms.toString() );
Map<Perm, Boolean> result = new HashMap<Perm, Boolean>(); Map<Perm, Boolean> result = new HashMap<Perm, Boolean>();
boolean shouldResend = false;
for ( int ii = 0; ii < perms.length; ++ii ) { for ( int ii = 0; ii < perms.length; ++ii ) {
Perm perm = Perm.getFor( perms[ii] ); Perm perm = Perm.getFor( perms[ii] );
boolean granted = PackageManager.PERMISSION_GRANTED == granteds[ii]; boolean granted = PackageManager.PERMISSION_GRANTED == granteds[ii];
@ -269,9 +272,8 @@ public class Perms23 {
// Hack. If SMS has been granted, resend all moves. This should be // Hack. If SMS has been granted, resend all moves. This should be
// replaced with an api allowing listeners to register // replaced with an api allowing listeners to register
// Perm-by-Perm, but I'm in a hurry. // Perm-by-Perm, but I'm in a hurry.
if ( granted && perm == Perm.SEND_SMS ) { if ( granted && (perm == Perm.SEND_SMS || perm == Perm.RECEIVE_SMS) ) {
GameUtils.resendAllIf( context, CommsConnType.COMMS_CONN_SMS, shouldResend = true;
true, true );
} }
// Log.d( TAG, "calling %s.onPermissionResult(%s, %b)", // Log.d( TAG, "calling %s.onPermissionResult(%s, %b)",
@ -279,6 +281,11 @@ public class Perms23 {
// granted ); // granted );
} }
if ( shouldResend ) {
GameUtils.resendAllIf( context, CommsConnType.COMMS_CONN_SMS,
true, true );
}
PermCbck cbck = s_map.remove( code ); PermCbck cbck = s_map.remove( code );
if ( null != cbck ) { if ( null != cbck ) {
cbck.onPermissionResult( result ); cbck.onPermissionResult( result );
@ -290,6 +297,7 @@ public class Perms23 {
String permString = perm.getString(); String permString = perm.getString();
boolean result = PackageManager.PERMISSION_GRANTED boolean result = PackageManager.PERMISSION_GRANTED
== ContextCompat.checkSelfPermission( XWApp.getContext(), permString ); == ContextCompat.checkSelfPermission( XWApp.getContext(), permString );
// Log.d( TAG, "havePermission(%s) => %b", permString, result );
return result; return result;
} }