/* * Copyright (C) 2009 University of Washington * * 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.odk.collect.android.activities; import org.odk.collect.android.R; import org.odk.collect.android.preferences.PreferencesActivity; import org.odk.collect.android.provider.InstanceProviderAPI; import org.odk.collect.android.provider.InstanceProviderAPI.InstanceColumns; import android.app.ListActivity; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.Toast; import java.util.ArrayList; /** * Responsible for displaying all the valid forms in the forms directory. Stores the path to * selected form for use by {@link MainMenuActivity}. * * @author Carl Hartung (carlhartung@gmail.com) * @author Yaw Anokwa (yanokwa@gmail.com) */ public class InstanceUploaderList extends ListActivity { private static final String BUNDLE_SELECTED_ITEMS_KEY = "selected_items"; private static final String BUNDLE_TOGGLED_KEY = "toggled"; private static final int MENU_PREFERENCES = Menu.FIRST; private static final int INSTANCE_UPLOADER = 0; private Button mUploadButton; private Button mToggleButton; private SimpleCursorAdapter mInstances; private ArrayList<Long> mSelected = new ArrayList<Long>(); private boolean mRestored = false; private boolean mToggled = false; /* * (non-Javadoc) * @see android.app.Activity#onCreate(android.os.Bundle) */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.instance_uploader_list); mUploadButton = (Button) findViewById(R.id.upload_button); mUploadButton.setOnClickListener(new OnClickListener() { /* * (non-Javadoc) * @see android.view.View.OnClickListener#onClick(android.view.View) */ @Override public void onClick(View arg0) { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = connectivityManager.getActiveNetworkInfo(); if (ni == null || !ni.isConnected()) { Toast.makeText(InstanceUploaderList.this, R.string.no_connection, Toast.LENGTH_SHORT).show(); } else { if (mSelected.size() > 0) { // items selected uploadSelectedFiles(); mToggled = false; mSelected.clear(); InstanceUploaderList.this.getListView().clearChoices(); mUploadButton.setEnabled(false); } else { // no items selected Toast.makeText(getApplicationContext(), getString(R.string.noselect_error), Toast.LENGTH_SHORT).show(); } } } }); mToggleButton = (Button) findViewById(R.id.toggle_button); mToggleButton.setOnClickListener(new OnClickListener() { /* * (non-Javadoc) * @see android.view.View.OnClickListener#onClick(android.view.View) */ @Override public void onClick(View v) { // toggle selections of items to all or none ListView ls = getListView(); mToggled = !mToggled; // remove all items from selected list mSelected.clear(); for (int pos = 0; pos < ls.getCount(); pos++) { ls.setItemChecked(pos, mToggled); // add all items if mToggled sets to select all if (mToggled) mSelected.add(ls.getItemIdAtPosition(pos)); } mUploadButton.setEnabled(!(mSelected.size() == 0)); } }); // get all complete or failed submission instances String selection = InstanceColumns.STATUS + "=? or " + InstanceColumns.STATUS + "=?"; String selectionArgs[] = { InstanceProviderAPI.STATUS_COMPLETE, InstanceProviderAPI.STATUS_SUBMISSION_FAILED }; Cursor c = managedQuery(InstanceColumns.CONTENT_URI, null, selection, selectionArgs, null); startManagingCursor(c); String[] data = new String[] { InstanceColumns.DISPLAY_NAME, InstanceColumns.DISPLAY_SUBTEXT }; int[] view = new int[] { R.id.text1, R.id.text2 }; // render total instance view mInstances = new SimpleCursorAdapter(this, R.layout.two_item_multiple_choice, c, data, view); setListAdapter(mInstances); getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); getListView().setItemsCanFocus(false); mUploadButton.setEnabled(!(mSelected.size() == 0)); // set title setTitle(getString(R.string.app_name) + " > " + getString(R.string.send_data)); // if current activity is being reinitialized due to changing orientation restore all check // marks for ones selected if (mRestored) { ListView ls = getListView(); for (long id : mSelected) { for (int pos = 0; pos < ls.getCount(); pos++) { if (id == ls.getItemIdAtPosition(pos)) { ls.setItemChecked(pos, true); break; } } } mRestored = false; } } private void uploadSelectedFiles() { // send list of _IDs. long[] instanceIDs = new long[mSelected.size()]; for (int i = 0; i < mSelected.size(); i++) { instanceIDs[i] = mSelected.get(i); } Intent i = new Intent(this, InstanceUploaderActivity.class); i.putExtra(FormEntryActivity.KEY_INSTANCES, instanceIDs); startActivityForResult(i, INSTANCE_UPLOADER); } /* * (non-Javadoc) * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu) */ @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, MENU_PREFERENCES, 0, getString(R.string.general_preferences)).setIcon( android.R.drawable.ic_menu_preferences); return true; } /* * (non-Javadoc) * @see android.app.Activity#onMenuItemSelected(int, android.view.MenuItem) */ @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { switch (item.getItemId()) { case MENU_PREFERENCES: createPreferencesMenu(); return true; } return super.onMenuItemSelected(featureId, item); } private void createPreferencesMenu() { Intent i = new Intent(this, PreferencesActivity.class); startActivity(i); } /* * (non-Javadoc) * @see android.app.ListActivity#onListItemClick(android.widget.ListView, android.view.View, int, long) */ @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); // get row id from db Cursor c = (Cursor) getListAdapter().getItem(position); long k = c.getLong(c.getColumnIndex(InstanceColumns._ID)); // add/remove from selected list if (mSelected.contains(k)) mSelected.remove(k); else mSelected.add(k); mUploadButton.setEnabled(!(mSelected.size() == 0)); } /* * (non-Javadoc) * @see android.app.ListActivity#onRestoreInstanceState(android.os.Bundle) */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); long[] selectedArray = savedInstanceState.getLongArray(BUNDLE_SELECTED_ITEMS_KEY); for (int i = 0; i < selectedArray.length; i++) mSelected.add(selectedArray[i]); mToggled = savedInstanceState.getBoolean(BUNDLE_TOGGLED_KEY); mRestored = true; mUploadButton.setEnabled(selectedArray.length > 0); } /* * (non-Javadoc) * @see android.app.Activity#onSaveInstanceState(android.os.Bundle) */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); long[] selectedArray = new long[mSelected.size()]; for (int i = 0; i < mSelected.size(); i++) selectedArray[i] = mSelected.get(i); outState.putLongArray(BUNDLE_SELECTED_ITEMS_KEY, selectedArray); outState.putBoolean(BUNDLE_TOGGLED_KEY, mToggled); } /* * (non-Javadoc) * @see android.app.Activity#onActivityResult(int, int, android.content.Intent) */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (resultCode == RESULT_CANCELED) { return; } switch (requestCode) { // returns with a form path, start entry case INSTANCE_UPLOADER: if (intent.getBooleanExtra(FormEntryActivity.KEY_SUCCESS, false)) { mSelected.clear(); getListView().clearChoices(); if (mInstances.isEmpty()) { finish(); } } break; default: break; } super.onActivityResult(requestCode, resultCode, intent); } }