diff --git a/samples/TicTacToeLib/.classpath b/samples/TicTacToeLib/.classpath
new file mode 100755
index 000000000..6e9239ff0
--- /dev/null
+++ b/samples/TicTacToeLib/.classpath
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/samples/TicTacToeLib/.gitignore b/samples/TicTacToeLib/.gitignore
new file mode 100644
index 000000000..93624e73d
--- /dev/null
+++ b/samples/TicTacToeLib/.gitignore
@@ -0,0 +1,4 @@
+.svn
+bin
+gen
+
diff --git a/samples/TicTacToeLib/.project b/samples/TicTacToeLib/.project
new file mode 100755
index 000000000..c0589f6ea
--- /dev/null
+++ b/samples/TicTacToeLib/.project
@@ -0,0 +1,33 @@
+
+
+ TicTacToeLib
+
+
+
+
+
+ com.android.ide.eclipse.adt.ResourceManagerBuilder
+
+
+
+
+ com.android.ide.eclipse.adt.PreCompilerBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ com.android.ide.eclipse.adt.ApkBuilder
+
+
+
+
+
+ com.android.ide.eclipse.adt.AndroidNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/samples/TicTacToeLib/AndroidManifest.xml b/samples/TicTacToeLib/AndroidManifest.xml
new file mode 100755
index 000000000..cc667ee2e
--- /dev/null
+++ b/samples/TicTacToeLib/AndroidManifest.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/TicTacToeLib/default.properties b/samples/TicTacToeLib/default.properties
new file mode 100755
index 000000000..4ac577ca4
--- /dev/null
+++ b/samples/TicTacToeLib/default.properties
@@ -0,0 +1,28 @@
+#
+# Copyright (C) 2010 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.
+#
+
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system use,
+# "build.properties", and override values to adapt the script to your
+# project structure.
+
+android.library=true
+# Project target.
+target=android-7
diff --git a/samples/TicTacToeLib/res/drawable/lib_bg.9.png b/samples/TicTacToeLib/res/drawable/lib_bg.9.png
new file mode 100755
index 000000000..38c06c033
Binary files /dev/null and b/samples/TicTacToeLib/res/drawable/lib_bg.9.png differ
diff --git a/samples/TicTacToeLib/res/drawable/lib_circle.png b/samples/TicTacToeLib/res/drawable/lib_circle.png
new file mode 100755
index 000000000..55adffed1
Binary files /dev/null and b/samples/TicTacToeLib/res/drawable/lib_circle.png differ
diff --git a/samples/TicTacToeLib/res/drawable/lib_cross.png b/samples/TicTacToeLib/res/drawable/lib_cross.png
new file mode 100755
index 000000000..9189ebb6c
Binary files /dev/null and b/samples/TicTacToeLib/res/drawable/lib_cross.png differ
diff --git a/samples/TicTacToeLib/res/layout/lib_game.xml b/samples/TicTacToeLib/res/layout/lib_game.xml
new file mode 100755
index 000000000..c4e674de9
--- /dev/null
+++ b/samples/TicTacToeLib/res/layout/lib_game.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/TicTacToeLib/res/values/strings.xml b/samples/TicTacToeLib/res/values/strings.xml
new file mode 100755
index 000000000..5707400cb
--- /dev/null
+++ b/samples/TicTacToeLib/res/values/strings.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/samples/TicTacToeLib/src/com/example/tictactoe/library/GameActivity.java b/samples/TicTacToeLib/src/com/example/tictactoe/library/GameActivity.java
new file mode 100755
index 000000000..f75665e6c
--- /dev/null
+++ b/samples/TicTacToeLib/src/com/example/tictactoe/library/GameActivity.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package com.example.tictactoe.library;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class GameActivity extends Activity {
+
+ public final static String EXTRA_START_WITH_HUMAN =
+ "com.example.tictactoe.library.GameActivity.EXTRA_START_WITH_HUMAN";
+
+ private boolean mTurnIsHuman;
+
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle bundle) {
+ super.onCreate(bundle);
+
+ /*
+ * IMPORTANT TIP: all resource IDs from this library must be
+ * different from the projects that will include it. E.g.
+ * if my layout were named "main.xml", I would have to use the ID
+ * R.layout.main; however there is already a *different*
+ * ID with the same name in the main project and when the library
+ * gets merged in the project the wrong ID would end up being used.
+ *
+ * To avoid such potential conflicts, it's probably a good idea
+ * to add a prefix to the library resource names.
+ */
+ setContentView(R.layout.lib_game);
+
+ mTurnIsHuman = getIntent().getBooleanExtra(
+ EXTRA_START_WITH_HUMAN, true);
+
+
+ }
+
+}
diff --git a/samples/TicTacToeLib/src/com/example/tictactoe/library/GameView.java b/samples/TicTacToeLib/src/com/example/tictactoe/library/GameView.java
new file mode 100755
index 000000000..2c27b503e
--- /dev/null
+++ b/samples/TicTacToeLib/src/com/example/tictactoe/library/GameView.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package com.example.tictactoe.library;
+
+import java.lang.reflect.Field;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.BitmapFactory.Options;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Handler.Callback;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+
+//-----------------------------------------------
+
+public class GameView extends View {
+
+ private final static String TAG = "GameView";
+
+ private static final int MSG_FRAME = 1;
+
+ public static final long FPS_MS = 1000/2;
+
+ public static final int EMPTY = 0;
+ public static final int CROSS = 1;
+ public static final int CIRCLE = 2;
+
+
+ /** Contains one of {@link #EMPTY}, {@link #CROSS} or {@link #CIRCLE} */
+ private final int[] mData = new int[9];
+
+ private final Rect mBgRect = new Rect();
+ private final Rect mTempDst = new Rect();
+
+ private int mSxy;
+ private int mOffetX;
+ private int mOffetY;
+ private Paint mLinePaint;
+ private Drawable mDrawableBg;
+
+
+ public GameView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ requestFocus();
+
+ mDrawableBg = getResources().getDrawable(R.drawable.lib_bg);
+
+ mLinePaint = new Paint();
+ mLinePaint.setColor(0xFFFFFFFF);
+ mLinePaint.setStrokeWidth(5);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ int sxy = mSxy;
+ int s3 = sxy * 3;
+ int x7 = mOffetX;
+ int y7 = mOffetY;
+
+ mDrawableBg.draw(canvas);
+
+ for (int i = 0, k = sxy; i < 2; i++, k += sxy) {
+ canvas.drawLine(x7 , y7 + k, x7 + s3, y7 + k , mLinePaint);
+ canvas.drawLine(x7 + k, y7 , x7 + k , y7 + s3, mLinePaint);
+ }
+
+ for (int j = 0, k = 0, y = y7; j < 3; j++, y += sxy) {
+ for (int i = 0, x = x7; i < 3; i++, x += sxy) {
+
+ }
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ Log.d(TAG, String.format("onSizeChanged: %dx%d", w, h));
+
+ int sx = w / 3;
+ int sy = h / 3;
+
+ int size = sx < sy ? sx : sy;
+
+ mSxy = size;
+ mOffetX = (w - 3 * size) / 2;
+ mOffetY = (h - 3 * size) / 2;
+
+ mDrawableBg.setBounds(mOffetX, mOffetY,
+ mOffetX + 3 * size, mOffetY + 3 * size);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ int action = event.getAction();
+
+ if (action == MotionEvent.ACTION_DOWN) {
+ return true;
+
+ } else if (action == MotionEvent.ACTION_DOWN) {
+ float x = event.getX();
+ float y = event.getY();
+
+ // TODO
+ return true;
+ }
+
+ return false;
+ }
+
+ public Bitmap getResBitmap(int bmpResId) {
+ Options opts = new Options();
+ opts.inDither = false;
+
+ Resources res = getResources();
+ Bitmap bmp = BitmapFactory.decodeResource(res, bmpResId, opts);
+ return bmp;
+ }
+}
+
+
diff --git a/samples/TicTacToeMain/.classpath b/samples/TicTacToeMain/.classpath
new file mode 100755
index 000000000..2db729987
--- /dev/null
+++ b/samples/TicTacToeMain/.classpath
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/samples/TicTacToeMain/.gitignore b/samples/TicTacToeMain/.gitignore
new file mode 100644
index 000000000..93624e73d
--- /dev/null
+++ b/samples/TicTacToeMain/.gitignore
@@ -0,0 +1,4 @@
+.svn
+bin
+gen
+
diff --git a/samples/TicTacToeMain/.project b/samples/TicTacToeMain/.project
new file mode 100755
index 000000000..9d7485aa5
--- /dev/null
+++ b/samples/TicTacToeMain/.project
@@ -0,0 +1,40 @@
+
+
+ TicTacToeMain
+
+
+
+
+
+ com.android.ide.eclipse.adt.ResourceManagerBuilder
+
+
+
+
+ com.android.ide.eclipse.adt.PreCompilerBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ com.android.ide.eclipse.adt.ApkBuilder
+
+
+
+
+
+ com.android.ide.eclipse.adt.AndroidNature
+ org.eclipse.jdt.core.javanature
+
+
+
+ TicTacToeLib
+ 2
+ _android_TicTacToeLib/src
+
+
+
diff --git a/samples/TicTacToeMain/AndroidManifest.xml b/samples/TicTacToeMain/AndroidManifest.xml
new file mode 100755
index 000000000..4881b359b
--- /dev/null
+++ b/samples/TicTacToeMain/AndroidManifest.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/TicTacToeMain/default.properties b/samples/TicTacToeMain/default.properties
new file mode 100755
index 000000000..d2fdd807a
--- /dev/null
+++ b/samples/TicTacToeMain/default.properties
@@ -0,0 +1,28 @@
+#
+# Copyright (C) 2010 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.
+#
+
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system use,
+# "build.properties", and override values to adapt the script to your
+# project structure.
+
+android.library.reference.1=../TicTacToeLib/
+# Project target.
+target=android-Froyo
diff --git a/samples/TicTacToeMain/res/drawable/icon.png b/samples/TicTacToeMain/res/drawable/icon.png
new file mode 100755
index 000000000..b8665ff7b
Binary files /dev/null and b/samples/TicTacToeMain/res/drawable/icon.png differ
diff --git a/samples/TicTacToeMain/res/layout/main.xml b/samples/TicTacToeMain/res/layout/main.xml
new file mode 100755
index 000000000..1e75004b6
--- /dev/null
+++ b/samples/TicTacToeMain/res/layout/main.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/TicTacToeMain/res/values/strings.xml b/samples/TicTacToeMain/res/values/strings.xml
new file mode 100755
index 000000000..00522f703
--- /dev/null
+++ b/samples/TicTacToeMain/res/values/strings.xml
@@ -0,0 +1,26 @@
+
+
+
+
+ Start -- Computer goes first
+ Start -- Player goes first
+ Welcome to the Tic-Tac-Toe Sample!
+ This sample code demonstrates how to split an application in multiple projects by using the \'project library\' available in the Froyo SDK Tools.
+ This activity is defined in one project. The second activity, launched by one of the buttons below, is located in another project which is a \"library\" to the main one and merged in the same APK.
+ Hello World, MainActivity!
+ Tic-Tac-Toe Sample
+
diff --git a/samples/TicTacToeMain/src/com/example/tictactoe/MainActivity.java b/samples/TicTacToeMain/src/com/example/tictactoe/MainActivity.java
new file mode 100755
index 000000000..a66b54b53
--- /dev/null
+++ b/samples/TicTacToeMain/src/com/example/tictactoe/MainActivity.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+package com.example.tictactoe;
+
+import com.example.tictactoe.library.GameActivity;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+
+public class MainActivity extends Activity {
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ findViewById(R.id.start_player).setOnClickListener(
+ new OnClickListener() {
+ public void onClick(View v) {
+ startGame(true);
+ }
+ });
+
+ findViewById(R.id.start_comp).setOnClickListener(
+ new OnClickListener() {
+ public void onClick(View v) {
+ startGame(false);
+ }
+ });
+ }
+
+ private void startGame(boolean startWithHuman) {
+ Intent i = new Intent(this, GameActivity.class);
+ i.putExtra(GameActivity.EXTRA_START_WITH_HUMAN, startWithHuman);
+ startActivity(i);
+ }
+}
\ No newline at end of file