Require Android API 19, so fully use Java 7 try-with-resources, as well as a few other Java 7 features. Reduce deprecation warning count in android
diff --git a/android-integration/src/main/java/com/google/zxing/integration/android/IntentIntegrator.java b/android-integration/src/main/java/com/google/zxing/integration/android/IntentIntegrator.java
index 4eb5681..45feb2d 100644
--- a/android-integration/src/main/java/com/google/zxing/integration/android/IntentIntegrator.java
+++ b/android-integration/src/main/java/com/google/zxing/integration/android/IntentIntegrator.java
@@ -138,6 +138,10 @@
           BS_PACKAGE                  // Barcode Scanner          
           // What else supports this intent?
       );
+
+  // Should be FLAG_ACTIVITY_NEW_DOCUMENT in API 21+.
+  // Defined once here because the current value is deprecated, so generates just one warning
+  private static final int FLAG_NEW_DOC = Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
   
   private final Activity activity;
   private final Fragment fragment;
@@ -320,7 +324,7 @@
     }
     intentScan.setPackage(targetAppPackage);
     intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-    intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+    intentScan.addFlags(FLAG_NEW_DOC);
     attachMoreExtras(intentScan);
     startActivityForResult(intentScan, REQUEST_CODE);
     return null;
@@ -466,7 +470,7 @@
     }
     intent.setPackage(targetAppPackage);
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+    intent.addFlags(FLAG_NEW_DOC);
     attachMoreExtras(intent);
     if (fragment == null) {
       activity.startActivity(intent);
diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
index 5bb5eef..8d1851a 100755
--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -31,7 +31,7 @@
   <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
   <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
 
-  <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="22"/>
+  <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="22"/>
 
   <uses-feature android:name="android.hardware.camera.any"/>
   <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
diff --git a/android/src/com/google/zxing/client/android/BeepManager.java b/android/src/com/google/zxing/client/android/BeepManager.java
index 39779a0..0baa34d 100644
--- a/android/src/com/google/zxing/client/android/BeepManager.java
+++ b/android/src/com/google/zxing/client/android/BeepManager.java
@@ -86,13 +86,8 @@
 
   private MediaPlayer buildMediaPlayer(Context activity) {
     MediaPlayer mediaPlayer = new MediaPlayer();
-    try {
-      AssetFileDescriptor file = activity.getResources().openRawResourceFd(R.raw.beep);
-      try {
-        mediaPlayer.setDataSource(file.getFileDescriptor(), file.getStartOffset(), file.getLength());
-      } finally {
-        file.close();
-      }
+    try (AssetFileDescriptor file = activity.getResources().openRawResourceFd(R.raw.beep)) {
+      mediaPlayer.setDataSource(file.getFileDescriptor(), file.getStartOffset(), file.getLength());
       mediaPlayer.setOnErrorListener(this);
       mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
       mediaPlayer.setLooping(false);
diff --git a/android/src/com/google/zxing/client/android/CaptureActivity.java b/android/src/com/google/zxing/client/android/CaptureActivity.java
index e1a27a9..ca01d72 100755
--- a/android/src/com/google/zxing/client/android/CaptureActivity.java
+++ b/android/src/com/google/zxing/client/android/CaptureActivity.java
@@ -361,7 +361,7 @@
   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
     Intent intent = new Intent(Intent.ACTION_VIEW);
-    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+    intent.addFlags(Intents.FLAG_NEW_DOC);
     switch (item.getItemId()) {
       case R.id.menu_share:
         intent.setClassName(this, ShareActivity.class.getName());
@@ -642,7 +642,7 @@
         // Hand back whatever action they requested - this can be changed to Intents.Scan.ACTION when
         // the deprecated intent is retired.
         Intent intent = new Intent(getIntent().getAction());
-        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+        intent.addFlags(Intents.FLAG_NEW_DOC);
         intent.putExtra(Intents.Scan.RESULT, rawResult.toString());
         intent.putExtra(Intents.Scan.RESULT_FORMAT, rawResult.getBarcodeFormat().toString());
         byte[] rawBytes = rawResult.getRawBytes();
diff --git a/android/src/com/google/zxing/client/android/CaptureActivityHandler.java b/android/src/com/google/zxing/client/android/CaptureActivityHandler.java
index 85aaf29..c5bddd9 100755
--- a/android/src/com/google/zxing/client/android/CaptureActivityHandler.java
+++ b/android/src/com/google/zxing/client/android/CaptureActivityHandler.java
@@ -110,7 +110,7 @@
         String url = (String) message.obj;
 
         Intent intent = new Intent(Intent.ACTION_VIEW);
-        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+        intent.addFlags(Intents.FLAG_NEW_DOC);
         intent.setData(Uri.parse(url));
 
         ResolveInfo resolveInfo =
@@ -122,10 +122,13 @@
         }
 
         // Needed for default Android browser / Chrome only apparently
-        if ("com.android.browser".equals(browserPackageName) || "com.android.chrome".equals(browserPackageName)) {
-          intent.setPackage(browserPackageName);
-          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-          intent.putExtra(Browser.EXTRA_APPLICATION_ID, browserPackageName);
+        switch (browserPackageName) {
+          case "com.android.browser":
+          case "com.android.chrome":
+            intent.setPackage(browserPackageName);
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            intent.putExtra(Browser.EXTRA_APPLICATION_ID, browserPackageName);
+            break;
         }
 
         try {
diff --git a/android/src/com/google/zxing/client/android/HttpHelper.java b/android/src/com/google/zxing/client/android/HttpHelper.java
index b4fe7e1..3f85beb 100644
--- a/android/src/com/google/zxing/client/android/HttpHelper.java
+++ b/android/src/com/google/zxing/client/android/HttpHelper.java
@@ -144,22 +144,12 @@
   private static CharSequence consume(URLConnection connection, int maxChars) throws IOException {
     String encoding = getEncoding(connection);
     StringBuilder out = new StringBuilder();
-    Reader in = null;
-    try {
-      in = new InputStreamReader(connection.getInputStream(), encoding);
+    try (Reader in = new InputStreamReader(connection.getInputStream(), encoding)) {
       char[] buffer = new char[1024];
       int charsRead;
       while (out.length() < maxChars && (charsRead = in.read(buffer)) > 0) {
         out.append(buffer, 0, charsRead);
       }
-    } finally {
-      if (in != null) {
-        try {
-          in.close();
-        } catch (IOException | NullPointerException ioe) {
-          // continue
-        }
-      }
     }
     return out;
   }
diff --git a/android/src/com/google/zxing/client/android/Intents.java b/android/src/com/google/zxing/client/android/Intents.java
index 4ed483c..c11963c 100755
--- a/android/src/com/google/zxing/client/android/Intents.java
+++ b/android/src/com/google/zxing/client/android/Intents.java
@@ -16,6 +16,8 @@
 
 package com.google.zxing.client.android;
 
+import android.content.Intent;
+
 /**
  * This class provides the constants to use when sending an Intent to Barcode Scanner.
  * These strings are effectively API and cannot be changed.
@@ -128,14 +130,14 @@
     public static final String RESULT = "SCAN_RESULT";
 
     /**
-     * Call {@link android.content.Intent#getStringExtra(String)} with {@link #RESULT_FORMAT}
+     * Call {@link android.content.Intent#getStringExtra(String)} with {@code RESULT_FORMAT}
      * to determine which barcode format was found.
      * See {@link com.google.zxing.BarcodeFormat} for possible values.
      */
     public static final String RESULT_FORMAT = "SCAN_RESULT_FORMAT";
 
     /**
-     * Call {@link android.content.Intent#getStringExtra(String)} with {@link #RESULT_UPC_EAN_EXTENSION}
+     * Call {@link android.content.Intent#getStringExtra(String)} with {@code RESULT_UPC_EAN_EXTENSION}
      * to return the content of any UPC extension barcode that was also found. Only applicable
      * to {@link com.google.zxing.BarcodeFormat#UPC_A} and {@link com.google.zxing.BarcodeFormat#EAN_13}
      * formats.
@@ -143,20 +145,20 @@
     public static final String RESULT_UPC_EAN_EXTENSION = "SCAN_RESULT_UPC_EAN_EXTENSION";
 
     /**
-     * Call {@link android.content.Intent#getByteArrayExtra(String)} with {@link #RESULT_BYTES}
+     * Call {@link android.content.Intent#getByteArrayExtra(String)} with {@code RESULT_BYTES}
      * to get a {@code byte[]} of raw bytes in the barcode, if available.
      */
     public static final String RESULT_BYTES = "SCAN_RESULT_BYTES";
 
     /**
      * Key for the value of {@link com.google.zxing.ResultMetadataType#ORIENTATION}, if available.
-     * Call {@link android.content.Intent#getIntArrayExtra(String)} with {@link #RESULT_ORIENTATION}.
+     * Call {@link android.content.Intent#getIntArrayExtra(String)} with {@code RESULT_ORIENTATION}.
      */
     public static final String RESULT_ORIENTATION = "SCAN_RESULT_ORIENTATION";
 
     /**
      * Key for the value of {@link com.google.zxing.ResultMetadataType#ERROR_CORRECTION_LEVEL}, if available.
-     * Call {@link android.content.Intent#getStringExtra(String)} with {@link #RESULT_ERROR_CORRECTION_LEVEL}.
+     * Call {@link android.content.Intent#getStringExtra(String)} with {@code RESULT_ERROR_CORRECTION_LEVEL}.
      */
     public static final String RESULT_ERROR_CORRECTION_LEVEL = "SCAN_RESULT_ERROR_CORRECTION_LEVEL";
 
@@ -293,4 +295,9 @@
     private Share() {
     }
   }
+
+  // Not the best place for this, but, better than a new class
+  // Should be FLAG_ACTIVITY_NEW_DOCUMENT in API 21+.
+  // Defined once here because the current value is deprecated, so generates just one warning
+  public static final int FLAG_NEW_DOC = Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
 }
diff --git a/android/src/com/google/zxing/client/android/book/BrowseBookListener.java b/android/src/com/google/zxing/client/android/book/BrowseBookListener.java
index c00bd6e..c52aad0 100644
--- a/android/src/com/google/zxing/client/android/book/BrowseBookListener.java
+++ b/android/src/com/google/zxing/client/android/book/BrowseBookListener.java
@@ -20,6 +20,7 @@
 import android.net.Uri;
 import android.view.View;
 import android.widget.AdapterView;
+import com.google.zxing.client.android.Intents;
 import com.google.zxing.client.android.LocaleManager;
 
 import java.util.List;
@@ -54,7 +55,7 @@
           LocaleManager.getBookSearchCountryTLD(activity) +
           "/books?id=" + volumeId + "&pg=" + pageId + "&vq=" + query;
       Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(readBookURI));
-      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);                    
+      intent.addFlags(Intents.FLAG_NEW_DOC);
       activity.startActivity(intent);
     }
   }
diff --git a/android/src/com/google/zxing/client/android/book/SearchBookContentsActivity.java b/android/src/com/google/zxing/client/android/book/SearchBookContentsActivity.java
index 48a2a66..6dbe4c9 100644
--- a/android/src/com/google/zxing/client/android/book/SearchBookContentsActivity.java
+++ b/android/src/com/google/zxing/client/android/book/SearchBookContentsActivity.java
@@ -175,12 +175,9 @@
         }
         CharSequence content = HttpHelper.downloadViaHttp(uri, HttpHelper.ContentType.JSON);
         return new JSONObject(content.toString());
