r48141 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r48140‎ | r48141 | r48142 >
Date:20:46, 7 March 2009
Author:demon
Status:reverted
Tags:
Comment:
Initial checkin of android-client v0.0.5. Use at your own risk. Compiled apk available as android-client.apk. See README for the todo list.
Modified paths:
  • /trunk/android-client (added) (history)
  • /trunk/android-client/.classpath (added) (history)
  • /trunk/android-client/AndroidManifest.xml (added) (history)
  • /trunk/android-client/COPYING (added) (history)
  • /trunk/android-client/README (added) (history)
  • /trunk/android-client/android-client.apk (added) (history)
  • /trunk/android-client/assets (added) (history)
  • /trunk/android-client/res (added) (history)
  • /trunk/android-client/res/drawable (added) (history)
  • /trunk/android-client/res/drawable/icon.png (added) (history)
  • /trunk/android-client/res/drawable/mediawiki.png (added) (history)
  • /trunk/android-client/res/layout (added) (history)
  • /trunk/android-client/res/layout/config.xml (added) (history)
  • /trunk/android-client/res/layout/main.xml (added) (history)
  • /trunk/android-client/res/layout/search_result_row.xml (added) (history)
  • /trunk/android-client/res/layout/view_page.xml (added) (history)
  • /trunk/android-client/res/values (added) (history)
  • /trunk/android-client/res/values/strings.xml (added) (history)
  • /trunk/android-client/src (added) (history)
  • /trunk/android-client/src/org (added) (history)
  • /trunk/android-client/src/org/mediawiki (added) (history)
  • /trunk/android-client/src/org/mediawiki/android (added) (history)
  • /trunk/android-client/src/org/mediawiki/android/HttpRequest.java (added) (history)
  • /trunk/android-client/src/org/mediawiki/android/WikiApi.java (added) (history)
  • /trunk/android-client/src/org/mediawiki/android/WikiPage.java (added) (history)
  • /trunk/android-client/src/org/mediawiki/android/client (added) (history)
  • /trunk/android-client/src/org/mediawiki/android/client/ConfigurationPage.java (added) (history)
  • /trunk/android-client/src/org/mediawiki/android/client/EditPage.java (added) (history)
  • /trunk/android-client/src/org/mediawiki/android/client/MainPage.java (added) (history)
  • /trunk/android-client/src/org/mediawiki/android/client/R.java (added) (history)
  • /trunk/android-client/src/org/mediawiki/android/client/SearchPage.java (added) (history)
  • /trunk/android-client/src/org/mediawiki/android/client/ViewPage.java (added) (history)

Diff [purge]

Index: trunk/android-client/AndroidManifest.xml
@@ -0,0 +1,51 @@
 2+<?xml version="1.0" encoding="utf-8"?>
 3+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 4+ package="org.mediawiki.android.client"
 5+ android:versionName="@string/app_version" android:versionCode="4">
 6+ <application android:icon="@drawable/icon" android:label="@string/app_name">
 7+ <activity android:name=".MainPage"
 8+ android:label="@string/app_name">
 9+ <intent-filter>
 10+ <action android:name="android.intent.action.MAIN" />
 11+ <category android:name="android.intent.category.LAUNCHER" />
 12+ </intent-filter>
 13+ </activity>
 14+ <activity android:name=".EditPage"
 15+ android:label="@string/intent_edit">
 16+ <intent-filter>
 17+ <action android:name="android.intent.action.INSERT_OR_EDIT"></action>
 18+ <action android:name="android.intent.action.EDIT"></action>
 19+ <action android:name="android.intent.action.INSERT"></action>
 20+ <action android:name="android.intent.action.DELETE"></action>
 21+ <category android:name="android.intent.category.DEFAULT"></category>
 22+ </intent-filter>
 23+ </activity>
 24+ <activity android:name=".ViewPage"
 25+ android:label="@string/intent_view">
 26+ <intent-filter>
 27+ <action android:name="android.intent.action.VIEW"></action>
 28+ <action android:name="android.intent.action.GET_CONTENT"></action>
 29+ <category android:name="android.intent.category.DEFAULT"></category>
 30+ </intent-filter>
 31+ </activity>
 32+ <activity android:name=".SearchPage"
 33+ android:label="@string/intent_search">
 34+ <intent-filter>
 35+ <action android:name="android.intent.action.SEARCH"></action>
 36+ <category android:name="android.intent.category.DEFAULT"></category>
 37+ </intent-filter>
 38+ </activity>
 39+ <activity android:name=".ConfigurationPage"
 40+ android:label="@string/intent_config">
 41+ <intent-filter>
 42+ <action android:name="android.intent.action.SEARCH"></action>
 43+ <category android:name="android.intent.category.DEFAULT"></category>
 44+ </intent-filter>
 45+ </activity>
 46+ <!-- <provider android:name="org.mediawiki.android.WikiDataProvider" android:authorities="">
 47+ </provider> -->
 48+
 49+</application>
 50+ <uses-permission android:name="android.permission.INTERNET">
 51+ </uses-permission>
 52+</manifest>
\ No newline at end of file
Index: trunk/android-client/android-client.apk
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes on: trunk/android-client/android-client.apk
___________________________________________________________________
Added: svn:mime-type
153 + application/octet-stream
Index: trunk/android-client/src/org/mediawiki/android/HttpRequest.java
@@ -0,0 +1,81 @@
 2+package org.mediawiki.android;
 3+
 4+// Imports
 5+import java.io.IOException;
 6+import java.net.SocketException;
 7+import java.net.URI;
 8+import java.net.URISyntaxException;
 9+import org.apache.http.client.ClientProtocolException;
 10+import org.apache.http.client.HttpClient;
 11+import org.apache.http.client.ResponseHandler;
 12+import org.apache.http.client.methods.HttpGet;
 13+import org.apache.http.client.methods.HttpPost;
 14+import org.apache.http.impl.client.BasicResponseHandler;
 15+import org.apache.http.impl.client.DefaultHttpClient;
 16+
 17+/**
 18+ * Class definition. Pretty simple use to get a raw HTTP GET/POST
 19+ * No caching, just a raw request.
 20+ */
 21+public class HttpRequest {
 22+
 23+ // Keep a single client
 24+ private static HttpClient __client;
 25+
 26+ public static String get( String url ) {
 27+ URI uri = HttpRequest.makeUri( url );
 28+ if ( uri == null ) {
 29+ return null;
 30+ }
 31+ HttpGet get = new HttpGet( uri );
 32+ ResponseHandler<String> responseHandler = new BasicResponseHandler();
 33+ String responseBody = "";
 34+ try {
 35+ responseBody = HttpRequest.getClient().execute(get, responseHandler);
 36+ } catch (ClientProtocolException e) {
 37+ e.printStackTrace();
 38+ } catch (IOException e) {
 39+ e.printStackTrace();
 40+ }
 41+ return responseBody;
 42+ }
 43+
 44+ public static String post( String url ) {
 45+ URI uri = HttpRequest.makeUri( url );
 46+ if ( uri == null ) {
 47+ return null;
 48+ }
 49+ HttpPost post = new HttpPost( uri );
 50+ // Create a response handler
 51+ ResponseHandler<String> responseHandler = new BasicResponseHandler();
 52+ String responseBody = "";
 53+ try {
 54+ responseBody = HttpRequest.getClient().execute(post, responseHandler);
 55+ } catch (ClientProtocolException e) {
 56+ e.printStackTrace();
 57+ } catch (SocketException e) {
 58+ e.printStackTrace();
 59+ } catch (IOException e) {
 60+ e.printStackTrace();
 61+ }
 62+ return responseBody;
 63+ }
 64+
 65+ private static HttpClient getClient() {
 66+ if ( HttpRequest.__client == null ) {
 67+ HttpRequest.__client = new DefaultHttpClient();
 68+ }
 69+ return HttpRequest.__client;
 70+ }
 71+
 72+ private static URI makeUri( String uri ) {
 73+ try {
 74+ return new URI( uri );
 75+ }
 76+ catch( URISyntaxException use ) { {
 77+ return null;
 78+ }
 79+
 80+ }
 81+ }
 82+}
