Android Open Source - OXAndroidDemo O X Demo






From Project

Back to project page OXAndroidDemo.

License

The source code is released under:

Apache License

If you think the Android project OXAndroidDemo listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * An example App using the Open-Xchange HTTP API as well as
 * Android voice recognition features to perform simple tasks
 * /*from  w w  w.ja va2 s . c om*/
 * Features:
 * 
 *  1.) OX Login (Change URL and credentials in settings!)
 *  2.) Get standard task folder
 *  3.) Voice recognition to create simple tasks
 *  4.) Get List of all tasks from standard task folder
 *  5.) Show all tasks in listview
 *  6.) Delete single task via swipe gesture from listview
 *
 * Date: 20140822
 * Author: Martin Kauss
 * Company: Open-Xchange
 *
 * 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 org.bishoph.oxdemo;

import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.client.HttpClient;
import org.apache.http.protocol.HttpContext;
import org.bishoph.oxdemo.util.CreateTaskAction;
import org.bishoph.oxdemo.util.CustomArrayAdapter;
import org.bishoph.oxdemo.util.DeleteTask;
import org.bishoph.oxdemo.util.GetTaskList;
import org.bishoph.oxdemo.util.ListEntries;
import org.bishoph.oxdemo.util.OXLoginAction;
import org.bishoph.oxdemo.util.RequestVisibleFolders;
import org.bishoph.oxdemo.util.SwipeDismissListViewTouchListener;
import org.bishoph.oxdemo.util.SwipeDismissListViewTouchListener.DismissCallbacks;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.speech.RecognizerIntent;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;

