mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-01-15 15:41:24 +01:00
get phone numbers from contacts DB: factor some of BTInviteActivity
into superclass that NBSInviteActivity can share and use to make their UIs similar: fetch mobile numbers from DB one-at-a-time, keep a list there, and let you check then delete or return. Rough, and doesn't save state the way BT does, but works.
This commit is contained in:
parent
45715ae1e0
commit
84496b3012
10 changed files with 440 additions and 112 deletions
|
@ -35,6 +35,7 @@
|
||||||
<uses-permission android:name="android.permission.SEND_SMS" />
|
<uses-permission android:name="android.permission.SEND_SMS" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH" />
|
<uses-permission android:name="android.permission.BLUETOOTH" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
||||||
|
<uses-permission android:name="android.permission.READ_CONTACTS" />
|
||||||
|
|
||||||
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="8" />
|
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="8" />
|
||||||
|
|
||||||
|
|
|
@ -28,3 +28,4 @@ relay_game_config.xml
|
||||||
rename_game.xml
|
rename_game.xml
|
||||||
select_dialog_item.xml
|
select_dialog_item.xml
|
||||||
nbsinviter.xml
|
nbsinviter.xml
|
||||||
|
nbsinviter_item.xml
|
||||||
|
|
|
@ -53,3 +53,5 @@ GameNamer.java
|
||||||
LookupActivity.java
|
LookupActivity.java
|
||||||
NBSInviteActivity.java
|
NBSInviteActivity.java
|
||||||
NBSService.java
|
NBSService.java
|
||||||
|
InviteActivity.java
|
||||||
|
NBSListItem.java
|
||||||
|
|
|
@ -12,19 +12,58 @@
|
||||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<EditText android:id="@+id/phone_edit"
|
<ListView android:id="@id/android:list"
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
android:layout_marginLeft="20dip"
|
android:layout_height="fill_parent"
|
||||||
android:layout_marginRight="20dip"
|
android:drawSelectorOnTop="false"
|
||||||
android:scrollHorizontally="true"
|
android:layout_weight="1"
|
||||||
android:phoneNumber="true"
|
android:padding="8dp"
|
||||||
android:singleLine="true"
|
|
||||||
android:maxLength="15"
|
|
||||||
android:selectAllOnFocus="true"
|
|
||||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<!-- <LinearLayout android:orientation="horizontal" -->
|
||||||
|
<!-- android:layout_width="fill_parent" -->
|
||||||
|
<!-- android:layout_height="wrap_content" -->
|
||||||
|
<!-- > -->
|
||||||
|
<!-- <EditText android:id="@+id/phone_edit" -->
|
||||||
|
<!-- android:layout_height="wrap_content" -->
|
||||||
|
<!-- android:layout_width="fill_parent" -->
|
||||||
|
<!-- android:layout_marginLeft="20dip" -->
|
||||||
|
<!-- android:layout_marginRight="20dip" -->
|
||||||
|
<!-- android:scrollHorizontally="true" -->
|
||||||
|
<!-- android:phoneNumber="true" -->
|
||||||
|
<!-- android:singleLine="true" -->
|
||||||
|
<!-- android:maxLength="15" -->
|
||||||
|
<!-- android:selectAllOnFocus="true" -->
|
||||||
|
<!-- android:textAppearance="?android:attr/textAppearanceMedium" -->
|
||||||
|
<!-- android:layout_weight="1" -->
|
||||||
|
<!-- android:hint="new number" -->
|
||||||
|
<!-- /> -->
|
||||||
|
<!-- <Button android:id="@+id/button_insert" -->
|
||||||
|
<!-- android:text="Insert" -->
|
||||||
|
<!-- android:layout_width="fill_parent" -->
|
||||||
|
<!-- android:layout_height="wrap_content" -->
|
||||||
|
<!-- android:layout_weight="1" -->
|
||||||
|
<!-- /> -->
|
||||||
|
<!-- </LinearLayout> -->
|
||||||
|
|
||||||
|
<LinearLayout android:orientation="horizontal"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
>
|
||||||
|
<Button android:id="@+id/button_add"
|
||||||
|
android:text="@string/button_nbs_add"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
/>
|
||||||
|
<Button android:id="@+id/button_clear"
|
||||||
|
android:text="@string/bt_pick_clear_button"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<Button android:id="@+id/button_invite"
|
<Button android:id="@+id/button_invite"
|
||||||
android:text="@string/button_invite"
|
android:text="@string/button_invite"
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
|
|
28
xwords4/android/XWords4/res/layout/nbsinviter_item.xml
Normal file
28
xwords4/android/XWords4/res/layout/nbsinviter_item.xml
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<org.eehouse.android.xw4.NBSListItem
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:paddingLeft="8dp"
|
||||||
|
android:paddingRight="8dp"
|
||||||
|
>
|
||||||
|
|
||||||
|
<CheckBox android:id="@+id/checkbox"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<TextView android:id="@+id/name"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<TextView android:id="@+id/number"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
/>
|
||||||
|
|
||||||
|
</org.eehouse.android.xw4.NBSListItem>
|
|
@ -1860,7 +1860,7 @@
|
||||||
<string name="bt_devs_missing">Missing connections? Invite BT
|
<string name="bt_devs_missing">Missing connections? Invite BT
|
||||||
devs? (I won\'t ask again until you reopen this game.)</string>
|
devs? (I won\'t ask again until you reopen this game.)</string>
|
||||||
|
|
||||||
<string name="invite_descf">Please select the %d device[s] you
|
<string name="invite_bt_descf">Please select the %d device[s] you
|
||||||
want to include in this game. Use the Rescan button if you
|
want to include in this game. Use the Rescan button if you
|
||||||
don\'t see a device you expect.</string>
|
don\'t see a device you expect.</string>
|
||||||
|
|
||||||
|
@ -1887,6 +1887,12 @@
|
||||||
|
|
||||||
<string name="new_nbs_title">New game via SMS</string>
|
<string name="new_nbs_title">New game via SMS</string>
|
||||||
<string name="new_nbs_bodyf">Phone with number %s has invited you to
|
<string name="new_nbs_bodyf">Phone with number %s has invited you to
|
||||||
play</string>
|
play</string>
|
||||||
<string name="new_nbsmove_title">New move via SMS</string>
|
<string name="new_nbsmove_title">New move via SMS</string>
|
||||||
|
|
||||||
|
<string name="button_nbs_add">Add contact</string>
|
||||||
|
<string name="invite_nbs_descf">Please select the %d phone numbers you
|
||||||
|
want to include in this game. Use the Add contact button if you
|
||||||
|
don\'t see a number you expect.</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -39,82 +39,22 @@ import android.os.Handler;
|
||||||
|
|
||||||
import junit.framework.Assert;
|
import junit.framework.Assert;
|
||||||
|
|
||||||
public class BTInviteActivity extends XWListActivity
|
public class BTInviteActivity extends InviteActivity {
|
||||||
implements View.OnClickListener,
|
|
||||||
CompoundButton.OnCheckedChangeListener {
|
|
||||||
|
|
||||||
public static final String DEVS = "DEVS";
|
|
||||||
public static final String INTENT_KEY_NMISSING = "NMISSING";
|
|
||||||
|
|
||||||
private Button m_okButton;
|
|
||||||
private Button m_rescanButton;
|
|
||||||
private Button m_clearButton;
|
|
||||||
private int m_nMissing;
|
|
||||||
private int m_checkCount = 0;
|
|
||||||
private boolean m_firstScan;
|
private boolean m_firstScan;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate( Bundle savedInstanceState )
|
protected void onCreate( Bundle savedInstanceState )
|
||||||
{
|
{
|
||||||
super.onCreate( savedInstanceState );
|
super.onCreate( savedInstanceState, R.layout.btinviter,
|
||||||
|
R.id.button_invite, R.id.button_rescan,
|
||||||
Intent intent = getIntent();
|
R.id.button_clear, R.id.invite_desc,
|
||||||
m_nMissing = intent.getIntExtra( INTENT_KEY_NMISSING, -1 );
|
R.string.invite_bt_descf );
|
||||||
|
|
||||||
setContentView( R.layout.btinviter );
|
|
||||||
|
|
||||||
TextView desc = (TextView)findViewById( R.id.invite_desc );
|
|
||||||
desc.setText( Utils.format( this, R.string.invite_descf, m_nMissing ) );
|
|
||||||
|
|
||||||
m_okButton = (Button)findViewById( R.id.button_invite );
|
|
||||||
m_okButton.setOnClickListener( this );
|
|
||||||
m_rescanButton = (Button)findViewById( R.id.button_rescan );
|
|
||||||
m_rescanButton.setOnClickListener( this );
|
|
||||||
m_clearButton = (Button)findViewById( R.id.button_clear );
|
|
||||||
m_clearButton.setOnClickListener( this );
|
|
||||||
|
|
||||||
m_checkCount = 0;
|
|
||||||
tryEnable();
|
|
||||||
|
|
||||||
m_firstScan = true;
|
m_firstScan = true;
|
||||||
BTService.clearDevices( this, null ); // will return names
|
BTService.clearDevices( this, null ); // will return names
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onClick( View view )
|
|
||||||
{
|
|
||||||
if ( m_okButton == view ) {
|
|
||||||
Intent intent = new Intent();
|
|
||||||
String[] devs = listSelected();
|
|
||||||
intent.putExtra( DEVS, devs );
|
|
||||||
setResult( Activity.RESULT_OK, intent );
|
|
||||||
finish();
|
|
||||||
} else if ( m_rescanButton == view ) {
|
|
||||||
scan();
|
|
||||||
} else if ( m_clearButton == view ) {
|
|
||||||
BTService.clearDevices( this, listSelected() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// /* AdapterView.OnItemClickListener */
|
|
||||||
// public void onItemClick( AdapterView<?> parent, View view,
|
|
||||||
// int position, long id )
|
|
||||||
// {
|
|
||||||
// DbgUtils.logf( "BTInviteActivity.onItemClick(position=%d)", position );
|
|
||||||
// }
|
|
||||||
|
|
||||||
public void onCheckedChanged( CompoundButton buttonView,
|
|
||||||
boolean isChecked )
|
|
||||||
{
|
|
||||||
DbgUtils.logf( "BTInviteActivity.onCheckedChanged( isChecked=%b )",
|
|
||||||
isChecked );
|
|
||||||
if ( isChecked ) {
|
|
||||||
++m_checkCount;
|
|
||||||
} else {
|
|
||||||
--m_checkCount;
|
|
||||||
}
|
|
||||||
tryEnable();
|
|
||||||
}
|
|
||||||
|
|
||||||
// BTService.BTEventListener interface
|
// BTService.BTEventListener interface
|
||||||
@Override
|
@Override
|
||||||
public void eventOccurred( BTService.BTEvent event, final Object ... args )
|
public void eventOccurred( BTService.BTEvent event, final Object ... args )
|
||||||
|
@ -151,13 +91,18 @@ public class BTInviteActivity extends XWListActivity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void scan()
|
protected void scan()
|
||||||
{
|
{
|
||||||
startProgress( R.string.scan_progress );
|
startProgress( R.string.scan_progress );
|
||||||
BTService.scan( this );
|
BTService.scan( this );
|
||||||
}
|
}
|
||||||
|
|
||||||
private String[] listSelected()
|
protected void clearSelected()
|
||||||
|
{
|
||||||
|
BTService.clearDevices( this, listSelected() );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String[] listSelected()
|
||||||
{
|
{
|
||||||
ListView list = (ListView)findViewById( android.R.id.list );
|
ListView list = (ListView)findViewById( android.R.id.list );
|
||||||
String[] result = new String[m_checkCount];
|
String[] result = new String[m_checkCount];
|
||||||
|
@ -172,12 +117,6 @@ public class BTInviteActivity extends XWListActivity
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void tryEnable()
|
|
||||||
{
|
|
||||||
m_okButton.setEnabled( m_checkCount == m_nMissing );
|
|
||||||
m_clearButton.setEnabled( 0 < m_checkCount );
|
|
||||||
}
|
|
||||||
|
|
||||||
private class BTDevsAdapter extends XWListAdapter {
|
private class BTDevsAdapter extends XWListAdapter {
|
||||||
private String[] m_devs;
|
private String[] m_devs;
|
||||||
public BTDevsAdapter( String[] devs )
|
public BTDevsAdapter( String[] devs )
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
/* -*- compile-command: "cd ../../../../../; ant debug install"; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2009-2011 by Eric House (xwords@eehouse.org). All
|
||||||
|
* rights reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.eehouse.android.xw4;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.CompoundButton;
|
||||||
|
import android.widget.ListView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.os.Handler;
|
||||||
|
|
||||||
|
import junit.framework.Assert;
|
||||||
|
|
||||||
|
abstract class InviteActivity extends XWListActivity
|
||||||
|
implements View.OnClickListener,
|
||||||
|
CompoundButton.OnCheckedChangeListener {
|
||||||
|
|
||||||
|
public static final String DEVS = "DEVS";
|
||||||
|
public static final String INTENT_KEY_NMISSING = "NMISSING";
|
||||||
|
|
||||||
|
protected int m_nMissing;
|
||||||
|
protected Button m_okButton;
|
||||||
|
protected Button m_rescanButton;
|
||||||
|
protected Button m_clearButton;
|
||||||
|
protected int m_checkCount = 0;
|
||||||
|
|
||||||
|
protected void onCreate( Bundle savedInstanceState, int view_id,
|
||||||
|
int button_invite, int button_rescan,
|
||||||
|
int button_clear, int desc_id, int desc_strf )
|
||||||
|
{
|
||||||
|
super.onCreate( savedInstanceState );
|
||||||
|
setContentView( view_id );
|
||||||
|
|
||||||
|
Intent intent = getIntent();
|
||||||
|
m_nMissing = intent.getIntExtra( INTENT_KEY_NMISSING, -1 );
|
||||||
|
|
||||||
|
m_okButton = (Button)findViewById( button_invite );
|
||||||
|
m_okButton.setOnClickListener( this );
|
||||||
|
m_rescanButton = (Button)findViewById( button_rescan );
|
||||||
|
m_rescanButton.setOnClickListener( this );
|
||||||
|
m_clearButton = (Button)findViewById( button_clear );
|
||||||
|
m_clearButton.setOnClickListener( this );
|
||||||
|
|
||||||
|
TextView desc = (TextView)findViewById( desc_id );
|
||||||
|
desc.setText( Utils.format( this, desc_strf, m_nMissing ) );
|
||||||
|
|
||||||
|
m_checkCount = 0;
|
||||||
|
tryEnable();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onClick( View view )
|
||||||
|
{
|
||||||
|
if ( m_okButton == view ) {
|
||||||
|
Intent intent = new Intent();
|
||||||
|
String[] devs = listSelected();
|
||||||
|
intent.putExtra( DEVS, devs );
|
||||||
|
setResult( Activity.RESULT_OK, intent );
|
||||||
|
finish();
|
||||||
|
} else if ( m_rescanButton == view ) {
|
||||||
|
scan();
|
||||||
|
} else if ( m_clearButton == view ) {
|
||||||
|
clearSelected();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onCheckedChanged( CompoundButton buttonView,
|
||||||
|
boolean isChecked )
|
||||||
|
{
|
||||||
|
DbgUtils.logf( "InviteActivity.onCheckedChanged( isChecked=%b )",
|
||||||
|
isChecked );
|
||||||
|
if ( isChecked ) {
|
||||||
|
++m_checkCount;
|
||||||
|
} else {
|
||||||
|
--m_checkCount;
|
||||||
|
}
|
||||||
|
tryEnable();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void tryEnable()
|
||||||
|
{
|
||||||
|
m_okButton.setEnabled( m_checkCount == m_nMissing );
|
||||||
|
m_clearButton.setEnabled( 0 < m_checkCount );
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract String[] listSelected();
|
||||||
|
abstract void scan();
|
||||||
|
abstract void clearSelected();
|
||||||
|
}
|
|
@ -21,52 +21,182 @@
|
||||||
package org.eehouse.android.xw4;
|
package org.eehouse.android.xw4;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.content.ContentResolver;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.database.Cursor;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.provider.ContactsContract.CommonDataKinds;
|
||||||
|
import android.provider.ContactsContract.CommonDataKinds.Phone;
|
||||||
|
import android.provider.ContactsContract;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
|
import android.widget.ListView;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import junit.framework.Assert;
|
import junit.framework.Assert;
|
||||||
|
|
||||||
public class NBSInviteActivity extends XWActivity
|
public class NBSInviteActivity extends InviteActivity
|
||||||
implements View.OnClickListener {
|
implements View.OnClickListener {
|
||||||
public static final String DEVS = "DEVS";
|
public static final String DEVS = "DEVS";
|
||||||
public static final String INTENT_KEY_NMISSING = "NMISSING";
|
public static final String INTENT_KEY_NMISSING = "NMISSING";
|
||||||
|
|
||||||
private Button m_okButton;
|
private static final int GET_CONTACT = 1;
|
||||||
private EditText m_edit;
|
|
||||||
private int m_nMissing;
|
private ArrayList<String> m_names;
|
||||||
|
private ArrayList<String> m_phones;
|
||||||
|
private NBSPhonesAdapter m_adapter;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate( Bundle savedInstanceState )
|
protected void onCreate( Bundle savedInstanceState )
|
||||||
{
|
{
|
||||||
super.onCreate( savedInstanceState );
|
super.onCreate( savedInstanceState, R.layout.nbsinviter,
|
||||||
|
R.id.button_invite, R.id.button_add,
|
||||||
|
R.id.button_clear, R.id.invite_desc,
|
||||||
|
R.string.invite_nbs_descf );
|
||||||
|
|
||||||
Intent intent = getIntent();
|
m_names = new ArrayList<String>();
|
||||||
m_nMissing = intent.getIntExtra( INTENT_KEY_NMISSING, -1 );
|
m_phones = new ArrayList<String>();
|
||||||
Assert.assertTrue( 1 == m_nMissing );
|
|
||||||
|
|
||||||
setContentView( R.layout.nbsinviter );
|
|
||||||
|
|
||||||
m_okButton = (Button)findViewById( R.id.button_invite );
|
|
||||||
m_okButton.setOnClickListener( this );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onClick( View view )
|
@Override
|
||||||
|
protected void onActivityResult( int requestCode, int resultCode,
|
||||||
|
Intent data )
|
||||||
{
|
{
|
||||||
if ( m_okButton == view ) {
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
EditText edit = (EditText)findViewById( R.id.phone_edit );
|
if ( Activity.RESULT_CANCELED != resultCode && data != null ) {
|
||||||
String phone = edit.getText().toString();
|
switch (requestCode) {
|
||||||
if ( null != phone && 0 < phone.length() ) {
|
case GET_CONTACT:
|
||||||
Intent intent = new Intent();
|
addPhoneNumbers( data );
|
||||||
String[] devs = { phone };
|
break;
|
||||||
intent.putExtra( DEVS, devs );
|
|
||||||
setResult( Activity.RESULT_OK, intent );
|
|
||||||
finish();
|
|
||||||
} else {
|
|
||||||
showOKOnlyDialog( R.string.err_no_phone );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void scan() {
|
||||||
|
Intent intent = new Intent( Intent.ACTION_PICK,
|
||||||
|
ContactsContract.Contacts.CONTENT_URI );
|
||||||
|
startActivityForResult( intent, GET_CONTACT );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void clearSelected()
|
||||||
|
{
|
||||||
|
DbgUtils.logf( "NBSInviteActivity.clearSelected()" );
|
||||||
|
ListView list = (ListView)findViewById( android.R.id.list );
|
||||||
|
int count = list.getChildCount();
|
||||||
|
for ( int ii = count - 1; ii >= 0; --ii ) {
|
||||||
|
NBSListItem item = (NBSListItem)list.getChildAt( ii );
|
||||||
|
if ( item.isChecked() ) {
|
||||||
|
m_phones.remove( ii );
|
||||||
|
m_names.remove( ii );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rebuildList();
|
||||||
|
// int index = m_phones.size();
|
||||||
|
// while ( index-- > 0 ) {
|
||||||
|
// if ( m_adapter.isChecked( index ) ) {
|
||||||
|
// m_phones.remove( index );
|
||||||
|
// m_names.remove( index );
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String[] listSelected() {
|
||||||
|
DbgUtils.logf( "NBSInviteActivity.listSelected()" );
|
||||||
|
ListView list = (ListView)findViewById( android.R.id.list );
|
||||||
|
String[] result = new String[m_checkCount];
|
||||||
|
int count = list.getChildCount();
|
||||||
|
int index = 0;
|
||||||
|
for ( int ii = 0; ii < count; ++ii ) {
|
||||||
|
NBSListItem item = (NBSListItem)list.getChildAt( ii );
|
||||||
|
if ( item.isChecked() ) {
|
||||||
|
result[index++] = item.getNumber();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addPhoneNumbers( Intent intent )
|
||||||
|
{
|
||||||
|
Uri data = intent.getData();
|
||||||
|
Cursor cursor = managedQuery( data, null, null, null, null );
|
||||||
|
if ( cursor.moveToFirst() ) {
|
||||||
|
int len_before = m_phones.size();
|
||||||
|
int index = cursor.getColumnIndex(ContactsContract.Contacts._ID );
|
||||||
|
if ( 0 <= index ) {
|
||||||
|
String id = cursor.getString( index );
|
||||||
|
ContentResolver resolver = getContentResolver();
|
||||||
|
Cursor pc =
|
||||||
|
resolver.query( CommonDataKinds.Phone.CONTENT_URI,
|
||||||
|
null,
|
||||||
|
CommonDataKinds.Phone.CONTACT_ID + " = ?",
|
||||||
|
new String[] { id }, null );
|
||||||
|
|
||||||
|
while ( pc.moveToNext() ) {
|
||||||
|
String name =
|
||||||
|
pc.getString( pc.getColumnIndex( CommonDataKinds.
|
||||||
|
Phone.DISPLAY_NAME));
|
||||||
|
String number =
|
||||||
|
pc.getString( pc.getColumnIndex( CommonDataKinds.
|
||||||
|
Phone.NUMBER ) );
|
||||||
|
int type =
|
||||||
|
pc.getInt( pc.getColumnIndex( CommonDataKinds.
|
||||||
|
Phone.TYPE ) );
|
||||||
|
|
||||||
|
if ( Phone.TYPE_MOBILE == type && 0 < number.length() ) {
|
||||||
|
m_names.add( name );
|
||||||
|
m_phones.add( number );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( len_before != m_phones.size() ) {
|
||||||
|
rebuildList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void rebuildList()
|
||||||
|
{
|
||||||
|
m_adapter = new NBSPhonesAdapter();
|
||||||
|
setListAdapter( m_adapter );
|
||||||
|
m_checkCount = 0;
|
||||||
|
tryEnable();
|
||||||
|
}
|
||||||
|
|
||||||
|
private class NBSPhonesAdapter extends XWListAdapter {
|
||||||
|
private NBSListItem[] m_items;
|
||||||
|
|
||||||
|
public NBSPhonesAdapter()
|
||||||
|
{
|
||||||
|
super( m_phones.size() );
|
||||||
|
m_items = new NBSListItem[m_phones.size()];
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getItem( int position )
|
||||||
|
{
|
||||||
|
DbgUtils.logf( "getItem called (phone %s)", m_phones.get(position) );
|
||||||
|
NBSListItem item =
|
||||||
|
(NBSListItem)Utils.inflate( NBSInviteActivity.this,
|
||||||
|
R.layout.nbsinviter_item );
|
||||||
|
item.setOnCheckedChangeListener( NBSInviteActivity.this );
|
||||||
|
item.setContents( m_names.get(position), m_phones.get(position) );
|
||||||
|
m_items[position] = item;
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public View getView( final int position, View convertView,
|
||||||
|
ViewGroup parent ) {
|
||||||
|
return (View)getItem( position );
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isChecked( int index )
|
||||||
|
{
|
||||||
|
boolean checked = m_items[index].isChecked();
|
||||||
|
DbgUtils.logf( "item %d (for %s) checked: %b",
|
||||||
|
index, m_items[index].getNumber(), checked );
|
||||||
|
return checked;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
/* -*- compile-command: "cd ../../../../../; ant debug install"; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2012 by Eric House (xwords@eehouse.org). All rights
|
||||||
|
* reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.eehouse.android.xw4;
|
||||||
|
|
||||||
|
import android.widget.CheckBox;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.widget.CompoundButton.OnCheckedChangeListener;
|
||||||
|
|
||||||
|
public class NBSListItem extends LinearLayout {
|
||||||
|
private Context m_context;
|
||||||
|
|
||||||
|
public NBSListItem( Context cx, AttributeSet as )
|
||||||
|
{
|
||||||
|
super( cx, as );
|
||||||
|
m_context = cx;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContents( String name, String number )
|
||||||
|
{
|
||||||
|
TextView tv = (TextView)findViewById( R.id.name );
|
||||||
|
tv.setText( name );
|
||||||
|
tv = (TextView)findViewById( R.id.number );
|
||||||
|
tv.setText( number );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnCheckedChangeListener( OnCheckedChangeListener lstnr )
|
||||||
|
{
|
||||||
|
CheckBox cb = (CheckBox)findViewById( R.id.checkbox );
|
||||||
|
cb.setOnCheckedChangeListener( lstnr );
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNumber()
|
||||||
|
{
|
||||||
|
TextView tv = (TextView)findViewById( R.id.number );
|
||||||
|
return tv.getText().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isChecked()
|
||||||
|
{
|
||||||
|
CheckBox cb = (CheckBox)findViewById( R.id.checkbox );
|
||||||
|
boolean isChecked = cb.isChecked();
|
||||||
|
DbgUtils.logf( "isChecked(%s)=>%b", getNumber(), isChecked );
|
||||||
|
return isChecked;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue