/* * Market.java * ************************************************************************* * Copyright 2010 Christofer Engel * * 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.rubika.aotalk.market; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.Locale; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.SherlockActivity; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.Window; import com.google.analytics.tracking.android.EasyTracker; import com.google.analytics.tracking.android.Tracker; import com.rubika.aotalk.Preferences; import com.rubika.aotalk.R; import com.rubika.aotalk.adapter.MarketMessageAdapter; import com.rubika.aotalk.item.MarketMessage; import com.rubika.aotalk.util.ChatParser; import com.rubika.aotalk.util.Logging; import com.rubika.aotalk.util.RKNet; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; import android.widget.AdapterView.OnItemLongClickListener; public class Market extends SherlockActivity { protected static final String APP_TAG = "--> The Leet :: Market"; private ListView marketlist; private List<MarketMessage> marketposts; private MarketMessageAdapter msgadapter; private long lastfetch = 0; private SharedPreferences settings; private TextView status; public static String MARKET_INTERVAL = "10"; private static boolean UPDATE = true; private String resultData; private String limit; private String url; private HttpClient httpclient; private HttpPost httppost; private HttpResponse response; private HttpEntity entity; private InputStream is; private BufferedReader reader; private StringBuilder sb; private String line; private JSONArray json_array; private JSONObject json_data; private Handler handler = new Handler(); private static Tracker tracker; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //super.setTheme(R.style.Theme_AOTalkTheme_Light); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); settings = PreferenceManager.getDefaultSharedPreferences(this); setContentView(R.layout.activity_market); final ActionBar bar = getSupportActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); bar.setDisplayHomeAsUpEnabled(true); status = (TextView) findViewById(R.id.status); marketposts = new ArrayList<MarketMessage>(); marketlist = (ListView)findViewById(R.id.market); marketlist.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL); marketlist.setDividerHeight(0); msgadapter = new MarketMessageAdapter(this, marketposts, settings.getBoolean("enableAnimations", true)); marketlist.setAdapter(msgadapter); marketlist.setFocusable(true); marketlist.setFocusableInTouchMode(true); marketlist.setItemsCanFocus(true); marketlist.setOnItemLongClickListener(new OnItemLongClickListener(){ @Override public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) { return false; } }); EasyTracker.getInstance().setContext(this); tracker = EasyTracker.getTracker(); handler.post(update); } private class Update extends AsyncTask<Void, Void, String> { protected String doInBackground(Void... str) { handler.post(setLoading); return getMarketData(); } protected void onPostExecute(String result) { resultData = result; handler.post(outputResult); if(settings.getBoolean("marketautoupdate", UPDATE)) { handler.removeCallbacks(update); handler.postDelayed(update, (Integer.parseInt(settings.getString("marketinterval", MARKET_INTERVAL).trim()) * 1000)); } } } private Runnable update = new Runnable() { public void run() { new Update().execute(); } }; final Runnable outputResult = new Runnable() { public void run() { updateResultsInUi(); } }; private Runnable setError = new Runnable() { public void run() { status.setText("Error!"); } }; private Runnable setLoading = new Runnable() { public void run() { setSupportProgressBarIndeterminateVisibility(Boolean.TRUE); status.setText("Loading..."); } }; private Runnable setDone = new Runnable() { public void run() { String statustext = getString(R.string.auto_update) + ": "; setSupportProgressBarIndeterminateVisibility(Boolean.FALSE); if(settings.getBoolean("marketautoupdate", UPDATE)) { statustext += getString(R.string.on); } else { statustext += getString(R.string.off); } status.setText(statustext); } }; private String getMarketData() { long loadTime = System.currentTimeMillis(); limit = ""; if(lastfetch == 0) { limit = "&limit=50"; } url = String.format( Locale.getDefault(), RKNet.RKNET_MARKET_PATH, lastfetch, limit ); try{ httpclient = new DefaultHttpClient(); httppost = new HttpPost(url); response = httpclient.execute(httppost); entity = response.getEntity(); is = entity.getContent(); try{ reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); sb = new StringBuilder(); line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); tracker.sendTiming("Loading", System.currentTimeMillis() - loadTime, "Market", null); return sb.toString(); } catch(Exception e){ Logging.log(APP_TAG, "Error converting result " + e.toString()); return null; } } catch(Exception e){ Logging.log(APP_TAG, "Error in http connection " + e.toString()); return null; } } private void updateResultsInUi() { try{ if(resultData != null) { if((!resultData.startsWith("null"))) { boolean showAnimation = true; if(lastfetch == 0) { showAnimation = false; } json_array = new JSONArray(resultData); for(int i = json_array.length() - 1; i >= 0; i--){ json_data = json_array.getJSONObject(i); if (i == 0) { lastfetch = json_data.getLong("time"); } int side = 0; if(json_data.getInt("omni") == 1) { side = 1; } if(json_data.getInt("clan") == 1) { side = 2; } if(json_data.getInt("neut") == 1) { side = 3; } MarketMessage message = new MarketMessage( json_data.getLong("time"), ChatParser.parse(json_data.getString("message"), ChatParser.MESSAGE_TYPE_PLAIN), json_data.getString("player"), side ); message.showAnimation(showAnimation); marketposts.add(0, message); } } } else { handler.post(setError); } } catch(JSONException e){ Logging.log(APP_TAG, "Error parsing data " + e.toString()); } msgadapter.notifyDataSetChanged(); handler.post(setDone); } @Override protected void onResume() { super.onResume(); handler.post(setDone); if(settings.getBoolean("marketautoupdate", UPDATE)) { handler.removeCallbacks(update); handler.post(update); } } @Override protected void onPause() { super.onPause(); handler.removeCallbacks(update); } @Override protected void onDestroy() { super.onDestroy(); } @Override protected void onStart() { super.onStart(); try { EasyTracker.getInstance().activityStart(this); } catch (IllegalStateException e) { Logging.log(APP_TAG, e.getMessage()); } } @Override protected void onStop() { super.onStop(); try { EasyTracker.getInstance().activityStop(this); } catch (IllegalStateException e) { Logging.log(APP_TAG, e.getMessage()); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.menu_market, menu); return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); return true; } else if (item.getItemId() == R.id.update) { handler.removeCallbacks(update); handler.post(update); return true; } else if (item.getItemId() == R.id.preferences) { Intent intent = new Intent(this, Preferences.class); startActivity(intent); return true; } else { return super.onOptionsItemSelected(item); } } }