add new activity for starting a new game. Has four buttons and

(eventually) explanatory text.  Currently more-or-less works,
including sending an email with a link that when clicked launches
Crosswords.  (Still need to respond to that link on receipt, but I'm
at least pulling out the necessary fields.)
This commit is contained in:
Andy2 2011-05-06 06:52:10 -07:00
parent 77bf5e2d36
commit 249402758a
7 changed files with 258 additions and 40 deletions

View file

@ -69,6 +69,10 @@
android:label="@string/title_dicts_list"
/>
<activity android:name="NewGameActivity"
android:label="@string/title_newgame"
/>
<activity android:name="GameConfig"
android:screenOrientation="sensor"
android:configChanges="keyboardHidden|orientation"

View file

@ -42,11 +42,11 @@
android:text="@string/button_new_game"
/>
<Button android:id="@+id/new_game_net"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="@string/button_new_game_net"
/>
<!-- <Button android:id="@+id/new_game_net" -->
<!-- android:layout_width="fill_parent" -->
<!-- android:layout_height="wrap_content" -->
<!-- android:layout_gravity="right" -->
<!-- android:text="@string/button_new_game_net" -->
<!-- /> -->
</LinearLayout>

View file

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2007 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:text="explanatory text"
style="@style/relay_explain"
/>
<Button android:id="@+id/new_game_local"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/new_game_local"
/>
<TextView android:text="explanatory text"
style="@style/relay_explain"
/>
<Button android:id="@+id/new_game_local_config"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/new_game_local_config"
/>
<TextView android:text="explanatory text"
style="@style/relay_explain"
/>
<Button android:id="@+id/new_game_invite"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/new_game_invite"
/>
<TextView android:text="explanatory text"
style="@style/relay_explain"
/>
<Button android:id="@+id/new_game_net_config"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/new_game_net_config"
/>
</LinearLayout>

View file

@ -4,6 +4,9 @@
<!-- <item android:id="@+id/gamel_menu_view_hidden" -->
<!-- android:title="@string/gamel_menu_view_hidden" -->
<!-- /> -->
<item android:id="@+id/gamel_menu_newgame"
android:title="@string/button_new_game"
/>
<item android:id="@+id/gamel_menu_prefs"
android:title="@string/menu_prefs"
android:icon="@android:drawable/ic_menu_preferences"

View file

@ -16,8 +16,8 @@
<resources>
<string name="menu_delete">Delete</string>
<string name="button_new_game">Add single-device game</string>
<string name="button_new_game_net">Add multi-device game</string>
<string name="button_new_game">Add game</string>
<!-- <string name="button_new_game_net">Add multi-device game</string> -->
<string name="list_item_play">Play game</string>
<string name="list_item_config">Game settings...</string>
@ -41,6 +41,7 @@
<string name="title_edit">Edit game</string>
<string name="title_games_list">Crosswords</string>
<string name="title_dicts_list">Dictionaries (wordcount)</string>
<string name="title_newgame">New game</string>
<string name="title_langs_list">Languages (based on installed
dictionaries)</string>
<string name="lang_label">Game language</string>
@ -50,6 +51,11 @@
<string name="title_prefs">Crosswords settings</string>
<string name="app_name">Crosswords</string>
<string name="new_game_local">Play new local game</string>
<string name="new_game_local_config">Configure new local game</string>
<string name="new_game_invite">Invite to new networked game</string>
<string name="new_game_net_config">Configure new networked game</string>
<string name="button_ok">OK</string>
<string name="button_cancel">Cancel</string>

View file

