Android Open Source - 2014-Droid-code Main Activity






From Project

Back to project page 2014-Droid-code.

License

The source code is released under:

GNU General Public License

If you think the Android project 2014-Droid-code 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

package cs518.sample.usecontactcontentprovidercursorloader2;
/*//w w  w  .  j a v a 2  s . co m
 * This is the base code from UseContactContentProvider
 * It has been modified 
 * 1. to use  a Loader and the associated lifecycle methods
 * 2. to use a notification of progress
 * 
 * Original code: 
 * Uses the Contacts Content Provider 
 * needs the following in the manifest
 *     <uses-permission android:name="android.permission.READ_CONTACTS"/>
 *  following 
 *  http://developer.android.com/guide/topics/providers/content-providers.html
 *  http://developer.android.com/guide/topics/providers/contacts-provider.html
 *  http://www.vogella.com/tutorials/AndroidSQLite/article.html#tutorialusecp_example
 *  
 *  This is a simple implementation I leave it to you to implement 
 *  a CursorAdapter and an AdapterView and and other functionality.
 */
import android.app.Activity;
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.CursorLoader;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder;
import android.widget.TextView;

// use support or other, do not mix
//import android.support.v4.app.LoaderManager;
//import android.support.v4.app.LoaderManager.LoaderCallbacks;
//import android.support.v4.content.CursorLoader;
//import android.support.v4.content.Loader;


public class MainActivity extends Activity 
implements LoaderManager.LoaderCallbacks<Cursor> {
  // for notifier
  int id = 1;
  NotificationManager notifMan;
  Builder builder;
  // for UI
  TextView tView; 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    tView  = (TextView) findViewById(R.id.tv);
    
    setProgressNotification();
    /* 
     * prepare the loader, if it's first run it will create
     * if we're being refreshed it will reconnect
     */
    /*
     * initLoader()
     * Parameters
     * id  A unique identifier for this loader. Can be whatever you want. 
     *       Identifiers are scoped to a particular LoaderManager instance.
     * args  Optional arguments to supply to the loader at construction. 
     *     If a loader already exists (a new one does not need to be created),
     *     this parameter will be ignored and the last arguments continue to be used.
     * callback   Interface the LoaderManager will call to report about changes in the state of the loader. 
     */
    getLoaderManager().initLoader(0, null, (LoaderCallbacks<Cursor>) this);
  }

  /**
   * onCreateLoader()
   * 
   * Lifecycle method for the Loader Instantiate and return a new Loader for the given ID.
   * 
   * @param id
   * @param args
   * @return Loader<Cursor>
   */
  public  Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return getContacts(); 
  }
  private Loader<Cursor> getContacts() {
    // Run query
    Uri uri = ContactsContract.Contacts.CONTENT_URI;
    String[] projection = new String[] { 
        ContactsContract.Contacts._ID,
        ContactsContract.Contacts.DISPLAY_NAME };

    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '"
        + ("1") + "'";
    String[] selectionArgs = null;

    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
        + " COLLATE LOCALIZED ASC";
    /*
     * CursorLoader "is a loader that queries the ContentResolver and returns a Cursor. 
     * This class implements the Loader protocol in a standard way for querying cursors,
     * building on AsyncTaskLoader to perform the cursor query on a background thread so 
     * that it does not block the application's UI."
     */


    return   new CursorLoader(this,uri, projection, selection, selectionArgs, sortOrder);
    // return loader.loadInBackground();
    //return getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
  }
  /**
   * onLoadFinished
   * 
   * Lifecycle method for the loader Called when a previously created loader has finished its load.
   * 
   * @param loader
   * @param cursor
   */
  public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    // read the cursor
    tView.append("Number of Contacts: " + cursor.getCount());
    while (cursor.moveToNext()) {
      String displayName = cursor.getString(cursor
          .getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
      tView.append("Name: ");
      tView.append(displayName);
      // get phone numbers for this contact
      String contactId =
          cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
      String phoneNum = getPhoneNum(contactId);
      tView.append(" Phone1: ");
      tView.append(phoneNum);
      tView.append("\n");
    }
    endProgressNotification();
  }
  /**
   * onLoadReset()
   * 
   * Lifecycle method for the loader Called when a previously created loader is being reset, 
   * thus making its data unavailable.
   * 
   * @param loader
   * @param cursor
   */

  public void onLoaderReset(Loader<Cursor> loader) {
    // Here is where I would reset the cursor adapter.
    // This is called when the last Cursor provided to onLoadFinished()
    // above is about to be closed.  We need to make sure we are no
    // longer using it.
    //   cursoradapter.swapCursor(null);
  }


  private String getPhoneNum(String contactId) {    
    String number;
    Uri uri = Phone.CONTENT_URI;
    String[] projection = null;
    String selection = Phone.CONTACT_ID  + " = '"
        + contactId + "'";
    String[] selectionArgs = null;
    String sortOrder = null;
    CursorLoader loader = 
        new CursorLoader(this,uri, projection, selection, selectionArgs, sortOrder);
    Cursor phones =  loader.loadInBackground();
    //Cursor phones = getContentResolver().query(uri, projection, selection, selectionArgs,sortOrder);

    // returns false if cursor empty 
    if (phones.moveToFirst()) {
      number = phones.getString(phones.getColumnIndex(Phone.NUMBER));
      int type = phones.getInt(phones.getColumnIndex(Phone.TYPE));
      switch (type) {
      case Phone.TYPE_HOME:
        number += " home";
        break;
      case Phone.TYPE_MOBILE:
        number += " mobile";
        break;
      case Phone.TYPE_WORK:
        number += " work";
        break;
      }
    } else {
      number = "none";
    }
    phones.close();
    return number;
  }
  /*
   *  hese two progess methods set up, start then end a progress indicator
   *  in the notification bar
   *  1. set up progress bar
   *  2. start the progress bar
   */
  private void setProgressNotification() { 
    // 1. set up progress bar as notification
    notifMan  =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    builder = new NotificationCompat.Builder(this);
    // AutoCancel true means it disappears on click, but we need pending intent
    builder.setContentTitle("Reading Contacts")
    .setContentText("db i/o in progress")
    .setSmallIcon(R.drawable.notification)
    .setAutoCancel(true); 
    // intent that's fired by the notification cancel           
    builder.setContentIntent(PendingIntent.getActivity(getApplicationContext(), 0, new Intent(), 0));

    // Sets the progress indicator to a max value, the
    // current completion percentage, and "determinate" state:
    // true= continuous indicator, no need to update
    // false= update the indicator with progress as you go
    // 2.  start the progress notification
    builder.setProgress(100, 0, true);
    notifMan.notify(id, builder.build());
  }
  // 3.  finish progress notification
  private void endProgressNotification() {

    builder.setContentText("i/o complete").setProgress(0, 0, false);
    notifMan.notify(id, builder.build());
  }
}




