From c5efeb283a74c1f69b81fc51a2a3b561525e7180 Mon Sep 17 00:00:00 2001 From: Eric House Date: Thu, 4 Apr 2019 21:26:24 -0700 Subject: [PATCH] fix invite dialogs for landscape layout Scrolling's needed in some cases, and you can't easily put a ListView inside a ScrollView. So replace the ListView with a LinearLayout whose contents I manage manually, and wrap the whole layout in a ScrollView. --- .../eehouse/android/xw4/BTInviteDelegate.java | 6 +- .../eehouse/android/xw4/InviteDelegate.java | 177 ++++++++---------- .../android/xw4/RelayInviteDelegate.java | 2 +- .../android/xw4/SMSInviteDelegate.java | 2 +- .../android/xw4/WiDirInviteDelegate.java | 2 +- .../eehouse/android/xw4/XWListAdapter.java | 1 + .../app/src/main/res/layout/inviter.xml | 123 ++++++------ 7 files changed, 144 insertions(+), 169 deletions(-) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BTInviteDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BTInviteDelegate.java index 27f54c1fb..e4277550b 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BTInviteDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BTInviteDelegate.java @@ -148,7 +148,7 @@ public class BTInviteDelegate extends InviteDelegate { if ( sPersisted.empty() ) { scan(); } else { - updateListAdapter( sPersisted.pairs ); + updateList( sPersisted.pairs ); } } @@ -258,7 +258,7 @@ public class BTInviteDelegate extends InviteDelegate { sPersisted.add( dev.getAddress(), dev.getName() ); store( m_activity ); - updateListAdapter( sPersisted.pairs ); + updateList( sPersisted.pairs ); tryEnable(); } @@ -335,7 +335,7 @@ public class BTInviteDelegate extends InviteDelegate { store( m_activity ); clearChecked(); - updateListAdapter( sPersisted.pairs ); + updateList( sPersisted.pairs ); tryEnable(); break; default: diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/InviteDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/InviteDelegate.java index ef320f391..aa8f31ded 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/InviteDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/InviteDelegate.java @@ -31,6 +31,7 @@ import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.LinearLayout; import android.widget.FrameLayout; import android.widget.ListView; @@ -49,7 +50,7 @@ import java.util.Set; import org.eehouse.android.xw4.DBUtils.SentInvitesInfo; -abstract class InviteDelegate extends ListDelegateBase +abstract class InviteDelegate extends DelegateBase implements View.OnClickListener, ViewGroup.OnHierarchyChangeListener { private static final String TAG = InviteDelegate.class.getSimpleName(); @@ -93,9 +94,8 @@ abstract class InviteDelegate extends ListDelegateBase protected String m_lastDev; protected Button m_inviteButton; private Activity m_activity; - private ListView m_lv; + private LinearLayout m_lv; private TextView m_ev; - private InviteItemsAdapter m_adapter; protected Map m_counts; protected Set m_checked; private boolean m_setChecked; @@ -145,8 +145,8 @@ abstract class InviteDelegate extends ListDelegateBase extraView.setVisibility( View.VISIBLE ); } - m_lv = (ListView)findViewById( android.R.id.list ); - m_ev = (TextView)findViewById( android.R.id.empty ); + m_lv = (LinearLayout)findViewById( R.id.invitees ); + m_ev = (TextView)findViewById( R.id.empty ); if ( null != m_lv && null != m_ev && 0 != emptyMsgId ) { m_ev.setText( getString( emptyMsgId ) ); m_lv.setOnHierarchyChangeListener( this ); @@ -183,17 +183,19 @@ abstract class InviteDelegate extends ListDelegateBase tryEnable(); } - protected void updateListAdapter( List items ) + protected void updateList( List items ) { - updateListAdapter( R.layout.two_strs_item, items ); + updateList( R.layout.two_strs_item, items ); } - protected void updateListAdapter( int itemId, - List items ) + protected void updateList( int itemId, List items ) { updateChecked( items ); - m_adapter = new InviteItemsAdapter( itemId, items ); - setListAdapter( m_adapter ); + + m_lv.removeAllViews(); + for ( InviterItem item : items ) { + m_lv.addView( makeViewFor( itemId, item ) ); + } } protected void listSelected( InviterItem[] selected, String[] devs ) @@ -244,10 +246,13 @@ abstract class InviteDelegate extends ListDelegateBase //////////////////////////////////////// // ViewGroup.OnHierarchyChangeListener //////////////////////////////////////// + @Override public void onChildViewAdded( View parent, View child ) { showEmptyIfEmpty(); } + + @Override public void onChildViewRemoved( View parent, View child ) { showEmptyIfEmpty(); @@ -255,8 +260,8 @@ abstract class InviteDelegate extends ListDelegateBase private void showEmptyIfEmpty() { - m_ev.setVisibility( 0 == m_lv.getChildCount() - ? View.VISIBLE : View.GONE ); + int count = m_lv.getChildCount(); + m_ev.setVisibility( 0 == count ? View.VISIBLE : View.GONE ); } protected void tryEnable() @@ -297,105 +302,69 @@ abstract class InviteDelegate extends ListDelegateBase } } - private InviteItemsAdapter getAdapter() + private View makeViewFor( int itemID, final InviterItem item ) { - return m_adapter; - } + final LinearLayout layout = (LinearLayout) + inflate( R.layout.inviter_item_frame ); + CheckBox box = (CheckBox)layout.findViewById( R.id.inviter_check ); - private class InviteItemsAdapter extends XWListAdapter { - private InviterItem[] m_items; - private int m_itemId; + // Give subclass a chance to install and populate its view + FrameLayout frame = (FrameLayout)layout.findViewById( R.id.frame ); + View child = inflate( itemID ); + frame.addView( child ); + onChildAdded( child, item ); - public InviteItemsAdapter( int itemID, List items ) - { - super( null == items? 0 : items.size() ); - m_itemId = itemID; - if ( null != items ) { - m_items = items.toArray( new InviterItem[items.size()] ); + m_counts.put( item, 1 ); + if ( XWPrefs.getCanInviteMulti( m_activity ) && 1 < m_nMissing ) { + Spinner spinner = (Spinner) + layout.findViewById(R.id.nperdev_spinner); + ArrayAdapter adapter = + new ArrayAdapter( m_activity, android.R.layout + .simple_spinner_item ); + for ( int ii = 1; ii <= m_nMissing; ++ii ) { + String str = getQuantityString( R.plurals.nplayers_fmt, ii, ii ); + adapter.add( str ); } - // m_items = new LinearLayout[getCount()]; - } - - public InviterItem[] getItems() { return m_items; } - - // public String[] getAddrs() { return m_devAddrs; } - - @Override - public Object getItem( int position ) { return m_items[position]; } - - @Override - public View getView( final int position, View convertView, - ViewGroup parent ) - { - final InviterItem item = m_items[position]; - final LinearLayout layout = (LinearLayout) - inflate( R.layout.inviter_item_frame ); - CheckBox box = (CheckBox)layout.findViewById( R.id.inviter_check ); - - // Give subclass a chance to install and populate its view - FrameLayout frame = (FrameLayout)layout.findViewById( R.id.frame ); - View child = inflate( m_itemId ); - frame.addView( child ); - onChildAdded( child, m_items[position] ); - - m_counts.put( item, 1 ); - if ( XWPrefs.getCanInviteMulti( m_activity ) && 1 < m_nMissing ) { - Spinner spinner = (Spinner) - layout.findViewById(R.id.nperdev_spinner); - ArrayAdapter adapter = - new ArrayAdapter( m_activity, android.R.layout - .simple_spinner_item ); - for ( int ii = 1; ii <= m_nMissing; ++ii ) { - String str = getQuantityString( R.plurals.nplayers_fmt, ii, ii ); - adapter.add( str ); - } - spinner.setAdapter( adapter ); - spinner.setVisibility( View.VISIBLE ); - spinner.setOnItemSelectedListener( new OnItemSelectedListener() { - public void onItemSelected( AdapterView parent, - View view, int pos, - long id ) - { - m_counts.put( item, 1 + pos ); - tryEnable(); - } - - public void onNothingSelected( AdapterView parent ) {} - } ); - } - - CompoundButton.OnCheckedChangeListener listener = - new CompoundButton.OnCheckedChangeListener() { - public void onCheckedChanged( CompoundButton buttonView, - boolean isChecked ) { - if ( !isChecked ) { - m_setChecked = false; - } - if ( isChecked ) { - m_checked.add( item ); - } else { - m_checked.remove( item ); - // // User's now making changes; don't check new views - // m_setChecked = false; - } - onItemChecked( item, isChecked ); - + spinner.setAdapter( adapter ); + spinner.setVisibility( View.VISIBLE ); + spinner.setOnItemSelectedListener( new OnItemSelectedListener() { + public void onItemSelected( AdapterView parent, + View view, int pos, + long id ) + { + m_counts.put( item, 1 + pos ); tryEnable(); } - }; - box.setOnCheckedChangeListener( listener ); - if ( m_setChecked || m_checked.contains( item ) ) { - box.setChecked( true ); - } else if ( null != m_lastDev && m_lastDev.equals(item.getDev()) ) { - m_lastDev = null; - box.setChecked( true ); - } - return layout; + public void onNothingSelected( AdapterView parent ) {} + } ); } - public String getAddr( CheckBox box ) { return (String)box.getTag(); } - public String getName( CheckBox box ) { return box.getText().toString(); } - } + box.setOnCheckedChangeListener( new OnCheckedChangeListener() { + @Override + public void onCheckedChanged( CompoundButton buttonView, + boolean isChecked ) { + if ( !isChecked ) { + m_setChecked = false; + } + if ( isChecked ) { + m_checked.add( item ); + } else { + m_checked.remove( item ); + } + onItemChecked( item, isChecked ); + tryEnable(); + } + } ); + + if ( m_setChecked || m_checked.contains( item ) ) { + box.setChecked( true ); + } else if ( null != m_lastDev && m_lastDev.equals(item.getDev()) ) { + m_lastDev = null; + box.setChecked( true ); + } + + return layout; + } } diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/RelayInviteDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/RelayInviteDelegate.java index 85b164024..93c4971ac 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/RelayInviteDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/RelayInviteDelegate.java @@ -463,7 +463,7 @@ public class RelayInviteDelegate extends InviteDelegate { }); addSelf(); - updateListAdapter( m_devIDRecs ); + updateList( m_devIDRecs ); tryEnable(); } diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/SMSInviteDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/SMSInviteDelegate.java index beaa10b59..726581012 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/SMSInviteDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/SMSInviteDelegate.java @@ -302,7 +302,7 @@ public class SMSInviteDelegate extends InviteDelegate { } }); - updateListAdapter( m_phoneRecs ); + updateList( m_phoneRecs ); tryEnable(); } diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/WiDirInviteDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/WiDirInviteDelegate.java index ea366e3ae..97e6dd1a5 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/WiDirInviteDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/WiDirInviteDelegate.java @@ -129,6 +129,6 @@ public class WiDirInviteDelegate extends InviteDelegate // names[ii] = m_macsToName.get(mac); } - updateListAdapter( pairs ); + updateList( pairs ); } } diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWListAdapter.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWListAdapter.java index 6c68f9b7b..1ed5eea8f 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWListAdapter.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/XWListAdapter.java @@ -28,6 +28,7 @@ import android.widget.ListAdapter; */ public abstract class XWListAdapter extends BaseAdapter implements ListAdapter { + private static final String TAG = XWListAdapter.class.getSimpleName(); private int m_count; public XWListAdapter() { diff --git a/xwords4/android/app/src/main/res/layout/inviter.xml b/xwords4/android/app/src/main/res/layout/inviter.xml index 089b8921e..29adbec37 100644 --- a/xwords4/android/app/src/main/res/layout/inviter.xml +++ b/xwords4/android/app/src/main/res/layout/inviter.xml @@ -1,72 +1,77 @@ - - - - - - - + android:orientation="vertical" + > + - + + + + + + + + + + + + + +