\ No newline at end of file
Index: trunk/android-client/src/org/mediawiki/android/WikiApi.java
@@ -0,0 +1,86 @@
 2+package org.mediawiki.android;
 3+
 4+import org.json.JSONException;
 5+import org.json.JSONObject;
 6+import java.net.URLEncoder;
 7+
 8+public class WikiApi {
 9+
 10+ public static final String FORMAT = "json";
 11+ private String __name;
 12+ private String __urlBase;
 13+ private String __lastJsonResult = null;
 14+ private String __action = "query"; // Default to action=query
 15+ private String __params = "";
 16+ private String __fullRequestUrl;
 17+ private boolean __status = false;
 18+ private boolean __post = false; // set to true to be a posted request
 19+ private static WikiApi __instance = null;
 20+
 21+ protected WikiApi( String apiName, String apiUrl ) {
 22+ this.__name = apiName;
 23+ this.__urlBase = apiUrl;
 24+ }
 25+
 26+ public static WikiApi getSingleton() {
 27+ if ( WikiApi.__instance == null ) {
 28+ WikiApi.__instance = new WikiApi( "enwiki", "http://en.wikipedia.org/w/api.php" );
 29+ }
 30+ return WikiApi.__instance;
 31+ }
 32+
 33+ public void newAction( String action ) {
 34+ this.__action = action;
 35+ this.__params = "";
 36+ }
 37+
 38+ public String getName() {
 39+ return this.__name;
 40+ }
 41+
 42+ public void addParams( String key, String value ) {
 43+ this.__params += "&" + key + "=" + URLEncoder.encode(value);
 44+ }
 45+
 46+ public void setPost( boolean p ) {
 47+ this.__post = p;
 48+ }
 49+
 50+ public boolean doRequest() {
 51+ if ( this.__fullRequestUrl == this.getFullRequestUrl() ) {
 52+ return this.__status;
 53+ }
 54+ this.__fullRequestUrl = this.getFullRequestUrl();
 55+ String res;
 56+ if ( this.__post )
 57+ res = HttpRequest.post( this.__fullRequestUrl );
 58+ else
 59+ res = HttpRequest.get( this.__fullRequestUrl );
 60+ if ( res != "" && res != null ) {
 61+ this.__lastJsonResult = res;
 62+ this.__status = true;
 63+ } else {
 64+ this.__lastJsonResult = null;
 65+ this.__status = false;
 66+ }
 67+ return this.__status;
 68+ }
 69+
 70+ public String getFullRequestUrl() {
 71+ return this.__urlBase + "?action=" + this.__action +
 72+ this.__params + "&format=" + WikiApi.FORMAT;
 73+ }
 74+
 75+ public String getRawResult() {
 76+ return this.__lastJsonResult;
 77+ }
 78+
 79+ public JSONObject getJson() {
 80+ try {
 81+ return new JSONObject( this.__lastJsonResult );
 82+ } catch (JSONException e) {
 83+ return null;
 84+ }
 85+ }
 86+
 87+}
Index: trunk/android-client/src/org/mediawiki/android/client/MainPage.java
@@ -0,0 +1,95 @@
 2+package org.mediawiki.android.client;
 3+
 4+import android.app.Activity;
 5+import android.content.Intent;
 6+import android.os.Bundle;
 7+import android.view.Menu;
 8+import android.view.MenuItem;
 9+import android.view.View;
 10+import android.view.View.OnClickListener;
 11+import android.widget.Button;
 12+import android.widget.EditText;
 13+import android.widget.Toast;
 14+
 15+public class MainPage extends Activity {
 16+
 17+ public static final int HOME = 1;
 18+ private static final int ABOUT = 2;
 19+ private static final int CONFIG = 3;
 20+
 21+ // Button handlers for view/search
 22+ private OnClickListener mSearchOnClickListener = new OnClickListener() {
 23+ public void onClick(View v) {
 24+ Intent i = new Intent( v.getContext(), SearchPage.class );
 25+ EditText txt = (EditText)findViewById( R.id.MainPage_EditText );
 26+ i.putExtra( "searchTerm", txt.getText().toString() );
 27+ startActivity( i );
 28+ }
 29+ };
 30+ private OnClickListener mViewOnClickListener = new OnClickListener() {
 31+ public void onClick(View v) {
 32+ Intent i = new Intent( v.getContext(), ViewPage.class );
 33+ EditText txt = (EditText)findViewById( R.id.MainPage_EditText );
 34+ i.putExtra( "pageTitle", txt.getText().toString() );
 35+ startActivity( i );
 36+ }
 37+ };
 38+
 39+
 40+ /** Called when the activity is first created. */
 41+ @Override
 42+ public void onCreate(Bundle savedInstanceState) {
 43+ super.onCreate(savedInstanceState);
 44+ setContentView(R.layout.main);
 45+
 46+ // Set OnClickListeners
 47+ Button view = (Button)findViewById(R.id.ViewPage);
 48+ view.setOnClickListener( this.mViewOnClickListener );
 49+ Button search = (Button)findViewById(R.id.SearchPage);
 50+ search.setOnClickListener( this.mSearchOnClickListener );
 51+ }
 52+
 53+ /**
 54+ * Setup our menus at the bottom
 55+ */
 56+ @Override
 57+ public boolean onCreateOptionsMenu( Menu menu ) {
 58+ menu.add(0, MainPage.HOME, MainPage.HOME, getString( R.string.menu_home ) );
 59+ menu.add(0, MainPage.ABOUT, MainPage.ABOUT, getString( R.string.menu_about ) );
 60+ menu.add(0, MainPage.CONFIG, MainPage.CONFIG, getString( R.string.menu_config ) );
 61+ return super.onCreateOptionsMenu(menu);
 62+ }
 63+
 64+ /**
 65+ * Handle our menus :)
 66+ */
 67+ @Override
 68+ public boolean onMenuItemSelected(int featureId, MenuItem item) {
 69+ switch ( item.getItemId() ) {
 70+ case MainPage.ABOUT:
 71+ this.constructAboutDialogue();
 72+ break;
 73+ case MainPage.CONFIG:
 74+ this.startActivity( new Intent( this, ConfigurationPage.class ) );
 75+ break;
 76+ case MainPage.HOME:
 77+ default:
 78+ this.startActivity( new Intent( this, MainPage.class ) );
 79+ break;
 80+ }
 81+ return super.onMenuItemSelected(featureId, item);
 82+ }
 83+
 84+ /**
 85+ * Simple helper function for making the "About" dialogue. Used
 86+ * on every page, so we'll just keep it here.
 87+ */
 88+ private void constructAboutDialogue() {
 89+ String msg = getString(R.string.app_name) + "\nVersion " +
 90+ getString(R.string.app_version) + "\nBy: " +
 91+ getString(R.string.app_authors) + "\nReleased under: " +
 92+ getString(R.string.app_license);
 93+ Toast t = Toast.makeText(this, msg, Toast.LENGTH_LONG);
 94+ t.show();
 95+ }
 96+}
