package org.magnum.soda.example.controllers.searchqrfragment; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import leadtools.demos.BitmapUtils; import leadtools.demos.BitmapUtils.GetBitmapListener; import org.magnum.soda.Callback; import org.magnum.soda.ThirdPartyIntent.IntentIntegrator; import org.magnum.soda.android.AndroidSoda; import org.magnum.soda.android.AndroidSodaListener; import org.magnum.soda.android.SodaInvokeInUi; import org.magnum.soda.android.ctx.SodaQR; import org.magnum.soda.ctx.ImageContainer; import org.magnum.soda.example.maint.LoginActivity; import org.magnum.soda.example.maint.MaintenanceReport; import org.magnum.soda.example.maint.MaintenanceReports; import org.magnum.soda.example.maint.R; import org.magnum.soda.example.maint.ReportEditorActivity; import org.magnum.soda.example.maint.ReportParcelable; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.ListView; import android.widget.SimpleAdapter; import com.actionbarsherlock.app.SherlockFragment; public class SearchQrFragment extends SherlockFragment implements AndroidSodaListener { private static final String TAG = SearchQrFragment.class.getName(); // UI references. private Button getQRImage; private Button getReport; private Button refresh; private Button mLoadDummyReportsButton; private ImageView qrImage; private Bitmap qrBitmap; private static SimpleAdapter mAdapter; private List<MaintenanceReport> mReportList = new ArrayList<MaintenanceReport>(); private List<HashMap<String, String>> mDisplayList = new ArrayList<HashMap<String, String>>(); private List<HashMap<String, MaintenanceReport>> mMapList = new ArrayList<HashMap<String, MaintenanceReport>>(); Context ctx_; static boolean imageLoaded = false; static Boolean mDataExecuted = false; private byte dataBytes[]; private static final int CAPTURE_IMAGE = 200; private static final String BITMAP_STORAGE_KEY = "qrbitmap"; private static final String LIST_STORAGE_KEY = "list"; private static final String JPEG_FILE_PREFIX = "IMG_"; private static final String JPEG_FILE_SUFFIX = ".jpg"; private AndroidSodaListener asl_ = null; private AndroidSoda as = null; private View mRootView; private ListView mReportsListView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { asl_ = this; ctx_ = this.getActivity(); Log.i(TAG, getActivity().toString()); mRootView = inflater.inflate(R.layout.fragment_search_qr, container, false); setupActionBar(); getQRImage = (Button) mRootView.findViewById(R.id.getQRCode); getReport = (Button) mRootView.findViewById(R.id.searchQRReports); refresh = (Button) mRootView.findViewById(R.id.Refresh); mReportsListView = (ListView) mRootView.findViewById(R.id.listViewListReports); mReportsListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.d(TAG, "onItemClicked: " + position); if(mReportList == null) { Log.d(TAG, "mReports was null"); return; } HashMap<String, String> map = (HashMap<String, String>) mReportsListView .getItemAtPosition(position); launchReportEditor(mReportList.get(position)); } }); mAdapter = new SimpleAdapter( this.getActivity(), mDisplayList,// data source R.layout.listview_item_nocheckbox, new String[] { "itemDescription" }, new int[] { R.id.item_description }); mAdapter.notifyDataSetChanged(); mReportsListView.setAdapter(mAdapter); mLoadDummyReportsButton = (Button) mRootView .findViewById(R.id.buttonLoadDummyReports); mLoadDummyReportsButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { displayDummyReports(); } }); qrImage = (ImageView) mRootView.findViewById(R.id.QRImage); getQRImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { captureQRImageIntent(ctx_); AndroidSoda.async(new Runnable() { @Override public void run() { while (!imageLoaded) { try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (qrBitmap != null) { dataBytes = getBytes(qrBitmap); } } }); } }); getReport.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AndroidSoda.init(ctx_, LoginActivity.mHost, 8081, asl_); } }); refresh.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); return mRootView; } private void populateList() { mDisplayList.clear(); mMapList.clear(); Iterator<MaintenanceReport> itr = mReportList.iterator(); while (itr.hasNext()) { HashMap<String, String> map = new HashMap<String, String>(); HashMap<String,MaintenanceReport> sm=new HashMap<String,MaintenanceReport>(); MaintenanceReport temp = ((MaintenanceReport) itr.next()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); String item = "Title:"+temp.getTitle()+"\n content:"+temp.getContents()+"\n"+temp.getCreatorId()+" "+ sdf.format(temp.getCreateTime_()); map.put("itemDescription", item); sm.put(item,temp); mMapList.add(sm); mDisplayList.add(map); } Log.e("size", ":" + mDisplayList.size()); getActivity().runOnUiThread(new Runnable() { @Override public void run() { mAdapter.notifyDataSetInvalidated(); mAdapter.notifyDataSetChanged(); Log.i(TAG,"after notifyDataSetChanged()"); } }); } private void launchReportEditor(MaintenanceReport report) { Log.d(TAG,"launcing report editor"); Intent i = new Intent(this.getActivity(), ReportEditorActivity.class); i.putExtra("mReport", new ReportParcelable(report)); startActivity(i); } private byte[] getBytes(Bitmap bmp) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); bmp.compress(CompressFormat.JPEG, 70 /* ignored for PNG */, bos); byte[] bitmapdata = bos.toByteArray(); return bitmapdata; } public void getReports() { List<Future> list = new ArrayList<Future>(); Future<?> Result = AndroidSoda.async(new Runnable() { @Override @SodaInvokeInUi public void run() { if (as != null) { Log.i(TAG, "conected"); MaintenanceReports reportHandle = as.get( MaintenanceReports.class, MaintenanceReports.SVC_NAME); reportHandle .getReports(new Callback<List<MaintenanceReport>>() { // @SodaInvokeInUi public void handle(List<MaintenanceReport> arg0) { mReportList = arg0; Log.i(TAG, "size of mReportList: " + mReportList.size()); populateList(); } }); Log.i(TAG, "obtained"); } } }); list.add(Result); for (Future f : list) { try { while (!f.isDone()) { } f.get(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private void displayDummyReports() { List<MaintenanceReport> dummyReports = new ArrayList<MaintenanceReport>(); final MaintenanceReport reportWithImage = new MaintenanceReport(); reportWithImage.setContents("This report has an image!"); reportWithImage.setTitle("Report with an image"); String url = "https://si0.twimg.com/profile_images/2725938749/60d4af1fa99056b83e9ccc746a81c88b.png"; BitmapUtils.getBitmapByteArrayFromUrlAsync(url, new GetBitmapListener<byte[]>() { @Override public void onResponse(byte[] bitmaps) { reportWithImage.setImageData(bitmaps); } }); dummyReports.add(reportWithImage); for (int i = 0; i < 10; ++i) { MaintenanceReport report = new MaintenanceReport(); report.setTitle("Report Title"); report.setCreateTime_(new Date()); report.setContents("These are the contents of this report."); if (i == 4) { report.setContents("The contents of this report are very very very very very long: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum"); } dummyReports.add(report); } mReportList = dummyReports; populateList(); } public static final int MEDIA_TYPE_IMAGE = 1; Uri fileUri = null; static File img = null; private void captureQRImageIntent(Context c) { IntentIntegrator integrator = new IntentIntegrator(this, this.getActivity()); integrator.initiateScan(); /* * Intent takePictureIntent = new * Intent(MediaStore.ACTION_IMAGE_CAPTURE); File f = null; try { f = * setUpPhotoFile("target"); f.getAbsolutePath(); takePictureIntent * .putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); } catch * (IOException e) { e.printStackTrace(); f = null; } * * startActivityForResult(takePictureIntent, CAPTURE_IMAGE); */ } public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); org.magnum.soda.ThirdPartyIntent.IntentResult scanResult = IntentIntegrator .parseActivityResult(requestCode, resultCode, data); if (scanResult != null) { SodaQR qr = SodaQR.create(scanResult.getContents()); ImageContainer img = qr.getImg_(); if (img.getQrCodeImage_() instanceof Bitmap) qrBitmap = (Bitmap) img.getQrCodeImage_(); // qrBitmap = scaleBitmap("/sdcard/IMG_target.jpg"); if (qrBitmap != null) { Log.i("SearchQrFragment", "qrBitmap not null."); qrImage.setImageBitmap(qrBitmap); qrImage.setScaleType(ImageView.ScaleType.CENTER_INSIDE); qrImage.setAdjustViewBounds(true); imageLoaded = true; } else Log.e("SearchQrFragment", "failure of loading image."); } } private Bitmap scaleBitmap(String filepath) { /* There isn't enough memory to open up more than a couple camera photos */ /* So pre-scale the target bitmap into which the file is decoded */ /* Get the size of the ImageView */ int targetW = qrImage.getWidth(); int targetH = qrImage.getHeight(); /* Get the size of the image */ BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(filepath, bmOptions); int photoW = bmOptions.outWidth; int photoH = bmOptions.outHeight; /* Figure out which way needs to be reduced less */ int scaleFactor = 1; if ((targetW > 0) || (targetH > 0)) { scaleFactor = Math.min(photoW / targetW, photoH / targetH); } /* Set bitmap options to scale the image decode target */ bmOptions.inJustDecodeBounds = false; bmOptions.inSampleSize = scaleFactor; bmOptions.inPurgeable = true; /* Decode the JPEG file into a Bitmap */ Bitmap bitmap = BitmapFactory.decodeFile(filepath, bmOptions); return bitmap; } private File createImageFile(String name) throws IOException { String imageFileName = JPEG_FILE_PREFIX + name; File imageF = new File("/sdcard/" + imageFileName + JPEG_FILE_SUFFIX); if (!imageF.exists()) { imageF.createNewFile(); } return imageF; } private File setUpPhotoFile(String name) throws IOException { File f = createImageFile(name); f.getAbsolutePath(); return f; } // Some lifecycle callbacks so that the image can survive orientation change @Override public void onSaveInstanceState(Bundle outState) { outState.putParcelable(BITMAP_STORAGE_KEY, qrBitmap); super.onSaveInstanceState(outState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { qrBitmap = savedInstanceState.getParcelable(BITMAP_STORAGE_KEY); qrImage.setImageBitmap(qrBitmap); } } @Override public void connected(AndroidSoda s) { this.as = s; getReports(); } private void setupActionBar() { final com.actionbarsherlock.app.ActionBar bar = getSherlockActivity() .getSupportActionBar(); bar.hide(); } }