diff --git a/mobile/android/base/java/org/mozilla/gecko/ANRReporter.java b/mobile/android/base/java/org/mozilla/gecko/ANRReporter.java index 3c29edef35f5..7893de0843ae 100644 --- a/mobile/android/base/java/org/mozilla/gecko/ANRReporter.java +++ b/mobile/android/base/java/org/mozilla/gecko/ANRReporter.java @@ -22,6 +22,7 @@ import java.util.regex.Pattern; import org.json.JSONObject; import org.mozilla.gecko.annotation.WrapForJNI; import org.mozilla.gecko.AppConstants.Versions; +import org.mozilla.gecko.util.StringUtils; import org.mozilla.gecko.util.ThreadUtils; import android.content.BroadcastReceiver; @@ -155,7 +156,8 @@ public final class ANRReporter extends BroadcastReceiver .start(); try { BufferedReader buf = new BufferedReader( - new InputStreamReader(propProc.getInputStream()), TRACES_LINE_SIZE); + new InputStreamReader( + propProc.getInputStream(), StringUtils.UTF_8), TRACES_LINE_SIZE); String propVal = buf.readLine(); if (DEBUG) { Log.d(LOGTAG, "getprop returned " + String.valueOf(propVal)); @@ -218,7 +220,8 @@ public final class ANRReporter extends BroadcastReceiver Log.d(LOGTAG, "trying to match package: " + pkgName); } BufferedReader traces = new BufferedReader( - new FileReader(tracesFile), TRACES_BLOCK_SIZE); + new InputStreamReader(new FileInputStream( + tracesFile), StringUtils.UTF_8), TRACES_BLOCK_SIZE); try { for (int count = 0; count < LINES_TO_IDENTIFY_TRACES; count++) { String line = traces.readLine(); diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java index 9862494df9a9..5dc645bcb2a9 100644 --- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java +++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java @@ -2046,10 +2046,10 @@ public class BrowserApp extends GeckoApp try { out = new ByteArrayOutputStream(); - out.write("data:image/png;base64,".getBytes()); + out.write("data:image/png;base64,".getBytes(StringUtils.UTF_8)); b64 = new Base64OutputStream(out, Base64.NO_WRAP); response.getBitmap().compress(Bitmap.CompressFormat.PNG, 100, b64); - callback.sendSuccess(new String(out.toByteArray())); + callback.sendSuccess(new String(out.toByteArray(), StringUtils.UTF_8)); } catch (IOException e) { Log.w(LOGTAG, "Failed to convert to base64 data URI"); callback.sendError("Failed to convert favicon to a base64 data URI"); diff --git a/mobile/android/base/java/org/mozilla/gecko/SuggestClient.java b/mobile/android/base/java/org/mozilla/gecko/SuggestClient.java index e43bbef1f48c..9436e9ce5ba9 100644 --- a/mobile/android/base/java/org/mozilla/gecko/SuggestClient.java +++ b/mobile/android/base/java/org/mozilla/gecko/SuggestClient.java @@ -7,6 +7,7 @@ package org.mozilla.gecko; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; @@ -20,6 +21,7 @@ import android.content.Context; import android.text.TextUtils; import android.util.Log; import org.mozilla.gecko.util.NetworkUtils; +import org.mozilla.gecko.util.StringUtils; /** * Use network-based search suggestions. @@ -134,7 +136,7 @@ public class SuggestClient { private String convertStreamToString(java.io.InputStream is) { try { - return new java.util.Scanner(is).useDelimiter("\\A").next(); + return new java.util.Scanner(new InputStreamReader(is, StringUtils.UTF_8)).useDelimiter("\\A").next(); } catch (java.util.NoSuchElementException e) { return ""; } diff --git a/mobile/android/base/java/org/mozilla/gecko/db/LoginsProvider.java b/mobile/android/base/java/org/mozilla/gecko/db/LoginsProvider.java index d2d5048510d4..740056a34e7a 100644 --- a/mobile/android/base/java/org/mozilla/gecko/db/LoginsProvider.java +++ b/mobile/android/base/java/org/mozilla/gecko/db/LoginsProvider.java @@ -21,6 +21,7 @@ import org.mozilla.gecko.db.BrowserContract.DeletedLogins; import org.mozilla.gecko.db.BrowserContract.Logins; import org.mozilla.gecko.db.BrowserContract.LoginsDisabledHosts; import org.mozilla.gecko.sync.Utils; +import org.mozilla.gecko.util.StringUtils; import java.io.UnsupportedEncodingException; import java.security.GeneralSecurityException; @@ -507,7 +508,8 @@ public class LoginsProvider extends SharedBrowserDatabaseProvider { private String decrypt(@NonNull String initialValue) { try { final Cipher cipher = getCipher(Cipher.DECRYPT_MODE); - return new String(cipher.doFinal(Base64.decode(initialValue.getBytes("UTF-8"), Base64.URL_SAFE))); + return new String(cipher.doFinal(Base64.decode( + initialValue.getBytes("UTF-8"), Base64.URL_SAFE)), StringUtils.UTF_8); } catch (Exception e) { debug("Decryption failed : " + e); throw new IllegalStateException("Logins decryption failed", e); diff --git a/mobile/android/base/java/org/mozilla/gecko/home/BrowserSearch.java b/mobile/android/base/java/org/mozilla/gecko/home/BrowserSearch.java index 29f191410193..777619c93d2b 100644 --- a/mobile/android/base/java/org/mozilla/gecko/home/BrowserSearch.java +++ b/mobile/android/base/java/org/mozilla/gecko/home/BrowserSearch.java @@ -550,7 +550,8 @@ public class BrowserSearch extends HomeFragment domains = new LinkedHashSet(500); BufferedReader buf = null; try { - buf = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.topdomains))); + buf = new BufferedReader(new InputStreamReader( + getResources().openRawResource(R.raw.topdomains), StringUtils.UTF_8)); String res = null; do { diff --git a/mobile/android/base/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java b/mobile/android/base/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java index 2cbab90944e4..fb7758a8d476 100644 --- a/mobile/android/base/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java +++ b/mobile/android/base/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java @@ -29,6 +29,8 @@ import android.media.MediaDrmException; import android.media.NotProvisionedException; import android.util.Log; +import org.mozilla.gecko.util.StringUtils; + public class GeckoMediaDrmBridgeV21 implements GeckoMediaDrm { protected final String LOGTAG; private static final String INVALID_SESSION_ID = "Invalid"; @@ -183,7 +185,8 @@ public class GeckoMediaDrmBridgeV21 implements GeckoMediaDrm { request.getData()); mSessionMIMETypes.put(sessionId, initDataType); mSessionIds.add(sessionId); - if (DEBUG) Log.d(LOGTAG, " StringID : " + new String(sessionId.array()) + " is put into mSessionIds "); + if (DEBUG) Log.d(LOGTAG, " StringID : " + new String( + sessionId.array(), StringUtils.UTF_8) + " is put into mSessionIds "); } catch (android.media.NotProvisionedException e) { if (DEBUG) Log.d(LOGTAG, "Device not provisioned:" + e.getMessage()); if (sessionId != null) { @@ -207,7 +210,7 @@ public class GeckoMediaDrmBridgeV21 implements GeckoMediaDrm { return; } - ByteBuffer session = ByteBuffer.wrap(sessionId.getBytes()); + ByteBuffer session = ByteBuffer.wrap(sessionId.getBytes(StringUtils.UTF_8)); if (!sessionExists(session)) { onRejectPromise(promiseId, "Invalid session during updateSession."); return; @@ -242,7 +245,7 @@ public class GeckoMediaDrmBridgeV21 implements GeckoMediaDrm { return; } - ByteBuffer session = ByteBuffer.wrap(sessionId.getBytes()); + ByteBuffer session = ByteBuffer.wrap(sessionId.getBytes(StringUtils.UTF_8)); mSessionIds.remove(session); mDrm.closeSession(session.array()); onSessionClosed(promiseId, session.array()); @@ -388,10 +391,10 @@ public class GeckoMediaDrmBridgeV21 implements GeckoMediaDrm { // No need to handle here if we're not in privacy mode. break; case MediaDrm.EVENT_KEY_EXPIRED: - if (DEBUG) Log.d(LOGTAG, "MediaDrm.EVENT_KEY_EXPIRED, sessionId=" + new String(session.array())); + if (DEBUG) Log.d(LOGTAG, "MediaDrm.EVENT_KEY_EXPIRED, sessionId=" + new String(session.array(), StringUtils.UTF_8)); break; case MediaDrm.EVENT_VENDOR_DEFINED: - if (DEBUG) Log.d(LOGTAG, "MediaDrm.EVENT_VENDOR_DEFINED, sessionId=" + new String(session.array())); + if (DEBUG) Log.d(LOGTAG, "MediaDrm.EVENT_VENDOR_DEFINED, sessionId=" + new String(session.array(), StringUtils.UTF_8)); break; default: if (DEBUG) Log.d(LOGTAG, "Invalid DRM event " + event); @@ -466,7 +469,7 @@ public class GeckoMediaDrmBridgeV21 implements GeckoMediaDrm { int responseCode = urlConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { BufferedReader in = - new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); + new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), StringUtils.UTF_8)); String inputLine; StringBuffer response = new StringBuffer(); @@ -474,7 +477,7 @@ public class GeckoMediaDrmBridgeV21 implements GeckoMediaDrm { response.append(inputLine); } in.close(); - mResponseBody = String.valueOf(response).getBytes(); + mResponseBody = String.valueOf(response).getBytes(StringUtils.UTF_8); if (DEBUG) Log.d(LOGTAG, "Provisioning, response received."); if (mResponseBody != null) Log.d(LOGTAG, "response length=" + mResponseBody.length); } else { @@ -600,7 +603,8 @@ public class GeckoMediaDrmBridgeV21 implements GeckoMediaDrm { final byte [] cryptoSessionId = mCryptoSessionId.array(); mCrypto = new MediaCrypto(mSchemeUUID, cryptoSessionId); mSessionIds.add(mCryptoSessionId); - if (DEBUG) Log.d(LOGTAG, "MediaCrypto successfully created! - SId " + INVALID_SESSION_ID + ", " + new String(cryptoSessionId)); + if (DEBUG) Log.d(LOGTAG, "MediaCrypto successfully created! - SId " + INVALID_SESSION_ID + + ", " + new String(cryptoSessionId, StringUtils.UTF_8)); return true; } else { if (DEBUG) Log.d(LOGTAG, "Cannot create MediaCrypto for unsupported scheme."); diff --git a/mobile/android/base/java/org/mozilla/gecko/search/SearchEngineManager.java b/mobile/android/base/java/org/mozilla/gecko/search/SearchEngineManager.java index 751ae41b4fe2..67e7f45d86f7 100644 --- a/mobile/android/base/java/org/mozilla/gecko/search/SearchEngineManager.java +++ b/mobile/android/base/java/org/mozilla/gecko/search/SearchEngineManager.java @@ -23,6 +23,7 @@ import org.mozilla.gecko.util.FileUtils; import org.mozilla.gecko.util.GeckoJarReader; import org.mozilla.gecko.util.HardwareUtils; import org.mozilla.gecko.util.RawResource; +import org.mozilla.gecko.util.StringUtils; import org.mozilla.gecko.util.ThreadUtils; import org.xmlpull.v1.XmlPullParserException; @@ -393,7 +394,7 @@ public class SearchEngineManager implements SharedPreferences.OnSharedPreference urlConnection.setRequestMethod("POST"); urlConnection.setRequestProperty("User-Agent", USER_AGENT); urlConnection.setRequestProperty("Content-Type", "application/json"); - urlConnection.setFixedLengthStreamingMode(message.getBytes().length); + urlConnection.setFixedLengthStreamingMode(message.getBytes(StringUtils.UTF_8).length); final OutputStream out = urlConnection.getOutputStream(); out.write(message.getBytes()); diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/StringUtils.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/StringUtils.java index 8d8eb652be2d..e5bf6551bd23 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/StringUtils.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/StringUtils.java @@ -9,6 +9,7 @@ import android.net.Uri; import android.support.annotation.NonNull; import android.text.TextUtils; +import java.nio.charset.Charset; import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; @@ -20,6 +21,12 @@ public class StringUtils { private static final String FILTER_URL_PREFIX = "filter://"; private static final String USER_ENTERED_URL_PREFIX = "user-entered:"; + + /** + * The UTF-8 charset. + */ + public static final Charset UTF_8 = Charset.forName("UTF-8"); + /* * This method tries to guess if the given string could be a search query or URL, * and returns a previous result if there is ambiguity diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/background/common/log/Logger.java b/mobile/android/services/src/main/java/org/mozilla/gecko/background/common/log/Logger.java index 98140b2b5126..c8b6baaf6207 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/background/common/log/Logger.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/background/common/log/Logger.java @@ -4,6 +4,7 @@ package org.mozilla.gecko.background.common.log; +import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.Iterator; import java.util.LinkedHashSet; @@ -16,6 +17,7 @@ import org.mozilla.gecko.background.common.log.writers.LogWriter; import org.mozilla.gecko.background.common.log.writers.PrintLogWriter; import org.mozilla.gecko.background.common.log.writers.SimpleTagLogWriter; import org.mozilla.gecko.background.common.log.writers.ThreadLocalTagLogWriter; +import org.mozilla.gecko.util.StringUtils; import android.util.Log; @@ -126,7 +128,8 @@ public class Logger { */ public static synchronized void startLoggingToConsole() { setThreadLogTag("Test"); - startLoggingTo(new PrintLogWriter(new PrintWriter(System.out, true))); + startLoggingTo(new PrintLogWriter(new PrintWriter( + new OutputStreamWriter(System.out, StringUtils.UTF_8), true))); } // Synchronized version for other classes to use. diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/browserid/JSONWebTokenUtils.java b/mobile/android/services/src/main/java/org/mozilla/gecko/browserid/JSONWebTokenUtils.java index 207accc76da7..4d4589b7256d 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/browserid/JSONWebTokenUtils.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/browserid/JSONWebTokenUtils.java @@ -149,8 +149,10 @@ public class JSONWebTokenUtils { if (parts.length != 3) { return null; } - String cHeader = new String(Base64.decodeBase64(parts[0])); - String cPayload = new String(Base64.decodeBase64(parts[1])); + String cHeader = new String(Base64.decodeBase64(parts[0]), + org.mozilla.gecko.util.StringUtils.UTF_8); + String cPayload = new String(Base64.decodeBase64(parts[1]), + org.mozilla.gecko.util.StringUtils.UTF_8); String cSignature = Utils.byte2Hex(Base64.decodeBase64(parts[2])); ExtendedJSONObject o = new ExtendedJSONObject(); o.put("header", new ExtendedJSONObject(cHeader)); @@ -203,8 +205,10 @@ public class JSONWebTokenUtils { if (parts.length != 3) { return null; } - String aHeader = new String(Base64.decodeBase64(parts[0])); - String aPayload = new String(Base64.decodeBase64(parts[1])); + String aHeader = new String(Base64.decodeBase64(parts[0]), + org.mozilla.gecko.util.StringUtils.UTF_8); + String aPayload = new String(Base64.decodeBase64(parts[1]), + org.mozilla.gecko.util.StringUtils.UTF_8); String aSignature = Utils.byte2Hex(Base64.decodeBase64(parts[2])); // We do all the assertion parsing *before* dumping the certificate in // case there's a malformed assertion. diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/CollectionKeys.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/CollectionKeys.java index 1fd363bcb00a..d1152cb14413 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/CollectionKeys.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/CollectionKeys.java @@ -15,6 +15,7 @@ import org.json.simple.JSONArray; import org.mozilla.apache.commons.codec.binary.Base64; import org.mozilla.gecko.sync.crypto.CryptoException; import org.mozilla.gecko.sync.crypto.KeyBundle; +import org.mozilla.gecko.util.StringUtils; public class CollectionKeys { private KeyBundle defaultKeyBundle = null; @@ -69,8 +70,8 @@ public class CollectionKeys { private static JSONArray keyBundleToArray(KeyBundle bundle) { // Generate JSON. JSONArray keysArray = new JSONArray(); - keysArray.add(new String(Base64.encodeBase64(bundle.getEncryptionKey()))); - keysArray.add(new String(Base64.encodeBase64(bundle.getHMACKey()))); + keysArray.add(new String(Base64.encodeBase64(bundle.getEncryptionKey()), StringUtils.UTF_8)); + keysArray.add(new String(Base64.encodeBase64(bundle.getHMACKey()), StringUtils.UTF_8)); return keysArray; } diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/CryptoRecord.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/CryptoRecord.java index 65563d3447fb..12826c6f8235 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/CryptoRecord.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/CryptoRecord.java @@ -16,6 +16,7 @@ import org.mozilla.gecko.sync.crypto.MissingCryptoInputException; import org.mozilla.gecko.sync.crypto.NoKeyBundleException; import org.mozilla.gecko.sync.repositories.domain.Record; import org.mozilla.gecko.sync.repositories.domain.RecordParseException; +import org.mozilla.gecko.util.StringUtils; /** * A Sync crypto record has: @@ -204,7 +205,7 @@ public class CryptoRecord extends Record { throw new NoKeyBundleException(); } String cleartext = payload.toJSONString(); - byte[] cleartextBytes = cleartext.getBytes("UTF-8"); + byte[] cleartextBytes = cleartext.getBytes(StringUtils.UTF_8); CryptoInfo info = CryptoInfo.encrypt(cleartextBytes, keyBundle); String message = new String(Base64.encodeBase64(info.getMessage())); String iv = new String(Base64.encodeBase64(info.getIV())); diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/Utils.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/Utils.java index ef8859b4a414..5047a528d234 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/Utils.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/Utils.java @@ -31,6 +31,7 @@ import org.mozilla.apache.commons.codec.binary.Base64; import org.mozilla.gecko.background.common.log.Logger; import org.mozilla.gecko.background.nativecode.NativeCrypto; import org.mozilla.gecko.sync.setup.Constants; +import org.mozilla.gecko.util.StringUtils; import android.content.Context; import android.content.SharedPreferences; @@ -47,7 +48,7 @@ public class Utils { public static String generateGuid() { byte[] encodedBytes = Base64.encodeBase64(generateRandomBytes(9), false); - return new String(encodedBytes).replace("+", "-").replace("/", "_"); + return new String(encodedBytes, StringUtils.UTF_8).replace("+", "-").replace("/", "_"); } /** @@ -493,7 +494,7 @@ public class Utils { try { fis = context.openFileInput(filename); - isr = new InputStreamReader(fis); + isr = new InputStreamReader(fis, StringUtils.UTF_8); br = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); String line; diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/net/MozResponse.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/net/MozResponse.java index 3f76f929f033..3792abbeda8c 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/net/MozResponse.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/net/MozResponse.java @@ -18,6 +18,7 @@ import org.mozilla.gecko.background.common.log.Logger; import org.mozilla.gecko.sync.ExtendedJSONObject; import org.mozilla.gecko.sync.NonArrayJSONException; import org.mozilla.gecko.sync.NonObjectJSONException; +import org.mozilla.gecko.util.StringUtils; import ch.boye.httpclientandroidlib.Header; import ch.boye.httpclientandroidlib.HttpEntity; @@ -79,7 +80,7 @@ public class MozResponse { return null; } - InputStreamReader is = new InputStreamReader(entity.getContent()); + InputStreamReader is = new InputStreamReader(entity.getContent(), StringUtils.UTF_8); // Oh, Java, you are so evil. body = new Scanner(is).useDelimiter("\\A").next(); return body; diff --git a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/net/SyncStorageCollectionRequest.java b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/net/SyncStorageCollectionRequest.java index 3ae672f21e7c..dac8d7e521ed 100644 --- a/mobile/android/services/src/main/java/org/mozilla/gecko/sync/net/SyncStorageCollectionRequest.java +++ b/mobile/android/services/src/main/java/org/mozilla/gecko/sync/net/SyncStorageCollectionRequest.java @@ -11,6 +11,7 @@ import java.io.InputStreamReader; import java.net.URI; import org.mozilla.gecko.background.common.log.Logger; +import org.mozilla.gecko.util.StringUtils; import ch.boye.httpclientandroidlib.Header; import ch.boye.httpclientandroidlib.HttpEntity; @@ -103,7 +104,7 @@ public class SyncStorageCollectionRequest extends SyncStorageRequest { BufferedReader br = null; try { content = entity.getContent(); - br = new BufferedReader(new InputStreamReader(content), FETCH_BUFFER_SIZE); + br = new BufferedReader(new InputStreamReader(content, StringUtils.UTF_8), FETCH_BUFFER_SIZE); String line; // This relies on connection timeouts at the HTTP layer. diff --git a/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/stumblerthread/datahandling/DataStorageManager.java b/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/stumblerthread/datahandling/DataStorageManager.java index adaaea4dc2ad..f08db46643e2 100644 --- a/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/stumblerthread/datahandling/DataStorageManager.java +++ b/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/stumblerthread/datahandling/DataStorageManager.java @@ -6,7 +6,9 @@ package org.mozilla.mozstumbler.service.stumblerthread.datahandling; import android.content.Context; import android.util.Log; + import org.mozilla.mozstumbler.service.AppGlobals; +import org.mozilla.mozstumbler.service.utils.StringUtils; import org.mozilla.mozstumbler.service.utils.Zipper; import java.io.File; import java.io.FileInputStream; @@ -101,7 +103,7 @@ public class DataStorageManager { if (mCurrentReports.reports.size() > 0) { try { - bytes = Zipper.zipData(finalizeReports(mCurrentReports.reports).getBytes()).length; + bytes = Zipper.zipData(finalizeReports(mCurrentReports.reports).getBytes(StringUtils.UTF_8)).length; } catch (IOException ex) { Log.e(LOG_TAG, "Zip error in getQueuedCounts()", ex); } @@ -301,7 +303,7 @@ public class DataStorageManager { if (currentReportsCount > 0) { final String filename = MEMORY_BUFFER_NAME; - final byte[] data = Zipper.zipData(finalizeReports(mCurrentReports.reports).getBytes()); + final byte[] data = Zipper.zipData(finalizeReports(mCurrentReports.reports).getBytes(StringUtils.UTF_8)); final int wifiCount = mCurrentReports.wifiCount; final int cellCount = mCurrentReports.cellCount; clearCurrentReports(); @@ -412,7 +414,7 @@ public class DataStorageManager { if (mCurrentReports.reports.size() < 1) { return; } - final byte[] bytes = Zipper.zipData(finalizeReports(mCurrentReports.reports).getBytes()); + final byte[] bytes = Zipper.zipData(finalizeReports(mCurrentReports.reports).getBytes(StringUtils.UTF_8)); saveToDisk(bytes, mCurrentReports.reports.size(), mCurrentReports.wifiCount, mCurrentReports.cellCount); clearCurrentReports(); } diff --git a/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/StringUtils.java b/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/StringUtils.java new file mode 100644 index 000000000000..b0b846d509e3 --- /dev/null +++ b/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/StringUtils.java @@ -0,0 +1,15 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.mozstumbler.service.utils; + +import java.nio.charset.Charset; + +public class StringUtils { + /** + * The UTF-8 charset. + */ + public static final Charset UTF_8 = Charset.forName("UTF-8"); +} diff --git a/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/Zipper.java b/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/Zipper.java index 90e0ee7f5fb3..e448924adcfa 100644 --- a/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/Zipper.java +++ b/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/Zipper.java @@ -33,7 +33,7 @@ public class Zipper { final ByteArrayInputStream bs = new ByteArrayInputStream(data); GZIPInputStream gstream = new GZIPInputStream(bs); try { - InputStreamReader reader = new InputStreamReader(gstream); + InputStreamReader reader = new InputStreamReader(gstream, StringUtils.UTF_8); BufferedReader in = new BufferedReader(reader); String read; while ((read = in.readLine()) != null) { diff --git a/mobile/android/stumbler/stumbler_sources.mozbuild b/mobile/android/stumbler/stumbler_sources.mozbuild index 63bc559f6122..b424bec25ed4 100644 --- a/mobile/android/stumbler/stumbler_sources.mozbuild +++ b/mobile/android/stumbler/stumbler_sources.mozbuild @@ -31,6 +31,7 @@ stumbler_sources = [ 'java/org/mozilla/mozstumbler/service/utils/AbstractCommunicator.java', 'java/org/mozilla/mozstumbler/service/utils/NetworkUtils.java', 'java/org/mozilla/mozstumbler/service/utils/PersistentIntentService.java', + 'java/org/mozilla/mozstumbler/service/utils/StringUtils.java', 'java/org/mozilla/mozstumbler/service/utils/TelemetryWrapper.java', 'java/org/mozilla/mozstumbler/service/utils/Zipper.java', ]