\ No newline at end of file
Index: trunk/android-client/src/org/mediawiki/android/client/R.java
@@ -0,0 +1,66 @@
 2+/* AUTO-GENERATED FILE. DO NOT MODIFY.
 3+ *
 4+ * This class was automatically generated by the
 5+ * aapt tool from the resource data it found. It
 6+ * should not be modified by hand.
 7+ */
 8+
 9+package org.mediawiki.android.client;
 10+
 11+public final class R {
 12+ public static final class attr {
 13+ }
 14+ public static final class drawable {
 15+ public static final int icon=0x7f020000;
 16+ public static final int mediawiki=0x7f020001;
 17+ }
 18+ public static final class id {
 19+ public static final int MainPage_EditText=0x7f050002;
 20+ public static final int MainPage_image=0x7f050001;
 21+ public static final int MainPage_parent=0x7f050000;
 22+ public static final int SearchPage=0x7f050003;
 23+ public static final int SearchResultRow=0x7f050005;
 24+ public static final int ViewPage=0x7f050004;
 25+ public static final int ViewPage_root=0x7f050006;
 26+ public static final int ViewPage_text=0x7f050007;
 27+ }
 28+ public static final class layout {
 29+ public static final int config=0x7f030000;
 30+ public static final int main=0x7f030001;
 31+ public static final int search_result_row=0x7f030002;
 32+ public static final int view_page=0x7f030003;
 33+ }
 34+ public static final class string {
 35+ public static final int app_authors=0x7f040002;
 36+ public static final int app_license=0x7f040003;
 37+ /** GLOBAL THINGS
 38+ */
 39+ public static final int app_name=0x7f040000;
 40+ public static final int app_version=0x7f040001;
 41+ public static final int fetch_data=0x7f040004;
 42+ public static final int intent_config=0x7f040010;
 43+ /** INTENTS FOR MANIFEST
 44+ */
 45+ public static final int intent_edit=0x7f04000c;
 46+ public static final int intent_main=0x7f04000d;
 47+ public static final int intent_search=0x7f04000f;
 48+ public static final int intent_view=0x7f04000e;
 49+ public static final int menu_about=0x7f040006;
 50+ public static final int menu_categories=0x7f04000a;
 51+ public static final int menu_config=0x7f040007;
 52+ /** MAIN MENU
 53+ */
 54+ public static final int menu_home=0x7f040005;
 55+ public static final int menu_langlinks=0x7f04000b;
 56+ public static final int menu_pagelinks=0x7f040009;
 57+ public static final int menu_search=0x7f040008;
 58+ public static final int pref_cachetime=0x7f040014;
 59+ public static final int pref_cachetime_summary=0x7f040015;
 60+ public static final int pref_usecache=0x7f040012;
 61+ public static final int pref_usecache_summary=0x7f040013;
 62+ /** PREFERENCES
 63+ */
 64+ public static final int prefcat_caching=0x7f040011;
 65+ public static final int prefcat_wikis=0x7f040016;
 66+ }
 67+}
Index: trunk/android-client/src/org/mediawiki/android/client/EditPage.java
@@ -0,0 +1,15 @@
 2+package org.mediawiki.android.client;
 3+
 4+import android.app.Activity;
 5+import android.os.Bundle;
 6+
 7+public class EditPage extends Activity {
 8+
 9+ /** Called when the activity is first created. */
 10+ @Override
 11+ public void onCreate(Bundle savedInstanceState) {
 12+ super.onCreate(savedInstanceState);
 13+ setContentView(R.layout.main);
 14+ }
 15+
 16+}