-      } catch (IOException ioe) {
+      } catch (IOException | JSONException ioe) {
         Log.w(TAG, "Error accessing book search", ioe);
         return null;
-      } catch (JSONException je) {
-        Log.w(TAG, "Error accessing book search", je);
-        return null;
       }
     }
 
diff --git a/android/src/com/google/zxing/client/android/encode/ContactEncoder.java b/android/src/com/google/zxing/client/android/encode/ContactEncoder.java
index 41639a9..d1a38a6 100644
--- a/android/src/com/google/zxing/client/android/encode/ContactEncoder.java
+++ b/android/src/com/google/zxing/client/android/encode/ContactEncoder.java
@@ -16,6 +16,8 @@
 
 package com.google.zxing.client.android.encode;
 
+import android.telephony.PhoneNumberUtils;
+
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
@@ -93,4 +95,9 @@
     }
   }
 
+  static String formatPhone(String phoneData) {
+    // Just collect the call to a deprecated method in one place
+    return PhoneNumberUtils.formatNumber(phoneData);
+  }
+
 }
diff --git a/android/src/com/google/zxing/client/android/encode/EncodeActivity.java b/android/src/com/google/zxing/client/android/encode/EncodeActivity.java
index cc433dd..3488dfd 100755
--- a/android/src/com/google/zxing/client/android/encode/EncodeActivity.java
+++ b/android/src/com/google/zxing/client/android/encode/EncodeActivity.java
@@ -40,7 +40,6 @@
 import android.widget.TextView;
 
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.regex.Pattern;
@@ -150,22 +149,12 @@
       Log.w(TAG, "Could not delete " + barcodeFile);
       // continue anyway
     }
-    FileOutputStream fos = null;
-    try {
-      fos = new FileOutputStream(barcodeFile);
+    try (FileOutputStream fos = new FileOutputStream(barcodeFile)) {
       bitmap.compress(Bitmap.CompressFormat.PNG, 0, fos);
-    } catch (FileNotFoundException fnfe) {
-      Log.w(TAG, "Couldn't access file " + barcodeFile + " due to " + fnfe);
+    } catch (IOException ioe) {
+      Log.w(TAG, "Couldn't access file " + barcodeFile + " due to " + ioe);
       showErrorMessage(R.string.msg_unmount_usb);
       return;
-    } finally {
-      if (fos != null) {
-        try {
-          fos.close();
-        } catch (IOException ioe) {
-          // do nothing
-        }
-      }
     }
 
     Intent intent = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
@@ -173,7 +162,7 @@
     intent.putExtra(Intent.EXTRA_TEXT, contents);
     intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + barcodeFile.getAbsolutePath()));
     intent.setType("image/png");
-    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+    intent.addFlags(Intents.FLAG_NEW_DOC);
     startActivity(Intent.createChooser(intent, null));
   }
 
diff --git a/android/src/com/google/zxing/client/android/encode/MECARDContactEncoder.java b/android/src/com/google/zxing/client/android/encode/MECARDContactEncoder.java
index c7b810e..c6cd355 100644
--- a/android/src/com/google/zxing/client/android/encode/MECARDContactEncoder.java
+++ b/android/src/com/google/zxing/client/android/encode/MECARDContactEncoder.java
@@ -16,8 +16,6 @@
 
 package com.google.zxing.client.android.encode;
 
-import android.telephony.PhoneNumberUtils;
-
 import java.util.List;
 import java.util.regex.Pattern;
 