public class OXDemo extends Activity implements
    OnSharedPreferenceChangeListener {

  private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;

  private static final String SESSIONID = "session";
  private static final String DATA = "data";
  private static final String PRIVATEFOLDER = "private";
  private String sessionid = null;

  private String url = null;
  private HttpClient httpclient = null;
  private HttpContext localcontext = null;

  private int folder_id = -1;

  private SharedPreferences prefs;

  private ListView listview = null;
  private ArrayList<String> listviewarray = null;
  private CustomArrayAdapter listviewadapter = null;
  private ListEntries listentries = null;

  float lastx = Float.NaN;
  float lasty = Float.NaN;
  static final int MOVEMENT = 35;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_oxdemo);

    // Upon interacting with UI controls, delay any scheduled hide()
    // operations to prevent the jarring behavior of controls going away
    // while interacting with the UI.
    Button button = (Button) findViewById(R.id.start_button);
    // button.setOnTouchListener(mDelayHideTouchListener);

    // Add OnClickListener to button
    button.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
        startVoiceRecognitionActivity();
      }
    });

    prefs = PreferenceManager
        .getDefaultSharedPreferences(getApplicationContext());
    prefs.registerOnSharedPreferenceChangeListener(this);

    listentries = new ListEntries();
    listview = (ListView) findViewById(R.id.listView1);  
    
    listviewarray = new ArrayList<String>();
    listviewarray.add("Loading ... please wait");
  
    listviewadapter = new CustomArrayAdapter(this, R.layout.mysimplelistitem, listviewarray);
    
    listview.setAdapter(listviewadapter);

    SwipeDismissListViewTouchListener touchListener = new SwipeDismissListViewTouchListener(
        listview, new DismissCallbacks() {
          public void onDismiss(ListView listView,
              int[] reverseSortedPositions) {
            for (int position : reverseSortedPositions) {
              Log.v("OXDemo", "Preparing for deletion "
                  + listviewadapter.getItem(position));
              removeTask(position);              
            }
            listviewadapter.notifyDataSetChanged();
          }

          @Override
          public boolean canDismiss(int position) {
            return true;
          }
        });
    listview.setOnTouchListener(touchListener);
    listview.setOnScrollListener(touchListener.makeScrollListener());

  }

  @Override
  protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);

    // Trigger the initial hide() shortly after the activity has been
    // created, to briefly hint to the user that UI controls
    // are available.
    delayedHide(100);
  }



  Handler mHideHandler = new Handler();
  Runnable mHideRunnable = new Runnable() {
    @Override
    public void run() {
      doLogin();
    }
  };

  /**
   * Schedules a call to hide() in [delay] milliseconds, canceling any
   * previously scheduled calls.
   */
  private void delayedHide(int delayMillis) {
    mHideHandler.removeCallbacks(mHideRunnable);
    mHideHandler.postDelayed(mHideRunnable, delayMillis);
  }

  @SuppressLint("TrulyRandom")
  private String getSimpleRandomString() {
    SecureRandom random = new SecureRandom();
    return new BigInteger(64, random).toString(32);
  }

  private void doLogin() {
    Log.v("OXDemo", "doLogin start");
    try {
      url = prefs.getString("url", "https://www.ox.io/");
      Log.v("OXDemo", "Using URL from preferences = " + url);
      String login = prefs.getString("login", "test@example.com");
      Log.v("OXDemo", "Using login from preferences = " + login);
      String password = prefs.getString("password", null);
      if (!url.endsWith("/")) {
        url = url + "/";
      }

      OXLoginAction oxloginaction = new OXLoginAction(this);
      String uri = url + "ajax/login?action=login&authId="
          + getSimpleRandomString();

      this.httpclient = oxloginaction.getHttpClient();
      this.localcontext = oxloginaction.getLocalContext();
      oxloginaction.execute(uri, login, password);

      Log.v("OXDemo", "doLogin done");
    } catch (Exception e) {
      Log.e("OXDemo", e.getMessage());
    }

  }

  public void getSessionID(JSONObject jsonobject) {
    Log.v("OXDemo", "Got JSON Object from AsyncTask ... ready for parsing "
        + jsonobject);
    try {
      String sessionid = jsonobject.getString(SESSIONID);
      Log.v("OXDemo", "Sessionid = " + sessionid);
      this.sessionid = sessionid;
      // We can not continue to work with the OX API
      getTaskStandardFolder();

    } catch (JSONException e) {
      Log.e("OXDemo", e.getMessage());
    }
  }

  public void processJSONResult(JSONObject jsonobject, int action) {
    if (action == 1) {
      Log.v("OXDemo",
          "Got JSON Object from AsyncTask ... ready for parsing "
              + jsonobject);
      try {
        // {"data":{"private":[["27",true]]},"timestamp":1243419226786}
        folder_id = -1;
        JSONObject data = jsonobject.getJSONObject(DATA);
        JSONArray privatefolder = data.getJSONArray(PRIVATEFOLDER);
        for (int i = 0; i < privatefolder.length(); i++) {
          JSONArray folders = (JSONArray) privatefolder.get(i);
          for (int a = 0; a < folders.length() / 2; a = a + 2) {
            folder_id = folders.getInt(a);
            boolean standard = folders.getBoolean(a + 1);
            if (standard == true) {
              Log.v("OXDemo", "Task standard folder_id = "
                  + folder_id);
              // We can now continue to work with the OX API
              getTaskList();
            }
          }
        }
      } catch (JSONException e) {
        Log.e("OXDemo", e.getMessage());
      } catch (Exception e) {
        Log.e("OXDemo", e.getMessage());
      }
    } else if (action == 2) {
      Log.v("OXDemo",
          "Got JSON Object from AsyncTask ... ready for parsing "
              + jsonobject);
      try {
        // {"data":[[24,"testtask 1234"]],"timestamp":1408961031592}
        JSONArray data = jsonobject.getJSONArray(DATA);
        if (data.length() > 0) {
          listviewarray.remove(0); // Remove "Loading info"
        }
        for (int i = 0; i < data.length(); i++) {
          JSONArray tasks = (JSONArray) data.get(i);
          for (int a = 0; a < tasks.length() / 2; a = a + 2) {
            int object_id = tasks.getInt(a);
            String task_title = tasks.getString(a + 1);
            listentries.add(object_id, task_title);
            listviewarray.add(task_title);
            Log.v("OXDemo", "Task = " + task_title);
            listviewadapter.notifyDataSetChanged();
          }
        }
      } catch (JSONException e) {
        Log.e("OXDemo", e.getMessage());
      } catch (Exception e) {
        Log.e("OXDemo", e.getMessage());
      }
    } else if (action == 3) {
      Log.v("OXDemo", "Task should have been deleted ;)");
    } else if (action == 4) {
      Log.v("OXDemo",
          "Got JSON Object from AsyncTask ... ready for parsing "
              + jsonobject);
      try {
        // {"timestamp":1409059418429,"data":{"id":35}}
        JSONObject data = jsonobject.getJSONObject(DATA);
        int object_id = (Integer) data.get("id");
        String task_title = jsonobject.getString("title");
        listentries.add(object_id, task_title);
        listviewarray.add(task_title);
        listviewadapter.notifyDataSetChanged();
      } catch (JSONException e) {
        Log.e("OXDemo", e.getMessage());
      } catch (Exception e) {
        Log.e("OXDemo", e.getMessage());
      }
    } else {
      Log.v("OXDemo", "Action unkown...");
    }

  }

  public void createTask(int folder_id, String title) {
    String uri = url + "ajax/tasks?action=new&timezone=UTC&session="
        + sessionid;
    CreateTaskAction createtaskaction = new CreateTaskAction(this,
        httpclient, localcontext, folder_id);
    createtaskaction.execute(uri, title);
  }

  public void getTaskStandardFolder() {
    String uri = url
        + "ajax/folders?action=allVisible&content_type=tasks&columns=1,308&session="
        + sessionid;
    RequestVisibleFolders requestvisiblefolders = new RequestVisibleFolders(
        this, httpclient, localcontext);
    requestvisiblefolders.execute(uri);
  }

  public void getTaskList() {
    String uri = url + "ajax/tasks?action=all&folder=" + folder_id
        + "&columns=1,200&session=" + sessionid;
    GetTaskList gettasklist = new GetTaskList(this, httpclient,
        localcontext);
    gettasklist.execute(uri);
  }

  public void removeTask(int listviewposition) {
    Log.v("OXDemo", "removeTask " + listviewposition + " was called");
    int object_id = listentries.getObjectId(listviewposition);
    String uri = url + "ajax/tasks?action=delete&folder=" + folder_id
        + "&timestamp=" + System.currentTimeMillis() + "&session="
        + sessionid;
    DeleteTask deletetask = new DeleteTask(this, httpclient, localcontext,
        folder_id);
    deletetask.execute(uri, object_id);
    listentries.remove(listviewposition);
    listviewarray.remove(listviewposition);
    listviewadapter.notifyDataSetChanged();
  }

  /*------------------- Voice Recognition -------------------- */

  public void startVoiceRecognitionActivity() {
    Log.v("OXDemo", "startVoiceRecognitionActivity init...");
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    PackageManager pm = getPackageManager();
    List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
    if (activities.size() > 0) {
      intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
          RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
      intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
          "Speech recognition demo");
      startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
      Log.v("OXDemo", "...done");
    } else {
      // createTask(folder_id,
      // "Auto creation ??? "+getSimpleRandomString());
      Log.v("OXDemo", "No voice recognition!");
    }
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.v("OXDemo", "onActivityResult " + resultCode + " // " + RESULT_OK);
    if (requestCode == VOICE_RECOGNITION_REQUEST_CODE
        && resultCode == RESULT_OK) {
      ArrayList<String> matches = data
          .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
      Log.v("OXDemo", "All text reconition: " + matches);
      if (matches != null && !matches.isEmpty()) {
        String bestResult = matches.get(0).toString();
        if (bestResult != null && bestResult.length() > 0) {
          Log.v("OXDemo", "Best result from text reconition: "
              + bestResult);
          if (folder_id > -1) {
            createTask(folder_id, bestResult);
          }
        }
      }
    }
    super.onActivityResult(requestCode, resultCode, data);
  }

  /* ---------- Menu -> Settings ----------- */
  
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu, menu);
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.menu_settings) {
      Intent settingsActivity = new Intent(getBaseContext(),
          PreferencesActivity.class);
      startActivity(settingsActivity);
      return true;
    }
    return super.onOptionsItemSelected(item);
  }

  @Override
  public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
      String key) {
    int length = listviewarray.size() - 1;
    for (int a = 0; a < length; a++) {
      listentries.remove(0);
      listviewarray.remove(0);
    }
    listviewadapter.notifyDataSetChanged();
    doLogin();
  }

}




Java Source Code List

org.bishoph.oxdemo.OXDemo.java
org.bishoph.oxdemo.PreferencesActivity.java
org.bishoph.oxdemo.SettingsFragment.java
org.bishoph.oxdemo.util.CreateTaskAction.java
org.bishoph.oxdemo.util.CustomArrayAdapter.java
org.bishoph.oxdemo.util.DeleteTask.java
org.bishoph.oxdemo.util.GetTaskList.java
org.bishoph.oxdemo.util.ListEntries.java
org.bishoph.oxdemo.util.OXLoginAction.java
org.bishoph.oxdemo.util.RequestVisibleFolders.java
org.bishoph.oxdemo.util.SwipeDismissListViewTouchListener.java
org.bishoph.oxdemo.util.SystemUiHiderBase.java
org.bishoph.oxdemo.util.SystemUiHiderHoneycomb.java
org.bishoph.oxdemo.util.SystemUiHider.java