\ No newline at end of file
Index: trunk/android-client/src/org/mediawiki/android/client/SearchPage.java
@@ -0,0 +1,87 @@
 2+package org.mediawiki.android.client;
 3+
 4+import android.app.ListActivity;
 5+import android.content.Intent;
 6+import android.os.Bundle;
 7+import android.view.Menu;
 8+import android.view.MenuItem;
 9+import android.view.View;
 10+import android.widget.ArrayAdapter;
 11+import android.widget.ListView;
 12+import android.widget.Toast;
 13+
 14+import java.util.ArrayList;
 15+import java.util.List;
 16+import org.json.JSONArray;
 17+import org.json.JSONException;
 18+import org.json.JSONObject;
 19+import org.mediawiki.android.WikiApi;
 20+
 21+public class SearchPage extends ListActivity {
 22+
 23+ @Override
 24+ protected void onListItemClick(ListView l, View v, int position, long id) {
 25+ String title = (String)l.getItemAtPosition( position );
 26+ Intent i = new Intent( this, ViewPage.class );
 27+ i.putExtra( "pageTitle", title );
 28+ startActivity( i );
 29+ super.onListItemClick(l, v, position, id);
 30+ }
 31+
 32+ /** Called when the activity is first created. */
 33+ @Override
 34+ public void onCreate(Bundle savedInstanceState) {
 35+ super.onCreate(savedInstanceState);
 36+ try {
 37+ this.fillData( getIntent().getExtras().getString( "searchTerm" ) );
 38+ } catch (JSONException e) {
 39+ Toast t = Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG );
 40+ t.show();
 41+ }
 42+ }
 43+
 44+ private void fillData( String searchTerm ) throws JSONException {
 45+ List<String> items = new ArrayList<String>();
 46+ WikiApi api = WikiApi.getSingleton();
 47+ api.newAction( "query" );
 48+ api.addParams( "list", "search" );
 49+ api.addParams( "srwhat", "text" );
 50+ api.addParams( "srsearch", searchTerm );
 51+ Toast t = Toast.makeText( this, this.getString(R.string.fetch_data), 60 * 5 );
 52+ t.show();
 53+ api.doRequest();
 54+ t.cancel();
 55+ JSONArray json = api.getJson().getJSONObject("query").getJSONArray("search");
 56+ JSONObject jsonItem;
 57+ for ( int i = 0; i < json.length(); i++ ) {
 58+ jsonItem = json.getJSONObject( i );
 59+ items.add( jsonItem.getString( "title" ) );
 60+ }
 61+ ArrayAdapter<String> results =
 62+ new ArrayAdapter<String>(this, R.layout.search_result_row, items);
 63+ setListAdapter(results);
 64+ }
 65+
 66+ /**
 67+ * Setup our menus at the bottom
 68+ */
 69+ @Override
 70+ public boolean onCreateOptionsMenu( Menu menu ) {
 71+ menu.add(0, MainPage.HOME, MainPage.HOME, getString( R.string.menu_home ) );
 72+ return super.onCreateOptionsMenu(menu);
 73+ }
 74+
 75+ /**
 76+ * Handle our menus :)
 77+ */
 78+ @Override
 79+ public boolean onMenuItemSelected(int featureId, MenuItem item) {
 80+ switch ( item.getItemId() ) {
 81+ case MainPage.HOME:
 82+ default:
 83+ this.startActivity( new Intent( this, MainPage.class ) );
 84+ break;
 85+ }
 86+ return super.onMenuItemSelected(featureId, item);
 87+ }
 88+}
Index: trunk/android-client/src/org/mediawiki/android/client/ConfigurationPage.java
@@ -0,0 +1,14 @@
 2+package org.mediawiki.android.client;
 3+
 4+import android.os.Bundle;
 5+import android.preference.PreferenceActivity;
 6+
 7+public class ConfigurationPage extends PreferenceActivity {
 8+
 9+ /** Called when the activity is first created. */
 10+ @Override
 11+ public void onCreate(Bundle savedInstanceState) {
 12+ super.onCreate(savedInstanceState);
 13+ addPreferencesFromResource(R.layout.config);
 14+ }
 15+}
Index: trunk/android-client/src/org/mediawiki/android/client/ViewPage.java
@@ -0,0 +1,72 @@
 2+package org.mediawiki.android.client;
 3+
 4+import org.mediawiki.android.WikiApi;
 5+import org.mediawiki.android.WikiPage;
 6+
 7+import android.app.Activity;
 8+import android.content.Intent;
 9+import android.os.Bundle;
 10+import android.text.Html;
 11+import android.view.Menu;
 12+import android.view.MenuItem;
 13+import android.widget.TextView;
 14+
 15+public class ViewPage extends Activity {
 16+
 17+ protected static final int PAGELINKS = 2;
 18+ protected static final int CATEGORIES = 3;
 19+ protected static final int LANGLINKS = 4;
 20+
 21+ protected String pageTitle;
 22+ protected WikiPage pageObj;
 23+
 24+ /** Called when the activity is first created. */
 25+ @Override
 26+ public void onCreate(Bundle savedInstanceState) {
 27+ super.onCreate(savedInstanceState);
 28+ setContentView(R.layout.view_page);
 29+
 30+ // Grab the page title
 31+ this.pageTitle = this.getIntent().getExtras().getString( "pageTitle" );
 32+
 33+ // Make the wiki page object
 34+ this.pageObj = new WikiPage( this.pageTitle, WikiApi.getSingleton() );
 35+
 36+ // Set our view title
 37+ this.makePageTitle();
 38+
 39+ // Get the HTML
 40+ String html = this.pageObj.getPageHtml();
 41+ TextView view = (TextView)findViewById(R.id.ViewPage_text);
 42+ view.setText( Html.fromHtml(html) );
 43+ }
 44+
 45+ private void makePageTitle() {
 46+ this.setTitle( this.getTitle() + " - " + this.pageTitle );
 47+ }
 48+
 49+ /**
 50+ * Setup our menus at the bottom
 51+ */
 52+ @Override
 53+ public boolean onCreateOptionsMenu( Menu menu ) {
 54+ menu.add(0, MainPage.HOME, MainPage.HOME, getString( R.string.menu_home ) );
 55+ menu.add(0, ViewPage.PAGELINKS, ViewPage.PAGELINKS, getString( R.string.menu_pagelinks ) );
 56+ menu.add(0, ViewPage.CATEGORIES, ViewPage.CATEGORIES, getString( R.string.menu_categories ) );
 57+ menu.add(0, ViewPage.LANGLINKS, ViewPage.LANGLINKS, getString( R.string.menu_langlinks ) );
 58+ return super.onCreateOptionsMenu(menu);
 59+ }
 60+
 61+ /**
 62+ * Handle our menus :)
 63+ */
 64+ @Override
 65+ public boolean onMenuItemSelected(int featureId, MenuItem item) {
 66+ switch ( item.getItemId() ) {
 67+ case MainPage.HOME:
 68+ default:
 69+ this.startActivity( new Intent( this, MainPage.class ) );
 70+ }
 71+ return super.onMenuItemSelected(featureId, item);
 72+ }
 73+}