Java Source Code List

ca.campbell.httpexample.HttpExample.java
ca.campbell.httpexamplepost.HttpsExamplePOST.java
ca.campbell.layoutprogrammatically.MainActivity.java
ca.campbell.networkcheckstatus.MainActivity.java
ca.campbell.optionsmenu.Activity2.java
ca.campbell.optionsmenu.Activity2.java
ca.campbell.optionsmenu.Activity3.java
ca.campbell.optionsmenu.MainActivity.java
ca.campbell.optionsmenu.MainActivity.java
ca.campbell.simplegridview.MainActivity.java
ca.campbell.week2_rw_views.Activity2.java
ca.campbell.week2_rw_views.MainActivity.java
com.androidbook.simpleasync.ChoiceActivity.java
com.androidbook.simpleasync.SimpleAsyncActivity.java
com.androidbook.simpleasync.SimpleNoBGThread.java
com.androidbook.simpleasync.SimpleThreadActivity.java
com.cookbook.internet.search.GoogleSearch.java
com.introtoandroid.simplefragments.FieldNoteListFragment.java
com.introtoandroid.simplefragments.FieldNoteViewActivity.java
com.introtoandroid.simplefragments.FieldNoteWebViewFragment.java
com.introtoandroid.simplefragments.SimpleFragmentsActivity.java
com.introtoandroid.simplelayout.FrameLayoutActivity.java
com.introtoandroid.simplelayout.GridLayoutActivity.java
com.introtoandroid.simplelayout.LinearLayoutActivity.java
com.introtoandroid.simplelayout.MenuActivity.java
com.introtoandroid.simplelayout.MultipleLayoutActivity.java
com.introtoandroid.simplelayout.RelativeLayoutActivity.java
com.introtoandroid.simplelayout.SimpleLayoutActivity.java
com.introtoandroid.simplelayout.TableLayoutActivity.java
com.introtoandroid.viewsamples.ButtonsActivity.java
com.introtoandroid.viewsamples.ContainersActivity.java
com.introtoandroid.viewsamples.EventsActivity.java
com.introtoandroid.viewsamples.FormsActivity.java
com.introtoandroid.viewsamples.IndicatorsActivity.java
com.introtoandroid.viewsamples.MenuActivity.java
com.introtoandroid.viewsamples.PickersActivity.java
com.introtoandroid.viewsamples.TextDisplayActivity.java
com.introtoandroid.viewsamples.TextInputActivity.java
com.introtoandroid.viewsamples.ViewSampleActivity.java
cs518.sample.activityLifecycle.Activity2.java
cs518.sample.activityLifecycle.MyActivityLifeCycleActivity.java
cs518.sample.database.AddStudent.java
cs518.sample.database.DBHelper.java
cs518.sample.database.DatabaseActivity.java
cs518.sample.database.Thirty.java
cs518.sample.dbcursoradapter.AddStudent.java
cs518.sample.dbcursoradapter.DBHelper.java
cs518.sample.dbcursoradapter.DatabaseActivity.java
cs518.sample.dbcursoradapter.Thirty.java
cs518.sample.localisation.MainActivity.java
cs518.sample.multiactivity.Activity1.java
cs518.sample.multiactivity.Activity2.java
cs518.sample.multiactivity.Activity3.java
cs518.sample.multiactivity.Activity4.java
cs518.sample.multiactivity.Activity5.java
cs518.sample.multiactivity.Activity6.java
cs518.sample.multiactivity.Constants.java
cs518.sample.usecalendarcontentprovider.MainActivity.java
cs518.sample.usecontactcontentprovider.MainActivity.java
cs518.sample.usecontactcontentprovidercursorloader2.MainActivity.java
cs518.sample.usemediastorecontentprovider.MainActivity.java
cs518.samples.imageswap.MainActivity.java
cs518.samples.sharedpreferences.MainActivity.java
cs534.sample.dbAsyncTask.AddStudent.java
cs534.sample.dbAsyncTask.DBHelper.java
cs534.sample.dbAsyncTask.DatabaseActivity.java
cs534.sample.dbAsyncTask.Thirty.java
cs534.sample.implicitintents.MainActivity.java
cs534.sample.multithread.MultiThread.java
cs534.sample.simplelistview.SimpleLV.java
cs534.samples.simplestlv.MainActivity.java