Java tutorial
/******************************************************************************* * This file is part of Zandy. * * Zandy is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Zandy 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Zandy. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package com.gimranov.zandy.app; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import org.apache.http.util.ByteArrayBuffer; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.Editable; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import com.gimranov.zandy.app.data.Database; /** * Runs lookup routines to create new items * @author ajlyon * */ public class LookupActivity extends Activity implements OnClickListener { private static final String TAG = "com.gimranov.zandy.app.LookupActivity"; static final int DIALOG_PROGRESS = 6; private ProgressDialog mProgressDialog; private ProgressThread progressThread; private Database db; private Bundle b = new Bundle(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); db = new Database(this); /* Get the incoming data from the calling activity */ final String identifier = getIntent().getStringExtra("com.gimranov.zandy.app.identifier"); final String mode = getIntent().getStringExtra("com.gimranov.zandy.app.mode"); setContentView(R.layout.lookup); Button lookupButton = (Button) findViewById(R.id.lookupButton); lookupButton.setOnClickListener(this); } /** * Implementation of the OnClickListener interface, to handle button events. * * Note: When adding a button, it needs to be added here, but the * ClickListener needs to be set in the main onCreate(..) as well. */ public void onClick(View v) { Log.d(TAG, "Click on: " + v.getId()); if (v.getId() == R.id.lookupButton) { Log.d(TAG, "Trying to start search activity"); TextView field = (TextView) findViewById(R.id.identifier); Editable fieldContents = (Editable) field.getText(); Bundle b = new Bundle(); b.putString("mode", "isbn"); b.putString("identifier", fieldContents.toString()); this.b = b; showDialog(DIALOG_PROGRESS); } else { Log.w(TAG, "Uncaught click on: " + v.getId()); } } @Override public void onDestroy() { super.onDestroy(); } @Override public void onResume() { if (db == null) db = new Database(this); super.onResume(); } protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_PROGRESS: mProgressDialog = new ProgressDialog(this); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setIndeterminate(true); mProgressDialog.setMax(100); return mProgressDialog; default: Log.e(TAG, "Invalid dialog requested"); return null; } } protected void onPrepareDialog(int id, Dialog dialog) { switch (id) { case DIALOG_PROGRESS: mProgressDialog.setProgress(0); mProgressDialog.setMessage("Looking up item..."); progressThread = new ProgressThread(handler, b); progressThread.start(); } } final Handler handler = new Handler() { public void handleMessage(Message msg) { if (ProgressThread.STATE_DONE == msg.arg2) { if (mProgressDialog.isShowing()) dismissDialog(DIALOG_PROGRESS); // do something-- we're done. return; } if (ProgressThread.STATE_PARSING == msg.arg2) { mProgressDialog.setMessage("Parsing item data..."); return; } int total = msg.arg1; mProgressDialog.setProgress(total); if (total >= 100) { dismissDialog(DIALOG_PROGRESS); progressThread.setState(ProgressThread.STATE_DONE); } } }; private class ProgressThread extends Thread { Handler mHandler; Bundle arguments; final static int STATE_DONE = 5; final static int STATE_FETCHING = 1; final static int STATE_PARSING = 6; int mState; ProgressThread(Handler h, Bundle b) { mHandler = h; arguments = b; } public void run() { mState = STATE_FETCHING; // Setup String identifier = arguments.getString("identifier"); String mode = arguments.getString("mode"); URL url; String urlstring; if ("isbn".equals(mode)) { if (identifier == null || identifier.equals("")) identifier = "0674081250"; urlstring = "http://xisbn.worldcat.org/webservices/xid/isbn/" + identifier + "?method=getMetadata&fl=*&format=json&count=1"; } else { urlstring = ""; } try { Log.d(TAG, "Fetching from: " + urlstring); url = new URL(urlstring); /* Open a connection to that URL. */ URLConnection ucon = url.openConnection(); /* * Define InputStreams to read from the URLConnection. */ InputStream is = ucon.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is, 16000); ByteArrayBuffer baf = new ByteArrayBuffer(50); int current = 0; /* * Read bytes to the Buffer until there is nothing more to read(-1). */ while (mState == STATE_FETCHING && (current = bis.read()) != -1) { baf.append((byte) current); if (baf.length() % 2048 == 0) { Message msg = mHandler.obtainMessage(); // XXX do real length later Log.d(TAG, baf.length() + " downloaded so far"); msg.arg1 = baf.length() % 100; mHandler.sendMessage(msg); } } String content = new String(baf.toByteArray()); Log.d(TAG, content); } catch (IOException e) { Log.e(TAG, "Error: ", e); } Message msg = mHandler.obtainMessage(); msg.arg2 = STATE_DONE; mHandler.sendMessage(msg); } public void setState(int state) { mState = state; } } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.zotero_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { case R.id.do_prefs: startActivity(new Intent(this, SettingsActivity.class)); return true; default: return super.onOptionsItemSelected(item); } } }