\ No newline at end of file
Index: trunk/android-client/src/org/mediawiki/android/WikiPage.java
@@ -0,0 +1,173 @@
 2+package org.mediawiki.android;
 3+
 4+import java.util.ArrayList;
 5+import java.util.Hashtable;
 6+import org.json.JSONArray;
 7+import org.json.JSONException;
 8+import org.json.JSONObject;
 9+import org.mediawiki.android.WikiApi;
 10+
 11+public class WikiPage {
 12+
 13+ private boolean __loaded = false;
 14+ private WikiApi __api;
 15+
 16+
 17+ // Aspects of the page
 18+ protected int __revId;
 19+ protected String __pageName;
 20+ protected String __pageContent;
 21+ protected ArrayList<String> __categories;
 22+ protected ArrayList<String> __externalLinks;
 23+ protected ArrayList<String> __pageLinks;
 24+ protected ArrayList<String> __images;
 25+ protected ArrayList<String> __templates;
 26+ protected Hashtable<String,String> __interwikiLinks;
 27+
 28+ public WikiApi getApi() {
 29+ return this.__api;
 30+ }
 31+
 32+ /**
 33+ * Constructor, helpful for making a quick page object
 34+ * before we want to load data
 35+ */
 36+ public WikiPage( String pageName, WikiApi api ) {
 37+ this.clearData();
 38+ this.__pageName = pageName;
 39+ this.__api = api;
 40+ }
 41+
 42+ /**
 43+ * Clear all member fields for a new request
 44+ */
 45+ private void clearData() {
 46+ this.__loaded = false;
 47+ this.__revId = 0;
 48+ this.__pageContent = "";
 49+ this.__pageName = "";
 50+ this.__categories = new ArrayList<String>();
 51+ this.__externalLinks = new ArrayList<String>();
 52+ this.__pageLinks = new ArrayList<String>();
 53+ this.__images = new ArrayList<String>();
 54+ this.__templates = new ArrayList<String>();
 55+ this.__interwikiLinks = new Hashtable<String,String>();
 56+ }
 57+
 58+ /** Accessors **/
 59+ public String getPageHtml() {
 60+ this.loadData();
 61+ return this.__pageContent;
 62+ }
 63+ public Hashtable<String,String> getInterwikiLinks() {
 64+ this.loadData();
 65+ return this.__interwikiLinks;
 66+ }
 67+ public ArrayList<String> getCategories() {
 68+ this.loadData();
 69+ return this.__categories;
 70+ }
 71+ public ArrayList<String> getExternalLinks() {
 72+ this.loadData();
 73+ return this.__externalLinks;
 74+ }
 75+ public ArrayList<String> getImages() {
 76+ this.loadData();
 77+ return this.__images;
 78+ }
 79+ public ArrayList<String>getTemplates() {
 80+ this.loadData();
 81+ return this.__templates;
 82+ }
 83+ public ArrayList<String>getPagelinks() {
 84+ this.loadData();
 85+ return this.__pageLinks;
 86+ }
 87+
 88+ /**
 89+ * Load a new page
 90+ */
 91+ public void loadPage( String page ) {
 92+ if ( this.__pageName == page ) {
 93+ return;
 94+ }
 95+ this.clearData();
 96+ this.__pageName = page;
 97+ this.loadData();
 98+ }
 99+
 100+ /**
 101+ * Have we loaded the data on this page?
 102+ */
 103+ protected boolean isLoaded() {
 104+ return this.__loaded;
 105+ }
 106+
 107+ /**
 108+ *
 109+ */
 110+ protected boolean loadData() {
 111+ if ( this.isLoaded() ) {
 112+ return true;
 113+ }
 114+ try {
 115+ this.loadDataFromRemote();
 116+ this.__loaded = true;
 117+ } catch ( JSONException e ) {
 118+ this.__loaded = false;
 119+ }
 120+ return this.__loaded;
 121+ }
 122+
 123+ protected boolean loadDataFromRemote() throws JSONException {
 124+ WikiApi api = this.getApi();
 125+ api.newAction( "parse" );
 126+ api.addParams( "prop", "revid|text|categories|externallinks|images|templates|links" );
 127+ // api.addParams( "prop", "langlinks" );
 128+ api.addParams( "page", this.__pageName );
 129+ if ( api.doRequest() ) {
 130+ JSONObject json = api.getJson().getJSONObject( "parse" );
 131+
 132+ // Revid and page content
 133+ this.__revId = json.getInt( "revid" );
 134+ this.__pageContent = json.getString( "text" );
 135+ this.__pageContent = this.__pageContent.replace("\\", "");
 136+
 137+ // Populate categories
 138+ JSONArray arr = json.optJSONArray( "categories" );
 139+ for ( int i = 0; i < arr.length(); i++ ) {
 140+ this.__categories.add( arr.getString(i) );
 141+ }
 142+
 143+ // Populate external links
 144+ arr = json.optJSONArray( "externallinks" );
 145+ for ( int i = 0; i < arr.length(); i++ ) {
 146+ this.__externalLinks.add( arr.getString(i) );
 147+ }
 148+
 149+ // Populate links
 150+ arr = json.optJSONArray( "links" );
 151+ for ( int i = 0; i < arr.length(); i++ ) {
 152+ this.__pageLinks.add( arr.getString(i) );
 153+ }
 154+
 155+ // Populate images
 156+ arr = json.optJSONArray( "images" );
 157+ for ( int i = 0; i < arr.length(); i++ ) {
 158+ this.__images.add( arr.getString(i) );
 159+ }
 160+
 161+ // Populate images
 162+ arr = json.optJSONArray( "templates" );
 163+ for ( int i = 0; i < arr.length(); i++ ) {
 164+ this.__templates.add( arr.getString(i) );
 165+ }
 166+
 167+ return true;
 168+
 169+ }
 170+ else {
 171+ return false;
 172+ }
 173+ }
 174+}