@ -186,27 +186,31 @@ public class GamesList extends XWListActivity
newGameB.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick( View v ) {
addGame( false );
showNotAgainDlg( R.string.not_again_newgame,
R.string.key_notagain_newgame );
}
});
newGameB = (Button)findViewById(R.id.new_game_net);
newGameB.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick( View v ) {
String path = addGame( true );
GameUtils.doConfig( GamesList.this, path,
RelayGameActivity.class );
// addGame( false );
startActivity( new Intent( GamesList.this,
NewGameActivity.class ) );
// showNotAgainDlg( R.string.not_again_newgame,
// R.string.key_notagain_newgame );
}
});
// newGameB = (Button)findViewById(R.id.new_game_net);
// newGameB.setOnClickListener( new View.OnClickListener() {
// @Override
// public void onClick( View v ) {
// String path = addGame( true );
// GameUtils.doConfig( GamesList.this, path,
// RelayGameActivity.class );
// }
// });
m_adapter = new GameListAdapter( this, this );
setListAdapter( m_adapter );
NetUtils.informOfDeaths( this );
startFirstHasDict( getIntent() );
Intent intent = getIntent();
startFirstHasDict( intent );
startNewGameIf( intent );
DBUtils.setDBChangeListener( this );
} // onCreate
@ -494,25 +498,6 @@ public class GamesList extends XWListActivity
return hasDicts;
}
private String saveNew( CurGameInfo gi )
{
String path = null;
byte[] bytes = XwJNI.gi_to_stream( gi );
if ( null != bytes ) {
GameUtils.GameLock lock = GameUtils.saveGame( this, bytes );
path = lock.getPath();
lock.unlock();
}
return path;
}
private String addGame( boolean networked )
{
String path = saveNew( new CurGameInfo( this, networked ) );
GameUtils.resetGame( this, path );
return path;
}
private void invalRelayIDs( String[] relayIDs )
{
if ( null == relayIDs ) {
@ -550,4 +535,17 @@ public class GamesList extends XWListActivity
startFirstHasDict( relayIDs );
}
}
private void startNewGameIf( Intent intent )
{
if ( null != intent ) {
Uri data = intent.getData();
if ( null != data ) {
String room = data.getQueryParameter( "room" );
String langStr = data.getQueryParameter( "lang" );
int lang = Integer.decode( langStr );
Utils.logf( "got data: lang: %d; room: %s", lang, room );
}
}
}
}

View file

@ -0,0 +1,147 @@
/* -*- compile-command: "cd ../../../../../; ant install"; -*- */
/*
* Copyright 2009-2010 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.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.util.Random;
// import junit.framework.Assert;
import org.eehouse.android.xw4.jni.CurGameInfo;
import org.eehouse.android.xw4.jni.CommonPrefs;
import org.eehouse.android.xw4.jni.CommsAddrRec;
import org.eehouse.android.xw4.jni.XwJNI;
public class NewGameActivity extends XWActivity {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate( savedInstanceState );
setContentView( R.layout.new_game );
Button button = (Button)findViewById( R.id.new_game_local );
button.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick( View v ) {
newAndLaunch();
}
} );
button = (Button)findViewById( R.id.new_game_local_config );
button.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick( View v ) {
newAndConfigure( false );
}
} );
button = (Button)findViewById( R.id.new_game_invite );
button.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick( View v ) {
newNetworkedAndLaunch();
}
} );
button = (Button)findViewById( R.id.new_game_net_config );
button.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick( View v ) {
newAndConfigure( true );
}
} );
}
private String saveNew( CurGameInfo gi )
{
String path = null;
byte[] bytes = XwJNI.gi_to_stream( gi );
if ( null != bytes ) {
GameUtils.GameLock lock = GameUtils.saveGame( this, bytes );
path = lock.getPath();
lock.unlock();
}
return path;
}
private void newAndLaunch()
{
String path = saveNew( new CurGameInfo( this ) );
GameUtils.launchGame( this, path );
finish();
}
// So: Query the user for the desired room name and player name,
// providing defaults.
private void newNetworkedAndLaunch()
{
CommsAddrRec addr = new CommsAddrRec( this );
Random random = new Random();
addr.ip_relay_invite = String.format( "%X", random.nextInt() );
Utils.logf( "room: %s", addr.ip_relay_invite );
CurGameInfo gi = new CurGameInfo( this, true );
String path = saveNew( gi );
GameUtils.GameLock lock =
new GameUtils.GameLock( path, true ).lock();
GameUtils.applyChanges( this, gi, addr, lock, false );
lock.unlock();
Intent intent = new Intent( Intent.ACTION_SEND );
intent.setType( "plain/text" );
intent.putExtra( Intent.EXTRA_SUBJECT, "Let's play Crosswords" );
intent.putExtra( Intent.EXTRA_TEXT,
mkMsgWithLink( addr.ip_relay_invite, gi.dictLang ) );
GameUtils.launchGame( this, path );
startActivity( Intent.createChooser( intent,
"Send your invitation via" ) );
finish();
}
private String mkMsgWithLink( String room, int lang )
{
String host = CommonPrefs.getDefaultRelayHost( this );
String format = "Click on this link to start a game: " +
"http://%s/redir.php?room=%s&lang=%d";
return String.format( format, host, room, lang );
}
private void newAndConfigure( boolean networked )
{
String path = saveNew( new CurGameInfo( this, networked ) );
GameUtils.doConfig( this, path, GameConfig.class );
finish();
}
}