@@ -82,7 +80,7 @@
     private static final Pattern NOT_DIGITS_OR_PLUS = Pattern.compile("[^0-9+]+");
     @Override
     public CharSequence format(CharSequence value, int index) {
-      return NOT_DIGITS_OR_PLUS.matcher(PhoneNumberUtils.formatNumber(value.toString())).replaceAll("");
+      return NOT_DIGITS_OR_PLUS.matcher(ContactEncoder.formatPhone(value.toString())).replaceAll("");
     }
   }
 
diff --git a/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java b/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java
index 58003c7..bd84b8f 100755
--- a/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java
+++ b/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java
@@ -35,7 +35,6 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.ContactsContract;
-import android.telephony.PhoneNumberUtils;
 import android.util.Log;
 
 import java.io.ByteArrayOutputStream;
@@ -185,9 +184,7 @@
     }
     byte[] vcard;
     String vcardString;
-    InputStream stream = null;
-    try {
-      stream = activity.getContentResolver().openInputStream(uri);
+    try (InputStream stream = activity.getContentResolver().openInputStream(uri)) {
       if (stream == null) {
         throw new WriterException("Can't open stream for " + uri);
       }
@@ -201,14 +198,6 @@
       vcardString = new String(vcard, 0, vcard.length, "UTF-8");
     } catch (IOException ioe) {
       throw new WriterException(ioe);
-    } finally {
-      if (stream != null) {
-        try {
-          stream.close();
-        } catch (IOException e) {
-          // continue
-        }
-      }
     }
     Log.d(TAG, "Encoding share intent content:");
     Log.d(TAG, vcardString);
@@ -247,7 +236,7 @@
         String phoneData = ContactEncoder.trim(intent.getStringExtra(Intents.Encode.DATA));
         if (phoneData != null) {
           contents = "tel:" + phoneData;
-          displayContents = PhoneNumberUtils.formatNumber(phoneData);
+          displayContents = ContactEncoder.formatPhone(phoneData);
           title = activity.getString(R.string.contents_phone);
         }
         break;
@@ -256,7 +245,7 @@
         String smsData = ContactEncoder.trim(intent.getStringExtra(Intents.Encode.DATA));
         if (smsData != null) {
           contents = "sms:" + smsData;
-          displayContents = PhoneNumberUtils.formatNumber(smsData);
+          displayContents = ContactEncoder.formatPhone(smsData);
           title = activity.getString(R.string.contents_sms);
         }
         break;
diff --git a/android/src/com/google/zxing/client/android/encode/VCardTelDisplayFormatter.java b/android/src/com/google/zxing/client/android/encode/VCardTelDisplayFormatter.java
index f5eec9b..fd59b02 100644
--- a/android/src/com/google/zxing/client/android/encode/VCardTelDisplayFormatter.java
+++ b/android/src/com/google/zxing/client/android/encode/VCardTelDisplayFormatter.java
@@ -16,8 +16,6 @@
 
 package com.google.zxing.client.android.encode;
 
-import android.telephony.PhoneNumberUtils;
-
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -40,7 +38,7 @@
 
   @Override
   public CharSequence format(CharSequence value, int index) {
-    value = PhoneNumberUtils.formatNumber(value.toString());
+    value = ContactEncoder.formatPhone(value.toString());
     Map<String,Set<String>> metadata =
         metadataForIndex == null || metadataForIndex.size() <= index ? null : metadataForIndex.get(index);
     value = formatMetadata(value, metadata);
diff --git a/android/src/com/google/zxing/client/android/history/HistoryActivity.java b/android/src/com/google/zxing/client/android/history/HistoryActivity.java
index 2c63c2e..4eff161 100644
--- a/android/src/com/google/zxing/client/android/history/HistoryActivity.java
+++ b/android/src/com/google/zxing/client/android/history/HistoryActivity.java
@@ -128,7 +128,7 @@
           builder.show();
         } else {
           Intent intent = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
-          intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+          intent.addFlags(Intents.FLAG_NEW_DOC);
           String subject = getResources().getString(R.string.history_email_title);
           intent.putExtra(Intent.EXTRA_SUBJECT, subject);
           intent.putExtra(Intent.EXTRA_TEXT, subject);
diff --git a/android/src/com/google/zxing/client/android/history/HistoryManager.java b/android/src/com/google/zxing/client/android/history/HistoryManager.java
index 913c310..a429fd4 100644
--- a/android/src/com/google/zxing/client/android/history/HistoryManager.java
+++ b/android/src/com/google/zxing/client/android/history/HistoryManager.java
@@ -39,7 +39,7 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
-import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.text.DateFormat;
 import java.util.ArrayList;
 import java.util.List;
@@ -81,29 +81,24 @@
 
   public boolean hasHistoryItems() {
     SQLiteOpenHelper helper = new DBHelper(activity);
-    SQLiteDatabase db = null;
-    Cursor cursor = null;
-    try {
-      db = helper.getReadableDatabase();
-      cursor = db.query(DBHelper.TABLE_NAME, COUNT_COLUMN, null, null, null, null, null);
+    try (SQLiteDatabase db = helper.getReadableDatabase();
+         Cursor cursor = db.query(DBHelper.TABLE_NAME, COUNT_COLUMN, null, null, null, null, null)) {
       cursor.moveToFirst();
       return cursor.getInt(0) > 0;
     } catch (SQLException sqle) {
       Log.w(TAG, sqle);
       return false;
-    } finally {
-      close(cursor, db);
     }
   }
 
   public List<HistoryItem> buildHistoryItems() {
     SQLiteOpenHelper helper = new DBHelper(activity);
     List<HistoryItem> items = new ArrayList<>();
-    SQLiteDatabase db = null;
-    Cursor cursor = null;
-    try {
-      db = helper.getReadableDatabase();
-      cursor = db.query(DBHelper.TABLE_NAME, COLUMNS, null, null, null, null, DBHelper.TIMESTAMP_COL + " DESC");
+    try (SQLiteDatabase db = helper.getReadableDatabase();
+         Cursor cursor = db.query(DBHelper.TABLE_NAME,
+                                  COLUMNS,
+                                  null, null, null, null,
+                                  DBHelper.TIMESTAMP_COL + " DESC")) {
       while (cursor.moveToNext()) {
         String text = cursor.getString(0);
         String display = cursor.getString(1);
@@ -115,20 +110,17 @@
       }
     } catch (CursorIndexOutOfBoundsException cioobe) {
       Log.w(TAG, cioobe);
-      // continue
-    } finally {
-      close(cursor, db);
     }
     return items;
   }
 
   public HistoryItem buildHistoryItem(int number) {
     SQLiteOpenHelper helper = new DBHelper(activity);
-    SQLiteDatabase db = null;
-    Cursor cursor = null;
-    try {
-      db = helper.getReadableDatabase();
-      cursor = db.query(DBHelper.TABLE_NAME, COLUMNS, null, null, null, null, DBHelper.TIMESTAMP_COL + " DESC");
+    try (SQLiteDatabase db = helper.getReadableDatabase();
+         Cursor cursor = db.query(DBHelper.TABLE_NAME,
+                                  COLUMNS,
+                                  null, null, null, null,
+                                  DBHelper.TIMESTAMP_COL + " DESC")) {
       cursor.move(number + 1);
       String text = cursor.getString(0);
       String display = cursor.getString(1);
@@ -137,27 +129,20 @@
       String details = cursor.getString(4);
       Result result = new Result(text, null, null, BarcodeFormat.valueOf(format), timestamp);
       return new HistoryItem(result, display, details);
-    } finally {
-      close(cursor, db);
     }
   }
   
   public void deleteHistoryItem(int number) {
     SQLiteOpenHelper helper = new DBHelper(activity);
-    SQLiteDatabase db = null;
-    Cursor cursor = null;
-    try {
-      db = helper.getWritableDatabase();      
-      cursor = db.query(DBHelper.TABLE_NAME,
-                        ID_COL_PROJECTION,
-                        null, null, null, null,
-                        DBHelper.TIMESTAMP_COL + " DESC");
+    try (SQLiteDatabase db = helper.getWritableDatabase();
+         Cursor cursor = db.query(DBHelper.TABLE_NAME,
+                                  ID_COL_PROJECTION,
+                                  null, null, null, null,
+                                  DBHelper.TIMESTAMP_COL + " DESC")) {
       cursor.move(number + 1);
       db.delete(DBHelper.TABLE_NAME, DBHelper.ID_COL + '=' + cursor.getString(0), null);
     } catch (SQLException sqle) {
       Log.w(TAG, sqle);
-    } finally {
-      close(cursor, db);
     }
   }
 
@@ -181,13 +166,9 @@
     values.put(DBHelper.TIMESTAMP_COL, System.currentTimeMillis());
 
     SQLiteOpenHelper helper = new DBHelper(activity);
-    SQLiteDatabase db = null;
-    try {
-      db = helper.getWritableDatabase();      
+    try (SQLiteDatabase db = helper.getWritableDatabase()) {
       // Insert the new entry into the DB.
       db.insert(DBHelper.TABLE_NAME, DBHelper.TIMESTAMP_COL, values);
-    } finally {
-      close(null, db);
     }
   }
 
@@ -195,18 +176,15 @@
     // As we're going to do an update only we don't need need to worry
     // about the preferences; if the item wasn't saved it won't be udpated
     SQLiteOpenHelper helper = new DBHelper(activity);
-    SQLiteDatabase db = null;    
-    Cursor cursor = null;
-    try {
-      db = helper.getWritableDatabase();
-      cursor = db.query(DBHelper.TABLE_NAME,
-                        ID_DETAIL_COL_PROJECTION,
-                        DBHelper.TEXT_COL + "=?",
-                        new String[] { itemID },
-                        null,
-                        null,
-                        DBHelper.TIMESTAMP_COL + " DESC",
-                        "1");
+    try (SQLiteDatabase db = helper.getWritableDatabase();
+         Cursor cursor = db.query(DBHelper.TABLE_NAME,
+                                  ID_DETAIL_COL_PROJECTION,
+                                  DBHelper.TEXT_COL + "=?",
+                                  new String[] { itemID },
+                                  null,
+                                  null,
+                                  DBHelper.TIMESTAMP_COL + " DESC",
+                                  "1")) {
       String oldID = null;
       String oldDetails = null;
       if (cursor.moveToNext()) {
@@ -229,35 +207,25 @@
           db.update(DBHelper.TABLE_NAME, values, DBHelper.ID_COL + "=?", new String[] { oldID });
         }
       }
-
-    } finally {
-      close(cursor, db);
     }
   }
 
   private void deletePrevious(String text) {
     SQLiteOpenHelper helper = new DBHelper(activity);
-    SQLiteDatabase db = null;
-    try {
-      db = helper.getWritableDatabase();      
+    try (SQLiteDatabase db = helper.getWritableDatabase()) {
       db.delete(DBHelper.TABLE_NAME, DBHelper.TEXT_COL + "=?", new String[] { text });
     } catch (SQLException sqle) {
       Log.w(TAG, sqle);
-    } finally {
-      close(null, db);
     }
   }
 
   public void trimHistory() {
     SQLiteOpenHelper helper = new DBHelper(activity);
-    SQLiteDatabase db = null;
-    Cursor cursor = null;
-    try {
-      db = helper.getWritableDatabase();      
-      cursor = db.query(DBHelper.TABLE_NAME,
-                        ID_COL_PROJECTION,
-                        null, null, null, null,
-                        DBHelper.TIMESTAMP_COL + " DESC");
+    try (SQLiteDatabase db = helper.getWritableDatabase();
+         Cursor cursor = db.query(DBHelper.TABLE_NAME,
+                                  ID_COL_PROJECTION,
+                                  null, null, null, null,
+                                  DBHelper.TIMESTAMP_COL + " DESC")) {
       cursor.move(MAX_ITEMS);
       while (cursor.moveToNext()) {
         String id = cursor.getString(0);
@@ -265,12 +233,7 @@
         db.delete(DBHelper.TABLE_NAME, DBHelper.ID_COL + '=' + id, null);
       }
     } catch (SQLException sqle) {
-      // We're seeing an error here when called in CaptureActivity.onCreate() in rare cases
-      // and don't understand it. First theory is that it's transient so can be safely ignored.
       Log.w(TAG, sqle);
-      // continue
-    } finally {
-      close(cursor, db);
     }
   }
 
@@ -291,15 +254,11 @@
    */
   CharSequence buildHistory() {
     SQLiteOpenHelper helper = new DBHelper(activity);
-    SQLiteDatabase db = null;
-    Cursor cursor = null;
-    try {
-      db = helper.getWritableDatabase();
-      cursor = db.query(DBHelper.TABLE_NAME,
-                        COLUMNS,
-                        null, null, null, null,
-                        DBHelper.TIMESTAMP_COL + " DESC");
-
+    try (SQLiteDatabase db = helper.getWritableDatabase();
+         Cursor cursor = db.query(DBHelper.TABLE_NAME,
+                                  COLUMNS,
+                                  null, null, null, null,
+                                  DBHelper.TIMESTAMP_COL + " DESC")) {
       DateFormat format = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
       StringBuilder historyText = new StringBuilder(1000);
       while (cursor.moveToNext()) {
@@ -318,21 +277,15 @@
         historyText.append('"').append(massageHistoryField(cursor.getString(4))).append("\"\r\n");
       }
       return historyText;
-    } finally {
-      close(cursor, db);
     }
   }
   
   void clearHistory() {
     SQLiteOpenHelper helper = new DBHelper(activity);
-    SQLiteDatabase db = null;
-    try {
-      db = helper.getWritableDatabase();      
+    try (SQLiteDatabase db = helper.getWritableDatabase()) {
       db.delete(DBHelper.TABLE_NAME, null, null);
     } catch (SQLException sqle) {
       Log.w(TAG, sqle);
-    } finally {
-      close(null, db);
     }
   }
 
@@ -344,36 +297,17 @@
       return null;
     }
     File historyFile = new File(historyRoot, "history-" + System.currentTimeMillis() + ".csv");
-    OutputStreamWriter out = null;
-    try {
-      out = new OutputStreamWriter(new FileOutputStream(historyFile), Charset.forName("UTF-8"));
+    try (OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(historyFile), StandardCharsets.UTF_8)) {
       out.write(history);
       return Uri.parse("file://" + historyFile.getAbsolutePath());
     } catch (IOException ioe) {
       Log.w(TAG, "Couldn't access file " + historyFile + " due to " + ioe);
       return null;
-    } finally {
-      if (out != null) {
-        try {
-          out.close();
-        } catch (IOException ioe) {
-          // do nothing
-        }
-      }
     }
   }
 
   private static String massageHistoryField(String value) {
     return value == null ? "" : DOUBLE_QUOTE.matcher(value).replaceAll("\"\"");
   }
-  
-  private static void close(Cursor cursor, SQLiteDatabase database) {
-    if (cursor != null) {
-      cursor.close();
-    }
-    if (database != null) {
-      database.close();
-    }
-  }
 
 }
diff --git a/android/src/com/google/zxing/client/android/result/AddressBookResultHandler.java b/android/src/com/google/zxing/client/android/result/AddressBookResultHandler.java
index 70db5d9..034f67e 100644
--- a/android/src/com/google/zxing/client/android/result/AddressBookResultHandler.java
+++ b/android/src/com/google/zxing/client/android/result/AddressBookResultHandler.java
@@ -22,7 +22,6 @@
 
 import android.app.Activity;
 import android.graphics.Typeface;
-import android.telephony.PhoneNumberUtils;
 import android.text.Spannable;
 import android.text.SpannableString;
 import android.text.style.StyleSpan;
@@ -183,7 +182,7 @@
     if (numbers != null) {
       for (String number : numbers) {
         if (number != null) {
-          ParsedResult.maybeAppend(PhoneNumberUtils.formatNumber(number), contents);
+          ParsedResult.maybeAppend(formatPhone(number), contents);
         }
       }
     }
diff --git a/android/src/com/google/zxing/client/android/result/ResultHandler.java b/android/src/com/google/zxing/client/android/result/ResultHandler.java
index 74a120e..7de8d84 100644
--- a/android/src/com/google/zxing/client/android/result/ResultHandler.java
+++ b/android/src/com/google/zxing/client/android/result/ResultHandler.java
@@ -16,6 +16,7 @@
 
 package com.google.zxing.client.android.result;
 
+import android.telephony.PhoneNumberUtils;
 import com.google.zxing.Result;
 import com.google.zxing.client.android.Contents;
 import com.google.zxing.client.android.Intents;
@@ -450,7 +451,7 @@
    */
   final void rawLaunchIntent(Intent intent) {
     if (intent != null) {
-      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+      intent.addFlags(Intents.FLAG_NEW_DOC);
       Log.d(TAG, "Launching intent: " + intent + " with extras: " + intent.getExtras());
       activity.startActivity(intent);
     }
@@ -510,4 +511,9 @@
     return url.replace("%s", text);
   }
 
+  static String formatPhone(String phoneData) {
+    // Just collect the call to a deprecated method in one place
+    return PhoneNumberUtils.formatNumber(phoneData);
+  }
+
 }
diff --git a/android/src/com/google/zxing/client/android/result/SMSResultHandler.java b/android/src/com/google/zxing/client/android/result/SMSResultHandler.java
index 8a95943..4e303de 100644
--- a/android/src/com/google/zxing/client/android/result/SMSResultHandler.java
+++ b/android/src/com/google/zxing/client/android/result/SMSResultHandler.java
@@ -21,7 +21,6 @@
 import com.google.zxing.client.result.SMSParsedResult;
 
 import android.app.Activity;
-import android.telephony.PhoneNumberUtils;
 
 /**
  * Handles SMS addresses, offering a choice of composing a new SMS or MMS message.
@@ -69,7 +68,7 @@
     String[] rawNumbers = smsResult.getNumbers();
     String[] formattedNumbers = new String[rawNumbers.length];
     for (int i = 0; i < rawNumbers.length; i++) {
-      formattedNumbers[i] = PhoneNumberUtils.formatNumber(rawNumbers[i]);
+      formattedNumbers[i] = formatPhone(rawNumbers[i]);
     }
     StringBuilder contents = new StringBuilder(50);
     ParsedResult.maybeAppend(formattedNumbers, contents);
diff --git a/android/src/com/google/zxing/client/android/result/TelResultHandler.java b/android/src/com/google/zxing/client/android/result/TelResultHandler.java
index 325eb6b..23b395a 100644
--- a/android/src/com/google/zxing/client/android/result/TelResultHandler.java
+++ b/android/src/com/google/zxing/client/android/result/TelResultHandler.java
@@ -21,7 +21,6 @@
 import com.google.zxing.client.result.TelParsedResult;
 
 import android.app.Activity;
-import android.telephony.PhoneNumberUtils;
 
 /**
  * Offers relevant actions for telephone numbers.
@@ -72,7 +71,7 @@
   public CharSequence getDisplayContents() {
     String contents = getResult().getDisplayResult();
     contents = contents.replace("\r", "");
-    return PhoneNumberUtils.formatNumber(contents);
+    return formatPhone(contents);
   }
 
   @Override
diff --git a/android/src/com/google/zxing/client/android/share/AppPickerActivity.java b/android/src/com/google/zxing/client/android/share/AppPickerActivity.java
index 2b05c2b..8b45fc5 100644
--- a/android/src/com/google/zxing/client/android/share/AppPickerActivity.java
+++ b/android/src/com/google/zxing/client/android/share/AppPickerActivity.java
@@ -22,6 +22,7 @@
 import android.view.View;
 import android.widget.Adapter;
 import android.widget.ListView;
+import com.google.zxing.client.android.Intents;
 
 import java.util.List;
 
@@ -55,7 +56,7 @@
     if (position >= 0 && position < adapter.getCount()) {
       String packageName = ((AppInfo) adapter.getItem(position)).getPackageName();
       Intent intent = new Intent();
-      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+      intent.addFlags(Intents.FLAG_NEW_DOC);
       intent.putExtra("url", "market://details?id=" + packageName); // Browser.BookmarkColumns.URL
       setResult(RESULT_OK, intent);
     } else {
diff --git a/android/src/com/google/zxing/client/android/share/BookmarkPickerActivity.java b/android/src/com/google/zxing/client/android/share/BookmarkPickerActivity.java
index ddc9890..e7d2c11 100644
--- a/android/src/com/google/zxing/client/android/share/BookmarkPickerActivity.java
+++ b/android/src/com/google/zxing/client/android/share/BookmarkPickerActivity.java
@@ -26,6 +26,7 @@
 import android.util.Log;
 import android.view.View;
 import android.widget.ListView;
+import com.google.zxing.client.android.Intents;
 
 /**
  * This class is only needed because I can't successfully send an ACTION_PICK intent to
@@ -52,19 +53,16 @@
   protected void onResume() {
     super.onResume();
     titleURLs.clear();
-    Cursor cursor = getContentResolver().query(BOOKMARKS_URI, BOOKMARK_PROJECTION,
-        BOOKMARK_SELECTION, null, null);
-    if (cursor == null) {
-      Log.w(TAG, "No cursor returned for bookmark query");
-      finish();
-      return;
-    }
-    try {
+    try (Cursor cursor = getContentResolver().query(BOOKMARKS_URI, BOOKMARK_PROJECTION,
+             BOOKMARK_SELECTION, null, null)) {
+      if (cursor == null) {
+        Log.w(TAG, "No cursor returned for bookmark query");
+        finish();
+        return;
+      }
       while (cursor.moveToNext()) {
         titleURLs.add(new String[] { cursor.getString(0), cursor.getString(1) });
       }
-    } finally {
-      cursor.close();
     }
     setListAdapter(new BookmarkAdapter(this, titleURLs));
   }
@@ -74,7 +72,7 @@
   protected void onListItemClick(ListView l, View view, int position, long id) {
     String[] titleURL = titleURLs.get(position);
     Intent intent = new Intent();
-    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+    intent.addFlags(Intents.FLAG_NEW_DOC);
     intent.putExtra("title", titleURL[0]); // Browser.BookmarkColumns.TITLE
     intent.putExtra("url", titleURL[1]); // Browser.BookmarkColumns.URL
     setResult(RESULT_OK, intent);
diff --git a/android/src/com/google/zxing/client/android/share/ShareActivity.java b/android/src/com/google/zxing/client/android/share/ShareActivity.java
index 38edb88..dc42bdf 100755
--- a/android/src/com/google/zxing/client/android/share/ShareActivity.java
+++ b/android/src/com/google/zxing/client/android/share/ShareActivity.java
@@ -56,7 +56,7 @@
     @Override
     public void onClick(View v) {
       Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
-      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+      intent.addFlags(Intents.FLAG_NEW_DOC);
       startActivityForResult(intent, PICK_CONTACT);
     }
   };
@@ -65,7 +65,7 @@
     @Override
     public void onClick(View v) {
       Intent intent = new Intent(Intent.ACTION_PICK);
-      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+      intent.addFlags(Intents.FLAG_NEW_DOC);
       intent.setClassName(ShareActivity.this, BookmarkPickerActivity.class.getName());
       startActivityForResult(intent, PICK_BOOKMARK);
     }
@@ -75,7 +75,7 @@
     @Override
     public void onClick(View v) {
       Intent intent = new Intent(Intent.ACTION_PICK);
-      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+      intent.addFlags(Intents.FLAG_NEW_DOC);
       intent.setClassName(ShareActivity.this, AppPickerActivity.class.getName());
       startActivityForResult(intent, PICK_APP);
     }
@@ -108,7 +108,7 @@
 
   private void launchSearch(String text) {
     Intent intent = new Intent(Intents.Encode.ACTION);
-    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+    intent.addFlags(Intents.FLAG_NEW_DOC);
     intent.putExtra(Intents.Encode.TYPE, Contents.Type.TEXT);
     intent.putExtra(Intents.Encode.DATA, text);
     intent.putExtra(Intents.Encode.FORMAT, BarcodeFormat.QR_CODE.toString());
@@ -161,7 +161,7 @@
       return; // Show error?
     }
     Intent intent = new Intent(Intents.Encode.ACTION);
-    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+    intent.addFlags(Intents.FLAG_NEW_DOC);
     intent.putExtra(Intents.Encode.TYPE, Contents.Type.TEXT);
     intent.putExtra(Intents.Encode.DATA, text);
     intent.putExtra(Intents.Encode.FORMAT, BarcodeFormat.QR_CODE.toString());
@@ -181,32 +181,16 @@
     }
     ContentResolver resolver = getContentResolver();
 
-    Cursor cursor;
-    try {
-      // We're seeing about six reports a week of this exception although I don't understand why.
-      cursor = resolver.query(contactUri, null, null, null, null);
-    } catch (IllegalArgumentException ignored) {
-      return;
-    }
-    if (cursor == null) {
-      return;
-    }
-
     String id;
     String name;
     boolean hasPhone;
-    try {
-      if (!cursor.moveToFirst()) {
+    try (Cursor cursor = resolver.query(contactUri, null, null, null, null)) {
+      if (cursor == null || !cursor.moveToFirst()) {
         return;
       }
-
       id = cursor.getString(cursor.getColumnIndex(BaseColumns._ID));
       name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
       hasPhone = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0;
-
-
-    } finally {
-      cursor.close();
     }
 
     // Don't require a name to be present, this contact might be just a phone number.
@@ -216,13 +200,12 @@
     }
 
     if (hasPhone) {
-      Cursor phonesCursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
-                                           null,
-                                           ContactsContract.CommonDataKinds.Phone.CONTACT_ID + '=' + id,
-                                           null,
-                                           null);
-      if (phonesCursor != null) {
-        try {
+      try (Cursor phonesCursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
+                                                null,
+                                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID + '=' + id,
+                                                null,
+                                                null)) {
+        if (phonesCursor != null) {
           int foundPhone = 0;
           int phonesNumberColumn = phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
           int phoneTypeColumn = phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
@@ -235,38 +218,30 @@
             bundle.putInt(Contents.PHONE_TYPE_KEYS[foundPhone], type);
             foundPhone++;
           }
-        } finally {
-          phonesCursor.close();
         }
       }
     }
 
-    Cursor methodsCursor = resolver.query(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,
-                                          null,
-                                          ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + '=' + id,
-                                          null,
-                                          null);
-    if (methodsCursor != null) {
-      try {
-        if (methodsCursor.moveToNext()) {
-          String data = methodsCursor.getString(
-              methodsCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS));
-          if (data != null && !data.isEmpty()) {
-            bundle.putString(ContactsContract.Intents.Insert.POSTAL, massageContactData(data));
-          }
+    try (Cursor methodsCursor = resolver.query(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,
+                                               null,
+                                               ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + '=' + id,
+                                               null,
+                                               null)) {
+      if (methodsCursor != null && methodsCursor.moveToNext()) {
+        String data = methodsCursor.getString(
+            methodsCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS));
+        if (data != null && !data.isEmpty()) {
+          bundle.putString(ContactsContract.Intents.Insert.POSTAL, massageContactData(data));
         }
-      } finally {
-        methodsCursor.close();
       }
     }
 
-    Cursor emailCursor = resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
-                                        null,
-                                        ContactsContract.CommonDataKinds.Email.CONTACT_ID + '=' + id,
-                                        null,
-                                        null);
-    if (emailCursor != null) {
-      try {
+    try (Cursor emailCursor = resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
+                                             null,
+                                             ContactsContract.CommonDataKinds.Email.CONTACT_ID + '=' + id,
+                                             null,
+                                             null)) {
+      if (emailCursor != null) {
         int foundEmail = 0;
         int emailColumn = emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA);
         while (emailCursor.moveToNext() && foundEmail < Contents.EMAIL_KEYS.length) {
@@ -276,13 +251,11 @@
           }
           foundEmail++;
         }
-      } finally {
-        emailCursor.close();
       }
     }
 
     Intent intent = new Intent(Intents.Encode.ACTION);
-    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+    intent.addFlags(Intents.FLAG_NEW_DOC);
     intent.putExtra(Intents.Encode.TYPE, Contents.Type.CONTACT);
     intent.putExtra(Intents.Encode.DATA, bundle);
     intent.putExtra(Intents.Encode.FORMAT, BarcodeFormat.QR_CODE.toString());
diff --git a/android/src/com/google/zxing/client/android/wifi/NetworkType.java b/android/src/com/google/zxing/client/android/wifi/NetworkType.java
index 6a9e5a4..18a9199 100644
--- a/android/src/com/google/zxing/client/android/wifi/NetworkType.java
+++ b/android/src/com/google/zxing/client/android/wifi/NetworkType.java
@@ -26,17 +26,17 @@
     if (networkTypeString == null) {
       return NO_PASSWORD;
     }
-    if ("WPA".equals(networkTypeString) ||
-        "WPA2".equals(networkTypeString)) {
-      return WPA;
+    switch (networkTypeString) {
+      case "WPA":
+      case "WPA2":
+        return WPA;
+      case "WEP":
+        return WEP;
+      case "nopass":
+        return NO_PASSWORD;
+      default:
+        throw new IllegalArgumentException(networkTypeString);
     }
-    if ("WEP".equals(networkTypeString)) {
-      return WEP;
-    }
-    if ("nopass".equals(networkTypeString)) {
-      return NO_PASSWORD;
-    }
-    throw new IllegalArgumentException(networkTypeString);
   }
 
 }
diff --git a/core/src/main/java/com/google/zxing/aztec/AztecWriter.java b/core/src/main/java/com/google/zxing/aztec/AztecWriter.java
index 9eb4190..79bca7b 100644
--- a/core/src/main/java/com/google/zxing/aztec/AztecWriter.java
+++ b/core/src/main/java/com/google/zxing/aztec/AztecWriter.java
@@ -24,6 +24,7 @@
 import com.google.zxing.common.BitMatrix;
 
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.Map;
 
 /**
@@ -31,8 +32,6 @@
  */
 public final class AztecWriter implements Writer {
 
-  private static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
-
   @Override
   public BitMatrix encode(String contents, BarcodeFormat format, int width, int height) {
     return encode(contents, format, width, height, null);
@@ -40,7 +39,7 @@
 
   @Override
   public BitMatrix encode(String contents, BarcodeFormat format, int width, int height, Map<EncodeHintType,?> hints) {
-    Charset charset = DEFAULT_CHARSET;
+    Charset charset = StandardCharsets.ISO_8859_1;
     int eccPercent = Encoder.DEFAULT_EC_PERCENT;
     int layers = Encoder.DEFAULT_AZTEC_LAYERS;
     if (hints != null) {
diff --git a/core/src/main/java/com/google/zxing/client/result/VCardResultParser.java b/core/src/main/java/com/google/zxing/client/result/VCardResultParser.java
index 5e6423e..14545fa 100644
--- a/core/src/main/java/com/google/zxing/client/result/VCardResultParser.java
+++ b/core/src/main/java/com/google/zxing/client/result/VCardResultParser.java
@@ -21,7 +21,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.URI;
-import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -256,12 +256,12 @@
       byte[] fragmentBytes = fragmentBuffer.toByteArray();
       String fragment;
       if (charset == null) {
-        fragment = new String(fragmentBytes, Charset.forName("UTF-8"));
+        fragment = new String(fragmentBytes, StandardCharsets.UTF_8);
       } else {
         try {
           fragment = new String(fragmentBytes, charset);
         } catch (UnsupportedEncodingException e) {
-          fragment = new String(fragmentBytes, Charset.forName("UTF-8"));
+          fragment = new String(fragmentBytes, StandardCharsets.UTF_8);
         }
       }
       fragmentBuffer.reset();
diff --git a/core/src/main/java/com/google/zxing/datamatrix/encoder/EncoderContext.java b/core/src/main/java/com/google/zxing/datamatrix/encoder/EncoderContext.java
index 25b5a4c..cc0b0cb 100644
--- a/core/src/main/java/com/google/zxing/datamatrix/encoder/EncoderContext.java
+++ b/core/src/main/java/com/google/zxing/datamatrix/encoder/EncoderContext.java
@@ -18,7 +18,7 @@
 
 import com.google.zxing.Dimension;
 
-import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 
 final class EncoderContext {
 
@@ -34,7 +34,7 @@
 
   EncoderContext(String msg) {
     //From this point on Strings are not Unicode anymore!
-    byte[] msgBinary = msg.getBytes(Charset.forName("ISO-8859-1"));
+    byte[] msgBinary = msg.getBytes(StandardCharsets.ISO_8859_1);
     StringBuilder sb = new StringBuilder(msgBinary.length);
     for (int i = 0, c = msgBinary.length; i < c; i++) {
       char ch = (char) (msgBinary[i] & 0xff);
diff --git a/core/src/main/java/com/google/zxing/multi/qrcode/QRCodeMultiReader.java b/core/src/main/java/com/google/zxing/multi/qrcode/QRCodeMultiReader.java
index 083fcf3..49d3502 100644
--- a/core/src/main/java/com/google/zxing/multi/qrcode/QRCodeMultiReader.java
+++ b/core/src/main/java/com/google/zxing/multi/qrcode/QRCodeMultiReader.java
@@ -168,13 +168,7 @@
     public int compare(Result a, Result b) {
       int aNumber = (int) a.getResultMetadata().get(ResultMetadataType.STRUCTURED_APPEND_SEQUENCE);
       int bNumber = (int) b.getResultMetadata().get(ResultMetadataType.STRUCTURED_APPEND_SEQUENCE);
-      if (aNumber < bNumber) {
-        return -1;
-      }
-      if (aNumber > bNumber) {
-        return 1;
-      }
-      return 0;
+      return Integer.compare(aNumber, bNumber);
     }
   }
 
diff --git a/core/src/main/java/com/google/zxing/oned/UPCEANExtension5Support.java b/core/src/main/java/com/google/zxing/oned/UPCEANExtension5Support.java
index bde090c..cb55eeb 100644
--- a/core/src/main/java/com/google/zxing/oned/UPCEANExtension5Support.java
+++ b/core/src/main/java/com/google/zxing/oned/UPCEANExtension5Support.java
@@ -153,16 +153,15 @@
         break;
       case '9':
         // Reference: http://www.jollytech.com
-        if ("90000".equals(raw)) {
-          // No suggested retail price
-          return null;
-        }
-        if ("99991".equals(raw)) {
-          // Complementary
-          return "0.00";
-        }
-        if ("99990".equals(raw)) {
-          return "Used";
+        switch (raw) {
+          case "90000":
+            // No suggested retail price
+            return null;
+          case "99991":
+            // Complementary
+            return "0.00";
+          case "99990":
+            return "Used";
         }
         // Otherwise... unknown currency?
         currency = "";
diff --git a/core/src/main/java/com/google/zxing/pdf417/decoder/DecodedBitStreamParser.java b/core/src/main/java/com/google/zxing/pdf417/decoder/DecodedBitStreamParser.java
index 7cc8fbc..94a7b9d 100644
--- a/core/src/main/java/com/google/zxing/pdf417/decoder/DecodedBitStreamParser.java
+++ b/core/src/main/java/com/google/zxing/pdf417/decoder/DecodedBitStreamParser.java
@@ -24,6 +24,7 @@
 import java.io.ByteArrayOutputStream;
 import java.math.BigInteger;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 
 /**
@@ -70,8 +71,6 @@
   private static final char[] MIXED_CHARS =
       "0123456789&\r\t,:#-.$/+%*=^".toCharArray();
 
-  private static final Charset DEFAULT_ENCODING = Charset.forName("ISO-8859-1");
-
   /**
    * Table containing values for the exponent of 900.
    * This is used in the numeric compaction decode algorithm.
@@ -94,7 +93,7 @@
 
   static DecoderResult decode(int[] codewords, String ecLevel) throws FormatException {
     StringBuilder result = new StringBuilder(codewords.length * 2);
-    Charset encoding = DEFAULT_ENCODING;
+    Charset encoding = StandardCharsets.ISO_8859_1;
     // Get compaction mode
     int codeIndex = 1;
     int code = codewords[codeIndex++];
diff --git a/core/src/main/java/com/google/zxing/pdf417/decoder/DetectionResult.java b/core/src/main/java/com/google/zxing/pdf417/decoder/DetectionResult.java
index dea45f6..0eeba30 100644
--- a/core/src/main/java/com/google/zxing/pdf417/decoder/DetectionResult.java
+++ b/core/src/main/java/com/google/zxing/pdf417/decoder/DetectionResult.java
@@ -271,26 +271,25 @@
     if (rowIndicatorColumn == null) {
       rowIndicatorColumn = detectionResultColumns[barcodeColumnCount + 1];
     }
-    Formatter formatter = new Formatter();
-    for (int codewordsRow = 0; codewordsRow < rowIndicatorColumn.getCodewords().length; codewordsRow++) {
-      formatter.format("CW %3d:", codewordsRow);
-      for (int barcodeColumn = 0; barcodeColumn < barcodeColumnCount + 2; barcodeColumn++) {
-        if (detectionResultColumns[barcodeColumn] == null) {
-          formatter.format("    |   ");
-          continue;
+    try (Formatter formatter = new Formatter()) {
+      for (int codewordsRow = 0; codewordsRow < rowIndicatorColumn.getCodewords().length; codewordsRow++) {
+        formatter.format("CW %3d:", codewordsRow);
+        for (int barcodeColumn = 0; barcodeColumn < barcodeColumnCount + 2; barcodeColumn++) {
+          if (detectionResultColumns[barcodeColumn] == null) {
+            formatter.format("    |   ");
+            continue;
+          }
+          Codeword codeword = detectionResultColumns[barcodeColumn].getCodewords()[codewordsRow];
+          if (codeword == null) {
+            formatter.format("    |   ");
+            continue;
+          }
+          formatter.format(" %3d|%3d", codeword.getRowNumber(), codeword.getValue());
         }
-        Codeword codeword = detectionResultColumns[barcodeColumn].getCodewords()[codewordsRow];
-        if (codeword == null) {
-          formatter.format("    |   ");
-          continue;
-        }
-        formatter.format(" %3d|%3d", codeword.getRowNumber(), codeword.getValue());
+        formatter.format("%n");
       }
-      formatter.format("%n");
+      return formatter.toString();
     }
-    String result = formatter.toString();
-    formatter.close();
-    return result;
   }
 
 }
diff --git a/core/src/main/java/com/google/zxing/pdf417/decoder/DetectionResultColumn.java b/core/src/main/java/com/google/zxing/pdf417/decoder/DetectionResultColumn.java
index e0ea96d..bcf5119 100644
--- a/core/src/main/java/com/google/zxing/pdf417/decoder/DetectionResultColumn.java
+++ b/core/src/main/java/com/google/zxing/pdf417/decoder/DetectionResultColumn.java
@@ -79,18 +79,17 @@
 
   @Override
   public String toString() {
-    Formatter formatter = new Formatter();
-    int row = 0;
-    for (Codeword codeword : codewords) {
-      if (codeword == null) {
-        formatter.format("%3d:    |   %n", row++);
-        continue;
+    try (Formatter formatter = new Formatter()) {
+      int row = 0;
+      for (Codeword codeword : codewords) {
+        if (codeword == null) {
+          formatter.format("%3d:    |   %n", row++);
+          continue;
+        }
+        formatter.format("%3d: %3d|%3d%n", row++, codeword.getRowNumber(), codeword.getValue());
       }
-      formatter.format("%3d: %3d|%3d%n", row++, codeword.getRowNumber(), codeword.getValue());
+      return formatter.toString();
     }
-    String result = formatter.toString();
-    formatter.close();
-    return result;
   }
 
 }
diff --git a/core/src/main/java/com/google/zxing/pdf417/decoder/PDF417ScanningDecoder.java b/core/src/main/java/com/google/zxing/pdf417/decoder/PDF417ScanningDecoder.java
index 4504355..704c7db 100644
--- a/core/src/main/java/com/google/zxing/pdf417/decoder/PDF417ScanningDecoder.java
+++ b/core/src/main/java/com/google/zxing/pdf417/decoder/PDF417ScanningDecoder.java
@@ -610,23 +610,22 @@
   }
 
   public static String toString(BarcodeValue[][] barcodeMatrix) {
-    Formatter formatter = new Formatter();
-    for (int row = 0; row < barcodeMatrix.length; row++) {
-      formatter.format("Row %2d: ", row);
-      for (int column = 0; column < barcodeMatrix[row].length; column++) {
-        BarcodeValue barcodeValue = barcodeMatrix[row][column];
-        if (barcodeValue.getValue().length == 0) {
-          formatter.format("        ", (Object[]) null);
-        } else {
-          formatter.format("%4d(%2d)", barcodeValue.getValue()[0],
-              barcodeValue.getConfidence(barcodeValue.getValue()[0]));
+    try (Formatter formatter = new Formatter()) {
+      for (int row = 0; row < barcodeMatrix.length; row++) {
+        formatter.format("Row %2d: ", row);
+        for (int column = 0; column < barcodeMatrix[row].length; column++) {
+          BarcodeValue barcodeValue = barcodeMatrix[row][column];
+          if (barcodeValue.getValue().length == 0) {
+            formatter.format("        ", (Object[]) null);
+          } else {
+            formatter.format("%4d(%2d)", barcodeValue.getValue()[0],
+                barcodeValue.getConfidence(barcodeValue.getValue()[0]));
+          }
         }
+        formatter.format("%n");
       }
-      formatter.format("%n");
+      return formatter.toString();
     }
-    String result = formatter.toString();
-    formatter.close();
-    return result;
   }
 
 }
diff --git a/core/src/main/java/com/google/zxing/pdf417/encoder/PDF417HighLevelEncoder.java b/core/src/main/java/com/google/zxing/pdf417/encoder/PDF417HighLevelEncoder.java
index 9c8847b..3ed0ecf 100644
--- a/core/src/main/java/com/google/zxing/pdf417/encoder/PDF417HighLevelEncoder.java
+++ b/core/src/main/java/com/google/zxing/pdf417/encoder/PDF417HighLevelEncoder.java
@@ -26,6 +26,7 @@
 import java.math.BigInteger;
 import java.nio.charset.Charset;
 import java.nio.charset.CharsetEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 
 /**
@@ -126,7 +127,7 @@
   private static final byte[] MIXED = new byte[128];
   private static final byte[] PUNCTUATION = new byte[128];
 
-  private static final Charset DEFAULT_ENCODING = Charset.forName("ISO-8859-1");
+  private static final Charset DEFAULT_ENCODING = StandardCharsets.ISO_8859_1;
 
   private PDF417HighLevelEncoder() {
   }
diff --git a/core/src/main/java/com/google/zxing/qrcode/detector/FinderPatternFinder.java b/core/src/main/java/com/google/zxing/qrcode/detector/FinderPatternFinder.java
index 61fe3c1..b62a16f 100755
--- a/core/src/main/java/com/google/zxing/qrcode/detector/FinderPatternFinder.java
+++ b/core/src/main/java/com/google/zxing/qrcode/detector/FinderPatternFinder.java
@@ -651,9 +651,8 @@
     }
     @Override
     public int compare(FinderPattern center1, FinderPattern center2) {
-      float dA = Math.abs(center2.getEstimatedModuleSize() - average);
-      float dB = Math.abs(center1.getEstimatedModuleSize() - average);
-      return dA < dB ? -1 : dA > dB ? 1 : 0;
+      return Float.compare(Math.abs(center2.getEstimatedModuleSize() - average),
+                           Math.abs(center1.getEstimatedModuleSize() - average));
     }
   }
 
@@ -667,13 +666,12 @@
     }
     @Override
     public int compare(FinderPattern center1, FinderPattern center2) {
-      if (center2.getCount() == center1.getCount()) {
-        float dA = Math.abs(center2.getEstimatedModuleSize() - average);
-        float dB = Math.abs(center1.getEstimatedModuleSize() - average);
-        return dA < dB ? 1 : dA > dB ? -1 : 0;
-      } else {
-        return center2.getCount() - center1.getCount();
+      int countCompare = Integer.compare(center2.getCount(), center1.getCount());
+      if (countCompare == 0) {
+        return Float.compare(Math.abs(center1.getEstimatedModuleSize() - average),
+                             Math.abs(center2.getEstimatedModuleSize() - average));
       }
+      return countCompare;
     }
   }