Index: trunk/android-client/COPYING
@@ -0,0 +1,340 @@
 2+ GNU GENERAL PUBLIC LICENSE
 3+ Version 2, June 1991
 4+
 5+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 6+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
 7+ Everyone is permitted to copy and distribute verbatim copies
 8+ of this license document, but changing it is not allowed.
 9+
 10+ Preamble
 11+
 12+ The licenses for most software are designed to take away your
 13+freedom to share and change it. By contrast, the GNU General Public
 14+License is intended to guarantee your freedom to share and change free
 15+software--to make sure the software is free for all its users. This
 16+General Public License applies to most of the Free Software
 17+Foundation's software and to any other program whose authors commit to
 18+using it. (Some other Free Software Foundation software is covered by
 19+the GNU Library General Public License instead.) You can apply it to
 20+your programs, too.
 21+
 22+ When we speak of free software, we are referring to freedom, not
 23+price. Our General Public Licenses are designed to make sure that you
 24+have the freedom to distribute copies of free software (and charge for
 25+this service if you wish), that you receive source code or can get it
 26+if you want it, that you can change the software or use pieces of it
 27+in new free programs; and that you know you can do these things.
 28+
 29+ To protect your rights, we need to make restrictions that forbid
 30+anyone to deny you these rights or to ask you to surrender the rights.
 31+These restrictions translate to certain responsibilities for you if you
 32+distribute copies of the software, or if you modify it.
 33+
 34+ For example, if you distribute copies of such a program, whether
 35+gratis or for a fee, you must give the recipients all the rights that
 36+you have. You must make sure that they, too, receive or can get the
 37+source code. And you must show them these terms so they know their
 38+rights.
 39+
 40+ We protect your rights with two steps: (1) copyright the software, and
 41+(2) offer you this license which gives you legal permission to copy,
 42+distribute and/or modify the software.
 43+
 44+ Also, for each author's protection and ours, we want to make certain
 45+that everyone understands that there is no warranty for this free
 46+software. If the software is modified by someone else and passed on, we
 47+want its recipients to know that what they have is not the original, so
 48+that any problems introduced by others will not reflect on the original
 49+authors' reputations.
 50+
 51+ Finally, any free program is threatened constantly by software
 52+patents. We wish to avoid the danger that redistributors of a free
 53+program will individually obtain patent licenses, in effect making the
 54+program proprietary. To prevent this, we have made it clear that any
 55+patent must be licensed for everyone's free use or not licensed at all.
 56+
 57+ The precise terms and conditions for copying, distribution and
 58+modification follow.
 59+
 60+ GNU GENERAL PUBLIC LICENSE
 61+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 62+
 63+ 0. This License applies to any program or other work which contains
 64+a notice placed by the copyright holder saying it may be distributed
 65+under the terms of this General Public License. The "Program", below,
 66+refers to any such program or work, and a "work based on the Program"
 67+means either the Program or any derivative work under copyright law:
 68+that is to say, a work containing the Program or a portion of it,
 69+either verbatim or with modifications and/or translated into another
 70+language. (Hereinafter, translation is included without limitation in
 71+the term "modification".) Each licensee is addressed as "you".
 72+
 73+Activities other than copying, distribution and modification are not
 74+covered by this License; they are outside its scope. The act of
 75+running the Program is not restricted, and the output from the Program
 76+is covered only if its contents constitute a work based on the
 77+Program (independent of having been made by running the Program).
 78+Whether that is true depends on what the Program does.
 79+
 80+ 1. You may copy and distribute verbatim copies of the Program's
 81+source code as you receive it, in any medium, provided that you
 82+conspicuously and appropriately publish on each copy an appropriate
 83+copyright notice and disclaimer of warranty; keep intact all the
 84+notices that refer to this License and to the absence of any warranty;
 85+and give any other recipients of the Program a copy of this License
 86+along with the Program.
 87+
 88+You may charge a fee for the physical act of transferring a copy, and
 89+you may at your option offer warranty protection in exchange for a fee.
 90+
 91+ 2. You may modify your copy or copies of the Program or any portion
 92+of it, thus forming a work based on the Program, and copy and
 93+distribute such modifications or work under the terms of Section 1
 94+above, provided that you also meet all of these conditions:
 95+
 96+ a) You must cause the modified files to carry prominent notices
 97+ stating that you changed the files and the date of any change.
 98+
 99+ b) You must cause any work that you distribute or publish, that in
 100+ whole or in part contains or is derived from the Program or any
 101+ part thereof, to be licensed as a whole at no charge to all third
 102+ parties under the terms of this License.
 103+
 104+ c) If the modified program normally reads commands interactively
 105+ when run, you must cause it, when started running for such
 106+ interactive use in the most ordinary way, to print or display an
 107+ announcement including an appropriate copyright notice and a
 108+ notice that there is no warranty (or else, saying that you provide
 109+ a warranty) and that users may redistribute the program under
 110+ these conditions, and telling the user how to view a copy of this
 111+ License. (Exception: if the Program itself is interactive but
 112+ does not normally print such an announcement, your work based on
 113+ the Program is not required to print an announcement.)
 114+
 115+These requirements apply to the modified work as a whole. If
 116+identifiable sections of that work are not derived from the Program,
 117+and can be reasonably considered independent and separate works in
 118+themselves, then this License, and its terms, do not apply to those
 119+sections when you distribute them as separate works. But when you
 120+distribute the same sections as part of a whole which is a work based
 121+on the Program, the distribution of the whole must be on the terms of
 122+this License, whose permissions for other licensees extend to the
 123+entire whole, and thus to each and every part regardless of who wrote it.
 124+
 125+Thus, it is not the intent of this section to claim rights or contest
 126+your rights to work written entirely by you; rather, the intent is to
 127+exercise the right to control the distribution of derivative or
 128+collective works based on the Program.
 129+
 130+In addition, mere aggregation of another work not based on the Program
 131+with the Program (or with a work based on the Program) on a volume of
 132+a storage or distribution medium does not bring the other work under
 133+the scope of this License.
 134+
 135+ 3. You may copy and distribute the Program (or a work based on it,
 136+under Section 2) in object code or executable form under the terms of
 137+Sections 1 and 2 above provided that you also do one of the following:
 138+
 139+ a) Accompany it with the complete corresponding machine-readable
 140+ source code, which must be distributed under the terms of Sections
 141+ 1 and 2 above on a medium customarily used for software interchange; or,
 142+
 143+ b) Accompany it with a written offer, valid for at least three
 144+ years, to give any third party, for a charge no more than your
 145+ cost of physically performing source distribution, a complete
 146+ machine-readable copy of the corresponding source code, to be
 147+ distributed under the terms of Sections 1 and 2 above on a medium
 148+ customarily used for software interchange; or,
 149+
 150+ c) Accompany it with the information you received as to the offer
 151+ to distribute corresponding source code. (This alternative is
 152+ allowed only for noncommercial distribution and only if you
 153+ received the program in object code or executable form with such
 154+ an offer, in accord with Subsection b above.)
 155+
 156+The source code for a work means the preferred form of the work for
 157+making modifications to it. For an executable work, complete source
 158+code means all the source code for all modules it contains, plus any
 159+associated interface definition files, plus the scripts used to
 160+control compilation and installation of the executable. However, as a
 161+special exception, the source code distributed need not include
 162+anything that is normally distributed (in either source or binary
 163+form) with the major components (compiler, kernel, and so on) of the
 164+operating system on which the executable runs, unless that component
 165+itself accompanies the executable.
 166+
 167+If distribution of executable or object code is made by offering
 168+access to copy from a designated place, then offering equivalent
 169+access to copy the source code from the same place counts as
 170+distribution of the source code, even though third parties are not
 171+compelled to copy the source along with the object code.
 172+
 173+ 4. You may not copy, modify, sublicense, or distribute the Program
 174+except as expressly provided under this License. Any attempt
 175+otherwise to copy, modify, sublicense or distribute the Program is
 176+void, and will automatically terminate your rights under this License.
 177+However, parties who have received copies, or rights, from you under
 178+this License will not have their licenses terminated so long as such
 179+parties remain in full compliance.
 180+
 181+ 5. You are not required to accept this License, since you have not
 182+signed it. However, nothing else grants you permission to modify or
 183+distribute the Program or its derivative works. These actions are
 184+prohibited by law if you do not accept this License. Therefore, by
 185+modifying or distributing the Program (or any work based on the
 186+Program), you indicate your acceptance of this License to do so, and
 187+all its terms and conditions for copying, distributing or modifying
 188+the Program or works based on it.
 189+
 190+ 6. Each time you redistribute the Program (or any work based on the
 191+Program), the recipient automatically receives a license from the
 192+original licensor to copy, distribute or modify the Program subject to
 193+these terms and conditions. You may not impose any further
 194+restrictions on the recipients' exercise of the rights granted herein.
 195+You are not responsible for enforcing compliance by third parties to
 196+this License.
 197+
 198+ 7. If, as a consequence of a court judgment or allegation of patent
 199+infringement or for any other reason (not limited to patent issues),
 200+conditions are imposed on you (whether by court order, agreement or
 201+otherwise) that contradict the conditions of this License, they do not
 202+excuse you from the conditions of this License. If you cannot
 203+distribute so as to satisfy simultaneously your obligations under this
 204+License and any other pertinent obligations, then as a consequence you
 205+may not distribute the Program at all. For example, if a patent
 206+license would not permit royalty-free redistribution of the Program by
 207+all those who receive copies directly or indirectly through you, then
 208+the only way you could satisfy both it and this License would be to
 209+refrain entirely from distribution of the Program.
 210+
 211+If any portion of this section is held invalid or unenforceable under
 212+any particular circumstance, the balance of the section is intended to
 213+apply and the section as a whole is intended to apply in other
 214+circumstances.
 215+
 216+It is not the purpose of this section to induce you to infringe any
 217+patents or other property right claims or to contest validity of any
 218+such claims; this section has the sole purpose of protecting the
 219+integrity of the free software distribution system, which is
 220+implemented by public license practices. Many people have made
 221+generous contributions to the wide range of software distributed
 222+through that system in reliance on consistent application of that
 223+system; it is up to the author/donor to decide if he or she is willing
 224+to distribute software through any other system and a licensee cannot
 225+impose that choice.
 226+
 227+This section is intended to make thoroughly clear what is believed to
 228+be a consequence of the rest of this License.
 229+
 230+ 8. If the distribution and/or use of the Program is restricted in
 231+certain countries either by patents or by copyrighted interfaces, the
 232+original copyright holder who places the Program under this License
 233+may add an explicit geographical distribution limitation excluding
 234+those countries, so that distribution is permitted only in or among
 235+countries not thus excluded. In such case, this License incorporates
 236+the limitation as if written in the body of this License.
 237+
 238+ 9. The Free Software Foundation may publish revised and/or new versions
 239+of the General Public License from time to time. Such new versions will
 240+be similar in spirit to the present version, but may differ in detail to
 241+address new problems or concerns.
 242+
 243+Each version is given a distinguishing version number. If the Program
 244+specifies a version number of this License which applies to it and "any
 245+later version", you have the option of following the terms and conditions
 246+either of that version or of any later version published by the Free
 247+Software Foundation. If the Program does not specify a version number of
 248+this License, you may choose any version ever published by the Free Software
 249+Foundation.
 250+
 251+ 10. If you wish to incorporate parts of the Program into other free
 252+programs whose distribution conditions are different, write to the author
 253+to ask for permission. For software which is copyrighted by the Free
 254+Software Foundation, write to the Free Software Foundation; we sometimes
 255+make exceptions for this. Our decision will be guided by the two goals
 256+of preserving the free status of all derivatives of our free software and
 257+of promoting the sharing and reuse of software generally.
 258+
 259+ NO WARRANTY
 260+
 261+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
 262+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
 263+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
 264+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
 265+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 266+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
 267+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
 268+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
 269+REPAIR OR CORRECTION.
 270+
 271+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 272+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
 273+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
 274+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
 275+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
 276+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
 277+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
 278+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
 279+POSSIBILITY OF SUCH DAMAGES.
 280+
 281+ END OF TERMS AND CONDITIONS
 282+
 283+ How to Apply These Terms to Your New Programs
 284+
 285+ If you develop a new program, and you want it to be of the greatest
 286+possible use to the public, the best way to achieve this is to make it
 287+free software which everyone can redistribute and change under these terms.
 288+
 289+ To do so, attach the following notices to the program. It is safest
 290+to attach them to the start of each source file to most effectively
 291+convey the exclusion of warranty; and each file should have at least
 292+the "copyright" line and a pointer to where the full notice is found.
 293+
 294+ <one line to give the program's name and a brief idea of what it does.>
 295+ Copyright (C) <year> <name of author>
 296+
 297+ This program is free software; you can redistribute it and/or modify
 298+ it under the terms of the GNU General Public License as published by
 299+ the Free Software Foundation; either version 2 of the License, or
 300+ (at your option) any later version.
 301+
 302+ This program is distributed in the hope that it will be useful,
 303+ but WITHOUT ANY WARRANTY; without even the implied warranty of
 304+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 305+ GNU General Public License for more details.
 306+
 307+ You should have received a copy of the GNU General Public License
 308+ along with this program; if not, write to the Free Software
 309+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
 310+
 311+
 312+Also add information on how to contact you by electronic and paper mail.
 313+
 314+If the program is interactive, make it output a short notice like this
 315+when it starts in an interactive mode:
 316+
 317+ Gnomovision version 69, Copyright (C) year name of author
 318+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
 319+ This is free software, and you are welcome to redistribute it
 320+ under certain conditions; type `show c' for details.
 321+
 322+The hypothetical commands `show w' and `show c' should show the appropriate
 323+parts of the General Public License. Of course, the commands you use may
 324+be called something other than `show w' and `show c'; they could even be
 325+mouse-clicks or menu items--whatever suits your program.
 326+
 327+You should also get your employer (if you work as a programmer) or your
 328+school, if any, to sign a "copyright disclaimer" for the program, if
 329+necessary. Here is a sample; alter the names:
 330+
 331+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
 332+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
 333+
 334+ <signature of Ty Coon>, 1 April 1989
 335+ Ty Coon, President of Vice
 336+
 337+This General Public License does not permit incorporating your program into
 338+proprietary programs. If your program is a subroutine library, you may
 339+consider it more useful to permit linking proprietary applications with the
 340+library. If this is what you want to do, use the GNU Library General
 341+Public License instead of this License.
