package com.example; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.*; import android.widget.*; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.HttpResponse; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import java.util.ArrayList; import java.util.List; public class MyActivity extends Activity { TableLayout tl = null; String userid, passwd, pf, pfHtml; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); buildTable(); } public void download() { try { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); userid = prefs.getString("userid", ""); passwd = prefs.getString("passwd", ""); pf = prefs.getString("pf", ""); if (passwd == null || passwd == null || pf == null) { AlertDialog alertDialog = new AlertDialog.Builder(this).create(); alertDialog.setTitle("Error!"); alertDialog.setMessage("Call Settings first (Menu Button/Options)."); alertDialog.setButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }); alertDialog.show(); return; } DefaultHttpClient client = DefaultHttpClient.class.newInstance(); // login: get challenge and 'u' from form HttpPost request1 = new HttpPost("https://login.yahoo.com/config/login_verify2?.intl=au&.src=ym&.done=http://finance.yahoo.com"); HttpResponse response1 = client.execute(request1); String resp = EntityUtils.toString(response1.getEntity()); int from = resp.indexOf("name=\".u\" value=\"") + 17; int to = resp.indexOf(">", from) - 1; String u = resp.substring(from, to); from = resp.indexOf("name=\".challenge\" value=\"") + 25; to = resp.indexOf(">", from) - 1; String challenge = resp.substring(from, to); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("login", userid)); nameValuePairs.add(new BasicNameValuePair("passwd", passwd)); nameValuePairs.add(new BasicNameValuePair(".tries", "1")); nameValuePairs.add(new BasicNameValuePair(".src", "ym")); nameValuePairs.add(new BasicNameValuePair(".md5", "")); nameValuePairs.add(new BasicNameValuePair(".hash", "")); nameValuePairs.add(new BasicNameValuePair(".js", "")); nameValuePairs.add(new BasicNameValuePair(".last", "")); nameValuePairs.add(new BasicNameValuePair("promo", "")); nameValuePairs.add(new BasicNameValuePair(".intl", "de")); nameValuePairs.add(new BasicNameValuePair(".bypass", "")); nameValuePairs.add(new BasicNameValuePair(".partner", "")); nameValuePairs.add(new BasicNameValuePair(".u", u)); nameValuePairs.add(new BasicNameValuePair(".v", "0")); nameValuePairs.add(new BasicNameValuePair(".challenge", challenge)); nameValuePairs.add(new BasicNameValuePair(".yplus", "")); nameValuePairs.add(new BasicNameValuePair(".emailCode", "")); nameValuePairs.add(new BasicNameValuePair("pkg", "")); nameValuePairs.add(new BasicNameValuePair("stepid", "")); nameValuePairs.add(new BasicNameValuePair(".ev", "")); nameValuePairs.add(new BasicNameValuePair("hasMsgr", "0")); nameValuePairs.add(new BasicNameValuePair(".chkP", "Y")); nameValuePairs.add(new BasicNameValuePair(".done", "http://finance.yahoo.com")); nameValuePairs.add(new BasicNameValuePair(".pd", "ym_ver=0&c=&ivt=&sg=")); nameValuePairs.add(new BasicNameValuePair("pad", "6")); nameValuePairs.add(new BasicNameValuePair("add", "6")); nameValuePairs.add(new BasicNameValuePair(".save", "")); nameValuePairs.add(new BasicNameValuePair(".persistent", "y")); HttpPost request2 = new HttpPost("https://login.yahoo.com/config/login?"); request2.setEntity(new UrlEncodedFormEntity(nameValuePairs)); client.execute(request2); // dont need response HttpGet request3 = new HttpGet("http://finance.yahoo.com/portfolio/pf_" + pf + "/view/v2"); HttpResponse response3 = client.execute(request3); HttpEntity resEntity = response3.getEntity(); if (resEntity != null) { pfHtml = EntityUtils.toString(resEntity); buildTable(); } } catch (Exception ex) { show("Error! Check settings. Exception was " + ex); } } // open the Options Menu at startup @Override public void onAttachedToWindow() { super.onAttachedToWindow(); openOptionsMenu(); } void buildTable() { if (pfHtml == null) { return; } String s = pfHtml; tl = (TableLayout) findViewById(R.id.txttable); tl.setPadding(5, 0, 5, 0); tl.removeAllViews(); TableRow tr = new TableRow(this); tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); addCol(tr, "Ticker"); addCol(tr, "Price"); addCol(tr, "Holding"); addCol(tr, "Value"); addCol(tr, "Gain"); tl.addView(tr, new TableLayout.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); int nxt = 0; String[] colnames = {"symbol", "price", "shares_owned", "holdings_value", "holdings_percent_gain"}; while ((nxt = s.indexOf("<td class=\"col-symbol", nxt)) >= 0) { int end = s.indexOf("</tr>", nxt); String row = s.substring(nxt, end); tr = new TableRow(this); tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); for (int col = 0; col < colnames.length; col++) { String colval = getCol(colnames[col], row); addCol(tr, colval); nxt = end; } tl.addView(tr, new TableLayout.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); } int from = s.indexOf("<tr class=\"totals\">"); int to = s.indexOf("</tr>", from); String holdval = getCol("holdings_value", s.substring(from, to)); String holdgain = getCol("holdings_percent_gain", s.substring(from, to)); tr = new TableRow(this); tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); addCol(tr, "Total"); addCol(tr, ""); addCol(tr, ""); addCol(tr, holdval); addCol(tr, holdgain); tl.addView(tr, new TableLayout.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); tl.setSaveEnabled(true); } String getCol(String col, String str) { boolean minus = false; int from = str.indexOf("<td class=\"col-" + col); int to = str.indexOf("</td>", from); String s = str.substring(from, to); s = s.substring(s.lastIndexOf("<span ")); if (s.contains("alt=\"down\"")) minus = true; s = s.replaceAll("<[^>]*>", "").replace("€", ""); if (minus) { s = "-" + s.replace(" ", ""); } return s; } void addCol(TableRow tr, String s) { TextView txt = new TextView(this); txt.setText(" " + s); if (s.matches("[0123456789\\.,%-]+")) txt.setGravity(Gravity.RIGHT); txt.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); tr.addView(txt); } void show(String s) { TextView t = new TextView(this); t.setText(s); t.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); tl.addView(t); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.actionbar, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.settings: startActivity(new Intent(this, Preferences.class)); return true; case R.id.download: download(); return true; case R.id.cancel: return true; default: return super.onOptionsItemSelected(item); } } }