diff options
author | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2009-05-26 22:50:31 +0000 |
---|---|---|
committer | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2009-05-26 22:50:31 +0000 |
commit | 090512087de4e4a2bbc346a9bd0ada61a6f337bf (patch) | |
tree | b1621b1b3ceaeb61ba2593926d01726f0503a91c /branches | |
parent | d8688ef4eb4ef025403952e37194c896a3337aab (diff) |
TUSCANY-3060 - Applying SANNI Lookman patch with updates to Android Store UI
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@778916 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
12 files changed, 692 insertions, 189 deletions
diff --git a/branches/sca-java-1.x/samples/store-android/res/drawable/addc.png b/branches/sca-java-1.x/samples/store-android/res/drawable/addc.png Binary files differnew file mode 100644 index 0000000000..17259450d8 --- /dev/null +++ b/branches/sca-java-1.x/samples/store-android/res/drawable/addc.png diff --git a/branches/sca-java-1.x/samples/store-android/res/drawable/rems.png b/branches/sca-java-1.x/samples/store-android/res/drawable/rems.png Binary files differnew file mode 100644 index 0000000000..378690fad4 --- /dev/null +++ b/branches/sca-java-1.x/samples/store-android/res/drawable/rems.png diff --git a/branches/sca-java-1.x/samples/store-android/res/layout/cat_row.xml b/branches/sca-java-1.x/samples/store-android/res/layout/cat_row.xml new file mode 100644 index 0000000000..e7f71cb0b6 --- /dev/null +++ b/branches/sca-java-1.x/samples/store-android/res/layout/cat_row.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> + <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="fill_parent" + android:padding="10px" + android:layout_height="50px"> + <TextView + android:id="@+id/txtItemC" + android:layout_width="250px" + android:layout_height="30px" + android:textSize="20px" + + /> + + <ImageView android:src="@drawable/addc" + android:layout_width="30px" + android:layout_height="30px" + /> +</LinearLayout>
\ No newline at end of file diff --git a/branches/sca-java-1.x/samples/store-android/res/layout/main.xml b/branches/sca-java-1.x/samples/store-android/res/layout/main.xml index f7494f5a3a..7f296e9ac0 100644 --- a/branches/sca-java-1.x/samples/store-android/res/layout/main.xml +++ b/branches/sca-java-1.x/samples/store-android/res/layout/main.xml @@ -17,27 +17,49 @@ android:layout_height="fill_parent"> - <ListView android:id="@+id/ListView01" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - /> + <ListView android:id="@+id/ListView01" + android:layout_width="fill_parent" + android:layout_height="wrap_content" /> - <LinearLayout - android:id="@+id/tab02" - android:orientation="vertical" - android:layout_width="fill_parent" - android:layout_height="fill_parent"> + <LinearLayout + android:id="@+id/tab02" + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="fill_parent"> - <ListView android:id="@+id/ListView02" + <TextView + android:id="@+id/txtThx" + android:layout_width="fill_parent" + android:layout_height="30px" + android:text="@string/title_thx" + /> + <TextView + android:id="@+id/txtEmpty" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + /> + <LinearLayout + android:orientation="horizontal" + android:layout_width="fill_parent" + android:layout_height="41px"> + + <TextView + android:id="@+id/txtTotal" + android:layout_width="200px" + android:layout_height="30px" + android:text="@string/title_order" + /> + + <Button android:id="@+id/btnClean" + android:layout_width="100px" + android:layout_height="40px" + /> + </LinearLayout> + + <ListView android:id="@+id/ListView02" android:layout_width="fill_parent" android:layout_height="wrap_content" /> - - <TextView - android:id="@+id/txtTotal" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - /> </LinearLayout> </FrameLayout> diff --git a/branches/sca-java-1.x/samples/store-android/res/layout/shop_row.xml b/branches/sca-java-1.x/samples/store-android/res/layout/shop_row.xml new file mode 100644 index 0000000000..a2ffeea56f --- /dev/null +++ b/branches/sca-java-1.x/samples/store-android/res/layout/shop_row.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> + <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="fill_parent" + android:layout_height="50px" + android:padding="10px"> + <TextView + android:id="@+id/txtItemS" + android:layout_width="250px" + android:layout_height="30px" + android:textSize="20px" + + /> + + <ImageView android:src="@drawable/rems" + android:layout_width="30px" + android:layout_height="30px" + + /> +</LinearLayout>
\ No newline at end of file diff --git a/branches/sca-java-1.x/samples/store-android/res/values/strings.xml b/branches/sca-java-1.x/samples/store-android/res/values/strings.xml index 2cf7940514..33f936b510 100644 --- a/branches/sca-java-1.x/samples/store-android/res/values/strings.xml +++ b/branches/sca-java-1.x/samples/store-android/res/values/strings.xml @@ -3,4 +3,26 @@ <string name="hello">Hello World, catalog</string> <string name="app_name">store</string> <string name="app_tag">Tuscany</string> + <string name="btn_clean">Erase cart</string> + <string name="btn_add_del1">Delete</string> + <string name="btn_add_del2">Add</string> + <string name="txt_empty">Nothing to display. The cart is currently empty</string> + <string name="tab_catalog">catalog_tab</string> + <string name="tab_shop">shopping_cart_tab</string> + <string name="title_catalog">Catalog Items</string> + <string name="title_shop">Shopping Cart</string> + <string name="get_tag">Catalog GET!!</string> + <string name="start_tag">Activity started</string> + <string name="txt_total">Total: </string> + <string name="add_entry_ok">Entry added: </string> + <string name="add_entry_ko">Unable to add entry: </string> + <string name="del_entry_ok">Entry removed: </string> + <string name="del_entry_ko">Unable to delete item: </string> + <string name="alert_yes">Yes</string> + <string name="alert_cancel">Cancel</string> + <string name="del_all_ok">All entries have been removed</string> + <string name="title_thx">Thanks for Shopping With Us!</string> + <string name="title_order">Your order</string> + <string name="howto_del">Click on an item below to remove it</string> + </resources> diff --git a/branches/sca-java-1.x/samples/store-android/src/services/Commons.java b/branches/sca-java-1.x/samples/store-android/src/services/Commons.java new file mode 100644 index 0000000000..df51c38b5e --- /dev/null +++ b/branches/sca-java-1.x/samples/store-android/src/services/Commons.java @@ -0,0 +1,17 @@ +/** + * + */ +package services; + +/** + * @author Lookouster + * + */ +public class Commons { + + public static final String TAG="Tuscany"; + public static final String DEL="HTTP DELETE "; + public static final String PST="HTTP POST "; + + +} diff --git a/branches/sca-java-1.x/samples/store-android/src/services/Item.java b/branches/sca-java-1.x/samples/store-android/src/services/Item.java index 2b3e4a10c8..1881dd4d11 100644 --- a/branches/sca-java-1.x/samples/store-android/src/services/Item.java +++ b/branches/sca-java-1.x/samples/store-android/src/services/Item.java @@ -23,12 +23,42 @@ package services; public class Item { private String name; private String price; + private String key; - public Item() { + /** + * @return the key + */ + public String getKey() { + return key; + } + + /** + * @param key the key to set + */ + public void setKey(String key) { + this.key = key; + } + + + + + + + + + + public Item() { } - /** + + + + + + + + /** * Parses a string entry to an Item object * @param s * @return Item @@ -55,7 +85,14 @@ public class Item { this.name = name; } - public String getPrice() { + public Item(String name, String price, String key) { + super(); + this.name = name; + this.price = price; + this.key = key; + } + + public String getPrice() { return price; } diff --git a/branches/sca-java-1.x/samples/store-android/src/services/ShoppingCartProxy.java b/branches/sca-java-1.x/samples/store-android/src/services/ShoppingCartProxy.java index 7e36c19c80..acc9b2759e 100644 --- a/branches/sca-java-1.x/samples/store-android/src/services/ShoppingCartProxy.java +++ b/branches/sca-java-1.x/samples/store-android/src/services/ShoppingCartProxy.java @@ -19,6 +19,9 @@ package services; +import java.util.HashMap; +import java.util.Map; + import org.json.JSONException; import org.json.JSONObject; @@ -28,21 +31,41 @@ import services.atom.xml.AtomXML; import services.json.rpc.JSONRpc; public class ShoppingCartProxy { - // see http://developer.android.com/guide/developing/tools/emulator.html - private static final String jsonRPCTotalServiceURI = "http://10.0.2.2:8080/ShoppingCart/Total"; + private static final String jsonRPCTotalServiceURI = "http://10.0.2.2:8080/ShoppingCart/Total"; private static final String jsonRPCTotalRequest = "{\"id\": 4, \"method\": \"Service.getTotal\", \"params\": []}"; private static final String atomXMLCartServiceURI="http://10.0.2.2:8080/ShoppingCart/Cart"; + public Item[] getItems() { - return null; + return AtomXML.getItems(atomXMLCartServiceURI); } public boolean addItem(Item item) { - return AtomXML.postItem(atomXMLCartServiceURI, item); + String content="<entry xmlns=\"http://www.w3.org/2005/Atom\">" + + "<title>item</title>" + + "<content type=\"text/xml\">" + + "<Item xmlns=\"http://services/\">" + + "<name xmlns=\"\">" + item.getName()+ "</name>" + + "<price xmlns=\"\">" +item.getPrice()+"</price>" + + "</Item></content></entry>"; + String key =AtomXML.postItem(atomXMLCartServiceURI, content); + if(key==null) + return false; + item.setKey(key); + Log.i("TUSCANY shopping cart proxy", key); + return true; } - public void removeItem(Item item) { + public boolean removeItem(Item item) { + Log.e("Sent key",item.getKey()); + String uri=atomXMLCartServiceURI+"/"+item.getKey(); + return AtomXML.performdelete(uri); + } + + public boolean clearCartContent() + { + return AtomXML.performdelete(atomXMLCartServiceURI); } public void checkOut() { diff --git a/branches/sca-java-1.x/samples/store-android/src/services/atom/xml/AtomXML.java b/branches/sca-java-1.x/samples/store-android/src/services/atom/xml/AtomXML.java index d5bb7f151e..69f4409ed9 100644 --- a/branches/sca-java-1.x/samples/store-android/src/services/atom/xml/AtomXML.java +++ b/branches/sca-java-1.x/samples/store-android/src/services/atom/xml/AtomXML.java @@ -18,19 +18,30 @@ */ package services.atom.xml; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + import org.apache.http.Header; import org.apache.http.HeaderElement; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.ParseException; import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import services.Commons; import services.Item; import android.util.Log; @@ -38,111 +49,209 @@ import android.util.Log; * */ public class AtomXML { - - public static boolean postItem(String ServiceURI, final Item item) - { - DefaultHttpClient client=new DefaultHttpClient(); - HttpPost httpost = new HttpPost(ServiceURI); - - httpost.setEntity(new HttpEntity(){ - - String entry="<entry xmlns=\"http://www.w3.org/2005/Atom\">" + - "<title>item</title>" + - "<content type=\"text/xml\">" + - "<Item xmlns=\"http://services/\">" + - "<name xmlns=\"\">" + item.getName()+ "</name>" + - "<price xmlns=\"\">" +item.getPrice()+"</price>" + - "</Item></content></entry>"; - - class mHeader implements Header - { - public HeaderElement[] getElements() throws ParseException { - // TODO Auto-generated method stub - return null; - } - - public String getName() { - // TODO Auto-generated method stub - return "Content-type"; - } - - public String getValue() { - // TODO Auto-generated method stub - return "application/atom+xml;type=entry"; - } - } - - public void consumeContent() throws IOException { - // TODO Auto-generated method stub - - } - - public InputStream getContent() throws IOException, - IllegalStateException { - // TODO Auto-generated method stub - return new InputStream(){ - - public int read() throws IOException { - // TODO Auto-generated method stub - return this.available(); - } - - }; - } - - public Header getContentEncoding() { - // TODO Auto-generated method stub - return new mHeader(); - } - - public long getContentLength() { - // TODO Auto-generated method stub - return entry.length(); - } - - public Header getContentType() { - // TODO Auto-generated method stub - return new mHeader(); - } - - public boolean isChunked() { - // TODO Auto-generated method stub - return false; - } - - public boolean isRepeatable() { - // TODO Auto-generated method stub - return true; - } - - public boolean isStreaming() { - // TODO Auto-generated method stub - return false; - } - - public void writeTo(OutputStream arg0) throws IOException { - // TODO Auto-generated method stub - - arg0.write(entry.getBytes()); - arg0.flush(); - Log.i("Tuscany", "Entry: "+item+" posted via atom/xml"); - } - - }); - - try { - HttpResponse response = client.execute(httpost); - Log.i("Tuscany", "Atom entry post status: "+response.getStatusLine().toString()); - return true; - } catch (ClientProtocolException e) { - // TODO Auto-generated catch block - Log.e("Tuscany",e.getMessage()); - } catch (IOException e) { - // TODO Auto-generated catch block - Log.e("Tuscany",e.getMessage()); - } - - return false; - } + + public static String postItem(String ServiceURI, final String content) + { + DefaultHttpClient client=new DefaultHttpClient(); + HttpPost httpost = new HttpPost(ServiceURI); + + httpost.setEntity(new HttpEntity(){ + + String entry=content; + + class mHeader implements Header + { + public HeaderElement[] getElements() throws ParseException { + // TODO Auto-generated method stub + return null; + } + + public String getName() { + // TODO Auto-generated method stub + return "Content-type"; + } + + public String getValue() { + // TODO Auto-generated method stub + return "application/atom+xml;type=entry"; + } + } + + public void consumeContent() throws IOException { + // TODO Auto-generated method stub + + } + + public InputStream getContent() throws IOException, + IllegalStateException { + // TODO Auto-generated method stub + return new InputStream(){ + + public int read() throws IOException { + // TODO Auto-generated method stub + return this.available(); + } + + }; + } + + public Header getContentEncoding() { + // TODO Auto-generated method stub + return new mHeader(); + } + + public long getContentLength() { + // TODO Auto-generated method stub + return entry.length(); + } + + public Header getContentType() { + // TODO Auto-generated method stub + return new mHeader(); + } + + public boolean isChunked() { + // TODO Auto-generated method stub + return false; + } + + public boolean isRepeatable() { + // TODO Auto-generated method stub + return true; + } + + public boolean isStreaming() { + // TODO Auto-generated method stub + return false; + } + + public void writeTo(OutputStream arg0) throws IOException { + // TODO Auto-generated method stub + + arg0.write(entry.getBytes()); + arg0.flush(); + //Log.i("Tuscany", "Entry posted via atom/xml"); + } + + }); + + try { + HttpResponse response = client.execute(httpost); + InputStream is =response.getEntity().getContent(); + + //Human readable atom response from servlet + int read; + StringBuffer sb=new StringBuffer(); + while((read=is.read())>0) + { + sb.append((char)read); + } + Log.i("Tuscany", "Atom entry post status: "+response.getStatusLine().toString()); + //Log.i("Tuscany", "Response: "+sb.toString()); + //Try now to parse the consumed data + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + SAXParser sp; + sp = spf.newSAXParser(); + XMLReader xr = sp.getXMLReader(); + CartItemHandler cih=new CartItemHandler(); + xr.setContentHandler(cih); + + xr.parse(new InputSource(new ByteArrayInputStream(sb.toString().getBytes()))); + is.close(); + + return cih.getCurrentKey(); + + } catch (ParserConfigurationException e) { + // TODO Auto-generated catch block + Log.e(Commons.TAG,e.getMessage()); + } catch (SAXException e) { + // TODO Auto-generated catch block + Log.e(Commons.TAG,e.getLocalizedMessage()); + } + + } catch (ClientProtocolException e) { + // TODO Auto-generated catch block + Log.e(Commons.TAG,e.getMessage()); + } catch (IOException e) { + // TODO Auto-generated catch block + Log.e(Commons.TAG,e.getMessage()); + } + + return null; + } + + public static boolean performdelete(String uri) + { + DefaultHttpClient client=new DefaultHttpClient(); + Log.i(Commons.TAG,Commons.DEL+uri); + HttpDelete del=new HttpDelete(uri); + + try { + client.execute(del); + return true; + } catch (ClientProtocolException e) { + // TODO Auto-generated catch block + Log.e(Commons.TAG,e.getMessage()); + } catch (IOException e) { + // TODO Auto-generated catch block + Log.e(Commons.TAG,e.getMessage()); + } + + return false; + + + } + + public static Item[] getItems(String uri) + { + DefaultHttpClient client=new DefaultHttpClient(); + HttpGet hg=new HttpGet(uri); + HttpResponse hr; + HttpEntity he; + try { + hr=client.execute(hg); + InputStream is =hr.getEntity().getContent(); + + //Human readable atom response from servlet + int read; + StringBuffer sb=new StringBuffer(); + while((read=is.read())>0) + { + sb.append((char)read); + } + Log.i("Tuscany", "Atom get content: "+sb.toString()); + + SAXParserFactory spf = SAXParserFactory.newInstance(); + SAXParser sp; + sp = spf.newSAXParser(); + XMLReader xr = sp.getXMLReader(); + CartItemHandler cih=new CartItemHandler(); + xr.setContentHandler(cih); + + xr.parse(new InputSource(new ByteArrayInputStream(sb.toString().getBytes()))); + is.close(); + Log.e(Commons.TAG,String.valueOf(cih.getItemsCollection().length)); + return cih.getItemsCollection(); + + + } catch (ClientProtocolException e) { + // TODO Auto-generated catch block + Log.e(Commons.TAG,e.getMessage()); + } catch (IOException e) { + // TODO Auto-generated catch block + Log.e(Commons.TAG,e.getMessage()); + } catch (ParserConfigurationException e) { + // TODO Auto-generated catch block + Log.e(Commons.TAG,e.getMessage()); + } catch (SAXException e) { + // TODO Auto-generated catch block + Log.e(Commons.TAG,e.getMessage()); + } + return null; + } + + + } diff --git a/branches/sca-java-1.x/samples/store-android/src/services/atom/xml/CartItemHandler.java b/branches/sca-java-1.x/samples/store-android/src/services/atom/xml/CartItemHandler.java new file mode 100644 index 0000000000..58ba872f87 --- /dev/null +++ b/branches/sca-java-1.x/samples/store-android/src/services/atom/xml/CartItemHandler.java @@ -0,0 +1,138 @@ +/** + * + */ +package services.atom.xml; + +import java.util.ArrayList; +import java.util.List; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import android.util.Log; + +import services.Item; + + +/** + * @author Lookouster + * + */ +public class CartItemHandler extends DefaultHandler { + + + + private boolean in_entry = false; + private boolean in_id = false; + private boolean in_title = false; + private boolean in_content=false; + private boolean in_item=false; + private boolean in_link=false; + private boolean in_name=false; + private boolean in_price=false; + private String currentKey,currentName,currentPrice; + private List<Item> items=new ArrayList<Item>(); + + + + + /** + * @return the currentName + */ + public String getCurrentName() { + return currentName; + } + + + /** + * @return the currentPrice + */ + public String getCurrentPrice() { + return currentPrice; + } + + + public void startElement(String namespaceURI, String localName, + String qName, Attributes atts) throws SAXException { + if (localName.equalsIgnoreCase("entry")) { + this.in_entry = true; + }else if (localName.equalsIgnoreCase("id")) { + this.in_id = true; + }else if (localName.equalsIgnoreCase("title")) { + this.in_title = true; + }else if (localName.equalsIgnoreCase("content")) { + this.in_content = true; + }else if (localName.equalsIgnoreCase("item")) { + this.in_item = true; + }else if (localName.equals("link")) { + this.in_link=true; + } + else if (localName.equalsIgnoreCase("name")) { + this.in_name=true; + } + else if (localName.equalsIgnoreCase("price")) { + this.in_price=true; + } + } + + + public void endElement(String namespaceURI, String localName, String qName) + throws SAXException { + if (localName.equalsIgnoreCase("id")) + this.in_id = false; + if (localName.equalsIgnoreCase("entry")) { + this.in_entry = false; + }else if (localName.equalsIgnoreCase("id")) { + this.in_id = false; + }else if (localName.equalsIgnoreCase("title")) { + this.in_title = false; + }else if (localName.equalsIgnoreCase("content")) { + this.in_content = false; + }else if (localName.equalsIgnoreCase("item")) { + this.in_item = false; + items.add(new Item(currentName, currentPrice, currentKey)); + }else if (localName.equalsIgnoreCase("link")) { + this.in_link=false; + } + else if (localName.equalsIgnoreCase("name")) { + this.in_name=false; + } + else if (localName.equalsIgnoreCase("price")) { + this.in_price=false; + } + } + + + public void characters(char ch[], int start, int length) { + + if(this.in_id){ + if(this.in_entry) + { + currentKey=new String(ch,start, length); + Log.e("kjhkh", currentKey); + } + + } + if(this.in_name) + currentName=new String(ch,start, length); + if(this.in_price) + currentPrice=new String(ch,start, length); + + } + + /** + * @return the key + */ + public String getCurrentKey() { + return currentKey; + } + + public Item[] getItemsCollection() + { + return items.toArray(new Item[items.size()]); + } + + + +} diff --git a/branches/sca-java-1.x/samples/store-android/src/store/android/catalog.java b/branches/sca-java-1.x/samples/store-android/src/store/android/catalog.java index 68e03abbe5..1b7bd3008c 100644 --- a/branches/sca-java-1.x/samples/store-android/src/store/android/catalog.java +++ b/branches/sca-java-1.x/samples/store-android/src/store/android/catalog.java @@ -28,83 +28,112 @@ import services.Catalog; import services.CatalogProxy; import services.Item; import services.ShoppingCartProxy; +import android.app.AlertDialog; import android.app.TabActivity; +import android.content.Context; +import android.content.DialogInterface; import android.graphics.Typeface; import android.os.Bundle; import android.util.Log; import android.view.View; +import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.ArrayAdapter; +import android.widget.Button; import android.widget.ListView; import android.widget.TabHost; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; import android.widget.TabHost.OnTabChangeListener; import android.widget.TabHost.TabSpec; +import android.view.LayoutInflater; + + public class catalog extends TabActivity { private Catalog catalogProxy = new CatalogProxy(); private ShoppingCartProxy shoppingCartProxy = new ShoppingCartProxy(); TabHost mTabHost; ListView itemsList, cartList; - TextView txtTotal; + TextView txtTotal,txtEmpty; TabSpec catalogTab, cartTab; - String[] items; - Set<String> cartItems=new HashSet<String>(); + Button btnClean; + Item[] items; + List<Item> cartItems=new ArrayList<Item>(); - private String[] getCatalogItems() { - List<String> catalog = new ArrayList<String>(); - - for(Item item : catalogProxy.get()) { - catalog.add(item.toString()); - } - - String[] catalogArray = new String[catalog.size()]; - catalog.toArray(catalogArray); - Log.e("Tuscany", "Catalog GET!!"); - - return catalogArray; + private void getCatalogItems() { + items=catalogProxy.get(); + } + + private void getCartItems() + { + Item[] i=shoppingCartProxy.getItems(); + if(i!=null) + { + for(Item item:i) + { + cartItems.add(item); + + } + } + Log.e(getString(R.string.app_tag), String.valueOf(cartItems.size())+" cart items retrieved"); } /** Called when the activity is first created. */ - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Log.e("Tuscany", "Started"); + Log.e(getString(R.string.app_tag), getString(R.string.start_tag)); //Load UI from layout file setContentView(R.layout.main); + + findViews(); //Get data to be loaded to UI - items=getCatalogItems(); + getCatalogItems(); + getCartItems(); + //Load UI with data - itemsList.setAdapter(new ArrayAdapter<String>(this, - android.R.layout.simple_list_item_multiple_choice,items)); - itemsList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); + itemsList.setAdapter(new ArrayAdapter<Item>(this, + R.layout.cat_row,R.id.txtItemC,items)); + itemsList.setChoiceMode(ListView.CHOICE_MODE_SINGLE); + itemsList.setClickable(true); + reloadShoppingCart(); + //Set Listeners listen(); + + + } + + /** * Retrieve UI Content */ public void findViews() { mTabHost = getTabHost(); - mTabHost.addTab(mTabHost.newTabSpec("catalog_tab").setIndicator("Catalog Items").setContent(R.id.ListView01)); - mTabHost.addTab(mTabHost.newTabSpec("shopping_cart_tab").setIndicator("Shopping Cart").setContent(R.id.tab02)); + mTabHost.addTab(mTabHost.newTabSpec(getString(R.string.tab_catalog)).setIndicator(getString(R.string.title_catalog)).setContent(R.id.ListView01)); + mTabHost.addTab(mTabHost.newTabSpec(getString(R.string.tab_shop)).setIndicator(getString(R.string.title_shop)).setContent(R.id.tab02)); mTabHost.setCurrentTab(0); itemsList=(ListView)findViewById(R.id.ListView01); cartList=(ListView)findViewById(R.id.ListView02); + btnClean=(Button)findViewById(R.id.btnClean); + btnClean.setText(R.string.btn_clean); txtTotal=(TextView)findViewById(R.id.txtTotal); - txtTotal.setTextSize((float) 25.0); + txtTotal.setTextSize((float) 15.0); txtTotal.setTypeface(Typeface.DEFAULT_BOLD); + txtEmpty=(TextView)findViewById(R.id.txtEmpty); + txtEmpty.setTypeface(null, Typeface.ITALIC); + } /** @@ -116,49 +145,99 @@ public class catalog extends TabActivity { mTabHost.setOnTabChangedListener(new OnTabChangeListener(){ public void onTabChanged(String tabId) { - if(tabId.compareTo("shopping_cart_tab")==0) - { - if(!cartList.getAdapter().isEmpty()) - { - txtTotal.setVisibility(TextView.VISIBLE); - } - else - txtTotal.setVisibility(TextView.INVISIBLE); - txtTotal.setText("Total: "+shoppingCartProxy.getTotal()); + // TODO Auto-generated method stub + if(tabId.compareTo("shopping_cart_tab")==0) + reloadShoppingCart(); - } } }); - //CatalogList Listener + + + + btnClean.setOnClickListener(new OnClickListener(){ + public void onClick(View arg0) { + // TODO Auto-generated method stub + new AlertDialog.Builder(catalog.this) + .setTitle("Tuscany Android Store") + .setMessage("You're about to erase all items. Proceed ?") + .setIcon(R.drawable.icon) + .setPositiveButton(R.string.alert_yes, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + if(shoppingCartProxy.clearCartContent()) + { + cartItems.clear(); + Log.i(getString(R.string.app_tag), getString(R.string.del_all_ok)); + reloadShoppingCart(); + } + }}) + .setNegativeButton(R.string.alert_cancel, new DialogInterface.OnClickListener(){ + + public void onClick(DialogInterface dialog, int which) { + // TODO Auto-generated method stub + } + }) + .show(); + + + + } + + }); + itemsList.setOnItemClickListener(new OnItemClickListener(){ public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub - String item=itemsList.getAdapter().getItem((int)arg3).toString(); - - //add item to shopping cart. For now, item can be added only once. - //Items Quantity will be supported in coming versions. - if(cartItems.add(item)) - { - if(shoppingCartProxy.addItem(Item.parseItem(item))) - Log.i("Tuscany", "Entry to be added: "+item); - else - Log.e("Tuscany", "Unable to add entry: "+item); - - } - else - { - shoppingCartProxy.removeItem(Item.parseItem(item)); - cartItems.remove(item); - Log.i("Tuscany", "Entry to be removed: "+item); - } - reloadShoppingCart(); + addItemAction(items[(int)arg3]); } + + }); + + cartList.setOnItemClickListener(new OnItemClickListener(){ + + + public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, + long arg3) { + // TODO Auto-generated method stub + removeItemAction(cartItems.get((int)arg3)); + } + }); + + + + } + + public void addItemAction(Item item) + { + //add item to shopping cart. + Item tmp=new Item(item.getName(), item.getPrice()); + if(shoppingCartProxy.addItem(tmp)) + { + cartItems.add(tmp); + Log.i(getString(R.string.app_tag), getString(R.string.add_entry_ok)+item); + } + + else + Log.e(getString(R.string.app_tag), getString(R.string.add_entry_ko)+item); + + } + + public void removeItemAction(Item item) + { + if(shoppingCartProxy.removeItem(item) && cartItems.remove(item)) + { + Log.i(getString(R.string.app_tag), getString(R.string.del_entry_ok)+item); + } + else + Log.i(getString(R.string.app_tag), getString(R.string.del_entry_ko)+item); + reloadShoppingCart(); + } /** @@ -166,12 +245,29 @@ public class catalog extends TabActivity { */ public void reloadShoppingCart() { - String[] cartArray=new String[cartItems.size()]; - cartList.setChoiceMode(ListView.CHOICE_MODE_NONE); - cartList.setAdapter(new ArrayAdapter<String>(this, - android.R.layout.simple_list_item_1, cartItems.toArray(cartArray))); + Item[] cartArray=new Item[cartItems.size()]; + cartList.setChoiceMode(ListView.CHOICE_MODE_SINGLE); + cartList.setClickable(true); + cartList.setAdapter(new ArrayAdapter<Item>(this, + R.layout.shop_row, R.id.txtItemS, cartItems.toArray(cartArray))); + if(!cartList.getAdapter().isEmpty()) + { + txtTotal.setVisibility(TextView.VISIBLE); + txtEmpty.setText("Click on an item below to remove it"); + btnClean.setVisibility(Button.VISIBLE); + } + else + { + txtTotal.setVisibility(TextView.INVISIBLE); + txtEmpty.setVisibility(TextView.VISIBLE); + txtEmpty.setText(R.string.txt_empty); + btnClean.setVisibility(Button.INVISIBLE); + } + String tt=shoppingCartProxy.getTotal(); + txtTotal.setText(getString(R.string.title_order)+": "+(tt.length()>5?tt.substring(0,5):tt)); + } - + }
\ No newline at end of file |