Index: trunk/android-client/res/layout/main.xml
@@ -0,0 +1,10 @@
 2+<?xml version="1.0" encoding="utf-8"?>
 3+
 4+<RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/MainPage_parent"><ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/MainPage_image" android:src="@drawable/mediawiki" android:layout_centerHorizontal="true"></ImageView>
 5+
 6+
 7+<EditText android:layout_below="@id/MainPage_image" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:id="@+id/MainPage_EditText" android:layout_width="wrap_content" android:text="France" android:width="150px"></EditText>
 8+
 9+<Button android:layout_below="@id/MainPage_EditText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="View search results" android:width="175px" android:layout_marginTop="30px" android:id="@+id/SearchPage"></Button>
 10+<Button android:layout_below="@id/SearchPage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="175px" android:layout_centerHorizontal="true" android:text="View Page" android:id="@+id/ViewPage"></Button>
 11+</RelativeLayout>
Index: trunk/android-client/res/layout/config.xml
@@ -0,0 +1,19 @@
 2+<PreferenceScreen
 3+ xmlns:android="http://schemas.android.com/apk/res/android">
 4+ <PreferenceCategory android:title="@string/prefcat_caching">
 5+ <CheckBoxPreference
 6+ android:key="usecache"
 7+ android:title="@string/pref_usecache"
 8+ android:summary="@string/pref_usecache_summary" />
 9+ <EditTextPreference
 10+ android:key="cachetime"
 11+ android:title="@string/pref_cachetime"
 12+ android:summary="@+string/pref_cachetime_summary" />
 13+ </PreferenceCategory>
 14+ <PreferenceCategory android:title="@string/prefcat_wikis">
 15+ <EditTextPreference
 16+ android:key="wiki_url"
 17+ android:title="Wiki URL"
 18+ android:summary="URL of api.php" />
 19+ </PreferenceCategory>
 20+</PreferenceScreen>
