diff --git a/mobile/android/base/sync/DelayedWorkTracker.java b/mobile/android/base/sync/DelayedWorkTracker.java index ec45b91c9e1..aef33f8a1aa 100644 --- a/mobile/android/base/sync/DelayedWorkTracker.java +++ b/mobile/android/base/sync/DelayedWorkTracker.java @@ -37,8 +37,6 @@ package org.mozilla.gecko.sync; -import android.util.Log; - /** * A little class to allow us to maintain a count of extant * things (in our case, callbacks that need to fire), and @@ -53,13 +51,13 @@ public class DelayedWorkTracker { protected int outstandingCount = 0; public int incrementOutstanding() { - Log.d(LOG_TAG, "Incrementing outstanding."); + Logger.trace(LOG_TAG, "Incrementing outstanding."); synchronized(this) { return ++outstandingCount; } } public int decrementOutstanding() { - Log.d(LOG_TAG, "Decrementing outstanding."); + Logger.trace(LOG_TAG, "Decrementing outstanding."); Runnable job = null; int count; synchronized(this) { @@ -81,10 +79,10 @@ public class DelayedWorkTracker { } } public void delayWorkItem(Runnable item) { - Log.d(LOG_TAG, "delayWorkItem."); + Logger.trace(LOG_TAG, "delayWorkItem."); boolean runnableNow = false; synchronized(this) { - Log.d(LOG_TAG, "outstandingCount: " + outstandingCount); + Logger.trace(LOG_TAG, "outstandingCount: " + outstandingCount); if (outstandingCount == 0) { runnableNow = true; } else { @@ -95,7 +93,7 @@ public class DelayedWorkTracker { } } if (runnableNow) { - Log.d(LOG_TAG, "Running item now."); + Logger.trace(LOG_TAG, "Running item now."); item.run(); } } diff --git a/mobile/android/base/sync/Logger.java b/mobile/android/base/sync/Logger.java new file mode 100644 index 00000000000..ca3ee09e84e --- /dev/null +++ b/mobile/android/base/sync/Logger.java @@ -0,0 +1,83 @@ +/* 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.gecko.sync; + +import android.util.Log; + +public class Logger { + + // For extra debugging. + public static boolean LOG_PERSONAL_INFORMATION = false; + + // If true, log to System.out as well as using Android's Log.* calls. + public static boolean LOG_TO_STDOUT = false; + + public static void logToStdout(String... s) { + if (LOG_TO_STDOUT) { + for (String string : s) { + System.out.print(string); + } + System.out.println(""); + } + } + + public static void error(String logTag, String message) { + Logger.error(logTag, message, null); + } + + public static void error(String logTag, String message, Throwable error) { + logToStdout(logTag, " :: ERROR: ", message); + if (!Log.isLoggable(logTag, Log.ERROR)) { + return; + } + Log.e(logTag, message, error); + } + + public static void warn(String logTag, String message) { + Logger.warn(logTag, message, null); + } + + public static void warn(String logTag, String message, Throwable error) { + logToStdout(logTag, " :: WARN: ", message); + if (!Log.isLoggable(logTag, Log.WARN)) { + return; + } + Log.w(logTag, message, error); + } + + public static void info(String logTag, String message) { + logToStdout(logTag, " :: INFO: ", message); + if (!Log.isLoggable(logTag, Log.INFO)) { + return; + } + Log.i(logTag, message); + } + + public static void debug(String logTag, String message) { + Logger.debug(logTag, message, null); + } + + public static void debug(String logTag, String message, Throwable error) { + logToStdout(logTag, " :: DEBUG: ", message); + if (!Log.isLoggable(logTag, Log.DEBUG)) { + return; + } + Log.d(logTag, message, error); + } + + public static void trace(String logTag, String message) { + logToStdout(logTag, " :: TRACE: ", message); + if (!Log.isLoggable(logTag, Log.VERBOSE)) { + return; + } + Log.v(logTag, message); + } + + public static void pii(String logTag, String message) { + if (LOG_PERSONAL_INFORMATION) { + Logger.debug(logTag, "$$PII$$: " + message); + } + } +} diff --git a/mobile/android/base/sync/SynchronizerConfiguration.java b/mobile/android/base/sync/SynchronizerConfiguration.java index fcc06d89d35..7ba744aa16e 100644 --- a/mobile/android/base/sync/SynchronizerConfiguration.java +++ b/mobile/android/base/sync/SynchronizerConfiguration.java @@ -47,7 +47,7 @@ import android.content.SharedPreferences.Editor; import android.util.Log; public class SynchronizerConfiguration { - private static final String LOG_TAG = "SynchronizerConfiguration"; + private static final String LOG_TAG = "SynczrConfiguration"; public String syncID; public RepositorySessionBundle remoteBundle; diff --git a/mobile/android/base/sync/Utils.java b/mobile/android/base/sync/Utils.java index 002e46a6fe3..445c6e5c05b 100644 --- a/mobile/android/base/sync/Utils.java +++ b/mobile/android/base/sync/Utils.java @@ -42,8 +42,8 @@ import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.math.BigInteger; import java.security.NoSuchAlgorithmException; -import java.util.HashMap; import java.security.SecureRandom; +import java.util.HashMap; import org.mozilla.apache.commons.codec.binary.Base32; import org.mozilla.apache.commons.codec.binary.Base64; @@ -51,7 +51,6 @@ import org.mozilla.gecko.sync.crypto.Cryptographer; import android.content.Context; import android.content.SharedPreferences; -import android.util.Log; public class Utils { @@ -62,46 +61,6 @@ public class Utils { // See public static final int SHARED_PREFERENCES_MODE = 0; - - // We don't really have a trace logger, so use this to toggle - // some debug logging. - // This is awful. I'm so sorry. - public static boolean ENABLE_TRACE_LOGGING = true; - - // If true, log to System.out as well as using Android's Log.* calls. - public static boolean LOG_TO_STDOUT = false; - public static void logToStdout(String... s) { - if (LOG_TO_STDOUT) { - for (String string : s) { - System.out.print(string); - } - System.out.println(""); - } - } - - public static void error(String logTag, String message) { - logToStdout(logTag, " :: ERROR: ", message); - Log.i(logTag, message); - } - - public static void info(String logTag, String message) { - logToStdout(logTag, " :: INFO: ", message); - Log.i(logTag, message); - } - - public static void debug(String logTag, String message) { - logToStdout(logTag, " :: DEBUG: ", message); - Log.d(logTag, message); - } - - public static void trace(String logTag, String message) { - if (!ENABLE_TRACE_LOGGING) { - return; - } - logToStdout(logTag, " :: TRACE: ", message); - Log.d(logTag, message); - } - public static String generateGuid() { byte[] encodedBytes = Base64.encodeBase64(generateRandomBytes(9), false); return new String(encodedBytes).replace("+", "-").replace("/", "_"); @@ -142,26 +101,25 @@ public class Utils { * Output: Hex string */ public static String byte2hex(byte[] b) { - - // String Buffer can be used instead - String hs = ""; - String stmp = ""; - - for (int n = 0; n < b.length; n++) { - stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); - - if (stmp.length() == 1) { - hs = hs + "0" + stmp; - } else { - hs = hs + stmp; - } - - if (n < b.length - 1) { - hs = hs + ""; - } + // StringBuffer should be used instead. + String hs = ""; + String stmp; + + for (int n = 0; n < b.length; n++) { + stmp = java.lang.Integer.toHexString(b[n] & 0XFF); + + if (stmp.length() == 1) { + hs = hs + "0" + stmp; + } else { + hs = hs + stmp; } - - return hs; + + if (n < b.length - 1) { + hs = hs + ""; + } + } + + return hs; } /* @@ -170,21 +128,21 @@ public class Utils { * Output: A concatenated version of them */ public static byte[] concatAll(byte[] first, byte[]... rest) { - int totalLength = first.length; - for (byte[] array : rest) { - totalLength += array.length; - } - - byte[] result = new byte[totalLength]; - int offset = first.length; + int totalLength = first.length; + for (byte[] array : rest) { + totalLength += array.length; + } - System.arraycopy(first, 0, result, 0, offset); - - for (byte[] array : rest) { - System.arraycopy(array, 0, result, offset, array.length); - offset += array.length; - } - return result; + byte[] result = new byte[totalLength]; + int offset = first.length; + + System.arraycopy(first, 0, result, 0, offset); + + for (byte[] array : rest) { + System.arraycopy(array, 0, result, offset, array.length); + offset += array.length; + } + return result; } /** @@ -199,16 +157,16 @@ public class Utils { * Should not occur. */ public static byte[] decodeBase64(String base64) throws UnsupportedEncodingException { - return Base64.decodeBase64(base64.getBytes("UTF-8")); + return Base64.decodeBase64(base64.getBytes("UTF-8")); } /* * Decode a friendly base32 string. */ public static byte[] decodeFriendlyBase32(String base32) { - Base32 converter = new Base32(); - return converter.decode(base32.replace('8', 'l').replace('9', 'o') - .toUpperCase()); + Base32 converter = new Base32(); + final String translated = base32.replace('8', 'l').replace('9', 'o'); + return converter.decode(translated.toUpperCase()); } /* @@ -216,19 +174,16 @@ public class Utils { * Input: Hex string * Output: byte[] version of hex string */ - public static byte[] hex2Byte(String str) - { - if (str.length() % 2 == 1) { - str = "0" + str; - } - - byte[] bytes = new byte[str.length() / 2]; - for (int i = 0; i < bytes.length; i++) - { - bytes[i] = (byte) Integer - .parseInt(str.substring(2 * i, 2 * i + 2), 16); - } - return bytes; + public static byte[] hex2Byte(String str) { + if (str.length() % 2 == 1) { + str = "0" + str; + } + + byte[] bytes = new byte[str.length() / 2]; + for (int i = 0; i < bytes.length; i++) { + bytes[i] = (byte) Integer.parseInt(str.substring(2 * i, 2 * i + 2), 16); + } + return bytes; } public static String millisecondsToDecimalSecondsString(long ms) { @@ -264,7 +219,7 @@ public class Utils { public static SharedPreferences getSharedPreferences(Context context, String username, String serverURL) throws NoSuchAlgorithmException, UnsupportedEncodingException { String prefsPath = getPrefsPath(username, serverURL); - Log.d(LOG_TAG, "Shared preferences: " + prefsPath); + Logger.debug(LOG_TAG, "Shared preferences: " + prefsPath); return context.getSharedPreferences(prefsPath, SHARED_PREFERENCES_MODE); } diff --git a/mobile/android/base/sync/jpake/JPakeClient.java b/mobile/android/base/sync/jpake/JPakeClient.java index fdfa1e96567..9659c16846c 100644 --- a/mobile/android/base/sync/jpake/JPakeClient.java +++ b/mobile/android/base/sync/jpake/JPakeClient.java @@ -53,6 +53,7 @@ import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import org.mozilla.apache.commons.codec.binary.Base64; import org.mozilla.gecko.sync.ExtendedJSONObject; +import org.mozilla.gecko.sync.Logger; import org.mozilla.gecko.sync.NonObjectJSONException; import org.mozilla.gecko.sync.ThreadPool; import org.mozilla.gecko.sync.Utils; @@ -236,20 +237,26 @@ public class JPakeClient implements JPakeRequestDelegate { * (Receiver Only) Request channel for J-PAKE from server. */ private void getChannel() { - Log.d(LOG_TAG, "Getting channel."); - if (finished) + Logger.debug(LOG_TAG, "Getting channel."); + if (finished) { + Logger.debug(LOG_TAG, "Finished; returning."); return; + } - JPakeRequest channelRequest = null; try { - channelRequest = new JPakeRequest(jpakeServer + "new_channel", - makeRequestResourceDelegate()); + final String uri = jpakeServer + "new_channel"; + Logger.debug(LOG_TAG, "Fetching " + uri); + JPakeRequest channelRequest = new JPakeRequest(uri, makeRequestResourceDelegate()); + channelRequest.get(); } catch (URISyntaxException e) { Log.e(LOG_TAG, "URISyntaxException", e); abort(Constants.JPAKE_ERROR_CHANNEL); return; + } catch (Exception e) { + Log.e(LOG_TAG, "Unexpected exception in getChannel().", e); + abort(Constants.JPAKE_ERROR_CHANNEL); + return; } - channelRequest.get(); } /* @@ -257,7 +264,7 @@ public class JPakeClient implements JPakeRequestDelegate { * jOutgoing JSONObject. */ private void putStep() { - Log.d(LOG_TAG, "Uploading message."); + Logger.debug(LOG_TAG, "Uploading message."); runOnThread(new Runnable() { @Override public void run() { @@ -275,7 +282,7 @@ public class JPakeClient implements JPakeRequestDelegate { } catch (UnsupportedEncodingException e) { e.printStackTrace(); } - Log.d(LOG_TAG, "outgoing: " + jOutgoing.toJSONString()); + Logger.debug(LOG_TAG, "outgoing: " + jOutgoing.toJSONString()); } }); } @@ -284,7 +291,7 @@ public class JPakeClient implements JPakeRequestDelegate { * Step One of J-PAKE protocol. */ private void computeStepOne() throws NoSuchAlgorithmException, UnsupportedEncodingException { - Log.d(LOG_TAG, "Computing round 1."); + Logger.debug(LOG_TAG, "Computing round 1."); JPakeCrypto.round1(jParty, numGen); @@ -307,7 +314,7 @@ public class JPakeClient implements JPakeRequestDelegate { jOutgoing.put(Constants.JSON_KEY_TYPE, mySignerId + "1"); jOutgoing.put(Constants.JSON_KEY_PAYLOAD, jOne); jOutgoing.put(Constants.JSON_KEY_VERSION, KEYEXCHANGE_VERSION); - Log.d(LOG_TAG, "Sending: " + jOutgoing.toJSONString()); + Logger.debug(LOG_TAG, "Sending: " + jOutgoing.toJSONString()); // Store context to determine next step after PUT request. stateContext = pairWithPin ? State.SNDR_STEP_ONE : State.RCVR_STEP_ONE; @@ -322,7 +329,7 @@ public class JPakeClient implements JPakeRequestDelegate { * Two message to be sent. */ private void computeStepTwo() throws NonObjectJSONException { - Log.d(LOG_TAG, "Computing round 2."); + Logger.debug(LOG_TAG, "Computing round 2."); // Check incoming message sender. if (!jIncoming.get(Constants.JSON_KEY_TYPE).equals(theirSignerId + "1")) { @@ -423,7 +430,7 @@ public class JPakeClient implements JPakeRequestDelegate { * encrypted message for verification of successful key exchange. */ private void computeFinal() throws NonObjectJSONException { - Log.d(LOG_TAG, "Computing final round."); + Logger.debug(LOG_TAG, "Computing final round."); // Check incoming message type. if (!jIncoming.get(Constants.JSON_KEY_TYPE).equals(theirSignerId + "2")) { Log.e(LOG_TAG, "Invalid round 2 message: " + jIncoming.toJSONString()); @@ -478,7 +485,7 @@ public class JPakeClient implements JPakeRequestDelegate { } if (pairWithPin) { // Wait for other device to send verification of keys. - Log.d(LOG_TAG, "get: verifyPairing"); + Logger.debug(LOG_TAG, "get: verifyPairing"); this.state = State.VERIFY_PAIRING; scheduleGetRequest(jpakePollInterval); } else { // Prepare and send verification of keys. @@ -507,7 +514,7 @@ public class JPakeClient implements JPakeRequestDelegate { public ExtendedJSONObject computeKeyVerification(KeyBundle keyBundle) throws UnsupportedEncodingException, CryptoException { - Log.d(LOG_TAG, "Encrypting key verification value."); + Logger.debug(LOG_TAG, "Encrypting key verification value."); // KeyBundle not null ExtendedJSONObject jPayload = encryptPayload(JPAKE_VERIFY_VALUE, keyBundle); ExtendedJSONObject result = new ExtendedJSONObject(); @@ -581,7 +588,7 @@ public class JPakeClient implements JPakeRequestDelegate { * @param payload Credentials data to be encrypted. */ private void encryptData(KeyBundle keyBundle, String payload) { - Log.d(LOG_TAG, "Encrypting data."); + Logger.debug(LOG_TAG, "Encrypting data."); ExtendedJSONObject jPayload = null; try { jPayload = encryptPayload(payload, keyBundle); @@ -608,7 +615,7 @@ public class JPakeClient implements JPakeRequestDelegate { * @param keyBundle */ private void decryptData(KeyBundle keyBundle) { - Log.d(LOG_TAG, "Verifying their key"); + Logger.debug(LOG_TAG, "Verifying their key"); if (!(theirSignerId + "3").equals((String) jIncoming .get(Constants.JSON_KEY_TYPE))) { try { @@ -629,7 +636,7 @@ public class JPakeClient implements JPakeRequestDelegate { abort(Constants.JPAKE_ERROR_WRONGMESSAGE); return; } - Log.d(LOG_TAG, "Decrypting data."); + Logger.debug(LOG_TAG, "Decrypting data."); String cleartext = null; try { cleartext = new String(decryptPayload(iPayload, keyBundle), "UTF-8"); @@ -659,7 +666,7 @@ public class JPakeClient implements JPakeRequestDelegate { * @param jCreds Credentials to be stored by controller. May be null if device is sender. */ private void complete(JSONObject jCreds) { - Log.d(LOG_TAG, "Exchange complete."); + Logger.debug(LOG_TAG, "Exchange complete."); finished = true; ssActivity.onComplete(jCreds); } @@ -683,7 +690,7 @@ public class JPakeClient implements JPakeRequestDelegate { int statusCode = response.getStatusCode(); switch (statusCode) { case 304: - Log.d(LOG_TAG, "Channel hasn't been updated yet. Will try again later"); + Logger.debug(LOG_TAG, "Channel hasn't been updated yet. Will try again later"); if (pollTries >= jpakeMaxTries) { Log.e(LOG_TAG, "Tried for " + pollTries + " times, maxTries " + jpakeMaxTries + ", aborting"); abort(Constants.JPAKE_ERROR_TIMEOUT); @@ -699,7 +706,7 @@ public class JPakeClient implements JPakeRequestDelegate { abort(Constants.JPAKE_ERROR_NODATA); break; case 412: // "Precondition failed" - Log.d(LOG_TAG, "Message already replaced on server by other party."); + Logger.debug(LOG_TAG, "Message already replaced on server by other party."); onRequestSuccess(res); break; default: @@ -754,7 +761,7 @@ public class JPakeClient implements JPakeRequestDelegate { return; } channelUrl = jpakeServer + channel; - Log.d(LOG_TAG, "using channel " + channel); + Logger.debug(LOG_TAG, "using channel " + channel); ssActivity.displayPin(secret + channel); @@ -811,7 +818,7 @@ public class JPakeClient implements JPakeRequestDelegate { abort(Constants.JPAKE_ERROR_INVALID); return; } - Log.d(LOG_TAG, "incoming message: " + jIncoming.toJSONString()); + Logger.debug(LOG_TAG, "incoming message: " + jIncoming.toJSONString()); if (this.state == State.SNDR_STEP_ZERO) { try { @@ -1040,13 +1047,13 @@ public class JPakeClient implements JPakeRequestDelegate { * Defaults to user abort */ public void abort(String error) { - Log.d(LOG_TAG, "aborting..."); + Logger.debug(LOG_TAG, "aborting..."); finished = true; if (error == null) { error = Constants.JPAKE_ERROR_USERABORT; } - Log.d(LOG_TAG, error); + Logger.debug(LOG_TAG, error); if (Constants.JPAKE_ERROR_CHANNEL.equals(error) || Constants.JPAKE_ERROR_NETWORK.equals(error) @@ -1062,7 +1069,7 @@ public class JPakeClient implements JPakeRequestDelegate { * Make a /report post to to server */ private void reportFailure(String error) { - Log.d(LOG_TAG, "reporting error to server"); + Logger.debug(LOG_TAG, "reporting error to server"); this.error = error; runOnThread(new Runnable() { @Override diff --git a/mobile/android/base/sync/repositories/RepositorySession.java b/mobile/android/base/sync/repositories/RepositorySession.java index d2626c084db..88f1b969e5a 100644 --- a/mobile/android/base/sync/repositories/RepositorySession.java +++ b/mobile/android/base/sync/repositories/RepositorySession.java @@ -41,7 +41,7 @@ package org.mozilla.gecko.sync.repositories; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import org.mozilla.gecko.sync.Utils; +import org.mozilla.gecko.sync.Logger; import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionBeginDelegate; import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionFetchRecordsDelegate; import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionFinishDelegate; @@ -77,11 +77,11 @@ public abstract class RepositorySession { private static final String LOG_TAG = "RepositorySession"; private static void error(String message) { - Utils.error(LOG_TAG, message); + Logger.error(LOG_TAG, message); } protected static void trace(String message) { - Utils.trace(LOG_TAG, message); + Logger.trace(LOG_TAG, message); } protected SessionStatus status = SessionStatus.UNSTARTED; diff --git a/mobile/android/base/sync/repositories/Server11RepositorySession.java b/mobile/android/base/sync/repositories/Server11RepositorySession.java index e92a354bb47..644ff37cb66 100644 --- a/mobile/android/base/sync/repositories/Server11RepositorySession.java +++ b/mobile/android/base/sync/repositories/Server11RepositorySession.java @@ -82,7 +82,7 @@ public class Server11RepositorySession extends RepositorySession { } } - public static final String LOG_TAG = "Server11RepositorySession"; + public static final String LOG_TAG = "Server11Session"; private static final int UPLOAD_BYTE_THRESHOLD = 1024 * 1024; // 1MB. private static final int UPLOAD_ITEM_THRESHOLD = 50; diff --git a/mobile/android/base/sync/repositories/StoreTrackingRepositorySession.java b/mobile/android/base/sync/repositories/StoreTrackingRepositorySession.java index 9574652062d..cded12065af 100644 --- a/mobile/android/base/sync/repositories/StoreTrackingRepositorySession.java +++ b/mobile/android/base/sync/repositories/StoreTrackingRepositorySession.java @@ -11,7 +11,7 @@ import org.mozilla.gecko.sync.repositories.domain.Record; import android.util.Log; public abstract class StoreTrackingRepositorySession extends RepositorySession { - private static final String LOG_TAG = "StoreTrackingRepositorySession"; + private static final String LOG_TAG = "StoreTrackSession"; protected StoreTracker storeTracker; protected static StoreTracker createStoreTracker() { @@ -59,4 +59,4 @@ public abstract class StoreTrackingRepositorySession extends RepositorySession { this.storeTracker = null; super.finish(delegate); } -} \ No newline at end of file +} diff --git a/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksDataAccessor.java b/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksDataAccessor.java index d788617be4e..652861a2979 100644 --- a/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksDataAccessor.java +++ b/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksDataAccessor.java @@ -53,7 +53,7 @@ import android.util.Log; public class AndroidBrowserBookmarksDataAccessor extends AndroidBrowserRepositoryDataAccessor { - private static final String LOG_TAG = "AndroidBrowserBookmarksDataAccessor"; + private static final String LOG_TAG = "BookmarksDataAccessor"; /* * Fragments of SQL to make our lives easier. diff --git a/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksRepositorySession.java b/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksRepositorySession.java index 1e0d525c4d0..1750c2dcf00 100644 --- a/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksRepositorySession.java +++ b/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksRepositorySession.java @@ -41,6 +41,7 @@ import java.util.ArrayList; import java.util.HashMap; import org.json.simple.JSONArray; +import org.mozilla.gecko.sync.Logger; import org.mozilla.gecko.sync.Utils; import org.mozilla.gecko.sync.repositories.BookmarkNeedsReparentingException; import org.mozilla.gecko.sync.repositories.NoGuidForIdException; @@ -122,7 +123,7 @@ public class AndroidBrowserBookmarksRepositorySession extends AndroidBrowserRepo parentName = RepoUtils.getStringFromCursor(name, BrowserContract.Bookmarks.TITLE); } else { - Log.e(LOG_TAG, "Couldn't find record with guid '" + parentGUID + "' when looking for parent name."); + Logger.error(LOG_TAG, "Couldn't find record with guid '" + parentGUID + "' when looking for parent name."); throw new ParentNotFoundException(null); } } finally { @@ -157,13 +158,13 @@ public class AndroidBrowserBookmarksRepositorySession extends AndroidBrowserRepo int childPosition = (int) RepoUtils.getLongFromCursor(children, BrowserContract.Bookmarks.POSITION); trace(" Child position: " + childPosition); if (childPosition >= count) { - Log.w(LOG_TAG, "Child position " + childPosition + " greater than expected children " + count); + Logger.warn(LOG_TAG, "Child position " + childPosition + " greater than expected children " + count); broken.put(childGuid, 0L); } else { String existing = kids[childPosition]; if (existing != null) { - Log.w(LOG_TAG, "Child position " + childPosition + " already occupied! (" + - childGuid + ", " + existing + ")"); + Logger.warn(LOG_TAG, "Child position " + childPosition + " already occupied! (" + + childGuid + ", " + existing + ")"); broken.put(childGuid, 0L); } else { kids[childPosition] = childGuid; @@ -175,7 +176,7 @@ public class AndroidBrowserBookmarksRepositorySession extends AndroidBrowserRepo try { Utils.fillArraySpaces(kids, broken); } catch (Exception e) { - Log.e(LOG_TAG, "Unable to reposition children to yield a valid sequence. Data loss may result.", e); + Logger.error(LOG_TAG, "Unable to reposition children to yield a valid sequence. Data loss may result.", e); } // TODO: now use 'broken' to edit the records on disk. @@ -187,8 +188,9 @@ public class AndroidBrowserBookmarksRepositorySession extends AndroidBrowserRepo } childArray.add(kid); } - if (Utils.ENABLE_TRACE_LOGGING) { - Log.d(LOG_TAG, "Output child array: " + childArray.toJSONString()); + if (Log.isLoggable(LOG_TAG, Log.VERBOSE)) { + // Don't JSON-encode unless we're logging. + Logger.trace(LOG_TAG, "Output child array: " + childArray.toJSONString()); } } finally { children.close(); @@ -199,10 +201,10 @@ public class AndroidBrowserBookmarksRepositorySession extends AndroidBrowserRepo @Override protected Record recordFromMirrorCursor(Cursor cur) throws NoGuidForIdException, NullCursorException, ParentNotFoundException { String recordGUID = getGUID(cur); - Log.d(LOG_TAG, "Record from mirror cursor: " + recordGUID); + Logger.trace(LOG_TAG, "Record from mirror cursor: " + recordGUID); if (forbiddenGUID(recordGUID)) { - Log.d(LOG_TAG, "Ignoring " + recordGUID + " record in recordFromMirrorCursor."); + Logger.debug(LOG_TAG, "Ignoring " + recordGUID + " record in recordFromMirrorCursor."); return null; } @@ -210,10 +212,10 @@ public class AndroidBrowserBookmarksRepositorySession extends AndroidBrowserRepo String androidParentGUID = getGUIDForID(androidParentID); if (androidParentGUID == null) { - Log.d(LOG_TAG, "No parent GUID for record " + recordGUID + " with parent " + androidParentID); + Logger.debug(LOG_TAG, "No parent GUID for record " + recordGUID + " with parent " + androidParentID); // If the parent has been stored and somehow has a null GUID, throw an error. if (idToGuid.containsKey(androidParentID)) { - Log.e(LOG_TAG, "Have the parent android ID for the record but the parent's GUID wasn't found."); + Logger.error(LOG_TAG, "Have the parent android ID for the record but the parent's GUID wasn't found."); throw new NoGuidForIdException(null); } } @@ -227,13 +229,13 @@ public class AndroidBrowserBookmarksRepositorySession extends AndroidBrowserRepo protected JSONArray getChildArrayForCursor(Cursor cur, String recordGUID) throws NullCursorException { JSONArray childArray = null; boolean isFolder = rowIsFolder(cur); - Log.d(LOG_TAG, "Record " + recordGUID + " is a " + (isFolder ? "folder." : "bookmark.")); + Logger.debug(LOG_TAG, "Record " + recordGUID + " is a " + (isFolder ? "folder." : "bookmark.")); if (isFolder) { long androidID = guidToID.get(recordGUID); childArray = getChildren(androidID); } if (childArray != null) { - Log.d(LOG_TAG, "Fetched " + childArray.size() + " children for " + recordGUID); + Logger.debug(LOG_TAG, "Fetched " + childArray.size() + " children for " + recordGUID); } return childArray; } @@ -245,7 +247,7 @@ public class AndroidBrowserBookmarksRepositorySession extends AndroidBrowserRepo bmk.type.equalsIgnoreCase(AndroidBrowserBookmarksDataAccessor.TYPE_FOLDER)) { return true; } - Log.i(LOG_TAG, "Ignoring record with guid: " + record.guid + " and type: " + ((BookmarkRecord)record).type); + Logger.info(LOG_TAG, "Ignoring record with guid: " + record.guid + " and type: " + ((BookmarkRecord)record).type); return false; } @@ -255,12 +257,12 @@ public class AndroidBrowserBookmarksRepositorySession extends AndroidBrowserRepo // and insert them if they don't exist. Cursor cur; try { - Log.d(LOG_TAG, "Check and build special GUIDs."); + Logger.debug(LOG_TAG, "Check and build special GUIDs."); dataAccessor.checkAndBuildSpecialGuids(); cur = dataAccessor.getGuidsIDsForFolders(); - Log.d(LOG_TAG, "Got GUIDs for folders."); + Logger.debug(LOG_TAG, "Got GUIDs for folders."); } catch (android.database.sqlite.SQLiteConstraintException e) { - Log.e(LOG_TAG, "Got sqlite constraint exception working with Fennec bookmark DB.", e); + Logger.error(LOG_TAG, "Got sqlite constraint exception working with Fennec bookmark DB.", e); delegate.onBeginFailed(e); return; } catch (NullCursorException e) { @@ -274,7 +276,7 @@ public class AndroidBrowserBookmarksRepositorySession extends AndroidBrowserRepo // To deal with parent mapping of bookmarks we have to do some // hairy stuff. Here's the setup for it. - Log.d(LOG_TAG, "Preparing folder ID mappings."); + Logger.debug(LOG_TAG, "Preparing folder ID mappings."); idToGuid.put(0L, "places"); // Fake our root. try { cur.moveToFirst(); @@ -283,13 +285,13 @@ public class AndroidBrowserBookmarksRepositorySession extends AndroidBrowserRepo long id = RepoUtils.getLongFromCursor(cur, BrowserContract.Bookmarks._ID); guidToID.put(guid, id); idToGuid.put(id, guid); - Log.d(LOG_TAG, "GUID " + guid + " maps to " + id); + Logger.debug(LOG_TAG, "GUID " + guid + " maps to " + id); cur.moveToNext(); } } finally { cur.close(); } - Log.d(LOG_TAG, "Done with initial setup of bookmarks session."); + Logger.debug(LOG_TAG, "Done with initial setup of bookmarks session."); super.begin(delegate); } @@ -298,8 +300,8 @@ public class AndroidBrowserBookmarksRepositorySession extends AndroidBrowserRepo // Override finish to do this check; make sure all records // needing re-parenting have been re-parented. if (needsReparenting != 0) { - Log.e(LOG_TAG, "Finish called but " + needsReparenting + - " bookmark(s) have been placed in unsorted bookmarks and not been reparented."); + Logger.error(LOG_TAG, "Finish called but " + needsReparenting + + " bookmark(s) have been placed in unsorted bookmarks and not been reparented."); // TODO: handling of failed reparenting. // E.g., delegate.onFinishFailed(new BookmarkNeedsReparentingException(null)); @@ -337,16 +339,28 @@ public class AndroidBrowserBookmarksRepositorySession extends AndroidBrowserRepo missingParentToChildren.put(bmk.parentID, children); } - if (bmk.isFolder()) { - Log.d(LOG_TAG, "Inserting folder " + bmk.guid + ", " + bmk.title + - " with parent " + bmk.androidParentID + - " (" + bmk.parentID + ", " + bmk.parentName + - ", " + bmk.pos + ")"); + if (Logger.LOG_PERSONAL_INFORMATION) { + if (bmk.isFolder()) { + Logger.pii(LOG_TAG, "Inserting folder " + bmk.guid + ", " + bmk.title + + " with parent " + bmk.androidParentID + + " (" + bmk.parentID + ", " + bmk.parentName + + ", " + bmk.pos + ")"); + } else { + Logger.pii(LOG_TAG, "Inserting bookmark " + bmk.guid + ", " + bmk.title + ", " + + bmk.bookmarkURI + " with parent " + bmk.androidParentID + + " (" + bmk.parentID + ", " + bmk.parentName + + ", " + bmk.pos + ")"); + } } else { - Log.d(LOG_TAG, "Inserting bookmark " + bmk.guid + ", " + bmk.title + ", " + - bmk.bookmarkURI + " with parent " + bmk.androidParentID + - " (" + bmk.parentID + ", " + bmk.parentName + - ", " + bmk.pos + ")"); + if (bmk.isFolder()) { + Logger.debug(LOG_TAG, "Inserting folder " + bmk.guid + ", parent " + + bmk.androidParentID + + " (" + bmk.parentID + ", " + bmk.pos + ")"); + } else { + Logger.debug(LOG_TAG, "Inserting bookmark " + bmk.guid + " with parent " + + bmk.androidParentID + + " (" + bmk.parentID + ", " + ", " + bmk.pos + ")"); + } } return bmk; } diff --git a/mobile/android/base/sync/repositories/android/AndroidBrowserRepositoryDataAccessor.java b/mobile/android/base/sync/repositories/android/AndroidBrowserRepositoryDataAccessor.java index 25f85fa99b2..2459f91e9a6 100644 --- a/mobile/android/base/sync/repositories/android/AndroidBrowserRepositoryDataAccessor.java +++ b/mobile/android/base/sync/repositories/android/AndroidBrowserRepositoryDataAccessor.java @@ -51,7 +51,7 @@ public abstract class AndroidBrowserRepositoryDataAccessor { private static final String[] GUID_COLUMNS = new String[] { BrowserContract.SyncColumns.GUID }; protected Context context; - protected String LOG_TAG = "AndroidBrowserRepositoryDataAccessor"; + protected static String LOG_TAG = "BrowserDataAccessor"; private final RepoUtils.QueryHelper queryHelper; public AndroidBrowserRepositoryDataAccessor(Context context) { diff --git a/mobile/android/base/sync/repositories/android/AndroidBrowserRepositorySession.java b/mobile/android/base/sync/repositories/android/AndroidBrowserRepositorySession.java index 3ac08dfcb8a..928c255b8f7 100644 --- a/mobile/android/base/sync/repositories/android/AndroidBrowserRepositorySession.java +++ b/mobile/android/base/sync/repositories/android/AndroidBrowserRepositorySession.java @@ -41,7 +41,7 @@ package org.mozilla.gecko.sync.repositories.android; import java.util.ArrayList; import java.util.HashMap; -import org.mozilla.gecko.sync.Utils; +import org.mozilla.gecko.sync.Logger; import org.mozilla.gecko.sync.repositories.InactiveSessionException; import org.mozilla.gecko.sync.repositories.InvalidRequestException; import org.mozilla.gecko.sync.repositories.InvalidSessionTransitionException; @@ -62,7 +62,6 @@ import org.mozilla.gecko.sync.repositories.domain.Record; import android.database.Cursor; import android.net.Uri; -import android.util.Log; /** * You'll notice that all delegate calls *either*: @@ -89,7 +88,7 @@ import android.util.Log; public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepositorySession { protected AndroidBrowserRepositoryDataAccessor dbHelper; - public static final String LOG_TAG = "AndroidBrowserRepositorySession"; + public static final String LOG_TAG = "BrowserRepoSession"; private HashMap recordToGuid; public AndroidBrowserRepositorySession(Repository repository) { @@ -142,7 +141,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos // is no way of knowing which call would be hit first. checkDatabase(); } catch (ProfileDatabaseException e) { - Log.e(LOG_TAG, "ProfileDatabaseException from begin. Fennec must be launched once until this error is fixed"); + Logger.error(LOG_TAG, "ProfileDatabaseException from begin. Fennec must be launched once until this error is fixed"); deferredDelegate.onBeginFailed(e); return; } catch (NullCursorException e) { @@ -159,10 +158,10 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos protected abstract String buildRecordString(Record record); protected void checkDatabase() throws ProfileDatabaseException, NullCursorException { - Utils.info(LOG_TAG, "BEGIN: checking database."); + Logger.info(LOG_TAG, "BEGIN: checking database."); try { dbHelper.fetch(new String[] { "none" }).close(); - Utils.info(LOG_TAG, "END: checking database."); + Logger.info(LOG_TAG, "END: checking database."); } catch (NullPointerException e) { throw new ProfileDatabaseException(e); } @@ -215,7 +214,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos cur.moveToNext(); } } finally { - Log.d(LOG_TAG, "Closing cursor after guidsSince."); + Logger.debug(LOG_TAG, "Closing cursor after guidsSince."); cur.close(); } @@ -240,7 +239,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos } protected void fetchFromCursor(Cursor cursor, RecordFilter filter, long end) { - Log.d(LOG_TAG, "Fetch from cursor:"); + Logger.debug(LOG_TAG, "Fetch from cursor:"); try { try { if (!cursor.moveToFirst()) { @@ -248,28 +247,28 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos return; } while (!cursor.isAfterLast()) { - Log.d(LOG_TAG, "... one more record."); Record r = recordFromMirrorCursor(cursor); if (r != null) { if (filter == null || !filter.excludeRecord(r)) { + Logger.trace(LOG_TAG, "Processing record " + r.guid); delegate.onFetchedRecord(transformRecord(r)); } else { - Log.d(LOG_TAG, "Filter says to skip record."); + Logger.debug(LOG_TAG, "Skipping filtered record " + r.guid); } } cursor.moveToNext(); } delegate.onFetchCompleted(end); } catch (NoGuidForIdException e) { - Log.w(LOG_TAG, "No GUID for ID.", e); + Logger.warn(LOG_TAG, "No GUID for ID.", e); delegate.onFetchFailed(e, null); } catch (Exception e) { - Log.w(LOG_TAG, "Exception in fetchFromCursor.", e); + Logger.warn(LOG_TAG, "Exception in fetchFromCursor.", e); delegate.onFetchFailed(e, null); return; } } finally { - Log.d(LOG_TAG, "Closing cursor after fetch."); + Logger.trace(LOG_TAG, "Closing cursor after fetch."); cursor.close(); } } @@ -298,7 +297,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos } if (guids == null || guids.length < 1) { - Log.e(LOG_TAG, "No guids sent to fetch"); + Logger.error(LOG_TAG, "No guids sent to fetch"); delegate.onFetchFailed(new InvalidRequestException(null), null); return; } @@ -319,7 +318,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos throw new IllegalStateException("Store tracker not yet initialized!"); } - Log.i(LOG_TAG, "Running fetchSince(" + timestamp + ")."); + Logger.info(LOG_TAG, "Running fetchSince(" + timestamp + ")."); FetchSinceRunnable command = new FetchSinceRunnable(timestamp, now(), this.storeTracker.getFilter(), delegate); delegateQueue.execute(command); } @@ -367,7 +366,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos throw new NoStoreDelegateException(); } if (record == null) { - Log.e(LOG_TAG, "Record sent to store was null"); + Logger.error(LOG_TAG, "Record sent to store was null"); throw new IllegalArgumentException("Null record passed to AndroidBrowserRepositorySession.store()."); } @@ -388,7 +387,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos // See Bug 708149. This might be resolved by Fennec changing its database // schema, or by Sync storing non-applied records in its own private database. if (!checkRecordType(record)) { - Log.d(LOG_TAG, "Ignoring record " + record.guid + " due to unknown record type."); + Logger.debug(LOG_TAG, "Ignoring record " + record.guid + " due to unknown record type."); // Don't throw: we don't want to abort the entire sync when we get a livemark! // delegate.onRecordStoreFailed(new InvalidBookmarkTypeException(null)); @@ -445,7 +444,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos trace("Remote is older, local is not deleted. Ignoring."); if (!locallyModified) { - Log.w(LOG_TAG, "Inconsistency: old remote record is deleted, but local record not modified!"); + Logger.warn(LOG_TAG, "Inconsistency: old remote record is deleted, but local record not modified!"); // Ensure that this is tracked for upload. } return; @@ -475,35 +474,35 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos Record toStore = reconcileRecords(record, existingRecord, lastRemoteRetrieval, lastLocalRetrieval); if (toStore == null) { - Log.d(LOG_TAG, "Reconciling returned null. Not inserting a record."); + Logger.debug(LOG_TAG, "Reconciling returned null. Not inserting a record."); return; } // TODO: pass in timestamps? - Log.d(LOG_TAG, "Replacing " + existingRecord.guid + " with record " + toStore.guid); + Logger.debug(LOG_TAG, "Replacing " + existingRecord.guid + " with record " + toStore.guid); Record replaced = replace(toStore, existingRecord); // Note that we don't track records here; deciding that is the job // of reconcileRecords. - Log.d(LOG_TAG, "Calling delegate callback with guid " + replaced.guid + - "(" + replaced.androidID + ")"); + Logger.debug(LOG_TAG, "Calling delegate callback with guid " + replaced.guid + + "(" + replaced.androidID + ")"); delegate.onRecordStoreSucceeded(replaced); return; } catch (MultipleRecordsForGuidException e) { - Log.e(LOG_TAG, "Multiple records returned for given guid: " + record.guid); + Logger.error(LOG_TAG, "Multiple records returned for given guid: " + record.guid); delegate.onRecordStoreFailed(e); return; } catch (NoGuidForIdException e) { - Log.e(LOG_TAG, "Store failed for " + record.guid, e); + Logger.error(LOG_TAG, "Store failed for " + record.guid, e); delegate.onRecordStoreFailed(e); return; } catch (NullCursorException e) { - Log.e(LOG_TAG, "Store failed for " + record.guid, e); + Logger.error(LOG_TAG, "Store failed for " + record.guid, e); delegate.onRecordStoreFailed(e); return; } catch (Exception e) { - Log.e(LOG_TAG, "Store failed for " + record.guid, e); + Logger.error(LOG_TAG, "Store failed for " + record.guid, e); delegate.onRecordStoreFailed(e); return; } @@ -523,11 +522,11 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos Record toStore = prepareRecord(record); Uri recordURI = dbHelper.insert(toStore); long id = RepoUtils.getAndroidIdFromUri(recordURI); - Log.d(LOG_TAG, "Inserted as " + id); + Logger.debug(LOG_TAG, "Inserted as " + id); toStore.androidID = id; updateBookkeeping(toStore); - Log.d(LOG_TAG, "insert() returning record " + toStore.guid); + Logger.debug(LOG_TAG, "insert() returning record " + toStore.guid); return toStore; } @@ -537,7 +536,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos // newRecord should already have suitable androidID and guid. dbHelper.update(existingRecord.guid, toStore); updateBookkeeping(toStore); - Log.d(LOG_TAG, "replace() returning record " + toStore.guid); + Logger.debug(LOG_TAG, "replace() returning record " + toStore.guid); return toStore; } @@ -583,15 +582,15 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos protected Record findExistingRecord(Record record) throws MultipleRecordsForGuidException, NoGuidForIdException, NullCursorException, ParentNotFoundException { - Log.d(LOG_TAG, "Finding existing record for incoming record with GUID " + record.guid); + Logger.debug(LOG_TAG, "Finding existing record for incoming record with GUID " + record.guid); String recordString = buildRecordString(record); - Log.d(LOG_TAG, "Searching with record string " + recordString); + Logger.debug(LOG_TAG, "Searching with record string " + recordString); String guid = getRecordToGuidMap().get(recordString); if (guid != null) { - Log.d(LOG_TAG, "Found one. Returning computed record."); + Logger.debug(LOG_TAG, "Found one. Returning computed record."); return recordForGUID(guid); } - Log.d(LOG_TAG, "findExistingRecord failed to find one for " + record.guid); + Logger.debug(LOG_TAG, "findExistingRecord failed to find one for " + record.guid); return null; } @@ -603,7 +602,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos } private void createRecordToGuidMap() throws NoGuidForIdException, NullCursorException, ParentNotFoundException { - Utils.info(LOG_TAG, "BEGIN: creating record -> GUID map."); + Logger.info(LOG_TAG, "BEGIN: creating record -> GUID map."); recordToGuid = new HashMap(); Cursor cur = dbHelper.fetchAll(); try { @@ -620,7 +619,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos } finally { cur.close(); } - Utils.info(LOG_TAG, "END: creating record -> GUID map."); + Logger.info(LOG_TAG, "END: creating record -> GUID map."); } public void putRecordToGuidMap(String recordString, String guid) throws NoGuidForIdException, NullCursorException, ParentNotFoundException { diff --git a/mobile/android/base/sync/repositories/android/RepoUtils.java b/mobile/android/base/sync/repositories/android/RepoUtils.java index ce96c801db2..4bb6f7440d1 100644 --- a/mobile/android/base/sync/repositories/android/RepoUtils.java +++ b/mobile/android/base/sync/repositories/android/RepoUtils.java @@ -46,6 +46,7 @@ import org.json.simple.JSONArray; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import org.mozilla.gecko.R; +import org.mozilla.gecko.sync.Logger; import org.mozilla.gecko.sync.repositories.NullCursorException; import org.mozilla.gecko.sync.repositories.domain.BookmarkRecord; import org.mozilla.gecko.sync.repositories.domain.HistoryRecord; @@ -54,7 +55,6 @@ import org.mozilla.gecko.sync.repositories.domain.PasswordRecord; import android.content.Context; import android.database.Cursor; import android.net.Uri; -import android.util.Log; public class RepoUtils { @@ -177,7 +177,7 @@ public class RepoUtils { public Cursor safeQuery(String label, String[] projection, String selection, String[] selectionArgs, String sortOrder) throws NullCursorException { Cursor c = this.query(label, projection, selection, selectionArgs, sortOrder); if (c == null) { - Log.e(tag, "Got null cursor exception in " + tag + ((label == null) ? "" : label)); + Logger.error(tag, "Got null cursor exception in " + tag + ((label == null) ? "" : label)); throw new NullCursorException(null); } return c; @@ -206,7 +206,7 @@ public class RepoUtils { try { return (JSONArray) new JSONParser().parse(getStringFromCursor(cur, colId)); } catch (ParseException e) { - Log.e(LOG_TAG, "JSON parsing error for " + colId, e); + Logger.error(LOG_TAG, "JSON parsing error for " + colId, e); return null; } } @@ -223,7 +223,7 @@ public class RepoUtils { final String guid = rec.guid; if (guid == null) { // Oh dear. - Log.e(LOG_TAG, "No guid in computeParentFields!"); + Logger.error(LOG_TAG, "No guid in computeParentFields!"); return null; } @@ -232,13 +232,13 @@ public class RepoUtils { // No magic parent. Use whatever the caller suggests. realParent = suggestedParentID; } else { - Log.d(LOG_TAG, "Ignoring suggested parent ID " + suggestedParentID + - " for " + guid + "; using " + realParent); + Logger.debug(LOG_TAG, "Ignoring suggested parent ID " + suggestedParentID + + " for " + guid + "; using " + realParent); } if (realParent == null) { // Oh dear. - Log.e(LOG_TAG, "No parent for record " + guid); + Logger.error(LOG_TAG, "No parent for record " + guid); return null; } @@ -283,18 +283,24 @@ public class RepoUtils { private static BookmarkRecord logBookmark(BookmarkRecord rec) { try { - Log.d(LOG_TAG, "Returning bookmark record " + rec.guid + " (" + rec.androidID + - ", " + rec.parentName + ":" + rec.parentID + ")"); - Log.d(LOG_TAG, "> Title: " + rec.title); - Log.d(LOG_TAG, "> Type: " + rec.type); - Log.d(LOG_TAG, "> URI: " + rec.bookmarkURI); - Log.d(LOG_TAG, "> Android position: " + rec.androidPosition); - Log.d(LOG_TAG, "> Position: " + rec.pos); - if (rec.isFolder()) { - Log.d(LOG_TAG, "FOLDER: Children are " + (rec.children == null ? "null" : rec.children.toJSONString())); + Logger.debug(LOG_TAG, "Returning bookmark record " + rec.guid + " (" + rec.androidID + + ", parent " + rec.parentID + ")"); + if (Logger.LOG_PERSONAL_INFORMATION) { + Logger.pii(LOG_TAG, "> Parent name: " + rec.parentName); + Logger.pii(LOG_TAG, "> Title: " + rec.title); + Logger.pii(LOG_TAG, "> Type: " + rec.type); + Logger.pii(LOG_TAG, "> URI: " + rec.bookmarkURI); + Logger.pii(LOG_TAG, "> Android position: " + rec.androidPosition); + Logger.pii(LOG_TAG, "> Position: " + rec.pos); + if (rec.isFolder()) { + Logger.pii(LOG_TAG, "FOLDER: Children are " + + (rec.children == null ? + "null" : + rec.children.toJSONString())); + } } } catch (Exception e) { - Log.d(LOG_TAG, "Exception logging bookmark record " + rec, e); + Logger.debug(LOG_TAG, "Exception logging bookmark record " + rec, e); } return rec; } @@ -319,13 +325,15 @@ public class RepoUtils { private static HistoryRecord logHistory(HistoryRecord rec) { try { - Log.d(LOG_TAG, "Returning history record " + rec.guid + " (" + rec.androidID + ")"); - Log.d(LOG_TAG, "> Title: " + rec.title); - Log.d(LOG_TAG, "> URI: " + rec.histURI); - Log.d(LOG_TAG, "> Visited: " + rec.fennecDateVisited); - Log.d(LOG_TAG, "> Visits: " + rec.fennecVisitCount); + Logger.debug(LOG_TAG, "Returning history record " + rec.guid + " (" + rec.androidID + ")"); + Logger.debug(LOG_TAG, "> Visited: " + rec.fennecDateVisited); + Logger.debug(LOG_TAG, "> Visits: " + rec.fennecVisitCount); + if (Logger.LOG_PERSONAL_INFORMATION) { + Logger.pii(LOG_TAG, "> Title: " + rec.title); + Logger.pii(LOG_TAG, "> URI: " + rec.histURI); + } } catch (Exception e) { - Log.d(LOG_TAG, "Exception logging bookmark record " + rec, e); + Logger.debug(LOG_TAG, "Exception logging bookmark record " + rec, e); } return rec; } @@ -356,7 +364,7 @@ public class RepoUtils { public static void queryTimeLogger(String methodCallingQuery, long queryStart, long queryEnd) { long elapsedTime = queryEnd - queryStart; - Log.i(LOG_TAG, "Query timer: " + methodCallingQuery + " took " + elapsedTime + "ms."); + Logger.debug(LOG_TAG, "Query timer: " + methodCallingQuery + " took " + elapsedTime + "ms."); } public static boolean stringsEqual(String a, String b) { diff --git a/mobile/android/base/sync/repositories/domain/BookmarkRecord.java b/mobile/android/base/sync/repositories/domain/BookmarkRecord.java index 00d3fa4233c..3b2409994ab 100644 --- a/mobile/android/base/sync/repositories/domain/BookmarkRecord.java +++ b/mobile/android/base/sync/repositories/domain/BookmarkRecord.java @@ -41,6 +41,7 @@ package org.mozilla.gecko.sync.repositories.domain; import org.json.simple.JSONArray; import org.mozilla.gecko.sync.CryptoRecord; import org.mozilla.gecko.sync.ExtendedJSONObject; +import org.mozilla.gecko.sync.Logger; import org.mozilla.gecko.sync.NonArrayJSONException; import org.mozilla.gecko.sync.Utils; import org.mozilla.gecko.sync.repositories.android.RepoUtils; @@ -224,7 +225,7 @@ public class BookmarkRecord extends Record { } private void trace(String s) { - Utils.trace(LOG_TAG, s); + Logger.trace(LOG_TAG, s); } @Override diff --git a/mobile/android/base/sync/repositories/domain/HistoryRecord.java b/mobile/android/base/sync/repositories/domain/HistoryRecord.java index 4cd32fcc86b..e7e1bb6f2ae 100644 --- a/mobile/android/base/sync/repositories/domain/HistoryRecord.java +++ b/mobile/android/base/sync/repositories/domain/HistoryRecord.java @@ -43,6 +43,7 @@ import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.mozilla.gecko.sync.CryptoRecord; import org.mozilla.gecko.sync.ExtendedJSONObject; +import org.mozilla.gecko.sync.Logger; import org.mozilla.gecko.sync.NonArrayJSONException; import org.mozilla.gecko.sync.Utils; import org.mozilla.gecko.sync.repositories.android.RepoUtils; @@ -191,10 +192,11 @@ public class HistoryRecord extends Record { } private boolean checkVisitsEquals(HistoryRecord other) { - Log.d(LOG_TAG, "Checking visits."); - if (Utils.ENABLE_TRACE_LOGGING) { - Log.d(LOG_TAG, ">> Mine: " + ((this.visits == null) ? "null" : this.visits.toJSONString())); - Log.d(LOG_TAG, ">> Theirs: " + ((other.visits == null) ? "null" : other.visits.toJSONString())); + Logger.debug(LOG_TAG, "Checking visits."); + if (Log.isLoggable(LOG_TAG, Log.VERBOSE)) { + // Don't JSON-encode unless we're logging. + Logger.trace(LOG_TAG, ">> Mine: " + ((this.visits == null) ? "null" : this.visits.toJSONString())); + Logger.trace(LOG_TAG, ">> Theirs: " + ((other.visits == null) ? "null" : other.visits.toJSONString())); } // Handle nulls. diff --git a/mobile/android/base/sync/setup/SyncAuthenticatorService.java b/mobile/android/base/sync/setup/SyncAuthenticatorService.java index 635c2705003..4055634d4c4 100644 --- a/mobile/android/base/sync/setup/SyncAuthenticatorService.java +++ b/mobile/android/base/sync/setup/SyncAuthenticatorService.java @@ -57,7 +57,7 @@ import android.os.IBinder; import android.util.Log; public class SyncAuthenticatorService extends Service { - private static final String LOG_TAG = "SyncAuthenticatorService"; + private static final String LOG_TAG = "SyncAuthService"; private SyncAccountAuthenticator sAccountAuthenticator = null; @Override diff --git a/mobile/android/base/sync/stage/FetchInfoCollectionsStage.java b/mobile/android/base/sync/stage/FetchInfoCollectionsStage.java index e6688c10cdd..97e78638424 100644 --- a/mobile/android/base/sync/stage/FetchInfoCollectionsStage.java +++ b/mobile/android/base/sync/stage/FetchInfoCollectionsStage.java @@ -47,7 +47,7 @@ import org.mozilla.gecko.sync.net.SyncStorageResponse; import android.util.Log; public class FetchInfoCollectionsStage implements GlobalSyncStage { - private static final String LOG_TAG = "FetchInfoCollectionsStage"; + private static final String LOG_TAG = "FetchInfoCollStage"; public class StageInfoCollectionsDelegate implements InfoCollectionsDelegate { diff --git a/mobile/android/base/sync/synchronizer/ConcurrentRecordConsumer.java b/mobile/android/base/sync/synchronizer/ConcurrentRecordConsumer.java index 0bc02316f94..00399348c1c 100644 --- a/mobile/android/base/sync/synchronizer/ConcurrentRecordConsumer.java +++ b/mobile/android/base/sync/synchronizer/ConcurrentRecordConsumer.java @@ -37,7 +37,7 @@ package org.mozilla.gecko.sync.synchronizer; -import org.mozilla.gecko.sync.Utils; +import org.mozilla.gecko.sync.Logger; import org.mozilla.gecko.sync.repositories.domain.Record; import android.util.Log; @@ -51,7 +51,7 @@ import android.util.Log; * */ class ConcurrentRecordConsumer extends RecordConsumer { - private static final String LOG_TAG = "ConcurrentRecordConsumer"; + private static final String LOG_TAG = "CRecordConsumer"; /** * When this is true and all records have been processed, the consumer @@ -65,15 +65,15 @@ class ConcurrentRecordConsumer extends RecordConsumer { } private static void info(String message) { - Utils.info(LOG_TAG, message); + Logger.info(LOG_TAG, message); } private static void debug(String message) { - Utils.debug(LOG_TAG, message); + Logger.debug(LOG_TAG, message); } private static void trace(String message) { - Utils.trace(LOG_TAG, message); + Logger.trace(LOG_TAG, message); } private Object monitor = new Object(); @@ -104,7 +104,7 @@ class ConcurrentRecordConsumer extends RecordConsumer { private Object countMonitor = new Object(); @Override public void stored() { - debug("Record stored. Notifying."); + trace("Record stored. Notifying."); synchronized (countMonitor) { counter++; } diff --git a/mobile/android/base/sync/synchronizer/RecordsChannel.java b/mobile/android/base/sync/synchronizer/RecordsChannel.java index d93bda2dd9c..d86bbf773d0 100644 --- a/mobile/android/base/sync/synchronizer/RecordsChannel.java +++ b/mobile/android/base/sync/synchronizer/RecordsChannel.java @@ -40,8 +40,8 @@ package org.mozilla.gecko.sync.synchronizer; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; +import org.mozilla.gecko.sync.Logger; import org.mozilla.gecko.sync.ThreadPool; -import org.mozilla.gecko.sync.Utils; import org.mozilla.gecko.sync.repositories.NoStoreDelegateException; import org.mozilla.gecko.sync.repositories.RepositorySession; import org.mozilla.gecko.sync.repositories.delegates.DeferredRepositorySessionBeginDelegate; @@ -135,30 +135,6 @@ class RecordsChannel implements return source.isActive() && sink.isActive(); } - - private static void info(String message) { - Utils.logToStdout(LOG_TAG, "::INFO: ", message); - Log.i(LOG_TAG, message); - } - - private static void trace(String message) { - if (!Utils.ENABLE_TRACE_LOGGING) { - return; - } - Utils.logToStdout(LOG_TAG, "::TRACE: ", message); - Log.d(LOG_TAG, message); - } - - private static void error(String message, Exception e) { - Utils.logToStdout(LOG_TAG, "::ERROR: ", message); - Log.e(LOG_TAG, message, e); - } - - private static void warn(String message, Exception e) { - Utils.logToStdout(LOG_TAG, "::WARN: ", message); - Log.w(LOG_TAG, message, e); - } - /** * Attempt to abort an outstanding fetch. Finish both sessions. */ @@ -194,7 +170,7 @@ class RecordsChannel implements * Begin both sessions, invoking flow() when done. */ public void beginAndFlow() { - info("Beginning source."); + Logger.info(LOG_TAG, "Beginning source."); source.begin(this); } @@ -203,7 +179,7 @@ class RecordsChannel implements try { sink.store(record); } catch (NoStoreDelegateException e) { - error("Got NoStoreDelegateException in RecordsChannel.store(). This should not occur. Aborting.", e); + Logger.error(LOG_TAG, "Got NoStoreDelegateException in RecordsChannel.store(). This should not occur. Aborting.", e); delegate.onFlowStoreFailed(this, e); this.abort(); } @@ -211,7 +187,7 @@ class RecordsChannel implements @Override public void onFetchFailed(Exception ex, Record record) { - warn("onFetchFailed. Calling for immediate stop.", ex); + Logger.warn(LOG_TAG, "onFetchFailed. Calling for immediate stop.", ex); this.consumer.halt(); } @@ -232,8 +208,8 @@ class RecordsChannel implements @Override public void onFetchCompleted(long end) { - info("onFetchCompleted. Stopping consumer once stores are done."); - info("Fetch timestamp is " + end); + Logger.info(LOG_TAG, "onFetchCompleted. Stopping consumer once stores are done."); + Logger.info(LOG_TAG, "Fetch timestamp is " + end); this.end = end; this.consumer.queueFilled(); } @@ -253,7 +229,7 @@ class RecordsChannel implements @Override public void consumerIsDone(boolean allRecordsQueued) { - trace("Consumer is done. Are we waiting for it? " + waitingForQueueDone); + Logger.trace(LOG_TAG, "Consumer is done. Are we waiting for it? " + waitingForQueueDone); if (waitingForQueueDone) { waitingForQueueDone = false; this.sink.storeDone(); // Now we'll be waiting for onStoreCompleted. @@ -262,7 +238,7 @@ class RecordsChannel implements @Override public void onStoreCompleted() { - info("onStoreCompleted. Notifying delegate of onFlowCompleted. End is " + end); + Logger.info(LOG_TAG, "onStoreCompleted. Notifying delegate of onFlowCompleted. End is " + end); // TODO: synchronize on consumer callback? delegate.onFlowCompleted(this, end); } @@ -275,11 +251,11 @@ class RecordsChannel implements @Override public void onBeginSucceeded(RepositorySession session) { if (session == source) { - info("Source session began. Beginning sink session."); + Logger.info(LOG_TAG, "Source session began. Beginning sink session."); sink.begin(this); } if (session == sink) { - info("Sink session began. Beginning flow."); + Logger.info(LOG_TAG, "Sink session began. Beginning flow."); this.flow(); return; } diff --git a/mobile/android/base/sync/synchronizer/Synchronizer.java b/mobile/android/base/sync/synchronizer/Synchronizer.java index c41ab288bc4..4baaf7a4de6 100644 --- a/mobile/android/base/sync/synchronizer/Synchronizer.java +++ b/mobile/android/base/sync/synchronizer/Synchronizer.java @@ -63,7 +63,7 @@ public class Synchronizer { public class SynchronizerDelegateSessionDelegate implements SynchronizerSessionDelegate { - private static final String LOG_TAG = "SynchronizerDelegateSessionDelegate"; + private static final String LOG_TAG = "SyncDelSDelegate"; private SynchronizerDelegate synchronizerDelegate; private SynchronizerSession session; diff --git a/mobile/android/sync/java-sources.mn b/mobile/android/sync/java-sources.mn index a8934571c2d..94563c79ff6 100644 --- a/mobile/android/sync/java-sources.mn +++ b/mobile/android/sync/java-sources.mn @@ -1 +1 @@ -sync/AlreadySyncingException.java sync/CollectionKeys.java sync/CredentialsSource.java sync/crypto/CryptoException.java sync/crypto/Cryptographer.java sync/crypto/CryptoInfo.java sync/crypto/HKDF.java sync/crypto/HMACVerificationException.java sync/crypto/KeyBundle.java sync/crypto/MissingCryptoInputException.java sync/crypto/NoKeyBundleException.java sync/cryptographer/CryptoStatusBundle.java sync/cryptographer/SyncCryptographer.java sync/CryptoRecord.java sync/DelayedWorkTracker.java sync/delegates/FreshStartDelegate.java sync/delegates/GlobalSessionCallback.java sync/delegates/InfoCollectionsDelegate.java sync/delegates/KeyUploadDelegate.java sync/delegates/MetaGlobalDelegate.java sync/delegates/WipeServerDelegate.java sync/ExtendedJSONObject.java sync/GlobalSession.java sync/HTTPFailureException.java sync/InfoCollections.java sync/jpake/BigIntegerHelper.java sync/jpake/Gx3OrGx4IsZeroOrOneException.java sync/jpake/IncorrectZkpException.java sync/jpake/JPakeClient.java sync/jpake/JPakeCrypto.java sync/jpake/JPakeNoActivePairingException.java sync/jpake/JPakeNumGenerator.java sync/jpake/JPakeNumGeneratorRandom.java sync/jpake/JPakeParty.java sync/jpake/JPakeRequest.java sync/jpake/JPakeRequestDelegate.java sync/jpake/JPakeResponse.java sync/jpake/Zkp.java sync/MetaGlobal.java sync/MetaGlobalException.java sync/MetaGlobalMissingEnginesException.java sync/MetaGlobalNotSetException.java sync/middleware/Crypto5MiddlewareRepository.java sync/middleware/Crypto5MiddlewareRepositorySession.java sync/middleware/MiddlewareRepository.java sync/net/BaseResource.java sync/net/CompletedEntity.java sync/net/HandleProgressException.java sync/net/Resource.java sync/net/ResourceDelegate.java sync/net/SyncResourceDelegate.java sync/net/SyncResponse.java sync/net/SyncStorageCollectionRequest.java sync/net/SyncStorageCollectionRequestDelegate.java sync/net/SyncStorageRecordRequest.java sync/net/SyncStorageRequest.java sync/net/SyncStorageRequestDelegate.java sync/net/SyncStorageRequestIncrementalDelegate.java sync/net/SyncStorageResponse.java sync/net/TLSSocketFactory.java sync/net/WBOCollectionRequestDelegate.java sync/NoCollectionKeysSetException.java sync/NonArrayJSONException.java sync/NonObjectJSONException.java sync/PrefsSource.java sync/repositories/android/AndroidBrowserBookmarksDataAccessor.java sync/repositories/android/AndroidBrowserBookmarksRepository.java sync/repositories/android/AndroidBrowserBookmarksRepositorySession.java sync/repositories/android/AndroidBrowserHistoryDataAccessor.java sync/repositories/android/AndroidBrowserHistoryDataExtender.java sync/repositories/android/AndroidBrowserHistoryRepository.java sync/repositories/android/AndroidBrowserHistoryRepositorySession.java sync/repositories/android/AndroidBrowserPasswordsDataAccessor.java sync/repositories/android/AndroidBrowserPasswordsRepository.java sync/repositories/android/AndroidBrowserPasswordsRepositorySession.java sync/repositories/android/AndroidBrowserRepository.java sync/repositories/android/AndroidBrowserRepositoryDataAccessor.java sync/repositories/android/AndroidBrowserRepositorySession.java sync/repositories/android/BrowserContract.java sync/repositories/android/PasswordColumns.java sync/repositories/android/RepoUtils.java sync/repositories/BookmarkNeedsReparentingException.java sync/repositories/BookmarksRepository.java sync/repositories/ConstrainedServer11Repository.java sync/repositories/delegates/DeferrableRepositorySessionCreationDelegate.java sync/repositories/delegates/DeferredRepositorySessionBeginDelegate.java sync/repositories/delegates/DeferredRepositorySessionFetchRecordsDelegate.java sync/repositories/delegates/DeferredRepositorySessionFinishDelegate.java sync/repositories/delegates/DeferredRepositorySessionStoreDelegate.java sync/repositories/delegates/RepositorySessionBeginDelegate.java sync/repositories/delegates/RepositorySessionCleanDelegate.java sync/repositories/delegates/RepositorySessionCreationDelegate.java sync/repositories/delegates/RepositorySessionFetchRecordsDelegate.java sync/repositories/delegates/RepositorySessionFinishDelegate.java sync/repositories/delegates/RepositorySessionGuidsSinceDelegate.java sync/repositories/delegates/RepositorySessionStoreDelegate.java sync/repositories/delegates/RepositorySessionWipeDelegate.java sync/repositories/domain/BookmarkRecord.java sync/repositories/domain/BookmarkRecordFactory.java sync/repositories/domain/HistoryRecord.java sync/repositories/domain/HistoryRecordFactory.java sync/repositories/domain/PasswordRecord.java sync/repositories/domain/Record.java sync/repositories/HashSetStoreTracker.java sync/repositories/HistoryRepository.java sync/repositories/IdentityRecordFactory.java sync/repositories/InactiveSessionException.java sync/repositories/InvalidBookmarkTypeException.java sync/repositories/InvalidRequestException.java sync/repositories/InvalidSessionTransitionException.java sync/repositories/MultipleRecordsForGuidException.java sync/repositories/NoGuidForIdException.java sync/repositories/NoStoreDelegateException.java sync/repositories/NullCursorException.java sync/repositories/ParentNotFoundException.java sync/repositories/ProfileDatabaseException.java sync/repositories/RecordFactory.java sync/repositories/RecordFilter.java sync/repositories/Repository.java sync/repositories/RepositorySession.java sync/repositories/RepositorySessionBundle.java sync/repositories/Server11Repository.java sync/repositories/Server11RepositorySession.java sync/repositories/StoreTracker.java sync/repositories/StoreTrackingRepositorySession.java sync/setup/activities/AccountActivity.java sync/setup/activities/SetupFailureActivity.java sync/setup/activities/SetupSuccessActivity.java sync/setup/activities/SetupSyncActivity.java sync/setup/Constants.java sync/setup/SyncAuthenticatorService.java sync/stage/AndroidBrowserBookmarksServerSyncStage.java sync/stage/AndroidBrowserHistoryServerSyncStage.java sync/stage/CheckPreconditionsStage.java sync/stage/CompletedStage.java sync/stage/EnsureClusterURLStage.java sync/stage/EnsureKeysStage.java sync/stage/FetchInfoCollectionsStage.java sync/stage/FetchMetaGlobalStage.java sync/stage/GlobalSyncStage.java sync/stage/NoSuchStageException.java sync/stage/NoSyncIDException.java sync/stage/ServerSyncStage.java sync/StubActivity.java sync/syncadapter/SyncAdapter.java sync/syncadapter/SyncService.java sync/SyncConfiguration.java sync/SyncConfigurationException.java sync/SyncException.java sync/synchronizer/ConcurrentRecordConsumer.java sync/synchronizer/RecordConsumer.java sync/synchronizer/RecordsChannel.java sync/synchronizer/RecordsChannelDelegate.java sync/synchronizer/RecordsConsumerDelegate.java sync/synchronizer/SerialRecordConsumer.java sync/synchronizer/SessionNotBegunException.java sync/synchronizer/Synchronizer.java sync/synchronizer/SynchronizerDelegate.java sync/synchronizer/SynchronizerSession.java sync/synchronizer/SynchronizerSessionDelegate.java sync/synchronizer/UnbundleError.java sync/synchronizer/UnexpectedSessionException.java sync/SynchronizerConfiguration.java sync/SynchronizerConfigurations.java sync/ThreadPool.java sync/UnexpectedJSONException.java sync/UnknownSynchronizerConfigurationVersionException.java sync/Utils.java +sync/AlreadySyncingException.java sync/CollectionKeys.java sync/CredentialsSource.java sync/crypto/CryptoException.java sync/crypto/Cryptographer.java sync/crypto/CryptoInfo.java sync/crypto/HKDF.java sync/crypto/HMACVerificationException.java sync/crypto/KeyBundle.java sync/crypto/MissingCryptoInputException.java sync/crypto/NoKeyBundleException.java sync/cryptographer/CryptoStatusBundle.java sync/cryptographer/SyncCryptographer.java sync/CryptoRecord.java sync/DelayedWorkTracker.java sync/delegates/FreshStartDelegate.java sync/delegates/GlobalSessionCallback.java sync/delegates/InfoCollectionsDelegate.java sync/delegates/KeyUploadDelegate.java sync/delegates/MetaGlobalDelegate.java sync/delegates/WipeServerDelegate.java sync/ExtendedJSONObject.java sync/GlobalSession.java sync/HTTPFailureException.java sync/InfoCollections.java sync/jpake/BigIntegerHelper.java sync/jpake/Gx3OrGx4IsZeroOrOneException.java sync/jpake/IncorrectZkpException.java sync/jpake/JPakeClient.java sync/jpake/JPakeCrypto.java sync/jpake/JPakeNoActivePairingException.java sync/jpake/JPakeNumGenerator.java sync/jpake/JPakeNumGeneratorRandom.java sync/jpake/JPakeParty.java sync/jpake/JPakeRequest.java sync/jpake/JPakeRequestDelegate.java sync/jpake/JPakeResponse.java sync/jpake/Zkp.java sync/Logger.java sync/MetaGlobal.java sync/MetaGlobalException.java sync/MetaGlobalMissingEnginesException.java sync/MetaGlobalNotSetException.java sync/middleware/Crypto5MiddlewareRepository.java sync/middleware/Crypto5MiddlewareRepositorySession.java sync/middleware/MiddlewareRepository.java sync/net/BaseResource.java sync/net/CompletedEntity.java sync/net/HandleProgressException.java sync/net/Resource.java sync/net/ResourceDelegate.java sync/net/SyncResourceDelegate.java sync/net/SyncResponse.java sync/net/SyncStorageCollectionRequest.java sync/net/SyncStorageCollectionRequestDelegate.java sync/net/SyncStorageRecordRequest.java sync/net/SyncStorageRequest.java sync/net/SyncStorageRequestDelegate.java sync/net/SyncStorageRequestIncrementalDelegate.java sync/net/SyncStorageResponse.java sync/net/TLSSocketFactory.java sync/net/WBOCollectionRequestDelegate.java sync/NoCollectionKeysSetException.java sync/NonArrayJSONException.java sync/NonObjectJSONException.java sync/PrefsSource.java sync/repositories/android/AndroidBrowserBookmarksDataAccessor.java sync/repositories/android/AndroidBrowserBookmarksRepository.java sync/repositories/android/AndroidBrowserBookmarksRepositorySession.java sync/repositories/android/AndroidBrowserHistoryDataAccessor.java sync/repositories/android/AndroidBrowserHistoryDataExtender.java sync/repositories/android/AndroidBrowserHistoryRepository.java sync/repositories/android/AndroidBrowserHistoryRepositorySession.java sync/repositories/android/AndroidBrowserPasswordsDataAccessor.java sync/repositories/android/AndroidBrowserPasswordsRepository.java sync/repositories/android/AndroidBrowserPasswordsRepositorySession.java sync/repositories/android/AndroidBrowserRepository.java sync/repositories/android/AndroidBrowserRepositoryDataAccessor.java sync/repositories/android/AndroidBrowserRepositorySession.java sync/repositories/android/BrowserContract.java sync/repositories/android/PasswordColumns.java sync/repositories/android/RepoUtils.java sync/repositories/BookmarkNeedsReparentingException.java sync/repositories/BookmarksRepository.java sync/repositories/ConstrainedServer11Repository.java sync/repositories/delegates/DeferrableRepositorySessionCreationDelegate.java sync/repositories/delegates/DeferredRepositorySessionBeginDelegate.java sync/repositories/delegates/DeferredRepositorySessionFetchRecordsDelegate.java sync/repositories/delegates/DeferredRepositorySessionFinishDelegate.java sync/repositories/delegates/DeferredRepositorySessionStoreDelegate.java sync/repositories/delegates/RepositorySessionBeginDelegate.java sync/repositories/delegates/RepositorySessionCleanDelegate.java sync/repositories/delegates/RepositorySessionCreationDelegate.java sync/repositories/delegates/RepositorySessionFetchRecordsDelegate.java sync/repositories/delegates/RepositorySessionFinishDelegate.java sync/repositories/delegates/RepositorySessionGuidsSinceDelegate.java sync/repositories/delegates/RepositorySessionStoreDelegate.java sync/repositories/delegates/RepositorySessionWipeDelegate.java sync/repositories/domain/BookmarkRecord.java sync/repositories/domain/BookmarkRecordFactory.java sync/repositories/domain/HistoryRecord.java sync/repositories/domain/HistoryRecordFactory.java sync/repositories/domain/PasswordRecord.java sync/repositories/domain/Record.java sync/repositories/HashSetStoreTracker.java sync/repositories/HistoryRepository.java sync/repositories/IdentityRecordFactory.java sync/repositories/InactiveSessionException.java sync/repositories/InvalidBookmarkTypeException.java sync/repositories/InvalidRequestException.java sync/repositories/InvalidSessionTransitionException.java sync/repositories/MultipleRecordsForGuidException.java sync/repositories/NoGuidForIdException.java sync/repositories/NoStoreDelegateException.java sync/repositories/NullCursorException.java sync/repositories/ParentNotFoundException.java sync/repositories/ProfileDatabaseException.java sync/repositories/RecordFactory.java sync/repositories/RecordFilter.java sync/repositories/Repository.java sync/repositories/RepositorySession.java sync/repositories/RepositorySessionBundle.java sync/repositories/Server11Repository.java sync/repositories/Server11RepositorySession.java sync/repositories/StoreTracker.java sync/repositories/StoreTrackingRepositorySession.java sync/setup/activities/AccountActivity.java sync/setup/activities/SetupFailureActivity.java sync/setup/activities/SetupSuccessActivity.java sync/setup/activities/SetupSyncActivity.java sync/setup/Constants.java sync/setup/SyncAuthenticatorService.java sync/stage/AndroidBrowserBookmarksServerSyncStage.java sync/stage/AndroidBrowserHistoryServerSyncStage.java sync/stage/CheckPreconditionsStage.java sync/stage/CompletedStage.java sync/stage/EnsureClusterURLStage.java sync/stage/EnsureKeysStage.java sync/stage/FetchInfoCollectionsStage.java sync/stage/FetchMetaGlobalStage.java sync/stage/GlobalSyncStage.java sync/stage/NoSuchStageException.java sync/stage/NoSyncIDException.java sync/stage/ServerSyncStage.java sync/StubActivity.java sync/syncadapter/SyncAdapter.java sync/syncadapter/SyncService.java sync/SyncConfiguration.java sync/SyncConfigurationException.java sync/SyncException.java sync/synchronizer/ConcurrentRecordConsumer.java sync/synchronizer/RecordConsumer.java sync/synchronizer/RecordsChannel.java sync/synchronizer/RecordsChannelDelegate.java sync/synchronizer/RecordsConsumerDelegate.java sync/synchronizer/SerialRecordConsumer.java sync/synchronizer/SessionNotBegunException.java sync/synchronizer/Synchronizer.java sync/synchronizer/SynchronizerDelegate.java sync/synchronizer/SynchronizerSession.java sync/synchronizer/SynchronizerSessionDelegate.java sync/synchronizer/UnbundleError.java sync/synchronizer/UnexpectedSessionException.java sync/SynchronizerConfiguration.java sync/SynchronizerConfigurations.java sync/ThreadPool.java sync/UnexpectedJSONException.java sync/UnknownSynchronizerConfigurationVersionException.java sync/Utils.java