Index: trunk/android-client/res/layout/view_page.xml
@@ -0,0 +1,6 @@
 2+<?xml version="1.0" encoding="utf-8"?>
 3+
 4+
 5+
 6+<RelativeLayout android:id="@+id/ViewPage_root" android:layout_width="wrap_content" android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android"><TextView android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/ViewPage_text"></TextView>
 7+</RelativeLayout>
Index: trunk/android-client/res/layout/search_result_row.xml
@@ -0,0 +1,4 @@
 2+<?xml version="1.0" encoding="utf-8"?>
 3+<TextView android:id="@+id/SearchResultRow" xmlns:android="http://schemas.android.com/apk/res/android"
 4+ android:layout_width="wrap_content"
 5+ android:layout_height="wrap_content" android:height="40px"/>
\ No newline at end of file
Index: trunk/android-client/res/values/strings.xml
@@ -0,0 +1,33 @@
 2+<?xml version="1.0" encoding="utf-8"?>
 3+<resources>
 4+ <!-- GLOBAL THINGS -->
 5+ <string name="app_name">Mediawiki Client</string>
 6+ <string name="app_version">0.0.5</string>
 7+ <string name="app_authors">Chad Horohoe</string>
 8+ <string name="app_license">GNU GPL v2 (or later)</string>
 9+ <string name="fetch_data">Fetching data...</string>
 10+
 11+ <!-- MAIN MENU -->
 12+ <string name="menu_home">Home</string>
 13+ <string name="menu_about">About</string>
 14+ <string name="menu_config">Configuration</string>
 15+ <string name="menu_search">Search</string>
 16+ <string name="menu_pagelinks">Page links</string>
 17+ <string name="menu_categories">Categories</string>
 18+ <string name="menu_langlinks">In other languages</string>
 19+
 20+ <!-- INTENTS FOR MANIFEST -->
 21+ <string name="intent_edit">Edit Page</string>
 22+ <string name="intent_main">Main Page</string>
 23+ <string name="intent_view">View</string>
 24+ <string name="intent_search">Search</string>
 25+ <string name="intent_config">Configuration</string>
 26+
 27+ <!-- PREFERENCES -->
 28+ <string name="prefcat_caching">Caching options</string>
 29+ <string name="pref_usecache">Use cache</string>
 30+ <string name="pref_usecache_summary">Use experimental SQLite cache</string>
 31+ <string name="pref_cachetime">Cache time</string>
 32+ <string name="pref_cachetime_summary">How long to cache (in minutes)</string>
 33+ <string name="prefcat_wikis">Wiki options</string>
 34+</resources>
Index: trunk/android-client/res/drawable/mediawiki.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes on: trunk/android-client/res/drawable/mediawiki.png
___________________________________________________________________
Added: svn:mime-type
135 + application/octet-stream
Index: trunk/android-client/res/drawable/icon.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes on: trunk/android-client/res/drawable/icon.png
___________________________________________________________________
Added: svn:mime-type
236 + application/octet-stream
Index: trunk/android-client/README
@@ -0,0 +1,41 @@
 2+Mediawiki Client for Android
 3+--
 4+
 5+Designed to interface with any MediaWiki installation with an open
 6+API.
 7+
 8+--
 9+
 10+Version 0.0.5
 11+
 12+NOTE: This software is pre-pre-alpha and is not guaranteed to work
 13+on any device at any point. Use at your own risk.
 14+
 15+FEATURES:
 16+* Makes request to API url entered, Returns some default information on page
 17+ name provided.
 18+
 19+TODO:
 20+ 1) i18n - check Google's progress in native Android. Possible workarounds?
 21+ 2) Document everything
 22+ 3) Make the cache work
 23+ 4) Multiple wiki sources in prefs
 24+ 5) User authentication
 25+ 6) Make data available as a ContentProvider
 26+ 7) Make page views actually attractive and usable (not just POC)
 27+
 28+--
 29+ This program is free software; you can redistribute it and/or modify
 30+ it under the terms of the GNU General Public License as published by
 31+ the Free Software Foundation; either version 2 of the License, or
 32+ (at your option) any later version.
 33+
 34+ This program is distributed in the hope that it will be useful,
 35+ but WITHOUT ANY WARRANTY; without even the implied warranty of
 36+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 37+ GNU General Public License for more details.
 38+
 39+ You should have received a copy of the GNU General Public License along
 40+ with this program; if not, write to the Free Software Foundation, Inc.,
 41+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 42+ http://www.gnu.org/copyleft/gpl.html
Index: trunk/android-client/.classpath
@@ -0,0 +1,6 @@
 2+<?xml version="1.0" encoding="UTF-8"?>
 3+<classpath>
 4+ <classpathentry kind="src" path="src"/>
 5+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
 6+ <classpathentry kind="output" path="bin"/>
 7+</classpath>
Property changes on: trunk/android-client
___________________________________________________________________
Added: svn:ignore
18 + bin
.project

Status & tagging log